Home | History | Annotate | Download | only in lib
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (C) 1989-2013 Free Software Foundation, Inc.
      4  */
      5 
      6 #ifndef __ASM_LIBGCC_H
      7 #define __ASM_LIBGCC_H
      8 
      9 #define UNITS_PER_WORD 4	/* for ARC */
     10 #define BITS_PER_UNIT 8		/* for ARC */
     11 
     12 #define W_TYPE_SIZE (4 * BITS_PER_UNIT)
     13 
     14 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
     15 
     16 /* Work out the largest "word" size that we can deal with on this target.  */
     17 #if MIN_UNITS_PER_WORD > 4
     18 # define LIBGCC2_MAX_UNITS_PER_WORD 8
     19 #elif (MIN_UNITS_PER_WORD > 2 \
     20        || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4))
     21 # define LIBGCC2_MAX_UNITS_PER_WORD 4
     22 #else
     23 # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD
     24 #endif
     25 
     26 /* Work out what word size we are using for this compilation.
     27    The value can be set on the command line.  */
     28 #ifndef LIBGCC2_UNITS_PER_WORD
     29 #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD
     30 #endif
     31 
     32 typedef		 int QItype	__attribute__ ((mode (QI)));
     33 typedef unsigned int UQItype	__attribute__ ((mode (QI)));
     34 typedef		 int HItype	__attribute__ ((mode (HI)));
     35 typedef unsigned int UHItype	__attribute__ ((mode (HI)));
     36 #if MIN_UNITS_PER_WORD > 1
     37 /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1.  */
     38 typedef 	 int SItype	__attribute__ ((mode (SI)));
     39 typedef unsigned int USItype	__attribute__ ((mode (SI)));
     40 #if __SIZEOF_LONG_LONG__ > 4
     41 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2.  */
     42 typedef		 int DItype	__attribute__ ((mode (DI)));
     43 typedef unsigned int UDItype	__attribute__ ((mode (DI)));
     44 #if MIN_UNITS_PER_WORD > 4
     45 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4.  */
     46 typedef		 int TItype	__attribute__ ((mode (TI)));
     47 typedef unsigned int UTItype	__attribute__ ((mode (TI)));
     48 #endif
     49 #endif
     50 #endif
     51 
     52 #if LIBGCC2_UNITS_PER_WORD == 8
     53 #define W_TYPE_SIZE (8 * BITS_PER_UNIT)
     54 #define Wtype	DItype
     55 #define UWtype	UDItype
     56 #define HWtype	DItype
     57 #define UHWtype	UDItype
     58 #define DWtype	TItype
     59 #define UDWtype	UTItype
     60 #ifdef LIBGCC2_GNU_PREFIX
     61 #define __NW(a,b)	__gnu_ ## a ## di ## b
     62 #define __NDW(a,b)	__gnu_ ## a ## ti ## b
     63 #else
     64 #define __NW(a,b)	__ ## a ## di ## b
     65 #define __NDW(a,b)	__ ## a ## ti ## b
     66 #endif
     67 #elif LIBGCC2_UNITS_PER_WORD == 4
     68 #define W_TYPE_SIZE (4 * BITS_PER_UNIT)
     69 #define Wtype	SItype
     70 #define UWtype	USItype
     71 #define HWtype	SItype
     72 #define UHWtype	USItype
     73 #define DWtype	DItype
     74 #define UDWtype	UDItype
     75 #ifdef LIBGCC2_GNU_PREFIX
     76 #define __NW(a,b)	__gnu_ ## a ## si ## b
     77 #define __NDW(a,b)	__gnu_ ## a ## di ## b
     78 #else
     79 #define __NW(a,b)	__ ## a ## si ## b
     80 #define __NDW(a,b)	__ ## a ## di ## b
     81 #endif
     82 #elif LIBGCC2_UNITS_PER_WORD == 2
     83 #define W_TYPE_SIZE (2 * BITS_PER_UNIT)
     84 #define Wtype	HItype
     85 #define UWtype	UHItype
     86 #define HWtype	HItype
     87 #define UHWtype	UHItype
     88 #define DWtype	SItype
     89 #define UDWtype	USItype
     90 #ifdef LIBGCC2_GNU_PREFIX
     91 #define __NW(a,b)	__gnu_ ## a ## hi ## b
     92 #define __NDW(a,b)	__gnu_ ## a ## si ## b
     93 #else
     94 #define __NW(a,b)	__ ## a ## hi ## b
     95 #define __NDW(a,b)	__ ## a ## si ## b
     96 #endif
     97 #else
     98 #define W_TYPE_SIZE BITS_PER_UNIT
     99 #define Wtype	QItype
    100 #define UWtype  UQItype
    101 #define HWtype	QItype
    102 #define UHWtype	UQItype
    103 #define DWtype	HItype
    104 #define UDWtype	UHItype
    105 #ifdef LIBGCC2_GNU_PREFIX
    106 #define __NW(a,b)	__gnu_ ## a ## qi ## b
    107 #define __NDW(a,b)	__gnu_ ## a ## hi ## b
    108 #else
    109 #define __NW(a,b)	__ ## a ## qi ## b
    110 #define __NDW(a,b)	__ ## a ## hi ## b
    111 #endif
    112 #endif
    113 
    114 typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__)));
    115 
    116 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
    117 	struct DWstruct {Wtype high, low;};
    118 #else
    119 	struct DWstruct {Wtype low, high;};
    120 #endif
    121 
    122 /* We need this union to unpack/pack DImode values, since we don't have
    123    any arithmetic yet.  Incoming DImode parameters are stored into the
    124    `ll' field, and the unpacked result is read from the struct `s'.  */
    125 
    126 typedef union {
    127 	struct DWstruct s;
    128 	DWtype ll;
    129 } DWunion;
    130 
    131 #endif /* __ASM_LIBGCC_H */
    132