[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