[pypy-svn] r78719 - in pypy/branch/arm-backend/pypy/jit/backend/arm: . test
david at codespeak.net
david at codespeak.net
Fri Nov 5 11:01:23 CET 2010
Author: david
Date: Fri Nov 5 11:01:20 2010
New Revision: 78719
Modified:
pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
pypy/branch/arm-backend/pypy/jit/backend/arm/codebuilder.py
pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_assembler.py
pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_instr_codebuilder.py
Log:
Implement POP instruction
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py Fri Nov 5 11:01:20 2010
@@ -108,7 +108,7 @@
self.mc.BL(rffi.cast(lltype.Signed, decode_registers_addr))
self.mc.MOV_rr(r.ip.value, r.r0.value)
- self.mc.LDM(r.sp.value, [reg.value for reg in r.all_regs], w=1) # XXX Replace with POP instr. someday
+ self.mc.POP([reg.value for reg in r.all_regs])
self.mc.MOV_rr(r.r0.value, r.ip.value)
self.gen_func_epilog()
@@ -169,7 +169,7 @@
epilog_size = 2*WORD
def gen_func_epilog(self,cond=c.AL):
self.mc.MOV_rr(r.sp.value, r.fp.value)
- self.mc.LDM(r.sp.value, [reg.value for reg in r.callee_restored_registers], cond=cond, w=1)
+ self.mc.POP([reg.value for reg in r.callee_restored_registers], cond=cond)
def gen_func_prolog(self):
self.mc.PUSH([reg.value for reg in r.callee_saved_registers])
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/codebuilder.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/codebuilder.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/codebuilder.py Fri Nov 5 11:01:20 2010
@@ -21,7 +21,7 @@
else:
self.PUSH(range(2, 4), cond=c)
self.BL(addr, cond=c, some_reg=reg.r2)
- self.LDM(reg.sp.value, range(2, 4), w=1, cond=c) # XXX Replace with POP instr. someday
+ self.POP(range(2,4), cond=c)
return f
class AbstractARMv7Builder(object):
@@ -40,10 +40,15 @@
raise NotImplentedError
def PUSH(self, regs, cond=cond.AL):
- assert reg.sp not in regs
+ assert reg.sp.value not in regs
instr = self._encode_reg_list(cond << 28 | 0x92D << 16, regs)
self.write32(instr)
+ def POP(self, regs, cond=cond.AL):
+ assert reg.lr.value not in regs
+ instr = self._encode_reg_list(cond << 28 | 0x8BD << 16, regs)
+ self.write32(instr)
+
def LDM(self, rn, regs, w=0, cond=cond.AL):
instr = cond << 28 | 0x89 << 20 | w << 21 | (rn & 0xFF) << 16
instr = self._encode_reg_list(instr, regs)
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py Fri Nov 5 11:01:20 2010
@@ -208,6 +208,7 @@
regalloc.possibly_free_var(reg)
adr = self.cpu.cast_adr_to_int(op.getarg(0).getint())
+ # XXX use PUSH here instead of spilling every reg for itself
regalloc.before_call()
reg_args = min(op.numargs()-1, 4)
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_assembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_assembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_assembler.py Fri Nov 5 11:01:20 2010
@@ -139,7 +139,7 @@
self.a.mc.PUSH(range(2, 12))
div_addr = rffi.cast(lltype.Signed, llhelper(arm_int_div_sign, arm_int_div))
self.a.mc.BL(div_addr, some_reg=r.r2)
- self.a.mc.LDM(r.sp.value, range(2, 12), w=1) # XXX Replace with POP instr. someday
+ self.a.mc.POP(range(2, 12))
self.a.gen_func_epilog()
assert run_asm(self.a) == 61
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_instr_codebuilder.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_instr_codebuilder.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_instr_codebuilder.py Fri Nov 5 11:01:20 2010
@@ -1,5 +1,6 @@
from pypy.jit.backend.arm import registers as r
from pypy.jit.backend.arm import codebuilder
+from pypy.jit.backend.arm import conditions
from pypy.jit.backend.arm import instructions
from pypy.jit.backend.arm.test.support import requires_arm_as
from gen import assemble
@@ -121,6 +122,30 @@
self.assert_equal('MCR P15, 0, r1, c7, c10, 0')
+ def test_push_eq_stmdb(self):
+ # XXX check other conditions in STMDB
+ self.cb.PUSH([reg.value for reg in r.caller_resp], cond=conditions.AL)
+ self.assert_equal('STMDB SP!, {r0, r1, r2, r3}')
+
+ def test_push(self):
+ self.cb.PUSH([reg.value for reg in r.caller_resp], cond=conditions.AL)
+ self.assert_equal('PUSH {r0, r1, r2, r3}')
+
+ def test_push_raises_sp(self):
+ assert py.test.raises(AssertionError, 'self.cb.PUSH([r.sp.value])')
+
+ def test_pop(self):
+ self.cb.POP([reg.value for reg in r.caller_resp], cond=conditions.AL)
+ self.assert_equal('POP {r0, r1, r2, r3}')
+
+ def test_pop_eq_ldm(self):
+ # XXX check other conditions in LDM
+ self.cb.POP([reg.value for reg in r.caller_resp], cond=conditions.AL)
+ self.assert_equal('LDM SP!, {r0, r1, r2, r3}')
+
+ def test_pop_raises_on_lr(self):
+ assert py.test.raises(AssertionError, 'self.cb.POP([r.lr.value])')
+
class TestInstrCodeBuilderForGeneratedInstr(ASMTest):
def setup_method(self, ffuu_method):
More information about the Pypy-commit
mailing list