1 /*
2  * Assembly Macros For MIPS
3  *
4  * Copyright (c) 2006-2021, RT-Thread Development Team
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  *
8  * Change Logs:
9  * Date           Author       Notes
10  * 2019-12-04     Jiaxun Yang  Initial version
11  */
12 
13 
14 #ifndef __ASM_H__
15 #define __ASM_H__
16 
17 #include <rtconfig.h>
18 /*
19  * LEAF - declare leaf routine
20  */
21 #define LEAF(symbol)                        \
22         .globl  symbol;                     \
23         .align  2;                          \
24         .type   symbol,@function;           \
25         .ent    symbol,0;                   \
26 symbol:     .frame  sp,0,ra
27 
28 /*
29  * NESTED - declare nested routine entry point
30  */
31 #define NESTED(symbol, framesize, rpc)      \
32         .globl  symbol;                     \
33         .align  2;                          \
34         .type   symbol,@function;           \
35         .ent    symbol,0;                   \
36 symbol:     .frame  sp, framesize, rpc
37 
38 /*
39  * END - mark end of function
40  */
41 #define END(function)                       \
42         .end    function;                   \
43         .size   function,.-function
44 
45 /*
46  * EXPORT - export definition of symbol
47  */
48 #define EXPORT(symbol)                      \
49         .globl  symbol;                     \
50 symbol:
51 
52 /*
53  * FEXPORT - export definition of a function symbol
54  */
55 #define FEXPORT(symbol)                     \
56         .globl  symbol;                     \
57         .type   symbol,@function;           \
58 symbol:
59 
60 /*
61  * Global data declaration with size.
62  */
63 #define EXPORTS(name,sz)        \
64       .globl name;              \
65       .type name,@object;       \
66       .size name,sz;                \
67 name:
68 
69 /*
70  * Weak data declaration with size.
71  */
72 #define WEXPORT(name,sz)        \
73       .weakext name;                \
74       .type name,@object;       \
75       .size name,sz;                \
76 name:
77 
78 /*
79  * Global data reference with size.
80  */
81 #define IMPORT(name, size)      \
82     .extern name,size
83 
84 /*
85  * Global zeroed data.
86  */
87 #define BSS(name,size)          \
88       .type name,@object;       \
89     .comm   name,size
90 
91 /*
92  * Local zeroed data.
93  */
94 #define LBSS(name,size)         \
95       .lcomm    name,size
96 
97 
98 /*
99  * ABS - export absolute symbol
100  */
101 #define ABS(symbol,value)       \
102         .globl  symbol;         \
103 symbol      =   value
104 
105 
106 #define TEXT(msg)               \
107         .pushsection .data;     \
108 8:      .asciiz msg;            \
109         .popsection;
110 
111 
112 #define ENTRY(name)             \
113   .globl name;                  \
114   .align 2;                     \
115   .ent name,0;                  \
116   name##:
117 
118 /*
119  * Macros to handle different pointer/register sizes for 32/64-bit code
120  */
121 #if defined ARCH_MIPS64
122 /*
123  * Size of a register
124  */
125 #define SZREG   8
126 
127 /*
128  * Use the following macros in assemblercode to load/store registers,
129  * pointers etc.
130  */
131 #define REG_S       sd
132 #define REG_L       ld
133 #define REG_SUBU    dsubu
134 #define REG_ADDU    daddu
135 
136 /*
137  * How to add/sub/load/store/shift C int variables.
138  */
139 #define INT_ADD     dadd
140 #define INT_ADDU    daddu
141 #define INT_ADDI    daddi
142 #define INT_ADDIU   daddiu
143 #define INT_SUB     dsub
144 #define INT_SUBU    dsubu
145 #define INT_L       ld
146 #define INT_S       sd
147 #define INT_SLL     dsll
148 #define INT_SLLV    dsllv
149 #define INT_SRL     dsrl
150 #define INT_SRLV    dsrlv
151 #define INT_SRA     dsra
152 #define INT_SRAV    dsrav
153 
154 /*
155  * Use the following macros in assemblercode to load/store registers,
156  * pointers etc.
157  */
158 #define LONG_ADD    dadd
159 #define LONG_ADDU   daddu
160 #define LONG_ADDI   daddi
161 #define LONG_ADDIU  daddiu
162 #define LONG_SUB    dsub
163 #define LONG_SUBU   dsubu
164 #define LONG_L      ld
165 #define LONG_S      sd
166 #define LONG_SP     sdp
167 #define LONG_SLL    dsll
168 #define LONG_SLLV   dsllv
169 #define LONG_SRL    dsrl
170 #define LONG_SRLV   dsrlv
171 #define LONG_SRA    dsra
172 #define LONG_SRAV   dsrav
173 
174 #define LONG        .dword
175 #define LONGSIZE    8
176 #define LONGMASK    7
177 #define LONGLOG     3
178 
179 /*
180  * How to add/sub/load/store/shift pointers.
181  */
182 #define PTR_ADD     dadd
183 #define PTR_ADDU    daddu
184 #define PTR_ADDI    daddi
185 #define PTR_ADDIU   daddiu
186 #define PTR_SUB     dsub
187 #define PTR_SUBU    dsubu
188 #define PTR_L       ld
189 #define PTR_S       sd
190 #define PTR_LA      dla
191 #define PTR_LI      dli
192 #define PTR_SLL     dsll
193 #define PTR_SLLV    dsllv
194 #define PTR_SRL     dsrl
195 #define PTR_SRLV    dsrlv
196 #define PTR_SRA     dsra
197 #define PTR_SRAV    dsrav
198 
199 #define PTR_SCALESHIFT  3
200 
201 #define PTR     .dword
202 #define PTRSIZE     8
203 #define PTRLOG      3
204 
205 #define MFC0        dmfc0
206 #define MTC0        dmtc0
207 
208 #else
209 /*
210  * Size of a register
211  */
212 #define SZREG   4
213 
214 
215 /*
216  * Use the following macros in assemblercode to load/store registers,
217  * pointers etc.
218  */
219 #define REG_S       sw
220 #define REG_L       lw
221 #define REG_SUBU    subu
222 #define REG_ADDU    addu
223 
224 
225 /*
226  * How to add/sub/load/store/shift C int variables.
227  */
228 #define INT_ADD     add
229 #define INT_ADDU    addu
230 #define INT_ADDI    addi
231 #define INT_ADDIU   addiu
232 #define INT_SUB     sub
233 #define INT_SUBU    subu
234 #define INT_L       lw
235 #define INT_S       sw
236 #define INT_SLL     sll
237 #define INT_SLLV    sllv
238 #define INT_SRL     srl
239 #define INT_SRLV    srlv
240 #define INT_SRA     sra
241 #define INT_SRAV    srav
242 
243 
244 
245 /*
246  * How to add/sub/load/store/shift C long variables.
247  */
248 #define LONG_ADD    add
249 #define LONG_ADDU   addu
250 #define LONG_ADDI   addi
251 #define LONG_ADDIU  addiu
252 #define LONG_SUB    sub
253 #define LONG_SUBU   subu
254 #define LONG_L      lw
255 #define LONG_S      sw
256 #define LONG_SLL    sll
257 #define LONG_SLLV   sllv
258 #define LONG_SRL    srl
259 #define LONG_SRLV   srlv
260 #define LONG_SRA    sra
261 #define LONG_SRAV   srav
262 
263 #define LONG        .word
264 #define LONGSIZE    4
265 #define LONGMASK    3
266 #define LONGLOG     2
267 
268 
269 
270 /*
271  * How to add/sub/load/store/shift pointers.
272  */
273 #define PTR_ADD     add
274 #define PTR_ADDU    addu
275 #define PTR_ADDI    addi
276 #define PTR_ADDIU   addiu
277 #define PTR_SUB     sub
278 #define PTR_SUBU    subu
279 #define PTR_L       lw
280 #define PTR_S       sw
281 #define PTR_LA      la
282 #define PTR_SLL     sll
283 #define PTR_SLLV    sllv
284 #define PTR_SRL     srl
285 #define PTR_SRLV    srlv
286 #define PTR_SRA     sra
287 #define PTR_SRAV    srav
288 
289 #define PTR_SCALESHIFT  2
290 
291 #define PTR         .word
292 #define PTRSIZE     4
293 #define PTRLOG      2
294 
295 
296 /*
297  * Some cp0 registers were extended to 64bit for MIPS III.
298  */
299 #define MFC0        mfc0
300 #define MTC0        mtc0
301 
302 #endif
303 
304 #define SSNOP       sll zero, zero, 1
305 
306 #endif /* end of __ASM_H__ */
307