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