1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Macro used to simplify coding multi-line assembler.
4 * Some of the bit test macro can simplify down to one line
5 * depending on the mask value.
7 * Copyright (C) 2004 Microtronix Datacom Ltd.
11 #ifndef _ASM_NIOS2_ASMMACROS_H
12 #define _ASM_NIOS2_ASMMACROS_H
14 * ANDs reg2 with mask and places the result in reg1.
16 * You cannnot use the same register for reg1 & reg2.
19 .macro ANDI32 reg1
, reg2
, mask
21 .if \mask
& 0xffff0000
22 movhi
\reg
1, %hi(\mask
)
23 movui
\reg
1, %lo(\mask
)
24 and \reg
1, \reg
1, \reg
2
26 andi
\reg
1, \reg
2, %lo(\mask
)
29 andhi
\reg
1, \reg
2, %hi(\mask
)
34 * ORs reg2 with mask and places the result in reg1.
36 * It is safe to use the same register for reg1 & reg2.
39 .macro ORI32 reg1
, reg2
, mask
41 .if \mask
& 0xffff0000
42 orhi
\reg
1, \reg
2, %hi(\mask
)
43 ori
\reg
1, \reg
2, %lo(\mask
)
45 ori
\reg
1, \reg
2, %lo(\mask
)
48 orhi
\reg
1, \reg
2, %hi(\mask
)
53 * XORs reg2 with mask and places the result in reg1.
55 * It is safe to use the same register for reg1 & reg2.
58 .macro XORI32 reg1
, reg2
, mask
60 .if \mask
& 0xffff0000
61 xorhi
\reg
1, \reg
2, %hi(\mask
)
62 xori
\reg
1, \reg
1, %lo(\mask
)
64 xori
\reg
1, \reg
2, %lo(\mask
)
67 xorhi
\reg
1, \reg
2, %hi(\mask
)
72 * This is a support macro for BTBZ & BTBNZ. It checks
73 * the bit to make sure it is valid 32 value.
75 * It is safe to use the same register for reg1 & reg2.
78 .macro BT reg1
, reg2
, bit
83 andi
\reg
1, \reg
2, (1 << \bit
)
85 andhi
\reg
1, \reg
2, (1 << (\bit
- 16))
91 * Tests the bit in reg2 and branches to label if the
92 * bit is zero. The result of the bit test is stored in reg1.
94 * It is safe to use the same register for reg1 & reg2.
97 .macro BTBZ reg1
, reg2
, bit
, label
103 * Tests the bit in reg2 and branches to label if the
104 * bit is non-zero. The result of the bit test is stored in reg1.
106 * It is safe to use the same register for reg1 & reg2.
109 .macro BTBNZ reg1
, reg2
, bit
, label
110 BT
\reg
1, \reg
2, \bit
111 bne
\reg
1, r0
, \label
115 * Tests the bit in reg2 and then compliments the bit in reg2.
116 * The result of the bit test is stored in reg1.
118 * It is NOT safe to use the same register for reg1 & reg2.
121 .macro BTC reg1
, reg2
, bit
126 andi
\reg
1, \reg
2, (1 << \bit
)
127 xori
\reg
2, \reg
2, (1 << \bit
)
129 andhi
\reg
1, \reg
2, (1 << (\bit
- 16))
130 xorhi
\reg
2, \reg
2, (1 << (\bit
- 16))
136 * Tests the bit in reg2 and then sets the bit in reg2.
137 * The result of the bit test is stored in reg1.
139 * It is NOT safe to use the same register for reg1 & reg2.
142 .macro BTS reg1
, reg2
, bit
147 andi
\reg
1, \reg
2, (1 << \bit
)
148 ori
\reg
2, \reg
2, (1 << \bit
)
150 andhi
\reg
1, \reg
2, (1 << (\bit
- 16))
151 orhi
\reg
2, \reg
2, (1 << (\bit
- 16))
157 * Tests the bit in reg2 and then resets the bit in reg2.
158 * The result of the bit test is stored in reg1.
160 * It is NOT safe to use the same register for reg1 & reg2.
163 .macro BTR reg1
, reg2
, bit
168 andi
\reg
1, \reg
2, (1 << \bit
)
169 andi
\reg
2, \reg
2, %lo(~(1 << \bit
))
171 andhi
\reg
1, \reg
2, (1 << (\bit
- 16))
172 andhi
\reg
2, \reg
2, %lo(~(1 << (\bit
- 16)))
178 * Tests the bit in reg2 and then compliments the bit in reg2.
179 * The result of the bit test is stored in reg1. If the
180 * original bit was zero it branches to label.
182 * It is NOT safe to use the same register for reg1 & reg2.
185 .macro BTCBZ reg1
, reg2
, bit
, label
186 BTC
\reg
1, \reg
2, \bit
187 beq
\reg
1, r0
, \label
191 * Tests the bit in reg2 and then compliments the bit in reg2.
192 * The result of the bit test is stored in reg1. If the
193 * original bit was non-zero it branches to label.
195 * It is NOT safe to use the same register for reg1 & reg2.
198 .macro BTCBNZ reg1
, reg2
, bit
, label
199 BTC
\reg
1, \reg
2, \bit
200 bne
\reg
1, r0
, \label
204 * Tests the bit in reg2 and then sets the bit in reg2.
205 * The result of the bit test is stored in reg1. If the
206 * original bit was zero it branches to label.
208 * It is NOT safe to use the same register for reg1 & reg2.
211 .macro BTSBZ reg1
, reg2
, bit
, label
212 BTS
\reg
1, \reg
2, \bit
213 beq
\reg
1, r0
, \label
217 * Tests the bit in reg2 and then sets the bit in reg2.
218 * The result of the bit test is stored in reg1. If the
219 * original bit was non-zero it branches to label.
221 * It is NOT safe to use the same register for reg1 & reg2.
224 .macro BTSBNZ reg1
, reg2
, bit
, label
225 BTS
\reg
1, \reg
2, \bit
226 bne
\reg
1, r0
, \label
230 * Tests the bit in reg2 and then resets the bit in reg2.
231 * The result of the bit test is stored in reg1. If the
232 * original bit was zero it branches to label.
234 * It is NOT safe to use the same register for reg1 & reg2.
237 .macro BTRBZ reg1
, reg2
, bit
, label
238 BTR
\reg
1, \reg
2, \bit
239 bne
\reg
1, r0
, \label
243 * Tests the bit in reg2 and then resets the bit in reg2.
244 * The result of the bit test is stored in reg1. If the
245 * original bit was non-zero it branches to label.
247 * It is NOT safe to use the same register for reg1 & reg2.
250 .macro BTRBNZ reg1
, reg2
, bit
, label
251 BTR
\reg
1, \reg
2, \bit
252 bne
\reg
1, r0
, \label
256 * Tests the bits in mask against reg2 stores the result in reg1.
257 * If the all the bits in the mask are zero it branches to label.
259 * It is safe to use the same register for reg1 & reg2.
262 .macro TSTBZ reg1
, reg2
, mask
, label
263 ANDI32
\reg
1, \reg
2, \mask
264 beq
\reg
1, r0
, \label
268 * Tests the bits in mask against reg2 stores the result in reg1.
269 * If the any of the bits in the mask are 1 it branches to label.
271 * It is safe to use the same register for reg1 & reg2.
274 .macro TSTBNZ reg1
, reg2
, mask
, label
275 ANDI32
\reg
1, \reg
2, \mask
276 bne
\reg
1, r0
, \label
280 * Pushes reg onto the stack.
289 * Pops the top of the stack into reg.
298 #endif /* _ASM_NIOS2_ASMMACROS_H */