@@ -916,6 +916,28 @@ gen_splatarray(jitstate_t* jit, ctx_t* ctx)
916916 return YJIT_KEEP_COMPILING ;
917917}
918918
919+ // new range initialized from top 2 values
920+ static codegen_status_t
921+ gen_newrange (jitstate_t * jit , ctx_t * ctx )
922+ {
923+ rb_num_t flag = (rb_num_t )jit_get_arg (jit , 0 );
924+
925+ // rb_range_new() allocates and can raise
926+ jit_prepare_routine_call (jit , ctx , REG0 );
927+
928+ // val = rb_range_new(low, high, (int)flag);
929+ mov (cb , C_ARG_REGS [0 ], ctx_stack_opnd (ctx , 1 ));
930+ mov (cb , C_ARG_REGS [1 ], ctx_stack_opnd (ctx , 0 ));
931+ mov (cb , C_ARG_REGS [2 ], imm_opnd (flag ));
932+ call_ptr (cb , REG0 , (void * )rb_range_new );
933+
934+ ctx_stack_pop (ctx , 2 );
935+ x86opnd_t stack_ret = ctx_stack_push (ctx , TYPE_HEAP );
936+ mov (cb , stack_ret , RAX );
937+
938+ return YJIT_KEEP_COMPILING ;
939+ }
940+
919941static void
920942guard_object_is_heap (codeblock_t * cb , x86opnd_t object_opnd , ctx_t * ctx , uint8_t * side_exit )
921943{
@@ -4013,6 +4035,7 @@ yjit_init_codegen(void)
40134035 yjit_reg_op (BIN (splatarray ), gen_splatarray );
40144036 yjit_reg_op (BIN (expandarray ), gen_expandarray );
40154037 yjit_reg_op (BIN (newhash ), gen_newhash );
4038+ yjit_reg_op (BIN (newrange ), gen_newrange );
40164039 yjit_reg_op (BIN (concatstrings ), gen_concatstrings );
40174040 yjit_reg_op (BIN (putnil ), gen_putnil );
40184041 yjit_reg_op (BIN (putobject ), gen_putobject );
0 commit comments