Author: David Schneider <[email protected]>
Branch: 
Changeset: r62734:38a8292de86c
Date: 2013-03-25 10:21 +0100
http://bitbucket.org/pypy/pypy/changeset/38a8292de86c/

Log:    recover armv6 compatible gen_load_int for hg history

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -733,8 +733,8 @@
         mc.LDR_ri(r.ip.value, r.fp.value, imm=ofs)
         stack_check_cmp_ofs = mc.currpos()
         if expected_size == -1:
-            mc.NOP()
-            mc.NOP()
+            for _ in range(mc.max_size_of_gen_load_int):
+                mc.NOP()
         else:
             mc.gen_load_int(r.lr.value, expected_size)
         mc.CMP_rr(r.ip.value, r.lr.value)
diff --git a/rpython/jit/backend/arm/codebuilder.py 
b/rpython/jit/backend/arm/codebuilder.py
--- a/rpython/jit/backend/arm/codebuilder.py
+++ b/rpython/jit/backend/arm/codebuilder.py
@@ -248,16 +248,33 @@
     def gen_load_int(self, r, value, cond=cond.AL):
         """r is the register number, value is the value to be loaded to the
         register"""
-        if value > 0xFF and self.is_armv6:
-            val = self.datablockwrapper.malloc_aligned(WORD)
-            import pdb
-            pdb.set_trace()
-        bottom = value & 0xFFFF
-        top = value >> 16
-        self.MOVW_ri(r, bottom, cond)
-        if top:
-            self.MOVT_ri(r, top, cond)
-    size_of_gen_load_int = 2 * WORD
+        if self.is_armv6:
+            from pypy.jit.backend.arm.conditions import AL
+            if cond != AL or 0 <= value <= 0xFFFF:
+                self._load_by_shifting(r, value, cond)
+            else:
+                self.LDR_ri(r, reg.pc.value)
+                self.MOV_rr(reg.pc.value, reg.pc.value)
+                self.write32(value)
+        else:
+            bottom = value & 0xFFFF
+            top = value >> 16
+            self.MOVW_ri(r, bottom, cond)
+            if top:
+                self.MOVT_ri(r, top, cond)
+
+    max_size_of_gen_load_int = 2 * WORD
+    ofs_shift = zip(range(8, 25, 8), range(12, 0, -4))
+    def _load_by_shifting(self, r, value, c=cond.AL):
+        # to be sure it is only called for the correct cases
+        assert c != cond.AL or 0 <= value <= 0xFFFF
+        self.MOV_ri(r, (value & 0xFF), cond=c)
+        for offset, shift in self.ofs_shift:
+            b = (value >> offset) & 0xFF
+            if b == 0:
+                continue
+            t = b | (shift << 8)
+            self.ORR_ri(r, r, imm=t, cond=c)
 
 
 class OverwritingBuilder(AbstractARMv7Builder):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to