linux/arch/xtensa/include/asm/asmmacro.h
<<
>>
Prefs
   1/*
   2 * include/asm-xtensa/asmmacro.h
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 *
   8 * Copyright (C) 2005 Tensilica Inc.
   9 */
  10
  11#ifndef _XTENSA_ASMMACRO_H
  12#define _XTENSA_ASMMACRO_H
  13
  14#include <variant/core.h>
  15
  16/*
  17 * Some little helpers for loops. Use zero-overhead-loops
  18 * where applicable and if supported by the processor.
  19 *
  20 * __loopi ar, at, size, inc
  21 *         ar   register initialized with the start address
  22 *         at   scratch register used by macro
  23 *         size size immediate value
  24 *         inc  increment
  25 *
  26 * __loops ar, as, at, inc_log2[, mask_log2][, cond][, ncond]
  27 *         ar   register initialized with the start address
  28 *         as   register initialized with the size
  29 *         at   scratch register use by macro
  30 *         inc_log2     increment [in log2]
  31 *         mask_log2    mask [in log2]
  32 *         cond         true condition (used in loop'cond')
  33 *         ncond        false condition (used in b'ncond')
  34 *
  35 * __loop  as
  36 *         restart loop. 'as' register must not have been modified!
  37 *
  38 * __endla ar, at, incr
  39 *         ar   start address (modified)
  40 *         as   scratch register used by macro
  41 *         inc  increment
  42 */
  43
  44/*
  45 * loop for given size as immediate
  46 */
  47
  48        .macro  __loopi ar, at, size, incr
  49
  50#if XCHAL_HAVE_LOOPS
  51                movi    \at, ((\size + \incr - 1) / (\incr))
  52                loop    \at, 99f
  53#else
  54                addi    \at, \ar, \size
  55                98:
  56#endif
  57
  58        .endm
  59
  60/*
  61 * loop for given size in register
  62 */
  63
  64        .macro  __loops ar, as, at, incr_log2, mask_log2, cond, ncond
  65
  66#if XCHAL_HAVE_LOOPS
  67                .ifgt \incr_log2 - 1
  68                        addi    \at, \as, (1 << \incr_log2) - 1
  69                        .ifnc \mask_log2,
  70                                extui   \at, \at, \incr_log2, \mask_log2
  71                        .else
  72                                srli    \at, \at, \incr_log2
  73                        .endif
  74                .endif
  75                loop\cond       \at, 99f
  76#else
  77                .ifnc \mask_log2,
  78                        extui   \at, \as, \incr_log2, \mask_log2
  79                .else
  80                        .ifnc \ncond,
  81                                srli    \at, \as, \incr_log2
  82                        .endif
  83                .endif
  84                .ifnc \ncond,
  85                        b\ncond \at, 99f
  86
  87                .endif
  88                .ifnc \mask_log2,
  89                        slli    \at, \at, \incr_log2
  90                        add     \at, \ar, \at
  91                .else
  92                        add     \at, \ar, \as
  93                .endif
  94#endif
  95                98:
  96
  97        .endm
  98
  99/*
 100 * loop from ar to ax
 101 */
 102
 103        .macro  __loopt ar, as, at, incr_log2
 104
 105#if XCHAL_HAVE_LOOPS
 106                sub     \at, \as, \ar
 107                .ifgt   \incr_log2 - 1
 108                        addi    \at, \at, (1 << \incr_log2) - 1
 109                        srli    \at, \at, \incr_log2
 110                .endif
 111                loop    \at, 99f
 112#else
 113                98:
 114#endif
 115
 116        .endm
 117
 118/*
 119 * restart loop. registers must be unchanged
 120 */
 121
 122        .macro  __loop  as
 123
 124#if XCHAL_HAVE_LOOPS
 125                loop    \as, 99f
 126#else
 127                98:
 128#endif
 129
 130        .endm
 131
 132/*
 133 * end of loop with no increment of the address.
 134 */
 135
 136        .macro  __endl  ar, as
 137#if !XCHAL_HAVE_LOOPS
 138                bltu    \ar, \as, 98b
 139#endif
 140                99:
 141        .endm
 142
 143/*
 144 * end of loop with increment of the address.
 145 */
 146
 147        .macro  __endla ar, as, incr
 148                addi    \ar, \ar, \incr
 149                __endl  \ar \as
 150        .endm
 151
 152
 153#endif /* _XTENSA_ASMMACRO_H */
 154