示例#1
0
 def test_vstm_vldm_combined(self):
     n = 14
     source_container = lltype.malloc(lltype.Array(longlong.FLOATSTORAGE,
                                                   hints={'nolength':
                                                          True}),
                                      n,
                                      flavor='raw')
     target_container = lltype.malloc(lltype.Array(longlong.FLOATSTORAGE,
                                                   hints={'nolength':
                                                          True}),
                                      n,
                                      flavor='raw')
     for x in range(n):
         source_container[x] = longlong.getfloatstorage(
             float("%d.%d" % (x, x)))
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.ip.value,
                            rffi.cast(lltype.Signed, source_container))
     self.a.mc.VLDM(r.ip.value, [x for x in range(n)])
     self.a.mc.gen_load_int(r.ip.value,
                            rffi.cast(lltype.Signed, target_container))
     self.a.mc.VSTM(r.ip.value, [x for x in range(n)])
     self.a.gen_func_epilog()
     run_asm(self.a)
     for d in range(n):
         res = longlong.getrealfloat(target_container[0]) == float("%d.%d" %
                                                                   (d, d))
     lltype.free(source_container, flavor='raw')
     lltype.free(target_container, flavor='raw')
示例#2
0
 def test_stm(self):
     container = lltype.malloc(lltype.Array(lltype.Signed, hints={'nolength': True}), 10, flavor='raw')
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.ip.value, rffi.cast(lltype.Signed, container))
     for x in range(10):
         self.a.mc.gen_load_int(x, x)
     self.a.mc.STM(r.ip.value, [x for x in range(10)])
     self.a.gen_func_epilog()
     run_asm(self.a)
     for x in range(10):
         assert container[x] == x
     lltype.free(container, flavor='raw')
示例#3
0
 def test_DIV2(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, -110)
     self.a.mc.gen_load_int(r.r1.value, 3)
     self.a.mc.DIV()
     self.a.gen_func_epilog()
     assert run_asm(self.a) == -36
示例#4
0
 def test_or(self):
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r1.value, 8)
     self.a.mc.MOV_ri(r.r2.value, 8)
     self.a.mc.ORR_rr(r.r0.value, r.r1.value, r.r2.value, 4)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 0x88
示例#5
0
 def test_DIV(self):
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r0.value, 123)
     self.a.mc.MOV_ri(r.r1.value, 2)
     self.a.mc.DIV()
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 61
示例#6
0
 def test_call_python_func(self):
     functype = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
     call_addr = rffi.cast(lltype.Signed, llhelper(functype, callme))
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r0.value, 123)
     self.a.mc.BL(call_addr)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 133
示例#7
0
 def test_cmp(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r1.value, 22)
     self.a.mc.CMP_ri(r.r1.value, 123)
     self.a.mc.MOV_ri(r.r0.value, 1, c.LE)
     self.a.mc.MOV_ri(r.r0.value, 0, c.GT)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 1
示例#8
0
 def test_DIV3(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r8.value, 110)
     self.a.mc.gen_load_int(r.r9.value, -3)
     self.a.mc.MOV_rr(r.r0.value, r.r8.value)
     self.a.mc.MOV_rr(r.r1.value, r.r9.value)
     self.a.mc.DIV()
     self.a.gen_func_epilog()
     assert run_asm(self.a) == -36
示例#9
0
 def test_bl_with_conditional_exec(self):
     functype = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
     call_addr = rffi.cast(lltype.Signed, llhelper(functype, callme))
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r0.value, 123)
     self.a.mc.CMP_ri(r.r0.value, 1)
     self.a.mc.BL(call_addr, c.NE)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 133
示例#10
0
 def test_jump(self):
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r1.value, 1)
     loop_head = self.a.mc.currpos()
     self.a.mc.ADD_ri(r.r1.value, r.r1.value, 1)
     self.a.mc.CMP_ri(r.r1.value, 9)
     self.a.mc.B_offs(loop_head, c.NE)
     self.a.mc.MOV_rr(r.r0.value, r.r1.value)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 9
示例#11
0
 def test_vstm_vldm_combined(self):
     n = 14
     source_container = lltype.malloc(lltype.Array(longlong.FLOATSTORAGE,
         hints={'nolength': True}), n, flavor='raw')
     target_container = lltype.malloc(lltype.Array(longlong.FLOATSTORAGE,
         hints={'nolength': True}), n, flavor='raw')
     for x in range(n):
         source_container[x] = longlong.getfloatstorage(float("%d.%d" % (x,x)))
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.ip.value, rffi.cast(lltype.Signed, source_container))
     self.a.mc.VLDM(r.ip.value, [x for x in range(n)])
     self.a.mc.gen_load_int(r.ip.value, rffi.cast(lltype.Signed, target_container))
     self.a.mc.VSTM(r.ip.value, [x for x in range(n)])
     self.a.gen_func_epilog()
     run_asm(self.a)
     for d in range(n):
         res = longlong.getrealfloat(target_container[0]) == float("%d.%d" % (d,d))
     lltype.free(source_container, flavor='raw')
     lltype.free(target_container, flavor='raw')
示例#12
0
 def test_simple_jump(self):
     self.a.gen_func_prolog()
     self.a.mc.MOV_ri(r.r1.value, 1)
     loop_head = self.a.mc.currpos()
     self.a.mc.CMP_ri(r.r1.value, 0)  # z=0, z=1
     self.a.mc.MOV_ri(r.r1.value, 0, cond=c.NE)
     self.a.mc.MOV_ri(r.r1.value, 7, cond=c.EQ)
     self.a.mc.B_offs(loop_head, c.NE)
     self.a.mc.MOV_rr(r.r0.value, r.r1.value)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 7
示例#13
0
 def test_load_store(self):
     x = 0x60002224
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r1.value, x)
     self.a.mc.SUB_ri(r.sp.value, r.sp.value, 8)
     self.a.mc.MOV_ri(r.r3.value, 8)
     self.a.mc.STR_rr(r.r1.value, r.sp.value, r.r3.value)
     self.a.mc.LDR_ri(r.r0.value, r.sp.value, 8)
     self.a.mc.ADD_ri(r.sp.value, r.sp.value, 8)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == x
示例#14
0
    def test_division(self):
        self.a.gen_func_prolog()
        self.a.mc.MOV_ri(r.r0.value, 123)
        self.a.mc.MOV_ri(r.r1.value, 2)

        # call to div
        self.a.mc.PUSH(range(2, 12))
        div_addr = rffi.cast(lltype.Signed, arm_int_div)
        self.a.mc.BL(div_addr)
        self.a.mc.POP(range(2, 12))
        self.a.gen_func_epilog()
        assert run_asm(self.a) == 61
示例#15
0
 def test_ldm(self):
     container = lltype.malloc(lltype.Array(lltype.Signed, hints={'nolength': True}), 10, flavor='raw')
     for x in range(10):
         container[x] = x
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.ip.value, rffi.cast(lltype.Signed, container))
     self.a.mc.LDM(r.ip.value, [x for x in range(10)])
     for x in range(1, 10):
         self.a.mc.ADD_rr(0, 0, x)
     self.a.gen_func_epilog()
     res = run_asm(self.a)
     assert res == sum(range(10))
     lltype.free(container, flavor='raw')
示例#16
0
 def test_vldm(self):
     n = 14
     container = lltype.malloc(lltype.Array(longlong.FLOATSTORAGE,
                             hints={'nolength': True}), n, flavor='raw')
     for x in range(n):
         container[x] = longlong.getfloatstorage(float("%d.%d" % (x,x)))
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.ip.value, rffi.cast(lltype.Signed, container))
     self.a.mc.VLDM(r.ip.value, [x for x in range(n)])
     for x in range(1, n):
         self.a.mc.VADD(0, 0, x)
     self.a.mc.VSTR(r.d0.value, r.ip.value)
     self.a.gen_func_epilog()
     res = run_asm(self.a)
     assert longlong.getrealfloat(container[0]) == sum([float("%d.%d" % (d,d)) for d in range(n)])
     lltype.free(container, flavor='raw')
示例#17
0
    def test_B_offs_reg(self):
        self.a.mc.PUSH([reg.value for reg in r.callee_saved_registers])
        self.a.mc.MOV_ri(r.r0.value, 0)
        self.a.mc.MOV_ri(r.r1.value, 0)
        self.a.mc.CMP_rr(r.r0.value, r.r1.value)
        pos = self.a.mc.currpos()
        self.a.mc.MOV_ri(r.r0.value, 123, cond=c.NE)

        for x in range(100):
            self.a.mc.POP(
                [reg.value for reg in r.callee_restored_registers], cond=c.NE)

        self.a.mc.MOV_ri(r.r1.value, 33)
        self.a.mc.MOV_ri(r.r0.value, 23)
        self.a.mc.CMP_rr(r.r0.value, r.r1.value)
        self.a.mc.B_offs(pos)
        assert run_asm(self.a) == 123
示例#18
0
 def test_sub(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r1.value, 123456)
     self.a.mc.SUB_ri(r.r0.value, r.r1.value, 123)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 123333
示例#19
0
 def test_mov_small_imm_loc_to_loc(self):
     self.a.gen_func_prolog()
     self.a.mov_loc_loc(imm(12), r.r0)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 12
示例#20
0
 def test_load_int2(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, 464)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 464
示例#21
0
 def test_load_neg_int_to_reg2(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, -3)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == -3
示例#22
0
 def test_load_int_to_reg(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, 0xFFFFFF85)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == -123
示例#23
0
 def test_load_medium_int_to_reg(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, 0xBBD7)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 48087
示例#24
0
 def test_load_small_int_to_reg(self):
     self.a.gen_func_prolog()
     self.a.mc.gen_load_int(r.r0.value, 123)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 123
示例#25
0
 def test_mov_large_imm_loc_to_loc(self):
     self.a.gen_func_prolog()
     self.a.mov_loc_loc(imm(2478), r.r0)
     self.a.gen_func_epilog()
     assert run_asm(self.a) == 2478