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...)				\
589999:	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
1039999 :
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
132