treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500
[sfrench/cifs-2.6.git] / arch / unicore32 / include / asm / assembler.h
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...)                              \
55 9999:   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
100 9999 :
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