[pypy-svn] r77656 - in pypy/branch/arm-backend/pypy/jit/backend/arm: . test

david at codespeak.net david at codespeak.net
Wed Oct 6 17:36:10 CEST 2010


Author: david
Date: Wed Oct  6 17:36:09 2010
New Revision: 77656

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/test/test_assembler.py
   pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_instr_codebuilder.py
Log:
Encoding for SUB instr

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	Wed Oct  6 17:36:09 2010
@@ -34,14 +34,14 @@
         self.mc.write32(0xe50b3010) #        str     r3, [fp, #-16]
         self.mc.write32(0xe51b3010) #        ldr     r3, [fp, #-16]
         #self.mc.write32(0xe1a00003) #        mov     r0, r3
-        self.mc.write32(0xe24bd00c) #        sub     sp, fp, #12     ; 0xc
+        self.mc.SUB_ri(r.sp, r.fp, 12)
         self.mc.write32(0xe89da800) #        ldm     sp, {fp, sp, pc}
 
     def gen_func_prolog(self):
         self.mc.MOV_rr(r.ip, r.sp)
         self.mc.PUSH([r.fp, r.ip, r.lr, r.pc])
-        self.mc.write32(0xe24cb004) # sub     fp, ip, #4      ; 0x4
-        self.mc.write32(0xe24dd008) #sub     sp, sp, #8      ; 0x8
+        self.mc.SUB_ri(r.fp, r.ip, 4)
+        self.mc.SUB_ri(r.sp, r.sp, 8)
         self.mc.write32(0xe50b0014) # str     r0, [fp, #-20]
 
     def gen_load_int(self, reg, value):

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	Wed Oct  6 17:36:09 2010
@@ -25,6 +25,16 @@
                         | (rn & 0xF) << 16
                         | (rt & 0xF) << 12
                         | (imm & 0xFFF))
+
+    def SUB_ri(self, rd, rn, imm=0, cond=cond.AL, s=0):
+        self.write32(cond << 28
+                        | 9 << 22
+                        | (s & 0x1) << 20
+                        | (rn & 0xF) << 16
+                        | (rd & 0xF) << 12
+                        | (imm & 0xFFF))
+
+
     def MOV_rr(self, rd, rm, cond=cond.AL, s=0):
         self.write32(cond << 28
                     | 0xD << 21

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	Wed Oct  6 17:36:09 2010
@@ -34,3 +34,10 @@
         self.a.mc.ORR_rr(r.r0, r.r1, r.r2, 4)
         self.a.gen_func_epilog()
         assert run_asm(self.a) == 0x88
+
+    def test_sub(self):
+        self.a.gen_func_prolog()
+        self.a.gen_load_int(r.r1, 123456)
+        self.a.mc.SUB_ri(r.r0, r.r1, 123)
+        self.a.gen_func_epilog()
+        assert run_asm(self.a) == 123333

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	Wed Oct  6 17:36:09 2010
@@ -69,6 +69,15 @@
         self.cb.PUSH([r.fp, r.ip, r.lr, r.pc])
         self.assert_equal('PUSH {fp, ip, lr, pc}')
 
+    def test_sub_ri(self):
+        self.cb.SUB_ri(r.r2, r.r4, 123)
+        self.assert_equal('SUB r2, r4, #123')
+
+    def test_sub_ri2(self):
+        py.test.skip('XXX check the actual largest value')
+        self.cb.SUB_ri(r.r3, r.r7, 0xFFF)
+        self.assert_equal('SUB r3, r7, #4095')
+
     def assert_equal(self, asm):
         assert self.cb.hexdump() == assemble(asm)
 



More information about the Pypy-commit mailing list