@@ -916,6 +916,28 @@ gen_splatarray(jitstate_t* jit, ctx_t* ctx)
916
916
return YJIT_KEEP_COMPILING ;
917
917
}
918
918
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
+
919
941
static void
920
942
guard_object_is_heap (codeblock_t * cb , x86opnd_t object_opnd , ctx_t * ctx , uint8_t * side_exit )
921
943
{
@@ -4013,6 +4035,7 @@ yjit_init_codegen(void)
4013
4035
yjit_reg_op (BIN (splatarray ), gen_splatarray );
4014
4036
yjit_reg_op (BIN (expandarray ), gen_expandarray );
4015
4037
yjit_reg_op (BIN (newhash ), gen_newhash );
4038
+ yjit_reg_op (BIN (newrange ), gen_newrange );
4016
4039
yjit_reg_op (BIN (concatstrings ), gen_concatstrings );
4017
4040
yjit_reg_op (BIN (putnil ), gen_putnil );
4018
4041
yjit_reg_op (BIN (putobject ), gen_putobject );
0 commit comments