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