Home | History | Annotate | Download | only in libc
      1 /*
      2  * Copyright (c) 2009 ARM Ltd
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. The name of the company may not be used to endorse or promote
     14  *    products derived from this software without specific prior written
     15  *    permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     22  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #ifndef ARM_ASM__H
     30 #define ARM_ASM__H
     31 
     32 #include "acle-compat.h"
     33 
     34 #if __ARM_ARCH >= 7 && defined (__ARM_ARCH_ISA_ARM)
     35 # define _ISA_ARM_7
     36 #endif
     37 
     38 #if __ARM_ARCH >= 6 && defined (__ARM_ARCH_ISA_ARM)
     39 # define _ISA_ARM_6
     40 #endif
     41 
     42 #if __ARM_ARCH >= 5
     43 # define _ISA_ARM_5
     44 #endif
     45 
     46 #if __ARM_ARCH >= 4 && __ARM_ARCH_ISA_THUMB >= 1
     47 # define _ISA_ARM_4T
     48 #endif
     49 
     50 #if __ARM_ARCH >= 4 && __ARM_ARCH_ISA_THUMB == 0
     51 # define _ISA_ARM_4
     52 #endif
     53 
     54 
     55 #if __ARM_ARCH_ISA_THUMB >= 2
     56 # define _ISA_THUMB_2
     57 #endif
     58 
     59 #if __ARM_ARCH_ISA_THUMB >= 1
     60 # define _ISA_THUMB_1
     61 #endif
     62 
     63 
     64 /* Now some macros for common instruction sequences.  */
     65 #ifdef __ASSEMBLER__
     66 .macro  RETURN     cond=
     67 #if defined (_ISA_ARM_4T) || defined (_ISA_THUMB_1)
     68 	bx\cond	lr
     69 #else
     70 	mov\cond pc, lr
     71 #endif
     72 .endm
     73 
     74 .macro optpld	base, offset=#0
     75 #if defined (_ISA_ARM_7)
     76 	pld	[\base, \offset]
     77 #endif
     78 .endm
     79 
     80 #else
     81 asm(".macro  RETURN	cond=\n\t"
     82 #if defined (_ISA_ARM_4T) || defined (_ISA_THUMB_1)
     83     "bx\\cond	lr\n\t"
     84 #else
     85     "mov\\cond	pc, lr\n\t"
     86 #endif
     87     ".endm"
     88     );
     89 
     90 asm(".macro optpld	base, offset=#0\n\t"
     91 #if defined (_ISA_ARM_7)
     92     "pld	[\\base, \\offset]\n\t"
     93 #endif
     94     ".endm"
     95     );
     96 #endif
     97 
     98 #endif /* ARM_ASM__H */
     99