Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r52428:1dfbe17803ed
Date: 2012-02-13 18:34 +0100
http://bitbucket.org/pypy/pypy/changeset/1dfbe17803ed/

Log:    (bivab, hager): Fix bug in emit_unicodesetitem. Do not overwrite
        managed locations!

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
@@ -814,15 +814,16 @@
 
     emit_unicodelen = StrOpAssembler.emit_strlen
 
-    # XXX 64 bit adjustment
     def emit_unicodegetitem(self, op, arglocs, regalloc):
+        # res is used as a temporary location
+        # => it is save to use it before loading the result
         res, base_loc, ofs_loc, scale, basesize, itemsize = arglocs
 
         if IS_PPC_32:
-            self.mc.slwi(ofs_loc.value, ofs_loc.value, scale.value)
+            self.mc.slwi(res.value, ofs_loc.value, scale.value)
         else:
-            self.mc.sldi(ofs_loc.value, ofs_loc.value, scale.value)
-        self.mc.add(res.value, base_loc.value, ofs_loc.value)
+            self.mc.sldi(res.value, ofs_loc.value, scale.value)
+        self.mc.add(res.value, base_loc.value, res.value)
 
         if scale.value == 2:
             self.mc.lwz(res.value, res.value, basesize.value)
@@ -831,20 +832,19 @@
         else:
             assert 0, itemsize.value
 
-    # XXX 64 bit adjustment
     def emit_unicodesetitem(self, op, arglocs, regalloc):
-        value_loc, base_loc, ofs_loc, scale, basesize, itemsize = arglocs
+        value_loc, base_loc, ofs_loc, temp_loc, scale, basesize, itemsize = 
arglocs
 
         if IS_PPC_32:
-            self.mc.slwi(ofs_loc.value, ofs_loc.value, scale.value)
+            self.mc.slwi(temp_loc.value, ofs_loc.value, scale.value)
         else:
-            self.mc.sldi(ofs_loc.value, ofs_loc.value, scale.value)
-        self.mc.add(base_loc.value, base_loc.value, ofs_loc.value)
+            self.mc.sldi(temp_loc.value, ofs_loc.value, scale.value)
+        self.mc.add(temp_loc.value, base_loc.value, temp_loc.value)
 
         if scale.value == 2:
-            self.mc.stw(value_loc.value, base_loc.value, basesize.value)
+            self.mc.stw(value_loc.value, temp_loc.value, basesize.value)
         elif scale.value == 1:
-            self.mc.sth(value_loc.value, base_loc.value, basesize.value)
+            self.mc.sth(value_loc.value, temp_loc.value, basesize.value)
         else:
             assert 0, itemsize.value
 
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
@@ -747,10 +747,11 @@
         base_loc = self._ensure_value_is_boxed(boxes[0], boxes)
         ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes)
         value_loc = self._ensure_value_is_boxed(boxes[2], boxes)
+        temp_loc = self.get_scratch_reg(INT, boxes)
         basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
                                          self.cpu.translate_support_code)
         scale = itemsize / 2
-        return [value_loc, base_loc, ofs_loc,
+        return [value_loc, base_loc, ofs_loc, temp_loc,
             imm(scale), imm(basesize), imm(itemsize)]
 
     def prepare_same_as(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to