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 cpu_save_nonscratch thread 14 stptr.d s0, \thread, THREAD_REG23 15 stptr.d s1, \thread, THREAD_REG24 16 stptr.d s2, \thread, THREAD_REG25 17 stptr.d s3, \thread, THREAD_REG26 18 stptr.d s4, \thread, THREAD_REG27 19 stptr.d s5, \thread, THREAD_REG28 20 stptr.d s6, \thread, THREAD_REG29 21 stptr.d s7, \thread, THREAD_REG30 22 stptr.d s8, \thread, THREAD_REG31 23 stptr.d sp, \thread, THREAD_REG03 24 stptr.d fp, \thread, THREAD_REG22 25 .endm 26 27 .macro cpu_restore_nonscratch thread 28 ldptr.d s0, \thread, THREAD_REG23 29 ldptr.d s1, \thread, THREAD_REG24 30 ldptr.d s2, \thread, THREAD_REG25 31 ldptr.d s3, \thread, THREAD_REG26 32 ldptr.d s4, \thread, THREAD_REG27 33 ldptr.d s5, \thread, THREAD_REG28 34 ldptr.d s6, \thread, THREAD_REG29 35 ldptr.d s7, \thread, THREAD_REG30 36 ldptr.d s8, \thread, THREAD_REG31 37 ldptr.d ra, \thread, THREAD_REG01 38 ldptr.d sp, \thread, THREAD_REG03 39 ldptr.d fp, \thread, THREAD_REG22 40 .endm 41 42 .macro fpu_save_csr thread tmp 43 movfcsr2gr \tmp, fcsr0 44 stptr.w \tmp, \thread, THREAD_FCSR 45 #ifdef CONFIG_CPU_HAS_LBT 46 /* TM bit is always 0 if LBT not supported */ 47 andi \tmp, \tmp, FPU_CSR_TM 48 beqz \tmp, 1f 49 /* Save FTOP */ 50 x86mftop \tmp 51 stptr.w \tmp, \thread, THREAD_FTOP 52 /* Turn off TM to ensure the order of FPR in memory independent of TM */ 53 x86clrtm 54 1: 55 #endif 56 .endm 57 58 .macro fpu_restore_csr thread tmp0 tmp1 59 ldptr.w \tmp0, \thread, THREAD_FCSR 60 movgr2fcsr fcsr0, \tmp0 61 #ifdef CONFIG_CPU_HAS_LBT 62 /* TM bit is always 0 if LBT not supported */ 63 andi \tmp0, \tmp0, FPU_CSR_TM 64 beqz \tmp0, 2f 65 /* Restore FTOP */ 66 ldptr.w \tmp0, \thread, THREAD_FTOP 67 andi \tmp0, \tmp0, 0x7 68 la.pcrel \tmp1, 1f 69 alsl.d \tmp1, \tmp0, \tmp1, 3 70 jr \tmp1 71 1: 72 x86mttop 0 73 b 2f 74 x86mttop 1 75 b 2f 76 x86mttop 2 77 b 2f 78 x86mttop 3 79 b 2f 80 x86mttop 4 81 b 2f 82 x86mttop 5 83 b 2f 84 x86mttop 6 85 b 2f 86 x86mttop 7 87 2: 88 #endif 89 .endm 90 91 .macro fpu_save_cc thread tmp0 tmp1 92 movcf2gr \tmp0, $fcc0 93 move \tmp1, \tmp0 94 movcf2gr \tmp0, $fcc1 95 bstrins.d \tmp1, \tmp0, 15, 8 96 movcf2gr \tmp0, $fcc2 97 bstrins.d \tmp1, \tmp0, 23, 16 98 movcf2gr \tmp0, $fcc3 99 bstrins.d \tmp1, \tmp0, 31, 24 100 movcf2gr \tmp0, $fcc4 101 bstrins.d \tmp1, \tmp0, 39, 32 102 movcf2gr \tmp0, $fcc5 103 bstrins.d \tmp1, \tmp0, 47, 40 104 movcf2gr \tmp0, $fcc6 105 bstrins.d \tmp1, \tmp0, 55, 48 106 movcf2gr \tmp0, $fcc7 107 bstrins.d \tmp1, \tmp0, 63, 56 108 stptr.d \tmp1, \thread, THREAD_FCC 109 .endm 110 111 .macro fpu_restore_cc thread tmp0 tmp1 112 ldptr.d \tmp0, \thread, THREAD_FCC 113 bstrpick.d \tmp1, \tmp0, 7, 0 114 movgr2cf $fcc0, \tmp1 115 bstrpick.d \tmp1, \tmp0, 15, 8 116 movgr2cf $fcc1, \tmp1 117 bstrpick.d \tmp1, \tmp0, 23, 16 118 movgr2cf $fcc2, \tmp1 119 bstrpick.d \tmp1, \tmp0, 31, 24 120 movgr2cf $fcc3, \tmp1 121 bstrpick.d \tmp1, \tmp0, 39, 32 122 movgr2cf $fcc4, \tmp1 123 bstrpick.d \tmp1, \tmp0, 47, 40 124 movgr2cf $fcc5, \tmp1 125 bstrpick.d \tmp1, \tmp0, 55, 48 126 movgr2cf $fcc6, \tmp1 127 bstrpick.d \tmp1, \tmp0, 63, 56 128 movgr2cf $fcc7, \tmp1 129 .endm 130 131 .macro fpu_save_double thread tmp 132 li.w \tmp, THREAD_FPR0 133 PTR_ADD \tmp, \tmp, \thread 134 fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 135 fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 136 fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 137 fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 138 fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 139 fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 140 fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 141 fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 142 fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 143 fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 144 fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 145 fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 146 fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 147 fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 148 fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 149 fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 150 fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 151 fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 152 fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 153 fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 154 fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 155 fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 156 fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 157 fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 158 fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 159 fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 160 fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 161 fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 162 fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 163 fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 164 fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 165 fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 166 .endm 167 168 .macro fpu_restore_double thread tmp 169 li.w \tmp, THREAD_FPR0 170 PTR_ADD \tmp, \tmp, \thread 171 fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0 172 fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0 173 fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0 174 fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0 175 fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0 176 fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0 177 fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0 178 fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0 179 fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0 180 fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0 181 fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0 182 fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0 183 fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0 184 fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0 185 fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0 186 fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0 187 fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0 188 fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0 189 fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0 190 fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0 191 fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0 192 fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0 193 fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0 194 fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0 195 fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0 196 fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0 197 fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0 198 fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0 199 fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0 200 fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0 201 fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0 202 fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0 203 .endm 204 205 .macro lsx_save_data thread tmp 206 li.w \tmp, THREAD_FPR0 207 PTR_ADD \tmp, \thread, \tmp 208 vst $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0 209 vst $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0 210 vst $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0 211 vst $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0 212 vst $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0 213 vst $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0 214 vst $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0 215 vst $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0 216 vst $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0 217 vst $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0 218 vst $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0 219 vst $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0 220 vst $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0 221 vst $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0 222 vst $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0 223 vst $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0 224 vst $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0 225 vst $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0 226 vst $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0 227 vst $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0 228 vst $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0 229 vst $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0 230 vst $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0 231 vst $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0 232 vst $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0 233 vst $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0 234 vst $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0 235 vst $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0 236 vst $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0 237 vst $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0 238 vst $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0 239 vst $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0 240 .endm 241 242 .macro lsx_restore_data thread tmp 243 li.w \tmp, THREAD_FPR0 244 PTR_ADD \tmp, \thread, \tmp 245 vld $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0 246 vld $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0 247 vld $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0 248 vld $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0 249 vld $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0 250 vld $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0 251 vld $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0 252 vld $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0 253 vld $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0 254 vld $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0 255 vld $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0 256 vld $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0 257 vld $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0 258 vld $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0 259 vld $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0 260 vld $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0 261 vld $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0 262 vld $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0 263 vld $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0 264 vld $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0 265 vld $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0 266 vld $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0 267 vld $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0 268 vld $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0 269 vld $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0 270 vld $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0 271 vld $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0 272 vld $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0 273 vld $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0 274 vld $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0 275 vld $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0 276 vld $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0 277 .endm 278 279 .macro lsx_save_all thread tmp0 tmp1 280 fpu_save_cc \thread, \tmp0, \tmp1 281 fpu_save_csr \thread, \tmp0 282 lsx_save_data \thread, \tmp0 283 .endm 284 285 .macro lsx_restore_all thread tmp0 tmp1 286 lsx_restore_data \thread, \tmp0 287 fpu_restore_cc \thread, \tmp0, \tmp1 288 fpu_restore_csr \thread, \tmp0, \tmp1 289 .endm 290 291 .macro lsx_save_upper vd base tmp off 292 vpickve2gr.d \tmp, \vd, 1 293 st.d \tmp, \base, (\off+8) 294 .endm 295 296 .macro lsx_save_all_upper thread base tmp 297 li.w \tmp, THREAD_FPR0 298 PTR_ADD \base, \thread, \tmp 299 lsx_save_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0) 300 lsx_save_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0) 301 lsx_save_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0) 302 lsx_save_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0) 303 lsx_save_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0) 304 lsx_save_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0) 305 lsx_save_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0) 306 lsx_save_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0) 307 lsx_save_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0) 308 lsx_save_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0) 309 lsx_save_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0) 310 lsx_save_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0) 311 lsx_save_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0) 312 lsx_save_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0) 313 lsx_save_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0) 314 lsx_save_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0) 315 lsx_save_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0) 316 lsx_save_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0) 317 lsx_save_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0) 318 lsx_save_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0) 319 lsx_save_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0) 320 lsx_save_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0) 321 lsx_save_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0) 322 lsx_save_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0) 323 lsx_save_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0) 324 lsx_save_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0) 325 lsx_save_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0) 326 lsx_save_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0) 327 lsx_save_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0) 328 lsx_save_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0) 329 lsx_save_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0) 330 lsx_save_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0) 331 .endm 332 333 .macro lsx_restore_upper vd base tmp off 334 ld.d \tmp, \base, (\off+8) 335 vinsgr2vr.d \vd, \tmp, 1 336 .endm 337 338 .macro lsx_restore_all_upper thread base tmp 339 li.w \tmp, THREAD_FPR0 340 PTR_ADD \base, \thread, \tmp 341 lsx_restore_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0) 342 lsx_restore_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0) 343 lsx_restore_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0) 344 lsx_restore_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0) 345 lsx_restore_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0) 346 lsx_restore_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0) 347 lsx_restore_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0) 348 lsx_restore_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0) 349 lsx_restore_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0) 350 lsx_restore_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0) 351 lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0) 352 lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0) 353 lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0) 354 lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0) 355 lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0) 356 lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0) 357 lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0) 358 lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0) 359 lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0) 360 lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0) 361 lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0) 362 lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0) 363 lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0) 364 lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0) 365 lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0) 366 lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0) 367 lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0) 368 lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0) 369 lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0) 370 lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0) 371 lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0) 372 lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0) 373 .endm 374 375 .macro lsx_init_upper vd tmp 376 vinsgr2vr.d \vd, \tmp, 1 377 .endm 378 379 .macro lsx_init_all_upper tmp 380 not \tmp, zero 381 lsx_init_upper $vr0 \tmp 382 lsx_init_upper $vr1 \tmp 383 lsx_init_upper $vr2 \tmp 384 lsx_init_upper $vr3 \tmp 385 lsx_init_upper $vr4 \tmp 386 lsx_init_upper $vr5 \tmp 387 lsx_init_upper $vr6 \tmp 388 lsx_init_upper $vr7 \tmp 389 lsx_init_upper $vr8 \tmp 390 lsx_init_upper $vr9 \tmp 391 lsx_init_upper $vr10 \tmp 392 lsx_init_upper $vr11 \tmp 393 lsx_init_upper $vr12 \tmp 394 lsx_init_upper $vr13 \tmp 395 lsx_init_upper $vr14 \tmp 396 lsx_init_upper $vr15 \tmp 397 lsx_init_upper $vr16 \tmp 398 lsx_init_upper $vr17 \tmp 399 lsx_init_upper $vr18 \tmp 400 lsx_init_upper $vr19 \tmp 401 lsx_init_upper $vr20 \tmp 402 lsx_init_upper $vr21 \tmp 403 lsx_init_upper $vr22 \tmp 404 lsx_init_upper $vr23 \tmp 405 lsx_init_upper $vr24 \tmp 406 lsx_init_upper $vr25 \tmp 407 lsx_init_upper $vr26 \tmp 408 lsx_init_upper $vr27 \tmp 409 lsx_init_upper $vr28 \tmp 410 lsx_init_upper $vr29 \tmp 411 lsx_init_upper $vr30 \tmp 412 lsx_init_upper $vr31 \tmp 413 .endm 414 415 .macro lasx_save_data thread tmp 416 li.w \tmp, THREAD_FPR0 417 PTR_ADD \tmp, \thread, \tmp 418 xvst $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0 419 xvst $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0 420 xvst $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0 421 xvst $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0 422 xvst $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0 423 xvst $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0 424 xvst $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0 425 xvst $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0 426 xvst $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0 427 xvst $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0 428 xvst $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0 429 xvst $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0 430 xvst $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0 431 xvst $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0 432 xvst $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0 433 xvst $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0 434 xvst $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0 435 xvst $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0 436 xvst $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0 437 xvst $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0 438 xvst $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0 439 xvst $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0 440 xvst $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0 441 xvst $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0 442 xvst $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0 443 xvst $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0 444 xvst $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0 445 xvst $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0 446 xvst $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0 447 xvst $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0 448 xvst $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0 449 xvst $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0 450 .endm 451 452 .macro lasx_restore_data thread tmp 453 li.w \tmp, THREAD_FPR0 454 PTR_ADD \tmp, \thread, \tmp 455 xvld $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0 456 xvld $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0 457 xvld $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0 458 xvld $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0 459 xvld $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0 460 xvld $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0 461 xvld $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0 462 xvld $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0 463 xvld $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0 464 xvld $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0 465 xvld $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0 466 xvld $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0 467 xvld $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0 468 xvld $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0 469 xvld $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0 470 xvld $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0 471 xvld $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0 472 xvld $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0 473 xvld $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0 474 xvld $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0 475 xvld $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0 476 xvld $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0 477 xvld $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0 478 xvld $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0 479 xvld $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0 480 xvld $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0 481 xvld $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0 482 xvld $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0 483 xvld $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0 484 xvld $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0 485 xvld $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0 486 xvld $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0 487 .endm 488 489 .macro lasx_save_all thread tmp0 tmp1 490 fpu_save_cc \thread, \tmp0, \tmp1 491 fpu_save_csr \thread, \tmp0 492 lasx_save_data \thread, \tmp0 493 .endm 494 495 .macro lasx_restore_all thread tmp0 tmp1 496 lasx_restore_data \thread, \tmp0 497 fpu_restore_cc \thread, \tmp0, \tmp1 498 fpu_restore_csr \thread, \tmp0, \tmp1 499 .endm 500 501 .macro lasx_save_upper xd base tmp off 502 /* Nothing */ 503 .endm 504 505 .macro lasx_save_all_upper thread base tmp 506 /* Nothing */ 507 .endm 508 509 .macro lasx_restore_upper xd base tmp0 tmp1 off 510 vld \tmp0, \base, (\off+16) 511 xvpermi.q \xd, \tmp1, 0x2 512 .endm 513 514 .macro lasx_restore_all_upper thread base tmp 515 li.w \tmp, THREAD_FPR0 516 PTR_ADD \base, \thread, \tmp 517 /* Save $vr31 ($xr31 lower bits) with xvpickve2gr */ 518 xvpickve2gr.d $r17, $xr31, 0 519 xvpickve2gr.d $r18, $xr31, 1 520 lasx_restore_upper $xr0, \base, $vr31, $xr31, (THREAD_FPR0-THREAD_FPR0) 521 lasx_restore_upper $xr1, \base, $vr31, $xr31, (THREAD_FPR1-THREAD_FPR0) 522 lasx_restore_upper $xr2, \base, $vr31, $xr31, (THREAD_FPR2-THREAD_FPR0) 523 lasx_restore_upper $xr3, \base, $vr31, $xr31, (THREAD_FPR3-THREAD_FPR0) 524 lasx_restore_upper $xr4, \base, $vr31, $xr31, (THREAD_FPR4-THREAD_FPR0) 525 lasx_restore_upper $xr5, \base, $vr31, $xr31, (THREAD_FPR5-THREAD_FPR0) 526 lasx_restore_upper $xr6, \base, $vr31, $xr31, (THREAD_FPR6-THREAD_FPR0) 527 lasx_restore_upper $xr7, \base, $vr31, $xr31, (THREAD_FPR7-THREAD_FPR0) 528 lasx_restore_upper $xr8, \base, $vr31, $xr31, (THREAD_FPR8-THREAD_FPR0) 529 lasx_restore_upper $xr9, \base, $vr31, $xr31, (THREAD_FPR9-THREAD_FPR0) 530 lasx_restore_upper $xr10, \base, $vr31, $xr31, (THREAD_FPR10-THREAD_FPR0) 531 lasx_restore_upper $xr11, \base, $vr31, $xr31, (THREAD_FPR11-THREAD_FPR0) 532 lasx_restore_upper $xr12, \base, $vr31, $xr31, (THREAD_FPR12-THREAD_FPR0) 533 lasx_restore_upper $xr13, \base, $vr31, $xr31, (THREAD_FPR13-THREAD_FPR0) 534 lasx_restore_upper $xr14, \base, $vr31, $xr31, (THREAD_FPR14-THREAD_FPR0) 535 lasx_restore_upper $xr15, \base, $vr31, $xr31, (THREAD_FPR15-THREAD_FPR0) 536 lasx_restore_upper $xr16, \base, $vr31, $xr31, (THREAD_FPR16-THREAD_FPR0) 537 lasx_restore_upper $xr17, \base, $vr31, $xr31, (THREAD_FPR17-THREAD_FPR0) 538 lasx_restore_upper $xr18, \base, $vr31, $xr31, (THREAD_FPR18-THREAD_FPR0) 539 lasx_restore_upper $xr19, \base, $vr31, $xr31, (THREAD_FPR19-THREAD_FPR0) 540 lasx_restore_upper $xr20, \base, $vr31, $xr31, (THREAD_FPR20-THREAD_FPR0) 541 lasx_restore_upper $xr21, \base, $vr31, $xr31, (THREAD_FPR21-THREAD_FPR0) 542 lasx_restore_upper $xr22, \base, $vr31, $xr31, (THREAD_FPR22-THREAD_FPR0) 543 lasx_restore_upper $xr23, \base, $vr31, $xr31, (THREAD_FPR23-THREAD_FPR0) 544 lasx_restore_upper $xr24, \base, $vr31, $xr31, (THREAD_FPR24-THREAD_FPR0) 545 lasx_restore_upper $xr25, \base, $vr31, $xr31, (THREAD_FPR25-THREAD_FPR0) 546 lasx_restore_upper $xr26, \base, $vr31, $xr31, (THREAD_FPR26-THREAD_FPR0) 547 lasx_restore_upper $xr27, \base, $vr31, $xr31, (THREAD_FPR27-THREAD_FPR0) 548 lasx_restore_upper $xr28, \base, $vr31, $xr31, (THREAD_FPR28-THREAD_FPR0) 549 lasx_restore_upper $xr29, \base, $vr31, $xr31, (THREAD_FPR29-THREAD_FPR0) 550 lasx_restore_upper $xr30, \base, $vr31, $xr31, (THREAD_FPR30-THREAD_FPR0) 551 lasx_restore_upper $xr31, \base, $vr31, $xr31, (THREAD_FPR31-THREAD_FPR0) 552 /* Restore $vr31 ($xr31 lower bits) with xvinsgr2vr */ 553 xvinsgr2vr.d $xr31, $r17, 0 554 xvinsgr2vr.d $xr31, $r18, 1 555 .endm 556 557 .macro lasx_init_upper xd tmp 558 xvinsgr2vr.d \xd, \tmp, 2 559 xvinsgr2vr.d \xd, \tmp, 3 560 .endm 561 562 .macro lasx_init_all_upper tmp 563 not \tmp, zero 564 lasx_init_upper $xr0 \tmp 565 lasx_init_upper $xr1 \tmp 566 lasx_init_upper $xr2 \tmp 567 lasx_init_upper $xr3 \tmp 568 lasx_init_upper $xr4 \tmp 569 lasx_init_upper $xr5 \tmp 570 lasx_init_upper $xr6 \tmp 571 lasx_init_upper $xr7 \tmp 572 lasx_init_upper $xr8 \tmp 573 lasx_init_upper $xr9 \tmp 574 lasx_init_upper $xr10 \tmp 575 lasx_init_upper $xr11 \tmp 576 lasx_init_upper $xr12 \tmp 577 lasx_init_upper $xr13 \tmp 578 lasx_init_upper $xr14 \tmp 579 lasx_init_upper $xr15 \tmp 580 lasx_init_upper $xr16 \tmp 581 lasx_init_upper $xr17 \tmp 582 lasx_init_upper $xr18 \tmp 583 lasx_init_upper $xr19 \tmp 584 lasx_init_upper $xr20 \tmp 585 lasx_init_upper $xr21 \tmp 586 lasx_init_upper $xr22 \tmp 587 lasx_init_upper $xr23 \tmp 588 lasx_init_upper $xr24 \tmp 589 lasx_init_upper $xr25 \tmp 590 lasx_init_upper $xr26 \tmp 591 lasx_init_upper $xr27 \tmp 592 lasx_init_upper $xr28 \tmp 593 lasx_init_upper $xr29 \tmp 594 lasx_init_upper $xr30 \tmp 595 lasx_init_upper $xr31 \tmp 596 .endm 597 598 .macro not dst src 599 nor \dst, \src, zero 600 .endm 601 602 .macro la_abs reg, sym 603 #ifndef CONFIG_RELOCATABLE 604 la.abs \reg, \sym 605 #else 606 766: 607 lu12i.w \reg, 0 608 ori \reg, \reg, 0 609 lu32i.d \reg, 0 610 lu52i.d \reg, \reg, 0 611 .pushsection ".la_abs", "aw", %progbits 612 .p2align 3 613 .dword 766b 614 .dword \sym 615 .popsection 616 #endif 617 .endm 618 619 #endif /* _ASM_ASMMACRO_H */ 620