Merge commit 'f1b3e131385176c3c9d9783b25047856a0dcebf6'
[ffmpeg.git] / tests / checkasm / aarch64 / checkasm.S
1 /****************************************************************************
2  * Assembly testing and benchmarking tool
3  * Copyright (c) 2015 Martin Storsjo
4  * Copyright (c) 2015 Janne Grunau
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21  *****************************************************************************/
22
23 #include "libavutil/aarch64/asm.S"
24
25 const register_init
26     .quad 0x21f86d66c8ca00ce
27     .quad 0x75b6ba21077c48ad
28     .quad 0xed56bb2dcb3c7736
29     .quad 0x8bda43d3fd1a7e06
30     .quad 0xb64a9c9e5d318408
31     .quad 0xdf9a54b303f1d3a3
32     .quad 0x4a75479abd64e097
33     .quad 0x249214109d5d1c88
34     .quad 0x1a1b2550a612b48c
35     .quad 0x79445c159ce79064
36     .quad 0x2eed899d5a28ddcd
37     .quad 0x86b2536fcd8cf636
38     .quad 0xb0856806085e7943
39     .quad 0x3f2bf84fc0fcca4e
40     .quad 0xacbd382dcf5b8de2
41     .quad 0xd229e1f5b281303f
42     .quad 0x71aeaff20b095fd9
43     .quad 0xab63e2e11fa38ed9
44 endconst
45
46
47 const error_message
48     .asciz "failed to preserve register"
49 endconst
50
51
52 // max number of args used by any asm function.
53 #define MAX_ARGS 15
54
55 #define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15)
56
57 function checkasm_stack_clobber, export=1
58     mov         x29, sp
59     mov         x2,  #CLOBBER_STACK
60 1:
61     stp         x0,  x1,  [sp, #-16]!
62     subs        x2,  x2,  #16
63     b.gt        1b
64     mov         sp,  x29
65     ret
66 endfunc
67
68 #define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15)
69
70 function checkasm_checked_call, export=1
71     stp         x29, x30, [sp, #-16]!
72     mov         x29, sp
73     stp         x19, x20, [sp, #-16]!
74     stp         x21, x22, [sp, #-16]!
75     stp         x23, x24, [sp, #-16]!
76     stp         x25, x26, [sp, #-16]!
77     stp         x27, x28, [sp, #-16]!
78     stp         d8,  d9,  [sp, #-16]!
79     stp         d10, d11, [sp, #-16]!
80     stp         d12, d13, [sp, #-16]!
81     stp         d14, d15, [sp, #-16]!
82
83     movrel      x9, register_init
84     ldp         d8,  d9,  [x9], #16
85     ldp         d10, d11, [x9], #16
86     ldp         d12, d13, [x9], #16
87     ldp         d14, d15, [x9], #16
88     ldp         x19, x20, [x9], #16
89     ldp         x21, x22, [x9], #16
90     ldp         x23, x24, [x9], #16
91     ldp         x25, x26, [x9], #16
92     ldp         x27, x28, [x9], #16
93
94     sub         sp,  sp,  #ARG_STACK
95 .equ pos, 0
96 // the first stacked arg is copied to x7
97 .rept MAX_ARGS-8
98     ldr         x9, [x29, #16 + 8 + pos]
99     str         x9, [sp, #pos]
100 .equ pos, pos + 8
101 .endr
102
103     mov         x12, x0
104     mov         x0,  x1
105     mov         x1,  x2
106     mov         x2,  x3
107     mov         x3,  x4
108     mov         x4,  x5
109     mov         x5,  x6
110     mov         x6,  x7
111     ldr         x7,  [x29, #16]
112     blr         x12
113     add         sp,  sp,  #ARG_STACK
114     stp         x0,  x1,  [sp, #-16]!
115     movrel      x9, register_init
116     movi        v3.8h,  #0
117
118 .macro check_reg_neon reg1, reg2
119     ldr         q0,  [x9], #16
120     uzp1        v1.2d,  v\reg1\().2d, v\reg2\().2d
121     eor         v0.16b, v0.16b, v1.16b
122     orr         v3.16b, v3.16b, v0.16b
123 .endm
124     check_reg_neon  8,  9
125     check_reg_neon  10, 11
126     check_reg_neon  12, 13
127     check_reg_neon  14, 15
128     uqxtn       v3.8b,  v3.8h
129     umov        x3,  v3.d[0]
130
131 .macro check_reg reg1, reg2
132     ldp         x0,  x1,  [x9], #16
133     eor         x0,  x0,  \reg1
134     eor         x1,  x1,  \reg2
135     orr         x3,  x3,  x0
136     orr         x3,  x3,  x1
137 .endm
138     check_reg   x19, x20
139     check_reg   x21, x22
140     check_reg   x23, x24
141     check_reg   x25, x26
142     check_reg   x27, x28
143
144     cbz         x3,  0f
145
146     movrel      x0, error_message
147     bl          X(checkasm_fail_func)
148 0:
149     ldp         x0,  x1,  [sp], #16
150     ldp         d14, d15, [sp], #16
151     ldp         d12, d13, [sp], #16
152     ldp         d10, d11, [sp], #16
153     ldp         d8,  d9,  [sp], #16
154     ldp         x27, x28, [sp], #16
155     ldp         x25, x26, [sp], #16
156     ldp         x23, x24, [sp], #16
157     ldp         x21, x22, [sp], #16
158     ldp         x19, x20, [sp], #16
159     ldp         x29, x30, [sp], #16
160     ret
161 endfunc