/* * Copyright (C) 1989-2013 Free Software Foundation, Inc. * * SPDX-License-Identifier: GPL-2.0+ */ #ifndef __ASM_LIBGCC_H #define __ASM_LIBGCC_H #define UNITS_PER_WORD 4 /* for ARC */ #define BITS_PER_UNIT 8 /* for ARC */ #define W_TYPE_SIZE (4 * BITS_PER_UNIT) #define MIN_UNITS_PER_WORD UNITS_PER_WORD /* Work out the largest "word" size that we can deal with on this target. */ #if MIN_UNITS_PER_WORD > 4 # define LIBGCC2_MAX_UNITS_PER_WORD 8 #elif (MIN_UNITS_PER_WORD > 2 \ || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4)) # define LIBGCC2_MAX_UNITS_PER_WORD 4 #else # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD #endif /* Work out what word size we are using for this compilation. The value can be set on the command line. */ #ifndef LIBGCC2_UNITS_PER_WORD #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD #endif typedef int QItype __attribute__ ((mode (QI))); typedef unsigned int UQItype __attribute__ ((mode (QI))); typedef int HItype __attribute__ ((mode (HI))); typedef unsigned int UHItype __attribute__ ((mode (HI))); #if MIN_UNITS_PER_WORD > 1 /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1. */ typedef int SItype __attribute__ ((mode (SI))); typedef unsigned int USItype __attribute__ ((mode (SI))); #if __SIZEOF_LONG_LONG__ > 4 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2. */ typedef int DItype __attribute__ ((mode (DI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); #if MIN_UNITS_PER_WORD > 4 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4. */ typedef int TItype __attribute__ ((mode (TI))); typedef unsigned int UTItype __attribute__ ((mode (TI))); #endif #endif #endif #if LIBGCC2_UNITS_PER_WORD == 8 #define W_TYPE_SIZE (8 * BITS_PER_UNIT) #define Wtype DItype #define UWtype UDItype #define HWtype DItype #define UHWtype UDItype #define DWtype TItype #define UDWtype UTItype #ifdef LIBGCC2_GNU_PREFIX #define __NW(a,b) __gnu_ ## a ## di ## b #define __NDW(a,b) __gnu_ ## a ## ti ## b #else #define __NW(a,b) __ ## a ## di ## b #define __NDW(a,b) __ ## a ## ti ## b #endif #elif LIBGCC2_UNITS_PER_WORD == 4 #define W_TYPE_SIZE (4 * BITS_PER_UNIT) #define Wtype SItype #define UWtype USItype #define HWtype SItype #define UHWtype USItype #define DWtype DItype #define UDWtype UDItype #ifdef LIBGCC2_GNU_PREFIX #define __NW(a,b) __gnu_ ## a ## si ## b #define __NDW(a,b) __gnu_ ## a ## di ## b #else #define __NW(a,b) __ ## a ## si ## b #define __NDW(a,b) __ ## a ## di ## b #endif #elif LIBGCC2_UNITS_PER_WORD == 2 #define W_TYPE_SIZE (2 * BITS_PER_UNIT) #define Wtype HItype #define UWtype UHItype #define HWtype HItype #define UHWtype UHItype #define DWtype SItype #define UDWtype USItype #ifdef LIBGCC2_GNU_PREFIX #define __NW(a,b) __gnu_ ## a ## hi ## b #define __NDW(a,b) __gnu_ ## a ## si ## b #else #define __NW(a,b) __ ## a ## hi ## b #define __NDW(a,b) __ ## a ## si ## b #endif #else #define W_TYPE_SIZE BITS_PER_UNIT #define Wtype QItype #define UWtype UQItype #define HWtype QItype #define UHWtype UQItype #define DWtype HItype #define UDWtype UHItype #ifdef LIBGCC2_GNU_PREFIX #define __NW(a,b) __gnu_ ## a ## qi ## b #define __NDW(a,b) __gnu_ ## a ## hi ## b #else #define __NW(a,b) __ ## a ## qi ## b #define __NDW(a,b) __ ## a ## hi ## b #endif #endif typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ struct DWstruct {Wtype high, low;}; #else struct DWstruct {Wtype low, high;}; #endif /* We need this union to unpack/pack DImode values, since we don't have any arithmetic yet. Incoming DImode parameters are stored into the `ll' field, and the unpacked result is read from the struct `s'. */ typedef union { struct DWstruct s; DWtype ll; } DWunion; #endif /* __ASM_LIBGCC_H */