[pypy-commit] pypy ppc-jit-backend: (bivab, hager): Fix bug in emit_unicodesetitem. Do not overwrite managed locations!

hager noreply at buildbot.pypy.org
Mon Feb 13 18:38:54 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
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):


More information about the pypy-commit mailing list