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 */ 310