Author: Maciej Fijalkowski <[email protected]>
Branch: arm64
Changeset: r96819:fee018704c07
Date: 2019-06-18 12:11 +0000
http://bitbucket.org/pypy/pypy/changeset/fee018704c07/

Log:    enough float support to start running tests

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
@@ -6,7 +6,7 @@
 from rpython.jit.backend.aarch64.opassembler import ResOpAssembler
 from rpython.jit.backend.aarch64.regalloc import (Regalloc, check_imm_arg,
     operations as regalloc_operations, guard_operations, comp_operations,
-    CoreRegisterManager)
+    CoreRegisterManager, VFPRegisterManager)
 from rpython.jit.backend.aarch64 import registers as r
 from rpython.jit.backend.arm import conditions as c
 from rpython.jit.backend.llsupport import jitframe
@@ -248,9 +248,8 @@
             # Push VFP regs
             regs = VFPRegisterManager.all_regs
             ofs = len(CoreRegisterManager.all_regs) * WORD
-            assert check_imm_arg(ofs+base_ofs)
-            mc.ADD_ri(r.ip.value, r.fp.value, imm=ofs+base_ofs)
-            mc.VSTM(r.ip.value, [vfpr.value for vfpr in regs])
+            for reg in regs:
+                mc.STR_di(reg.value, r.fp.value, ofs + base_ofs + reg.value * 
WORD)
 
     def _pop_all_regs_from_jitframe(self, mc, ignored_regs, withfloats,
                                     callee_only=False):
@@ -278,9 +277,8 @@
             # Pop VFP regs
             regs = VFPRegisterManager.all_regs
             ofs = len(CoreRegisterManager.all_regs) * WORD
-            assert check_imm_arg(ofs+base_ofs)
-            mc.ADD_ri(r.ip.value, r.fp.value, imm=ofs+base_ofs)
-            mc.VLDM(r.ip.value, [vfpr.value for vfpr in regs])
+            for reg in regs:
+                mc.LDR_di(reg.value, r.fp.value, ofs + base_ofs + reg.value * 
WORD)
 
     def _build_failure_recovery(self, exc, withfloats=False):
         mc = InstrBuilder()
@@ -745,11 +743,6 @@
         
         #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:
-            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)
 
         # set fp to point to the JITFRAME, passed in argument 'x0'
         self.mc.MOV_rr(r.fp.value, r.x0.value)
@@ -916,13 +909,11 @@
             mc = self.mc
         if gcrootmap and gcrootmap.is_shadow_stack:
             self.gen_footer_shadowstack(gcrootmap, mc)
-        if self.cpu.supports_floats:
-            XXX
-        #    mc.VPOP([reg.value for reg in r.callee_saved_vfp_registers])
 
         # pop all callee saved registers
 
-        stack_size = (len(r.callee_saved_registers) + 2) * WORD
+        stack_size = len(r.callee_saved_registers) * WORD
+
         for i in range(0, len(r.callee_saved_registers), 2):
             mc.LDP_rri(r.callee_saved_registers[i].value,
                             r.callee_saved_registers[i + 1].value,
@@ -930,6 +921,7 @@
                             (i + 2) * WORD)
         mc.LDP_rr_postindex(r.fp.value, r.lr.value, r.sp.value, stack_size)
 
+
         mc.RET_r(r.lr.value)
 
     def store_reg(self, mc, source, base, ofs=0, helper=None):
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
@@ -24,6 +24,12 @@
         self.write32((base << 22) | ((offset >> 3) << 10) |
                      (rn << 5) | rt)
 
+    def STR_di(self, rt, rn, offset):
+        base = 0b1111110100
+        assert offset & 0x7 == 0
+        assert 0 <= offset < 32768
+        self.write32((base << 22) | ((offset >> 3) << 10) | (rn << 5) | rt)
+
     def STP_rr_preindex(self, reg1, reg2, rn, offset):
         base = 0b1010100110
         assert -512 <= offset < 512
@@ -110,6 +116,12 @@
         assert immed & 0x7 == 0
         self.write32((base << 22) | (immed >> 3 << 10) | (rn << 5) | rt)
 
+    def LDR_di(self, rt, rn, offset):
+        assert offset & 0x7 == 0
+        assert 0 <= offset < 32768
+        base = 0b1111110101
+        self.write32((base << 22) | (offset >> 3 << 10) | (rn << 5) | rt)
+
     def LDRB_ri(self, rt, rn, immed):
         base = 0b0011100101
         assert 0 <= immed <= 1<<12
@@ -340,6 +352,8 @@
     def get_max_size_of_gen_load_int(self):
         return 4
 
+    # -------------------------------------------
+
 
 class OverwritingBuilder(AbstractAarch64Builder):
     def __init__(self, cb, start, size):
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
@@ -10,7 +10,7 @@
  x21, x22, x23, x24, x25, x26, x27, x28, x29, x30] = registers
 
 vfpregisters = [VFPRegisterLocation(i) for i in range(32)]
-all_vfp_regs = vfpregisters[:16]
+all_vfp_regs = vfpregisters[:8]
 all_regs = registers[:16] #+ [x19, x20, x21, x22]
 
 lr = x30
@@ -22,6 +22,7 @@
 ip0 = x16
 
 callee_saved_registers = [] # x19, x20, x21, x22]
+vfp_argument_regs = caller_vfp_resp = all_vfp_regs[:8]
 
 argument_regs = [x0, x1, x2, x3, x4, x5, x6, x7]
 caller_resp = argument_regs + [x8, x9, x10, x11, x12, x13, x14, x15]
diff --git a/rpython/jit/backend/aarch64/runner.py 
b/rpython/jit/backend/aarch64/runner.py
--- a/rpython/jit/backend/aarch64/runner.py
+++ b/rpython/jit/backend/aarch64/runner.py
@@ -12,6 +12,7 @@
     all_reg_indexes = range(len(r.all_regs))
     gen_regs = r.all_regs
     float_regs = VFPRegisterManager.all_regs
+    supports_floats = True
 
     from rpython.jit.backend.aarch64.arch import JITFRAME_FIXED_SIZE
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to