@@ -2229,67 +2229,67 @@ fn gen_defined(jit: &mut JITState, ctx: &mut Context, cb: &mut CodeBlock, ocb: &
2229
2229
2230
2230
KeepCompiling
2231
2231
}
2232
+ */
2232
2233
2233
2234
fn gen_checktype ( jit : & mut JITState , ctx : & mut Context , cb : & mut CodeBlock , ocb : & mut OutlinedCb ) -> CodegenStatus
2234
2235
{
2235
- enum ruby_value_type type_val = (enum ruby_value_type)jit_get_arg(jit, 0);
2236
+ let type_val = jit_get_arg ( jit, 0 ) . as_usize ( ) ;
2237
+
2236
2238
// Only three types are emitted by compile.c
2237
- if ( type_val == T_STRING || type_val == T_ARRAY || type_val == T_HASH) {
2238
- val_type_t val_type = ctx.get_opnd_type(StackOpnd(0));
2239
+ if type_val == RUBY_T_STRING || type_val == RUBY_T_ARRAY || type_val == RUBY_T_HASH {
2240
+ let val_type = ctx. get_opnd_type ( StackOpnd ( 0 ) ) ;
2239
2241
let val = ctx. stack_pop ( 1 ) ;
2240
2242
2241
- x86opnd_t stack_ret;
2242
-
2243
2243
// Check if we know from type information
2244
- if (( type_val == T_STRING && val_type.type == ETYPE_STRING ) ||
2245
- (type_val == T_ARRAY && val_type.type == ETYPE_ARRAY ) ||
2246
- (type_val == T_HASH && val_type.type == ETYPE_HASH) ) {
2244
+ if ( type_val == RUBY_T_STRING && val_type == Type :: String ) ||
2245
+ ( type_val == RUBY_T_ARRAY && val_type == Type :: Array ) ||
2246
+ ( type_val == RUBY_T_HASH && val_type == Type :: Hash ) {
2247
2247
// guaranteed type match
2248
- stack_ret = ctx.stack_push(Type::True);
2249
- mov(cb, stack_ret, imm_opnd (Qtrue));
2248
+ let stack_ret = ctx. stack_push ( Type :: True ) ;
2249
+ mov ( cb, stack_ret, uimm_opnd ( Qtrue . as_u64 ( ) ) ) ;
2250
2250
return KeepCompiling ;
2251
2251
}
2252
- else if ( val_type.is_imm || val_type.type != ETYPE_UNKNOWN) {
2252
+ else if val_type. is_imm ( ) || val_type != Type :: Unknown {
2253
2253
// guaranteed not to match T_STRING/T_ARRAY/T_HASH
2254
- stack_ret = ctx.stack_push(Type::False);
2255
- mov(cb, stack_ret, imm_opnd (Qfalse));
2254
+ let stack_ret = ctx. stack_push ( Type :: False ) ;
2255
+ mov ( cb, stack_ret, uimm_opnd ( Qfalse . as_u64 ( ) ) ) ;
2256
2256
return KeepCompiling ;
2257
2257
}
2258
2258
2259
2259
mov ( cb, REG0 , val) ;
2260
- mov(cb, REG1, imm_opnd (Qfalse));
2260
+ mov ( cb, REG1 , uimm_opnd ( Qfalse . as_u64 ( ) ) ) ;
2261
2261
2262
- uint32_t ret = cb_new_label(cb, "ret");
2262
+ let ret = cb . new_label ( "ret" . to_string ( ) ) ;
2263
2263
2264
- if ( !val_type.is_heap) {
2264
+ if !val_type. is_heap ( ) {
2265
2265
// if (SPECIAL_CONST_P(val)) {
2266
2266
// Return Qfalse via REG1 if not on heap
2267
- test(cb, REG0, imm_opnd (RUBY_IMMEDIATE_MASK));
2267
+ test ( cb, REG0 , uimm_opnd ( RUBY_IMMEDIATE_MASK as u64 ) ) ;
2268
2268
jnz_label ( cb, ret) ;
2269
- cmp(cb, REG0, imm_opnd (Qnil));
2269
+ cmp ( cb, REG0 , uimm_opnd ( Qnil . as_u64 ( ) ) ) ;
2270
2270
jbe_label ( cb, ret) ;
2271
2271
}
2272
2272
2273
2273
// Check type on object
2274
- mov(cb, REG0, mem_opnd(64, REG0, offsetof(struct RBasic, flags) ));
2275
- and(cb, REG0, imm_opnd (RUBY_T_MASK));
2276
- cmp(cb, REG0, imm_opnd (type_val));
2277
- mov(cb, REG0, imm_opnd (Qtrue));
2274
+ mov ( cb, REG0 , mem_opnd ( 64 , REG0 , RUBY_OFFSET_RBASIC_FLAGS ) ) ;
2275
+ and ( cb, REG0 , uimm_opnd ( RUBY_T_MASK as u64 ) ) ;
2276
+ cmp ( cb, REG0 , uimm_opnd ( type_val as u64 ) ) ;
2277
+ mov ( cb, REG0 , uimm_opnd ( Qtrue . as_u64 ( ) ) ) ;
2278
2278
// REG1 contains Qfalse from above
2279
2279
cmove ( cb, REG1 , REG0 ) ;
2280
2280
2281
- cb_write_label(cb, ret);
2282
- stack_ret = ctx.stack_push(Type::UnknownImm);
2281
+ cb . write_label ( ret) ;
2282
+ let stack_ret = ctx. stack_push ( Type :: UnknownImm ) ;
2283
2283
mov ( cb, stack_ret, REG1 ) ;
2284
- cb_link_labels(cb );
2284
+ cb . link_labels ( ) ;
2285
2285
2286
2286
KeepCompiling
2287
2287
}
2288
2288
else {
2289
2289
CantCompile
2290
2290
}
2291
2291
}
2292
-
2292
+ /*
2293
2293
fn gen_concatstrings(jit: &mut JITState, ctx: &mut Context, cb: &mut CodeBlock, ocb: &mut OutlinedCb) -> CodegenStatus
2294
2294
{
2295
2295
rb_num_t n = (rb_num_t)jit_get_arg(jit, 0);
@@ -5231,6 +5231,7 @@ fn get_gen_fn(opcode: VALUE) -> Option<CodeGenFn>
5231
5231
OP_SETLOCAL_WC_1 => Some ( gen_setlocal_wc1) ,
5232
5232
OP_OPT_PLUS => Some ( gen_opt_plus) ,
5233
5233
OP_NEWHASH => Some ( gen_newhash) ,
5234
+ OP_CHECKTYPE => Some ( gen_checktype) ,
5234
5235
5235
5236
/*
5236
5237
yjit_reg_op(BIN(newarray), gen_newarray);
@@ -5244,12 +5245,7 @@ fn get_gen_fn(opcode: VALUE) -> Option<CodeGenFn>
5244
5245
yjit_reg_op(BIN(getinstancevariable), gen_getinstancevariable);
5245
5246
yjit_reg_op(BIN(setinstancevariable), gen_setinstancevariable);
5246
5247
yjit_reg_op(BIN(defined), gen_defined);
5247
- yjit_reg_op(BIN(checktype), gen_checktype);
5248
5248
yjit_reg_op(BIN(checkkeyword), gen_checkkeyword);
5249
- yjit_reg_op(BIN(opt_lt), gen_opt_lt);
5250
- yjit_reg_op(BIN(opt_le), gen_opt_le);
5251
- yjit_reg_op(BIN(opt_ge), gen_opt_ge);
5252
- yjit_reg_op(BIN(opt_gt), gen_opt_gt);
5253
5249
yjit_reg_op(BIN(opt_eq), gen_opt_eq);
5254
5250
yjit_reg_op(BIN(opt_neq), gen_opt_neq);
5255
5251
yjit_reg_op(BIN(opt_aref), gen_opt_aref);
0 commit comments