[pypy-commit] pypy ppc-jit-backend: (bivab, hager): port fixes to GUARD CLASS from ARM backend
hager
noreply at buildbot.pypy.org
Thu Mar 1 13:08:46 CET 2012
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53046:921d7eb791cc
Date: 2012-03-01 03:55 -0800
http://bitbucket.org/pypy/pypy/changeset/921d7eb791cc/
Log: (bivab, hager): port fixes to GUARD CLASS from ARM backend
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
@@ -241,32 +241,31 @@
emit_guard_nonnull = emit_guard_true
emit_guard_isnull = emit_guard_false
- def _cmp_guard_class(self, op, locs, regalloc):
- offset = locs[2]
- if offset is not None:
- with scratch_reg(self.mc):
- if offset.is_imm():
- self.mc.load(r.SCRATCH.value, locs[0].value, offset.value)
- else:
- assert offset.is_reg()
- self.mc.loadx(r.SCRATCH.value, locs[0].value, offset.value)
- self.mc.cmp_op(0, r.SCRATCH.value, locs[1].value)
- else:
- assert 0, "not implemented yet"
- self._emit_guard(op, locs[3:], c.NE)
-
def emit_guard_class(self, op, arglocs, regalloc):
self._cmp_guard_class(op, arglocs, regalloc)
self._emit_guard(op, arglocs[3:], c.NE, save_exc=False)
def emit_guard_nonnull_class(self, op, arglocs, regalloc):
- offset = self.cpu.vtable_offset
- self.mc.cmp_op(0, arglocs[0].value, 0, imm=True)
+ self.mc.cmp_op(0, arglocs[0].value, 1, imm=True, signed=False)
+ patch_pos = self.mc.currpos()
+ self.mc.nop()
+ self._cmp_guard_class(op, arglocs, regalloc)
+ pmc = OverwritingBuilder(self.mc, patch_pos, 1)
+ pmc.bc(12, 0, self.mc.currpos() - patch_pos)
+ pmc.overwrite()
+ self._emit_guard(op, arglocs[3:], c.NE, save_exc=False)
+
+ def _cmp_guard_class(self, op, locs, regalloc):
+ offset = locs[2]
if offset is not None:
- self._emit_guard(op, arglocs[3:], c.EQ)
+ #self.mc.LDR_ri(r.ip.value, locs[0].value, offset.value, cond=fcond)
+ #self.mc.CMP_rr(r.ip.value, locs[1].value, cond=fcond)
+ with scratch_reg(self.mc):
+ self.mc.load(r.SCRATCH.value, locs[0].value, offset.value)
+ self.mc.cmp_op(0, r.SCRATCH.value, locs[1].value)
else:
raise NotImplementedError
- self._cmp_guard_class(op, arglocs, regalloc)
+ # XXX port from x86 backend once gc support is in place
def emit_guard_not_invalidated(self, op, locs, regalloc):
return self._emit_guard(op, locs, c.EQ, is_guard_not_invalidated=True)
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
@@ -456,14 +456,18 @@
def prepare_guard_class(self, op):
assert isinstance(op.getarg(0), Box)
boxes = op.getarglist()
+
x = self._ensure_value_is_boxed(boxes[0], boxes)
- y = self.get_scratch_reg(REF, forbidden_vars=boxes)
+ y = self.get_scratch_reg(INT, forbidden_vars=boxes)
y_val = rffi.cast(lltype.Signed, op.getarg(1).getint())
self.assembler.load(y, imm(y_val))
+
offset = self.cpu.vtable_offset
assert offset is not None
- offset_loc = self._ensure_value_is_boxed(ConstInt(offset), boxes)
+ assert _check_imm_arg(offset)
+ offset_loc = imm(offset)
arglocs = self._prepare_guard(op, [x, y, offset_loc])
+
return arglocs
prepare_guard_nonnull_class = prepare_guard_class
More information about the pypy-commit
mailing list