[pypy-commit] pypy ppc-backend-2: Pass RegisterLocation to mov_loc_loc.

edelsohn noreply at buildbot.pypy.org
Fri Jun 1 20:49:00 CEST 2012


Author: edelsohn
Branch: ppc-backend-2
Changeset: r55264:a7d3c4eb71e2
Date: 2012-06-01 14:48 -0400
http://bitbucket.org/pypy/pypy/changeset/a7d3c4eb71e2/

Log:	Pass RegisterLocation to mov_loc_loc. Change uses of ENCODING_AREA
	to FORCE_INDEX_OFS. Add FP args support to emit_call.

diff --git a/pypy/jit/backend/ppc/opassembler.py b/pypy/jit/backend/ppc/opassembler.py
--- a/pypy/jit/backend/ppc/opassembler.py
+++ b/pypy/jit/backend/ppc/opassembler.py
@@ -358,7 +358,7 @@
                 if box.type == FLOAT:
                     adr = self.fail_boxes_float.get_addr_for_num(i)
                     self.mc.stfd(r.f0.value, r.SPP.value, 0)
-                    self.mov_loc_loc(loc, r.f0.value)
+                    self.mov_loc_loc(loc, r.f0)
                     self.mc.load_imm(r.SCRATCH, adr)
                     self.mc.stfdx(r.f0.value, 0, r.SCRATCH.value)
                     self.mc.lfd(r.f0.value, r.SPP.value, 0)
@@ -499,28 +499,25 @@
         # collect variables that need to go in registers
         # and the registers they will be stored in 
         num = 0
+        fpnum = 0
         count = 0
         non_float_locs = []
         non_float_regs = []
         float_locs = []
+        float_regs = []
         for i in range(reg_args):
             arg = arglocs[i]
-            if arg.type == FLOAT and count % 2 != 0:
-                num += 1
-                count = 0
             reg = r.PARAM_REGS[num]
+            fpreg = r.PARAM_FPREGS[fpnum]
 
             if arg.type == FLOAT:
-                float_locs.append((arg, reg))
+                float_locs.append(arg)
+                float_regs.append(fpreg)
+                fpnum += 1
             else:
                 non_float_locs.append(arg)
                 non_float_regs.append(reg)
-
-            if arg.type == FLOAT:
                 num += 1
-            else:
-                num += 1
-                count += 1
 
         if adr in non_float_regs:
             non_float_locs.append(adr)
@@ -528,6 +525,7 @@
             adr = r.r11
 
         # remap values stored in core registers
+        remap_frame_layout(self, float_locs, float_regs, r.f0)
         remap_frame_layout(self, non_float_locs, non_float_regs, r.SCRATCH)
 
         # the actual call
@@ -1060,8 +1058,7 @@
 
                 # use r20 as temporary register, save it in FORCE INDEX slot
                 temp_reg = r.r20
-                ENCODING_AREA = len(r.MANAGED_REGS) * WORD
-                self.mc.store(temp_reg.value, r.SPP.value, ENCODING_AREA)
+                self.mc.store(temp_reg.value, r.SPP.value, FORCE_INDEX_OFS)
 
                 self.mc.srli_op(temp_reg.value, loc_index.value, s)
                 self.mc.not_(temp_reg.value, temp_reg.value)
@@ -1081,7 +1078,7 @@
                 # done
 
                 # restore temporary register r20
-                self.mc.load(temp_reg.value, r.SPP.value, ENCODING_AREA)
+                self.mc.load(temp_reg.value, r.SPP.value, FORCE_INDEX_OFS)
 
                 # patch the JMP above
                 offset = self.mc.currpos()
@@ -1108,9 +1105,8 @@
     
     def emit_force_token(self, op, arglocs, regalloc):
         res_loc = arglocs[0]
-        ENCODING_AREA = len(r.MANAGED_REGS) * WORD
         self.mc.mr(res_loc.value, r.SPP.value)
-        self.mc.addi(res_loc.value, res_loc.value, ENCODING_AREA)
+        self.mc.addi(res_loc.value, res_loc.value, FORCE_INDEX_OFS)
 
     #    self._emit_guard(guard_op, regalloc._prepare_guard(guard_op), c.LT)
     # from: ../x86/assembler.py:1668
@@ -1218,9 +1214,8 @@
         pmc.b(currpos - fast_path_to_end_jump_pos)
         pmc.overwrite()
 
-        ENCODING_AREA = len(r.MANAGED_REGS) * WORD
         with scratch_reg(self.mc):
-            self.mc.load(r.SCRATCH.value, r.SPP.value, ENCODING_AREA)
+            self.mc.load(r.SCRATCH.value, r.SPP.value, FORCE_INDEX_OFS)
             self.mc.cmp_op(0, r.SCRATCH.value, 0, imm=True)
 
         self._emit_guard(guard_op, regalloc._prepare_guard(guard_op),


More information about the pypy-commit mailing list