dt-bindings: soc: bcm: use absolute path to other schema
[linux-2.6-microblaze.git] / arch / loongarch / include / asm / asmmacro.h
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 */