1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4 */ 5 #ifndef _ASM_ASMMACRO_H 6 #define _ASM_ASMMACRO_H 7 8 #include <asm/asm-offsets.h> 9 #include <asm/regdef.h> 10 #include <asm/fpregdef.h> 11 #include <asm/loongarch.h> 12 13 .macro parse_v var val 14 \var = \val 15 .endm 16 17 .macro parse_r var r 18 \var = -1 19 .ifc \r, $r0 20 \var = 0 21 .endif 22 .ifc \r, $r1 23 \var = 1 24 .endif 25 .ifc \r, $r2 26 \var = 2 27 .endif 28 .ifc \r, $r3 29 \var = 3 30 .endif 31 .ifc \r, $r4 32 \var = 4 33 .endif 34 .ifc \r, $r5 35 \var = 5 36 .endif 37 .ifc \r, $r6 38 \var = 6 39 .endif 40 .ifc \r, $r7 41 \var = 7 42 .endif 43 .ifc \r, $r8 44 \var = 8 45 .endif 46 .ifc \r, $r9 47 \var = 9 48 .endif 49 .ifc \r, $r10 50 \var = 10 51 .endif 52 .ifc \r, $r11 53 \var = 11 54 .endif 55 .ifc \r, $r12 56 \var = 12 57 .endif 58 .ifc \r, $r13 59 \var = 13 60 .endif 61 .ifc \r, $r14 62 \var = 14 63 .endif 64 .ifc \r, $r15 65 \var = 15 66 .endif 67 .ifc \r, $r16 68 \var = 16 69 .endif 70 .ifc \r, $r17 71 \var = 17 72 .endif 73 .ifc \r, $r18 74 \var = 18 75 .endif 76 .ifc \r, $r19 77 \var = 19 78 .endif 79 .ifc \r, $r20 80 \var = 20 81 .endif 82 .ifc \r, $r21 83 \var = 21 84 .endif 85 .ifc \r, $r22 86 \var = 22 87 .endif 88 .ifc \r, $r23 89 \var = 23 90 .endif 91 .ifc \r, $r24 92 \var = 24 93 .endif 94 .ifc \r, $r25 95 \var = 25 96 .endif 97 .ifc \r, $r26 98 \var = 26 99 .endif 100 .ifc \r, $r27 101 \var = 27 102 .endif 103 .ifc \r, $r28 104 \var = 28 105 .endif 106 .ifc \r, $r29 107 \var = 29 108 .endif 109 .ifc \r, $r30 110 \var = 30 111 .endif 112 .ifc \r, $r31 113 \var = 31 114 .endif 115 .iflt \var 116 .error "Unable to parse register name \r" 117 .endif 118 .endm 119 120 .macro cpu_save_nonscratch thread 121 stptr.d s0, \thread, THREAD_REG23 122 stptr.d s1, \thread, THREAD_REG24 123 stptr.d s2, \thread, THREAD_REG25 124 stptr.d s3, \thread, THREAD_REG26 125 stptr.d s4, \thread, THREAD_REG27 126 stptr.d s5, \thread, THREAD_REG28 127 stptr.d s6, \thread, THREAD_REG29 128 stptr.d s7, \thread, THREAD_REG30 129 stptr.d s8, \thread, THREAD_REG31 130 stptr.d sp, \thread, THREAD_REG03 131 stptr.d fp, \thread, THREAD_REG22 132 .endm 133 134 .macro cpu_restore_nonscratch thread 135 ldptr.d s0, \thread, THREAD_REG23 136 ldptr.d s1, \thread, THREAD_REG24 137 ldptr.d s2, \thread, THREAD_REG25 138 ldptr.d s3, \thread, THREAD_REG26 139 ldptr.d s4, \thread, THREAD_REG27 140 ldptr.d s5, \thread, THREAD_REG28 141 ldptr.d s6, \thread, THREAD_REG29 142 ldptr.d s7, \thread, THREAD_REG30 143 ldptr.d s8, \thread, THREAD_REG31 144 ldptr.d ra, \thread, THREAD_REG01 145 ldptr.d sp, \thread, THREAD_REG03 146 ldptr.d fp, \thread, THREAD_REG22 147 .endm 148 149 .macro fpu_save_csr thread tmp 150 movfcsr2gr \tmp, fcsr0 151 stptr.w \tmp, \thread, THREAD_FCSR 152 .endm 153 154 .macro fpu_restore_csr thread tmp 155 ldptr.w \tmp, \thread, THREAD_FCSR 156 movgr2fcsr fcsr0, \tmp 157 .endm 158 159 .macro fpu_save_cc thread tmp0 tmp1 160 movcf2gr \tmp0, $fcc0 161 move \tmp1, \tmp0 162 movcf2gr \tmp0, $fcc1 163 bstrins.d \tmp1, \tmp0, 15, 8 164 movcf2gr \tmp0, $fcc2 165 bstrins.d \tmp1, \tmp0, 23, 16 166 movcf2gr \tmp0, $fcc3 167 bstrins.d \tmp1, \tmp0, 31, 24 168 movcf2gr \tmp0, $fcc4 169 bstrins.d \tmp1, \tmp0, 39, 32 170 movcf2gr \tmp0, $fcc5 171 bstrins.d \tmp1, \tmp0, 47, 40 172 movcf2gr \tmp0, $fcc6 173 bstrins.d \tmp1, \tmp0, 55, 48 174 movcf2gr \tmp0, $fcc7 175 bstrins.d \tmp1, \tmp0, 63, 56 176 stptr.d \tmp1, \thread, THREAD_FCC 177 .endm 178 179 .macro fpu_restore_cc thread tmp0 tmp1 180 ldptr.d \tmp0, \thread, THREAD_FCC 181 bstrpick.d \tmp1, \tmp0, 7, 0 182 movgr2cf $fcc0, \tmp1 183 bstrpick.d \tmp1, \tmp0, 15, 8 184 movgr2cf $fcc1, \tmp1 185 bstrpick.d \tmp1, \tmp0, 23, 16 186 movgr2cf $fcc2, \tmp1 187 bstrpick.d \tmp1, \tmp0, 31, 24 188 movgr2cf $fcc3, \tmp1 189 bstrpick.d \tmp1, \tmp0, 39, 32 190 movgr2cf $fcc4, \tmp1 191 bstrpick.d \tmp1, \tmp0, 47, 40 192 movgr2cf $fcc5, \tmp1 193 bstrpick.d \tmp1, \tmp0, 55, 48 194 movgr2cf $fcc6, \tmp1 195 bstrpick.d \tmp1, \tmp0, 63, 56 196 movgr2cf $fcc7, \tmp1 197 .endm 198 199 .macro fpu_save_double thread tmp 200 li.w \tmp, THREAD_FPR0 201 PTR_ADD \tmp, \tmp, \thread 202 fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 203 fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 204 fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 205 fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 206 fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 207 fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 208 fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 209 fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 210 fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 211 fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 212 fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 213 fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 214 fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 215 fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 216 fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 217 fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 218 fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 219 fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 220 fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 221 fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 222 fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 223 fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 224 fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 225 fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 226 fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 227 fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 228 fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 229 fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 230 fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 231 fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 232 fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 233 fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 234 .endm 235 236 .macro fpu_restore_double thread tmp 237 li.w \tmp, THREAD_FPR0 238 PTR_ADD \tmp, \tmp, \thread 239 fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 240 fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 241 fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 242 fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 243 fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 244 fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 245 fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 246 fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 247 fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 248 fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 249 fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 250 fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 251 fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 252 fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 253 fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 254 fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 255 fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 256 fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 257 fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 258 fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 259 fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 260 fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 261 fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 262 fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 263 fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 264 fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 265 fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 266 fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 267 fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 268 fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 269 fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 270 fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 271 .endm 272 273 .macro not dst src 274 nor \dst, \src, zero 275 .endm 276 277 .macro bgt r0 r1 label 278 blt \r1, \r0, \label 279 .endm 280 281 .macro bltz r0 label 282 blt \r0, zero, \label 283 .endm 284 285 .macro bgez r0 label 286 bge \r0, zero, \label 287 .endm 288 289 #endif /* _ASM_ASMMACRO_H */ 290