1 /* This file contains 16-bit versions of some of the functions found in
2 libgcc2.c. Really libgcc ought to be moved out of the gcc directory
3 and into its own top level directory, and then split up into multiple
4 files. On this glorious day maybe this code can be integrated into
7 /* Copyright (C) 2005-2021 Free Software Foundation, Inc.
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 3, or (at your option) any later
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 Under Section 7 of GPL version 3, you are granted additional
22 permissions described in the GCC Runtime Library Exception, version
23 3.1, as published by the Free Software Foundation.
25 You should have received a copy of the GNU General Public License and
26 a copy of the GCC Runtime Library Exception along with this program;
27 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
28 <http://www.gnu.org/licenses/>. */
32 #include "coretypes.h"
34 #include "libgcc_tm.h"
36 #ifdef HAVE_GAS_HIDDEN
37 #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
39 #define ATTRIBUTE_HIDDEN
42 #ifndef MIN_UNITS_PER_WORD
43 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
46 #ifndef LIBGCC2_UNITS_PER_WORD
47 # if MIN_UNITS_PER_WORD > 4
48 # define LIBGCC2_UNITS_PER_WORD 8
49 # elif (MIN_UNITS_PER_WORD > 2 \
50 || (MIN_UNITS_PER_WORD > 1 && LONG_LONG_TYPE_SIZE > 32))
51 # define LIBGCC2_UNITS_PER_WORD 4
53 # define LIBGCC2_UNITS_PER_WORD MIN_UNITS_PER_WORD
57 #define word_type Wtype
62 /* These prototypes would normally live in libgcc2.h, but this can
63 only happen once the code below is integrated into libgcc2.c. */
65 extern USItype
udivmodsi4 (USItype
, USItype
, word_type
);
66 extern SItype
__divsi3 (SItype
, SItype
);
67 extern SItype
__modsi3 (SItype
, SItype
);
68 extern SItype
__udivsi3 (SItype
, SItype
);
69 extern SItype
__umodsi3 (SItype
, SItype
);
70 extern SItype
__ashlsi3 (SItype
, SItype
);
71 extern SItype
__ashrsi3 (SItype
, SItype
);
72 extern USItype
__lshrsi3 (USItype
, USItype
);
73 extern int __popcounthi2 (UHWtype
);
74 extern int __parityhi2 (UHWtype
);
75 extern int __clzhi2 (UHWtype
);
76 extern int __ctzhi2 (UHWtype
);
79 #ifdef XSTORMY16_UDIVMODSI4
81 udivmodsi4 (USItype num
, USItype den
, word_type modwanted
)
86 while (den
< num
&& bit
&& !(den
& (1L << 31)))
108 #ifdef XSTORMY16_DIVSI3
110 __divsi3 (SItype a
, SItype b
)
127 res
= udivmodsi4 (a
, b
, 0);
136 #ifdef XSTORMY16_MODSI3
138 __modsi3 (SItype a
, SItype b
)
152 res
= udivmodsi4 (a
, b
, 1);
161 #ifdef XSTORMY16_UDIVSI3
163 __udivsi3 (SItype a
, SItype b
)
165 return udivmodsi4 (a
, b
, 0);
169 #ifdef XSTORMY16_UMODSI3
171 __umodsi3 (SItype a
, SItype b
)
173 return udivmodsi4 (a
, b
, 1);
177 #ifdef XSTORMY16_ASHLSI3
179 __ashlsi3 (SItype a
, SItype b
)
187 for (i
= (b
& 0x7); i
> 0; --i
)
193 #ifdef XSTORMY16_ASHRSI3
195 __ashrsi3 (SItype a
, SItype b
)
203 for (i
= (b
& 0x7); i
> 0; --i
)
209 #ifdef XSTORMY16_LSHRSI3
211 __lshrsi3 (USItype a
, USItype b
)
219 for (i
= (b
& 0x7); i
> 0; --i
)
225 #ifdef XSTORMY16_POPCOUNTHI2
226 /* Returns the number of set bits in X.
227 FIXME: The return type really should be "unsigned int"
228 but this is not how the builtin is prototyped. */
230 __popcounthi2 (UHWtype x
)
234 ret
= __popcount_tab
[x
& 0xff];
235 ret
+= __popcount_tab
[(x
>> 8) & 0xff];
241 #ifdef XSTORMY16_PARITYHI2
242 /* Returns the number of set bits in X, modulo 2.
243 FIXME: The return type really should be "unsigned int"
244 but this is not how the builtin is prototyped. */
247 __parityhi2 (UHWtype x
)
252 return (0x6996 >> x
) & 1;
256 #ifdef XSTORMY16_CLZHI2
257 /* Returns the number of zero-bits from the most significant bit to the
258 first nonzero bit in X. Returns 16 for X == 0. Implemented as a
259 simple for loop in order to save space by removing the need for
261 FIXME: The return type really should be "unsigned int" but this is
262 not how the builtin is prototyped. */
269 unsigned int value
= x
;
271 for (c
= 0, i
= 1 << 15; i
; i
>>= 1, c
++)
278 #ifdef XSTORMY16_CTZHI2
279 /* Returns the number of trailing zero bits in X.
280 FIXME: The return type really should be "signed int" since
281 ctz(0) returns -1, but this is not how the builtin is prototyped. */
286 /* This is cunning. It converts X into a number with only the one bit
287 set, the bit that was the least significant bit in X. From this we
288 can use the count_leading_zeros to compute the number of trailing
292 return 15 - __builtin_clz (x
);
296 #ifdef XSTORMY16_FFSHI2
297 /* Returns one plus the index of the least significant 1-bit of X,
298 or if X is zero, returns zero. FIXME: The return type really
299 should be "unsigned int" but this is not how the builtin is
310 return 16 - __builtin_clz (u
& - u
);
314 #ifdef XSTORMY16_CLRSBHI2
315 /* Returns the number of leading redundant sign bits in X.
316 I.e. the number of bits following the most significant bit which are
317 identical to it. There are no special cases for 0 or other values. */
320 __clrsbhi2 (HWtype x
)
326 return __builtin_clz (x
) - 1;
330 #ifdef XSTORMY16_UCMPSI2
331 /* Performs an unsigned comparison of two 32-bit values: A and B.
332 If A is less than B, then 0 is returned. If A is greater than B,
333 then 2 is returned. Otherwise A and B are equal and 1 is returned. */
336 __ucmpsi2 (USItype a
, USItype b
)
338 word_type hi_a
= (a
>> 16);
339 word_type hi_b
= (b
>> 16);
343 word_type low_a
= (a
& 0xffff);
344 word_type low_b
= (b
& 0xffff);
346 return low_a
< low_b
? 0 : (low_a
> low_b
? 2 : 1);
349 return hi_a
< hi_b
? 0 : 2;
353 #ifdef XSTORMY16_CMPSI2
354 /* Performs an signed comparison of two 32-bit values: A and B.
355 If A is less than B, then 0 is returned. If A is greater than B,
356 then 2 is returned. Otherwise A and B are equal and 1 is returned. */
359 __cmpsi2 (SItype a
, SItype b
)
361 word_type hi_a
= (a
>> 16);
362 word_type hi_b
= (b
>> 16);
366 word_type low_a
= (a
& 0xffff);
367 word_type low_b
= (b
& 0xffff);
369 return low_a
< low_b
? 0 : (low_a
> low_b
? 2 : 1);
372 return hi_a
< hi_b
? 0 : 2;