[pypy-commit] pypy arm64: hopefully finish translation

fijal pypy.commits at gmail.com
Thu Jun 27 12:59:42 EDT 2019


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96874:3a7beb528024
Date: 2019-06-27 16:58 +0000
http://bitbucket.org/pypy/pypy/changeset/3a7beb528024/

Log:	hopefully finish translation

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
@@ -692,8 +692,8 @@
         size = self.mc.get_relative_pos() 
         res = self.mc.materialize(self.cpu, allblocks,
                                    self.cpu.gc_ll_descr.gcrootmap)
-        self.cpu.codemap.register_codemap(
-            self.codemap.get_final_bytecode(res, size))
+        #self.cpu.codemap.register_codemap(
+        #    self.codemap.get_final_bytecode(res, size))
         return res
 
     def patch_trace(self, faildescr, looptoken, bridge_addr, regalloc):
@@ -1039,12 +1039,7 @@
         #    mc.STR_rr(source.value, base.value, r.ip1)
 
     def load_reg(self, mc, target, base, ofs=0, helper=r.ip0):
-        if target.is_vfp_reg():
-            return self._load_vfp_reg(mc, target, base, ofs)
-        elif target.is_core_reg():
-            return self._load_core_reg(mc, target, base, ofs, helper)
-
-    def _load_core_reg(self, mc, target, base, ofs, helper):
+        assert target.is_core_reg()
         if check_imm_arg(abs(ofs)):
             mc.LDR_ri(target.value, base.value, ofs)
         else:
@@ -1101,7 +1096,7 @@
     print "[ARM64/asm] %s not implemented" % op.getopname()
     raise NotImplementedError(op)
 
-def notimplemented_guard_op(self, op, fcond, arglocs):
+def notimplemented_guard_op(self, op, guard_op, fcond, arglocs):
     print "[ARM64/asm] %s not implemented" % op.getopname()
     raise NotImplementedError(op)
 
diff --git a/rpython/jit/backend/aarch64/callbuilder.py b/rpython/jit/backend/aarch64/callbuilder.py
--- a/rpython/jit/backend/aarch64/callbuilder.py
+++ b/rpython/jit/backend/aarch64/callbuilder.py
@@ -97,9 +97,11 @@
     def load_result(self):
         resloc = self.resloc
         if self.restype == 'S':
+            assert False, "not supported yet"
             XXX
             self.mc.VMOV_sc(resloc.value, r.s0.value)
         elif self.restype == 'L':
+            assert False, "not possible on 64bit backend"
             YYY
             assert resloc.is_vfp_reg()
             self.mc.FMDRR(resloc.value, r.r0.value, r.r1.value)
@@ -139,10 +141,9 @@
         # Save this thread's shadowstack pointer into r7, for later comparison
         gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap
         if gcrootmap:
-            XXX
             rst = gcrootmap.get_root_stack_top_addr()
-            self.mc.gen_load_int(r.r5.value, rst)
-            self.mc.LDR_ri(r.r7.value, r.r5.value)
+            self.mc.gen_load_int(r.x19.value, rst)
+            self.mc.LDR_ri(r.x20.value, r.x19.value)
 
         # change 'rpy_fastgil' to 0 (it should be non-zero right now)
         self.mc.DMB()
@@ -198,15 +199,14 @@
 
     def move_real_result_and_call_reacqgil_addr(self, fastgil):
         # try to reacquire the lock.
-        #     XXX r5 == &root_stack_top
-        #     r6 == fastgil
-        #     XXX r7 == previous value of root_stack_top
+        #     x19 == &root_stack_top
+        #     x20 == previous value of root_stack_top
         self.mc.gen_load_int(r.ip1.value, fastgil)
         self.mc.LDAXR(r.x1.value, r.ip1.value)    # load the lock value
         self.mc.MOVZ_r_u16(r.ip0.value, 1, 0)
         self.mc.CMP_ri(r.x1.value, 0)            # is the lock free?
         if self.asm.cpu.gc_ll_descr.gcrootmap:
-            jump_val = XXX
+            jump_val = 0 # XXX
         else:
             jump_val = 3 * 4
         self.mc.B_ofs_cond(jump_val, c.NE)
@@ -220,15 +220,16 @@
         # 'EQ is true', or equivalently by 'r3 == 0'.
         #
         if self.asm.cpu.gc_ll_descr.gcrootmap:
-            XXX
+            raise Exception("not implemented yet")
             # When doing a call_release_gil with shadowstack, there
             # is the risk that the 'rpy_fastgil' was free but the
             # current shadowstack can be the one of a different
             # thread.  So here we check if the shadowstack pointer
             # is still the same as before we released the GIL (saved
-            # in 'r7'), and if not, we fall back to 'reacqgil_addr'.
-            self.mc.LDR_ri(r.ip.value, r.r5.value, cond=c.EQ)
-            self.mc.CMP_rr(r.ip.value, r.r7.value, cond=c.EQ)
+            # in 'x20'), and if not, we fall back to 'reacqgil_addr'.
+            self.mc.LDR_ri(r.ip0.value, r.x19.value)
+            self.mc.CMP_rr(r.ip0.value, r.x20.value)
+            XXX
             b1_location = self.mc.currpos()
             self.mc.BKPT()                       # BEQ below
             # there are two cases here: either EQ was false from
diff --git a/rpython/jit/backend/aarch64/regalloc.py b/rpython/jit/backend/aarch64/regalloc.py
--- a/rpython/jit/backend/aarch64/regalloc.py
+++ b/rpython/jit/backend/aarch64/regalloc.py
@@ -814,7 +814,7 @@
         l1 = self.loc(op.getarg(1))
         imm_a1 = check_imm_box(op.getarg(1))
         if not imm_a1:
-            l1 = self.make_sure_var_in_reg(op.getarg(1), [arg])
+            l1 = self.make_sure_var_in_reg(op.getarg(1), [op.getarg(0)])
         arglocs = self._guard_impl(op)
         return [arg, l1] + arglocs
 
@@ -894,7 +894,7 @@
         arg0 = self.make_sure_var_in_reg(args[0], args)
         arg1 = self.make_sure_var_in_reg(args[1], args)
         res = self.force_allocate_reg(op)
-        return [arg0, arg1, args[2], args[3], res]
+        return [arg0, arg1, imm(args[2].getint()), imm(args[3].getint()), res]
 
     def prepare_op_check_memory_error(self, op):
         argloc = self.make_sure_var_in_reg(op.getarg(0))


More information about the pypy-commit mailing list