[pypy-svn] pypy arm-backend-2: Support offsets larger than imm values for guard class
bivab
commits-noreply at bitbucket.org
Thu Dec 23 11:23:24 CET 2010
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r40203:56a2640cd5c7
Date: 2010-12-23 11:14 +0100
http://bitbucket.org/pypy/pypy/changeset/56a2640cd5c7/
Log: Support offsets larger than imm values for guard class
diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -203,15 +203,21 @@
return fcond
def _cmp_guard_class(self, op, locs, regalloc, fcond):
- offset = self.cpu.vtable_offset
+ offset = locs[2]
if offset is not None:
- assert offset == 0
- self.mc.LDR_ri(r.ip.value, locs[0].value, offset)
+ if offset.is_imm():
+ self.mc.LDR_ri(r.ip.value, locs[0].value, offset.value)
+ else:
+ assert offset.is_reg()
+ self.mc.LDR_rr(r.ip.value, locs[0].value, offset.value)
self.mc.CMP_rr(r.ip.value, locs[1].value)
else:
raise NotImplementedError
# XXX port from x86 backend once gc support is in place
+ return self._emit_guard(op, locs[3:], c.EQ)
+
+
return self._emit_guard(op, locs[2:], c.EQ)
diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -364,10 +364,15 @@
y_val = rffi.cast(lltype.Signed, op.getarg(1).getint())
self.assembler.load(y, imm(y_val))
- arglocs = self._prepare_guard(op, [x, y])
+ offset = self.cpu.vtable_offset
+ offset_loc, offset_box = self._ensure_value_is_boxed(ConstInt(offset), boxes)
+ boxes.append(offset_box)
+ arglocs = self._prepare_guard(op, [x, y, offset_loc])
self.possibly_free_vars(boxes)
+
return arglocs
+
def prepare_op_jump(self, op, fcond):
descr = op.getdescr()
assert isinstance(descr, LoopToken)
More information about the Pypy-commit
mailing list