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