]> git.ipfire.org Git - people/ms/u-boot.git/blob - lib_nios/divmod.c
Change directory-specific CFLAGS to use full path
[people/ms/u-boot.git] / lib_nios / divmod.c
1 /*
2 * This file is part of GNU CC.
3 *
4 * GNU CC is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2, or (at your
7 * option) any later version.
8 *
9 * GNU CC is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public
15 * License along with GNU CC; see the file COPYING. If not, write
16 * to the Free Software Foundation, 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 */
19
20
21 #include "math.h"
22
23 USItype udivmodsi4 (USItype num, USItype den, word_type modwanted)
24 {
25 USItype bit = 1;
26 USItype res = 0;
27
28 while (den < num && bit && !(den & (1L << 31))) {
29 den <<= 1;
30 bit <<= 1;
31 }
32 while (bit) {
33 if (num >= den) {
34 num -= den;
35 res |= bit;
36 }
37 bit >>= 1;
38 den >>= 1;
39 }
40 if (modwanted)
41 return num;
42 return res;
43 }
44
45
46 SItype __divsi3 (SItype a, SItype b)
47 {
48 word_type neg = 0;
49 SItype res;
50
51 if (a < 0) {
52 a = -a;
53 neg = !neg;
54 }
55
56 if (b < 0) {
57 b = -b;
58 neg = !neg;
59 }
60
61 res = udivmodsi4 (a, b, 0);
62
63 if (neg)
64 res = -res;
65
66 return res;
67 }
68
69
70 SItype __modsi3 (SItype a, SItype b)
71 {
72 word_type neg = 0;
73 SItype res;
74
75 if (a < 0) {
76 a = -a;
77 neg = 1;
78 }
79
80 if (b < 0)
81 b = -b;
82
83 res = udivmodsi4 (a, b, 1);
84
85 if (neg)
86 res = -res;
87
88 return res;
89 }
90
91
92 SItype __udivsi3 (SItype a, SItype b)
93 {
94 return udivmodsi4 (a, b, 0);
95 }
96
97
98 SItype __umodsi3 (SItype a, SItype b)
99 {
100 return udivmodsi4 (a, b, 1);
101 }