/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2020-2022 Loongson Technology Corporation Limited */ #ifndef _ASM_ASMMACRO_H #define _ASM_ASMMACRO_H #include #include #include #include .macro parse_v var val \var = \val .endm .macro parse_r var r \var = -1 .ifc \r, $r0 \var = 0 .endif .ifc \r, $r1 \var = 1 .endif .ifc \r, $r2 \var = 2 .endif .ifc \r, $r3 \var = 3 .endif .ifc \r, $r4 \var = 4 .endif .ifc \r, $r5 \var = 5 .endif .ifc \r, $r6 \var = 6 .endif .ifc \r, $r7 \var = 7 .endif .ifc \r, $r8 \var = 8 .endif .ifc \r, $r9 \var = 9 .endif .ifc \r, $r10 \var = 10 .endif .ifc \r, $r11 \var = 11 .endif .ifc \r, $r12 \var = 12 .endif .ifc \r, $r13 \var = 13 .endif .ifc \r, $r14 \var = 14 .endif .ifc \r, $r15 \var = 15 .endif .ifc \r, $r16 \var = 16 .endif .ifc \r, $r17 \var = 17 .endif .ifc \r, $r18 \var = 18 .endif .ifc \r, $r19 \var = 19 .endif .ifc \r, $r20 \var = 20 .endif .ifc \r, $r21 \var = 21 .endif .ifc \r, $r22 \var = 22 .endif .ifc \r, $r23 \var = 23 .endif .ifc \r, $r24 \var = 24 .endif .ifc \r, $r25 \var = 25 .endif .ifc \r, $r26 \var = 26 .endif .ifc \r, $r27 \var = 27 .endif .ifc \r, $r28 \var = 28 .endif .ifc \r, $r29 \var = 29 .endif .ifc \r, $r30 \var = 30 .endif .ifc \r, $r31 \var = 31 .endif .iflt \var .error "Unable to parse register name \r" .endif .endm .macro cpu_save_nonscratch thread stptr.d s0, \thread, THREAD_REG23 stptr.d s1, \thread, THREAD_REG24 stptr.d s2, \thread, THREAD_REG25 stptr.d s3, \thread, THREAD_REG26 stptr.d s4, \thread, THREAD_REG27 stptr.d s5, \thread, THREAD_REG28 stptr.d s6, \thread, THREAD_REG29 stptr.d s7, \thread, THREAD_REG30 stptr.d s8, \thread, THREAD_REG31 stptr.d sp, \thread, THREAD_REG03 stptr.d fp, \thread, THREAD_REG22 .endm .macro cpu_restore_nonscratch thread ldptr.d s0, \thread, THREAD_REG23 ldptr.d s1, \thread, THREAD_REG24 ldptr.d s2, \thread, THREAD_REG25 ldptr.d s3, \thread, THREAD_REG26 ldptr.d s4, \thread, THREAD_REG27 ldptr.d s5, \thread, THREAD_REG28 ldptr.d s6, \thread, THREAD_REG29 ldptr.d s7, \thread, THREAD_REG30 ldptr.d s8, \thread, THREAD_REG31 ldptr.d ra, \thread, THREAD_REG01 ldptr.d sp, \thread, THREAD_REG03 ldptr.d fp, \thread, THREAD_REG22 .endm .macro fpu_save_csr thread tmp movfcsr2gr \tmp, fcsr0 stptr.w \tmp, \thread, THREAD_FCSR .endm .macro fpu_restore_csr thread tmp ldptr.w \tmp, \thread, THREAD_FCSR movgr2fcsr fcsr0, \tmp .endm .macro fpu_save_cc thread tmp0 tmp1 movcf2gr \tmp0, $fcc0 move \tmp1, \tmp0 movcf2gr \tmp0, $fcc1 bstrins.d \tmp1, \tmp0, 15, 8 movcf2gr \tmp0, $fcc2 bstrins.d \tmp1, \tmp0, 23, 16 movcf2gr \tmp0, $fcc3 bstrins.d \tmp1, \tmp0, 31, 24 movcf2gr \tmp0, $fcc4 bstrins.d \tmp1, \tmp0, 39, 32 movcf2gr \tmp0, $fcc5 bstrins.d \tmp1, \tmp0, 47, 40 movcf2gr \tmp0, $fcc6 bstrins.d \tmp1, \tmp0, 55, 48 movcf2gr \tmp0, $fcc7 bstrins.d \tmp1, \tmp0, 63, 56 stptr.d \tmp1, \thread, THREAD_FCC .endm .macro fpu_restore_cc thread tmp0 tmp1 ldptr.d \tmp0, \thread, THREAD_FCC bstrpick.d \tmp1, \tmp0, 7, 0 movgr2cf $fcc0, \tmp1 bstrpick.d \tmp1, \tmp0, 15, 8 movgr2cf $fcc1, \tmp1 bstrpick.d \tmp1, \tmp0, 23, 16 movgr2cf $fcc2, \tmp1 bstrpick.d \tmp1, \tmp0, 31, 24 movgr2cf $fcc3, \tmp1 bstrpick.d \tmp1, \tmp0, 39, 32 movgr2cf $fcc4, \tmp1 bstrpick.d \tmp1, \tmp0, 47, 40 movgr2cf $fcc5, \tmp1 bstrpick.d \tmp1, \tmp0, 55, 48 movgr2cf $fcc6, \tmp1 bstrpick.d \tmp1, \tmp0, 63, 56 movgr2cf $fcc7, \tmp1 .endm .macro fpu_save_double thread tmp li.w \tmp, THREAD_FPR0 PTR_ADD \tmp, \tmp, \thread fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 .endm .macro fpu_restore_double thread tmp li.w \tmp, THREAD_FPR0 PTR_ADD \tmp, \tmp, \thread fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 .endm .macro not dst src nor \dst, \src, zero .endm .macro la_abs reg, sym #ifndef CONFIG_RELOCATABLE la.abs \reg, \sym #else 766: lu12i.w \reg, 0 ori \reg, \reg, 0 lu32i.d \reg, 0 lu52i.d \reg, \reg, 0 .pushsection ".la_abs", "aw", %progbits 768: .dword 768b-766b .dword \sym .popsection #endif .endm #endif /* _ASM_ASMMACRO_H */