[x264-devel] [PATCH] checkasm: arm: Use a macro to share code between the neon/noneon versions

Martin Storsjö martin at martin.st
Sat Aug 29 22:29:41 CEST 2015


---
This can be squashed into the earlier "checkasm: arm: Check register
clobbering" if you want to.
---
 tools/checkasm-arm.S |   76 ++++++++++++--------------------------------------
 1 file changed, 18 insertions(+), 58 deletions(-)

diff --git a/tools/checkasm-arm.S b/tools/checkasm-arm.S
index 93c96d9..60c0e50 100644
--- a/tools/checkasm-arm.S
+++ b/tools/checkasm-arm.S
@@ -46,14 +46,20 @@ error_message:
 #define MAX_ARGS 15
 
 #define ARG_STACK 4*(MAX_ARGS - 2)
-#define PUSHED 16*4 + 4*10
 
-function x264_checkasm_call_neon
+.macro clobbercheck name, neon
+.equ pushed, 4*10
+function \name
     push        {r4-r11, lr}
+.if \neon
     vpush       {q4-q7}
+.equ pushed, pushed + 16*4
+.endif
 
     movrel      r12, register_init
+.if \neon
     vldm        r12, {q4-q7}
+.endif
     ldm         r12, {r4-r11}
 
     push        {r1}
@@ -61,7 +67,7 @@ function x264_checkasm_call_neon
     sub         sp,  sp,  #ARG_STACK
 .equ pos, 0
 .rept MAX_ARGS-2
-    ldr         r12, [sp, #ARG_STACK + PUSHED + 8 + pos]
+    ldr         r12, [sp, #ARG_STACK + pushed + 8 + pos]
     str         r12, [sp, #pos]
 .equ pos, pos + 4
 .endr
@@ -69,13 +75,14 @@ function x264_checkasm_call_neon
     mov         r12, r0
     mov         r0,  r2
     mov         r1,  r3
-    ldrd        r2,  r3,  [sp, #ARG_STACK + PUSHED]
+    ldrd        r2,  r3,  [sp, #ARG_STACK + pushed]
     blx         r12
     add         sp,  sp,  #ARG_STACK
     pop         {r2}
 
     push        {r0, r1}
     movrel      r12, register_init
+.if \neon
     vldm        r12, {q0-q3}
     veor        q0,  q0,  q4
     veor        q1,  q1,  q5
@@ -88,6 +95,9 @@ function x264_checkasm_call_neon
     vrev64.32   d1,  d0
     vorr        d0,  d0,  d1
     vmov.32     r3,  d0[0]
+.else
+    mov         r3,  #0
+.endif
 
 .macro check_reg reg1, reg2
     ldrd        r0,  r1,  [r12], #8
@@ -111,62 +121,12 @@ function x264_checkasm_call_neon
     bl          puts
 0:
     pop         {r0, r1}
+.if \neon
     vpop        {q4-q7}
+.endif
     pop         {r4-r11, pc}
 endfunc
-
-#undef PUSHED
-#define PUSHED 4*10
-
-function x264_checkasm_call_noneon
-    push        {r4-r11, lr}
-
-    movrel      r12, register_init
-    ldm         r12, {r4-r11}
-
-    push        {r1}
-
-    sub         sp,  sp,  #ARG_STACK
-.equ pos, 0
-.rept MAX_ARGS-2
-    ldr         r12, [sp, #ARG_STACK + PUSHED + 8 + pos]
-    str         r12, [sp, #pos]
-.equ pos, pos + 4
-.endr
-
-    mov         r12, r0
-    mov         r0,  r2
-    mov         r1,  r3
-    ldrd        r2,  r3,  [sp, #ARG_STACK + PUSHED]
-    blx         r12
-    add         sp,  sp,  #ARG_STACK
-    pop         {r2}
-
-    push        {r0, r1}
-    movrel      r12, register_init
-    mov         r3,  #0
-
-.macro check_reg reg1, reg2
-    ldrd        r0,  r1,  [r12], #8
-    eor         r0,  r0, \reg1
-    eor         r1,  r1, \reg2
-    orr         r3,  r3, r0
-    orr         r3,  r3, r1
 .endm
-    check_reg   r4,  r5
-    check_reg   r6,  r7
-    check_reg   r8,  r9
-    check_reg   r10, r11
-.purgem check_reg
-
-    cmp         r3,  #0
-    beq         0f
 
-    mov         r12, #0
-    str         r12, [r2]
-    movrel      r0, error_message
-    bl          puts
-0:
-    pop         {r0, r1}
-    pop         {r4-r11, pc}
-endfunc
+clobbercheck x264_checkasm_call_neon, 1
+clobbercheck x264_checkasm_call_noneon, 0
-- 
1.7.10.4



More information about the x264-devel mailing list