[pypy-commit] pypy arm64: (fijal, arigo)
fijal
pypy.commits at gmail.com
Mon Feb 4 10:58:27 EST 2019
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r95795:35539313ed06
Date: 2019-02-04 15:57 +0000
http://bitbucket.org/pypy/pypy/changeset/35539313ed06/
Log: (fijal, arigo)
slow progress
diff --git a/rpython/jit/backend/aarch64/assembler.py b/rpython/jit/backend/aarch64/assembler.py
--- a/rpython/jit/backend/aarch64/assembler.py
+++ b/rpython/jit/backend/aarch64/assembler.py
@@ -143,6 +143,9 @@
pass
def _build_stack_check_slowpath(self):
+ self.stack_check_slowpath = 0 #XXX
+
+ def _check_frame_depth_debug(self, mc):
pass
def reserve_gcref_table(self, allgcrefs):
@@ -167,25 +170,24 @@
self.mc.BL(self.stack_check_slowpath, c=c.HI) # call if ip > lr
def _call_header(self):
- stack_size = WORD #alignment
- stack_size += len(r.callee_saved_registers) * WORD
+ stack_size = (len(r.callee_saved_registers) + 2) * WORD
+ self.mc.STP_rr_preindex(r.fp.value, r.lr.value, r.sp.value, -stack_size)
+ for i in range(0, len(r.callee_saved_registers), 2):
+ self.mc.STP_rri(r.callee_saved_registers[i].value,
+ r.callee_saved_registers[i + 1].value,
+ r.sp.value,
+ (i + 2) * WORD)
+
+ #self.saved_threadlocal_addr = 0 # at offset 0 from location 'sp'
+ # ^^^XXX save it from register x1 into some place
if self.cpu.supports_floats:
- stack_size += len(r.callee_saved_vfp_registers) * 2 * WORD
-
- # push all callee saved registers including lr; and push r1 as
- # well, which contains the threadlocal_addr argument. Note that
- # we're pushing a total of 10 words, which keeps the stack aligned.
- self.mc.PUSH([reg.value for reg in r.callee_saved_registers] +
- [r.r1.value])
- self.saved_threadlocal_addr = 0 # at offset 0 from location 'sp'
- if self.cpu.supports_floats:
+ XXX
self.mc.VPUSH([reg.value for reg in r.callee_saved_vfp_registers])
self.saved_threadlocal_addr += (
len(r.callee_saved_vfp_registers) * 2 * WORD)
- assert stack_size % 8 == 0 # ensure we keep alignment
- # set fp to point to the JITFRAME
- self.mc.MOV_rr(r.fp.value, r.r0.value)
+ # set fp to point to the JITFRAME, passed in argument 'x0'
+ self.mc.MOV_rr(r.fp.value, r.x0.value)
#
gcrootmap = self.cpu.gc_ll_descr.gcrootmap
if gcrootmap and gcrootmap.is_shadow_stack:
diff --git a/rpython/jit/backend/aarch64/codebuilder.py b/rpython/jit/backend/aarch64/codebuilder.py
--- a/rpython/jit/backend/aarch64/codebuilder.py
+++ b/rpython/jit/backend/aarch64/codebuilder.py
@@ -1,6 +1,8 @@
from rpython.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
from rpython.jit.backend.aarch64.locations import RegisterLocation
+from rpython.jit.backend.aarch64 import registers as r
+
class AbstractAarch64Builder(object):
def write32(self, word):
@@ -19,6 +21,27 @@
self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) |
(reg2 << 10) | (rn << 5) | reg1)
+ def STP_rri(self, reg1, reg2, rn, offset):
+ base = 0b1010100100
+ assert -512 <= offset < 512
+ assert offset & 0x7 == 0
+ self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) |
+ (reg2 << 10) | (rn << 5) | reg1)
+
+ def MOV_rr(self, rd, rn):
+ self.ORR_rr(rd, r.xzr.value, rn)
+
+ def ORR_rr(self, rd, rn, rm):
+ base = 0b10101010000
+ self.write32((base << 21) | (rm << 16) |
+ (rn << 5) | rd)
+
+ def ADD_ri(self, rd, rn, constant):
+ base = 0b1001000100
+ assert 0 <= constant < 4096
+ self.write32((base << 22) | (constant << 10) |
+ (rn << 5) | rd)
+
class InstrBuilder(BlockBuilderMixin, AbstractAarch64Builder):
def __init__(self, arch_version=7):
diff --git a/rpython/jit/backend/aarch64/registers.py b/rpython/jit/backend/aarch64/registers.py
--- a/rpython/jit/backend/aarch64/registers.py
+++ b/rpython/jit/backend/aarch64/registers.py
@@ -4,7 +4,7 @@
registers = [RegisterLocation(i) for i in range(31)]
-sp = wzr = ZeroRegister()
+sp = xzr = ZeroRegister()
[x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10,
x11, x12, x13, x14, x15, x16, x17, x18, x19, x20,
x21, x22, x23, x24, x25, x26, x27, x28, x29, x30] = registers
@@ -18,8 +18,6 @@
ip1 = x17
ip0 = x16
-callee_resp = [x19, x20, x21, x22, fp]
+callee_saved_registers = [x19, x20, x21, x22]
argument_regs = caller_resp = [x0, x1, x2, x3, x4, x5, x6, x7]
-
-callee_saved_registers = callee_resp + [lr]
diff --git a/rpython/jit/backend/aarch64/test/test_instr_builder.py b/rpython/jit/backend/aarch64/test/test_instr_builder.py
--- a/rpython/jit/backend/aarch64/test/test_instr_builder.py
+++ b/rpython/jit/backend/aarch64/test/test_instr_builder.py
@@ -30,7 +30,18 @@
@given(r1=st.sampled_from(r.registers),
r2=st.sampled_from(r.registers),
offset=st.integers(min_value=-64, max_value=63))
- def test_call_header(self, r1, r2, offset):
+ def test_STP_rr(self, r1, r2, offset):
cb = CodeBuilder()
cb.STP_rr_preindex(r1.value, r2.value, r.sp.value, offset * 8)
assert cb.hexdump() == assemble("STP %r, %r, [sp, %d]!" % (r1, r2, offset * 8))
+ cb = CodeBuilder()
+ cb.STP_rri(r1.value, r2.value, r.sp.value, offset * 8)
+ assert cb.hexdump() == assemble("STP %r, %r, [sp, %d]" % (r1, r2, offset * 8))
+
+ @settings(max_examples=20)
+ @given(r1=st.sampled_from(r.registers),
+ r2=st.sampled_from(r.registers))
+ def test_MOV_rr(self, r1, r2):
+ cb = CodeBuilder()
+ cb.MOV_rr(r1.value, r2.value)
+ assert cb.hexdump() == assemble("MOV %r, %r" % (r1, r2))
More information about the pypy-commit
mailing list