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