linux/arch/unicore32/include/asm/assembler.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * linux/arch/unicore32/include/asm/assembler.h
   4 *
   5 * Code specific to PKUnity SoC and UniCore ISA
   6 *
   7 * Copyright (C) 2001-2010 GUAN Xue-tao
   8 *
   9 *  Do not include any C declarations in this file - it is included by
  10 *  assembler source.
  11 */
  12#ifndef __ASSEMBLY__
  13#error "Only include this from assembly code"
  14#endif
  15
  16#include <asm/ptrace.h>
  17
  18/*
  19 * Little Endian independent macros for shifting bytes within registers.
  20 */
  21#define pull            >>
  22#define push            <<
  23#define get_byte_0      << #0
  24#define get_byte_1      >> #8
  25#define get_byte_2      >> #16
  26#define get_byte_3      >> #24
  27#define put_byte_0      << #0
  28#define put_byte_1      << #8
  29#define put_byte_2      << #16
  30#define put_byte_3      << #24
  31
  32#define cadd            cmpadd
  33#define cand            cmpand
  34#define csub            cmpsub
  35#define cxor            cmpxor
  36
  37/*
  38 * Enable and disable interrupts
  39 */
  40        .macro disable_irq, temp
  41        mov     \temp, asr
  42        andn     \temp, \temp, #0xFF
  43        or      \temp, \temp, #PSR_I_BIT | PRIV_MODE
  44        mov.a   asr, \temp
  45        .endm
  46
  47        .macro enable_irq, temp
  48        mov     \temp, asr
  49        andn     \temp, \temp, #0xFF
  50        or      \temp, \temp, #PRIV_MODE
  51        mov.a   asr, \temp
  52        .endm
  53
  54#define USER(x...)                              \
  559999:   x;                                      \
  56        .pushsection __ex_table, "a";           \
  57        .align  3;                              \
  58        .long   9999b, 9001f;                   \
  59        .popsection
  60
  61        .macro  notcond, cond, nexti = .+8
  62        .ifc    \cond, eq
  63                bne     \nexti
  64        .else;  .ifc    \cond, ne
  65                beq     \nexti
  66        .else;  .ifc    \cond, ea
  67                bub     \nexti
  68        .else;  .ifc    \cond, ub
  69                bea     \nexti
  70        .else;  .ifc    \cond, fs
  71                bns     \nexti
  72        .else;  .ifc    \cond, ns
  73                bfs     \nexti
  74        .else;  .ifc    \cond, fv
  75                bnv     \nexti
  76        .else;  .ifc    \cond, nv
  77                bfv     \nexti
  78        .else;  .ifc    \cond, ua
  79                beb     \nexti
  80        .else;  .ifc    \cond, eb
  81                bua     \nexti
  82        .else;  .ifc    \cond, eg
  83                bsl     \nexti
  84        .else;  .ifc    \cond, sl
  85                beg     \nexti
  86        .else;  .ifc    \cond, sg
  87                bel     \nexti
  88        .else;  .ifc    \cond, el
  89                bsg     \nexti
  90        .else;  .ifnc   \cond, al
  91                .error  "Unknown cond in notcond macro argument"
  92        .endif; .endif; .endif; .endif; .endif; .endif; .endif
  93        .endif; .endif; .endif; .endif; .endif; .endif; .endif
  94        .endif
  95        .endm
  96
  97        .macro  usracc, instr, reg, ptr, inc, cond, rept, abort
  98        .rept   \rept
  99        notcond \cond, .+8
 1009999 :
 101        .if     \inc == 1
 102        \instr\()b.u \reg, [\ptr], #\inc
 103        .elseif \inc == 4
 104        \instr\()w.u \reg, [\ptr], #\inc
 105        .else
 106        .error  "Unsupported inc macro argument"
 107        .endif
 108
 109        .pushsection __ex_table, "a"
 110        .align  3
 111        .long   9999b, \abort
 112        .popsection
 113        .endr
 114        .endm
 115
 116        .macro  strusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f
 117        usracc  st, \reg, \ptr, \inc, \cond, \rept, \abort
 118        .endm
 119
 120        .macro  ldrusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f
 121        usracc  ld, \reg, \ptr, \inc, \cond, \rept, \abort
 122        .endm
 123
 124        .macro  nop8
 125        .rept   8
 126                nop
 127        .endr
 128        .endm
 129