Author: David Schneider <[email protected]>
Branch: arm-backend-2
Changeset: r51547:95557903da83
Date: 2012-01-20 17:11 +0100
http://bitbucket.org/pypy/pypy/changeset/95557903da83/
Log: (arigo, bivab) implement the BLX ARM instruction to branch to an
address stored in a register
diff --git a/pypy/jit/backend/arm/codebuilder.py
b/pypy/jit/backend/arm/codebuilder.py
--- a/pypy/jit/backend/arm/codebuilder.py
+++ b/pypy/jit/backend/arm/codebuilder.py
@@ -178,14 +178,11 @@
def BL(self, addr, c=cond.AL):
target = rffi.cast(rffi.INT, addr)
- if c == cond.AL:
- self.ADD_ri(reg.lr.value, reg.pc.value, arch.PC_OFFSET / 2)
- self.LDR_ri(reg.pc.value, reg.pc.value, imm=-arch.PC_OFFSET / 2)
- self.write32(target)
- else:
- self.gen_load_int(reg.ip.value, target, cond=c)
- self.MOV_rr(reg.lr.value, reg.pc.value, cond=c)
- self.MOV_rr(reg.pc.value, reg.ip.value, cond=c)
+ self.gen_load_int(reg.ip.value, target, cond=c)
+ self.BLX(reg.ip.value)
+
+ def BLX(self, reg, c=cond.AL):
+ self.write32(c << 28 | 0x12FFF3 << 4 | (reg & 0xF))
def MOVT_ri(self, rd, imm16, c=cond.AL):
"""Move Top writes an immediate value to the top halfword of the
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit