[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