@@ -986,6 +986,23 @@ gen_putself(jitstate_t* jit, ctx_t* ctx)
986986 return YJIT_KEEP_COMPILING ;
987987}
988988
989+ static codegen_status_t
990+ gen_putspecialobject (jitstate_t * jit , ctx_t * ctx )
991+ {
992+ enum vm_special_object_type type = (enum vm_special_object_type )jit_get_arg (jit , 0 );
993+
994+ if (type == VM_SPECIAL_OBJECT_VMCORE ) {
995+ x86opnd_t stack_top = ctx_stack_push (ctx , TYPE_HEAP );
996+ jit_mov_gc_ptr (jit , cb , REG0 , rb_mRubyVMFrozenCore );
997+ mov (cb , stack_top , REG0 );
998+ return YJIT_KEEP_COMPILING ;
999+ } else {
1000+ // TODO: implement for VM_SPECIAL_OBJECT_CBASE and
1001+ // VM_SPECIAL_OBJECT_CONST_BASE
1002+ return YJIT_CANT_COMPILE ;
1003+ }
1004+ }
1005+
9891006// Compute the index of a local variable from its slot index
9901007static uint32_t
9911008slot_to_local_idx (const rb_iseq_t * iseq , int32_t slot_idx )
@@ -3685,6 +3702,7 @@ yjit_init_codegen(void)
36853702 yjit_reg_op (BIN (putobject_INT2FIX_0_ ), gen_putobject_int2fix );
36863703 yjit_reg_op (BIN (putobject_INT2FIX_1_ ), gen_putobject_int2fix );
36873704 yjit_reg_op (BIN (putself ), gen_putself );
3705+ yjit_reg_op (BIN (putspecialobject ), gen_putspecialobject );
36883706 yjit_reg_op (BIN (getlocal ), gen_getlocal );
36893707 yjit_reg_op (BIN (getlocal_WC_0 ), gen_getlocal_wc0 );
36903708 yjit_reg_op (BIN (getlocal_WC_1 ), gen_getlocal_wc1 );
0 commit comments