summaryrefslogtreecommitdiff
path: root/lib/ruby_vm/rjit/insn_compiler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-03-25 21:43:12 -0700
committerTakashi Kokubun <[email protected]>2023-03-25 21:43:15 -0700
commit1396b83153d395c4c672846749d7ec53b80d3d2a (patch)
tree80e035e3212fe92e40428b8b60d6e63452a90d20 /lib/ruby_vm/rjit/insn_compiler.rb
parent60ca800d4fc410ea9d49ef24dfb80577d4183f15 (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.rb7
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