OSDN Git Service

8ca9484dc949437a936de6cce31b4340301beef4
[pf3gnuchains/gcc-fork.git] / gcc / config / stormy16 / stormy16-lib2.c
1 typedef          int HItype             __attribute__ ((mode (HI)));
2 typedef          int SItype             __attribute__ ((mode (SI)));
3 typedef unsigned int USItype            __attribute__ ((mode (SI)));
4
5 typedef int word_type                   __attribute__ ((mode (__word__)));
6
7 USItype
8 udivmodsi4(USItype num, USItype den, word_type modwanted)
9 {
10   USItype bit = 1;
11   USItype res = 0;
12
13   while (den < num && bit && !(den & (1L<<31)))
14     {
15       den <<=1;
16       bit <<=1;
17     }
18   while (bit)
19     {
20       if (num >= den)
21         {
22           num -= den;
23           res |= bit;
24         }
25       bit >>=1;
26       den >>=1;
27     }
28   if (modwanted) return num;
29   return res;
30 }
31
32
33
34 SItype
35 __divsi3 (SItype a, SItype b)
36 {
37   word_type neg = 0;
38   SItype res;
39
40   if (a < 0)
41     {
42       a = -a;
43       neg = !neg;
44     }
45
46   if (b < 0)
47     {
48       b = -b;
49       neg = !neg;
50     }
51
52   res = udivmodsi4 (a, b, 0);
53
54   if (neg)
55     res = -res;
56
57   return res;
58 }
59
60
61
62 SItype
63 __modsi3 (SItype a, SItype b)
64 {
65   word_type neg = 0;
66   SItype res;
67
68   if (a < 0)
69     {
70       a = -a;
71       neg = 1;
72     }
73
74   if (b < 0)
75     b = -b;
76
77   res = udivmodsi4 (a, b, 1);
78
79   if (neg)
80     res = -res;
81
82   return res;
83 }
84
85
86
87
88 SItype
89 __udivsi3 (SItype a, SItype b)
90 {
91   return udivmodsi4 (a, b, 0);
92 }
93
94
95
96 SItype
97 __umodsi3 (SItype a, SItype b)
98 {
99   return udivmodsi4 (a, b, 1);
100 }
101
102 SItype
103 __ashlsi3 (SItype a, SItype b)
104 {
105   word_type i;
106   
107   if (b & 16)
108     a <<= 16;
109   if (b & 8)
110     a <<= 8;
111   for (i = (b & 0x7); i > 0; --i)
112     a <<= 1;
113   return a;
114 }
115
116 SItype
117 __ashrsi3 (SItype a, SItype b)
118 {
119   word_type i;
120   
121   if (b & 16)
122     a >>= 16;
123   if (b & 8)
124     a >>= 8;
125   for (i = (b & 0x7); i > 0; --i)
126     a >>= 1;
127   return a;
128 }
129
130 USItype
131 __lshrsi3 (USItype a, USItype b)
132 {
133   word_type i;
134   
135   if (b & 16)
136     a >>= 16;
137   if (b & 8)
138     a >>= 8;
139   for (i = (b & 0x7); i > 0; --i)
140     a >>= 1;
141   return a;
142 }
143
144 static const unsigned char __popcount_tab[] =
145 {
146   0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
147   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
148   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
149   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
150   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
151   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
152   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
153   3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,
154 };
155
156 int
157 __popcounthi2 (unsigned int x)
158 {
159   unsigned int ret;
160
161   ret = __popcount_tab [x & 0xff];
162   ret += __popcount_tab [(x >> 8) & 0xff];
163
164   return ret;
165 }
166
167 int
168 __parityhi2 (unsigned int x)
169 {
170   x ^= x >> 8;
171   x ^= x >> 4;
172   x &= 0xf;
173   return (0x6996 >> x) & 1;
174 }
175
176 int
177 __ctzhi2 (unsigned int x)
178 {
179   extern int __ctzsi2 (unsigned long);
180   unsigned long y = x;
181
182   return __ctzsi2 (y << 16) - 16;
183 }
184
185 int
186 __clzhi2 (unsigned int x)
187 {
188   extern int __clzsi2 (unsigned long);
189
190   return __clzsi2 (x) - 16;
191 }