Author: edelsohn
Branch: ppc-backend-2
Changeset: r54690:215a02bf68e1
Date: 2012-04-23 14:31 -0400
http://bitbucket.org/pypy/pypy/changeset/215a02bf68e1/

Log:    Add float support to count_reg_args. Add float support to
        regalloc_mov. Fix arglocs typo.

diff --git a/pypy/jit/backend/ppc/helper/assembler.py 
b/pypy/jit/backend/ppc/helper/assembler.py
--- a/pypy/jit/backend/ppc/helper/assembler.py
+++ b/pypy/jit/backend/ppc/helper/assembler.py
@@ -61,7 +61,8 @@
     count = 0
     for x in range(min(len(args), MAX_REG_PARAMS)):
         if args[x].type == FLOAT:
-            assert 0, "not implemented yet"
+            count += 1
+            words += 1
         else:
             count += 1
             words += 1
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
@@ -177,31 +177,31 @@
 class FloatOpAssembler(object):
     _mixin_ = True
 
-    def emit_float_add(self, op, argsloc, regalloc):
+    def emit_float_add(self, op, arglocs, regalloc):
         l0, l1, res = arglocs
         self.mc.fadd(res.value, l0.value, l1.value)
 
-    def emit_float_sub(self, op, argsloc, regalloc):
+    def emit_float_sub(self, op, arglocs, regalloc):
         l0, l1, res = arglocs
         self.mc.fsub(res.value, l0.value, l1.value)
 
-    def emit_float_mul(self, op, argsloc, regalloc):
+    def emit_float_mul(self, op, arglocs, regalloc):
         l0, l1, res = arglocs
         self.mc.fmul(res.value, l0.value, l1.value)
 
-    def emit_float_truediv(self, op, argsloc, regalloc):
+    def emit_float_truediv(self, op, arglocs, regalloc):
         l0, l1, res = arglocs
         self.mc.fdiv(res.value, l0.value, l1.value)
 
-    def emit_float_neg(self, op, argsloc, regalloc):
+    def emit_float_neg(self, op, arglocs, regalloc):
         l0, res = arglocs
         self.mc.fneg(res.value, l0.value)
 
-    def emit_float_abs(self, op, argsloc, regalloc):
+    def emit_float_abs(self, op, arglocs, regalloc):
         l0, res = arglocs
         self.mc.fabs(res.value, l0.value)
 
-    def emit_float_sqrt(self, op, argsloc, regalloc):
+    def emit_float_sqrt(self, op, arglocs, regalloc):
         l0, res = arglocs
         self.mc.fsqrt(res.value, l0.value)
 
diff --git a/pypy/jit/backend/ppc/ppc_assembler.py 
b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -1168,6 +1168,17 @@
                     self.mc.load(r.SCRATCH.value, r.SPP.value, offset)
                     self.mc.store(r.SCRATCH.value, r.SPP.value, target_offset)
                 return
+            elif loc.is_fp_reg():
+                assert prev_loc.type == FLOAT, 'source not float location'
+                with scratch_reg(self.mc):
+                    offset = prev_loc.value
+                    if not _check_imm_arg(offset):
+                        self.mc.load_imm(r.SCRATCH, offset)
+                        self.mc.sub(r.SCRATCH.value, r.SPP.value, 
r.SCRATCH.value)
+                    else:
+                        self.mc.sub(r.SCRATCH.value, r.SPP.value, 
r.SCRARTCH.value)
+                    self.mc.lfdx(loc.value, 0, r.SCRATCH.value)
+                return
             assert 0, "not supported location"
         elif prev_loc.is_reg():
             reg = prev_loc.as_key()
@@ -1182,6 +1193,35 @@
                 self.mc.store(reg, r.SPP.value, offset)
                 return
             assert 0, "not supported location"
+        elif prev_loc.is_imm_float():
+            if loc.is_fp_reg():
+                with scratch_reg(self.mc):
+                    self.mc.load_imm(r.SCRATCH, value)
+                    self.mc.lfdx(loc, 0, r.SCRATCH)
+                return
+            elif loc.is_stack():
+                with scratch_reg(self.mc):
+                    offset = loc.value
+                    self.mc.load_imm(r.SCRATCH, value)
+                    self.mc.store(r.SCRATCH.value, r.SPP.value, offset)
+                return
+            assert 0, "not supported location"
+        elif prev_loc.is_fp_reg():
+            if loc.is_fp_reg():
+                self.mc.fmr(loc.value, prev_loc.value)
+                return
+            elif loc.is_stack():
+                assert loc.type == FLOAT, "target not float location"
+                with scratch_reg(self.mc):
+                    offset = loc.value
+                    if not _check_imm_arg(offset):
+                        self.mc.load_imm(r.SCRATCH, offset)
+                        self.mc.sub(r.SCRATCH.value, r.SPP.value, offset)
+                    else:
+                        self.mc.sub(r.SCRATCH.value, r.SPP.value, 
r.SCRATCH.value)
+                    self.mc.stfdx(prev_loc.value, 0, r.SCRATCH.value)
+                return
+            assert 0, "not supported location"
         assert 0, "not supported location"
     mov_loc_loc = regalloc_mov
 
diff --git a/pypy/jit/backend/ppc/regalloc.py b/pypy/jit/backend/ppc/regalloc.py
--- a/pypy/jit/backend/ppc/regalloc.py
+++ b/pypy/jit/backend/ppc/regalloc.py
@@ -1,6 +1,7 @@
 from pypy.jit.backend.llsupport.regalloc import (RegisterManager, FrameManager,
                                                  TempBox, 
compute_vars_longevity)
 from pypy.jit.backend.ppc.arch import (WORD, MY_COPY_OF_REGS, IS_PPC_32)
+from pypy.jit.codewriter import longlong
 from pypy.jit.backend.ppc.jump import remap_frame_layout
 from pypy.jit.backend.ppc.locations import imm
 from pypy.jit.backend.ppc.helper.regalloc import (_check_imm_arg,
@@ -10,7 +11,7 @@
                                                   
prepare_binary_int_op_with_imm,
                                                   prepare_unary_cmp,
                                                   prepare_float_op)
-from pypy.jit.metainterp.history import (Const, ConstInt, ConstPtr,
+from pypy.jit.metainterp.history import (Const, ConstInt, ConstFloat, ConstPtr,
                                          Box, BoxPtr,
                                          INT, REF, FLOAT)
 from pypy.jit.metainterp.history import JitCellToken, TargetToken
@@ -57,7 +58,7 @@
     def convert_to_imm(self, c):
         adr = self.assembler.datablockwrapper.malloc_aligned(8, 8)
         x = c.getfloatstorage()
-        rffi.cast(rffi.CArrayPtr(long.FLOATSTORAGE), adr)[0] = x
+        rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x
         return locations.ConstFloatLoc(adr)
 
     def __init__(self, longevity, frame_manager=None, assembler=None):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to