123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
- */
- #ifndef _ASM_ASMMACRO_H
- #define _ASM_ASMMACRO_H
- #include <asm/asm-offsets.h>
- #include <asm/regdef.h>
- #include <asm/fpregdef.h>
- #include <asm/loongarch.h>
- .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
- #endif /* _ASM_ASMMACRO_H */
|