mirror of
https://code.videolan.org/videolan/dav1d
synced 2026-06-11 04:03:05 +00:00
Support older ARM versions with checkasm
This commit is contained in:
committed by
Martin Storsjö
co-authored by
Martin Storsjö
parent
8d9b1e26b3
commit
8e993f4d0b
+21
-4
@@ -32,17 +32,34 @@
|
||||
#include "config.h"
|
||||
#include "src/arm/asm.S"
|
||||
|
||||
.macro v4bx rd
|
||||
#if __ARM_ARCH >= 5 || defined(__ARM_ARCH_4T__)
|
||||
bx \rd
|
||||
#else
|
||||
mov pc, \rd
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro v4blx rd
|
||||
#if __ARM_ARCH >= 5
|
||||
blx \rd
|
||||
#else
|
||||
mov lr, pc
|
||||
v4bx \rd
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro movrel_local rd, val, offset=0
|
||||
#if defined(PIC)
|
||||
#if (__ARM_ARCH >= 7 || defined(__ARM_ARCH_6T2__)) && !defined(PIC)
|
||||
movw \rd, #:lower16:\val+\offset
|
||||
movt \rd, #:upper16:\val+\offset
|
||||
#else
|
||||
ldr \rd, 90001f
|
||||
b 90002f
|
||||
90001:
|
||||
.word \val + \offset - (90002f + 8 - 4 * CONFIG_THUMB)
|
||||
90002:
|
||||
add \rd, \rd, pc
|
||||
#else
|
||||
movw \rd, #:lower16:\val+\offset
|
||||
movt \rd, #:upper16:\val+\offset
|
||||
#endif
|
||||
.endm
|
||||
|
||||
|
||||
@@ -101,9 +101,10 @@ function checked_call_\variant, export=1
|
||||
mov r12, r0
|
||||
mov r0, r2
|
||||
mov r1, r3
|
||||
ldrd r2, r3, [sp, #ARG_STACK_A + pushed]
|
||||
ldr r2, [sp, #ARG_STACK_A + pushed]
|
||||
ldr r3, [sp, #ARG_STACK_A + pushed + 4]
|
||||
@ Call the target function
|
||||
blx r12
|
||||
v4blx r12
|
||||
|
||||
@ Load the number of stack parameters, stack canary and its reference
|
||||
ldr r12, [sp, #ARG_STACK_A + pushed + 8 + 4*(MAX_ARGS-4)]
|
||||
@@ -120,7 +121,8 @@ function checked_call_\variant, export=1
|
||||
movrel r12, register_init
|
||||
.ifc \variant, vfp
|
||||
.macro check_reg_vfp, dreg, offset
|
||||
ldrd r2, r3, [r12, #8 * (\offset)]
|
||||
ldr r2, [r12, #(8 * (\offset))]
|
||||
ldr r3, [r12, #(8 * (\offset)) + 4]
|
||||
vmov r0, lr, \dreg
|
||||
eor r2, r2, r0
|
||||
eor r3, r3, lr
|
||||
@@ -148,7 +150,8 @@ function checked_call_\variant, export=1
|
||||
@ keep track of the checked GPR
|
||||
mov r1, #4
|
||||
.macro check_reg reg1, reg2=
|
||||
ldrd r2, r3, [r12], #8
|
||||
ldr r2, [r12], #4
|
||||
ldr r3, [r12], #4
|
||||
eors r2, r2, \reg1
|
||||
bne 2f
|
||||
add r1, r1, #1
|
||||
@@ -198,4 +201,5 @@ function checked_call_\variant, export=1
|
||||
endfunc
|
||||
.endm
|
||||
|
||||
clobbercheck novfp
|
||||
clobbercheck vfp
|
||||
|
||||
@@ -836,6 +836,14 @@ int main(int argc, char *argv[]) {
|
||||
state.simd_warmup = checkasm_warmup_avx2;
|
||||
checkasm_simd_warmup();
|
||||
#endif
|
||||
#if ARCH_ARM
|
||||
void checkasm_checked_call_vfp(void *func, int dummy, ...);
|
||||
void checkasm_checked_call_novfp(void *func, int dummy, ...);
|
||||
if (cpu_flags & DAV1D_ARM_CPU_FLAG_NEON)
|
||||
checkasm_checked_call_ptr = checkasm_checked_call_vfp;
|
||||
else
|
||||
checkasm_checked_call_ptr = checkasm_checked_call_novfp;
|
||||
#endif
|
||||
#if ARCH_X86
|
||||
unsigned checkasm_init_x86(char *name);
|
||||
char name[48];
|
||||
@@ -1130,3 +1138,7 @@ void checkasm_simd_warmup(void)
|
||||
state.simd_warmup();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ARCH_ARM
|
||||
void (*checkasm_checked_call_ptr)(void *func, int dummy, ...);
|
||||
#endif
|
||||
|
||||
@@ -302,12 +302,12 @@ void checkasm_simd_warmup(void);
|
||||
/* Use a dummy argument, to offset the real parameters by 2, not only 1.
|
||||
* This makes sure that potential 8-byte-alignment of parameters is kept
|
||||
* the same even when the extra parameters have been removed. */
|
||||
void checkasm_checked_call_vfp(void *func, int dummy, ...);
|
||||
extern void (*checkasm_checked_call_ptr)(void *func, int dummy, ...);
|
||||
#define declare_new(ret, ...)\
|
||||
ret (*checked_call)(void *, int dummy, __VA_ARGS__,\
|
||||
int, int, int, int, int, int, int, int,\
|
||||
int, int, int, int, int, int, int) =\
|
||||
(void *)checkasm_checked_call_vfp;
|
||||
(void *)checkasm_checked_call_ptr;
|
||||
#define call_new(...)\
|
||||
(checkasm_set_signal_handler_state(1),\
|
||||
checked_call(func_new, 0, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0));\
|
||||
|
||||
Reference in New Issue
Block a user