linux/arch/nios2/include/asm/asm-macros.h
<<
>>
Prefs
   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