diff options
author | Takashi Kokubun <[email protected]> | 2023-03-25 21:43:12 -0700 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-25 21:43:15 -0700 |
commit | 1396b83153d395c4c672846749d7ec53b80d3d2a (patch) | |
tree | 80e035e3212fe92e40428b8b60d6e63452a90d20 /lib/ruby_vm/rjit/insn_compiler.rb | |
parent | 60ca800d4fc410ea9d49ef24dfb80577d4183f15 (diff) |
RJIT: Fix jit_array_ptr
array_reg was clobbered before being used by heap_ptr_opnd.
heap_ptr_opnd should be loaded before array_reg is clobbered.
Diffstat (limited to 'lib/ruby_vm/rjit/insn_compiler.rb')
-rw-r--r-- | lib/ruby_vm/rjit/insn_compiler.rb | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/ruby_vm/rjit/insn_compiler.rb b/lib/ruby_vm/rjit/insn_compiler.rb index 395c0ba227..6d36342d12 100644 --- a/lib/ruby_vm/rjit/insn_compiler.rb +++ b/lib/ruby_vm/rjit/insn_compiler.rb @@ -4989,16 +4989,15 @@ module RubyVM::RJIT end # Generate RARRAY_CONST_PTR_TRANSIENT (part of RARRAY_AREF) - def jit_array_ptr(asm, array_reg, ary_opnd) + def jit_array_ptr(asm, array_reg, ary_opnd) # clobbers array_reg asm.comment('get array pointer for embedded or heap') flags_opnd = [array_reg, C.RBasic.offsetof(:flags)] asm.test(flags_opnd, C::RARRAY_EMBED_FLAG) - heap_ptr_opnd = [array_reg, C.RArray.offsetof(:as, :heap, :ptr)] # Load the address of the embedded array # (struct RArray *)(obj)->as.ary - asm.lea(array_reg, [array_reg, C.RArray.offsetof(:as, :ary)]) - asm.mov(ary_opnd, heap_ptr_opnd) + asm.mov(ary_opnd, [array_reg, C.RArray.offsetof(:as, :heap, :ptr)]) + asm.lea(array_reg, [array_reg, C.RArray.offsetof(:as, :ary)]) # clobbers array_reg asm.cmovnz(ary_opnd, array_reg) end |