Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/nios2/include/asm/asm-macros.h
26493 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
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.
6
*
7
* Copyright (C) 2004 Microtronix Datacom Ltd.
8
*
9
* All rights reserved.
10
*/
11
#ifndef _ASM_NIOS2_ASMMACROS_H
12
#define _ASM_NIOS2_ASMMACROS_H
13
/*
14
* ANDs reg2 with mask and places the result in reg1.
15
*
16
* You cannnot use the same register for reg1 & reg2.
17
*/
18
19
.macro ANDI32 reg1, reg2, mask
20
.if \mask & 0xffff
21
.if \mask & 0xffff0000
22
movhi \reg1, %hi(\mask)
23
movui \reg1, %lo(\mask)
24
and \reg1, \reg1, \reg2
25
.else
26
andi \reg1, \reg2, %lo(\mask)
27
.endif
28
.else
29
andhi \reg1, \reg2, %hi(\mask)
30
.endif
31
.endm
32
33
/*
34
* ORs reg2 with mask and places the result in reg1.
35
*
36
* It is safe to use the same register for reg1 & reg2.
37
*/
38
39
.macro ORI32 reg1, reg2, mask
40
.if \mask & 0xffff
41
.if \mask & 0xffff0000
42
orhi \reg1, \reg2, %hi(\mask)
43
ori \reg1, \reg2, %lo(\mask)
44
.else
45
ori \reg1, \reg2, %lo(\mask)
46
.endif
47
.else
48
orhi \reg1, \reg2, %hi(\mask)
49
.endif
50
.endm
51
52
/*
53
* XORs reg2 with mask and places the result in reg1.
54
*
55
* It is safe to use the same register for reg1 & reg2.
56
*/
57
58
.macro XORI32 reg1, reg2, mask
59
.if \mask & 0xffff
60
.if \mask & 0xffff0000
61
xorhi \reg1, \reg2, %hi(\mask)
62
xori \reg1, \reg1, %lo(\mask)
63
.else
64
xori \reg1, \reg2, %lo(\mask)
65
.endif
66
.else
67
xorhi \reg1, \reg2, %hi(\mask)
68
.endif
69
.endm
70
71
/*
72
* This is a support macro for BTBZ & BTBNZ. It checks
73
* the bit to make sure it is valid 32 value.
74
*
75
* It is safe to use the same register for reg1 & reg2.
76
*/
77
78
.macro BT reg1, reg2, bit
79
.if \bit > 31
80
.err
81
.else
82
.if \bit < 16
83
andi \reg1, \reg2, (1 << \bit)
84
.else
85
andhi \reg1, \reg2, (1 << (\bit - 16))
86
.endif
87
.endif
88
.endm
89
90
/*
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.
93
*
94
* It is safe to use the same register for reg1 & reg2.
95
*/
96
97
.macro BTBZ reg1, reg2, bit, label
98
BT \reg1, \reg2, \bit
99
beq \reg1, r0, \label
100
.endm
101
102
/*
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.
105
*
106
* It is safe to use the same register for reg1 & reg2.
107
*/
108
109
.macro BTBNZ reg1, reg2, bit, label
110
BT \reg1, \reg2, \bit
111
bne \reg1, r0, \label
112
.endm
113
114
/*
115
* Tests the bit in reg2 and then compliments the bit in reg2.
116
* The result of the bit test is stored in reg1.
117
*
118
* It is NOT safe to use the same register for reg1 & reg2.
119
*/
120
121
.macro BTC reg1, reg2, bit
122
.if \bit > 31
123
.err
124
.else
125
.if \bit < 16
126
andi \reg1, \reg2, (1 << \bit)
127
xori \reg2, \reg2, (1 << \bit)
128
.else
129
andhi \reg1, \reg2, (1 << (\bit - 16))
130
xorhi \reg2, \reg2, (1 << (\bit - 16))
131
.endif
132
.endif
133
.endm
134
135
/*
136
* Tests the bit in reg2 and then sets the bit in reg2.
137
* The result of the bit test is stored in reg1.
138
*
139
* It is NOT safe to use the same register for reg1 & reg2.
140
*/
141
142
.macro BTS reg1, reg2, bit
143
.if \bit > 31
144
.err
145
.else
146
.if \bit < 16
147
andi \reg1, \reg2, (1 << \bit)
148
ori \reg2, \reg2, (1 << \bit)
149
.else
150
andhi \reg1, \reg2, (1 << (\bit - 16))
151
orhi \reg2, \reg2, (1 << (\bit - 16))
152
.endif
153
.endif
154
.endm
155
156
/*
157
* Tests the bit in reg2 and then resets the bit in reg2.
158
* The result of the bit test is stored in reg1.
159
*
160
* It is NOT safe to use the same register for reg1 & reg2.
161
*/
162
163
.macro BTR reg1, reg2, bit
164
.if \bit > 31
165
.err
166
.else
167
.if \bit < 16
168
andi \reg1, \reg2, (1 << \bit)
169
andi \reg2, \reg2, %lo(~(1 << \bit))
170
.else
171
andhi \reg1, \reg2, (1 << (\bit - 16))
172
andhi \reg2, \reg2, %lo(~(1 << (\bit - 16)))
173
.endif
174
.endif
175
.endm
176
177
/*
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.
181
*
182
* It is NOT safe to use the same register for reg1 & reg2.
183
*/
184
185
.macro BTCBZ reg1, reg2, bit, label
186
BTC \reg1, \reg2, \bit
187
beq \reg1, r0, \label
188
.endm
189
190
/*
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.
194
*
195
* It is NOT safe to use the same register for reg1 & reg2.
196
*/
197
198
.macro BTCBNZ reg1, reg2, bit, label
199
BTC \reg1, \reg2, \bit
200
bne \reg1, r0, \label
201
.endm
202
203
/*
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.
207
*
208
* It is NOT safe to use the same register for reg1 & reg2.
209
*/
210
211
.macro BTSBZ reg1, reg2, bit, label
212
BTS \reg1, \reg2, \bit
213
beq \reg1, r0, \label
214
.endm
215
216
/*
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.
220
*
221
* It is NOT safe to use the same register for reg1 & reg2.
222
*/
223
224
.macro BTSBNZ reg1, reg2, bit, label
225
BTS \reg1, \reg2, \bit
226
bne \reg1, r0, \label
227
.endm
228
229
/*
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.
233
*
234
* It is NOT safe to use the same register for reg1 & reg2.
235
*/
236
237
.macro BTRBZ reg1, reg2, bit, label
238
BTR \reg1, \reg2, \bit
239
bne \reg1, r0, \label
240
.endm
241
242
/*
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.
246
*
247
* It is NOT safe to use the same register for reg1 & reg2.
248
*/
249
250
.macro BTRBNZ reg1, reg2, bit, label
251
BTR \reg1, \reg2, \bit
252
bne \reg1, r0, \label
253
.endm
254
255
/*
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.
258
*
259
* It is safe to use the same register for reg1 & reg2.
260
*/
261
262
.macro TSTBZ reg1, reg2, mask, label
263
ANDI32 \reg1, \reg2, \mask
264
beq \reg1, r0, \label
265
.endm
266
267
/*
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.
270
*
271
* It is safe to use the same register for reg1 & reg2.
272
*/
273
274
.macro TSTBNZ reg1, reg2, mask, label
275
ANDI32 \reg1, \reg2, \mask
276
bne \reg1, r0, \label
277
.endm
278
279
/*
280
* Pushes reg onto the stack.
281
*/
282
283
.macro PUSH reg
284
addi sp, sp, -4
285
stw \reg, 0(sp)
286
.endm
287
288
/*
289
* Pops the top of the stack into reg.
290
*/
291
292
.macro POP reg
293
ldw \reg, 0(sp)
294
addi sp, sp, 4
295
.endm
296
297
298
#endif /* _ASM_NIOS2_ASMMACROS_H */
299
300