Lines Matching +full:- +full:s
1 //===-- udivmoddi4.c - Implement __udivmoddi4 -----------------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
18 // Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide
22 // warn-as-error
38 if (n.s.high == 0) { in __udivmoddi4()
39 if (d.s.high == 0) { in __udivmoddi4()
41 // --- in __udivmoddi4()
44 *rem = n.s.low % d.s.low; in __udivmoddi4()
45 return n.s.low / d.s.low; in __udivmoddi4()
48 // --- in __udivmoddi4()
51 *rem = n.s.low; in __udivmoddi4()
54 // n.s.high != 0 in __udivmoddi4()
55 if (d.s.low == 0) { in __udivmoddi4()
56 if (d.s.high == 0) { in __udivmoddi4()
58 // --- in __udivmoddi4()
61 *rem = n.s.high % d.s.low; in __udivmoddi4()
62 return n.s.high / d.s.low; in __udivmoddi4()
64 // d.s.high != 0 in __udivmoddi4()
65 if (n.s.low == 0) { in __udivmoddi4()
67 // --- in __udivmoddi4()
70 r.s.high = n.s.high % d.s.high; in __udivmoddi4()
71 r.s.low = 0; in __udivmoddi4()
74 return n.s.high / d.s.high; in __udivmoddi4()
77 // --- in __udivmoddi4()
79 if ((d.s.high & (d.s.high - 1)) == 0) /* if d is a power of 2 */ { in __udivmoddi4()
81 r.s.low = n.s.low; in __udivmoddi4()
82 r.s.high = n.s.high & (d.s.high - 1); in __udivmoddi4()
85 return n.s.high >> ctzsi(d.s.high); in __udivmoddi4()
88 // --- in __udivmoddi4()
90 sr = clzsi(d.s.high) - clzsi(n.s.high); in __udivmoddi4()
91 // 0 <= sr <= n_uword_bits - 2 or sr large in __udivmoddi4()
92 if (sr > n_uword_bits - 2) { in __udivmoddi4()
98 // 1 <= sr <= n_uword_bits - 1 in __udivmoddi4()
99 // q.all = n.all << (n_udword_bits - sr); in __udivmoddi4()
100 q.s.low = 0; in __udivmoddi4()
101 q.s.high = n.s.low << (n_uword_bits - sr); in __udivmoddi4()
103 r.s.high = n.s.high >> sr; in __udivmoddi4()
104 r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); in __udivmoddi4()
105 } else /* d.s.low != 0 */ { in __udivmoddi4()
106 if (d.s.high == 0) { in __udivmoddi4()
108 // --- in __udivmoddi4()
110 if ((d.s.low & (d.s.low - 1)) == 0) /* if d is a power of 2 */ { in __udivmoddi4()
112 *rem = n.s.low & (d.s.low - 1); in __udivmoddi4()
113 if (d.s.low == 1) in __udivmoddi4()
115 sr = ctzsi(d.s.low); in __udivmoddi4()
116 q.s.high = n.s.high >> sr; in __udivmoddi4()
117 q.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); in __udivmoddi4()
121 // --- in __udivmoddi4()
123 sr = 1 + n_uword_bits + clzsi(d.s.low) - clzsi(n.s.high); in __udivmoddi4()
124 // 2 <= sr <= n_udword_bits - 1 in __udivmoddi4()
125 // q.all = n.all << (n_udword_bits - sr); in __udivmoddi4()
128 q.s.low = 0; in __udivmoddi4()
129 q.s.high = n.s.low; in __udivmoddi4()
130 r.s.high = 0; in __udivmoddi4()
131 r.s.low = n.s.high; in __udivmoddi4()
132 } else if (sr < n_uword_bits) /* 2 <= sr <= n_uword_bits - 1 */ { in __udivmoddi4()
133 q.s.low = 0; in __udivmoddi4()
134 q.s.high = n.s.low << (n_uword_bits - sr); in __udivmoddi4()
135 r.s.high = n.s.high >> sr; in __udivmoddi4()
136 r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); in __udivmoddi4()
137 } else /* n_uword_bits + 1 <= sr <= n_udword_bits - 1 */ { in __udivmoddi4()
138 q.s.low = n.s.low << (n_udword_bits - sr); in __udivmoddi4()
139 q.s.high = (n.s.high << (n_udword_bits - sr)) | in __udivmoddi4()
140 (n.s.low >> (sr - n_uword_bits)); in __udivmoddi4()
141 r.s.high = 0; in __udivmoddi4()
142 r.s.low = n.s.high >> (sr - n_uword_bits); in __udivmoddi4()
146 // --- in __udivmoddi4()
148 sr = clzsi(d.s.high) - clzsi(n.s.high); in __udivmoddi4()
149 // 0 <= sr <= n_uword_bits - 1 or sr large in __udivmoddi4()
150 if (sr > n_uword_bits - 1) { in __udivmoddi4()
157 // q.all = n.all << (n_udword_bits - sr); in __udivmoddi4()
158 q.s.low = 0; in __udivmoddi4()
160 q.s.high = n.s.low; in __udivmoddi4()
161 r.s.high = 0; in __udivmoddi4()
162 r.s.low = n.s.high; in __udivmoddi4()
164 q.s.high = n.s.low << (n_uword_bits - sr); in __udivmoddi4()
165 r.s.high = n.s.high >> sr; in __udivmoddi4()
166 r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); in __udivmoddi4()
172 // q.all = n.all << (n_udword_bits - sr); in __udivmoddi4()
174 // 1 <= sr <= n_udword_bits - 1 in __udivmoddi4()
176 for (; sr > 0; --sr) { in __udivmoddi4()
178 r.s.high = (r.s.high << 1) | (r.s.low >> (n_uword_bits - 1)); in __udivmoddi4()
179 r.s.low = (r.s.low << 1) | (q.s.high >> (n_uword_bits - 1)); in __udivmoddi4()
180 q.s.high = (q.s.high << 1) | (q.s.low >> (n_uword_bits - 1)); in __udivmoddi4()
181 q.s.low = (q.s.low << 1) | carry; in __udivmoddi4()
185 // r.all -= d.all; in __udivmoddi4()
188 const di_int s = (di_int)(d.all - r.all - 1) >> (n_udword_bits - 1); in __udivmoddi4() local
189 carry = s & 1; in __udivmoddi4()
190 r.all -= d.all & s; in __udivmoddi4()