diff options
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 33 |
1 files changed, 17 insertions, 16 deletions
@@ -899,8 +899,8 @@ opt_str_uminus } DEFINE_INSN -opt_newarray_max -(rb_num_t num) +opt_newarray_send +(rb_num_t num, ID method) (...) (VALUE val) /* This instruction typically has no funcalls. But it compares array @@ -909,20 +909,21 @@ opt_newarray_max * cannot but mark it being not leaf. */ // attr bool leaf = false; /* has rb_funcall() */ // attr rb_snum_t sp_inc = 1 - (rb_snum_t)num; -{ - val = vm_opt_newarray_max(ec, num, STACK_ADDR_FROM_TOP(num)); -} - -DEFINE_INSN -opt_newarray_min -(rb_num_t num) -(...) -(VALUE val) -/* Same discussion as opt_newarray_max. */ -// attr bool leaf = false; /* has rb_funcall() */ -// attr rb_snum_t sp_inc = 1 - (rb_snum_t)num; -{ - val = vm_opt_newarray_min(ec, num, STACK_ADDR_FROM_TOP(num)); +// attr rb_snum_t comptime_sp_inc = 1 - (rb_snum_t)num; +{ + switch(method) { + case idHash: + val = vm_opt_newarray_hash(ec, num, STACK_ADDR_FROM_TOP(num)); + break; + case idMin: + val = vm_opt_newarray_min(ec, num, STACK_ADDR_FROM_TOP(num)); + break; + case idMax: + val = vm_opt_newarray_max(ec, num, STACK_ADDR_FROM_TOP(num)); + break; + default: + rb_bug("unreachable"); + } } /* super(args) # args.size => num */ |