| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Copyright (C) 1989-2013 Free Software Foundation, Inc. |
| */ |
| |
| #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 */ |