PageRenderTime 27ms CodeModel.GetById 20ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/unicore32/include/asm/assembler.h

https://bitbucket.org/ndreys/linux-sunxi
C++ Header | 131 lines | 99 code | 12 blank | 20 comment | 2 complexity | 5ef215a3986424a91a89553d71ae25ec MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  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