Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/loongarch/include/asm/asmmacro.h
51978 views
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
683