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 la_abs reg, sym
278 #ifndef CONFIG_RELOCATABLE
279 	la.abs	\reg, \sym
280 #else
281 	766:
282 	lu12i.w	\reg, 0
283 	ori	\reg, \reg, 0
284 	lu32i.d	\reg, 0
285 	lu52i.d	\reg, \reg, 0
286 	.pushsection ".la_abs", "aw", %progbits
287 	768:
288 	.dword	768b-766b
289 	.dword	\sym
290 	.popsection
291 #endif
292 .endm
293 
294 #endif /* _ASM_ASMMACRO_H */
295