xref: /rk3399_rockchip-uboot/arch/arm/include/asm/assembler.h (revision c0db6f8d202a4f9a926c4f5792e1eefb774356e1)
1d8834a13SMatthias Weisser /*
2d8834a13SMatthias Weisser  *  arch/arm/include/asm/assembler.h
3d8834a13SMatthias Weisser  *
4d8834a13SMatthias Weisser  *  Copyright (C) 1996-2000 Russell King
5d8834a13SMatthias Weisser  *
6d8834a13SMatthias Weisser  * This program is free software; you can redistribute it and/or modify
7d8834a13SMatthias Weisser  * it under the terms of the GNU General Public License version 2 as
8d8834a13SMatthias Weisser  * published by the Free Software Foundation.
9d8834a13SMatthias Weisser  *
10d8834a13SMatthias Weisser  *  This file contains arm architecture specific defines
11d8834a13SMatthias Weisser  *  for the different processors.
12d8834a13SMatthias Weisser  *
13d8834a13SMatthias Weisser  *  Do not include any C declarations in this file - it is included by
14d8834a13SMatthias Weisser  *  assembler source.
15d8834a13SMatthias Weisser  */
16d8834a13SMatthias Weisser 
1775d7a0d7SStefan Agner #include <config.h>
18*c0db6f8dSMarek Vasut #include <asm/unified.h>
1975d7a0d7SStefan Agner 
20d8834a13SMatthias Weisser /*
21d8834a13SMatthias Weisser  * Endian independent macros for shifting bytes within registers.
22d8834a13SMatthias Weisser  */
23d8834a13SMatthias Weisser #ifndef __ARMEB__
2475d7a0d7SStefan Agner #define lspull		lsr
2575d7a0d7SStefan Agner #define lspush		lsl
26d8834a13SMatthias Weisser #define get_byte_0	lsl #0
27d8834a13SMatthias Weisser #define get_byte_1	lsr #8
28d8834a13SMatthias Weisser #define get_byte_2	lsr #16
29d8834a13SMatthias Weisser #define get_byte_3	lsr #24
30d8834a13SMatthias Weisser #define put_byte_0	lsl #0
31d8834a13SMatthias Weisser #define put_byte_1	lsl #8
32d8834a13SMatthias Weisser #define put_byte_2	lsl #16
33d8834a13SMatthias Weisser #define put_byte_3	lsl #24
34d8834a13SMatthias Weisser #else
3575d7a0d7SStefan Agner #define lspull		lsl
3675d7a0d7SStefan Agner #define lspush		lsr
37d8834a13SMatthias Weisser #define get_byte_0	lsr #24
38d8834a13SMatthias Weisser #define get_byte_1	lsr #16
39d8834a13SMatthias Weisser #define get_byte_2	lsr #8
40d8834a13SMatthias Weisser #define get_byte_3      lsl #0
41d8834a13SMatthias Weisser #define put_byte_0	lsl #24
42d8834a13SMatthias Weisser #define put_byte_1	lsl #16
43d8834a13SMatthias Weisser #define put_byte_2	lsl #8
44d8834a13SMatthias Weisser #define put_byte_3      lsl #0
45d8834a13SMatthias Weisser #endif
46d8834a13SMatthias Weisser 
47d8834a13SMatthias Weisser /*
48d8834a13SMatthias Weisser  * Data preload for architectures that support it
49d8834a13SMatthias Weisser  */
50d8834a13SMatthias Weisser #if defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
51d8834a13SMatthias Weisser 	defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
52d8834a13SMatthias Weisser 	defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || \
53d8834a13SMatthias Weisser 	defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_7A__) || \
54d8834a13SMatthias Weisser 	defined(__ARM_ARCH_7R__)
55d8834a13SMatthias Weisser #define PLD(code...)	code
56d8834a13SMatthias Weisser #else
57d8834a13SMatthias Weisser #define PLD(code...)
58d8834a13SMatthias Weisser #endif
59d8834a13SMatthias Weisser 
6075d7a0d7SStefan Agner 	.irp	c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
6175d7a0d7SStefan Agner 	.macro	ret\c, reg
6275d7a0d7SStefan Agner #if defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__)
6375d7a0d7SStefan Agner 	mov\c	pc, \reg
6475d7a0d7SStefan Agner #else
6575d7a0d7SStefan Agner 	.ifeqs	"\reg", "lr"
6675d7a0d7SStefan Agner 	bx\c	\reg
6775d7a0d7SStefan Agner 	.else
6875d7a0d7SStefan Agner 	mov\c	pc, \reg
6975d7a0d7SStefan Agner 	.endif
7075d7a0d7SStefan Agner #endif
7175d7a0d7SStefan Agner 	.endm
7275d7a0d7SStefan Agner 	.endr
7375d7a0d7SStefan Agner 
74d8834a13SMatthias Weisser /*
7575d7a0d7SStefan Agner  * Cache aligned, used for optimized memcpy/memset
7675d7a0d7SStefan Agner  * In the kernel this is only enabled for Feroceon CPU's...
7775d7a0d7SStefan Agner  * We disable it especially for Thumb builds since those instructions
7875d7a0d7SStefan Agner  * are not made in a Thumb ready way...
79d8834a13SMatthias Weisser  */
8075d7a0d7SStefan Agner #ifdef CONFIG_SYS_THUMB_BUILD
8175d7a0d7SStefan Agner #define CALGN(code...)
8275d7a0d7SStefan Agner #else
83d8834a13SMatthias Weisser #define CALGN(code...) code
8475d7a0d7SStefan Agner #endif
85