Author: edelsohn
Branch: ppc-backend-2
Changeset: r54695:a98d6daa8fec
Date: 2012-04-23 15:19 -0400
http://bitbucket.org/pypy/pypy/changeset/a98d6daa8fec/

Log:    Add float support to emit_finish.

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
@@ -346,12 +346,20 @@
                 with scratch_reg(self.mc):
                     self.mc.load_imm(r.SCRATCH, adr)
                     self.mc.storex(loc.value, 0, r.SCRATCH.value)
-            elif loc.is_vfp_reg():
+            elif loc.is_fp_reg():
                 assert box.type == FLOAT
-                assert 0, "not implemented yet"
+                adr = self.fail_boxes_float.get_addr_for_num(i)
+                with scratch_reg(self.mc):
+                    self.mc.load_imm(r.SCRATCH, adr)
+                    self.mc.stfdx(loc.value, 0, r.SCRATCH.value)
             elif loc.is_stack() or loc.is_imm() or loc.is_imm_float():
                 if box.type == FLOAT:
-                    assert 0, "not implemented yet"
+                    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.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)
                 elif box.type == REF or box.type == INT:
                     if box.type == REF:
                         adr = self.fail_boxes_ptr.get_addr_for_num(i)
@@ -459,7 +467,8 @@
             for i in range(reg_args, n_args):
                 arg = arglocs[i]
                 if arg.type == FLOAT:
-                    assert 0, "not implemented yet"
+                    count += 1
+                    n += WORD
                 else:
                     count += 1
                     n += WORD
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
@@ -20,6 +20,7 @@
 from pypy.jit.backend.model import CompiledLoopToken
 from pypy.rpython.lltypesystem import lltype, rffi, llmemory
 from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.jit.codewriter import longlong
 from pypy.jit.metainterp.history import (INT, REF, FLOAT)
 from pypy.jit.backend.x86.support import values_array
 from pypy.rlib.debug import (debug_print, debug_start, debug_stop,
@@ -83,6 +84,8 @@
     def __init__(self, cpu, failargs_limit=1000):
         self.cpu = cpu
         self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
+        self.fail_boxes_float = values_array(longlong.FLOATSTORAGE,
+                                                            failargs_limit)
         self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
         self.mc = None
         self.datablockwrapper = None
@@ -1371,11 +1374,14 @@
             self.mc.store(r.SCRATCH.value, r.SPP.value, self.FORCE_INDEX_AREA)
             
     def load(self, loc, value):
-        assert loc.is_reg() and value.is_imm()
+        assert (loc.is_reg() and value.is_imm()
+                or loc.is_fp_reg() and value.is_imm_float())
         if value.is_imm():
             self.mc.load_imm(loc, value.getint())
         elif value.is_imm_float():
-            assert 0, "not implemented yet"
+            with scratch_reg(self.mc):
+                self.mc.load_imm(r.SCRATCH, value.getint())
+                self.mc.lfdx(loc.value, 0, r.SCRATCH.value)
 
 def notimplemented_op(self, op, arglocs, regalloc):
     print "[PPC/asm] %s not implemented" % op.getopname()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to