Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / nios2 / include / asm / asm-macros.h
1 /*
2  * Macro used to simplify coding multi-line assembler.
3  * Some of the bit test macro can simplify down to one line
4  * depending on the mask value.
5  *
6  * Copyright (C) 2004 Microtronix Datacom Ltd.
7  *
8  * All rights reserved.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
18  * NON INFRINGEMENT.  See the GNU General Public License for more
19  * details.
20  *
21  */
22 #ifndef _ASM_NIOS2_ASMMACROS_H
23 #define _ASM_NIOS2_ASMMACROS_H
24 /*
25  * ANDs reg2 with mask and places the result in reg1.
26  *
27  * You cannnot use the same register for reg1 & reg2.
28  */
29
30 .macro ANDI32   reg1, reg2, mask
31 .if \mask & 0xffff
32         .if \mask & 0xffff0000
33                 movhi   \reg1, %hi(\mask)
34                 movui   \reg1, %lo(\mask)
35                 and     \reg1, \reg1, \reg2
36         .else
37                 andi    \reg1, \reg2, %lo(\mask)
38         .endif
39 .else
40         andhi   \reg1, \reg2, %hi(\mask)
41 .endif
42 .endm
43
44 /*
45  * ORs reg2 with mask and places the result in reg1.
46  *
47  * It is safe to use the same register for reg1 & reg2.
48  */
49
50 .macro ORI32    reg1, reg2, mask
51 .if \mask & 0xffff
52         .if \mask & 0xffff0000
53                 orhi    \reg1, \reg2, %hi(\mask)
54                 ori     \reg1, \reg2, %lo(\mask)
55         .else
56                 ori     \reg1, \reg2, %lo(\mask)
57         .endif
58 .else
59         orhi    \reg1, \reg2, %hi(\mask)
60 .endif
61 .endm
62
63 /*
64  * XORs reg2 with mask and places the result in reg1.
65  *
66  * It is safe to use the same register for reg1 & reg2.
67  */
68
69 .macro XORI32   reg1, reg2, mask
70 .if \mask & 0xffff
71         .if \mask & 0xffff0000
72                 xorhi   \reg1, \reg2, %hi(\mask)
73                 xori    \reg1, \reg1, %lo(\mask)
74         .else
75                 xori    \reg1, \reg2, %lo(\mask)
76         .endif
77 .else
78         xorhi   \reg1, \reg2, %hi(\mask)
79 .endif
80 .endm
81
82 /*
83  * This is a support macro for BTBZ & BTBNZ.  It checks
84  * the bit to make sure it is valid 32 value.
85  *
86  * It is safe to use the same register for reg1 & reg2.
87  */
88
89 .macro BT       reg1, reg2, bit
90 .if \bit > 31
91         .err
92 .else
93         .if \bit < 16
94                 andi    \reg1, \reg2, (1 << \bit)
95         .else
96                 andhi   \reg1, \reg2, (1 << (\bit - 16))
97         .endif
98 .endif
99 .endm
100
101 /*
102  * Tests the bit in reg2 and branches to label if the
103  * bit is zero.  The result of the bit test is stored in reg1.
104  *
105  * It is safe to use the same register for reg1 & reg2.
106  */
107
108 .macro BTBZ     reg1, reg2, bit, label
109         BT      \reg1, \reg2, \bit
110         beq     \reg1, r0, \label
111 .endm
112
113 /*
114  * Tests the bit in reg2 and branches to label if the
115  * bit is non-zero.  The result of the bit test is stored in reg1.
116  *
117  * It is safe to use the same register for reg1 & reg2.
118  */
119
120 .macro BTBNZ    reg1, reg2, bit, label
121         BT      \reg1, \reg2, \bit
122         bne     \reg1, r0, \label
123 .endm
124
125 /*
126  * Tests the bit in reg2 and then compliments the bit in reg2.
127  * The result of the bit test is stored in reg1.
128  *
129  * It is NOT safe to use the same register for reg1 & reg2.
130  */
131
132 .macro BTC      reg1, reg2, bit
133 .if \bit > 31
134         .err
135 .else
136         .if \bit < 16
137                 andi    \reg1, \reg2, (1 << \bit)
138                 xori    \reg2, \reg2, (1 << \bit)
139         .else
140                 andhi   \reg1, \reg2, (1 << (\bit - 16))
141                 xorhi   \reg2, \reg2, (1 << (\bit - 16))
142         .endif
143 .endif
144 .endm
145
146 /*
147  * Tests the bit in reg2 and then sets the bit in reg2.
148  * The result of the bit test is stored in reg1.
149  *
150  * It is NOT safe to use the same register for reg1 & reg2.
151  */
152
153 .macro BTS      reg1, reg2, bit
154 .if \bit > 31
155         .err
156 .else
157         .if \bit < 16
158                 andi    \reg1, \reg2, (1 << \bit)
159                 ori     \reg2, \reg2, (1 << \bit)
160         .else
161                 andhi   \reg1, \reg2, (1 << (\bit - 16))
162                 orhi    \reg2, \reg2, (1 << (\bit - 16))
163         .endif
164 .endif
165 .endm
166
167 /*
168  * Tests the bit in reg2 and then resets the bit in reg2.
169  * The result of the bit test is stored in reg1.
170  *
171  * It is NOT safe to use the same register for reg1 & reg2.
172  */
173
174 .macro BTR      reg1, reg2, bit
175 .if \bit > 31
176         .err
177 .else
178         .if \bit < 16
179                 andi    \reg1, \reg2, (1 << \bit)
180                 andi    \reg2, \reg2, %lo(~(1 << \bit))
181         .else
182                 andhi   \reg1, \reg2, (1 << (\bit - 16))
183                 andhi   \reg2, \reg2, %lo(~(1 << (\bit - 16)))
184         .endif
185 .endif
186 .endm
187
188 /*
189  * Tests the bit in reg2 and then compliments the bit in reg2.
190  * The result of the bit test is stored in reg1.  If the
191  * original bit was zero it branches to label.
192  *
193  * It is NOT safe to use the same register for reg1 & reg2.
194  */
195
196 .macro BTCBZ    reg1, reg2, bit, label
197         BTC     \reg1, \reg2, \bit
198         beq     \reg1, r0, \label
199 .endm
200
201 /*
202  * Tests the bit in reg2 and then compliments the bit in reg2.
203  * The result of the bit test is stored in reg1.  If the
204  * original bit was non-zero it branches to label.
205  *
206  * It is NOT safe to use the same register for reg1 & reg2.
207  */
208
209 .macro BTCBNZ   reg1, reg2, bit, label
210         BTC     \reg1, \reg2, \bit
211         bne     \reg1, r0, \label
212 .endm
213
214 /*
215  * Tests the bit in reg2 and then sets the bit in reg2.
216  * The result of the bit test is stored in reg1.  If the
217  * original bit was zero it branches to label.
218  *
219  * It is NOT safe to use the same register for reg1 & reg2.
220  */
221
222 .macro BTSBZ    reg1, reg2, bit, label
223         BTS     \reg1, \reg2, \bit
224         beq     \reg1, r0, \label
225 .endm
226
227 /*
228  * Tests the bit in reg2 and then sets the bit in reg2.
229  * The result of the bit test is stored in reg1.  If the
230  * original bit was non-zero it branches to label.
231  *
232  * It is NOT safe to use the same register for reg1 & reg2.
233  */
234
235 .macro BTSBNZ   reg1, reg2, bit, label
236         BTS     \reg1, \reg2, \bit
237         bne     \reg1, r0, \label
238 .endm
239
240 /*
241  * Tests the bit in reg2 and then resets the bit in reg2.
242  * The result of the bit test is stored in reg1.  If the
243  * original bit was zero it branches to label.
244  *
245  * It is NOT safe to use the same register for reg1 & reg2.
246  */
247
248 .macro BTRBZ    reg1, reg2, bit, label
249         BTR     \reg1, \reg2, \bit
250         bne     \reg1, r0, \label
251 .endm
252
253 /*
254  * Tests the bit in reg2 and then resets the bit in reg2.
255  * The result of the bit test is stored in reg1.  If the
256  * original bit was non-zero it branches to label.
257  *
258  * It is NOT safe to use the same register for reg1 & reg2.
259  */
260
261 .macro BTRBNZ   reg1, reg2, bit, label
262         BTR     \reg1, \reg2, \bit
263         bne     \reg1, r0, \label
264 .endm
265
266 /*
267  * Tests the bits in mask against reg2 stores the result in reg1.
268  * If the all the bits in the mask are zero it branches to label.
269  *
270  * It is safe to use the same register for reg1 & reg2.
271  */
272
273 .macro TSTBZ    reg1, reg2, mask, label
274         ANDI32  \reg1, \reg2, \mask
275         beq     \reg1, r0, \label
276 .endm
277
278 /*
279  * Tests the bits in mask against reg2 stores the result in reg1.
280  * If the any of the bits in the mask are 1 it branches to label.
281  *
282  * It is safe to use the same register for reg1 & reg2.
283  */
284
285 .macro TSTBNZ   reg1, reg2, mask, label
286         ANDI32  \reg1, \reg2, \mask
287         bne     \reg1, r0, \label
288 .endm
289
290 /*
291  * Pushes reg onto the stack.
292  */
293
294 .macro PUSH     reg
295         addi    sp, sp, -4
296         stw     \reg, 0(sp)
297 .endm
298
299 /*
300  * Pops the top of the stack into reg.
301  */
302
303 .macro POP      reg
304         ldw     \reg, 0(sp)
305         addi    sp, sp, 4
306 .endm
307
308
309 #endif /* _ASM_NIOS2_ASMMACROS_H */