]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/config/m32c/lib2funcs.c
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / m32c / lib2funcs.c
CommitLineData
38b2d076 1/* libgcc routines for R8C/M16C/M32C
99dee823 2 Copyright (C) 2005-2021 Free Software Foundation, Inc.
38b2d076
DD
3 Contributed by Red Hat.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published
748086b7 9 by the Free Software Foundation; either version 3, or (at your
38b2d076
DD
10 option) any later version.
11
38b2d076
DD
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
748086b7
JJ
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
20
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
38b2d076 25
235e1fe8
NC
26typedef int sint32_type __attribute__ ((mode (SI)));
27typedef unsigned int uint32_type __attribute__ ((mode (SI)));
28typedef int word_type __attribute__ ((mode (__word__)));
38b2d076 29
235e1fe8
NC
30uint32_type udivmodsi4 (uint32_type, uint32_type, word_type);
31sint32_type __divsi3 (sint32_type, sint32_type);
32sint32_type __modsi3 (sint32_type, sint32_type);
38b2d076 33
235e1fe8
NC
34uint32_type
35udivmodsi4 (uint32_type num, uint32_type den, word_type modwanted)
38b2d076 36{
235e1fe8
NC
37 uint32_type bit = 1;
38 uint32_type res = 0;
38b2d076
DD
39
40 while (den < num && bit && !(den & (1L << 31)))
41 {
42 den <<= 1;
43 bit <<= 1;
44 }
45 while (bit)
46 {
47 if (num >= den)
48 {
49 num -= den;
50 res |= bit;
51 }
52 bit >>= 1;
53 den >>= 1;
54 }
55 if (modwanted)
56 return num;
57 return res;
58}
59
235e1fe8
NC
60sint32_type
61__divsi3 (sint32_type a, sint32_type b)
38b2d076
DD
62{
63 word_type neg = 0;
235e1fe8 64 sint32_type res;
38b2d076
DD
65
66 if (a < 0)
67 {
68 a = -a;
69 neg = !neg;
70 }
71
72 if (b < 0)
73 {
74 b = -b;
75 neg = !neg;
76 }
77
78 res = udivmodsi4 (a, b, 0);
79
80 if (neg)
81 res = -res;
82
83 return res;
84}
85
235e1fe8
NC
86sint32_type
87__modsi3 (sint32_type a, sint32_type b)
38b2d076
DD
88{
89 word_type neg = 0;
235e1fe8 90 sint32_type res;
38b2d076
DD
91
92 if (a < 0)
93 {
94 a = -a;
95 neg = 1;
96 }
97
98 if (b < 0)
99 b = -b;
100
101 res = udivmodsi4 (a, b, 1);
102
103 if (neg)
104 res = -res;
105
106 return res;
107}
108
235e1fe8
NC
109/* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in
110 m32c.h for why we are creating extra versions of some of the
111 functions defined in libgcc2.c. */
112
113#define LIBGCC2_UNITS_PER_WORD 2
38b2d076 114
235e1fe8
NC
115#define L_clzsi2
116#define L_ctzsi2
117#define L_ffssi2
118#define L_paritysi2
119#define L_popcountsi2
38b2d076 120
235e1fe8 121#include "libgcc2.c"
38b2d076 122
235e1fe8
NC
123uint32_type
124__udivsi3 (uint32_type a, uint32_type b)
38b2d076
DD
125{
126 return udivmodsi4 (a, b, 0);
127}
128
235e1fe8
NC
129uint32_type
130__umoddi3 (uint32_type a, uint32_type b)
38b2d076
DD
131{
132 return udivmodsi4 (a, b, 1);
133}
d04aacfc
NC
134
135/* Returns the number of leading redundant sign bits in X.
136 I.e. the number of bits following the most significant bit which are
137 identical to it. There are no special cases for 0 or other values. */
138
139int
140__clrsbhi2 (word_type x)
141{
142 if (x < 0)
143 x = ~x;
144 if (x == 0)
145 return 15;
146 return __builtin_clz (x) - 1;
147}