Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r48422:ef1c13357210
Date: 2011-10-25 11:25 +0200
http://bitbucket.org/pypy/pypy/changeset/ef1c13357210/
Log: Implemented UNICODEGETITEM, UNICODESETITEM, UNICODELEN.
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
@@ -398,5 +398,40 @@
self.mc.load_imm(r.r0, basesize.value)
self.mc.stbx(value_loc.value, base_loc.value, r.r0.value)
+ emit_unicodelen = emit_strlen
+
+ # XXX 64 bit adjustment
+ def emit_unicodegetitem(self, op, arglocs, regalloc):
+ res, base_loc, ofs_loc, scale, basesize, itemsize = arglocs
+
+ # XXX arrrrgh, why does PPC not have an SLWI instruction ?
+ self.mc.li(r.r0.value, scale.value)
+ self.mc.slw(ofs_loc.value, ofs_loc.value, r.r0.value)
+ self.mc.add(res.value, base_loc.value, ofs_loc.value)
+ self.mc.li(r.r0.value, basesize.value)
+
+ if scale.value == 2:
+ self.mc.lwzx(res.value, res.value, r.r0.value)
+ elif scale.value == 1:
+ self.mc.lhzx(res.value, res.value, r.r0.value)
+ 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
+
+ self.mc.li(r.r0.value, scale.value)
+ self.mc.slw(ofs_loc.value, ofs_loc.value, r.r0.value)
+ self.mc.add(base_loc.value, base_loc.value, ofs_loc.value)
+ self.mc.li(r.r0.value, basesize.value)
+
+ if scale.value == 2:
+ self.mc.stwx(value_loc.value, base_loc.value, r.r0.value)
+ elif scale.value == 1:
+ self.mc.sthx(value_loc.value, base_loc.value, r.r0.value)
+ else:
+ assert 0, itemsize.value
+
def nop(self):
self.mc.ori(0, 0, 0)
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
@@ -475,6 +475,57 @@
assert itemsize == 1
return [value_loc, base_loc, ofs_loc, imm(basesize)]
+ def prepare_unicodelen(self, op):
+ l0, box = self._ensure_value_is_boxed(op.getarg(0))
+ boxes = [box]
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ ofs_box = ConstInt(ofs_length)
+ imm_ofs = _check_imm_arg(ofs_box)
+
+ if imm_ofs:
+ l1 = imm(ofs_length)
+ else:
+ l1, box1 = self._ensure_value_is_boxed(ofs_box, boxes)
+ boxes.append(box1)
+
+ self.possibly_free_vars(boxes)
+ res = self.force_allocate_reg(op.result)
+ self.possibly_free_var(op.result)
+ return [l0, l1, res]
+
+ def prepare_unicodegetitem(self, op):
+ boxes = list(op.getarglist())
+ base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes)
+ boxes.append(box)
+ ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes)
+ boxes.append(box)
+ self.possibly_free_vars(boxes)
+
+ res = self.force_allocate_reg(op.result)
+ self.possibly_free_var(op.result)
+
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ scale = itemsize/2
+ return [res, base_loc, ofs_loc, imm(scale), imm(basesize),
imm(itemsize)]
+
+ def prepare_unicodesetitem(self, op):
+ boxes = list(op.getarglist())
+ base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes)
+ boxes.append(box)
+ ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes)
+ boxes.append(box)
+ value_loc, box = self._ensure_value_is_boxed(boxes[2], boxes)
+ boxes.append(box)
+
+ self.possibly_free_vars(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, imm(scale), imm(basesize),
imm(itemsize)]
+
# from ../x86/regalloc.py:791
def _unpack_fielddescr(self, fielddescr):
assert isinstance(fielddescr, BaseFieldDescr)
diff --git a/pypy/jit/backend/test/runner_test.py
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -1056,6 +1056,9 @@
r = self.execute_operation(rop.UNICODEGETITEM, [u_box, BoxInt(5)],
'int')
assert r.value == 0x1234
+ r = self.execute_operation(rop.UNICODEGETITEM, [u_box, BoxInt(4)],
+ 'int')
+ assert r.value == 0x6F # 0x6F = 'o'
r = self.execute_operation(rop.UNICODESETITEM, [u_box, BoxInt(4),
BoxInt(31313)], 'void')
assert r is None
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit