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