xref: /aosp_15_r20/external/libdav1d/tests/checkasm/loongarch/checkasm.S (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker/******************************************************************************
2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker * Copyright © 2024, Loongson Technology Corporation Limited
4*c0909341SAndroid Build Coastguard Worker * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker *
9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker *    list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker *
12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker *    this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker *    and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker *
16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker *****************************************************************************/
27*c0909341SAndroid Build Coastguard Worker
28*c0909341SAndroid Build Coastguard Worker#define PRIVATE_PREFIX checkasm_
29*c0909341SAndroid Build Coastguard Worker
30*c0909341SAndroid Build Coastguard Worker#include "src/loongarch/loongson_asm.S"
31*c0909341SAndroid Build Coastguard Worker
32*c0909341SAndroid Build Coastguard Workerconst register_init, align=4
33*c0909341SAndroid Build Coastguard Worker.quad 0x21f86d66c8ca00ce
34*c0909341SAndroid Build Coastguard Worker.quad 0x75b6ba21077c48ad
35*c0909341SAndroid Build Coastguard Worker.quad 0xed56bb2dcb3c7736
36*c0909341SAndroid Build Coastguard Worker.quad 0x8bda43d3fd1a7e06
37*c0909341SAndroid Build Coastguard Worker.quad 0xb64a9c9e5d318408
38*c0909341SAndroid Build Coastguard Worker.quad 0xdf9a54b303f1d3a3
39*c0909341SAndroid Build Coastguard Worker.quad 0x4a75479abd64e097
40*c0909341SAndroid Build Coastguard Worker.quad 0x249214109d5d1c88
41*c0909341SAndroid Build Coastguard Worker.quad 0x1a1b2550a612b48c
42*c0909341SAndroid Build Coastguard Worker.quad 0x79445c159ce79064
43*c0909341SAndroid Build Coastguard Worker.quad 0x2eed899d5a28ddcd
44*c0909341SAndroid Build Coastguard Worker.quad 0x86b2536fcd8cf636
45*c0909341SAndroid Build Coastguard Worker.quad 0xb0856806085e7943
46*c0909341SAndroid Build Coastguard Worker.quad 0x3f2bf84fc0fcca4e
47*c0909341SAndroid Build Coastguard Worker.quad 0xacbd382dcf5b8de2
48*c0909341SAndroid Build Coastguard Worker.quad 0xd229e1f5b281303f
49*c0909341SAndroid Build Coastguard Worker.quad 0x71aeaff20b095fd9
50*c0909341SAndroid Build Coastguard Worker.quad 0xab63e2e11fa38ed9
51*c0909341SAndroid Build Coastguard Workerendconst
52*c0909341SAndroid Build Coastguard Worker
53*c0909341SAndroid Build Coastguard Workerconst error_message
54*c0909341SAndroid Build Coastguard Worker.asciz "failed to preserve register"
55*c0909341SAndroid Build Coastguard Workerendconst
56*c0909341SAndroid Build Coastguard Worker
57*c0909341SAndroid Build Coastguard Worker// max number of args used by any asm function.
58*c0909341SAndroid Build Coastguard Worker#define MAX_ARGS 15
59*c0909341SAndroid Build Coastguard Worker
60*c0909341SAndroid Build Coastguard Worker#define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15)
61*c0909341SAndroid Build Coastguard Worker
62*c0909341SAndroid Build Coastguard Worker// Fill dirty data at stack space
63*c0909341SAndroid Build Coastguard Workerfunction stack_clobber
64*c0909341SAndroid Build Coastguard Worker    move    t0,     sp
65*c0909341SAndroid Build Coastguard Worker    addi.d  t1,     zero,   CLOBBER_STACK
66*c0909341SAndroid Build Coastguard Worker1:
67*c0909341SAndroid Build Coastguard Worker    st.d    a0,     sp,     0x00
68*c0909341SAndroid Build Coastguard Worker    st.d    a1,     sp,    -0x08
69*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,    -0x10
70*c0909341SAndroid Build Coastguard Worker    addi.d  t1,     t1,    -0x10
71*c0909341SAndroid Build Coastguard Worker    blt     zero,   t1,     1b
72*c0909341SAndroid Build Coastguard Worker    move    sp,     t0
73*c0909341SAndroid Build Coastguard Workerendfunc
74*c0909341SAndroid Build Coastguard Worker
75*c0909341SAndroid Build Coastguard Worker#define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15)
76*c0909341SAndroid Build Coastguard Worker
77*c0909341SAndroid Build Coastguard Workerfunction checked_call
78*c0909341SAndroid Build Coastguard Worker    // Saved s0 - s8, fs0 - fs7
79*c0909341SAndroid Build Coastguard Worker    move    t4,     sp
80*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     -136
81*c0909341SAndroid Build Coastguard Worker    st.d    s0,     sp,     0
82*c0909341SAndroid Build Coastguard Worker    st.d    s1,     sp,     8
83*c0909341SAndroid Build Coastguard Worker    st.d    s2,     sp,     16
84*c0909341SAndroid Build Coastguard Worker    st.d    s3,     sp,     24
85*c0909341SAndroid Build Coastguard Worker    st.d    s4,     sp,     32
86*c0909341SAndroid Build Coastguard Worker    st.d    s5,     sp,     40
87*c0909341SAndroid Build Coastguard Worker    st.d    s6,     sp,     48
88*c0909341SAndroid Build Coastguard Worker    st.d    s7,     sp,     56
89*c0909341SAndroid Build Coastguard Worker    st.d    s8,     sp,     64
90*c0909341SAndroid Build Coastguard Worker    fst.d   fs0,    sp,     72
91*c0909341SAndroid Build Coastguard Worker    fst.d   fs1,    sp,     80
92*c0909341SAndroid Build Coastguard Worker    fst.d   fs2,    sp,     88
93*c0909341SAndroid Build Coastguard Worker    fst.d   fs3,    sp,     96
94*c0909341SAndroid Build Coastguard Worker    fst.d   fs4,    sp,     104
95*c0909341SAndroid Build Coastguard Worker    fst.d   fs5,    sp,     112
96*c0909341SAndroid Build Coastguard Worker    fst.d   fs6,    sp,     120
97*c0909341SAndroid Build Coastguard Worker    fst.d   fs7,    sp,     128
98*c0909341SAndroid Build Coastguard Worker
99*c0909341SAndroid Build Coastguard Worker    la.local    t1,   register_init
100*c0909341SAndroid Build Coastguard Worker    ld.d    s0,     t1,     0
101*c0909341SAndroid Build Coastguard Worker    ld.d    s1,     t1,     8
102*c0909341SAndroid Build Coastguard Worker    ld.d    s2,     t1,     16
103*c0909341SAndroid Build Coastguard Worker    ld.d    s3,     t1,     24
104*c0909341SAndroid Build Coastguard Worker    ld.d    s4,     t1,     32
105*c0909341SAndroid Build Coastguard Worker    ld.d    s5,     t1,     40
106*c0909341SAndroid Build Coastguard Worker    ld.d    s6,     t1,     48
107*c0909341SAndroid Build Coastguard Worker    ld.d    s7,     t1,     56
108*c0909341SAndroid Build Coastguard Worker    ld.d    s8,     t1,     64
109*c0909341SAndroid Build Coastguard Worker    fld.d   fs0,    t1,     72
110*c0909341SAndroid Build Coastguard Worker    fld.d   fs1,    t1,     80
111*c0909341SAndroid Build Coastguard Worker    fld.d   fs2,    t1,     88
112*c0909341SAndroid Build Coastguard Worker    fld.d   fs3,    t1,     96
113*c0909341SAndroid Build Coastguard Worker    fld.d   fs4,    t1,     104
114*c0909341SAndroid Build Coastguard Worker    fld.d   fs5,    t1,     112
115*c0909341SAndroid Build Coastguard Worker    fld.d   fs6,    t1,     120
116*c0909341SAndroid Build Coastguard Worker    fld.d   fs7,    t1,     128
117*c0909341SAndroid Build Coastguard Worker
118*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     -16
119*c0909341SAndroid Build Coastguard Worker    st.d    a1,     sp,     0 // ok
120*c0909341SAndroid Build Coastguard Worker    st.d    ra,     sp,     8 // Ret address
121*c0909341SAndroid Build Coastguard Worker
122*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     -ARG_STACK
123*c0909341SAndroid Build Coastguard Worker
124*c0909341SAndroid Build Coastguard Worker    addi.d  t0,     zero,   8*8
125*c0909341SAndroid Build Coastguard Worker    xor     t1,     t1,     t1
126*c0909341SAndroid Build Coastguard Worker.rept MAX_ARGS - 8
127*c0909341SAndroid Build Coastguard Worker    // Skip the first 8 args, that are loaded into registers
128*c0909341SAndroid Build Coastguard Worker    ldx.d   t2,     t4,     t0
129*c0909341SAndroid Build Coastguard Worker    stx.d   t2,     sp,     t1
130*c0909341SAndroid Build Coastguard Worker    addi.d  t0,     t0,     8
131*c0909341SAndroid Build Coastguard Worker    addi.d  t1,     t1,     8
132*c0909341SAndroid Build Coastguard Worker.endr
133*c0909341SAndroid Build Coastguard Worker    move    t3,     a0  // Func
134*c0909341SAndroid Build Coastguard Worker    ld.d    a0,     t4,     0
135*c0909341SAndroid Build Coastguard Worker    ld.d    a1,     t4,     8
136*c0909341SAndroid Build Coastguard Worker    ld.d    a2,     t4,     16
137*c0909341SAndroid Build Coastguard Worker    ld.d    a3,     t4,     24
138*c0909341SAndroid Build Coastguard Worker    ld.d    a4,     t4,     32
139*c0909341SAndroid Build Coastguard Worker    ld.d    a5,     t4,     40
140*c0909341SAndroid Build Coastguard Worker    ld.d    a6,     t4,     48
141*c0909341SAndroid Build Coastguard Worker    ld.d    a7,     t4,     56
142*c0909341SAndroid Build Coastguard Worker
143*c0909341SAndroid Build Coastguard Worker    jirl    ra,     t3,     0
144*c0909341SAndroid Build Coastguard Worker
145*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     ARG_STACK
146*c0909341SAndroid Build Coastguard Worker    ld.d    t2,     sp,     0 // ok
147*c0909341SAndroid Build Coastguard Worker    ld.d    ra,     sp,     8 // Ret address
148*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     16
149*c0909341SAndroid Build Coastguard Worker
150*c0909341SAndroid Build Coastguard Worker    la.local    t1,   register_init
151*c0909341SAndroid Build Coastguard Worker    xor         t3,   t3,   t3
152*c0909341SAndroid Build Coastguard Worker
153*c0909341SAndroid Build Coastguard Worker.macro check_reg_gr reg1
154*c0909341SAndroid Build Coastguard Worker    ld.d    t0,     t1,      0
155*c0909341SAndroid Build Coastguard Worker    xor     t0,     $s\reg1, t0
156*c0909341SAndroid Build Coastguard Worker    or      t3,     t3,      t0
157*c0909341SAndroid Build Coastguard Worker    addi.d  t1,     t1,      8
158*c0909341SAndroid Build Coastguard Worker.endm
159*c0909341SAndroid Build Coastguard Worker    check_reg_gr 0
160*c0909341SAndroid Build Coastguard Worker    check_reg_gr 1
161*c0909341SAndroid Build Coastguard Worker    check_reg_gr 2
162*c0909341SAndroid Build Coastguard Worker    check_reg_gr 3
163*c0909341SAndroid Build Coastguard Worker    check_reg_gr 4
164*c0909341SAndroid Build Coastguard Worker    check_reg_gr 5
165*c0909341SAndroid Build Coastguard Worker    check_reg_gr 6
166*c0909341SAndroid Build Coastguard Worker    check_reg_gr 7
167*c0909341SAndroid Build Coastguard Worker    check_reg_gr 8
168*c0909341SAndroid Build Coastguard Worker
169*c0909341SAndroid Build Coastguard Worker.macro check_reg_fr reg1
170*c0909341SAndroid Build Coastguard Worker    ld.d        t0,     t1,     0
171*c0909341SAndroid Build Coastguard Worker    movfr2gr.d  t4,     $fs\reg1
172*c0909341SAndroid Build Coastguard Worker    xor         t0,     t0,     t4
173*c0909341SAndroid Build Coastguard Worker    or          t3,     t3,     t0
174*c0909341SAndroid Build Coastguard Worker    addi.d      t1,     t1,     8
175*c0909341SAndroid Build Coastguard Worker.endm
176*c0909341SAndroid Build Coastguard Worker    check_reg_fr 0
177*c0909341SAndroid Build Coastguard Worker    check_reg_fr 1
178*c0909341SAndroid Build Coastguard Worker    check_reg_fr 2
179*c0909341SAndroid Build Coastguard Worker    check_reg_fr 3
180*c0909341SAndroid Build Coastguard Worker    check_reg_fr 4
181*c0909341SAndroid Build Coastguard Worker    check_reg_fr 5
182*c0909341SAndroid Build Coastguard Worker    check_reg_fr 6
183*c0909341SAndroid Build Coastguard Worker    check_reg_fr 7
184*c0909341SAndroid Build Coastguard Worker
185*c0909341SAndroid Build Coastguard Worker    beqz    t3,     0f
186*c0909341SAndroid Build Coastguard Worker
187*c0909341SAndroid Build Coastguard Worker    st.d        zero,   t2,     0x00 // Set OK to 0
188*c0909341SAndroid Build Coastguard Worker    la.local    a0,     error_message
189*c0909341SAndroid Build Coastguard Worker    addi.d      sp,     sp,     -8
190*c0909341SAndroid Build Coastguard Worker    st.d        ra,     sp,     0
191*c0909341SAndroid Build Coastguard Worker    bl          puts
192*c0909341SAndroid Build Coastguard Worker    ld.d        ra,     sp,     0
193*c0909341SAndroid Build Coastguard Worker    addi.d      sp,     sp,     8
194*c0909341SAndroid Build Coastguard Worker0:
195*c0909341SAndroid Build Coastguard Worker    ld.d    s0,     sp,     0
196*c0909341SAndroid Build Coastguard Worker    ld.d    s1,     sp,     8
197*c0909341SAndroid Build Coastguard Worker    ld.d    s2,     sp,     16
198*c0909341SAndroid Build Coastguard Worker    ld.d    s3,     sp,     24
199*c0909341SAndroid Build Coastguard Worker    ld.d    s4,     sp,     32
200*c0909341SAndroid Build Coastguard Worker    ld.d    s5,     sp,     40
201*c0909341SAndroid Build Coastguard Worker    ld.d    s6,     sp,     48
202*c0909341SAndroid Build Coastguard Worker    ld.d    s7,     sp,     56
203*c0909341SAndroid Build Coastguard Worker    ld.d    s8,     sp,     64
204*c0909341SAndroid Build Coastguard Worker    fld.d   fs0,    sp,     72
205*c0909341SAndroid Build Coastguard Worker    fld.d   fs1,    sp,     80
206*c0909341SAndroid Build Coastguard Worker    fld.d   fs2,    sp,     88
207*c0909341SAndroid Build Coastguard Worker    fld.d   fs3,    sp,     96
208*c0909341SAndroid Build Coastguard Worker    fld.d   fs4,    sp,     104
209*c0909341SAndroid Build Coastguard Worker    fld.d   fs5,    sp,     112
210*c0909341SAndroid Build Coastguard Worker    fld.d   fs6,    sp,     120
211*c0909341SAndroid Build Coastguard Worker    fld.d   fs7,    sp,     128
212*c0909341SAndroid Build Coastguard Worker    addi.d  sp,     sp,     136
213*c0909341SAndroid Build Coastguard Workerendfunc
214