[pypy-commit] pypy ppc-backend-2: (edelsohn, bivab): Support FP compare in emit_guard_value.

edelsohn noreply at buildbot.pypy.org
Tue Jun 5 18:17:08 CEST 2012


Author: edelsohn
Branch: ppc-backend-2
Changeset: r55417:5f8c8583ec74
Date: 2012-06-05 12:16 -0400
http://bitbucket.org/pypy/pypy/changeset/5f8c8583ec74/

Log:	(edelsohn, bivab): Support FP compare in emit_guard_value. Use
	FLOAT_INT_CONVERSION area to spill f0.

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
@@ -285,7 +285,7 @@
                 self.mc.cmp_op(0, l0.value, l1.value)
         elif l0.is_fp_reg():
             assert l1.is_fp_reg()
-            self.mc.cmp_op(0, l0.value, l1.value)
+            self.mc.cmp_op(0, l0.value, l1.value, fp=True)
         self._emit_guard(op, failargs, c.NE)
 
     emit_guard_nonnull = emit_guard_true
@@ -357,11 +357,11 @@
             elif loc.is_stack() or loc.is_imm() or loc.is_imm_float():
                 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.mc.stfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
                     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)
+                    self.mc.lfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
                 elif box.type == REF or box.type == INT:
                     if box.type == REF:
                         adr = self.fail_boxes_ptr.get_addr_for_num(i)
@@ -494,8 +494,10 @@
                 offset = param_offset + i * WORD
                 if arg is not None:
                     if arg.type == FLOAT:
+                        self.mc.stfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
                         self.regalloc_mov(arg, r.f0)
                         self.mc.stfd(r.f0.value, r.SP.value, offset)
+                        self.mc.lfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
                     else:
                         self.regalloc_mov(arg, r.SCRATCH)
                         self.mc.store(r.SCRATCH.value, r.SP.value, offset)
@@ -529,7 +531,9 @@
             adr = r.r11
 
         # remap values stored in core registers
+        self.mc.stfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
         remap_frame_layout(self, float_locs, float_regs, r.f0)
+        self.mc.lfd(r.f0.value, r.SPP.value, FORCE_INDEX_OFS + WORD)
         remap_frame_layout(self, non_float_locs, non_float_regs, r.SCRATCH)
 
         # the actual call


More information about the pypy-commit mailing list