131 lines
3.8 KiB
C
131 lines
3.8 KiB
C
/* 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 */
|