Author: fijal
Branch: arm64
Changeset: r96871:28226a9abdd6
Date: 2019-06-27 17:52 +0200
http://bitbucket.org/pypy/pypy/changeset/28226a9abdd6/

Log:    start working on 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
@@ -335,7 +335,6 @@
         # It must keep stack alignment accordingly.
         mc = InstrBuilder()
         #
-        exc0 = exc1 = None
         mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD)
         mc.STR_ri(r.ip0.value, r.sp.value, WORD)
         mc.STR_ri(r.lr.value, r.sp.value, 0)
@@ -349,10 +348,17 @@
             # we're possibly called from the slowpath of malloc
             # save the caller saved registers
             # assuming we do not collect here
-            exc0, exc1 = r.r4, r.r5
-            XXX
-            mc.PUSH([gpr.value for gpr in r.caller_resp] + [exc0.value, 
exc1.value])
-            mc.VPUSH([vfpr.value for vfpr in r.caller_vfp_resp])
+            exc0, exc1 = r.x19, r.x20
+            mc.SUB_ri(r.sp.value, r.sp.value, (len(r.caller_resp) + 2 + 
len(r.caller_vfp_resp)) * WORD)
+            cur_stack = 0
+            for i in range(0, len(r.caller_resp), 2):
+                mc.STP_rri(r.caller_resp[i].value, r.caller_resp[i + 1].value, 
r.sp.value, i * WORD)
+            cur_stack = len(r.caller_resp)
+            mc.STP_rri(exc0.value, exc1.value, cur_stack * WORD)
+            cur_stack += 2
+            for i in range(len(r.caller_vfp_resp)):
+                mc.STR_di(r.caller_vfp_resp[i].value, r.sp.value, cur_stack * 
WORD)
+                cur_stack += 1
 
             self._store_and_reset_exception(mc, exc0, exc1)
         mc.BL(func)
@@ -360,13 +366,22 @@
         if not for_frame:
             self._pop_all_regs_from_jitframe(mc, [], withfloats, 
callee_only=True)
         else:
-            XXX
+            exc0, exc1 = r.x19, r.x20
             self._restore_exception(mc, exc0, exc1)
-            mc.VPOP([vfpr.value for vfpr in r.caller_vfp_resp])
+
+            cur_stack = 0
+            for i in range(0, len(r.caller_resp), 2):
+                mc.LDP_rri(r.caller_resp[i].value, r.caller_resp[i + 1].value, 
r.sp.value, i * WORD)
+            cur_stack = len(r.caller_resp)
+            mc.LDP_rri(exc0.value, exc1.value, cur_stack * WORD)
+            cur_stack += 2
+            for i in range(len(r.caller_vfp_resp)):
+                mc.LDR_di(r.caller_vfp_resp[i].value, r.sp.value, cur_stack * 
WORD)
+                cur_stack += 1
+
             assert exc0 is not None
             assert exc1 is not None
-            mc.POP([gpr.value for gpr in r.caller_resp] +
-                            [exc0.value, exc1.value])
+
         #
         if withcards:
             # A final TEST8 before the RET, for the caller.  Careful to
@@ -430,10 +445,9 @@
 
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            xxx
-            self._load_shadowstack_top(mc, r.r5, gcrootmap)
+            self._load_shadowstack_top(mc, r.x19, gcrootmap)
             # store the new jitframe addr in the shadowstack
-            mc.STR_ri(r.x0.value, r.r5.value, imm=-WORD)
+            mc.STR_ri(r.x0.value, r.x19.value, -WORD)
 
         # reset the jf_gcmap field in the jitframe
         mc.gen_load_int(r.ip0.value, 0)
@@ -600,14 +614,12 @@
     def _reload_frame_if_necessary(self, mc):
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            YYY
             rst = gcrootmap.get_root_stack_top_addr()
-            mc.gen_load_int(r.ip.value, rst)
-            self.load_reg(mc, r.ip, r.ip)
-            self.load_reg(mc, r.fp, r.ip, ofs=-WORD)
+            mc.gen_load_int(r.ip0.value, rst)
+            self.load_reg(mc, r.ip0, r.ip0)
+            self.load_reg(mc, r.fp, r.ip0, -WORD)
         wbdescr = self.cpu.gc_ll_descr.write_barrier_descr
         if gcrootmap and wbdescr:
-            YYY
             # frame never uses card marking, so we enforce this is not
             # an array
             self._write_barrier_fastpath(mc, wbdescr, [r.fp], array=False,
@@ -680,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):
@@ -723,16 +735,17 @@
         else:
             endaddr, lengthaddr, _ = self.cpu.insert_stack_check()
             # load stack end
-            self.mc.gen_load_int(r.ip.value, endaddr)          # load ip, [end]
-            self.mc.LDR_ri(r.ip.value, r.ip.value)             # LDR ip, ip
+            self.mc.gen_load_int(r.ip0.value, endaddr)           # load ip0, 
[end]
+            self.mc.LDR_ri(r.ip0.value, r.ip0.value)             # LDR ip0, ip0
             # load stack length
-            self.mc.gen_load_int(r.lr.value, lengthaddr)       # load lr, lengh
-            self.mc.LDR_ri(r.lr.value, r.lr.value)             # ldr lr, *lengh
+            self.mc.gen_load_int(r.ip1.value, lengthaddr)        # load ip1, 
lengh
+            self.mc.LDR_ri(r.ip1.value, r.ip1.value)             # ldr ip1, 
*lengh
             # calculate ofs
-            self.mc.SUB_rr(r.ip.value, r.ip.value, r.sp.value) # SUB ip, 
current
+            self.mc.SUB_rr(r.ip0.value, r.ip0.value, r.sp.value) # SUB ip, 
current
             # if ofs
-            self.mc.CMP_rr(r.ip.value, r.lr.value)             # CMP ip, lr
-            self.mc.BL(self.stack_check_slowpath, c=c.HI)      # call if ip > 
lr
+            self.mc.CMP_rr(r.ip0.value, r.ip1.value)             # CMP ip, lr
+            self.mc.B_ofs_cond(4 + 2, c.LS)
+            self.mc.B(self.stack_check_slowpath)                 # call if ip 
> lr
 
     def _call_header(self):
         stack_size = (len(r.callee_saved_registers) + 4) * WORD
@@ -890,7 +903,7 @@
         elif loc.is_stack():
             self.mc.STR_ri(prev_loc.value, r.fp.value, loc.value)
         else:
-            XXX
+            assert False
 
     def _mov_imm_to_loc(self, prev_loc, loc):
         if loc.is_core_reg():
@@ -1025,19 +1038,18 @@
         #    mc.gen_load_int(r.ip1, ofs)
         #    mc.STR_rr(source.value, base.value, r.ip1)
 
-    def load_reg(self, mc, target, base, ofs=0, helper=None):
+    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)
+            return self._load_core_reg(mc, target, base, ofs, helper)
 
-    def _load_core_reg(self, mc, target, base, ofs):
+    def _load_core_reg(self, mc, target, base, ofs, helper):
         if check_imm_arg(abs(ofs)):
             mc.LDR_ri(target.value, base.value, ofs)
         else:
-            XXX
-            mc.gen_load_int(helper.value, ofs, cond=cond)
-            mc.LDR_rr(target.value, base.value, helper.value, cond=cond)
+            mc.gen_load_int(helper.value, ofs)
+            mc.LDR_rr(target.value, base.value, helper.value)
 
     def check_frame_before_jump(self, target_token):
         if target_token in self.target_tokens_currently_compiling:
diff --git a/rpython/jit/backend/aarch64/opassembler.py 
b/rpython/jit/backend/aarch64/opassembler.py
--- a/rpython/jit/backend/aarch64/opassembler.py
+++ b/rpython/jit/backend/aarch64/opassembler.py
@@ -563,14 +563,17 @@
                 loc = r.ip0
             else:
                 assert v1.is_stack()
-                yyy
+                self.mc.LDR_ri(r.ip0.value, r.fp.value, v1.value)
+                loc = r.ip0
             self.mc.CMP_rr(v0.value, loc.value)
         else:
             assert v0.is_vfp_reg()
             if v1.is_vfp_reg():
                 loc = v1
             else:
-                xxx
+                assert v1.is_stack()
+                loc = r.vfp_ip
+                self.mc.LDR_di(r.vfp_ip.value, r.fp.value, v1.value)
             self.mc.FCMP_dd(v0.value, loc.value)
         self._emit_guard(op, c.EQ, arglocs[2:])
 
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
@@ -579,28 +579,28 @@
         effectinfo = calldescr.get_extra_info()
         if effectinfo is not None:
             oopspecindex = effectinfo.oopspecindex
-            if oopspecindex in (EffectInfo.OS_LLONG_ADD,
-                            EffectInfo.OS_LLONG_SUB,
-                            EffectInfo.OS_LLONG_AND,
-                            EffectInfo.OS_LLONG_OR,
-                            EffectInfo.OS_LLONG_XOR):
-                XXX
-                if self.cpu.cpuinfo.neon:
-                    args = self._prepare_llong_binop_xx(op, fcond)
-                    self.perform_extra(op, args, fcond)
-                    return
-            elif oopspecindex == EffectInfo.OS_LLONG_TO_INT:
-                args = self._prepare_llong_to_int(op, fcond)
-                self.perform_extra(op, args, fcond)
-                return
-            elif oopspecindex == EffectInfo.OS_MATH_SQRT:
+            #if oopspecindex in (EffectInfo.OS_LLONG_ADD,
+            #                EffectInfo.OS_LLONG_SUB,
+            #                EffectInfo.OS_LLONG_AND,
+            #                EffectInfo.OS_LLONG_OR,
+            #                EffectInfo.OS_LLONG_XOR):
+            #    XXX
+            #    if self.cpu.cpuinfo.neon:
+            #        args = self._prepare_llong_binop_xx(op, fcond)
+            #        self.perform_extra(op, args, fcond)
+            #        return
+            #elif oopspecindex == EffectInfo.OS_LLONG_TO_INT:
+            #    args = self._prepare_llong_to_int(op, fcond)
+            #    self.perform_extra(op, args, fcond)
+            #    return
+            if oopspecindex == EffectInfo.OS_MATH_SQRT:
                 args = self._prepare_op_math_sqrt(op)
                 self.assembler.math_sqrt(op, args)
                 return
-            elif oopspecindex == EffectInfo.OS_THREADLOCALREF_GET:
-                args = self._prepare_threadlocalref_get(op, fcond)
-                self.perform_extra(op, args, fcond)
-                return
+            #elif oopspecindex == EffectInfo.OS_THREADLOCALREF_GET:
+            #    args = self._prepare_threadlocalref_get(op, fcond)
+            #    self.perform_extra(op, args, fcond)
+            #    return
             #elif oopspecindex == EffectInfo.OS_MATH_READ_TIMESTAMP:
             #    ...
         return self._prepare_call(op)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to