Commit 71a04721 authored by Janne Grunau's avatar Janne Grunau

checkasm: arm: report the first clobbered register in checkasm_checked_call

parent a8fce24b
...@@ -33,8 +33,12 @@ const register_init, align=3 ...@@ -33,8 +33,12 @@ const register_init, align=3
.quad 0x249214109d5d1c88 .quad 0x249214109d5d1c88
endconst endconst
const error_message const error_message_fpscr
.asciz "failed to preserve register" .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 endconst
@ max number of args used by any asm function. @ max number of args used by any asm function.
...@@ -79,39 +83,42 @@ function checkasm_checked_call_\variant, export=1 ...@@ -79,39 +83,42 @@ function checkasm_checked_call_\variant, export=1
push {r0, r1} push {r0, r1}
movrel r12, register_init movrel r12, register_init
mov r3, #0
.ifc \variant, vfp .ifc \variant, vfp
.macro check_reg_vfp, dreg, inc=8 .macro check_reg_vfp, dreg, offset
ldrd r0, r1, [r12], #\inc vldr d0, [r12, #8 * (\offset)]
vmov r2, lr, \dreg veor d0, d0, \dreg
eor r0, r0, r2 vmov r2, r3, d0
eor r1, r1, lr orrs r2, r2, r3
orr r3, r3, r0 bne 4f
orr r3, r3, r1
.endm .endm
.irp n, 8, 9, 10, 11, 12, 13, 14 .irp n, 8, 9, 10, 11, 12, 13, 14, 15
check_reg_vfp d\n @ keep track of the checked double/SIMD register
mov r1, #\n
check_reg_vfp d\n, \n-8
.endr .endr
check_reg_vfp d15, -56
.purgem check_reg_vfp .purgem check_reg_vfp
fmrx r0, FPSCR fmrx r0, FPSCR
ldr r1, [sp, #8] ldr r3, [sp, #8]
eor r0, r0, r1 eor r0, r0, r3
@ Ignore changes in the topmost 5 bits @ Ignore changes in the topmost 5 bits
lsl r0, r0, #5 lsls r0, r0, #5
orr r3, r3, r0 bne 3f
.endif .endif
@ keep track of the checked GPR
mov r1, #4
.macro check_reg reg1, reg2= .macro check_reg reg1, reg2=
ldrd r0, r1, [r12], #8 ldrd r2, r3, [r12], #8
eor r0, r0, \reg1 eors r2, r2, \reg1
orrs r3, r3, r0 bne 2f
add r1, r1, #1
.ifnb \reg2 .ifnb \reg2
eor r1, r1, \reg2 eors r3, r3, \reg2
orrs r3, r3, r1 bne 2f
.endif .endif
add r1, r1, #1
.endm .endm
check_reg r4, r5 check_reg r4, r5
check_reg r6, r7 check_reg r6, r7
...@@ -124,9 +131,16 @@ function checkasm_checked_call_\variant, export=1 ...@@ -124,9 +131,16 @@ function checkasm_checked_call_\variant, export=1
check_reg r10, r11 check_reg r10, r11
.purgem check_reg .purgem check_reg
beq 0f b 0f
4:
movrel r0, error_message 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) blx X(checkasm_fail_func)
0: 0:
pop {r0, r1} pop {r0, r1}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment