[pypy-commit] pypy guard-compatible: Fix, untranslated tests pass
arigo
pypy.commits at gmail.com
Wed May 25 11:03:32 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: guard-compatible
Changeset: r84686:7a95f8b11984
Date: 2016-05-25 17:02 +0200
http://bitbucket.org/pypy/pypy/changeset/7a95f8b11984/
Log: Fix, untranslated tests pass
diff --git a/rpython/jit/backend/arm/guard_compat.py b/rpython/jit/backend/arm/guard_compat.py
--- a/rpython/jit/backend/arm/guard_compat.py
+++ b/rpython/jit/backend/arm/guard_compat.py
@@ -1,6 +1,8 @@
from rpython.rtyper.annlowlevel import llhelper
from rpython.jit.backend.arm import conditions as c
from rpython.jit.backend.arm import registers as r
+from rpython.jit.backend.arm.arch import WORD
+from rpython.jit.backend.arm.codebuilder import InstrBuilder, OverwritingBuilder
from rpython.jit.backend.llsupport.guard_compat import *
from rpython.jit.backend.llsupport.guard_compat import _real_number
@@ -16,9 +18,11 @@
# pushed on the stack as well (the same values as the one passed
# in).
- mc = PPCBuilder()
+ mc = InstrBuilder(assembler.cpu.cpuinfo.arch_version)
r0 = r.r0
r1 = r.r1
+ r2 = r.r2
+ r3 = r.r3
lr = r.lr
ip = r.ip
@@ -39,36 +43,34 @@
mc.ADD_ri(lr.value, lr.value, WORD) # ADD lr, lr, 4
left_label = mc.get_relative_pos()
mc.LSR_ri(r0.value, r0.value, 1) # LSR r0, r0, 1
- mc.SUBS_ri(r0.value, r0.value, 4) # SUBS r0, r0, 4
+ mc.SUBS_ri(r0.value, r0.value, 2) # SUBS r0, r0, 2
beq_location = mc.get_relative_pos()
- mc.trap() # BEQ not_found
+ mc.BKPT() # BEQ not_found
# loop:
pmc = OverwritingBuilder(mc, b_location, WORD)
pmc.B_offs(mc.currpos(), c.AL)
mc.LDR_rr(ip.value, lr.value, r0.value)# LDR ip, [lr + r0]
mc.CMP_rr(r1.value, ip.value) # CMP r1, ip
- mc.B_offs(right_label - mc.currpos(), c.GT) # BGT right_label
- mc.B_offs(left_label - mc.currpos(), c.NE) # BNE left_label
+ mc.B_offs(right_label, c.GT) # BGT right_label
+ mc.B_offs(left_label, c.NE) # BNE left_label
# found:
mc.ADD_rr(ip.value, lr.value, r0.value)# ADD ip, lr, r0
+ mc.LDR_ri(lr.value, r.sp.value, 2*WORD)# LDR lr, [sp + 8]
mc.LDR_ri(ip.value, ip.value, WORD) # LDR ip, [ip + 4]
- mc.POP([lr.value]) # POP {lr}
+ ofs = _real_number(BCMOSTRECENT)
+ mc.STR_ri(r1.value, lr.value, ofs) # STR r1, [lr + bc_most_recent]
+ mc.STR_ri(ip.value, lr.value, ofs+WORD)# STR ip, [lr + bc_most_recent + 4]
- ofs = _real_number(BCMOSTRECENT)
- mc.STR(r1.value, lr.value, ofs) # STR r1, [lr + bc_most_recent]
- mc.STR(ip.value, lr.value, ofs + WORD) # STR ip, [lr + bc_most_recent + 4]
-
- mc.POP([r0.value, r1.value]) # POP {r0, r1}
+ mc.POP([r0.value, r1.value, lr.value]) # POP {r0, r1, lr}
mc.BX(ip.value) # BX ip
# ----------
- # not_found:
- pmc = OverwritingBuilder(mc, beq_location, 1)
- pmc.B(mc.currpos() - beq_location, cond.EQ) # jump here if r0 is now 0
- pmc.overwrite()
+ # not_found:
+ pmc = OverwritingBuilder(mc, beq_location, WORD)
+ pmc.B_offs(mc.currpos(), c.EQ) # jump here if r0 is now 0
# save all registers to the jitframe, expect r0 and r1
assembler._push_all_regs_to_jitframe(mc, [r0, r1], withfloats=True)
@@ -108,15 +110,16 @@
assembler.guard_compat_search_tree = mc.materialize(assembler.cpu, [])
- print hex(assembler.guard_compat_search_tree)
- raw_input('press enter...')
+ #print hex(assembler.guard_compat_search_tree)
+ #raw_input('press enter...')
def generate_guard_compatible(assembler, guard_token, l0, bindex):
mc = assembler.mc
+ r0 = r.r0
+ r1 = r.r1
ip = r.ip
lr = r.lr
- r4 = r.r4
assembler.load_from_gc_table(lr.value, bindex) # LDR lr, [gctbl at bindex]
@@ -126,11 +129,12 @@
mc.LDR_ri(ip.value, lr.value, # LDR.EQ ip, [lr + most_recent + 8]
ofs + WORD, cond=c.EQ)
- mc.BR(ip.value, cond=c.EQ) # BR.EQ ip
+ mc.BX(ip.value, c=c.EQ) # BX.EQ ip
mc.PUSH([r0.value, r1.value, lr.value]) # PUSH {r0, r1, lr}
- mc.MOV_rr(r1.value, l0.value) # MOV r1, l0
- mc.BL(assembler.guard_compat_search_tree) # MOVW/MOVT ip, BLX ip
+ if l0 is not r1:
+ mc.MOV_rr(r1.value, l0.value) # MOV r1, l0
+ mc.B(assembler.guard_compat_search_tree) # MOVW/MOVT ip, BX ip
# abuse this field to store the 'sequel' relative offset
guard_token.pos_jump_offset = mc.get_relative_pos()
diff --git a/rpython/jit/backend/arm/instructions.py b/rpython/jit/backend/arm/instructions.py
--- a/rpython/jit/backend/arm/instructions.py
+++ b/rpython/jit/backend/arm/instructions.py
@@ -76,6 +76,7 @@
'AND_ri': {'op': 0, 'result': True, 'base': True},
'EOR_ri': {'op': 0x2, 'result': True, 'base': True},
'SUB_ri': {'op': 0x4, 'result': True, 'base': True},
+ 'SUBS_ri':{'op': 0x5, 'result': True, 'base': True},
'RSB_ri': {'op': 0x6, 'result': True, 'base': True},
'ADD_ri': {'op': 0x8, 'result': True, 'base': True},
'ADC_ri': {'op': 0xA, 'result': True, 'base': True},
diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -248,6 +248,7 @@
bindex = op.getarg(1).getint()
token = self._emit_guard(op, arglocs[1:], is_guard_compatible=True)
guard_compat.generate_guard_compatible(self, token, l0, bindex)
+ return fcond
emit_op_guard_nonnull = emit_op_guard_true
emit_op_guard_isnull = emit_op_guard_false
More information about the pypy-commit
mailing list