[pypy-commit] pypy ppc-backend-2: Add float support to emit_{get, set}*{field, array}*_gc.

edelsohn noreply at buildbot.pypy.org
Tue Jun 5 19:23:35 CEST 2012


Author: edelsohn
Branch: ppc-backend-2
Changeset: r55420:04c887a6d753
Date: 2012-06-05 13:23 -0400
http://bitbucket.org/pypy/pypy/changeset/04c887a6d753/

Log:	Add float support to emit_{get,set}*{field,array}*_gc.

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
@@ -555,10 +555,16 @@
     def emit_setfield_gc(self, op, arglocs, regalloc):
         value_loc, base_loc, ofs, size = arglocs
         if size.value == 8:
-            if ofs.is_imm():
-                self.mc.std(value_loc.value, base_loc.value, ofs.value)
+            if value_loc.is_fp_reg():
+                if ofs.is_imm():
+                    self.mc.stfd(value_loc.value, base_loc.value, ofs.value)
+                else:
+                    self.mc.stfdx(value_loc.value, base_loc.value, ofs.value)
             else:
-                self.mc.stdx(value_loc.value, base_loc.value, ofs.value)
+                if ofs.is_imm():
+                    self.mc.std(value_loc.value, base_loc.value, ofs.value)
+                else:
+                    self.mc.stdx(value_loc.value, base_loc.value, ofs.value)
         elif size.value == 4:
             if ofs.is_imm():
                 self.mc.stw(value_loc.value, base_loc.value, ofs.value)
@@ -582,10 +588,16 @@
     def emit_getfield_gc(self, op, arglocs, regalloc):
         base_loc, ofs, res, size = arglocs
         if size.value == 8:
-            if ofs.is_imm():
-                self.mc.ld(res.value, base_loc.value, ofs.value)
+            if res.is_fp_reg():
+                if ofs.is_imm():
+                    self.mc.lfd(res.value, base_loc.value, ofs.value)
+                else:
+                    self.mc.lfdx(res.value, base_loc.value, ofs.value)
             else:
-                self.mc.ldx(res.value, base_loc.value, ofs.value)
+                if ofs.is_imm():
+                    self.mc.ld(res.value, base_loc.value, ofs.value)
+                else:
+                    self.mc.ldx(res.value, base_loc.value, ofs.value)
         elif size.value == 4:
             if ofs.is_imm():
                 self.mc.lwz(res.value, base_loc.value, ofs.value)
@@ -626,7 +638,10 @@
                     self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
 
             if fieldsize.value == 8:
-                self.mc.ldx(res_loc.value, base_loc.value, r.SCRATCH.value)
+                if res_loc.is_fp_reg():
+                    self.mc.lfdx(res_loc.value, base_loc.value, r.SCRATCH.value)
+                else:
+                    self.mc.ldx(res_loc.value, base_loc.value, r.SCRATCH.value)
             elif fieldsize.value == 4:
                 self.mc.lwzx(res_loc.value, base_loc.value, r.SCRATCH.value)
             elif fieldsize.value == 2:
@@ -653,7 +668,10 @@
             else:
                 self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
         if fieldsize.value == 8:
-            self.mc.stdx(value_loc.value, base_loc.value, r.SCRATCH.value)
+            if value_loc.is_fp_reg():
+                self.mc.stfdx(value_loc.value, base_loc.value, r.SCRATCH.value)
+            else:
+                self.mc.stdx(value_loc.value, base_loc.value, r.SCRATCH.value)
         elif fieldsize.value == 4:
             self.mc.stwx(value_loc.value, base_loc.value, r.SCRATCH.value)
         elif fieldsize.value == 2:
@@ -692,7 +710,10 @@
             scale_loc = r.SCRATCH
 
         if scale.value == 3:
-            self.mc.stdx(value_loc.value, base_loc.value, scale_loc.value)
+            if value_loc.is_fp_reg():
+                self.mc.stfdx(value_loc.value, base_loc.value, scale_loc.value)
+            else:
+                self.mc.stdx(value_loc.value, base_loc.value, scale_loc.value)
         elif scale.value == 2:
             self.mc.stwx(value_loc.value, base_loc.value, scale_loc.value)
         elif scale.value == 1:
@@ -723,7 +744,10 @@
             scale_loc = r.SCRATCH
 
         if scale.value == 3:
-            self.mc.ldx(res.value, base_loc.value, scale_loc.value)
+            if res.is_fp_reg():
+                self.mc.lfdx(res.value, base_loc.value, scale_loc.value)
+            else:
+                self.mc.ldx(res.value, base_loc.value, scale_loc.value)
         elif scale.value == 2:
             self.mc.lwzx(res.value, base_loc.value, scale_loc.value)
         elif scale.value == 1:


More information about the pypy-commit mailing list