summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJanne Grunau <janne-libav@jannau.net>2016-07-14 23:16:14 +0200
committerJanne Grunau <janne-libav@jannau.net>2016-07-16 12:57:18 +0200
commit71a0472114574993df7035f4de9aa007e03817b8 (patch)
tree2765b34199daba585e5785fdd7af6a990efd1872 /tests
parenta8fce24b9c5a87187f5bd864b18f5b3e575f8c3d (diff)
checkasm: arm: report the first clobbered register in checkasm_checked_call
Diffstat (limited to 'tests')
-rw-r--r--tests/checkasm/arm/checkasm.S64
1 files changed, 39 insertions, 25 deletions
diff --git a/tests/checkasm/arm/checkasm.S b/tests/checkasm/arm/checkasm.S
index f004af3b90..989f613656 100644
--- a/tests/checkasm/arm/checkasm.S
+++ b/tests/checkasm/arm/checkasm.S
@@ -33,8 +33,12 @@ const register_init, align=3
.quad 0x249214109d5d1c88
endconst
-const error_message
- .asciz "failed to preserve register"
+const error_message_fpscr
+ .asciz "failed to preserve register FPSCR"
+const error_message_gpr
+ .asciz "failed to preserve register r%d"
+const error_message_vfp
+ .asciz "failed to preserve register d%d"
endconst
@ max number of args used by any asm function.
@@ -79,39 +83,42 @@ function checkasm_checked_call_\variant, export=1
push {r0, r1}
movrel r12, register_init
- mov r3, #0
.ifc \variant, vfp
-.macro check_reg_vfp, dreg, inc=8
- ldrd r0, r1, [r12], #\inc
- vmov r2, lr, \dreg
- eor r0, r0, r2
- eor r1, r1, lr
- orr r3, r3, r0
- orr r3, r3, r1
+.macro check_reg_vfp, dreg, offset
+ vldr d0, [r12, #8 * (\offset)]
+ veor d0, d0, \dreg
+ vmov r2, r3, d0
+ orrs r2, r2, r3
+ bne 4f
.endm
-.irp n, 8, 9, 10, 11, 12, 13, 14
- check_reg_vfp d\n
+.irp n, 8, 9, 10, 11, 12, 13, 14, 15
+ @ keep track of the checked double/SIMD register
+ mov r1, #\n
+ check_reg_vfp d\n, \n-8
.endr
- check_reg_vfp d15, -56
.purgem check_reg_vfp
fmrx r0, FPSCR
- ldr r1, [sp, #8]
- eor r0, r0, r1
+ ldr r3, [sp, #8]
+ eor r0, r0, r3
@ Ignore changes in the topmost 5 bits
- lsl r0, r0, #5
- orr r3, r3, r0
+ lsls r0, r0, #5
+ bne 3f
.endif
+ @ keep track of the checked GPR
+ mov r1, #4
.macro check_reg reg1, reg2=
- ldrd r0, r1, [r12], #8
- eor r0, r0, \reg1
- orrs r3, r3, r0
+ ldrd r2, r3, [r12], #8
+ eors r2, r2, \reg1
+ bne 2f
+ add r1, r1, #1
.ifnb \reg2
- eor r1, r1, \reg2
- orrs r3, r3, r1
+ eors r3, r3, \reg2
+ bne 2f
.endif
+ add r1, r1, #1
.endm
check_reg r4, r5
check_reg r6, r7
@@ -124,9 +131,16 @@ function checkasm_checked_call_\variant, export=1
check_reg r10, r11
.purgem check_reg
- beq 0f
-
- movrel r0, error_message
+ b 0f
+4:
+ movrel r0, error_message_vfp
+ b 1f
+3:
+ movrel r0, error_message_fpscr
+ b 1f
+2:
+ movrel r0, error_message_gpr
+1:
blx X(checkasm_fail_func)
0:
pop {r0, r1}