xref: /openbmc/u-boot/arch/arm/include/asm/assembler.h (revision 3a649407a49b041ceb826d55b5919dc8297f8965)
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>
18c0db6f8dSMarek 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 
60431afb4eSTom Rini /*
61431afb4eSTom Rini  * We only support cores that support at least Thumb-1 and thus we use
62431afb4eSTom Rini  * 'bx lr'
63431afb4eSTom Rini  */
6475d7a0d7SStefan Agner 	.irp	c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
6575d7a0d7SStefan Agner 	.macro	ret\c, reg
6675d7a0d7SStefan Agner 	.ifeqs	"\reg", "lr"
6775d7a0d7SStefan Agner 	bx\c	\reg
6875d7a0d7SStefan Agner 	.else
6975d7a0d7SStefan Agner 	mov\c	pc, \reg
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  */
80*3a649407STom Rini #if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)
8175d7a0d7SStefan Agner #define CALGN(code...)
8275d7a0d7SStefan Agner #else
83d8834a13SMatthias Weisser #define CALGN(code...) code
8475d7a0d7SStefan Agner #endif
85