Home | History | Annotate | Line # | Download | only in include
asm.h revision 1.14.10.1
      1 /*	$NetBSD: asm.h,v 1.14.10.1 2012/11/28 22:40:28 matt Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1990 The Regents of the University of California.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * William Jolitz.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. Neither the name of the University nor the names of its contributors
     19  *    may be used to endorse or promote products derived from this software
     20  *    without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32  * SUCH DAMAGE.
     33  *
     34  *	from: @(#)asm.h	5.5 (Berkeley) 5/7/91
     35  */
     36 
     37 #ifndef _ARM32_ASM_H_
     38 #define _ARM32_ASM_H_
     39 
     40 #include <arm/cdefs.h>
     41 
     42 #define	__BIT(n)	(1 << (n))
     43 #define __BITS(hi,lo)	((~((~0)<<((hi)+1)))&((~0)<<(lo)))
     44 
     45 #define _C_LABEL(x)	x
     46 #define	_ASM_LABEL(x)	x
     47 
     48 #ifdef __STDC__
     49 # define __CONCAT(x,y)	x ## y
     50 # define __STRING(x)	#x
     51 #else
     52 # define __CONCAT(x,y)	x/**/y
     53 # define __STRING(x)	"x"
     54 #endif
     55 
     56 #ifndef _ALIGN_TEXT
     57 # define _ALIGN_TEXT .align 0
     58 #endif
     59 
     60 /*
     61  * gas/arm uses @ as a single comment character and thus cannot be used here
     62  * Instead it recognised the # instead of an @ symbols in .type directives
     63  * We define a couple of macros so that assembly code will not be dependent
     64  * on one or the other.
     65  */
     66 #define _ASM_TYPE_FUNCTION	%function
     67 #define _ASM_TYPE_OBJECT	%object
     68 #ifdef __thumb__
     69 #define _ENTRY(x) \
     70 	.text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; .thumb_func; x:
     71 #else
     72 #define _ENTRY(x) \
     73 	.text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x:
     74 #endif
     75 #define	_END(x)		.size x,.-x
     76 
     77 #ifdef GPROF
     78 # define _PROF_PROLOGUE	\
     79 	mov ip, lr; bl __mcount
     80 #else
     81 # define _PROF_PROLOGUE
     82 #endif
     83 
     84 #define	ENTRY(y)	_ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
     85 #define	ENTRY_NP(y)	_ENTRY(_C_LABEL(y))
     86 #define	END(y)		_END(_C_LABEL(y))
     87 #define	ASENTRY(y)	_ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
     88 #define	ASENTRY_NP(y)	_ENTRY(_ASM_LABEL(y))
     89 #define	ASEND(y)	_END(_ASM_LABEL(y))
     90 
     91 #define	ASMSTR		.asciz
     92 
     93 #if defined(PIC)
     94 #ifdef __thumb__
     95 #define	PLT_SYM(x)	x
     96 #define	GOT_SYM(x)	PIC_SYM(x, GOTOFF)
     97 #define	GOT_GET(x,got,sym)	\
     98 	ldr	x, sym;		\
     99 	add	x, got;		\
    100 	ldr	x, [x]
    101 #else
    102 #define	PLT_SYM(x)	PIC_SYM(x, PLT)
    103 #define	GOT_SYM(x)	PIC_SYM(x, GOT)
    104 #define	GOT_GET(x,got,sym)	\
    105 	ldr	x, sym;		\
    106 	ldr	x, [x, got]
    107 #endif /* __thumb__ */
    108 
    109 #define	GOT_INIT(got,gotsym,pclabel) \
    110 	ldr	got, gotsym;	\
    111 	add	got, got, pc;	\
    112 	pclabel:
    113 #define	GOT_INITSYM(gotsym,pclabel) \
    114 	gotsym: .word _C_LABEL(_GLOBAL_OFFSET_TABLE_) + (. - (pclabel+4))
    115 
    116 #ifdef __STDC__
    117 #define	PIC_SYM(x,y)	x ## ( ## y ## )
    118 #else
    119 #define	PIC_SYM(x,y)	x/**/(/**/y/**/)
    120 #endif
    121 
    122 #else
    123 #define	PLT_SYM(x)	x
    124 #define	GOT_SYM(x)	x
    125 #define	GOT_GET(x,got,sym)	\
    126 	ldr	x, sym;
    127 #define	GOT_INIT(got,gotsym,pclabel)
    128 #define	GOT_INITSYM(gotsym,pclabel)
    129 #define	PIC_SYM(x,y)	x
    130 #endif	/* PIC */
    131 
    132 #define RCSID(x)	.pushsection ".ident"; .asciz x; .popsection
    133 
    134 #define	WEAK_ALIAS(alias,sym)						\
    135 	.weak alias;							\
    136 	alias = sym
    137 
    138 /*
    139  * STRONG_ALIAS: create a strong alias.
    140  */
    141 #define STRONG_ALIAS(alias,sym)						\
    142 	.globl alias;							\
    143 	alias = sym
    144 
    145 #ifdef __STDC__
    146 #define	WARN_REFERENCES(sym,msg)					\
    147 	.pushsection .gnu.warning. ## sym;				\
    148 	.ascii msg;							\
    149 	.popsection
    150 #else
    151 #define	WARN_REFERENCES(sym,msg)					\
    152 	.pushsection .gnu.warning./**/sym;				\
    153 	.ascii msg;							\
    154 	.popsection
    155 #endif /* __STDC__ */
    156 
    157 #ifdef __thumb__
    158 # define XPUSH		push
    159 # define XPOP		pop
    160 # define XPOPRET	pop	{pc}
    161 #else
    162 # define XPUSH		stmfd	sp!,
    163 # define XPOP		ldmfd	sp!,
    164 # ifdef _ARM_ARCH_5
    165 #  define XPOPRET	ldmfd	sp!, {pc}
    166 # else
    167 #  define XPOPRET	ldmfd	sp!, {lr}; mov pc, lr
    168 # endif
    169 #endif
    170 
    171 #if defined (_ARM_ARCH_4T)
    172 # define RET		bx		lr
    173 # define RETc(c)	__CONCAT(bx,c)	lr
    174 #else
    175 # define RET		mov		pc, lr
    176 # define RETc(c)	__CONCAT(mov,c)	pc, lr
    177 #endif
    178 
    179 .macro lsl a,b,c
    180 	mov	\a, \b, lsl \c
    181 .endm
    182 .macro lsrs a,b,c
    183 	movs	\a, \b, lsr \c
    184 .endm
    185 .macro lsr a,b,c
    186 	mov	\a, \b, lsr \c
    187 .endm
    188 
    189 #endif /* !_ARM_ASM_H_ */
    190