sc_signed.cc (13322:7391057615bd) sc_signed.cc (13325:86323e6cc8ec)
1/*****************************************************************************
2
3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4 more contributor license agreements. See the NOTICE file distributed
5 with this work for additional information regarding copyright ownership.
6 Accellera licenses this file to you under the Apache License, Version 2.0
7 (the "License"); you may not use this file except in compliance with the
8 License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 implied. See the License for the specific language governing
16 permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22 sc_signed.cpp -- Arbitrary precision signed arithmetic.
23
24 This file includes the definitions of sc_signed_bitref,
25 sc_signed_subref, and sc_signed classes. The first two
26 classes are proxy classes to reference one bit and a range
27 of bits of a sc_signed number, respectively. This file also
28 includes sc_nbcommon.cpp and sc_nbfriends.cpp, which
29 contain the definitions shared by sc_unsigned.
30
31 Original Author: Ali Dasdan, Synopsys, Inc.
32
33 *****************************************************************************/
34
35/*****************************************************************************
36
37 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
38 changes you are making here.
39
40 Name, Affiliation, Date:
41 Description of Modification:
42
43 *****************************************************************************/
44
45
46// $Log: sc_signed.cpp,v $
47// Revision 1.6 2011/02/18 20:19:15 acg
48// Andy Goodrich: updating Copyright notice.
49//
50// Revision 1.5 2008/12/10 20:38:45 acg
51// Andy Goodrich: fixed conversion of double values to the digits vector.
52// The bits above the radix were not being masked off.
53//
54// Revision 1.4 2008/06/19 17:47:56 acg
55// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
56//
57// Revision 1.3 2008/04/29 21:20:41 acg
58// Andy Goodrich: added mask to first word transferred when processing
59// a negative sc_signed value in sc_signed::concat_get_data().
60//
61// Revision 1.2 2007/11/04 21:27:00 acg
62// Andy Goodrich: changes to make sure the proper value is returned from
63// concat_get_data().
64//
65// Revision 1.1.1.1 2006/12/15 20:20:05 acg
66// SystemC 2.3
67//
68// Revision 1.5 2006/10/23 19:32:47 acg
69// Andy Goodrich: further fix for incorrect value being returned from
70// concat_get_data. This one is in the non-aligned value code.
71//
72// Revision 1.3 2006/01/13 18:49:32 acg
73// Added $Log command so that CVS check in comments are reproduced in the
74// source.
75//
76
77#include <cctype>
78#include <cmath>
79#include <sstream>
80
81#include "systemc/ext/dt/bit/sc_bv_base.hh"
82#include "systemc/ext/dt/bit/sc_lv_base.hh"
83#include "systemc/ext/dt/fx/sc_fix.hh"
84#include "systemc/ext/dt/fx/scfx_other_defs.hh"
1/*****************************************************************************
2
3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4 more contributor license agreements. See the NOTICE file distributed
5 with this work for additional information regarding copyright ownership.
6 Accellera licenses this file to you under the Apache License, Version 2.0
7 (the "License"); you may not use this file except in compliance with the
8 License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 implied. See the License for the specific language governing
16 permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22 sc_signed.cpp -- Arbitrary precision signed arithmetic.
23
24 This file includes the definitions of sc_signed_bitref,
25 sc_signed_subref, and sc_signed classes. The first two
26 classes are proxy classes to reference one bit and a range
27 of bits of a sc_signed number, respectively. This file also
28 includes sc_nbcommon.cpp and sc_nbfriends.cpp, which
29 contain the definitions shared by sc_unsigned.
30
31 Original Author: Ali Dasdan, Synopsys, Inc.
32
33 *****************************************************************************/
34
35/*****************************************************************************
36
37 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
38 changes you are making here.
39
40 Name, Affiliation, Date:
41 Description of Modification:
42
43 *****************************************************************************/
44
45
46// $Log: sc_signed.cpp,v $
47// Revision 1.6 2011/02/18 20:19:15 acg
48// Andy Goodrich: updating Copyright notice.
49//
50// Revision 1.5 2008/12/10 20:38:45 acg
51// Andy Goodrich: fixed conversion of double values to the digits vector.
52// The bits above the radix were not being masked off.
53//
54// Revision 1.4 2008/06/19 17:47:56 acg
55// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
56//
57// Revision 1.3 2008/04/29 21:20:41 acg
58// Andy Goodrich: added mask to first word transferred when processing
59// a negative sc_signed value in sc_signed::concat_get_data().
60//
61// Revision 1.2 2007/11/04 21:27:00 acg
62// Andy Goodrich: changes to make sure the proper value is returned from
63// concat_get_data().
64//
65// Revision 1.1.1.1 2006/12/15 20:20:05 acg
66// SystemC 2.3
67//
68// Revision 1.5 2006/10/23 19:32:47 acg
69// Andy Goodrich: further fix for incorrect value being returned from
70// concat_get_data. This one is in the non-aligned value code.
71//
72// Revision 1.3 2006/01/13 18:49:32 acg
73// Added $Log command so that CVS check in comments are reproduced in the
74// source.
75//
76
77#include <cctype>
78#include <cmath>
79#include <sstream>
80
81#include "systemc/ext/dt/bit/sc_bv_base.hh"
82#include "systemc/ext/dt/bit/sc_lv_base.hh"
83#include "systemc/ext/dt/fx/sc_fix.hh"
84#include "systemc/ext/dt/fx/scfx_other_defs.hh"
85#include "systemc/ext/dt/int/messages.hh"
85#include "systemc/ext/dt/int/sc_int_base.hh"
86#include "systemc/ext/dt/int/sc_signed.hh"
87#include "systemc/ext/dt/int/sc_uint_base.hh"
88#include "systemc/ext/dt/int/sc_unsigned.hh"
89#include "systemc/ext/dt/misc/sc_concatref.hh"
90
91// explicit template instantiations
92namespace sc_core
93{
94
95template class sc_vpool<sc_dt::sc_signed_bitref>;
96template class sc_vpool<sc_dt::sc_signed_subref>;
97
98} // namespace sc_core
99
100namespace sc_dt
101{
102
103// Pool of temporary instances:
104
105sc_core::sc_vpool<sc_signed_bitref> sc_signed_bitref::m_pool(9);
106sc_core::sc_vpool<sc_signed_subref> sc_signed_subref::m_pool(9);
107
108void
109sc_signed::invalid_init(const char *type_name, int nb) const
110{
111 std::stringstream msg;
112 msg << "sc_signed("<< type_name << ") : nb = " << nb << " is not valid";
86#include "systemc/ext/dt/int/sc_int_base.hh"
87#include "systemc/ext/dt/int/sc_signed.hh"
88#include "systemc/ext/dt/int/sc_uint_base.hh"
89#include "systemc/ext/dt/int/sc_unsigned.hh"
90#include "systemc/ext/dt/misc/sc_concatref.hh"
91
92// explicit template instantiations
93namespace sc_core
94{
95
96template class sc_vpool<sc_dt::sc_signed_bitref>;
97template class sc_vpool<sc_dt::sc_signed_subref>;
98
99} // namespace sc_core
100
101namespace sc_dt
102{
103
104// Pool of temporary instances:
105
106sc_core::sc_vpool<sc_signed_bitref> sc_signed_bitref::m_pool(9);
107sc_core::sc_vpool<sc_signed_subref> sc_signed_subref::m_pool(9);
108
109void
110sc_signed::invalid_init(const char *type_name, int nb) const
111{
112 std::stringstream msg;
113 msg << "sc_signed("<< type_name << ") : nb = " << nb << " is not valid";
113 SC_REPORT_ERROR("initialization failed", msg.str().c_str());
114 SC_REPORT_ERROR(sc_core::SC_ID_INIT_FAILED_, msg.str().c_str());
114}
115
116// ----------------------------------------------------------------------------
117// SECTION: Public members - Invalid selections.
118// ----------------------------------------------------------------------------
119
120void
121sc_signed::invalid_index(int i) const
122{
123 std::stringstream msg;
124 msg << "sc_bigint bit selection: index = " << i << " violates "
125 "0 <= index <= " << (nbits - 1);
126 SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
127 sc_core::sc_abort(); // can't recover from here
128}
129
130void
131sc_signed::invalid_range(int l, int r) const
132{
133 std::stringstream msg;
134 msg << "sc_bigint part selection: left = " <<
135 l << ", right = " << r << " \n"
136 " violates either (" << (nbits-1) << " >= left >= 0) or "
137 "(" << (nbits-1) << " >= right >= 0)";
138 SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
139 sc_core::sc_abort(); // can't recover from here
140}
141
142
143// ----------------------------------------------------------------------------
144
145// ----------------------------------------------------------------------------
146// SECTION: Public members.
147// ----------------------------------------------------------------------------
148
149// Most public members are included from sc_nbcommon.inc. However, some
150// concatenation support appears here to optimize between the signed and
151// unsigned cases.
152
153// Insert this object's value at the specified place in a vector of biguint
154// style values.
155
156bool
157sc_signed::concat_get_ctrl(sc_digit *dst_p, int low_i) const
158{
159 int dst_i; // Index to next word to set in dst_p.
160 int end_i; // Index of high order word to set.
161 int left_shift; // Amount to shift value left.
162 sc_digit mask; // Mask for partial word sets.
163
164 // CALCULATE METRICS FOR DATA MOVEMENT:
165 dst_i = low_i / BITS_PER_DIGIT;
166 end_i = (low_i + nbits - 1) / BITS_PER_DIGIT;
167 left_shift = low_i % BITS_PER_DIGIT;
168
169 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
170 mask = ~(~0U << left_shift);
171 dst_p[dst_i] = (dst_p[dst_i] & ~mask);
172 dst_i++;
173
174 for (; dst_i <= end_i; dst_i++)
175 dst_p[dst_i] = 0;
176
177 return false;
178}
179
180bool
181sc_signed::concat_get_data(sc_digit *dst_p, int low_i) const
182{
183 sc_digit carry; // Carry bit for complements.
184 int dst_i; // Index to next word to set in dst_p.
185 int end_i; // Index of high order word to set.
186 int high_i; // Index w/in word of high order bit.
187 int left_shift; // Amount to shift value left.
188 sc_digit left_word; // High word component for set.
189 sc_digit mask; // Mask for partial word sets.
190 bool result; // True if inserted non-zero data.
191 int right_shift; // Amount to shift value right.
192 sc_digit right_word; // Low word component for set.
193 int src_i; // Index to next word to get from digit.
194
195 // CALCULATE METRICS FOR DATA MOVEMENT:
196 dst_i = low_i / BITS_PER_DIGIT;
197 high_i = low_i + nbits - 1;
198 end_i = high_i / BITS_PER_DIGIT;
199 left_shift = low_i % BITS_PER_DIGIT;
200
201 switch (sgn) {
202 // POSITIVE SOURCE VALUE:
203 case SC_POS:
204 result = true;
205
206 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
207 if (dst_i == end_i) {
208 mask = ~(~0U << left_shift);
209 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
210 (digit[0] << left_shift)) & DIGIT_MASK;
211
212 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
213 } else if (left_shift == 0) {
214 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
215 dst_p[dst_i] = digit[src_i];
216 }
217 high_i = high_i % BITS_PER_DIGIT;
218 mask = ~(~1U << high_i) & DIGIT_MASK;
219 dst_p[dst_i] = digit[src_i] & mask;
220
221 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
222 } else {
223 high_i = high_i % BITS_PER_DIGIT;
224 right_shift = BITS_PER_DIGIT - left_shift;
225 mask = ~(~0U << left_shift);
226 right_word = digit[0];
227 dst_p[dst_i] = (dst_p[dst_i] & mask) |
228 ((right_word << left_shift) & DIGIT_MASK);
229 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
230 left_word = digit[src_i];
231 dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
232 (right_word >> right_shift);
233 right_word = left_word;
234 }
235 left_word = (src_i < ndigits) ? digit[src_i] : 0;
236 mask = ~(~1U << high_i) & DIGIT_MASK;
237 dst_p[dst_i] = ((left_word << left_shift) |
238 (right_word >> right_shift)) & mask;
239 }
240 break;
241
242 // SOURCE VALUE IS NEGATIVE:
243 case SC_NEG:
244 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
245 result = true;
246 if (dst_i == end_i) {
247 mask = ~(~0U << nbits);
248 right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
249 mask = ~(~0U << left_shift);
250 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
251 (right_word << left_shift)) & DIGIT_MASK;
252
253 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
254 } else if (left_shift == 0) {
255 carry = 1;
256 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
257 right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
258 dst_p[dst_i] = right_word & DIGIT_MASK;
259 carry = right_word >> BITS_PER_DIGIT;
260 }
261 high_i = high_i % BITS_PER_DIGIT;
262 mask = (~(~1U << high_i)) & DIGIT_MASK;
263 right_word = (src_i < ndigits) ?
264 (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
265 dst_p[dst_i] = right_word & mask;
266
267 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
268 } else {
269 high_i = high_i % BITS_PER_DIGIT;
270 right_shift = BITS_PER_DIGIT - left_shift;
271 mask = ~(~0U << left_shift);
272 carry = 1;
273 right_word = (digit[0] ^ DIGIT_MASK) + carry;
274 dst_p[dst_i] = (dst_p[dst_i] & mask) |
275 ((right_word << left_shift) & DIGIT_MASK);
276 carry = right_word >> BITS_PER_DIGIT;
277 right_word &= DIGIT_MASK;
278 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
279 left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
280 dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
281 (right_word >> right_shift);
282 carry = left_word >> BITS_PER_DIGIT;
283 right_word = left_word & DIGIT_MASK;
284 }
285 left_word = (src_i < ndigits) ?
286 (digit[src_i] ^ DIGIT_MASK) + carry : carry;
287 mask = ~(~1U << high_i) & DIGIT_MASK;
288 dst_p[dst_i] = ((left_word << left_shift) |
289 (right_word >> right_shift)) & mask;
290 }
291 break;
292
293 // VALUE IS ZERO:
294 default:
295 result = false;
296 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
297 if (dst_i == end_i) {
298 mask = ~(~0U << nbits) << left_shift;
299 dst_p[dst_i] = dst_p[dst_i] & ~mask;
300
301 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
302 } else if (left_shift == 0) {
303 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
304 dst_p[dst_i] = 0;
305 }
306 dst_p[dst_i] = 0;
307
308 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
309 } else {
310 mask = ~(~0U << left_shift);
311 dst_p[dst_i] = (dst_p[dst_i] & mask);
312 for (dst_i++; dst_i <= end_i; dst_i++) {
313 dst_p[dst_i] = 0;
314 }
315 }
316 break;
317 }
318 return result;
319}
320
321// Return this object instance's bits as a uint64 without sign extension.
322
323uint64
324sc_signed::concat_get_uint64() const
325{
326 uint64 result;
327 switch (sgn) {
328 case SC_POS:
329 result = 0;
330 if (ndigits > 2)
331 result = digit[2];
332 if (ndigits > 1)
333 result = (result << BITS_PER_DIGIT) | digit[1];
334 result = (result << BITS_PER_DIGIT) | digit[0];
335 break;
336 case SC_NEG:
337 result = 0;
338 if (ndigits > 2)
339 result = digit[2];
340 if (ndigits > 1)
341 result = (result << BITS_PER_DIGIT) | digit[1];
342 result = (result << BITS_PER_DIGIT) | digit[0];
343 result = -result;
344 if (nbits < 64) {
345 uint64 mask = ~0;
346 result = result & ~(mask << nbits);
347 }
348 break;
349 default:
350 result = 0;
351 break;
352 }
353 return result;
354}
355
356// #### OPTIMIZE
357void
358sc_signed::concat_set(int64 src, int low_i)
359{
360 *this = (low_i < 64) ? src >> low_i : src >> 63;
361}
362
363void
364sc_signed::concat_set(const sc_signed &src, int low_i)
365{
366 if (low_i < src.length())
367 *this = src >> low_i;
368 else
369 *this = (src<0) ? (int_type)-1 : 0;
370}
371
372void
373sc_signed::concat_set(const sc_unsigned &src, int low_i)
374{
375 if (low_i < src.length())
376 *this = src >> low_i;
377 else
378 *this = 0;
379}
380
381void
382sc_signed::concat_set(uint64 src, int low_i)
383{
384 *this = (low_i < 64) ? src >> low_i : 0;
385}
386
387// ----------------------------------------------------------------------------
388// SECTION: Public members - Reduction methods.
389// ----------------------------------------------------------------------------
390
391bool
392sc_signed::and_reduce() const
393{
394 sc_digit current; // Current digit examining.
395 int i; // Index of digit examining.
396
397 if (sgn == SC_NEG) {
398 current = (1 << BITS_PER_DIGIT);
399 for (i = 0; i < ndigits-1; i++) {
400 current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
401 if ((current & DIGIT_MASK) != DIGIT_MASK) return false;
402 }
403 current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
404 if ((current & ~(~0U << (nbits % BITS_PER_DIGIT))) ==
405 static_cast<sc_digit>(~(~0U << (nbits % BITS_PER_DIGIT)))) {
406 return true;
407 }
408 }
409 return false;
410}
411
412bool
413sc_signed::or_reduce() const
414{
415 return sgn == SC_ZERO ? false : true;
416}
417
418bool
419sc_signed::xor_reduce() const
420{
421 int i; // Digit examining.
422 int odd; // Flag for odd number of digits.
423
424 odd = 0;
425 for (i = 0; i < nbits; i++)
426 if (test(i))
427 odd = ~odd;
428 return odd ? true : false;
429}
430
431
432
433// ----------------------------------------------------------------------------
434// SECTION: Public members - Assignment operators.
435// ----------------------------------------------------------------------------
436
437// assignment operators
438
439const sc_signed &
440sc_signed::operator = (const char *a)
441{
442 if (a == 0) {
115}
116
117// ----------------------------------------------------------------------------
118// SECTION: Public members - Invalid selections.
119// ----------------------------------------------------------------------------
120
121void
122sc_signed::invalid_index(int i) const
123{
124 std::stringstream msg;
125 msg << "sc_bigint bit selection: index = " << i << " violates "
126 "0 <= index <= " << (nbits - 1);
127 SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
128 sc_core::sc_abort(); // can't recover from here
129}
130
131void
132sc_signed::invalid_range(int l, int r) const
133{
134 std::stringstream msg;
135 msg << "sc_bigint part selection: left = " <<
136 l << ", right = " << r << " \n"
137 " violates either (" << (nbits-1) << " >= left >= 0) or "
138 "(" << (nbits-1) << " >= right >= 0)";
139 SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
140 sc_core::sc_abort(); // can't recover from here
141}
142
143
144// ----------------------------------------------------------------------------
145
146// ----------------------------------------------------------------------------
147// SECTION: Public members.
148// ----------------------------------------------------------------------------
149
150// Most public members are included from sc_nbcommon.inc. However, some
151// concatenation support appears here to optimize between the signed and
152// unsigned cases.
153
154// Insert this object's value at the specified place in a vector of biguint
155// style values.
156
157bool
158sc_signed::concat_get_ctrl(sc_digit *dst_p, int low_i) const
159{
160 int dst_i; // Index to next word to set in dst_p.
161 int end_i; // Index of high order word to set.
162 int left_shift; // Amount to shift value left.
163 sc_digit mask; // Mask for partial word sets.
164
165 // CALCULATE METRICS FOR DATA MOVEMENT:
166 dst_i = low_i / BITS_PER_DIGIT;
167 end_i = (low_i + nbits - 1) / BITS_PER_DIGIT;
168 left_shift = low_i % BITS_PER_DIGIT;
169
170 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
171 mask = ~(~0U << left_shift);
172 dst_p[dst_i] = (dst_p[dst_i] & ~mask);
173 dst_i++;
174
175 for (; dst_i <= end_i; dst_i++)
176 dst_p[dst_i] = 0;
177
178 return false;
179}
180
181bool
182sc_signed::concat_get_data(sc_digit *dst_p, int low_i) const
183{
184 sc_digit carry; // Carry bit for complements.
185 int dst_i; // Index to next word to set in dst_p.
186 int end_i; // Index of high order word to set.
187 int high_i; // Index w/in word of high order bit.
188 int left_shift; // Amount to shift value left.
189 sc_digit left_word; // High word component for set.
190 sc_digit mask; // Mask for partial word sets.
191 bool result; // True if inserted non-zero data.
192 int right_shift; // Amount to shift value right.
193 sc_digit right_word; // Low word component for set.
194 int src_i; // Index to next word to get from digit.
195
196 // CALCULATE METRICS FOR DATA MOVEMENT:
197 dst_i = low_i / BITS_PER_DIGIT;
198 high_i = low_i + nbits - 1;
199 end_i = high_i / BITS_PER_DIGIT;
200 left_shift = low_i % BITS_PER_DIGIT;
201
202 switch (sgn) {
203 // POSITIVE SOURCE VALUE:
204 case SC_POS:
205 result = true;
206
207 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
208 if (dst_i == end_i) {
209 mask = ~(~0U << left_shift);
210 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
211 (digit[0] << left_shift)) & DIGIT_MASK;
212
213 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
214 } else if (left_shift == 0) {
215 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
216 dst_p[dst_i] = digit[src_i];
217 }
218 high_i = high_i % BITS_PER_DIGIT;
219 mask = ~(~1U << high_i) & DIGIT_MASK;
220 dst_p[dst_i] = digit[src_i] & mask;
221
222 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
223 } else {
224 high_i = high_i % BITS_PER_DIGIT;
225 right_shift = BITS_PER_DIGIT - left_shift;
226 mask = ~(~0U << left_shift);
227 right_word = digit[0];
228 dst_p[dst_i] = (dst_p[dst_i] & mask) |
229 ((right_word << left_shift) & DIGIT_MASK);
230 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
231 left_word = digit[src_i];
232 dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
233 (right_word >> right_shift);
234 right_word = left_word;
235 }
236 left_word = (src_i < ndigits) ? digit[src_i] : 0;
237 mask = ~(~1U << high_i) & DIGIT_MASK;
238 dst_p[dst_i] = ((left_word << left_shift) |
239 (right_word >> right_shift)) & mask;
240 }
241 break;
242
243 // SOURCE VALUE IS NEGATIVE:
244 case SC_NEG:
245 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
246 result = true;
247 if (dst_i == end_i) {
248 mask = ~(~0U << nbits);
249 right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
250 mask = ~(~0U << left_shift);
251 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
252 (right_word << left_shift)) & DIGIT_MASK;
253
254 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
255 } else if (left_shift == 0) {
256 carry = 1;
257 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
258 right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
259 dst_p[dst_i] = right_word & DIGIT_MASK;
260 carry = right_word >> BITS_PER_DIGIT;
261 }
262 high_i = high_i % BITS_PER_DIGIT;
263 mask = (~(~1U << high_i)) & DIGIT_MASK;
264 right_word = (src_i < ndigits) ?
265 (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
266 dst_p[dst_i] = right_word & mask;
267
268 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
269 } else {
270 high_i = high_i % BITS_PER_DIGIT;
271 right_shift = BITS_PER_DIGIT - left_shift;
272 mask = ~(~0U << left_shift);
273 carry = 1;
274 right_word = (digit[0] ^ DIGIT_MASK) + carry;
275 dst_p[dst_i] = (dst_p[dst_i] & mask) |
276 ((right_word << left_shift) & DIGIT_MASK);
277 carry = right_word >> BITS_PER_DIGIT;
278 right_word &= DIGIT_MASK;
279 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
280 left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
281 dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
282 (right_word >> right_shift);
283 carry = left_word >> BITS_PER_DIGIT;
284 right_word = left_word & DIGIT_MASK;
285 }
286 left_word = (src_i < ndigits) ?
287 (digit[src_i] ^ DIGIT_MASK) + carry : carry;
288 mask = ~(~1U << high_i) & DIGIT_MASK;
289 dst_p[dst_i] = ((left_word << left_shift) |
290 (right_word >> right_shift)) & mask;
291 }
292 break;
293
294 // VALUE IS ZERO:
295 default:
296 result = false;
297 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
298 if (dst_i == end_i) {
299 mask = ~(~0U << nbits) << left_shift;
300 dst_p[dst_i] = dst_p[dst_i] & ~mask;
301
302 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
303 } else if (left_shift == 0) {
304 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
305 dst_p[dst_i] = 0;
306 }
307 dst_p[dst_i] = 0;
308
309 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
310 } else {
311 mask = ~(~0U << left_shift);
312 dst_p[dst_i] = (dst_p[dst_i] & mask);
313 for (dst_i++; dst_i <= end_i; dst_i++) {
314 dst_p[dst_i] = 0;
315 }
316 }
317 break;
318 }
319 return result;
320}
321
322// Return this object instance's bits as a uint64 without sign extension.
323
324uint64
325sc_signed::concat_get_uint64() const
326{
327 uint64 result;
328 switch (sgn) {
329 case SC_POS:
330 result = 0;
331 if (ndigits > 2)
332 result = digit[2];
333 if (ndigits > 1)
334 result = (result << BITS_PER_DIGIT) | digit[1];
335 result = (result << BITS_PER_DIGIT) | digit[0];
336 break;
337 case SC_NEG:
338 result = 0;
339 if (ndigits > 2)
340 result = digit[2];
341 if (ndigits > 1)
342 result = (result << BITS_PER_DIGIT) | digit[1];
343 result = (result << BITS_PER_DIGIT) | digit[0];
344 result = -result;
345 if (nbits < 64) {
346 uint64 mask = ~0;
347 result = result & ~(mask << nbits);
348 }
349 break;
350 default:
351 result = 0;
352 break;
353 }
354 return result;
355}
356
357// #### OPTIMIZE
358void
359sc_signed::concat_set(int64 src, int low_i)
360{
361 *this = (low_i < 64) ? src >> low_i : src >> 63;
362}
363
364void
365sc_signed::concat_set(const sc_signed &src, int low_i)
366{
367 if (low_i < src.length())
368 *this = src >> low_i;
369 else
370 *this = (src<0) ? (int_type)-1 : 0;
371}
372
373void
374sc_signed::concat_set(const sc_unsigned &src, int low_i)
375{
376 if (low_i < src.length())
377 *this = src >> low_i;
378 else
379 *this = 0;
380}
381
382void
383sc_signed::concat_set(uint64 src, int low_i)
384{
385 *this = (low_i < 64) ? src >> low_i : 0;
386}
387
388// ----------------------------------------------------------------------------
389// SECTION: Public members - Reduction methods.
390// ----------------------------------------------------------------------------
391
392bool
393sc_signed::and_reduce() const
394{
395 sc_digit current; // Current digit examining.
396 int i; // Index of digit examining.
397
398 if (sgn == SC_NEG) {
399 current = (1 << BITS_PER_DIGIT);
400 for (i = 0; i < ndigits-1; i++) {
401 current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
402 if ((current & DIGIT_MASK) != DIGIT_MASK) return false;
403 }
404 current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
405 if ((current & ~(~0U << (nbits % BITS_PER_DIGIT))) ==
406 static_cast<sc_digit>(~(~0U << (nbits % BITS_PER_DIGIT)))) {
407 return true;
408 }
409 }
410 return false;
411}
412
413bool
414sc_signed::or_reduce() const
415{
416 return sgn == SC_ZERO ? false : true;
417}
418
419bool
420sc_signed::xor_reduce() const
421{
422 int i; // Digit examining.
423 int odd; // Flag for odd number of digits.
424
425 odd = 0;
426 for (i = 0; i < nbits; i++)
427 if (test(i))
428 odd = ~odd;
429 return odd ? true : false;
430}
431
432
433
434// ----------------------------------------------------------------------------
435// SECTION: Public members - Assignment operators.
436// ----------------------------------------------------------------------------
437
438// assignment operators
439
440const sc_signed &
441sc_signed::operator = (const char *a)
442{
443 if (a == 0) {
443 SC_REPORT_ERROR("conversion failed",
444 SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_,
444 "character string is zero");
445 } else if (*a == 0) {
445 "character string is zero");
446 } else if (*a == 0) {
446 SC_REPORT_ERROR("conversion failed",
447 SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_,
447 "character string is empty");
448 } else try {
449 int len = length();
450 sc_fix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
451 return this->operator = (aa);
452 } catch(const sc_core::sc_report &) {
453 std::stringstream msg;
454 msg << "character string '" << a << "' is not valid";
448 "character string is empty");
449 } else try {
450 int len = length();
451 sc_fix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
452 return this->operator = (aa);
453 } catch(const sc_core::sc_report &) {
454 std::stringstream msg;
455 msg << "character string '" << a << "' is not valid";
455 SC_REPORT_ERROR("conversion failed", msg.str().c_str());
456 SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_, msg.str().c_str());
456 }
457 return *this;
458}
459
460const sc_signed &
461sc_signed::operator=(int64 v)
462{
463 sgn = get_sign(v);
464 // v >= 0 now.
465 if (sgn == SC_ZERO) {
466 vec_zero(ndigits, digit);
467 } else {
468 from_uint(ndigits, digit, (uint64)v);
469 if (nbits <= (int)BITS_PER_INT64)
470 convert_SM_to_2C_to_SM();
471 }
472 return *this;
473}
474
475const sc_signed &
476sc_signed::operator=(uint64 v)
477{
478 sgn = get_sign(v);
479 if (sgn == SC_ZERO) {
480 vec_zero(ndigits, digit);
481 } else {
482 from_uint(ndigits, digit, v);
483 if (nbits <= (int)BITS_PER_INT64)
484 convert_SM_to_2C_to_SM();
485 }
486 return *this;
487}
488
489const sc_signed &
490sc_signed::operator=(long v)
491{
492 sgn = get_sign(v);
493 // v >= 0 now.
494 if (sgn == SC_ZERO) {
495 vec_zero(ndigits, digit);
496 } else {
497 from_uint(ndigits, digit, (unsigned long)v);
498 if (nbits <= (int)BITS_PER_LONG)
499 convert_SM_to_2C_to_SM();
500 }
501 return *this;
502}
503
504const sc_signed &
505sc_signed::operator=(unsigned long v)
506{
507 sgn = get_sign(v);
508 if (sgn == SC_ZERO) {
509 vec_zero(ndigits, digit);
510 } else {
511 from_uint(ndigits, digit, v);
512 if (nbits <= (int)BITS_PER_LONG)
513 convert_SM_to_2C_to_SM();
514 }
515 return *this;
516}
517
518const sc_signed &
519sc_signed::operator=(double v)
520{
521 is_bad_double(v);
522 if (v < 0) {
523 v = -v;
524 sgn = SC_NEG;
525 } else {
526 sgn = SC_POS;
527 }
528
529 int i = 0;
530 while (std::floor(v) && (i < ndigits)) {
531 digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) &
532 DIGIT_MASK;
533 v /= DIGIT_RADIX;
534 }
535 vec_zero(i, ndigits, digit);
536 convert_SM_to_2C_to_SM();
537 return *this;
538}
539
540
541// ----------------------------------------------------------------------------
542
543const sc_signed &
544sc_signed::operator = (const sc_bv_base &v)
545{
546 int minlen = sc_min(nbits, v.length());
547 int i = 0;
548 for (; i < minlen; ++i) {
549 safe_set(i, v.get_bit(i), digit);
550 }
551 for (; i < nbits; ++i) {
552 safe_set(i, 0, digit); // zero-extend
553 }
554 convert_2C_to_SM();
555 return *this;
556}
557
558const sc_signed &
559sc_signed::operator = (const sc_lv_base &v)
560{
561 int minlen = sc_min(nbits, v.length());
562 int i = 0;
563 for (; i < minlen; ++i) {
564 safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit);
565 }
566 for (; i < nbits; ++i) {
567 safe_set(i, 0, digit); // zero-extend
568 }
569 convert_2C_to_SM();
570 return *this;
571}
572
573
574// explicit conversion to character string
575const std::string
576sc_signed::to_string(sc_numrep numrep) const
577{
578 int len = length();
579 sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
580 return aa.to_string(numrep);
581}
582
583const std::string
584sc_signed::to_string(sc_numrep numrep, bool w_prefix) const
585{
586 int len = length();
587 sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
588 return aa.to_string(numrep, w_prefix);
589}
590
591
592// ----------------------------------------------------------------------------
593// SECTION: Interfacing with sc_int_base
594// ----------------------------------------------------------------------------
595
596const sc_signed &
597sc_signed::operator = (const sc_int_base &v)
598{
599 return operator = ((int64)v);
600}
601
602
603sc_signed
604operator + (const sc_unsigned &u, const sc_int_base &v)
605{
606 return operator + (u, static_cast<int64>(v));
607}
608
609sc_signed
610operator + (const sc_int_base &u, const sc_unsigned &v)
611{
612 return operator + (static_cast<int64>(u), v);
613}
614
615sc_signed
616operator + (const sc_signed &u, const sc_int_base &v)
617{
618 return operator + (u, (int64)v);
619}
620
621sc_signed
622operator + (const sc_int_base &u, const sc_signed &v)
623{
624 return operator + ((int64)u, v);
625}
626
627const sc_signed &
628sc_signed::operator += (const sc_int_base &v)
629{
630 return operator += ((int64)v);
631}
632
633
634sc_signed
635operator - (const sc_unsigned &u, const sc_int_base &v)
636{
637 return operator - (u, (int64)v);
638}
639
640sc_signed
641operator - (const sc_int_base &u, const sc_unsigned &v)
642{
643 return operator - ((int64)u, v);
644}
645
646sc_signed
647operator - (const sc_signed &u, const sc_int_base &v)
648{
649 return operator - (u, (int64)v);
650}
651
652sc_signed
653operator - (const sc_int_base &u, const sc_signed &v)
654{
655 return operator - ((int64)u, v);
656}
657
658const sc_signed &
659sc_signed::operator -= (const sc_int_base &v)
660{
661 return operator -= ((int64)v);
662}
663
664
665sc_signed
666operator * (const sc_unsigned &u, const sc_int_base &v)
667{
668 return operator * (u, static_cast<int64>(v));
669}
670
671sc_signed
672operator * (const sc_int_base &u, const sc_unsigned &v)
673{
674 return operator * (static_cast<int64>(u), v);
675}
676
677sc_signed
678operator * (const sc_signed &u, const sc_int_base &v)
679{
680 return operator * (u, (int64)v);
681}
682
683sc_signed
684operator * (const sc_int_base &u, const sc_signed &v)
685{
686 return operator * ((int64)u, v);
687}
688
689const sc_signed &
690sc_signed::operator *= (const sc_int_base &v)
691{
692 return operator *= ((int64)v);
693}
694
695
696sc_signed
697operator / (const sc_unsigned &u, const sc_int_base &v)
698{
699 return operator / (u, static_cast<int64>(v));
700}
701
702sc_signed
703operator / (const sc_int_base &u, const sc_unsigned &v)
704{
705 return operator / (static_cast<int64>(u), v);
706}
707
708sc_signed
709operator / (const sc_signed &u, const sc_int_base &v)
710{
711 return operator / (u, (int64)v);
712}
713
714sc_signed
715operator / (const sc_int_base &u, const sc_signed &v)
716{
717 return operator / ((int64)u, v);
718}
719
720const sc_signed &
721sc_signed::operator /= (const sc_int_base &v)
722{
723 return operator /= ((int64)v);
724}
725
726
727sc_signed
728operator % (const sc_unsigned &u, const sc_int_base &v)
729{
730 return operator % (u, static_cast<int64>(v));
731}
732
733sc_signed
734operator % (const sc_int_base &u, const sc_unsigned &v)
735{
736 return operator % (static_cast<int64>(u), v);
737}
738
739sc_signed
740operator % (const sc_signed &u, const sc_int_base &v)
741{
742 return operator % (u, (int64)v);
743}
744
745sc_signed
746operator % (const sc_int_base &u, const sc_signed &v)
747{
748 return operator % ((int64)u, v);
749}
750
751const sc_signed &
752sc_signed::operator %= (const sc_int_base &v)
753{
754 return operator %= ((int64)v);
755}
756
757
758sc_signed
759operator & (const sc_unsigned &u, const sc_int_base &v)
760{
761 return operator & (u, static_cast<int64>(v));
762}
763
764sc_signed
765operator & (const sc_int_base &u, const sc_unsigned &v)
766{
767 return operator & (static_cast<int64>(u), v);
768}
769
770sc_signed
771operator & (const sc_signed &u, const sc_int_base &v)
772{
773 return operator & (u, (int64)v);
774}
775
776sc_signed
777operator & (const sc_int_base &u, const sc_signed &v)
778{
779 return operator & ((int64)u, v);
780}
781
782const sc_signed &
783sc_signed::operator &= (const sc_int_base &v)
784{
785 return operator &= ((int64)v);
786}
787
788
789sc_signed
790operator | (const sc_unsigned &u, const sc_int_base &v)
791{
792 return operator | (u, static_cast<int64>(v));
793}
794
795sc_signed
796operator | (const sc_int_base &u, const sc_unsigned &v)
797{
798 return operator | (static_cast<int64>(u), v);
799}
800
801sc_signed
802operator | (const sc_signed& u, const sc_int_base &v)
803{
804 return operator|(u, (int64)v);
805}
806
807sc_signed
808operator | (const sc_int_base &u, const sc_signed &v)
809{
810 return operator | ((int64)u, v);
811}
812
813const sc_signed &
814sc_signed::operator |= (const sc_int_base &v)
815{
816 return operator |= ((int64)v);
817}
818
819
820sc_signed
821operator ^ (const sc_unsigned &u, const sc_int_base &v)
822{
823 return operator ^ (u, static_cast<int64>(v));
824}
825
826sc_signed
827operator ^ (const sc_int_base &u, const sc_unsigned &v)
828{
829 return operator ^ (static_cast<int64>(u), v);
830}
831
832sc_signed
833operator ^ (const sc_signed &u, const sc_int_base &v)
834{
835 return operator ^ (u, (int64)v);
836}
837
838sc_signed
839operator ^ (const sc_int_base &u, const sc_signed &v)
840{
841 return operator ^ ((int64)u, v);
842}
843
844const sc_signed &
845sc_signed::operator ^= (const sc_int_base &v)
846{
847 return operator ^= ((int64)v);
848}
849
850
851sc_signed
852operator << (const sc_signed &u, const sc_int_base &v)
853{
854 return operator << (u, (int64)v);
855}
856
857const sc_signed &
858sc_signed::operator <<= (const sc_int_base &v)
859{
860 return operator <<= ((int64)v);
861}
862
863
864sc_signed
865operator >> (const sc_signed &u, const sc_int_base &v)
866{
867 return operator >> (u, (int64)v);
868}
869
870const sc_signed &
871sc_signed::operator >>= (const sc_int_base &v)
872{
873 return operator >>= ((int64)v);
874}
875
876
877bool
878operator == (const sc_signed &u, const sc_int_base &v)
879{
880 return operator == (u, (int64)v);
881}
882
883bool
884operator == (const sc_int_base &u, const sc_signed &v)
885{
886 return operator == ((int64)u, v);
887}
888
889
890bool
891operator != (const sc_signed &u, const sc_int_base &v)
892{
893 return operator != (u, (int64)v);
894}
895
896bool
897operator != (const sc_int_base &u, const sc_signed &v)
898{
899 return operator != ((int64)u, v);
900}
901
902
903bool
904operator < (const sc_signed &u, const sc_int_base &v)
905{
906 return operator < (u, (int64)v);
907}
908
909bool
910operator < (const sc_int_base &u, const sc_signed &v)
911{
912 return operator < ((int64)u, v);
913}
914
915
916bool
917operator <= (const sc_signed &u, const sc_int_base &v)
918{
919 return operator <= (u, (int64)v);
920}
921
922bool
923operator <= (const sc_int_base &u, const sc_signed &v)
924{
925 return operator <= ((int64)u, v);
926}
927
928
929bool
930operator > (const sc_signed &u, const sc_int_base &v)
931{
932 return operator > (u, (int64)v);
933}
934
935bool
936operator > (const sc_int_base &u, const sc_signed &v)
937{
938 return operator > ((int64)u, v);
939}
940
941
942bool
943operator >= (const sc_signed &u, const sc_int_base &v)
944{
945 return operator >= (u, (int64)v);
946}
947
948bool
949operator >= (const sc_int_base &u, const sc_signed &v)
950{
951 return operator >= ((int64)u, v);
952}
953
954
955// ----------------------------------------------------------------------------
956// SECTION: Interfacing with sc_uint_base
957// ----------------------------------------------------------------------------
958
959const sc_signed &
960sc_signed::operator = (const sc_uint_base &v)
961{
962 return operator = ((uint64)v);
963}
964
965
966sc_signed
967operator + (const sc_signed &u, const sc_uint_base &v)
968{
969 return operator + (u, (uint64)v);
970}
971
972sc_signed
973operator + (const sc_uint_base &u, const sc_signed &v)
974{
975 return operator + ((uint64)u, v);
976}
977
978const sc_signed &
979sc_signed::operator += (const sc_uint_base &v)
980{
981 return operator += ((uint64)v);
982}
983
984
985sc_signed
986operator - (const sc_unsigned &u, const sc_uint_base &v)
987{
988 return operator - (u, (uint64)v);
989}
990
991sc_signed
992operator - (const sc_uint_base &u, const sc_unsigned &v)
993{
994 return operator - ((uint64)u, v);
995}
996
997sc_signed
998operator - (const sc_signed &u, const sc_uint_base &v)
999{
1000 return operator - (u, (uint64)v);
1001}
1002
1003sc_signed
1004operator - (const sc_uint_base &u, const sc_signed &v)
1005{
1006 return operator - ((uint64)u, v);
1007}
1008
1009const sc_signed &
1010sc_signed::operator -= (const sc_uint_base &v)
1011{
1012 return operator -= ((uint64)v);
1013}
1014
1015
1016sc_signed
1017operator * (const sc_signed &u, const sc_uint_base &v)
1018{
1019 return operator * (u, (uint64)v);
1020}
1021
1022sc_signed
1023operator * (const sc_uint_base &u, const sc_signed &v)
1024{
1025 return operator * ((uint64)u, v);
1026}
1027
1028const sc_signed &
1029sc_signed::operator *= (const sc_uint_base &v)
1030{
1031 return operator *= ((uint64)v);
1032}
1033
1034
1035sc_signed
1036operator / (const sc_signed &u, const sc_uint_base &v)
1037{
1038 return operator / (u, (uint64)v);
1039}
1040
1041sc_signed
1042operator / (const sc_uint_base &u, const sc_signed &v)
1043{
1044 return operator / ((uint64)u, v);
1045}
1046
1047const sc_signed &
1048sc_signed::operator /= (const sc_uint_base &v)
1049{
1050 return operator /= ((uint64)v);
1051}
1052
1053
1054sc_signed
1055operator % (const sc_signed &u, const sc_uint_base &v)
1056{
1057 return operator % (u, (uint64)v);
1058}
1059
1060sc_signed
1061operator % (const sc_uint_base &u, const sc_signed &v)
1062{
1063 return operator % ((uint64)u, v);
1064}
1065
1066const sc_signed&
1067sc_signed::operator %= (const sc_uint_base &v)
1068{
1069 return operator %= ((uint64)v);
1070}
1071
1072
1073sc_signed
1074operator & (const sc_signed &u, const sc_uint_base &v)
1075{
1076 return operator & (u, (uint64)v);
1077}
1078
1079sc_signed
1080operator & (const sc_uint_base &u, const sc_signed &v)
1081{
1082 return operator & ((uint64)u, v);
1083}
1084
1085const sc_signed &
1086sc_signed::operator &= (const sc_uint_base &v)
1087{
1088 return operator &= ((uint64)v);
1089}
1090
1091
1092sc_signed
1093operator | (const sc_signed &u, const sc_uint_base &v)
1094{
1095 return operator | (u, (uint64)v);
1096}
1097
1098sc_signed
1099operator | (const sc_uint_base &u, const sc_signed &v)
1100{
1101 return operator | ((uint64)u, v);
1102}
1103
1104const sc_signed &
1105sc_signed::operator |= (const sc_uint_base &v)
1106{
1107 return operator |= ((uint64)v);
1108}
1109
1110
1111sc_signed
1112operator ^ (const sc_signed &u, const sc_uint_base &v)
1113{
1114 return operator ^ (u, (uint64)v);
1115}
1116
1117sc_signed
1118operator ^ (const sc_uint_base &u, const sc_signed &v)
1119{
1120 return operator ^ ((uint64)u, v);
1121}
1122
1123const sc_signed &
1124sc_signed::operator ^= (const sc_uint_base &v)
1125{
1126 return operator ^= ((uint64)v);
1127}
1128
1129
1130sc_signed
1131operator << (const sc_signed &u, const sc_uint_base &v)
1132{
1133 return operator << (u, (uint64)v);
1134}
1135
1136const sc_signed &
1137sc_signed::operator <<= (const sc_uint_base &v)
1138{
1139 return operator <<= ((uint64)v);
1140}
1141
1142
1143sc_signed
1144operator >> (const sc_signed& u, const sc_uint_base& v)
1145{
1146 return operator >> (u, (uint64)v);
1147}
1148
1149const sc_signed &
1150sc_signed::operator >>= (const sc_uint_base& v)
1151{
1152 return operator >>= ((uint64)v);
1153}
1154
1155
1156bool
1157operator == (const sc_signed &u, const sc_uint_base &v)
1158{
1159 return operator == (u, (uint64)v);
1160}
1161
1162bool
1163operator == (const sc_uint_base &u, const sc_signed &v)
1164{
1165 return operator == ((uint64)u, v);
1166}
1167
1168
1169bool
1170operator != (const sc_signed &u, const sc_uint_base &v)
1171{
1172 return operator != (u, (uint64)v);
1173}
1174
1175bool
1176operator != (const sc_uint_base &u, const sc_signed &v)
1177{
1178 return operator != ((uint64)u, v);
1179}
1180
1181
1182bool
1183operator < (const sc_signed &u, const sc_uint_base &v)
1184{
1185 return operator < (u, (uint64)v);
1186}
1187
1188bool
1189operator < (const sc_uint_base &u, const sc_signed &v)
1190{
1191 return operator < ((uint64)u, v);
1192}
1193
1194
1195bool
1196operator <= (const sc_signed &u, const sc_uint_base &v)
1197{
1198 return operator <= (u, (uint64)v);
1199}
1200
1201bool
1202operator <= (const sc_uint_base &u, const sc_signed &v)
1203{
1204 return operator <= ((uint64)u, v);
1205}
1206
1207
1208bool
1209operator > (const sc_signed &u, const sc_uint_base &v)
1210{
1211 return operator > (u, (uint64)v);
1212}
1213
1214bool
1215operator > (const sc_uint_base &u, const sc_signed &v)
1216{
1217 return operator > ((uint64)u, v);
1218}
1219
1220
1221bool
1222operator >= (const sc_signed &u, const sc_uint_base &v)
1223{
1224 return operator >= (u, (uint64)v);
1225}
1226
1227bool
1228operator >= (const sc_uint_base &u, const sc_signed &v)
1229{
1230 return operator >= ((uint64)u, v);
1231}
1232
1233
1234// ----------------------------------------------------------------------------
1235// SECTION: Input and output operators
1236// ----------------------------------------------------------------------------
1237
1238// Operators in this section are included from sc_nbcommon.cpp.
1239
1240
1241// ----------------------------------------------------------------------------
1242// SECTION: Operator macros.
1243// ----------------------------------------------------------------------------
1244
1245#define CONVERT_LONG(u) \
1246small_type u ## s = get_sign(u); \
1247sc_digit u ## d[DIGITS_PER_ULONG]; \
1248from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
1249
1250#define CONVERT_LONG_2(u) \
1251sc_digit u ## d[DIGITS_PER_ULONG]; \
1252from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
1253
1254#define CONVERT_INT(u) \
1255small_type u ## s = get_sign(u); \
1256sc_digit u ## d[DIGITS_PER_UINT]; \
1257from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
1258
1259#define CONVERT_INT_2(u) \
1260sc_digit u ## d[DIGITS_PER_UINT]; \
1261from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
1262
1263#define CONVERT_INT64(u) \
1264small_type u ## s = get_sign(u); \
1265sc_digit u ## d[DIGITS_PER_UINT64]; \
1266from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
1267
1268#define CONVERT_INT64_2(u) \
1269sc_digit u ## d[DIGITS_PER_UINT64]; \
1270from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
1271
1272
1273// ----------------------------------------------------------------------------
1274// SECTION: PLUS operators: +, +=, ++
1275// ----------------------------------------------------------------------------
1276
1277// Cases to consider when computing u + v:
1278// 1. 0 + v = v
1279// 2. u + 0 = u
1280// 3. if sgn(u) == sgn(v)
1281// 3.1 u + v = +(u + v) = sgn(u) * (u + v)
1282// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
1283// 4. if sgn(u) != sgn(v)
1284// 4.1 u + (-v) = u - v = sgn(u) * (u - v)
1285// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
1286//
1287// Specialization of above cases for computing ++u or u++:
1288// 1. 0 + 1 = 1
1289// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
1290// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
1291
1292sc_signed
1293operator + (const sc_unsigned &u, const sc_signed &v)
1294{
1295 if (u.sgn == SC_ZERO) // case 1
1296 return sc_signed(v);
1297
1298 if (v.sgn == SC_ZERO) // case 2
1299 return sc_signed(u);
1300
1301 // cases 3 and 4
1302 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1303 v.sgn, v.nbits, v.ndigits, v.digit);
1304}
1305
1306
1307sc_signed
1308operator + (const sc_signed &u, const sc_unsigned &v)
1309{
1310 if (u.sgn == SC_ZERO) // case 1
1311 return sc_signed(v);
1312
1313 if (v.sgn == SC_ZERO) // case 2
1314 return sc_signed(u);
1315
1316 // cases 3 and 4
1317 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1318 v.sgn, v.nbits, v.ndigits, v.digit);
1319}
1320
1321
1322sc_signed
1323operator + (const sc_signed &u, const sc_signed &v)
1324{
1325 if (u.sgn == SC_ZERO) // case 1
1326 return sc_signed(v);
1327
1328 if (v.sgn == SC_ZERO) // case 2
1329 return sc_signed(u);
1330
1331 // cases 3 and 4
1332 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1333 v.sgn, v.nbits, v.ndigits, v.digit);
1334}
1335
1336
1337sc_signed
1338operator + (const sc_signed &u, int64 v)
1339{
1340 if (v == 0) // case 2
1341 return sc_signed(u);
1342
1343 CONVERT_INT64(v);
1344
1345 if (u.sgn == SC_ZERO) // case 1
1346 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1347
1348 // cases 3 and 4
1349 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1350 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1351}
1352
1353
1354sc_signed
1355operator + (int64 u, const sc_signed &v)
1356{
1357 if (u == 0) // case 1
1358 return sc_signed(v);
1359
1360 CONVERT_INT64(u);
1361
1362 if (v.sgn == SC_ZERO) // case 2
1363 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1364
1365 // cases 3 and 4
1366 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1367 v.sgn, v.nbits, v.ndigits, v.digit);
1368}
1369
1370
1371sc_signed
1372operator + (const sc_unsigned &u, int64 v)
1373{
1374 if (v == 0) // case 2
1375 return sc_signed(u);
1376
1377 CONVERT_INT64(v);
1378
1379 if (u.sgn == SC_ZERO) // case 1
1380 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1381
1382 // cases 3 and 4
1383 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1384 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1385}
1386
1387
1388sc_signed
1389operator + (int64 u, const sc_unsigned &v)
1390{
1391 if (u == 0) // case 1
1392 return sc_signed(v);
1393
1394 CONVERT_INT64(u);
1395
1396 if (v.sgn == SC_ZERO) // case 2
1397 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1398
1399 // cases 3 and 4
1400 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1401 v.sgn, v.nbits, v.ndigits, v.digit);
1402}
1403
1404
1405sc_signed
1406operator + (const sc_signed &u, uint64 v)
1407{
1408 if (v == 0) // case 2
1409 return sc_signed(u);
1410
1411 CONVERT_INT64(v);
1412
1413 if (u.sgn == SC_ZERO) // case 1
1414 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1415
1416 // cases 3 and 4
1417 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1418 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1419}
1420
1421
1422sc_signed
1423operator + (uint64 u, const sc_signed &v)
1424{
1425 if (u == 0) // case 1
1426 return sc_signed(v);
1427
1428 CONVERT_INT64(u);
1429
1430 if (v.sgn == SC_ZERO) // case 2
1431 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1432
1433 // cases 3 and 4
1434 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1435 v.sgn, v.nbits, v.ndigits, v.digit);
1436}
1437
1438
1439sc_signed
1440operator + (const sc_signed &u, long v)
1441{
1442 if (v == 0) // case 2
1443 return sc_signed(u);
1444
1445 CONVERT_LONG(v);
1446
1447 if (u.sgn == SC_ZERO) // case 1
1448 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1449
1450 // cases 3 and 4
1451 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1452 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1453}
1454
1455
1456sc_signed
1457operator + (long u, const sc_signed &v)
1458{
1459 if (u == 0) // case 1
1460 return sc_signed(v);
1461
1462 CONVERT_LONG(u);
1463
1464 if (v.sgn == SC_ZERO) // case 2
1465 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1466
1467 // cases 3 and 4
1468 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1469 v.sgn, v.nbits, v.ndigits, v.digit);
1470}
1471
1472
1473sc_signed
1474operator + (const sc_unsigned &u, long v)
1475{
1476 if (v == 0) // case 2
1477 return sc_signed(u);
1478
1479 CONVERT_LONG(v);
1480
1481 if (u.sgn == SC_ZERO) // case 1
1482 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1483
1484 // cases 3 and 4
1485 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1486 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1487}
1488
1489
1490sc_signed
1491operator + (long u, const sc_unsigned &v)
1492{
1493 if (u == 0) // case 1
1494 return sc_signed(v);
1495
1496 CONVERT_LONG(u);
1497
1498 if (v.sgn == SC_ZERO) // case 2
1499 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1500
1501 // cases 3 and 4
1502 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1503 v.sgn, v.nbits, v.ndigits, v.digit);
1504}
1505
1506
1507sc_signed
1508operator + (const sc_signed &u, unsigned long v)
1509{
1510 if (v == 0) // case 2
1511 return sc_signed(u);
1512
1513 CONVERT_LONG(v);
1514
1515 if (u.sgn == SC_ZERO) // case 1
1516 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1517
1518 // cases 3 and 4
1519 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1520 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1521}
1522
1523
1524sc_signed
1525operator + (unsigned long u, const sc_signed &v)
1526{
1527 if (u == 0) // case 1
1528 return sc_signed(v);
1529
1530 CONVERT_LONG(u);
1531
1532 if (v.sgn == SC_ZERO) // case 2
1533 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1534
1535 // cases 3 and 4
1536 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1537 v.sgn, v.nbits, v.ndigits, v.digit);
1538}
1539
1540// The rest of the operators in this section are included from
1541// sc_nbcommon.cpp.
1542
1543// ----------------------------------------------------------------------------
1544// SECTION: MINUS operators: -, -=, --
1545// ----------------------------------------------------------------------------
1546
1547// Cases to consider when computing u + v:
1548// 1. u - 0 = u
1549// 2. 0 - v = -v
1550// 3. if sgn(u) != sgn(v)
1551// 3.1 u - (-v) = u + v = sgn(u) * (u + v)
1552// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
1553// 4. if sgn(u) == sgn(v)
1554// 4.1 u - v = +(u - v) = sgn(u) * (u - v)
1555// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
1556//
1557// Specialization of above cases for computing --u or u--:
1558// 1. 0 - 1 = -1
1559// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
1560// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
1561
1562sc_signed
1563operator - (const sc_unsigned &u, const sc_unsigned &v)
1564{
1565 if (v.sgn == SC_ZERO) // case 1
1566 return sc_signed(u);
1567
1568 if (u.sgn == SC_ZERO) // case 2
1569 return sc_signed(v, -v.sgn);
1570
1571 // cases 3 and 4
1572 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1573 -v.sgn, v.nbits, v.ndigits, v.digit);
1574}
1575
1576
1577sc_signed
1578operator - (const sc_unsigned &u, const sc_signed &v)
1579{
1580 if (v.sgn == SC_ZERO) // case 1
1581 return sc_signed(u);
1582
1583 if (u.sgn == SC_ZERO) // case 2
1584 return sc_signed(v, -v.sgn);
1585
1586 // cases 3 and 4
1587 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1588 -v.sgn, v.nbits, v.ndigits, v.digit);
1589}
1590
1591
1592sc_signed
1593operator - (const sc_signed &u, const sc_unsigned &v)
1594{
1595 if (v.sgn == SC_ZERO) // case 1
1596 return sc_signed(u);
1597
1598 if (u.sgn == SC_ZERO) // case 2
1599 return sc_signed(v, -v.sgn);
1600
1601 // cases 3 and 4
1602 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1603 -v.sgn, v.nbits, v.ndigits, v.digit);
1604}
1605
1606
1607sc_signed
1608operator - (const sc_signed &u, const sc_signed &v)
1609{
1610 if (v.sgn == SC_ZERO) // case 1
1611 return sc_signed(u);
1612
1613 if (u.sgn == SC_ZERO) // case 2
1614 return sc_signed(v, -v.sgn);
1615
1616 // cases 3 and 4
1617 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1618 -v.sgn, v.nbits, v.ndigits, v.digit);
1619}
1620
1621
1622sc_signed
1623operator - (const sc_signed &u, int64 v)
1624{
1625 if (v == 0) // case 1
1626 return sc_signed(u);
1627
1628 CONVERT_INT64(v);
1629
1630 if (u.sgn == SC_ZERO) // case 2
1631 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1632
1633 // cases 3 and 4
1634 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1635 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1636}
1637
1638
1639sc_signed
1640operator - (int64 u, const sc_signed &v)
1641{
1642 if (u == 0) // case 1
1643 return sc_signed(v, -v.sgn);
1644
1645 CONVERT_INT64(u);
1646
1647 if (v.sgn == SC_ZERO) // case 2
1648 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1649
1650 // cases 3 and 4
1651 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1652 -v.sgn, v.nbits, v.ndigits, v.digit);
1653}
1654
1655
1656sc_signed
1657operator - (const sc_unsigned &u, int64 v)
1658{
1659 if (v == 0) // case 1
1660 return sc_signed(u);
1661
1662 CONVERT_INT64(v);
1663
1664 if (u.sgn == SC_ZERO) // case 2
1665 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1666
1667 // cases 3 and 4
1668 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1669 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1670}
1671
1672
1673sc_signed
1674operator - (int64 u, const sc_unsigned &v)
1675{
1676 if (u == 0) // case 1
1677 return sc_signed(v, -v.sgn);
1678
1679 CONVERT_INT64(u);
1680
1681 if (v.sgn == SC_ZERO) // case 2
1682 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1683
1684 // cases 3 and 4
1685 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1686 -v.sgn, v.nbits, v.ndigits, v.digit);
1687}
1688
1689
1690sc_signed
1691operator - (const sc_signed &u, uint64 v)
1692{
1693 if (v == 0) // case 1
1694 return sc_signed(u);
1695
1696 CONVERT_INT64(v);
1697
1698 if (u.sgn == SC_ZERO) // case 2
1699 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1700
1701 // cases 3 and 4
1702
1703 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1704 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1705}
1706
1707
1708sc_signed
1709operator - (uint64 u, const sc_signed &v)
1710{
1711 if (u == 0) // case 1
1712 return sc_signed(v, -v.sgn);
1713
1714 CONVERT_INT64(u);
1715
1716 if (v.sgn == SC_ZERO) // case 2
1717 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1718
1719 // cases 3 and 4
1720 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1721 -v.sgn, v.nbits, v.ndigits, v.digit);
1722}
1723
1724
1725sc_signed
1726operator - (const sc_unsigned &u, uint64 v)
1727{
1728 if (v == 0) // case 1
1729 return sc_signed(u);
1730
1731 CONVERT_INT64(v);
1732
1733 if (u.sgn == SC_ZERO) // case 2
1734 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1735
1736 // cases 3 and 4
1737 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1738 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1739}
1740
1741
1742sc_signed
1743operator - (uint64 u, const sc_unsigned &v)
1744{
1745 if (u == 0) // case 1
1746 return sc_signed(v, -v.sgn);
1747
1748 CONVERT_INT64(u);
1749
1750 if (v.sgn == SC_ZERO) // case 2
1751 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1752
1753 // cases 3 and 4
1754 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1755 -v.sgn, v.nbits, v.ndigits, v.digit);
1756}
1757
1758
1759sc_signed
1760operator - (const sc_signed &u, long v)
1761{
1762 if (v == 0) // case 1
1763 return sc_signed(u);
1764
1765 CONVERT_LONG(v);
1766
1767 if (u.sgn == SC_ZERO) // case 2
1768 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1769
1770 // cases 3 and 4
1771 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1772 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1773}
1774
1775
1776sc_signed
1777operator - (long u, const sc_signed &v)
1778{
1779 if (u == 0) // case 1
1780 return sc_signed(v, -v.sgn);
1781
1782 CONVERT_LONG(u);
1783
1784 if (v.sgn == SC_ZERO) // case 2
1785 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1786
1787 // cases 3 and 4
1788 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1789 -v.sgn, v.nbits, v.ndigits, v.digit);
1790}
1791
1792
1793sc_signed
1794operator - (const sc_unsigned &u, long v)
1795{
1796 if (v == 0) // case 1
1797 return sc_signed(u);
1798
1799 CONVERT_LONG(v);
1800
1801 if (u.sgn == SC_ZERO) // case 2
1802 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1803
1804 // cases 3 and 4
1805 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1806 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1807}
1808
1809
1810sc_signed
1811operator - (long u, const sc_unsigned &v)
1812{
1813 if (u == 0) // case 1
1814 return sc_signed(v, -v.sgn);
1815
1816 CONVERT_LONG(u);
1817
1818 if (v.sgn == SC_ZERO) // case 2
1819 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1820
1821 // cases 3 and 4
1822 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1823 -v.sgn, v.nbits, v.ndigits, v.digit);
1824}
1825
1826
1827sc_signed
1828operator - (const sc_signed &u, unsigned long v)
1829{
1830 if (v == 0) // case 1
1831 return sc_signed(u);
1832
1833 CONVERT_LONG(v);
1834
1835 if (u.sgn == SC_ZERO) // case 2
1836 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1837
1838 // cases 3 and 4
1839 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1840 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1841}
1842
1843
1844sc_signed
1845operator - (unsigned long u, const sc_signed &v)
1846{
1847 if (u == 0) // case 1
1848 return sc_signed(v, -v.sgn);
1849
1850 CONVERT_LONG(u);
1851
1852 if (v.sgn == SC_ZERO) // case 2
1853 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1854
1855 // cases 3 and 4
1856 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1857 -v.sgn, v.nbits, v.ndigits, v.digit);
1858}
1859
1860
1861sc_signed
1862operator - (const sc_unsigned &u, unsigned long v)
1863{
1864 if (v == 0) // case 1
1865 return sc_signed(u);
1866
1867 CONVERT_LONG(v);
1868
1869 if (u.sgn == SC_ZERO) // case 2
1870 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1871
1872 // cases 3 and 4
1873 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1874 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1875}
1876
1877
1878sc_signed
1879operator - (unsigned long u, const sc_unsigned &v)
1880{
1881 if (u == 0) // case 1
1882 return sc_signed(v, -v.sgn);
1883
1884 CONVERT_LONG(u);
1885
1886 if (v.sgn == SC_ZERO) // case 2
1887 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1888
1889 // cases 3 and 4
1890 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1891 -v.sgn, v.nbits, v.ndigits, v.digit);
1892}
1893
1894// The rest of the operators in this section are included from
1895// sc_nbcommon.cpp.
1896
1897
1898// ----------------------------------------------------------------------------
1899// SECTION: MULTIPLICATION operators: *, *=
1900// ----------------------------------------------------------------------------
1901
1902// Cases to consider when computing u * v:
1903// 1. u * 0 = 0 * v = 0
1904// 2. 1 * v = v and -1 * v = -v
1905// 3. u * 1 = u and u * -1 = -u
1906// 4. u * v = u * v
1907
1908sc_signed
1909operator * (const sc_unsigned &u, const sc_signed &v)
1910{
1911 small_type s = mul_signs(u.sgn, v.sgn);
1912
1913 if (s == SC_ZERO) // case 1
1914 return sc_signed();
1915
1916 // cases 2-4
1917 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1918 v.nbits, v.ndigits, v.digit);
1919}
1920
1921
1922sc_signed
1923operator * (const sc_signed &u, const sc_unsigned &v)
1924{
1925 small_type s = mul_signs(u.sgn, v.sgn);
1926
1927 if (s == SC_ZERO) // case 1
1928 return sc_signed();
1929
1930 // cases 2-4
1931 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1932 v.nbits, v.ndigits, v.digit);
1933}
1934
1935
1936sc_signed
1937operator * (const sc_signed &u, const sc_signed &v)
1938{
1939 small_type s = mul_signs(u.sgn, v.sgn);
1940
1941 if (s == SC_ZERO) // case 1
1942 return sc_signed();
1943
1944 // cases 2-4
1945 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1946 v.nbits, v.ndigits, v.digit);
1947}
1948
1949
1950sc_signed
1951operator * (const sc_signed &u, int64 v)
1952{
1953 small_type s = mul_signs(u.sgn, get_sign(v));
1954
1955 if (s == SC_ZERO) // case 1
1956 return sc_signed();
1957
1958 CONVERT_INT64_2(v);
1959
1960 // cases 2-4
1961 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1962 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1963}
1964
1965
1966sc_signed
1967operator * (int64 u, const sc_signed &v)
1968{
1969 small_type s = mul_signs(v.sgn, get_sign(u));
1970
1971 if (s == SC_ZERO) // case 1
1972 return sc_signed();
1973
1974 CONVERT_INT64_2(u);
1975
1976 // cases 2-4
1977 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1978 v.nbits, v.ndigits, v.digit);
1979}
1980
1981
1982sc_signed
1983operator * (const sc_unsigned &u, int64 v)
1984{
1985 small_type s = mul_signs(u.sgn, get_sign(v));
1986
1987 if (s == SC_ZERO) // case 1
1988 return sc_signed();
1989
1990 CONVERT_INT64_2(v);
1991
1992 // cases 2-4
1993 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1994 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1995}
1996
1997
1998sc_signed
1999operator * (int64 u, const sc_unsigned &v)
2000{
2001 small_type s = mul_signs(v.sgn, get_sign(u));
2002
2003 if (s == SC_ZERO) // case 1
2004 return sc_signed();
2005
2006 CONVERT_INT64_2(u);
2007
2008 // cases 2-4
2009 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2010 v.nbits, v.ndigits, v.digit);
2011}
2012
2013
2014sc_signed
2015operator * (const sc_signed &u, uint64 v)
2016{
2017 small_type s = mul_signs(u.sgn, get_sign(v));
2018
2019 if (s == SC_ZERO) // case 1
2020 return sc_signed();
2021
2022 CONVERT_INT64_2(v);
2023
2024 // cases 2-4
2025 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2026 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2027}
2028
2029
2030sc_signed
2031operator * (uint64 u, const sc_signed &v)
2032{
2033 small_type s = mul_signs(v.sgn, get_sign(u));
2034
2035 if (s == SC_ZERO) // case 1
2036 return sc_signed();
2037
2038 CONVERT_INT64_2(u);
2039
2040 // cases 2-4
2041 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2042 v.nbits, v.ndigits, v.digit);
2043}
2044
2045
2046sc_signed
2047operator * (const sc_signed &u, long v)
2048{
2049 small_type s = mul_signs(u.sgn, get_sign(v));
2050
2051 if (s == SC_ZERO) // case 1
2052 return sc_signed();
2053
2054 CONVERT_LONG_2(v);
2055
2056 // cases 2-4
2057 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2058 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2059}
2060
2061
2062sc_signed
2063operator * (long u, const sc_signed &v)
2064{
2065 small_type s = mul_signs(v.sgn, get_sign(u));
2066
2067 if (s == SC_ZERO) // case 1
2068 return sc_signed();
2069
2070 CONVERT_LONG_2(u);
2071
2072 // cases 2-4
2073 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2074 v.nbits, v.ndigits, v.digit);
2075}
2076
2077
2078sc_signed
2079operator * (const sc_unsigned &u, long v)
2080{
2081 small_type s = mul_signs(u.sgn, get_sign(v));
2082
2083 if (s == SC_ZERO) // case 1
2084 return sc_signed();
2085
2086 CONVERT_LONG_2(v);
2087
2088 // cases 2-4
2089 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2090 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2091}
2092
2093
2094sc_signed
2095operator * (long u, const sc_unsigned &v)
2096{
2097 small_type s = mul_signs(v.sgn, get_sign(u));
2098
2099 if (s == SC_ZERO) // case 1
2100 return sc_signed();
2101
2102 CONVERT_LONG_2(u);
2103
2104 // cases 2-4
2105 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2106 v.nbits, v.ndigits, v.digit);
2107}
2108
2109
2110sc_signed
2111operator * (const sc_signed &u, unsigned long v)
2112{
2113 small_type s = mul_signs(u.sgn, get_sign(v));
2114
2115 if (s == SC_ZERO) // case 1
2116 return sc_signed();
2117
2118 CONVERT_LONG_2(v);
2119
2120 // else cases 2-4
2121 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2122 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2123}
2124
2125sc_signed
2126operator * (unsigned long u, const sc_signed &v)
2127{
2128 small_type s = mul_signs(v.sgn, get_sign(u));
2129
2130 if (s == SC_ZERO) // case 1
2131 return sc_signed();
2132
2133 CONVERT_LONG_2(u);
2134
2135 // cases 2-4
2136 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2137 v.nbits, v.ndigits, v.digit);
2138}
2139
2140// The rest of the operators in this section are included from
2141// sc_nbcommon.cpp.
2142
2143
2144// ----------------------------------------------------------------------------
2145// SECTION: DIVISION operators: /, /=
2146// ----------------------------------------------------------------------------
2147
2148// Cases to consider when finding the quotient q = floor(u/v):
2149// Note that u = q * v + r for r < q.
2150// 1. 0 / 0 or u / 0 => error
2151// 2. 0 / v => 0 = 0 * v + 0
2152// 3. u / v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
2153// 4. u / v & &u < v => u = 0 * v + u - u can be 1 or -1
2154// 5. u / v & &u > v => u = q * v + r - v can be 1 or -1
2155
2156sc_signed
2157operator / (const sc_unsigned &u, const sc_signed &v)
2158{
2159 small_type s = mul_signs(u.sgn, v.sgn);
2160
2161 if (s == SC_ZERO) {
2162 div_by_zero(v.sgn); // case 1
2163 return sc_signed(); // case 2
2164 }
2165
2166 // other cases
2167 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2168 v.nbits, v.ndigits, v.digit);
2169}
2170
2171
2172sc_signed
2173operator / (const sc_signed &u, const sc_unsigned &v)
2174{
2175 small_type s = mul_signs(u.sgn, v.sgn);
2176
2177 if (s == SC_ZERO) {
2178 div_by_zero(v.sgn); // case 1
2179 return sc_signed(); // case 2
2180 }
2181
2182 // other cases
2183 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2184 v.nbits, v.ndigits, v.digit);
2185}
2186
2187
2188sc_signed
2189operator / (const sc_signed &u, const sc_signed &v)
2190{
2191 small_type s = mul_signs(u.sgn, v.sgn);
2192
2193 if (s == SC_ZERO) {
2194 div_by_zero(v.sgn); // case 1
2195 return sc_signed(); // case 2
2196 }
2197
2198 // other cases
2199 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2200 v.nbits, v.ndigits, v.digit);
2201}
2202
2203
2204sc_signed
2205operator / (const sc_signed &u, int64 v)
2206{
2207 small_type s = mul_signs(u.sgn, get_sign(v));
2208
2209 if (s == SC_ZERO) {
2210 div_by_zero(v); // case 1
2211 return sc_signed(); // case 2
2212 }
2213
2214 CONVERT_INT64_2(v);
2215
2216 // other cases
2217 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2218 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2219}
2220
2221
2222sc_signed
2223operator / (int64 u, const sc_signed &v)
2224{
2225 small_type s = mul_signs(v.sgn, get_sign(u));
2226
2227 if (s == SC_ZERO) {
2228 div_by_zero(v.sgn); // case 1
2229 return sc_signed(); // case 2
2230 }
2231
2232 CONVERT_INT64_2(u);
2233
2234 // other cases
2235 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2236 v.nbits, v.ndigits, v.digit);
2237}
2238
2239
2240sc_signed
2241operator / (const sc_unsigned &u, int64 v)
2242{
2243 small_type s = mul_signs(u.sgn, get_sign(v));
2244
2245 if (s == SC_ZERO) {
2246 div_by_zero(v); // case 1
2247 return sc_signed(); // case 2
2248 }
2249
2250 CONVERT_INT64_2(v);
2251
2252 // other cases
2253 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2254 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2255}
2256
2257
2258sc_signed
2259operator / (int64 u, const sc_unsigned &v)
2260{
2261 small_type s = mul_signs(v.sgn, get_sign(u));
2262
2263 if (s == SC_ZERO) {
2264 div_by_zero(v.sgn); // case 1
2265 return sc_signed(); // case 2
2266 }
2267
2268 CONVERT_INT64_2(u);
2269
2270 // other cases
2271 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2272 v.nbits, v.ndigits, v.digit);
2273}
2274
2275
2276sc_signed
2277operator / (const sc_signed &u, uint64 v)
2278{
2279 small_type s = mul_signs(u.sgn, get_sign(v));
2280
2281 if (s == SC_ZERO) {
2282 div_by_zero(v); // case 1
2283 return sc_signed(); // case 2
2284 }
2285
2286 CONVERT_INT64_2(v);
2287
2288 // other cases
2289 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2290 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2291}
2292
2293
2294sc_signed
2295operator / (uint64 u, const sc_signed &v)
2296{
2297 small_type s = mul_signs(v.sgn, get_sign(u));
2298
2299 if (s == SC_ZERO) {
2300 div_by_zero(v.sgn); // case 1
2301 return sc_signed(); // case 2
2302
2303 }
2304
2305 CONVERT_INT64_2(u);
2306
2307 // other cases
2308 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2309 v.nbits, v.ndigits, v.digit);
2310}
2311
2312
2313sc_signed
2314operator / (const sc_signed &u, long v)
2315{
2316 small_type s = mul_signs(u.sgn, get_sign(v));
2317
2318 if (s == SC_ZERO) {
2319 div_by_zero(v); // case 1
2320 return sc_signed(); // case 2
2321 }
2322
2323 CONVERT_LONG_2(v);
2324
2325 // other cases
2326 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2327 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2328}
2329
2330
2331sc_signed
2332operator / (long u, const sc_signed &v)
2333{
2334 small_type s = mul_signs(v.sgn, get_sign(u));
2335
2336 if (s == SC_ZERO) {
2337 div_by_zero(v.sgn); // case 1
2338 return sc_signed(); // case 2
2339 }
2340
2341 CONVERT_LONG_2(u);
2342
2343 // other cases
2344 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2345 v.nbits, v.ndigits, v.digit);
2346}
2347
2348
2349sc_signed
2350operator / (const sc_unsigned &u, long v)
2351{
2352 small_type s = mul_signs(u.sgn, get_sign(v));
2353
2354 if (s == SC_ZERO) {
2355 div_by_zero(v); // case 1
2356 return sc_signed(); // case 2
2357 }
2358
2359 CONVERT_LONG_2(v);
2360
2361 // other cases
2362 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2363 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2364}
2365
2366
2367sc_signed
2368operator / (long u, const sc_unsigned &v)
2369{
2370 small_type s = mul_signs(v.sgn, get_sign(u));
2371
2372 if (s == SC_ZERO) {
2373 div_by_zero(v.sgn); // case 1
2374 return sc_signed(); // case 2
2375 }
2376
2377 CONVERT_LONG_2(u);
2378
2379 // other cases
2380 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2381 v.nbits, v.ndigits, v.digit);
2382}
2383
2384
2385sc_signed
2386operator / (const sc_signed &u, unsigned long v)
2387{
2388 small_type s = mul_signs(u.sgn, get_sign(v));
2389
2390 if (s == SC_ZERO) {
2391 div_by_zero(v); // case 1
2392 return sc_signed(); // case 2
2393 }
2394
2395 CONVERT_LONG_2(v);
2396
2397 // other cases
2398 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2399 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2400}
2401
2402
2403sc_signed
2404operator / (unsigned long u, const sc_signed &v)
2405{
2406 small_type s = mul_signs(v.sgn, get_sign(u));
2407
2408 if (s == SC_ZERO) {
2409 div_by_zero(v.sgn); // case 1
2410 return sc_signed(); // case 2
2411
2412 }
2413
2414 CONVERT_LONG_2(u);
2415
2416 // other cases
2417 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2418 v.nbits, v.ndigits, v.digit);
2419}
2420
2421// The rest of the operators in this section are included from
2422// sc_nbcommon.cpp.
2423
2424
2425// ----------------------------------------------------------------------------
2426// SECTION: MOD operators: %, %=.
2427// ----------------------------------------------------------------------------
2428
2429// Cases to consider when finding the remainder r = u % v:
2430// Note that u = q * v + r for r < q.
2431// 1. 0 % 0 or u % 0 => error
2432// 2. 0 % v => 0 = 0 * v + 0
2433// 3. u % v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
2434// 4. u % v & &u < v => u = 0 * v + u - u can be 1 or -1
2435// 5. u % v & &u > v => u = q * v + r - v can be 1 or -1
2436
2437sc_signed
2438operator % (const sc_unsigned &u, const sc_signed &v)
2439{
2440 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2441 div_by_zero(v.sgn); // case 1
2442 return sc_signed(); // case 2
2443 }
2444
2445 // other cases
2446 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2447 v.nbits, v.ndigits, v.digit);
2448}
2449
2450
2451sc_signed
2452operator % (const sc_signed &u, const sc_unsigned &v)
2453{
2454 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2455 div_by_zero(v.sgn); // case 1
2456 return sc_signed(); // case 2
2457 }
2458
2459 // other cases
2460 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2461 v.nbits, v.ndigits, v.digit);
2462}
2463
2464
2465sc_signed
2466operator % (const sc_signed &u, const sc_signed &v)
2467{
2468 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2469 div_by_zero(v.sgn); // case 1
2470 return sc_signed(); // case 2
2471 }
2472
2473 // other cases
2474 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2475 v.nbits, v.ndigits, v.digit);
2476}
2477
2478
2479sc_signed
2480operator % (const sc_signed &u, int64 v)
2481{
2482 small_type vs = get_sign(v);
2483
2484 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2485 div_by_zero(v); // case 1
2486 return sc_signed(); // case 2
2487 }
2488
2489 CONVERT_INT64_2(v);
2490
2491 // other cases
2492 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2493 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2494}
2495
2496
2497sc_signed
2498operator % (int64 u, const sc_signed &v)
2499{
2500 small_type us = get_sign(u);
2501
2502 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2503 div_by_zero(v.sgn); // case 1
2504 return sc_signed(); // case 2
2505 }
2506
2507 CONVERT_INT64_2(u);
2508
2509 // other cases
2510 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2511 v.nbits, v.ndigits, v.digit);
2512}
2513
2514
2515sc_signed
2516operator % (const sc_unsigned &u, int64 v)
2517{
2518 small_type vs = get_sign(v);
2519
2520 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2521 div_by_zero(v); // case 1
2522 return sc_signed(); // case 2
2523 }
2524
2525 CONVERT_INT64_2(v);
2526
2527 // other cases
2528 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2529 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2530}
2531
2532
2533sc_signed
2534operator % (int64 u, const sc_unsigned &v)
2535{
2536 small_type us = get_sign(u);
2537
2538 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2539 div_by_zero(v.sgn); // case 1
2540 return sc_signed(); // case 2
2541 }
2542
2543 CONVERT_INT64_2(u);
2544
2545 // other cases
2546 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2547 v.nbits, v.ndigits, v.digit);
2548}
2549
2550
2551sc_signed
2552operator % (const sc_signed &u, uint64 v)
2553{
2554 if ((u.sgn == SC_ZERO) || (v == 0)) {
2555 div_by_zero(v); // case 1
2556 return sc_signed(); // case 2
2557 }
2558
2559 CONVERT_INT64_2(v);
2560
2561 // other cases
2562 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2563 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2564}
2565
2566
2567sc_signed
2568operator % (uint64 u, const sc_signed &v)
2569{
2570 if ((u == 0) || (v.sgn == SC_ZERO)) {
2571 div_by_zero(v.sgn); // case 1
2572 return sc_signed(); // case 2
2573 }
2574
2575 CONVERT_INT64(u);
2576
2577 // other cases
2578 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2579 v.nbits, v.ndigits, v.digit);
2580}
2581
2582
2583sc_signed
2584operator % (const sc_signed &u, long v)
2585{
2586 small_type vs = get_sign(v);
2587
2588 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2589 div_by_zero(v); // case 1
2590 return sc_signed(); // case 2
2591 }
2592
2593 CONVERT_LONG_2(v);
2594
2595 // other cases
2596 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2597 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2598}
2599
2600
2601sc_signed
2602operator % (long u, const sc_signed &v)
2603{
2604 small_type us = get_sign(u);
2605
2606 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2607 div_by_zero(v.sgn); // case 1
2608 return sc_signed(); // case 2
2609 }
2610
2611 CONVERT_LONG_2(u);
2612
2613 // other cases
2614 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2615 v.nbits, v.ndigits, v.digit);
2616}
2617
2618
2619sc_signed
2620operator % (const sc_unsigned &u, long v)
2621{
2622
2623 small_type vs = get_sign(v);
2624
2625 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2626 div_by_zero(v); // case 1
2627 return sc_signed(); // case 2
2628 }
2629
2630 CONVERT_LONG_2(v);
2631
2632 // other cases
2633 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2634 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2635}
2636
2637
2638sc_signed
2639operator % (long u, const sc_unsigned &v)
2640{
2641 small_type us = get_sign(u);
2642
2643 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2644 div_by_zero(v.sgn); // case 1
2645 return sc_signed(); // case 2
2646 }
2647
2648 CONVERT_LONG_2(u);
2649
2650 // other cases
2651 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2652 v.nbits, v.ndigits, v.digit);
2653}
2654
2655
2656sc_signed
2657operator % (const sc_signed &u, unsigned long v)
2658{
2659 if ((u.sgn == SC_ZERO) || (v == 0)) {
2660 div_by_zero(v); // case 1
2661 return sc_signed(); // case 2
2662 }
2663
2664 CONVERT_LONG_2(v);
2665
2666 // other cases
2667 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2668 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2669}
2670
2671
2672sc_signed
2673operator % (unsigned long u, const sc_signed &v)
2674{
2675 if ((u == 0) || (v.sgn == SC_ZERO)) {
2676 div_by_zero(v.sgn); // case 1
2677 return sc_signed(); // case 2
2678 }
2679
2680 CONVERT_LONG(u);
2681
2682 // other cases
2683 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2684 v.nbits, v.ndigits, v.digit);
2685}
2686
2687// The rest of the operators in this section are included from
2688// sc_nbcommon.cpp.
2689
2690
2691// ----------------------------------------------------------------------------
2692// SECTION: Bitwise AND operators: &, &=
2693// ----------------------------------------------------------------------------
2694
2695// Cases to consider when computing u &v:
2696// 1. u & 0 = 0 &v = 0
2697// 2. u &v => sgn = +
2698// 3. (-u) & (-v) => sgn = -
2699// 4. u & (-v) => sgn = +
2700// 5. (-u) &v => sgn = +
2701
2702sc_signed
2703operator & (const sc_unsigned &u, const sc_signed &v)
2704{
2705 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2706 return sc_signed();
2707
2708 // other cases
2709 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2710 v.sgn, v.nbits, v.ndigits, v.digit);
2711}
2712
2713
2714sc_signed
2715operator & (const sc_signed &u, const sc_unsigned &v)
2716{
2717 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2718 return sc_signed();
2719
2720 // other cases
2721 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2722 v.sgn, v.nbits, v.ndigits, v.digit);
2723}
2724
2725
2726sc_signed
2727operator & (const sc_signed &u, const sc_signed &v)
2728{
2729 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2730 return sc_signed();
2731
2732 // other cases
2733 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2734 v.sgn, v.nbits, v.ndigits, v.digit);
2735}
2736
2737
2738sc_signed
2739operator & (const sc_signed &u, int64 v)
2740{
2741 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2742 return sc_signed();
2743
2744 CONVERT_INT64(v);
2745
2746 // other cases
2747 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2748 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2749}
2750
2751
2752sc_signed
2753operator & (int64 u, const sc_signed &v)
2754{
2755 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2756 return sc_signed();
2757
2758 CONVERT_INT64(u);
2759
2760 // other cases
2761 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2762 v.sgn, v.nbits, v.ndigits, v.digit);
2763}
2764
2765
2766sc_signed
2767operator & (const sc_unsigned &u, int64 v)
2768{
2769 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2770 return sc_signed();
2771
2772 CONVERT_INT64(v);
2773
2774 // other cases
2775 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2776 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2777}
2778
2779
2780sc_signed
2781operator & (int64 u, const sc_unsigned &v)
2782{
2783 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2784 return sc_signed();
2785
2786 CONVERT_INT64(u);
2787
2788 // other cases
2789 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2790 v.sgn, v.nbits, v.ndigits, v.digit);
2791}
2792
2793
2794sc_signed
2795operator & (const sc_signed &u, uint64 v)
2796{
2797 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2798 return sc_signed();
2799
2800 CONVERT_INT64(v);
2801
2802 // other cases
2803 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2804 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2805}
2806
2807
2808sc_signed
2809operator & (uint64 u, const sc_signed &v)
2810{
2811 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2812 return sc_signed();
2813
2814 CONVERT_INT64(u);
2815
2816 // other cases
2817 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2818 v.sgn, v.nbits, v.ndigits, v.digit);
2819}
2820
2821
2822sc_signed
2823operator & (const sc_signed &u, long v)
2824{
2825 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2826 return sc_signed();
2827
2828 CONVERT_LONG(v);
2829
2830 // other cases
2831 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2832 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2833}
2834
2835
2836sc_signed
2837operator & (long u, const sc_signed &v)
2838{
2839 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2840 return sc_signed();
2841
2842 CONVERT_LONG(u);
2843
2844 // other cases
2845 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2846 v.sgn, v.nbits, v.ndigits, v.digit);
2847}
2848
2849
2850sc_signed
2851operator & (const sc_unsigned &u, long v)
2852{
2853 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2854 return sc_signed();
2855
2856 CONVERT_LONG(v);
2857
2858 // other cases
2859 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2860 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2861}
2862
2863
2864sc_signed
2865operator & (long u, const sc_unsigned &v)
2866{
2867 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2868 return sc_signed();
2869
2870 CONVERT_LONG(u);
2871
2872 // other cases
2873 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2874 v.sgn, v.nbits, v.ndigits, v.digit);
2875}
2876
2877
2878sc_signed
2879operator & (const sc_signed &u, unsigned long v)
2880{
2881 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2882 return sc_signed();
2883
2884 CONVERT_LONG(v);
2885
2886 // other cases
2887 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2888 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2889}
2890
2891
2892sc_signed
2893operator & (unsigned long u, const sc_signed &v)
2894{
2895 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2896 return sc_signed();
2897
2898 CONVERT_LONG(u);
2899
2900 // other cases
2901 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2902 v.sgn, v.nbits, v.ndigits, v.digit);
2903}
2904
2905// The rest of the operators in this section are included from
2906// sc_nbcommon.cpp.
2907
2908
2909// ----------------------------------------------------------------------------
2910// SECTION: Bitwise OR operators: |, |=
2911// ----------------------------------------------------------------------------
2912
2913// Cases to consider when computing u | v:
2914// 1. u | 0 = u
2915// 2. 0 | v = v
2916// 3. u | v => sgn = +
2917// 4. (-u) | (-v) => sgn = -
2918// 5. u | (-v) => sgn = -
2919// 6. (-u) | v => sgn = -
2920
2921sc_signed
2922operator | (const sc_unsigned &u, const sc_signed &v)
2923{
2924 if (v.sgn == SC_ZERO) // case 1
2925 return sc_signed(u);
2926
2927 if (u.sgn == SC_ZERO) // case 2
2928 return sc_signed(v);
2929
2930 // other cases
2931 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2932 v.sgn, v.nbits, v.ndigits, v.digit);
2933}
2934
2935
2936sc_signed
2937operator | (const sc_signed &u, const sc_unsigned &v)
2938{
2939 if (v.sgn == SC_ZERO) // case 1
2940 return sc_signed(u);
2941
2942 if (u.sgn == SC_ZERO) // case 2
2943 return sc_signed(v);
2944
2945 // other cases
2946 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2947 v.sgn, v.nbits, v.ndigits, v.digit);
2948}
2949
2950
2951sc_signed
2952operator | (const sc_signed &u, const sc_signed &v)
2953{
2954 if (v.sgn == SC_ZERO) // case 1
2955 return sc_signed(u);
2956
2957 if (u.sgn == SC_ZERO) // case 2
2958 return sc_signed(v);
2959
2960 // other cases
2961 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2962 v.sgn, v.nbits, v.ndigits, v.digit);
2963}
2964
2965
2966sc_signed
2967operator | (const sc_signed &u, int64 v)
2968{
2969 if (v == 0) // case 1
2970 return sc_signed(u);
2971
2972 CONVERT_INT64(v);
2973
2974 if (u.sgn == SC_ZERO) // case 2
2975 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
2976
2977 // other cases
2978 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2979 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2980}
2981
2982
2983sc_signed
2984operator | (int64 u, const sc_signed &v)
2985{
2986 if (u == 0)
2987 return sc_signed(v);
2988
2989 CONVERT_INT64(u);
2990
2991 if (v.sgn == SC_ZERO)
2992 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
2993
2994 // other cases
2995 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2996 v.sgn, v.nbits, v.ndigits, v.digit);
2997}
2998
2999
3000sc_signed
3001operator | (const sc_unsigned &u, int64 v)
3002{
3003 if (v == 0) // case 1
3004 return sc_signed(u);
3005
3006 CONVERT_INT64(v);
3007
3008 if (u.sgn == SC_ZERO) // case 2
3009 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3010
3011 // other cases
3012 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3013 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3014}
3015
3016
3017sc_signed
3018operator | (int64 u, const sc_unsigned &v)
3019{
3020 if (u == 0)
3021 return sc_signed(v);
3022
3023 CONVERT_INT64(u);
3024
3025 if (v.sgn == SC_ZERO)
3026 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3027
3028 // other cases
3029 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3030 v.sgn, v.nbits, v.ndigits, v.digit);
3031}
3032
3033
3034sc_signed
3035operator | (const sc_signed &u, uint64 v)
3036{
3037 if (v == 0) // case 1
3038 return sc_signed(u);
3039
3040 CONVERT_INT64(v);
3041
3042 if (u.sgn == SC_ZERO) // case 2
3043 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3044
3045 // other cases
3046 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3047 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3048}
3049
3050
3051sc_signed
3052operator | (uint64 u, const sc_signed &v)
3053{
3054 if (u == 0)
3055 return sc_signed(v);
3056
3057 CONVERT_INT64(u);
3058
3059 if (v.sgn == SC_ZERO)
3060 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3061
3062 // other cases
3063 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3064 v.sgn, v.nbits, v.ndigits, v.digit);
3065}
3066
3067
3068sc_signed
3069operator | (const sc_signed &u, long v)
3070{
3071 if (v == 0) // case 1
3072 return sc_signed(u);
3073
3074 CONVERT_LONG(v);
3075
3076 if (u.sgn == SC_ZERO) // case 2
3077 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3078
3079 // other cases
3080 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3081 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3082}
3083
3084
3085sc_signed
3086operator | (long u, const sc_signed &v)
3087{
3088 if (u == 0)
3089 return sc_signed(v);
3090
3091 CONVERT_LONG(u);
3092
3093 if (v.sgn == SC_ZERO)
3094 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3095
3096 // other cases
3097 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3098 v.sgn, v.nbits, v.ndigits, v.digit);
3099}
3100
3101
3102sc_signed
3103operator | (const sc_unsigned &u, long v)
3104{
3105 if (v == 0) // case 1
3106 return sc_signed(u);
3107
3108 CONVERT_LONG(v);
3109
3110 if (u.sgn == SC_ZERO) // case 2
3111 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3112
3113 // other cases
3114 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3115 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3116}
3117
3118
3119sc_signed
3120operator | (long u, const sc_unsigned &v)
3121{
3122 if (u == 0)
3123 return sc_signed(v);
3124
3125 CONVERT_LONG(u);
3126
3127 if (v.sgn == SC_ZERO)
3128 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3129
3130 // other cases
3131 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3132 v.sgn, v.nbits, v.ndigits, v.digit);
3133}
3134
3135
3136sc_signed
3137operator | (const sc_signed &u, unsigned long v)
3138{
3139 if (v == 0) // case 1
3140 return sc_signed(u);
3141
3142 CONVERT_LONG(v);
3143
3144 if (u.sgn == SC_ZERO) // case 2
3145 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3146
3147 // other cases
3148 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3149 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3150}
3151
3152
3153sc_signed
3154operator | (unsigned long u, const sc_signed &v)
3155{
3156 if (u == 0)
3157 return sc_signed(v);
3158
3159 CONVERT_LONG(u);
3160
3161 if (v.sgn == SC_ZERO)
3162 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3163
3164 // other cases
3165 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3166 v.sgn, v.nbits, v.ndigits, v.digit);
3167}
3168
3169// The rest of the operators in this section are included from
3170// sc_nbcommon.cpp.
3171
3172
3173// ----------------------------------------------------------------------------
3174// SECTION: Bitwise XOR operators: ^, ^=
3175// ----------------------------------------------------------------------------
3176
3177// Cases to consider when computing u ^ v:
3178// Note that u ^ v = (~u &v) | (u & ~v).
3179// 1. u ^ 0 = u
3180// 2. 0 ^ v = v
3181// 3. u ^ v => sgn = +
3182// 4. (-u) ^ (-v) => sgn = -
3183// 5. u ^ (-v) => sgn = -
3184// 6. (-u) ^ v => sgn = +
3185
3186sc_signed
3187operator ^ (const sc_unsigned &u, const sc_signed &v)
3188{
3189
3190 if (v.sgn == SC_ZERO) // case 1
3191 return sc_signed(u);
3192
3193 if (u.sgn == SC_ZERO) // case 2
3194 return sc_signed(v);
3195
3196 // other cases
3197 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3198 v.sgn, v.nbits, v.ndigits, v.digit);
3199
3200}
3201
3202
3203sc_signed
3204operator ^ (const sc_signed &u, const sc_unsigned &v)
3205{
3206 if (v.sgn == SC_ZERO) // case 1
3207 return sc_signed(u);
3208
3209 if (u.sgn == SC_ZERO) // case 2
3210 return sc_signed(v);
3211
3212 // other cases
3213 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3214 v.sgn, v.nbits, v.ndigits, v.digit);
3215}
3216
3217
3218sc_signed
3219operator ^ (const sc_signed &u, const sc_signed &v)
3220{
3221 if (v.sgn == SC_ZERO) // case 1
3222 return sc_signed(u);
3223
3224 if (u.sgn == SC_ZERO) // case 2
3225 return sc_signed(v);
3226
3227 // other cases
3228 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3229 v.sgn, v.nbits, v.ndigits, v.digit);
3230}
3231
3232
3233sc_signed
3234operator ^ (const sc_signed &u, int64 v)
3235{
3236 if (v == 0) // case 1
3237 return sc_signed(u);
3238
3239 CONVERT_INT64(v);
3240
3241 if (u.sgn == SC_ZERO) // case 2
3242 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3243
3244 // other cases
3245 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3246 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3247}
3248
3249
3250sc_signed
3251operator ^ (int64 u, const sc_signed &v)
3252{
3253 if (u == 0)
3254 return sc_signed(v);
3255
3256 CONVERT_INT64(u);
3257
3258 if (v.sgn == SC_ZERO)
3259 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3260
3261 // other cases
3262 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3263 v.sgn, v.nbits, v.ndigits, v.digit);
3264}
3265
3266
3267sc_signed
3268operator ^ (const sc_unsigned &u, int64 v)
3269{
3270 if (v == 0) // case 1
3271 return sc_signed(u);
3272
3273 CONVERT_INT64(v);
3274
3275 if (u.sgn == SC_ZERO) // case 2
3276 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3277
3278 // other cases
3279 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3280 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3281}
3282
3283
3284sc_signed
3285operator ^ (int64 u, const sc_unsigned &v)
3286{
3287 if (u == 0)
3288 return sc_signed(v);
3289
3290 CONVERT_INT64(u);
3291
3292 if (v.sgn == SC_ZERO)
3293 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3294
3295 // other cases
3296 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3297 v.sgn, v.nbits, v.ndigits, v.digit);
3298}
3299
3300
3301sc_signed
3302operator ^ (const sc_signed &u, uint64 v)
3303{
3304 if (v == 0) // case 1
3305 return sc_signed(u);
3306
3307 CONVERT_INT64(v);
3308
3309 if (u.sgn == SC_ZERO) // case 2
3310 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3311
3312 // other cases
3313 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3314 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3315}
3316
3317sc_signed
3318operator ^ (uint64 u, const sc_signed &v)
3319{
3320 if (u == 0)
3321 return sc_signed(v);
3322
3323 CONVERT_INT64(u);
3324
3325 if (v.sgn == SC_ZERO)
3326 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3327
3328 // other cases
3329 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3330 v.sgn, v.nbits, v.ndigits, v.digit);
3331}
3332
3333
3334sc_signed
3335operator ^ (const sc_signed &u, long v)
3336{
3337 if (v == 0) // case 1
3338 return sc_signed(u);
3339
3340 CONVERT_LONG(v);
3341
3342 if (u.sgn == SC_ZERO) // case 2
3343 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3344
3345 // other cases
3346 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3347 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3348}
3349
3350
3351sc_signed
3352operator ^ (long u, const sc_signed &v)
3353{
3354 if (u == 0)
3355 return sc_signed(v);
3356
3357 CONVERT_LONG(u);
3358
3359 if (v.sgn == SC_ZERO)
3360 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3361
3362 // other cases
3363 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3364 v.sgn, v.nbits, v.ndigits, v.digit);
3365}
3366
3367
3368sc_signed
3369operator ^ (const sc_unsigned &u, long v)
3370{
3371 if (v == 0) // case 1
3372 return sc_signed(u);
3373
3374 CONVERT_LONG(v);
3375
3376 if (u.sgn == SC_ZERO) // case 2
3377 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3378
3379 // other cases
3380 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3381 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3382}
3383
3384
3385sc_signed
3386operator ^ (long u, const sc_unsigned &v)
3387{
3388 if (u == 0)
3389 return sc_signed(v);
3390
3391 CONVERT_LONG(u);
3392
3393 if (v.sgn == SC_ZERO)
3394 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3395
3396 // other cases
3397 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3398 v.sgn, v.nbits, v.ndigits, v.digit);
3399}
3400
3401
3402sc_signed
3403operator ^ (const sc_signed &u, unsigned long v)
3404{
3405 if (v == 0) // case 1
3406 return sc_signed(u);
3407
3408 CONVERT_LONG(v);
3409
3410 if (u.sgn == SC_ZERO) // case 2
3411 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3412
3413 // other cases
3414 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3415 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3416}
3417
3418sc_signed
3419operator ^ (unsigned long u, const sc_signed &v)
3420{
3421 if (u == 0)
3422 return sc_signed(v);
3423
3424 CONVERT_LONG(u);
3425
3426 if (v.sgn == SC_ZERO)
3427 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3428
3429 // other cases
3430 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3431 v.sgn, v.nbits, v.ndigits, v.digit);
3432}
3433
3434// The rest of the operators in this section are included from
3435// sc_nbcommon.cpp.
3436
3437
3438// ----------------------------------------------------------------------------
3439// SECTION: Bitwise NOT operator: ~
3440// ----------------------------------------------------------------------------
3441
3442// Operators in this section are included from sc_nbcommon.cpp.
3443
3444
3445// ----------------------------------------------------------------------------
3446// SECTION: LEFT SHIFT operators: <<, <<=
3447// ----------------------------------------------------------------------------
3448
3449sc_signed
3450operator << (const sc_signed &u, const sc_unsigned &v)
3451{
3452 if (v.sgn == SC_ZERO)
3453 return sc_signed(u);
3454
3455 return operator << (u, v.to_ulong());
3456}
3457
3458// The rest of the operators in this section are included from
3459// sc_nbcommon.cpp.
3460
3461
3462// ----------------------------------------------------------------------------
3463// SECTION: RIGHT SHIFT operators: >>, >>=
3464// ----------------------------------------------------------------------------
3465
3466sc_signed
3467operator >> (const sc_signed &u, const sc_unsigned &v)
3468{
3469 if (v.sgn == SC_ZERO)
3470 return sc_signed(u);
3471
3472 return operator >> (u, v.to_ulong());
3473}
3474
3475// The rest of the operators in this section are included from
3476// sc_nbcommon.cpp.
3477
3478
3479// ----------------------------------------------------------------------------
3480// SECTION: Unary arithmetic operators.
3481// ----------------------------------------------------------------------------
3482
3483sc_signed
3484operator + (const sc_signed &u)
3485{
3486 return sc_signed(u);
3487}
3488
3489sc_signed
3490operator - (const sc_signed &u)
3491{
3492 return sc_signed(u, -u.sgn);
3493}
3494
3495sc_signed
3496operator - (const sc_unsigned &u)
3497{
3498 return sc_signed(u, -u.sgn);
3499}
3500
3501
3502// ----------------------------------------------------------------------------
3503// SECTION: EQUAL operator: ==
3504// ----------------------------------------------------------------------------
3505
3506bool
3507operator == (const sc_signed &u, const sc_signed &v)
3508{
3509 if (u.sgn != v.sgn)
3510 return false;
3511
3512 if (&u == &v)
3513 return true;
3514
3515 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) != 0)
3516 return false;
3517
3518 return true;
3519}
3520
3521
3522bool
3523operator == (const sc_signed &u, int64 v)
3524{
3525 CONVERT_INT64(v);
3526
3527 if (u.sgn != vs)
3528 return false;
3529
3530 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
3531 return false;
3532
3533 return true;
3534}
3535
3536
3537bool
3538operator == (int64 u, const sc_signed &v)
3539{
3540 CONVERT_INT64(u);
3541
3542 if (us != v.sgn)
3543 return false;
3544
3545 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
3546 return false;
3547
3548 return true;
3549}
3550
3551
3552bool
3553operator == (const sc_signed &u, uint64 v)
3554{
3555 CONVERT_INT64(v);
3556
3557 if (u.sgn != vs)
3558 return false;
3559
3560 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
3561 return false;
3562
3563 return true;
3564}
3565
3566
3567bool
3568operator == (uint64 u, const sc_signed &v)
3569{
3570 CONVERT_INT64(u);
3571
3572 if (us != v.sgn)
3573 return false;
3574
3575 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
3576 return false;
3577
3578 return true;
3579}
3580
3581
3582bool
3583operator == (const sc_signed &u, long v)
3584{
3585 CONVERT_LONG(v);
3586
3587 if (u.sgn != vs)
3588 return false;
3589
3590 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
3591 return false;
3592
3593 return true;
3594}
3595
3596
3597bool
3598operator == (long u, const sc_signed &v)
3599{
3600 CONVERT_LONG(u);
3601
3602 if (us != v.sgn)
3603 return false;
3604
3605 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
3606 return false;
3607
3608 return true;
3609}
3610
3611
3612bool
3613operator == (const sc_signed &u, unsigned long v)
3614{
3615 CONVERT_LONG(v);
3616
3617 if (u.sgn != vs)
3618 return false;
3619
3620 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
3621 return false;
3622
3623 return true;
3624}
3625
3626
3627bool
3628operator == (unsigned long u, const sc_signed &v)
3629{
3630 CONVERT_LONG(u);
3631
3632 if (us != v.sgn)
3633 return false;
3634
3635 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
3636 return false;
3637
3638 return true;
3639}
3640
3641
3642// ----------------------------------------------------------------------------
3643// SECTION: NOT_EQUAL operator: !=
3644// ----------------------------------------------------------------------------
3645
3646// Operators in this section are included from sc_nbcommon.cpp.
3647
3648
3649// ----------------------------------------------------------------------------
3650// SECTION: LESS THAN operator: <
3651// ----------------------------------------------------------------------------
3652
3653bool
3654operator < (const sc_signed &u, const sc_signed &v)
3655{
3656 if (u.sgn < v.sgn)
3657 return true;
3658
3659 if (u.sgn > v.sgn)
3660 return false;
3661
3662 // u.sgn == v.sgn
3663
3664 if (&u == &v)
3665 return false;
3666
3667 if (u.sgn == SC_POS) {
3668 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) < 0)
3669 return true;
3670 } else if (u.sgn == SC_NEG) {
3671 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) > 0)
3672 return true;
3673 }
3674
3675 return false;
3676}
3677
3678
3679bool
3680operator < (const sc_signed &u, int64 v)
3681{
3682 CONVERT_INT64(v);
3683
3684 if (u.sgn < vs)
3685 return true;
3686
3687 if (u.sgn > vs)
3688 return false;
3689
3690 // u.sgn == vs
3691
3692 if (vs == SC_POS) {
3693 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
3694 return true;
3695 } else if (vs == SC_NEG) {
3696 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) > 0)
3697 return true;
3698 }
3699
3700 return false;
3701}
3702
3703
3704bool
3705operator < (int64 u, const sc_signed &v)
3706{
3707 CONVERT_INT64(u);
3708
3709 if (us < v.sgn)
3710 return true;
3711
3712 if (us > v.sgn)
3713 return false;
3714
3715 // us == v.sgn
3716
3717 if (us == SC_POS) {
3718 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
3719 return true;
3720 } else if (us == SC_NEG) {
3721 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) > 0)
3722 return true;
3723 }
3724
3725 return false;
3726}
3727
3728
3729bool
3730operator < (const sc_signed &u, uint64 v)
3731{
3732 CONVERT_INT64(v);
3733
3734 if (u.sgn < vs)
3735 return true;
3736
3737 if (u.sgn > vs)
3738 return false;
3739
3740 // u.sgn == vs
3741
3742 if (vs == SC_POS) {
3743 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
3744 return true;
3745 }
3746
3747 return false;
3748}
3749
3750
3751bool
3752operator < (uint64 u, const sc_signed &v)
3753{
3754 CONVERT_INT64(u);
3755
3756 if (us < v.sgn)
3757 return true;
3758
3759 if (us > v.sgn)
3760 return false;
3761
3762 // us == v.sgn
3763
3764 if (us == SC_POS) {
3765 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
3766 return true;
3767 }
3768
3769 return false;
3770}
3771
3772
3773bool
3774operator < (const sc_signed &u, long v)
3775{
3776 CONVERT_LONG(v);
3777
3778 if (u.sgn < vs)
3779 return true;
3780
3781 if (u.sgn > vs)
3782 return false;
3783
3784 // u.sgn == vs
3785
3786 if (vs == SC_POS) {
3787 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
3788 return true;
3789
3790 } else if (vs == SC_NEG) {
3791 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) > 0)
3792 return true;
3793 }
3794
3795 return false;
3796}
3797
3798
3799bool
3800operator < (long u, const sc_signed &v)
3801{
3802 CONVERT_LONG(u);
3803
3804 if (us < v.sgn)
3805 return true;
3806
3807 if (us > v.sgn)
3808 return false;
3809
3810 // us == v.sgn
3811
3812 if (us == SC_POS) {
3813 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
3814 return true;
3815 } else if (us == SC_NEG) {
3816 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) > 0)
3817 return true;
3818 }
3819
3820 return false;
3821}
3822
3823
3824bool
3825operator < (const sc_signed &u, unsigned long v)
3826{
3827 CONVERT_LONG(v);
3828
3829 if (u.sgn < vs)
3830 return true;
3831
3832 if (u.sgn > vs)
3833 return false;
3834
3835 // u.sgn == vs
3836
3837 if (vs == SC_POS) {
3838 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
3839 return true;
3840 }
3841
3842 return false;
3843}
3844
3845
3846bool
3847operator < (unsigned long u, const sc_signed &v)
3848{
3849 CONVERT_LONG(u);
3850
3851 if (us < v.sgn)
3852 return true;
3853
3854 if (us > v.sgn)
3855 return false;
3856
3857 // us == v.sgn
3858
3859 if (us == SC_POS) {
3860 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
3861 return true;
3862 }
3863
3864 return false;
3865}
3866
3867
3868// ---------------------------------------------------------------------------
3869// SECTION: LESS THAN or EQUAL operator: <=
3870// ---------------------------------------------------------------------------
3871
3872// Operators in this section are included from sc_nbcommon.cpp.
3873
3874
3875// ---------------------------------------------------------------------------
3876// SECTION: GREATER THAN operator: >
3877// ---------------------------------------------------------------------------
3878
3879// Operators in this section are included from sc_nbcommon.cpp.
3880
3881
3882// ---------------------------------------------------------------------------
3883// SECTION: GREATER THAN or EQUAL operator: >=
3884// ---------------------------------------------------------------------------
3885
3886// Operators in this section are included from sc_nbcommon.cpp.
3887
3888
3889// ---------------------------------------------------------------------------
3890// SECTION: Public members - Other utils.
3891// ---------------------------------------------------------------------------
3892
3893bool
3894sc_signed::iszero() const
3895{
3896 if (sgn == SC_ZERO)
3897 return true;
3898 else if (sgn != SC_NOSIGN)
3899 return false;
3900 else
3901 return check_for_zero(ndigits, digit);
3902}
3903
3904
3905bool
3906sc_signed::sign() const
3907{
3908 if (sgn == SC_NEG)
3909 return 1;
3910 else if (sgn != SC_NOSIGN)
3911 return 0;
3912 else
3913 return ((digit[ndigits - 1] & one_and_zeros(bit_ord(nbits - 1))) != 0);
3914}
3915
3916// The rest of the utils in this section are included from sc_nbcommon.cpp.
3917
3918
3919// ----------------------------------------------------------------------------
3920// SECTION: Private members.
3921// ----------------------------------------------------------------------------
3922
3923// The private members in this section are included from sc_nbcommon.cpp.
3924
3925#define CLASS_TYPE sc_signed
3926#define CLASS_TYPE_STR "sc_signed"
3927
3928#define ADD_HELPER add_signed_friend
3929#define SUB_HELPER sub_signed_friend
3930#define MUL_HELPER mul_signed_friend
3931#define DIV_HELPER div_signed_friend
3932#define MOD_HELPER mod_signed_friend
3933#define AND_HELPER and_signed_friend
3934#define OR_HELPER or_signed_friend
3935#define XOR_HELPER xor_signed_friend
3936
3937#include "sc_nbfriends.inc"
3938
3939#undef SC_UNSIGNED
3940#define SC_SIGNED
3941#define IF_SC_SIGNED 1 // 1 = sc_signed
3942#define CLASS_TYPE_SUBREF sc_signed_subref_r
3943#define OTHER_CLASS_TYPE sc_unsigned
3944#define OTHER_CLASS_TYPE_SUBREF sc_unsigned_subref_r
3945
3946#define MUL_ON_HELPER mul_on_help_signed
3947#define DIV_ON_HELPER div_on_help_signed
3948#define MOD_ON_HELPER mod_on_help_signed
3949
3950#include "sc_nbcommon.inc"
3951
3952#undef MOD_ON_HELPER
3953#undef DIV_ON_HELPER
3954#undef MUL_ON_HELPER
3955
3956#undef OTHER_CLASS_TYPE_SUBREF
3957#undef OTHER_CLASS_TYPE
3958#undef CLASS_TYPE_SUBREF
3959#undef IF_SC_SIGNED
3960#undef SC_SIGNED
3961
3962#undef XOR_HELPER
3963#undef OR_HELPER
3964#undef AND_HELPER
3965#undef MOD_HELPER
3966#undef DIV_HELPER
3967#undef MUL_HELPER
3968#undef SUB_HELPER
3969#undef ADD_HELPER
3970
3971#undef CLASS_TYPE
3972#undef CLASS_TYPE_STR
3973
3974#include "sc_signed_bitref.inc"
3975#include "sc_signed_subref.inc"
3976
3977#undef CONVERT_LONG
3978#undef CONVERT_LONG_2
3979#undef CONVERT_INT64
3980#undef CONVERT_INT64_2
3981
3982} // namespace sc_dt
457 }
458 return *this;
459}
460
461const sc_signed &
462sc_signed::operator=(int64 v)
463{
464 sgn = get_sign(v);
465 // v >= 0 now.
466 if (sgn == SC_ZERO) {
467 vec_zero(ndigits, digit);
468 } else {
469 from_uint(ndigits, digit, (uint64)v);
470 if (nbits <= (int)BITS_PER_INT64)
471 convert_SM_to_2C_to_SM();
472 }
473 return *this;
474}
475
476const sc_signed &
477sc_signed::operator=(uint64 v)
478{
479 sgn = get_sign(v);
480 if (sgn == SC_ZERO) {
481 vec_zero(ndigits, digit);
482 } else {
483 from_uint(ndigits, digit, v);
484 if (nbits <= (int)BITS_PER_INT64)
485 convert_SM_to_2C_to_SM();
486 }
487 return *this;
488}
489
490const sc_signed &
491sc_signed::operator=(long v)
492{
493 sgn = get_sign(v);
494 // v >= 0 now.
495 if (sgn == SC_ZERO) {
496 vec_zero(ndigits, digit);
497 } else {
498 from_uint(ndigits, digit, (unsigned long)v);
499 if (nbits <= (int)BITS_PER_LONG)
500 convert_SM_to_2C_to_SM();
501 }
502 return *this;
503}
504
505const sc_signed &
506sc_signed::operator=(unsigned long v)
507{
508 sgn = get_sign(v);
509 if (sgn == SC_ZERO) {
510 vec_zero(ndigits, digit);
511 } else {
512 from_uint(ndigits, digit, v);
513 if (nbits <= (int)BITS_PER_LONG)
514 convert_SM_to_2C_to_SM();
515 }
516 return *this;
517}
518
519const sc_signed &
520sc_signed::operator=(double v)
521{
522 is_bad_double(v);
523 if (v < 0) {
524 v = -v;
525 sgn = SC_NEG;
526 } else {
527 sgn = SC_POS;
528 }
529
530 int i = 0;
531 while (std::floor(v) && (i < ndigits)) {
532 digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) &
533 DIGIT_MASK;
534 v /= DIGIT_RADIX;
535 }
536 vec_zero(i, ndigits, digit);
537 convert_SM_to_2C_to_SM();
538 return *this;
539}
540
541
542// ----------------------------------------------------------------------------
543
544const sc_signed &
545sc_signed::operator = (const sc_bv_base &v)
546{
547 int minlen = sc_min(nbits, v.length());
548 int i = 0;
549 for (; i < minlen; ++i) {
550 safe_set(i, v.get_bit(i), digit);
551 }
552 for (; i < nbits; ++i) {
553 safe_set(i, 0, digit); // zero-extend
554 }
555 convert_2C_to_SM();
556 return *this;
557}
558
559const sc_signed &
560sc_signed::operator = (const sc_lv_base &v)
561{
562 int minlen = sc_min(nbits, v.length());
563 int i = 0;
564 for (; i < minlen; ++i) {
565 safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit);
566 }
567 for (; i < nbits; ++i) {
568 safe_set(i, 0, digit); // zero-extend
569 }
570 convert_2C_to_SM();
571 return *this;
572}
573
574
575// explicit conversion to character string
576const std::string
577sc_signed::to_string(sc_numrep numrep) const
578{
579 int len = length();
580 sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
581 return aa.to_string(numrep);
582}
583
584const std::string
585sc_signed::to_string(sc_numrep numrep, bool w_prefix) const
586{
587 int len = length();
588 sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
589 return aa.to_string(numrep, w_prefix);
590}
591
592
593// ----------------------------------------------------------------------------
594// SECTION: Interfacing with sc_int_base
595// ----------------------------------------------------------------------------
596
597const sc_signed &
598sc_signed::operator = (const sc_int_base &v)
599{
600 return operator = ((int64)v);
601}
602
603
604sc_signed
605operator + (const sc_unsigned &u, const sc_int_base &v)
606{
607 return operator + (u, static_cast<int64>(v));
608}
609
610sc_signed
611operator + (const sc_int_base &u, const sc_unsigned &v)
612{
613 return operator + (static_cast<int64>(u), v);
614}
615
616sc_signed
617operator + (const sc_signed &u, const sc_int_base &v)
618{
619 return operator + (u, (int64)v);
620}
621
622sc_signed
623operator + (const sc_int_base &u, const sc_signed &v)
624{
625 return operator + ((int64)u, v);
626}
627
628const sc_signed &
629sc_signed::operator += (const sc_int_base &v)
630{
631 return operator += ((int64)v);
632}
633
634
635sc_signed
636operator - (const sc_unsigned &u, const sc_int_base &v)
637{
638 return operator - (u, (int64)v);
639}
640
641sc_signed
642operator - (const sc_int_base &u, const sc_unsigned &v)
643{
644 return operator - ((int64)u, v);
645}
646
647sc_signed
648operator - (const sc_signed &u, const sc_int_base &v)
649{
650 return operator - (u, (int64)v);
651}
652
653sc_signed
654operator - (const sc_int_base &u, const sc_signed &v)
655{
656 return operator - ((int64)u, v);
657}
658
659const sc_signed &
660sc_signed::operator -= (const sc_int_base &v)
661{
662 return operator -= ((int64)v);
663}
664
665
666sc_signed
667operator * (const sc_unsigned &u, const sc_int_base &v)
668{
669 return operator * (u, static_cast<int64>(v));
670}
671
672sc_signed
673operator * (const sc_int_base &u, const sc_unsigned &v)
674{
675 return operator * (static_cast<int64>(u), v);
676}
677
678sc_signed
679operator * (const sc_signed &u, const sc_int_base &v)
680{
681 return operator * (u, (int64)v);
682}
683
684sc_signed
685operator * (const sc_int_base &u, const sc_signed &v)
686{
687 return operator * ((int64)u, v);
688}
689
690const sc_signed &
691sc_signed::operator *= (const sc_int_base &v)
692{
693 return operator *= ((int64)v);
694}
695
696
697sc_signed
698operator / (const sc_unsigned &u, const sc_int_base &v)
699{
700 return operator / (u, static_cast<int64>(v));
701}
702
703sc_signed
704operator / (const sc_int_base &u, const sc_unsigned &v)
705{
706 return operator / (static_cast<int64>(u), v);
707}
708
709sc_signed
710operator / (const sc_signed &u, const sc_int_base &v)
711{
712 return operator / (u, (int64)v);
713}
714
715sc_signed
716operator / (const sc_int_base &u, const sc_signed &v)
717{
718 return operator / ((int64)u, v);
719}
720
721const sc_signed &
722sc_signed::operator /= (const sc_int_base &v)
723{
724 return operator /= ((int64)v);
725}
726
727
728sc_signed
729operator % (const sc_unsigned &u, const sc_int_base &v)
730{
731 return operator % (u, static_cast<int64>(v));
732}
733
734sc_signed
735operator % (const sc_int_base &u, const sc_unsigned &v)
736{
737 return operator % (static_cast<int64>(u), v);
738}
739
740sc_signed
741operator % (const sc_signed &u, const sc_int_base &v)
742{
743 return operator % (u, (int64)v);
744}
745
746sc_signed
747operator % (const sc_int_base &u, const sc_signed &v)
748{
749 return operator % ((int64)u, v);
750}
751
752const sc_signed &
753sc_signed::operator %= (const sc_int_base &v)
754{
755 return operator %= ((int64)v);
756}
757
758
759sc_signed
760operator & (const sc_unsigned &u, const sc_int_base &v)
761{
762 return operator & (u, static_cast<int64>(v));
763}
764
765sc_signed
766operator & (const sc_int_base &u, const sc_unsigned &v)
767{
768 return operator & (static_cast<int64>(u), v);
769}
770
771sc_signed
772operator & (const sc_signed &u, const sc_int_base &v)
773{
774 return operator & (u, (int64)v);
775}
776
777sc_signed
778operator & (const sc_int_base &u, const sc_signed &v)
779{
780 return operator & ((int64)u, v);
781}
782
783const sc_signed &
784sc_signed::operator &= (const sc_int_base &v)
785{
786 return operator &= ((int64)v);
787}
788
789
790sc_signed
791operator | (const sc_unsigned &u, const sc_int_base &v)
792{
793 return operator | (u, static_cast<int64>(v));
794}
795
796sc_signed
797operator | (const sc_int_base &u, const sc_unsigned &v)
798{
799 return operator | (static_cast<int64>(u), v);
800}
801
802sc_signed
803operator | (const sc_signed& u, const sc_int_base &v)
804{
805 return operator|(u, (int64)v);
806}
807
808sc_signed
809operator | (const sc_int_base &u, const sc_signed &v)
810{
811 return operator | ((int64)u, v);
812}
813
814const sc_signed &
815sc_signed::operator |= (const sc_int_base &v)
816{
817 return operator |= ((int64)v);
818}
819
820
821sc_signed
822operator ^ (const sc_unsigned &u, const sc_int_base &v)
823{
824 return operator ^ (u, static_cast<int64>(v));
825}
826
827sc_signed
828operator ^ (const sc_int_base &u, const sc_unsigned &v)
829{
830 return operator ^ (static_cast<int64>(u), v);
831}
832
833sc_signed
834operator ^ (const sc_signed &u, const sc_int_base &v)
835{
836 return operator ^ (u, (int64)v);
837}
838
839sc_signed
840operator ^ (const sc_int_base &u, const sc_signed &v)
841{
842 return operator ^ ((int64)u, v);
843}
844
845const sc_signed &
846sc_signed::operator ^= (const sc_int_base &v)
847{
848 return operator ^= ((int64)v);
849}
850
851
852sc_signed
853operator << (const sc_signed &u, const sc_int_base &v)
854{
855 return operator << (u, (int64)v);
856}
857
858const sc_signed &
859sc_signed::operator <<= (const sc_int_base &v)
860{
861 return operator <<= ((int64)v);
862}
863
864
865sc_signed
866operator >> (const sc_signed &u, const sc_int_base &v)
867{
868 return operator >> (u, (int64)v);
869}
870
871const sc_signed &
872sc_signed::operator >>= (const sc_int_base &v)
873{
874 return operator >>= ((int64)v);
875}
876
877
878bool
879operator == (const sc_signed &u, const sc_int_base &v)
880{
881 return operator == (u, (int64)v);
882}
883
884bool
885operator == (const sc_int_base &u, const sc_signed &v)
886{
887 return operator == ((int64)u, v);
888}
889
890
891bool
892operator != (const sc_signed &u, const sc_int_base &v)
893{
894 return operator != (u, (int64)v);
895}
896
897bool
898operator != (const sc_int_base &u, const sc_signed &v)
899{
900 return operator != ((int64)u, v);
901}
902
903
904bool
905operator < (const sc_signed &u, const sc_int_base &v)
906{
907 return operator < (u, (int64)v);
908}
909
910bool
911operator < (const sc_int_base &u, const sc_signed &v)
912{
913 return operator < ((int64)u, v);
914}
915
916
917bool
918operator <= (const sc_signed &u, const sc_int_base &v)
919{
920 return operator <= (u, (int64)v);
921}
922
923bool
924operator <= (const sc_int_base &u, const sc_signed &v)
925{
926 return operator <= ((int64)u, v);
927}
928
929
930bool
931operator > (const sc_signed &u, const sc_int_base &v)
932{
933 return operator > (u, (int64)v);
934}
935
936bool
937operator > (const sc_int_base &u, const sc_signed &v)
938{
939 return operator > ((int64)u, v);
940}
941
942
943bool
944operator >= (const sc_signed &u, const sc_int_base &v)
945{
946 return operator >= (u, (int64)v);
947}
948
949bool
950operator >= (const sc_int_base &u, const sc_signed &v)
951{
952 return operator >= ((int64)u, v);
953}
954
955
956// ----------------------------------------------------------------------------
957// SECTION: Interfacing with sc_uint_base
958// ----------------------------------------------------------------------------
959
960const sc_signed &
961sc_signed::operator = (const sc_uint_base &v)
962{
963 return operator = ((uint64)v);
964}
965
966
967sc_signed
968operator + (const sc_signed &u, const sc_uint_base &v)
969{
970 return operator + (u, (uint64)v);
971}
972
973sc_signed
974operator + (const sc_uint_base &u, const sc_signed &v)
975{
976 return operator + ((uint64)u, v);
977}
978
979const sc_signed &
980sc_signed::operator += (const sc_uint_base &v)
981{
982 return operator += ((uint64)v);
983}
984
985
986sc_signed
987operator - (const sc_unsigned &u, const sc_uint_base &v)
988{
989 return operator - (u, (uint64)v);
990}
991
992sc_signed
993operator - (const sc_uint_base &u, const sc_unsigned &v)
994{
995 return operator - ((uint64)u, v);
996}
997
998sc_signed
999operator - (const sc_signed &u, const sc_uint_base &v)
1000{
1001 return operator - (u, (uint64)v);
1002}
1003
1004sc_signed
1005operator - (const sc_uint_base &u, const sc_signed &v)
1006{
1007 return operator - ((uint64)u, v);
1008}
1009
1010const sc_signed &
1011sc_signed::operator -= (const sc_uint_base &v)
1012{
1013 return operator -= ((uint64)v);
1014}
1015
1016
1017sc_signed
1018operator * (const sc_signed &u, const sc_uint_base &v)
1019{
1020 return operator * (u, (uint64)v);
1021}
1022
1023sc_signed
1024operator * (const sc_uint_base &u, const sc_signed &v)
1025{
1026 return operator * ((uint64)u, v);
1027}
1028
1029const sc_signed &
1030sc_signed::operator *= (const sc_uint_base &v)
1031{
1032 return operator *= ((uint64)v);
1033}
1034
1035
1036sc_signed
1037operator / (const sc_signed &u, const sc_uint_base &v)
1038{
1039 return operator / (u, (uint64)v);
1040}
1041
1042sc_signed
1043operator / (const sc_uint_base &u, const sc_signed &v)
1044{
1045 return operator / ((uint64)u, v);
1046}
1047
1048const sc_signed &
1049sc_signed::operator /= (const sc_uint_base &v)
1050{
1051 return operator /= ((uint64)v);
1052}
1053
1054
1055sc_signed
1056operator % (const sc_signed &u, const sc_uint_base &v)
1057{
1058 return operator % (u, (uint64)v);
1059}
1060
1061sc_signed
1062operator % (const sc_uint_base &u, const sc_signed &v)
1063{
1064 return operator % ((uint64)u, v);
1065}
1066
1067const sc_signed&
1068sc_signed::operator %= (const sc_uint_base &v)
1069{
1070 return operator %= ((uint64)v);
1071}
1072
1073
1074sc_signed
1075operator & (const sc_signed &u, const sc_uint_base &v)
1076{
1077 return operator & (u, (uint64)v);
1078}
1079
1080sc_signed
1081operator & (const sc_uint_base &u, const sc_signed &v)
1082{
1083 return operator & ((uint64)u, v);
1084}
1085
1086const sc_signed &
1087sc_signed::operator &= (const sc_uint_base &v)
1088{
1089 return operator &= ((uint64)v);
1090}
1091
1092
1093sc_signed
1094operator | (const sc_signed &u, const sc_uint_base &v)
1095{
1096 return operator | (u, (uint64)v);
1097}
1098
1099sc_signed
1100operator | (const sc_uint_base &u, const sc_signed &v)
1101{
1102 return operator | ((uint64)u, v);
1103}
1104
1105const sc_signed &
1106sc_signed::operator |= (const sc_uint_base &v)
1107{
1108 return operator |= ((uint64)v);
1109}
1110
1111
1112sc_signed
1113operator ^ (const sc_signed &u, const sc_uint_base &v)
1114{
1115 return operator ^ (u, (uint64)v);
1116}
1117
1118sc_signed
1119operator ^ (const sc_uint_base &u, const sc_signed &v)
1120{
1121 return operator ^ ((uint64)u, v);
1122}
1123
1124const sc_signed &
1125sc_signed::operator ^= (const sc_uint_base &v)
1126{
1127 return operator ^= ((uint64)v);
1128}
1129
1130
1131sc_signed
1132operator << (const sc_signed &u, const sc_uint_base &v)
1133{
1134 return operator << (u, (uint64)v);
1135}
1136
1137const sc_signed &
1138sc_signed::operator <<= (const sc_uint_base &v)
1139{
1140 return operator <<= ((uint64)v);
1141}
1142
1143
1144sc_signed
1145operator >> (const sc_signed& u, const sc_uint_base& v)
1146{
1147 return operator >> (u, (uint64)v);
1148}
1149
1150const sc_signed &
1151sc_signed::operator >>= (const sc_uint_base& v)
1152{
1153 return operator >>= ((uint64)v);
1154}
1155
1156
1157bool
1158operator == (const sc_signed &u, const sc_uint_base &v)
1159{
1160 return operator == (u, (uint64)v);
1161}
1162
1163bool
1164operator == (const sc_uint_base &u, const sc_signed &v)
1165{
1166 return operator == ((uint64)u, v);
1167}
1168
1169
1170bool
1171operator != (const sc_signed &u, const sc_uint_base &v)
1172{
1173 return operator != (u, (uint64)v);
1174}
1175
1176bool
1177operator != (const sc_uint_base &u, const sc_signed &v)
1178{
1179 return operator != ((uint64)u, v);
1180}
1181
1182
1183bool
1184operator < (const sc_signed &u, const sc_uint_base &v)
1185{
1186 return operator < (u, (uint64)v);
1187}
1188
1189bool
1190operator < (const sc_uint_base &u, const sc_signed &v)
1191{
1192 return operator < ((uint64)u, v);
1193}
1194
1195
1196bool
1197operator <= (const sc_signed &u, const sc_uint_base &v)
1198{
1199 return operator <= (u, (uint64)v);
1200}
1201
1202bool
1203operator <= (const sc_uint_base &u, const sc_signed &v)
1204{
1205 return operator <= ((uint64)u, v);
1206}
1207
1208
1209bool
1210operator > (const sc_signed &u, const sc_uint_base &v)
1211{
1212 return operator > (u, (uint64)v);
1213}
1214
1215bool
1216operator > (const sc_uint_base &u, const sc_signed &v)
1217{
1218 return operator > ((uint64)u, v);
1219}
1220
1221
1222bool
1223operator >= (const sc_signed &u, const sc_uint_base &v)
1224{
1225 return operator >= (u, (uint64)v);
1226}
1227
1228bool
1229operator >= (const sc_uint_base &u, const sc_signed &v)
1230{
1231 return operator >= ((uint64)u, v);
1232}
1233
1234
1235// ----------------------------------------------------------------------------
1236// SECTION: Input and output operators
1237// ----------------------------------------------------------------------------
1238
1239// Operators in this section are included from sc_nbcommon.cpp.
1240
1241
1242// ----------------------------------------------------------------------------
1243// SECTION: Operator macros.
1244// ----------------------------------------------------------------------------
1245
1246#define CONVERT_LONG(u) \
1247small_type u ## s = get_sign(u); \
1248sc_digit u ## d[DIGITS_PER_ULONG]; \
1249from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
1250
1251#define CONVERT_LONG_2(u) \
1252sc_digit u ## d[DIGITS_PER_ULONG]; \
1253from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
1254
1255#define CONVERT_INT(u) \
1256small_type u ## s = get_sign(u); \
1257sc_digit u ## d[DIGITS_PER_UINT]; \
1258from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
1259
1260#define CONVERT_INT_2(u) \
1261sc_digit u ## d[DIGITS_PER_UINT]; \
1262from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
1263
1264#define CONVERT_INT64(u) \
1265small_type u ## s = get_sign(u); \
1266sc_digit u ## d[DIGITS_PER_UINT64]; \
1267from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
1268
1269#define CONVERT_INT64_2(u) \
1270sc_digit u ## d[DIGITS_PER_UINT64]; \
1271from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
1272
1273
1274// ----------------------------------------------------------------------------
1275// SECTION: PLUS operators: +, +=, ++
1276// ----------------------------------------------------------------------------
1277
1278// Cases to consider when computing u + v:
1279// 1. 0 + v = v
1280// 2. u + 0 = u
1281// 3. if sgn(u) == sgn(v)
1282// 3.1 u + v = +(u + v) = sgn(u) * (u + v)
1283// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
1284// 4. if sgn(u) != sgn(v)
1285// 4.1 u + (-v) = u - v = sgn(u) * (u - v)
1286// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
1287//
1288// Specialization of above cases for computing ++u or u++:
1289// 1. 0 + 1 = 1
1290// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
1291// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
1292
1293sc_signed
1294operator + (const sc_unsigned &u, const sc_signed &v)
1295{
1296 if (u.sgn == SC_ZERO) // case 1
1297 return sc_signed(v);
1298
1299 if (v.sgn == SC_ZERO) // case 2
1300 return sc_signed(u);
1301
1302 // cases 3 and 4
1303 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1304 v.sgn, v.nbits, v.ndigits, v.digit);
1305}
1306
1307
1308sc_signed
1309operator + (const sc_signed &u, const sc_unsigned &v)
1310{
1311 if (u.sgn == SC_ZERO) // case 1
1312 return sc_signed(v);
1313
1314 if (v.sgn == SC_ZERO) // case 2
1315 return sc_signed(u);
1316
1317 // cases 3 and 4
1318 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1319 v.sgn, v.nbits, v.ndigits, v.digit);
1320}
1321
1322
1323sc_signed
1324operator + (const sc_signed &u, const sc_signed &v)
1325{
1326 if (u.sgn == SC_ZERO) // case 1
1327 return sc_signed(v);
1328
1329 if (v.sgn == SC_ZERO) // case 2
1330 return sc_signed(u);
1331
1332 // cases 3 and 4
1333 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1334 v.sgn, v.nbits, v.ndigits, v.digit);
1335}
1336
1337
1338sc_signed
1339operator + (const sc_signed &u, int64 v)
1340{
1341 if (v == 0) // case 2
1342 return sc_signed(u);
1343
1344 CONVERT_INT64(v);
1345
1346 if (u.sgn == SC_ZERO) // case 1
1347 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1348
1349 // cases 3 and 4
1350 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1351 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1352}
1353
1354
1355sc_signed
1356operator + (int64 u, const sc_signed &v)
1357{
1358 if (u == 0) // case 1
1359 return sc_signed(v);
1360
1361 CONVERT_INT64(u);
1362
1363 if (v.sgn == SC_ZERO) // case 2
1364 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1365
1366 // cases 3 and 4
1367 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1368 v.sgn, v.nbits, v.ndigits, v.digit);
1369}
1370
1371
1372sc_signed
1373operator + (const sc_unsigned &u, int64 v)
1374{
1375 if (v == 0) // case 2
1376 return sc_signed(u);
1377
1378 CONVERT_INT64(v);
1379
1380 if (u.sgn == SC_ZERO) // case 1
1381 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1382
1383 // cases 3 and 4
1384 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1385 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1386}
1387
1388
1389sc_signed
1390operator + (int64 u, const sc_unsigned &v)
1391{
1392 if (u == 0) // case 1
1393 return sc_signed(v);
1394
1395 CONVERT_INT64(u);
1396
1397 if (v.sgn == SC_ZERO) // case 2
1398 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1399
1400 // cases 3 and 4
1401 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1402 v.sgn, v.nbits, v.ndigits, v.digit);
1403}
1404
1405
1406sc_signed
1407operator + (const sc_signed &u, uint64 v)
1408{
1409 if (v == 0) // case 2
1410 return sc_signed(u);
1411
1412 CONVERT_INT64(v);
1413
1414 if (u.sgn == SC_ZERO) // case 1
1415 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1416
1417 // cases 3 and 4
1418 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1419 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1420}
1421
1422
1423sc_signed
1424operator + (uint64 u, const sc_signed &v)
1425{
1426 if (u == 0) // case 1
1427 return sc_signed(v);
1428
1429 CONVERT_INT64(u);
1430
1431 if (v.sgn == SC_ZERO) // case 2
1432 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1433
1434 // cases 3 and 4
1435 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1436 v.sgn, v.nbits, v.ndigits, v.digit);
1437}
1438
1439
1440sc_signed
1441operator + (const sc_signed &u, long v)
1442{
1443 if (v == 0) // case 2
1444 return sc_signed(u);
1445
1446 CONVERT_LONG(v);
1447
1448 if (u.sgn == SC_ZERO) // case 1
1449 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1450
1451 // cases 3 and 4
1452 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1453 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1454}
1455
1456
1457sc_signed
1458operator + (long u, const sc_signed &v)
1459{
1460 if (u == 0) // case 1
1461 return sc_signed(v);
1462
1463 CONVERT_LONG(u);
1464
1465 if (v.sgn == SC_ZERO) // case 2
1466 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1467
1468 // cases 3 and 4
1469 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1470 v.sgn, v.nbits, v.ndigits, v.digit);
1471}
1472
1473
1474sc_signed
1475operator + (const sc_unsigned &u, long v)
1476{
1477 if (v == 0) // case 2
1478 return sc_signed(u);
1479
1480 CONVERT_LONG(v);
1481
1482 if (u.sgn == SC_ZERO) // case 1
1483 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1484
1485 // cases 3 and 4
1486 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1487 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1488}
1489
1490
1491sc_signed
1492operator + (long u, const sc_unsigned &v)
1493{
1494 if (u == 0) // case 1
1495 return sc_signed(v);
1496
1497 CONVERT_LONG(u);
1498
1499 if (v.sgn == SC_ZERO) // case 2
1500 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1501
1502 // cases 3 and 4
1503 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1504 v.sgn, v.nbits, v.ndigits, v.digit);
1505}
1506
1507
1508sc_signed
1509operator + (const sc_signed &u, unsigned long v)
1510{
1511 if (v == 0) // case 2
1512 return sc_signed(u);
1513
1514 CONVERT_LONG(v);
1515
1516 if (u.sgn == SC_ZERO) // case 1
1517 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1518
1519 // cases 3 and 4
1520 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1521 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1522}
1523
1524
1525sc_signed
1526operator + (unsigned long u, const sc_signed &v)
1527{
1528 if (u == 0) // case 1
1529 return sc_signed(v);
1530
1531 CONVERT_LONG(u);
1532
1533 if (v.sgn == SC_ZERO) // case 2
1534 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1535
1536 // cases 3 and 4
1537 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1538 v.sgn, v.nbits, v.ndigits, v.digit);
1539}
1540
1541// The rest of the operators in this section are included from
1542// sc_nbcommon.cpp.
1543
1544// ----------------------------------------------------------------------------
1545// SECTION: MINUS operators: -, -=, --
1546// ----------------------------------------------------------------------------
1547
1548// Cases to consider when computing u + v:
1549// 1. u - 0 = u
1550// 2. 0 - v = -v
1551// 3. if sgn(u) != sgn(v)
1552// 3.1 u - (-v) = u + v = sgn(u) * (u + v)
1553// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
1554// 4. if sgn(u) == sgn(v)
1555// 4.1 u - v = +(u - v) = sgn(u) * (u - v)
1556// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
1557//
1558// Specialization of above cases for computing --u or u--:
1559// 1. 0 - 1 = -1
1560// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
1561// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
1562
1563sc_signed
1564operator - (const sc_unsigned &u, const sc_unsigned &v)
1565{
1566 if (v.sgn == SC_ZERO) // case 1
1567 return sc_signed(u);
1568
1569 if (u.sgn == SC_ZERO) // case 2
1570 return sc_signed(v, -v.sgn);
1571
1572 // cases 3 and 4
1573 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1574 -v.sgn, v.nbits, v.ndigits, v.digit);
1575}
1576
1577
1578sc_signed
1579operator - (const sc_unsigned &u, const sc_signed &v)
1580{
1581 if (v.sgn == SC_ZERO) // case 1
1582 return sc_signed(u);
1583
1584 if (u.sgn == SC_ZERO) // case 2
1585 return sc_signed(v, -v.sgn);
1586
1587 // cases 3 and 4
1588 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1589 -v.sgn, v.nbits, v.ndigits, v.digit);
1590}
1591
1592
1593sc_signed
1594operator - (const sc_signed &u, const sc_unsigned &v)
1595{
1596 if (v.sgn == SC_ZERO) // case 1
1597 return sc_signed(u);
1598
1599 if (u.sgn == SC_ZERO) // case 2
1600 return sc_signed(v, -v.sgn);
1601
1602 // cases 3 and 4
1603 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1604 -v.sgn, v.nbits, v.ndigits, v.digit);
1605}
1606
1607
1608sc_signed
1609operator - (const sc_signed &u, const sc_signed &v)
1610{
1611 if (v.sgn == SC_ZERO) // case 1
1612 return sc_signed(u);
1613
1614 if (u.sgn == SC_ZERO) // case 2
1615 return sc_signed(v, -v.sgn);
1616
1617 // cases 3 and 4
1618 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1619 -v.sgn, v.nbits, v.ndigits, v.digit);
1620}
1621
1622
1623sc_signed
1624operator - (const sc_signed &u, int64 v)
1625{
1626 if (v == 0) // case 1
1627 return sc_signed(u);
1628
1629 CONVERT_INT64(v);
1630
1631 if (u.sgn == SC_ZERO) // case 2
1632 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1633
1634 // cases 3 and 4
1635 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1636 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1637}
1638
1639
1640sc_signed
1641operator - (int64 u, const sc_signed &v)
1642{
1643 if (u == 0) // case 1
1644 return sc_signed(v, -v.sgn);
1645
1646 CONVERT_INT64(u);
1647
1648 if (v.sgn == SC_ZERO) // case 2
1649 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1650
1651 // cases 3 and 4
1652 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1653 -v.sgn, v.nbits, v.ndigits, v.digit);
1654}
1655
1656
1657sc_signed
1658operator - (const sc_unsigned &u, int64 v)
1659{
1660 if (v == 0) // case 1
1661 return sc_signed(u);
1662
1663 CONVERT_INT64(v);
1664
1665 if (u.sgn == SC_ZERO) // case 2
1666 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1667
1668 // cases 3 and 4
1669 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1670 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1671}
1672
1673
1674sc_signed
1675operator - (int64 u, const sc_unsigned &v)
1676{
1677 if (u == 0) // case 1
1678 return sc_signed(v, -v.sgn);
1679
1680 CONVERT_INT64(u);
1681
1682 if (v.sgn == SC_ZERO) // case 2
1683 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1684
1685 // cases 3 and 4
1686 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1687 -v.sgn, v.nbits, v.ndigits, v.digit);
1688}
1689
1690
1691sc_signed
1692operator - (const sc_signed &u, uint64 v)
1693{
1694 if (v == 0) // case 1
1695 return sc_signed(u);
1696
1697 CONVERT_INT64(v);
1698
1699 if (u.sgn == SC_ZERO) // case 2
1700 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1701
1702 // cases 3 and 4
1703
1704 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1705 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1706}
1707
1708
1709sc_signed
1710operator - (uint64 u, const sc_signed &v)
1711{
1712 if (u == 0) // case 1
1713 return sc_signed(v, -v.sgn);
1714
1715 CONVERT_INT64(u);
1716
1717 if (v.sgn == SC_ZERO) // case 2
1718 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1719
1720 // cases 3 and 4
1721 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1722 -v.sgn, v.nbits, v.ndigits, v.digit);
1723}
1724
1725
1726sc_signed
1727operator - (const sc_unsigned &u, uint64 v)
1728{
1729 if (v == 0) // case 1
1730 return sc_signed(u);
1731
1732 CONVERT_INT64(v);
1733
1734 if (u.sgn == SC_ZERO) // case 2
1735 return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1736
1737 // cases 3 and 4
1738 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1739 -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1740}
1741
1742
1743sc_signed
1744operator - (uint64 u, const sc_unsigned &v)
1745{
1746 if (u == 0) // case 1
1747 return sc_signed(v, -v.sgn);
1748
1749 CONVERT_INT64(u);
1750
1751 if (v.sgn == SC_ZERO) // case 2
1752 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1753
1754 // cases 3 and 4
1755 return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1756 -v.sgn, v.nbits, v.ndigits, v.digit);
1757}
1758
1759
1760sc_signed
1761operator - (const sc_signed &u, long v)
1762{
1763 if (v == 0) // case 1
1764 return sc_signed(u);
1765
1766 CONVERT_LONG(v);
1767
1768 if (u.sgn == SC_ZERO) // case 2
1769 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1770
1771 // cases 3 and 4
1772 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1773 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1774}
1775
1776
1777sc_signed
1778operator - (long u, const sc_signed &v)
1779{
1780 if (u == 0) // case 1
1781 return sc_signed(v, -v.sgn);
1782
1783 CONVERT_LONG(u);
1784
1785 if (v.sgn == SC_ZERO) // case 2
1786 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1787
1788 // cases 3 and 4
1789 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1790 -v.sgn, v.nbits, v.ndigits, v.digit);
1791}
1792
1793
1794sc_signed
1795operator - (const sc_unsigned &u, long v)
1796{
1797 if (v == 0) // case 1
1798 return sc_signed(u);
1799
1800 CONVERT_LONG(v);
1801
1802 if (u.sgn == SC_ZERO) // case 2
1803 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1804
1805 // cases 3 and 4
1806 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1807 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1808}
1809
1810
1811sc_signed
1812operator - (long u, const sc_unsigned &v)
1813{
1814 if (u == 0) // case 1
1815 return sc_signed(v, -v.sgn);
1816
1817 CONVERT_LONG(u);
1818
1819 if (v.sgn == SC_ZERO) // case 2
1820 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1821
1822 // cases 3 and 4
1823 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1824 -v.sgn, v.nbits, v.ndigits, v.digit);
1825}
1826
1827
1828sc_signed
1829operator - (const sc_signed &u, unsigned long v)
1830{
1831 if (v == 0) // case 1
1832 return sc_signed(u);
1833
1834 CONVERT_LONG(v);
1835
1836 if (u.sgn == SC_ZERO) // case 2
1837 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1838
1839 // cases 3 and 4
1840 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1841 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1842}
1843
1844
1845sc_signed
1846operator - (unsigned long u, const sc_signed &v)
1847{
1848 if (u == 0) // case 1
1849 return sc_signed(v, -v.sgn);
1850
1851 CONVERT_LONG(u);
1852
1853 if (v.sgn == SC_ZERO) // case 2
1854 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1855
1856 // cases 3 and 4
1857 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1858 -v.sgn, v.nbits, v.ndigits, v.digit);
1859}
1860
1861
1862sc_signed
1863operator - (const sc_unsigned &u, unsigned long v)
1864{
1865 if (v == 0) // case 1
1866 return sc_signed(u);
1867
1868 CONVERT_LONG(v);
1869
1870 if (u.sgn == SC_ZERO) // case 2
1871 return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1872
1873 // cases 3 and 4
1874 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1875 -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1876}
1877
1878
1879sc_signed
1880operator - (unsigned long u, const sc_unsigned &v)
1881{
1882 if (u == 0) // case 1
1883 return sc_signed(v, -v.sgn);
1884
1885 CONVERT_LONG(u);
1886
1887 if (v.sgn == SC_ZERO) // case 2
1888 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1889
1890 // cases 3 and 4
1891 return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1892 -v.sgn, v.nbits, v.ndigits, v.digit);
1893}
1894
1895// The rest of the operators in this section are included from
1896// sc_nbcommon.cpp.
1897
1898
1899// ----------------------------------------------------------------------------
1900// SECTION: MULTIPLICATION operators: *, *=
1901// ----------------------------------------------------------------------------
1902
1903// Cases to consider when computing u * v:
1904// 1. u * 0 = 0 * v = 0
1905// 2. 1 * v = v and -1 * v = -v
1906// 3. u * 1 = u and u * -1 = -u
1907// 4. u * v = u * v
1908
1909sc_signed
1910operator * (const sc_unsigned &u, const sc_signed &v)
1911{
1912 small_type s = mul_signs(u.sgn, v.sgn);
1913
1914 if (s == SC_ZERO) // case 1
1915 return sc_signed();
1916
1917 // cases 2-4
1918 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1919 v.nbits, v.ndigits, v.digit);
1920}
1921
1922
1923sc_signed
1924operator * (const sc_signed &u, const sc_unsigned &v)
1925{
1926 small_type s = mul_signs(u.sgn, v.sgn);
1927
1928 if (s == SC_ZERO) // case 1
1929 return sc_signed();
1930
1931 // cases 2-4
1932 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1933 v.nbits, v.ndigits, v.digit);
1934}
1935
1936
1937sc_signed
1938operator * (const sc_signed &u, const sc_signed &v)
1939{
1940 small_type s = mul_signs(u.sgn, v.sgn);
1941
1942 if (s == SC_ZERO) // case 1
1943 return sc_signed();
1944
1945 // cases 2-4
1946 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1947 v.nbits, v.ndigits, v.digit);
1948}
1949
1950
1951sc_signed
1952operator * (const sc_signed &u, int64 v)
1953{
1954 small_type s = mul_signs(u.sgn, get_sign(v));
1955
1956 if (s == SC_ZERO) // case 1
1957 return sc_signed();
1958
1959 CONVERT_INT64_2(v);
1960
1961 // cases 2-4
1962 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1963 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1964}
1965
1966
1967sc_signed
1968operator * (int64 u, const sc_signed &v)
1969{
1970 small_type s = mul_signs(v.sgn, get_sign(u));
1971
1972 if (s == SC_ZERO) // case 1
1973 return sc_signed();
1974
1975 CONVERT_INT64_2(u);
1976
1977 // cases 2-4
1978 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1979 v.nbits, v.ndigits, v.digit);
1980}
1981
1982
1983sc_signed
1984operator * (const sc_unsigned &u, int64 v)
1985{
1986 small_type s = mul_signs(u.sgn, get_sign(v));
1987
1988 if (s == SC_ZERO) // case 1
1989 return sc_signed();
1990
1991 CONVERT_INT64_2(v);
1992
1993 // cases 2-4
1994 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
1995 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1996}
1997
1998
1999sc_signed
2000operator * (int64 u, const sc_unsigned &v)
2001{
2002 small_type s = mul_signs(v.sgn, get_sign(u));
2003
2004 if (s == SC_ZERO) // case 1
2005 return sc_signed();
2006
2007 CONVERT_INT64_2(u);
2008
2009 // cases 2-4
2010 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2011 v.nbits, v.ndigits, v.digit);
2012}
2013
2014
2015sc_signed
2016operator * (const sc_signed &u, uint64 v)
2017{
2018 small_type s = mul_signs(u.sgn, get_sign(v));
2019
2020 if (s == SC_ZERO) // case 1
2021 return sc_signed();
2022
2023 CONVERT_INT64_2(v);
2024
2025 // cases 2-4
2026 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2027 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2028}
2029
2030
2031sc_signed
2032operator * (uint64 u, const sc_signed &v)
2033{
2034 small_type s = mul_signs(v.sgn, get_sign(u));
2035
2036 if (s == SC_ZERO) // case 1
2037 return sc_signed();
2038
2039 CONVERT_INT64_2(u);
2040
2041 // cases 2-4
2042 return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2043 v.nbits, v.ndigits, v.digit);
2044}
2045
2046
2047sc_signed
2048operator * (const sc_signed &u, long v)
2049{
2050 small_type s = mul_signs(u.sgn, get_sign(v));
2051
2052 if (s == SC_ZERO) // case 1
2053 return sc_signed();
2054
2055 CONVERT_LONG_2(v);
2056
2057 // cases 2-4
2058 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2059 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2060}
2061
2062
2063sc_signed
2064operator * (long u, const sc_signed &v)
2065{
2066 small_type s = mul_signs(v.sgn, get_sign(u));
2067
2068 if (s == SC_ZERO) // case 1
2069 return sc_signed();
2070
2071 CONVERT_LONG_2(u);
2072
2073 // cases 2-4
2074 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2075 v.nbits, v.ndigits, v.digit);
2076}
2077
2078
2079sc_signed
2080operator * (const sc_unsigned &u, long v)
2081{
2082 small_type s = mul_signs(u.sgn, get_sign(v));
2083
2084 if (s == SC_ZERO) // case 1
2085 return sc_signed();
2086
2087 CONVERT_LONG_2(v);
2088
2089 // cases 2-4
2090 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2091 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2092}
2093
2094
2095sc_signed
2096operator * (long u, const sc_unsigned &v)
2097{
2098 small_type s = mul_signs(v.sgn, get_sign(u));
2099
2100 if (s == SC_ZERO) // case 1
2101 return sc_signed();
2102
2103 CONVERT_LONG_2(u);
2104
2105 // cases 2-4
2106 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2107 v.nbits, v.ndigits, v.digit);
2108}
2109
2110
2111sc_signed
2112operator * (const sc_signed &u, unsigned long v)
2113{
2114 small_type s = mul_signs(u.sgn, get_sign(v));
2115
2116 if (s == SC_ZERO) // case 1
2117 return sc_signed();
2118
2119 CONVERT_LONG_2(v);
2120
2121 // else cases 2-4
2122 return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
2123 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2124}
2125
2126sc_signed
2127operator * (unsigned long u, const sc_signed &v)
2128{
2129 small_type s = mul_signs(v.sgn, get_sign(u));
2130
2131 if (s == SC_ZERO) // case 1
2132 return sc_signed();
2133
2134 CONVERT_LONG_2(u);
2135
2136 // cases 2-4
2137 return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2138 v.nbits, v.ndigits, v.digit);
2139}
2140
2141// The rest of the operators in this section are included from
2142// sc_nbcommon.cpp.
2143
2144
2145// ----------------------------------------------------------------------------
2146// SECTION: DIVISION operators: /, /=
2147// ----------------------------------------------------------------------------
2148
2149// Cases to consider when finding the quotient q = floor(u/v):
2150// Note that u = q * v + r for r < q.
2151// 1. 0 / 0 or u / 0 => error
2152// 2. 0 / v => 0 = 0 * v + 0
2153// 3. u / v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
2154// 4. u / v & &u < v => u = 0 * v + u - u can be 1 or -1
2155// 5. u / v & &u > v => u = q * v + r - v can be 1 or -1
2156
2157sc_signed
2158operator / (const sc_unsigned &u, const sc_signed &v)
2159{
2160 small_type s = mul_signs(u.sgn, v.sgn);
2161
2162 if (s == SC_ZERO) {
2163 div_by_zero(v.sgn); // case 1
2164 return sc_signed(); // case 2
2165 }
2166
2167 // other cases
2168 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2169 v.nbits, v.ndigits, v.digit);
2170}
2171
2172
2173sc_signed
2174operator / (const sc_signed &u, const sc_unsigned &v)
2175{
2176 small_type s = mul_signs(u.sgn, v.sgn);
2177
2178 if (s == SC_ZERO) {
2179 div_by_zero(v.sgn); // case 1
2180 return sc_signed(); // case 2
2181 }
2182
2183 // other cases
2184 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2185 v.nbits, v.ndigits, v.digit);
2186}
2187
2188
2189sc_signed
2190operator / (const sc_signed &u, const sc_signed &v)
2191{
2192 small_type s = mul_signs(u.sgn, v.sgn);
2193
2194 if (s == SC_ZERO) {
2195 div_by_zero(v.sgn); // case 1
2196 return sc_signed(); // case 2
2197 }
2198
2199 // other cases
2200 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2201 v.nbits, v.ndigits, v.digit);
2202}
2203
2204
2205sc_signed
2206operator / (const sc_signed &u, int64 v)
2207{
2208 small_type s = mul_signs(u.sgn, get_sign(v));
2209
2210 if (s == SC_ZERO) {
2211 div_by_zero(v); // case 1
2212 return sc_signed(); // case 2
2213 }
2214
2215 CONVERT_INT64_2(v);
2216
2217 // other cases
2218 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2219 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2220}
2221
2222
2223sc_signed
2224operator / (int64 u, const sc_signed &v)
2225{
2226 small_type s = mul_signs(v.sgn, get_sign(u));
2227
2228 if (s == SC_ZERO) {
2229 div_by_zero(v.sgn); // case 1
2230 return sc_signed(); // case 2
2231 }
2232
2233 CONVERT_INT64_2(u);
2234
2235 // other cases
2236 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2237 v.nbits, v.ndigits, v.digit);
2238}
2239
2240
2241sc_signed
2242operator / (const sc_unsigned &u, int64 v)
2243{
2244 small_type s = mul_signs(u.sgn, get_sign(v));
2245
2246 if (s == SC_ZERO) {
2247 div_by_zero(v); // case 1
2248 return sc_signed(); // case 2
2249 }
2250
2251 CONVERT_INT64_2(v);
2252
2253 // other cases
2254 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2255 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2256}
2257
2258
2259sc_signed
2260operator / (int64 u, const sc_unsigned &v)
2261{
2262 small_type s = mul_signs(v.sgn, get_sign(u));
2263
2264 if (s == SC_ZERO) {
2265 div_by_zero(v.sgn); // case 1
2266 return sc_signed(); // case 2
2267 }
2268
2269 CONVERT_INT64_2(u);
2270
2271 // other cases
2272 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2273 v.nbits, v.ndigits, v.digit);
2274}
2275
2276
2277sc_signed
2278operator / (const sc_signed &u, uint64 v)
2279{
2280 small_type s = mul_signs(u.sgn, get_sign(v));
2281
2282 if (s == SC_ZERO) {
2283 div_by_zero(v); // case 1
2284 return sc_signed(); // case 2
2285 }
2286
2287 CONVERT_INT64_2(v);
2288
2289 // other cases
2290 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2291 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2292}
2293
2294
2295sc_signed
2296operator / (uint64 u, const sc_signed &v)
2297{
2298 small_type s = mul_signs(v.sgn, get_sign(u));
2299
2300 if (s == SC_ZERO) {
2301 div_by_zero(v.sgn); // case 1
2302 return sc_signed(); // case 2
2303
2304 }
2305
2306 CONVERT_INT64_2(u);
2307
2308 // other cases
2309 return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2310 v.nbits, v.ndigits, v.digit);
2311}
2312
2313
2314sc_signed
2315operator / (const sc_signed &u, long v)
2316{
2317 small_type s = mul_signs(u.sgn, get_sign(v));
2318
2319 if (s == SC_ZERO) {
2320 div_by_zero(v); // case 1
2321 return sc_signed(); // case 2
2322 }
2323
2324 CONVERT_LONG_2(v);
2325
2326 // other cases
2327 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2328 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2329}
2330
2331
2332sc_signed
2333operator / (long u, const sc_signed &v)
2334{
2335 small_type s = mul_signs(v.sgn, get_sign(u));
2336
2337 if (s == SC_ZERO) {
2338 div_by_zero(v.sgn); // case 1
2339 return sc_signed(); // case 2
2340 }
2341
2342 CONVERT_LONG_2(u);
2343
2344 // other cases
2345 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2346 v.nbits, v.ndigits, v.digit);
2347}
2348
2349
2350sc_signed
2351operator / (const sc_unsigned &u, long v)
2352{
2353 small_type s = mul_signs(u.sgn, get_sign(v));
2354
2355 if (s == SC_ZERO) {
2356 div_by_zero(v); // case 1
2357 return sc_signed(); // case 2
2358 }
2359
2360 CONVERT_LONG_2(v);
2361
2362 // other cases
2363 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2364 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2365}
2366
2367
2368sc_signed
2369operator / (long u, const sc_unsigned &v)
2370{
2371 small_type s = mul_signs(v.sgn, get_sign(u));
2372
2373 if (s == SC_ZERO) {
2374 div_by_zero(v.sgn); // case 1
2375 return sc_signed(); // case 2
2376 }
2377
2378 CONVERT_LONG_2(u);
2379
2380 // other cases
2381 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2382 v.nbits, v.ndigits, v.digit);
2383}
2384
2385
2386sc_signed
2387operator / (const sc_signed &u, unsigned long v)
2388{
2389 small_type s = mul_signs(u.sgn, get_sign(v));
2390
2391 if (s == SC_ZERO) {
2392 div_by_zero(v); // case 1
2393 return sc_signed(); // case 2
2394 }
2395
2396 CONVERT_LONG_2(v);
2397
2398 // other cases
2399 return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
2400 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2401}
2402
2403
2404sc_signed
2405operator / (unsigned long u, const sc_signed &v)
2406{
2407 small_type s = mul_signs(v.sgn, get_sign(u));
2408
2409 if (s == SC_ZERO) {
2410 div_by_zero(v.sgn); // case 1
2411 return sc_signed(); // case 2
2412
2413 }
2414
2415 CONVERT_LONG_2(u);
2416
2417 // other cases
2418 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2419 v.nbits, v.ndigits, v.digit);
2420}
2421
2422// The rest of the operators in this section are included from
2423// sc_nbcommon.cpp.
2424
2425
2426// ----------------------------------------------------------------------------
2427// SECTION: MOD operators: %, %=.
2428// ----------------------------------------------------------------------------
2429
2430// Cases to consider when finding the remainder r = u % v:
2431// Note that u = q * v + r for r < q.
2432// 1. 0 % 0 or u % 0 => error
2433// 2. 0 % v => 0 = 0 * v + 0
2434// 3. u % v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
2435// 4. u % v & &u < v => u = 0 * v + u - u can be 1 or -1
2436// 5. u % v & &u > v => u = q * v + r - v can be 1 or -1
2437
2438sc_signed
2439operator % (const sc_unsigned &u, const sc_signed &v)
2440{
2441 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2442 div_by_zero(v.sgn); // case 1
2443 return sc_signed(); // case 2
2444 }
2445
2446 // other cases
2447 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2448 v.nbits, v.ndigits, v.digit);
2449}
2450
2451
2452sc_signed
2453operator % (const sc_signed &u, const sc_unsigned &v)
2454{
2455 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2456 div_by_zero(v.sgn); // case 1
2457 return sc_signed(); // case 2
2458 }
2459
2460 // other cases
2461 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2462 v.nbits, v.ndigits, v.digit);
2463}
2464
2465
2466sc_signed
2467operator % (const sc_signed &u, const sc_signed &v)
2468{
2469 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
2470 div_by_zero(v.sgn); // case 1
2471 return sc_signed(); // case 2
2472 }
2473
2474 // other cases
2475 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2476 v.nbits, v.ndigits, v.digit);
2477}
2478
2479
2480sc_signed
2481operator % (const sc_signed &u, int64 v)
2482{
2483 small_type vs = get_sign(v);
2484
2485 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2486 div_by_zero(v); // case 1
2487 return sc_signed(); // case 2
2488 }
2489
2490 CONVERT_INT64_2(v);
2491
2492 // other cases
2493 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2494 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2495}
2496
2497
2498sc_signed
2499operator % (int64 u, const sc_signed &v)
2500{
2501 small_type us = get_sign(u);
2502
2503 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2504 div_by_zero(v.sgn); // case 1
2505 return sc_signed(); // case 2
2506 }
2507
2508 CONVERT_INT64_2(u);
2509
2510 // other cases
2511 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2512 v.nbits, v.ndigits, v.digit);
2513}
2514
2515
2516sc_signed
2517operator % (const sc_unsigned &u, int64 v)
2518{
2519 small_type vs = get_sign(v);
2520
2521 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2522 div_by_zero(v); // case 1
2523 return sc_signed(); // case 2
2524 }
2525
2526 CONVERT_INT64_2(v);
2527
2528 // other cases
2529 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2530 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2531}
2532
2533
2534sc_signed
2535operator % (int64 u, const sc_unsigned &v)
2536{
2537 small_type us = get_sign(u);
2538
2539 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2540 div_by_zero(v.sgn); // case 1
2541 return sc_signed(); // case 2
2542 }
2543
2544 CONVERT_INT64_2(u);
2545
2546 // other cases
2547 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2548 v.nbits, v.ndigits, v.digit);
2549}
2550
2551
2552sc_signed
2553operator % (const sc_signed &u, uint64 v)
2554{
2555 if ((u.sgn == SC_ZERO) || (v == 0)) {
2556 div_by_zero(v); // case 1
2557 return sc_signed(); // case 2
2558 }
2559
2560 CONVERT_INT64_2(v);
2561
2562 // other cases
2563 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2564 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2565}
2566
2567
2568sc_signed
2569operator % (uint64 u, const sc_signed &v)
2570{
2571 if ((u == 0) || (v.sgn == SC_ZERO)) {
2572 div_by_zero(v.sgn); // case 1
2573 return sc_signed(); // case 2
2574 }
2575
2576 CONVERT_INT64(u);
2577
2578 // other cases
2579 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2580 v.nbits, v.ndigits, v.digit);
2581}
2582
2583
2584sc_signed
2585operator % (const sc_signed &u, long v)
2586{
2587 small_type vs = get_sign(v);
2588
2589 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2590 div_by_zero(v); // case 1
2591 return sc_signed(); // case 2
2592 }
2593
2594 CONVERT_LONG_2(v);
2595
2596 // other cases
2597 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2598 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2599}
2600
2601
2602sc_signed
2603operator % (long u, const sc_signed &v)
2604{
2605 small_type us = get_sign(u);
2606
2607 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2608 div_by_zero(v.sgn); // case 1
2609 return sc_signed(); // case 2
2610 }
2611
2612 CONVERT_LONG_2(u);
2613
2614 // other cases
2615 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2616 v.nbits, v.ndigits, v.digit);
2617}
2618
2619
2620sc_signed
2621operator % (const sc_unsigned &u, long v)
2622{
2623
2624 small_type vs = get_sign(v);
2625
2626 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
2627 div_by_zero(v); // case 1
2628 return sc_signed(); // case 2
2629 }
2630
2631 CONVERT_LONG_2(v);
2632
2633 // other cases
2634 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2635 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2636}
2637
2638
2639sc_signed
2640operator % (long u, const sc_unsigned &v)
2641{
2642 small_type us = get_sign(u);
2643
2644 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
2645 div_by_zero(v.sgn); // case 1
2646 return sc_signed(); // case 2
2647 }
2648
2649 CONVERT_LONG_2(u);
2650
2651 // other cases
2652 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2653 v.nbits, v.ndigits, v.digit);
2654}
2655
2656
2657sc_signed
2658operator % (const sc_signed &u, unsigned long v)
2659{
2660 if ((u.sgn == SC_ZERO) || (v == 0)) {
2661 div_by_zero(v); // case 1
2662 return sc_signed(); // case 2
2663 }
2664
2665 CONVERT_LONG_2(v);
2666
2667 // other cases
2668 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2669 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2670}
2671
2672
2673sc_signed
2674operator % (unsigned long u, const sc_signed &v)
2675{
2676 if ((u == 0) || (v.sgn == SC_ZERO)) {
2677 div_by_zero(v.sgn); // case 1
2678 return sc_signed(); // case 2
2679 }
2680
2681 CONVERT_LONG(u);
2682
2683 // other cases
2684 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2685 v.nbits, v.ndigits, v.digit);
2686}
2687
2688// The rest of the operators in this section are included from
2689// sc_nbcommon.cpp.
2690
2691
2692// ----------------------------------------------------------------------------
2693// SECTION: Bitwise AND operators: &, &=
2694// ----------------------------------------------------------------------------
2695
2696// Cases to consider when computing u &v:
2697// 1. u & 0 = 0 &v = 0
2698// 2. u &v => sgn = +
2699// 3. (-u) & (-v) => sgn = -
2700// 4. u & (-v) => sgn = +
2701// 5. (-u) &v => sgn = +
2702
2703sc_signed
2704operator & (const sc_unsigned &u, const sc_signed &v)
2705{
2706 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2707 return sc_signed();
2708
2709 // other cases
2710 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2711 v.sgn, v.nbits, v.ndigits, v.digit);
2712}
2713
2714
2715sc_signed
2716operator & (const sc_signed &u, const sc_unsigned &v)
2717{
2718 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2719 return sc_signed();
2720
2721 // other cases
2722 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2723 v.sgn, v.nbits, v.ndigits, v.digit);
2724}
2725
2726
2727sc_signed
2728operator & (const sc_signed &u, const sc_signed &v)
2729{
2730 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
2731 return sc_signed();
2732
2733 // other cases
2734 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2735 v.sgn, v.nbits, v.ndigits, v.digit);
2736}
2737
2738
2739sc_signed
2740operator & (const sc_signed &u, int64 v)
2741{
2742 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2743 return sc_signed();
2744
2745 CONVERT_INT64(v);
2746
2747 // other cases
2748 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2749 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2750}
2751
2752
2753sc_signed
2754operator & (int64 u, const sc_signed &v)
2755{
2756 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2757 return sc_signed();
2758
2759 CONVERT_INT64(u);
2760
2761 // other cases
2762 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2763 v.sgn, v.nbits, v.ndigits, v.digit);
2764}
2765
2766
2767sc_signed
2768operator & (const sc_unsigned &u, int64 v)
2769{
2770 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2771 return sc_signed();
2772
2773 CONVERT_INT64(v);
2774
2775 // other cases
2776 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2777 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2778}
2779
2780
2781sc_signed
2782operator & (int64 u, const sc_unsigned &v)
2783{
2784 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2785 return sc_signed();
2786
2787 CONVERT_INT64(u);
2788
2789 // other cases
2790 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2791 v.sgn, v.nbits, v.ndigits, v.digit);
2792}
2793
2794
2795sc_signed
2796operator & (const sc_signed &u, uint64 v)
2797{
2798 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2799 return sc_signed();
2800
2801 CONVERT_INT64(v);
2802
2803 // other cases
2804 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2805 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2806}
2807
2808
2809sc_signed
2810operator & (uint64 u, const sc_signed &v)
2811{
2812 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2813 return sc_signed();
2814
2815 CONVERT_INT64(u);
2816
2817 // other cases
2818 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2819 v.sgn, v.nbits, v.ndigits, v.digit);
2820}
2821
2822
2823sc_signed
2824operator & (const sc_signed &u, long v)
2825{
2826 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2827 return sc_signed();
2828
2829 CONVERT_LONG(v);
2830
2831 // other cases
2832 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2833 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2834}
2835
2836
2837sc_signed
2838operator & (long u, const sc_signed &v)
2839{
2840 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2841 return sc_signed();
2842
2843 CONVERT_LONG(u);
2844
2845 // other cases
2846 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2847 v.sgn, v.nbits, v.ndigits, v.digit);
2848}
2849
2850
2851sc_signed
2852operator & (const sc_unsigned &u, long v)
2853{
2854 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2855 return sc_signed();
2856
2857 CONVERT_LONG(v);
2858
2859 // other cases
2860 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2861 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2862}
2863
2864
2865sc_signed
2866operator & (long u, const sc_unsigned &v)
2867{
2868 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2869 return sc_signed();
2870
2871 CONVERT_LONG(u);
2872
2873 // other cases
2874 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2875 v.sgn, v.nbits, v.ndigits, v.digit);
2876}
2877
2878
2879sc_signed
2880operator & (const sc_signed &u, unsigned long v)
2881{
2882 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
2883 return sc_signed();
2884
2885 CONVERT_LONG(v);
2886
2887 // other cases
2888 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2889 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
2890}
2891
2892
2893sc_signed
2894operator & (unsigned long u, const sc_signed &v)
2895{
2896 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
2897 return sc_signed();
2898
2899 CONVERT_LONG(u);
2900
2901 // other cases
2902 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2903 v.sgn, v.nbits, v.ndigits, v.digit);
2904}
2905
2906// The rest of the operators in this section are included from
2907// sc_nbcommon.cpp.
2908
2909
2910// ----------------------------------------------------------------------------
2911// SECTION: Bitwise OR operators: |, |=
2912// ----------------------------------------------------------------------------
2913
2914// Cases to consider when computing u | v:
2915// 1. u | 0 = u
2916// 2. 0 | v = v
2917// 3. u | v => sgn = +
2918// 4. (-u) | (-v) => sgn = -
2919// 5. u | (-v) => sgn = -
2920// 6. (-u) | v => sgn = -
2921
2922sc_signed
2923operator | (const sc_unsigned &u, const sc_signed &v)
2924{
2925 if (v.sgn == SC_ZERO) // case 1
2926 return sc_signed(u);
2927
2928 if (u.sgn == SC_ZERO) // case 2
2929 return sc_signed(v);
2930
2931 // other cases
2932 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2933 v.sgn, v.nbits, v.ndigits, v.digit);
2934}
2935
2936
2937sc_signed
2938operator | (const sc_signed &u, const sc_unsigned &v)
2939{
2940 if (v.sgn == SC_ZERO) // case 1
2941 return sc_signed(u);
2942
2943 if (u.sgn == SC_ZERO) // case 2
2944 return sc_signed(v);
2945
2946 // other cases
2947 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2948 v.sgn, v.nbits, v.ndigits, v.digit);
2949}
2950
2951
2952sc_signed
2953operator | (const sc_signed &u, const sc_signed &v)
2954{
2955 if (v.sgn == SC_ZERO) // case 1
2956 return sc_signed(u);
2957
2958 if (u.sgn == SC_ZERO) // case 2
2959 return sc_signed(v);
2960
2961 // other cases
2962 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2963 v.sgn, v.nbits, v.ndigits, v.digit);
2964}
2965
2966
2967sc_signed
2968operator | (const sc_signed &u, int64 v)
2969{
2970 if (v == 0) // case 1
2971 return sc_signed(u);
2972
2973 CONVERT_INT64(v);
2974
2975 if (u.sgn == SC_ZERO) // case 2
2976 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
2977
2978 // other cases
2979 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
2980 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
2981}
2982
2983
2984sc_signed
2985operator | (int64 u, const sc_signed &v)
2986{
2987 if (u == 0)
2988 return sc_signed(v);
2989
2990 CONVERT_INT64(u);
2991
2992 if (v.sgn == SC_ZERO)
2993 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
2994
2995 // other cases
2996 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
2997 v.sgn, v.nbits, v.ndigits, v.digit);
2998}
2999
3000
3001sc_signed
3002operator | (const sc_unsigned &u, int64 v)
3003{
3004 if (v == 0) // case 1
3005 return sc_signed(u);
3006
3007 CONVERT_INT64(v);
3008
3009 if (u.sgn == SC_ZERO) // case 2
3010 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3011
3012 // other cases
3013 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3014 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3015}
3016
3017
3018sc_signed
3019operator | (int64 u, const sc_unsigned &v)
3020{
3021 if (u == 0)
3022 return sc_signed(v);
3023
3024 CONVERT_INT64(u);
3025
3026 if (v.sgn == SC_ZERO)
3027 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3028
3029 // other cases
3030 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3031 v.sgn, v.nbits, v.ndigits, v.digit);
3032}
3033
3034
3035sc_signed
3036operator | (const sc_signed &u, uint64 v)
3037{
3038 if (v == 0) // case 1
3039 return sc_signed(u);
3040
3041 CONVERT_INT64(v);
3042
3043 if (u.sgn == SC_ZERO) // case 2
3044 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3045
3046 // other cases
3047 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3048 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3049}
3050
3051
3052sc_signed
3053operator | (uint64 u, const sc_signed &v)
3054{
3055 if (u == 0)
3056 return sc_signed(v);
3057
3058 CONVERT_INT64(u);
3059
3060 if (v.sgn == SC_ZERO)
3061 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3062
3063 // other cases
3064 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3065 v.sgn, v.nbits, v.ndigits, v.digit);
3066}
3067
3068
3069sc_signed
3070operator | (const sc_signed &u, long v)
3071{
3072 if (v == 0) // case 1
3073 return sc_signed(u);
3074
3075 CONVERT_LONG(v);
3076
3077 if (u.sgn == SC_ZERO) // case 2
3078 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3079
3080 // other cases
3081 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3082 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3083}
3084
3085
3086sc_signed
3087operator | (long u, const sc_signed &v)
3088{
3089 if (u == 0)
3090 return sc_signed(v);
3091
3092 CONVERT_LONG(u);
3093
3094 if (v.sgn == SC_ZERO)
3095 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3096
3097 // other cases
3098 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3099 v.sgn, v.nbits, v.ndigits, v.digit);
3100}
3101
3102
3103sc_signed
3104operator | (const sc_unsigned &u, long v)
3105{
3106 if (v == 0) // case 1
3107 return sc_signed(u);
3108
3109 CONVERT_LONG(v);
3110
3111 if (u.sgn == SC_ZERO) // case 2
3112 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3113
3114 // other cases
3115 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3116 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3117}
3118
3119
3120sc_signed
3121operator | (long u, const sc_unsigned &v)
3122{
3123 if (u == 0)
3124 return sc_signed(v);
3125
3126 CONVERT_LONG(u);
3127
3128 if (v.sgn == SC_ZERO)
3129 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3130
3131 // other cases
3132 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3133 v.sgn, v.nbits, v.ndigits, v.digit);
3134}
3135
3136
3137sc_signed
3138operator | (const sc_signed &u, unsigned long v)
3139{
3140 if (v == 0) // case 1
3141 return sc_signed(u);
3142
3143 CONVERT_LONG(v);
3144
3145 if (u.sgn == SC_ZERO) // case 2
3146 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3147
3148 // other cases
3149 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3150 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3151}
3152
3153
3154sc_signed
3155operator | (unsigned long u, const sc_signed &v)
3156{
3157 if (u == 0)
3158 return sc_signed(v);
3159
3160 CONVERT_LONG(u);
3161
3162 if (v.sgn == SC_ZERO)
3163 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3164
3165 // other cases
3166 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3167 v.sgn, v.nbits, v.ndigits, v.digit);
3168}
3169
3170// The rest of the operators in this section are included from
3171// sc_nbcommon.cpp.
3172
3173
3174// ----------------------------------------------------------------------------
3175// SECTION: Bitwise XOR operators: ^, ^=
3176// ----------------------------------------------------------------------------
3177
3178// Cases to consider when computing u ^ v:
3179// Note that u ^ v = (~u &v) | (u & ~v).
3180// 1. u ^ 0 = u
3181// 2. 0 ^ v = v
3182// 3. u ^ v => sgn = +
3183// 4. (-u) ^ (-v) => sgn = -
3184// 5. u ^ (-v) => sgn = -
3185// 6. (-u) ^ v => sgn = +
3186
3187sc_signed
3188operator ^ (const sc_unsigned &u, const sc_signed &v)
3189{
3190
3191 if (v.sgn == SC_ZERO) // case 1
3192 return sc_signed(u);
3193
3194 if (u.sgn == SC_ZERO) // case 2
3195 return sc_signed(v);
3196
3197 // other cases
3198 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3199 v.sgn, v.nbits, v.ndigits, v.digit);
3200
3201}
3202
3203
3204sc_signed
3205operator ^ (const sc_signed &u, const sc_unsigned &v)
3206{
3207 if (v.sgn == SC_ZERO) // case 1
3208 return sc_signed(u);
3209
3210 if (u.sgn == SC_ZERO) // case 2
3211 return sc_signed(v);
3212
3213 // other cases
3214 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3215 v.sgn, v.nbits, v.ndigits, v.digit);
3216}
3217
3218
3219sc_signed
3220operator ^ (const sc_signed &u, const sc_signed &v)
3221{
3222 if (v.sgn == SC_ZERO) // case 1
3223 return sc_signed(u);
3224
3225 if (u.sgn == SC_ZERO) // case 2
3226 return sc_signed(v);
3227
3228 // other cases
3229 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3230 v.sgn, v.nbits, v.ndigits, v.digit);
3231}
3232
3233
3234sc_signed
3235operator ^ (const sc_signed &u, int64 v)
3236{
3237 if (v == 0) // case 1
3238 return sc_signed(u);
3239
3240 CONVERT_INT64(v);
3241
3242 if (u.sgn == SC_ZERO) // case 2
3243 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3244
3245 // other cases
3246 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3247 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3248}
3249
3250
3251sc_signed
3252operator ^ (int64 u, const sc_signed &v)
3253{
3254 if (u == 0)
3255 return sc_signed(v);
3256
3257 CONVERT_INT64(u);
3258
3259 if (v.sgn == SC_ZERO)
3260 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3261
3262 // other cases
3263 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3264 v.sgn, v.nbits, v.ndigits, v.digit);
3265}
3266
3267
3268sc_signed
3269operator ^ (const sc_unsigned &u, int64 v)
3270{
3271 if (v == 0) // case 1
3272 return sc_signed(u);
3273
3274 CONVERT_INT64(v);
3275
3276 if (u.sgn == SC_ZERO) // case 2
3277 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3278
3279 // other cases
3280 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3281 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3282}
3283
3284
3285sc_signed
3286operator ^ (int64 u, const sc_unsigned &v)
3287{
3288 if (u == 0)
3289 return sc_signed(v);
3290
3291 CONVERT_INT64(u);
3292
3293 if (v.sgn == SC_ZERO)
3294 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3295
3296 // other cases
3297 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3298 v.sgn, v.nbits, v.ndigits, v.digit);
3299}
3300
3301
3302sc_signed
3303operator ^ (const sc_signed &u, uint64 v)
3304{
3305 if (v == 0) // case 1
3306 return sc_signed(u);
3307
3308 CONVERT_INT64(v);
3309
3310 if (u.sgn == SC_ZERO) // case 2
3311 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
3312
3313 // other cases
3314 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3315 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
3316}
3317
3318sc_signed
3319operator ^ (uint64 u, const sc_signed &v)
3320{
3321 if (u == 0)
3322 return sc_signed(v);
3323
3324 CONVERT_INT64(u);
3325
3326 if (v.sgn == SC_ZERO)
3327 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
3328
3329 // other cases
3330 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
3331 v.sgn, v.nbits, v.ndigits, v.digit);
3332}
3333
3334
3335sc_signed
3336operator ^ (const sc_signed &u, long v)
3337{
3338 if (v == 0) // case 1
3339 return sc_signed(u);
3340
3341 CONVERT_LONG(v);
3342
3343 if (u.sgn == SC_ZERO) // case 2
3344 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3345
3346 // other cases
3347 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3348 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3349}
3350
3351
3352sc_signed
3353operator ^ (long u, const sc_signed &v)
3354{
3355 if (u == 0)
3356 return sc_signed(v);
3357
3358 CONVERT_LONG(u);
3359
3360 if (v.sgn == SC_ZERO)
3361 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3362
3363 // other cases
3364 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3365 v.sgn, v.nbits, v.ndigits, v.digit);
3366}
3367
3368
3369sc_signed
3370operator ^ (const sc_unsigned &u, long v)
3371{
3372 if (v == 0) // case 1
3373 return sc_signed(u);
3374
3375 CONVERT_LONG(v);
3376
3377 if (u.sgn == SC_ZERO) // case 2
3378 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3379
3380 // other cases
3381 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3382 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3383}
3384
3385
3386sc_signed
3387operator ^ (long u, const sc_unsigned &v)
3388{
3389 if (u == 0)
3390 return sc_signed(v);
3391
3392 CONVERT_LONG(u);
3393
3394 if (v.sgn == SC_ZERO)
3395 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3396
3397 // other cases
3398 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3399 v.sgn, v.nbits, v.ndigits, v.digit);
3400}
3401
3402
3403sc_signed
3404operator ^ (const sc_signed &u, unsigned long v)
3405{
3406 if (v == 0) // case 1
3407 return sc_signed(u);
3408
3409 CONVERT_LONG(v);
3410
3411 if (u.sgn == SC_ZERO) // case 2
3412 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
3413
3414 // other cases
3415 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
3416 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
3417}
3418
3419sc_signed
3420operator ^ (unsigned long u, const sc_signed &v)
3421{
3422 if (u == 0)
3423 return sc_signed(v);
3424
3425 CONVERT_LONG(u);
3426
3427 if (v.sgn == SC_ZERO)
3428 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
3429
3430 // other cases
3431 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
3432 v.sgn, v.nbits, v.ndigits, v.digit);
3433}
3434
3435// The rest of the operators in this section are included from
3436// sc_nbcommon.cpp.
3437
3438
3439// ----------------------------------------------------------------------------
3440// SECTION: Bitwise NOT operator: ~
3441// ----------------------------------------------------------------------------
3442
3443// Operators in this section are included from sc_nbcommon.cpp.
3444
3445
3446// ----------------------------------------------------------------------------
3447// SECTION: LEFT SHIFT operators: <<, <<=
3448// ----------------------------------------------------------------------------
3449
3450sc_signed
3451operator << (const sc_signed &u, const sc_unsigned &v)
3452{
3453 if (v.sgn == SC_ZERO)
3454 return sc_signed(u);
3455
3456 return operator << (u, v.to_ulong());
3457}
3458
3459// The rest of the operators in this section are included from
3460// sc_nbcommon.cpp.
3461
3462
3463// ----------------------------------------------------------------------------
3464// SECTION: RIGHT SHIFT operators: >>, >>=
3465// ----------------------------------------------------------------------------
3466
3467sc_signed
3468operator >> (const sc_signed &u, const sc_unsigned &v)
3469{
3470 if (v.sgn == SC_ZERO)
3471 return sc_signed(u);
3472
3473 return operator >> (u, v.to_ulong());
3474}
3475
3476// The rest of the operators in this section are included from
3477// sc_nbcommon.cpp.
3478
3479
3480// ----------------------------------------------------------------------------
3481// SECTION: Unary arithmetic operators.
3482// ----------------------------------------------------------------------------
3483
3484sc_signed
3485operator + (const sc_signed &u)
3486{
3487 return sc_signed(u);
3488}
3489
3490sc_signed
3491operator - (const sc_signed &u)
3492{
3493 return sc_signed(u, -u.sgn);
3494}
3495
3496sc_signed
3497operator - (const sc_unsigned &u)
3498{
3499 return sc_signed(u, -u.sgn);
3500}
3501
3502
3503// ----------------------------------------------------------------------------
3504// SECTION: EQUAL operator: ==
3505// ----------------------------------------------------------------------------
3506
3507bool
3508operator == (const sc_signed &u, const sc_signed &v)
3509{
3510 if (u.sgn != v.sgn)
3511 return false;
3512
3513 if (&u == &v)
3514 return true;
3515
3516 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) != 0)
3517 return false;
3518
3519 return true;
3520}
3521
3522
3523bool
3524operator == (const sc_signed &u, int64 v)
3525{
3526 CONVERT_INT64(v);
3527
3528 if (u.sgn != vs)
3529 return false;
3530
3531 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
3532 return false;
3533
3534 return true;
3535}
3536
3537
3538bool
3539operator == (int64 u, const sc_signed &v)
3540{
3541 CONVERT_INT64(u);
3542
3543 if (us != v.sgn)
3544 return false;
3545
3546 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
3547 return false;
3548
3549 return true;
3550}
3551
3552
3553bool
3554operator == (const sc_signed &u, uint64 v)
3555{
3556 CONVERT_INT64(v);
3557
3558 if (u.sgn != vs)
3559 return false;
3560
3561 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
3562 return false;
3563
3564 return true;
3565}
3566
3567
3568bool
3569operator == (uint64 u, const sc_signed &v)
3570{
3571 CONVERT_INT64(u);
3572
3573 if (us != v.sgn)
3574 return false;
3575
3576 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
3577 return false;
3578
3579 return true;
3580}
3581
3582
3583bool
3584operator == (const sc_signed &u, long v)
3585{
3586 CONVERT_LONG(v);
3587
3588 if (u.sgn != vs)
3589 return false;
3590
3591 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
3592 return false;
3593
3594 return true;
3595}
3596
3597
3598bool
3599operator == (long u, const sc_signed &v)
3600{
3601 CONVERT_LONG(u);
3602
3603 if (us != v.sgn)
3604 return false;
3605
3606 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
3607 return false;
3608
3609 return true;
3610}
3611
3612
3613bool
3614operator == (const sc_signed &u, unsigned long v)
3615{
3616 CONVERT_LONG(v);
3617
3618 if (u.sgn != vs)
3619 return false;
3620
3621 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
3622 return false;
3623
3624 return true;
3625}
3626
3627
3628bool
3629operator == (unsigned long u, const sc_signed &v)
3630{
3631 CONVERT_LONG(u);
3632
3633 if (us != v.sgn)
3634 return false;
3635
3636 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
3637 return false;
3638
3639 return true;
3640}
3641
3642
3643// ----------------------------------------------------------------------------
3644// SECTION: NOT_EQUAL operator: !=
3645// ----------------------------------------------------------------------------
3646
3647// Operators in this section are included from sc_nbcommon.cpp.
3648
3649
3650// ----------------------------------------------------------------------------
3651// SECTION: LESS THAN operator: <
3652// ----------------------------------------------------------------------------
3653
3654bool
3655operator < (const sc_signed &u, const sc_signed &v)
3656{
3657 if (u.sgn < v.sgn)
3658 return true;
3659
3660 if (u.sgn > v.sgn)
3661 return false;
3662
3663 // u.sgn == v.sgn
3664
3665 if (&u == &v)
3666 return false;
3667
3668 if (u.sgn == SC_POS) {
3669 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) < 0)
3670 return true;
3671 } else if (u.sgn == SC_NEG) {
3672 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) > 0)
3673 return true;
3674 }
3675
3676 return false;
3677}
3678
3679
3680bool
3681operator < (const sc_signed &u, int64 v)
3682{
3683 CONVERT_INT64(v);
3684
3685 if (u.sgn < vs)
3686 return true;
3687
3688 if (u.sgn > vs)
3689 return false;
3690
3691 // u.sgn == vs
3692
3693 if (vs == SC_POS) {
3694 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
3695 return true;
3696 } else if (vs == SC_NEG) {
3697 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) > 0)
3698 return true;
3699 }
3700
3701 return false;
3702}
3703
3704
3705bool
3706operator < (int64 u, const sc_signed &v)
3707{
3708 CONVERT_INT64(u);
3709
3710 if (us < v.sgn)
3711 return true;
3712
3713 if (us > v.sgn)
3714 return false;
3715
3716 // us == v.sgn
3717
3718 if (us == SC_POS) {
3719 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
3720 return true;
3721 } else if (us == SC_NEG) {
3722 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) > 0)
3723 return true;
3724 }
3725
3726 return false;
3727}
3728
3729
3730bool
3731operator < (const sc_signed &u, uint64 v)
3732{
3733 CONVERT_INT64(v);
3734
3735 if (u.sgn < vs)
3736 return true;
3737
3738 if (u.sgn > vs)
3739 return false;
3740
3741 // u.sgn == vs
3742
3743 if (vs == SC_POS) {
3744 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
3745 return true;
3746 }
3747
3748 return false;
3749}
3750
3751
3752bool
3753operator < (uint64 u, const sc_signed &v)
3754{
3755 CONVERT_INT64(u);
3756
3757 if (us < v.sgn)
3758 return true;
3759
3760 if (us > v.sgn)
3761 return false;
3762
3763 // us == v.sgn
3764
3765 if (us == SC_POS) {
3766 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
3767 return true;
3768 }
3769
3770 return false;
3771}
3772
3773
3774bool
3775operator < (const sc_signed &u, long v)
3776{
3777 CONVERT_LONG(v);
3778
3779 if (u.sgn < vs)
3780 return true;
3781
3782 if (u.sgn > vs)
3783 return false;
3784
3785 // u.sgn == vs
3786
3787 if (vs == SC_POS) {
3788 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
3789 return true;
3790
3791 } else if (vs == SC_NEG) {
3792 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) > 0)
3793 return true;
3794 }
3795
3796 return false;
3797}
3798
3799
3800bool
3801operator < (long u, const sc_signed &v)
3802{
3803 CONVERT_LONG(u);
3804
3805 if (us < v.sgn)
3806 return true;
3807
3808 if (us > v.sgn)
3809 return false;
3810
3811 // us == v.sgn
3812
3813 if (us == SC_POS) {
3814 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
3815 return true;
3816 } else if (us == SC_NEG) {
3817 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) > 0)
3818 return true;
3819 }
3820
3821 return false;
3822}
3823
3824
3825bool
3826operator < (const sc_signed &u, unsigned long v)
3827{
3828 CONVERT_LONG(v);
3829
3830 if (u.sgn < vs)
3831 return true;
3832
3833 if (u.sgn > vs)
3834 return false;
3835
3836 // u.sgn == vs
3837
3838 if (vs == SC_POS) {
3839 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
3840 return true;
3841 }
3842
3843 return false;
3844}
3845
3846
3847bool
3848operator < (unsigned long u, const sc_signed &v)
3849{
3850 CONVERT_LONG(u);
3851
3852 if (us < v.sgn)
3853 return true;
3854
3855 if (us > v.sgn)
3856 return false;
3857
3858 // us == v.sgn
3859
3860 if (us == SC_POS) {
3861 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
3862 return true;
3863 }
3864
3865 return false;
3866}
3867
3868
3869// ---------------------------------------------------------------------------
3870// SECTION: LESS THAN or EQUAL operator: <=
3871// ---------------------------------------------------------------------------
3872
3873// Operators in this section are included from sc_nbcommon.cpp.
3874
3875
3876// ---------------------------------------------------------------------------
3877// SECTION: GREATER THAN operator: >
3878// ---------------------------------------------------------------------------
3879
3880// Operators in this section are included from sc_nbcommon.cpp.
3881
3882
3883// ---------------------------------------------------------------------------
3884// SECTION: GREATER THAN or EQUAL operator: >=
3885// ---------------------------------------------------------------------------
3886
3887// Operators in this section are included from sc_nbcommon.cpp.
3888
3889
3890// ---------------------------------------------------------------------------
3891// SECTION: Public members - Other utils.
3892// ---------------------------------------------------------------------------
3893
3894bool
3895sc_signed::iszero() const
3896{
3897 if (sgn == SC_ZERO)
3898 return true;
3899 else if (sgn != SC_NOSIGN)
3900 return false;
3901 else
3902 return check_for_zero(ndigits, digit);
3903}
3904
3905
3906bool
3907sc_signed::sign() const
3908{
3909 if (sgn == SC_NEG)
3910 return 1;
3911 else if (sgn != SC_NOSIGN)
3912 return 0;
3913 else
3914 return ((digit[ndigits - 1] & one_and_zeros(bit_ord(nbits - 1))) != 0);
3915}
3916
3917// The rest of the utils in this section are included from sc_nbcommon.cpp.
3918
3919
3920// ----------------------------------------------------------------------------
3921// SECTION: Private members.
3922// ----------------------------------------------------------------------------
3923
3924// The private members in this section are included from sc_nbcommon.cpp.
3925
3926#define CLASS_TYPE sc_signed
3927#define CLASS_TYPE_STR "sc_signed"
3928
3929#define ADD_HELPER add_signed_friend
3930#define SUB_HELPER sub_signed_friend
3931#define MUL_HELPER mul_signed_friend
3932#define DIV_HELPER div_signed_friend
3933#define MOD_HELPER mod_signed_friend
3934#define AND_HELPER and_signed_friend
3935#define OR_HELPER or_signed_friend
3936#define XOR_HELPER xor_signed_friend
3937
3938#include "sc_nbfriends.inc"
3939
3940#undef SC_UNSIGNED
3941#define SC_SIGNED
3942#define IF_SC_SIGNED 1 // 1 = sc_signed
3943#define CLASS_TYPE_SUBREF sc_signed_subref_r
3944#define OTHER_CLASS_TYPE sc_unsigned
3945#define OTHER_CLASS_TYPE_SUBREF sc_unsigned_subref_r
3946
3947#define MUL_ON_HELPER mul_on_help_signed
3948#define DIV_ON_HELPER div_on_help_signed
3949#define MOD_ON_HELPER mod_on_help_signed
3950
3951#include "sc_nbcommon.inc"
3952
3953#undef MOD_ON_HELPER
3954#undef DIV_ON_HELPER
3955#undef MUL_ON_HELPER
3956
3957#undef OTHER_CLASS_TYPE_SUBREF
3958#undef OTHER_CLASS_TYPE
3959#undef CLASS_TYPE_SUBREF
3960#undef IF_SC_SIGNED
3961#undef SC_SIGNED
3962
3963#undef XOR_HELPER
3964#undef OR_HELPER
3965#undef AND_HELPER
3966#undef MOD_HELPER
3967#undef DIV_HELPER
3968#undef MUL_HELPER
3969#undef SUB_HELPER
3970#undef ADD_HELPER
3971
3972#undef CLASS_TYPE
3973#undef CLASS_TYPE_STR
3974
3975#include "sc_signed_bitref.inc"
3976#include "sc_signed_subref.inc"
3977
3978#undef CONVERT_LONG
3979#undef CONVERT_LONG_2
3980#undef CONVERT_INT64
3981#undef CONVERT_INT64_2
3982
3983} // namespace sc_dt