[pypy-commit] pypy ppc-jit-backend: Define getarrayitem_raw, getfield_raw, etc. Sign extend getfield result.

edelsohn noreply at buildbot.pypy.org
Mon Nov 14 00:08:14 CET 2011


Author: edelsohn
Branch: ppc-jit-backend
Changeset: r49384:3bebd83ccde0
Date: 2011-11-13 18:08 -0500
http://bitbucket.org/pypy/pypy/changeset/3bebd83ccde0/

Log:	Define getarrayitem_raw, getfield_raw, etc. Sign extend getfield
	result.

diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -312,6 +312,7 @@
                 self.mc.stbx(value_loc.value, base_loc.value, ofs.value)
         else:
             assert 0, "size not supported"
+
     emit_setfield_raw = emit_setfield_gc
 
     def emit_getfield_gc(self, op, arglocs, regalloc):
@@ -338,6 +339,14 @@
                 self.mc.lbzx(res.value, base_loc.value, ofs.value)
         else:
             assert 0, "size not supported"
+
+        #XXX Hack, Hack, Hack
+        if not we_are_translated():
+            descr = op.getdescr()
+            size =  descr.get_field_size(False)
+            signed = descr.is_field_signed()
+            self._ensure_result_bit_extension(res, size, signed)
+
     emit_getfield_raw = emit_getfield_gc
     emit_getfield_raw_pure = emit_getfield_gc
     emit_getfield_gc_pure = emit_getfield_gc
@@ -376,6 +385,8 @@
         else:
             assert 0, "scale %s not supported" % (scale.value)
 
+    emit_setarrayitem_raw = emit_setarrayitem_gc
+
     def emit_getarrayitem_gc(self, op, arglocs, regalloc):
         res, base_loc, ofs_loc, scale, ofs = arglocs
         if scale.value > 0:
@@ -409,6 +420,9 @@
             signed = descr.is_item_signed()
             self._ensure_result_bit_extension(res, size, signed)
 
+    emit_getarrayitem_raw = emit_getarrayitem_gc
+    emit_getarrayitem_gc_pure = emit_getarrayitem_gc
+
     def emit_strlen(self, op, arglocs, regalloc):
         l0, l1, res = arglocs
         if l1.is_imm():
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -449,6 +449,8 @@
         self.possibly_free_vars(boxes)
         return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)]
 
+        prepare_setarrayitem_raw = prepare_setarrayitem_gc
+
     def prepare_getarrayitem_gc(self, op):
         a0, a1 = boxes = list(op.getarglist())
         _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr())
@@ -462,6 +464,9 @@
         self.possibly_free_var(op.result)
         return [res, base_loc, ofs_loc, imm(scale), imm(ofs)]
 
+    prepare_getarrayitem_raw = prepare_getarrayitem_gc
+    prepare_getarrayitem_gc_pure = prepare_getarrayitem_gc
+
     def prepare_strlen(self, op):
         l0, box = self._ensure_value_is_boxed(op.getarg(0))
         boxes = [box]


More information about the pypy-commit mailing list