sc_signed.cc revision 13325
113531Sjairo.balart@metempsy.com/*****************************************************************************
213531Sjairo.balart@metempsy.com
313531Sjairo.balart@metempsy.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
413531Sjairo.balart@metempsy.com  more contributor license agreements.  See the NOTICE file distributed
513531Sjairo.balart@metempsy.com  with this work for additional information regarding copyright ownership.
613531Sjairo.balart@metempsy.com  Accellera licenses this file to you under the Apache License, Version 2.0
713531Sjairo.balart@metempsy.com  (the "License"); you may not use this file except in compliance with the
813531Sjairo.balart@metempsy.com  License.  You may obtain a copy of the License at
913531Sjairo.balart@metempsy.com
1013531Sjairo.balart@metempsy.com    http://www.apache.org/licenses/LICENSE-2.0
1113531Sjairo.balart@metempsy.com
1213531Sjairo.balart@metempsy.com  Unless required by applicable law or agreed to in writing, software
1313531Sjairo.balart@metempsy.com  distributed under the License is distributed on an "AS IS" BASIS,
1413531Sjairo.balart@metempsy.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1513531Sjairo.balart@metempsy.com  implied.  See the License for the specific language governing
1613531Sjairo.balart@metempsy.com  permissions and limitations under the License.
1713531Sjairo.balart@metempsy.com
1813531Sjairo.balart@metempsy.com *****************************************************************************/
1913531Sjairo.balart@metempsy.com
2013531Sjairo.balart@metempsy.com/*****************************************************************************
2113531Sjairo.balart@metempsy.com
2213531Sjairo.balart@metempsy.com  sc_signed.cpp -- Arbitrary precision signed arithmetic.
2313531Sjairo.balart@metempsy.com
2413531Sjairo.balart@metempsy.com                   This file includes the definitions of sc_signed_bitref,
2513531Sjairo.balart@metempsy.com                   sc_signed_subref, and sc_signed classes. The first two
2613531Sjairo.balart@metempsy.com                   classes are proxy classes to reference one bit and a range
2713531Sjairo.balart@metempsy.com                   of bits of a sc_signed number, respectively. This file also
2813531Sjairo.balart@metempsy.com                   includes sc_nbcommon.cpp and sc_nbfriends.cpp, which
2913531Sjairo.balart@metempsy.com                   contain the definitions shared by sc_unsigned.
3013531Sjairo.balart@metempsy.com
3113531Sjairo.balart@metempsy.com  Original Author: Ali Dasdan, Synopsys, Inc.
3213531Sjairo.balart@metempsy.com
3313531Sjairo.balart@metempsy.com *****************************************************************************/
3413531Sjairo.balart@metempsy.com
3513531Sjairo.balart@metempsy.com/*****************************************************************************
3613531Sjairo.balart@metempsy.com
3713531Sjairo.balart@metempsy.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3813531Sjairo.balart@metempsy.com  changes you are making here.
3913531Sjairo.balart@metempsy.com
4013531Sjairo.balart@metempsy.com      Name, Affiliation, Date:
4113531Sjairo.balart@metempsy.com  Description of Modification:
4213531Sjairo.balart@metempsy.com
4313531Sjairo.balart@metempsy.com *****************************************************************************/
4413531Sjairo.balart@metempsy.com
4513531Sjairo.balart@metempsy.com
4613531Sjairo.balart@metempsy.com// $Log: sc_signed.cpp,v $
4713531Sjairo.balart@metempsy.com// Revision 1.6  2011/02/18 20:19:15  acg
4813531Sjairo.balart@metempsy.com//  Andy Goodrich: updating Copyright notice.
4913531Sjairo.balart@metempsy.com//
5013531Sjairo.balart@metempsy.com// Revision 1.5  2008/12/10 20:38:45  acg
5113531Sjairo.balart@metempsy.com//  Andy Goodrich: fixed conversion of double values to the digits vector.
5213531Sjairo.balart@metempsy.com//  The bits above the radix were not being masked off.
5313531Sjairo.balart@metempsy.com//
5413531Sjairo.balart@metempsy.com// Revision 1.4  2008/06/19 17:47:56  acg
5513531Sjairo.balart@metempsy.com//  Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
5613531Sjairo.balart@metempsy.com//
5713531Sjairo.balart@metempsy.com// Revision 1.3  2008/04/29 21:20:41  acg
5813531Sjairo.balart@metempsy.com//  Andy Goodrich: added mask to first word transferred when processing
5913531Sjairo.balart@metempsy.com//  a negative sc_signed value in sc_signed::concat_get_data().
6013531Sjairo.balart@metempsy.com//
6113531Sjairo.balart@metempsy.com// Revision 1.2  2007/11/04 21:27:00  acg
6213531Sjairo.balart@metempsy.com//  Andy Goodrich: changes to make sure the proper value is returned from
6313531Sjairo.balart@metempsy.com//  concat_get_data().
6413531Sjairo.balart@metempsy.com//
6513531Sjairo.balart@metempsy.com// Revision 1.1.1.1  2006/12/15 20:20:05  acg
6613531Sjairo.balart@metempsy.com// SystemC 2.3
6713531Sjairo.balart@metempsy.com//
6813531Sjairo.balart@metempsy.com// Revision 1.5  2006/10/23 19:32:47  acg
6913531Sjairo.balart@metempsy.com//  Andy Goodrich: further fix for incorrect value being returned from
7013531Sjairo.balart@metempsy.com//  concat_get_data. This one is in the non-aligned value code.
7113531Sjairo.balart@metempsy.com//
7213531Sjairo.balart@metempsy.com// Revision 1.3  2006/01/13 18:49:32  acg
7313531Sjairo.balart@metempsy.com// Added $Log command so that CVS check in comments are reproduced in the
7413531Sjairo.balart@metempsy.com// source.
7513531Sjairo.balart@metempsy.com//
7613531Sjairo.balart@metempsy.com
7713531Sjairo.balart@metempsy.com#include <cctype>
7813531Sjairo.balart@metempsy.com#include <cmath>
7913531Sjairo.balart@metempsy.com#include <sstream>
8013531Sjairo.balart@metempsy.com
8113531Sjairo.balart@metempsy.com#include "systemc/ext/dt/bit/sc_bv_base.hh"
8213531Sjairo.balart@metempsy.com#include "systemc/ext/dt/bit/sc_lv_base.hh"
8313531Sjairo.balart@metempsy.com#include "systemc/ext/dt/fx/sc_fix.hh"
8413531Sjairo.balart@metempsy.com#include "systemc/ext/dt/fx/scfx_other_defs.hh"
8513531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/messages.hh"
8613531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_int_base.hh"
8713531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_signed.hh"
8813531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_uint_base.hh"
8913531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_unsigned.hh"
9013531Sjairo.balart@metempsy.com#include "systemc/ext/dt/misc/sc_concatref.hh"
9113531Sjairo.balart@metempsy.com
9213531Sjairo.balart@metempsy.com// explicit template instantiations
9313531Sjairo.balart@metempsy.comnamespace sc_core
9413531Sjairo.balart@metempsy.com{
9513531Sjairo.balart@metempsy.com
9613531Sjairo.balart@metempsy.comtemplate class sc_vpool<sc_dt::sc_signed_bitref>;
9713531Sjairo.balart@metempsy.comtemplate class sc_vpool<sc_dt::sc_signed_subref>;
9813531Sjairo.balart@metempsy.com
9913531Sjairo.balart@metempsy.com} // namespace sc_core
10013531Sjairo.balart@metempsy.com
10113531Sjairo.balart@metempsy.comnamespace sc_dt
10213531Sjairo.balart@metempsy.com{
10313531Sjairo.balart@metempsy.com
10413531Sjairo.balart@metempsy.com// Pool of temporary instances:
10513531Sjairo.balart@metempsy.com
10613531Sjairo.balart@metempsy.comsc_core::sc_vpool<sc_signed_bitref> sc_signed_bitref::m_pool(9);
10713531Sjairo.balart@metempsy.comsc_core::sc_vpool<sc_signed_subref> sc_signed_subref::m_pool(9);
10813531Sjairo.balart@metempsy.com
10913531Sjairo.balart@metempsy.comvoid
11013531Sjairo.balart@metempsy.comsc_signed::invalid_init(const char *type_name, int nb) const
11113531Sjairo.balart@metempsy.com{
11213531Sjairo.balart@metempsy.com    std::stringstream msg;
11313531Sjairo.balart@metempsy.com    msg << "sc_signed("<< type_name << ") : nb = " << nb << " is not valid";
11413531Sjairo.balart@metempsy.com    SC_REPORT_ERROR(sc_core::SC_ID_INIT_FAILED_, msg.str().c_str());
11513531Sjairo.balart@metempsy.com}
11613531Sjairo.balart@metempsy.com
11713531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
11813531Sjairo.balart@metempsy.com// SECTION: Public members - Invalid selections.
11913531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
12013531Sjairo.balart@metempsy.com
12113531Sjairo.balart@metempsy.comvoid
12213531Sjairo.balart@metempsy.comsc_signed::invalid_index(int i) const
12313531Sjairo.balart@metempsy.com{
12413531Sjairo.balart@metempsy.com    std::stringstream msg;
12513531Sjairo.balart@metempsy.com    msg << "sc_bigint bit selection: index = " << i << " violates "
12613531Sjairo.balart@metempsy.com           "0 <= index <= " << (nbits - 1);
12713531Sjairo.balart@metempsy.com    SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
12813531Sjairo.balart@metempsy.com    sc_core::sc_abort(); // can't recover from here
12913531Sjairo.balart@metempsy.com}
13013531Sjairo.balart@metempsy.com
13113531Sjairo.balart@metempsy.comvoid
13213531Sjairo.balart@metempsy.comsc_signed::invalid_range(int l, int r) const
13313531Sjairo.balart@metempsy.com{
13413531Sjairo.balart@metempsy.com    std::stringstream msg;
13513531Sjairo.balart@metempsy.com    msg << "sc_bigint part selection: left = " <<
13613531Sjairo.balart@metempsy.com           l << ", right = " << r << " \n"
13713531Sjairo.balart@metempsy.com           "  violates either (" << (nbits-1) << " >= left >= 0) or "
13813531Sjairo.balart@metempsy.com           "(" << (nbits-1) << " >= right >= 0)";
13913531Sjairo.balart@metempsy.com    SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str());
14013531Sjairo.balart@metempsy.com    sc_core::sc_abort(); // can't recover from here
14113531Sjairo.balart@metempsy.com}
14213531Sjairo.balart@metempsy.com
14313531Sjairo.balart@metempsy.com
14413531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
14513531Sjairo.balart@metempsy.com
14613531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
14713531Sjairo.balart@metempsy.com//  SECTION: Public members.
14813531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
14913531Sjairo.balart@metempsy.com
15013531Sjairo.balart@metempsy.com// Most public members are included from sc_nbcommon.inc. However, some
15113531Sjairo.balart@metempsy.com// concatenation support appears here to optimize between the signed and
15213531Sjairo.balart@metempsy.com// unsigned cases.
15313531Sjairo.balart@metempsy.com
15413531Sjairo.balart@metempsy.com// Insert this object's value at the specified place in a vector of biguint
15513531Sjairo.balart@metempsy.com// style values.
15613531Sjairo.balart@metempsy.com
15713531Sjairo.balart@metempsy.combool
15813531Sjairo.balart@metempsy.comsc_signed::concat_get_ctrl(sc_digit *dst_p, int low_i) const
15913531Sjairo.balart@metempsy.com{
16013531Sjairo.balart@metempsy.com    int dst_i; // Index to next word to set in dst_p.
16113531Sjairo.balart@metempsy.com    int end_i; // Index of high order word to set.
16213531Sjairo.balart@metempsy.com    int left_shift; // Amount to shift value left.
16313531Sjairo.balart@metempsy.com    sc_digit mask; // Mask for partial word sets.
16413531Sjairo.balart@metempsy.com
16513531Sjairo.balart@metempsy.com    // CALCULATE METRICS FOR DATA MOVEMENT:
16613531Sjairo.balart@metempsy.com    dst_i = low_i / BITS_PER_DIGIT;
16713531Sjairo.balart@metempsy.com    end_i = (low_i + nbits - 1) / BITS_PER_DIGIT;
16813531Sjairo.balart@metempsy.com    left_shift = low_i % BITS_PER_DIGIT;
16913531Sjairo.balart@metempsy.com
17013531Sjairo.balart@metempsy.com    // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
17113531Sjairo.balart@metempsy.com    mask = ~(~0U << left_shift);
17213531Sjairo.balart@metempsy.com    dst_p[dst_i] = (dst_p[dst_i] & ~mask);
17313531Sjairo.balart@metempsy.com    dst_i++;
17413531Sjairo.balart@metempsy.com
17513531Sjairo.balart@metempsy.com    for (; dst_i <= end_i; dst_i++)
17613531Sjairo.balart@metempsy.com        dst_p[dst_i] = 0;
17713531Sjairo.balart@metempsy.com
17813531Sjairo.balart@metempsy.com    return false;
17913531Sjairo.balart@metempsy.com}
18013531Sjairo.balart@metempsy.com
18113531Sjairo.balart@metempsy.combool
18213531Sjairo.balart@metempsy.comsc_signed::concat_get_data(sc_digit *dst_p, int low_i) const
18313531Sjairo.balart@metempsy.com{
18413531Sjairo.balart@metempsy.com    sc_digit carry; // Carry bit for complements.
18513531Sjairo.balart@metempsy.com    int dst_i; // Index to next word to set in dst_p.
18613531Sjairo.balart@metempsy.com    int end_i; // Index of high order word to set.
18713531Sjairo.balart@metempsy.com    int high_i; // Index w/in word of high order bit.
18813531Sjairo.balart@metempsy.com    int left_shift; // Amount to shift value left.
18913531Sjairo.balart@metempsy.com    sc_digit left_word; // High word component for set.
19013531Sjairo.balart@metempsy.com    sc_digit mask; // Mask for partial word sets.
19113531Sjairo.balart@metempsy.com    bool result; // True if inserted non-zero data.
19213531Sjairo.balart@metempsy.com    int right_shift; // Amount to shift value right.
19313531Sjairo.balart@metempsy.com    sc_digit right_word; // Low word component for set.
19413531Sjairo.balart@metempsy.com    int src_i; // Index to next word to get from digit.
19513531Sjairo.balart@metempsy.com
19613531Sjairo.balart@metempsy.com    // CALCULATE METRICS FOR DATA MOVEMENT:
19713531Sjairo.balart@metempsy.com    dst_i = low_i / BITS_PER_DIGIT;
19813531Sjairo.balart@metempsy.com    high_i = low_i + nbits - 1;
19913531Sjairo.balart@metempsy.com    end_i = high_i / BITS_PER_DIGIT;
20013531Sjairo.balart@metempsy.com    left_shift = low_i % BITS_PER_DIGIT;
20113531Sjairo.balart@metempsy.com
20213531Sjairo.balart@metempsy.com    switch (sgn) {
20313531Sjairo.balart@metempsy.com      // POSITIVE SOURCE VALUE:
20413531Sjairo.balart@metempsy.com      case SC_POS:
20513531Sjairo.balart@metempsy.com        result = true;
20613531Sjairo.balart@metempsy.com
20713531Sjairo.balart@metempsy.com        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
20813531Sjairo.balart@metempsy.com        if (dst_i == end_i) {
20913531Sjairo.balart@metempsy.com            mask = ~(~0U << left_shift);
21013531Sjairo.balart@metempsy.com            dst_p[dst_i] = ((dst_p[dst_i] & mask) |
21113531Sjairo.balart@metempsy.com                (digit[0] << left_shift)) & DIGIT_MASK;
21213531Sjairo.balart@metempsy.com
21313531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
21413531Sjairo.balart@metempsy.com        } else if (left_shift == 0) {
21513531Sjairo.balart@metempsy.com            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
21613531Sjairo.balart@metempsy.com                dst_p[dst_i] = digit[src_i];
21713531Sjairo.balart@metempsy.com            }
21813531Sjairo.balart@metempsy.com            high_i = high_i % BITS_PER_DIGIT;
21913531Sjairo.balart@metempsy.com            mask = ~(~1U << high_i) & DIGIT_MASK;
22013531Sjairo.balart@metempsy.com            dst_p[dst_i] = digit[src_i] & mask;
22113531Sjairo.balart@metempsy.com
22213531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
22313531Sjairo.balart@metempsy.com        } else {
22413531Sjairo.balart@metempsy.com            high_i = high_i % BITS_PER_DIGIT;
22513531Sjairo.balart@metempsy.com            right_shift = BITS_PER_DIGIT - left_shift;
22613531Sjairo.balart@metempsy.com            mask = ~(~0U << left_shift);
22713531Sjairo.balart@metempsy.com            right_word = digit[0];
22813531Sjairo.balart@metempsy.com            dst_p[dst_i] = (dst_p[dst_i] & mask) |
22913531Sjairo.balart@metempsy.com                ((right_word << left_shift) & DIGIT_MASK);
23013531Sjairo.balart@metempsy.com            for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
23113531Sjairo.balart@metempsy.com                left_word = digit[src_i];
23213531Sjairo.balart@metempsy.com                dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
23313531Sjairo.balart@metempsy.com                    (right_word >> right_shift);
23413531Sjairo.balart@metempsy.com                right_word = left_word;
23513531Sjairo.balart@metempsy.com            }
23613531Sjairo.balart@metempsy.com            left_word = (src_i < ndigits) ? digit[src_i] : 0;
23713531Sjairo.balart@metempsy.com            mask = ~(~1U << high_i) & DIGIT_MASK;
23813531Sjairo.balart@metempsy.com            dst_p[dst_i] = ((left_word << left_shift) |
23913531Sjairo.balart@metempsy.com                (right_word >> right_shift)) & mask;
24013531Sjairo.balart@metempsy.com        }
24113531Sjairo.balart@metempsy.com        break;
24213531Sjairo.balart@metempsy.com
24313531Sjairo.balart@metempsy.com      // SOURCE VALUE IS NEGATIVE:
24413531Sjairo.balart@metempsy.com      case SC_NEG:
24513531Sjairo.balart@metempsy.com        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
24613531Sjairo.balart@metempsy.com        result = true;
24713531Sjairo.balart@metempsy.com        if (dst_i == end_i) {
24813531Sjairo.balart@metempsy.com            mask = ~(~0U << nbits);
24913531Sjairo.balart@metempsy.com            right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
25013531Sjairo.balart@metempsy.com            mask = ~(~0U << left_shift);
25113531Sjairo.balart@metempsy.com            dst_p[dst_i] = ((dst_p[dst_i] & mask) |
25213531Sjairo.balart@metempsy.com                (right_word << left_shift)) & DIGIT_MASK;
25313531Sjairo.balart@metempsy.com
25413531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
25513531Sjairo.balart@metempsy.com        } else if (left_shift == 0) {
25613531Sjairo.balart@metempsy.com            carry = 1;
25713531Sjairo.balart@metempsy.com            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
25813531Sjairo.balart@metempsy.com                right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
25913531Sjairo.balart@metempsy.com                dst_p[dst_i] = right_word &  DIGIT_MASK;
26013531Sjairo.balart@metempsy.com                carry = right_word >> BITS_PER_DIGIT;
26113531Sjairo.balart@metempsy.com            }
26213531Sjairo.balart@metempsy.com            high_i = high_i % BITS_PER_DIGIT;
26313531Sjairo.balart@metempsy.com            mask = (~(~1U << high_i)) & DIGIT_MASK;
26413531Sjairo.balart@metempsy.com            right_word = (src_i < ndigits) ?
26513531Sjairo.balart@metempsy.com                (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
26613531Sjairo.balart@metempsy.com            dst_p[dst_i] = right_word & mask;
26713531Sjairo.balart@metempsy.com
26813531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
26913531Sjairo.balart@metempsy.com        } else {
27013531Sjairo.balart@metempsy.com            high_i = high_i % BITS_PER_DIGIT;
27113531Sjairo.balart@metempsy.com            right_shift = BITS_PER_DIGIT - left_shift;
27213531Sjairo.balart@metempsy.com            mask = ~(~0U << left_shift);
27313531Sjairo.balart@metempsy.com            carry = 1;
27413531Sjairo.balart@metempsy.com            right_word = (digit[0] ^ DIGIT_MASK) + carry;
27513531Sjairo.balart@metempsy.com            dst_p[dst_i] = (dst_p[dst_i] & mask) |
27613531Sjairo.balart@metempsy.com                ((right_word << left_shift) & DIGIT_MASK);
27713531Sjairo.balart@metempsy.com            carry = right_word >> BITS_PER_DIGIT;
27813531Sjairo.balart@metempsy.com            right_word &= DIGIT_MASK;
27913531Sjairo.balart@metempsy.com            for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
28013531Sjairo.balart@metempsy.com                left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
28113531Sjairo.balart@metempsy.com                dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
28213531Sjairo.balart@metempsy.com                    (right_word >> right_shift);
28313531Sjairo.balart@metempsy.com                carry = left_word >> BITS_PER_DIGIT;
28413531Sjairo.balart@metempsy.com                right_word = left_word & DIGIT_MASK;
28513531Sjairo.balart@metempsy.com            }
28613531Sjairo.balart@metempsy.com            left_word = (src_i < ndigits) ?
28713531Sjairo.balart@metempsy.com                (digit[src_i] ^ DIGIT_MASK) + carry : carry;
28813531Sjairo.balart@metempsy.com            mask = ~(~1U << high_i) & DIGIT_MASK;
28913531Sjairo.balart@metempsy.com            dst_p[dst_i] = ((left_word << left_shift) |
29013531Sjairo.balart@metempsy.com                (right_word >> right_shift)) & mask;
29113531Sjairo.balart@metempsy.com        }
29213531Sjairo.balart@metempsy.com        break;
29313531Sjairo.balart@metempsy.com
29413531Sjairo.balart@metempsy.com      // VALUE IS ZERO:
29513531Sjairo.balart@metempsy.com      default:
29613531Sjairo.balart@metempsy.com        result = false;
29713531Sjairo.balart@metempsy.com        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
29813531Sjairo.balart@metempsy.com        if (dst_i == end_i) {
29913531Sjairo.balart@metempsy.com            mask = ~(~0U << nbits) << left_shift;
30013531Sjairo.balart@metempsy.com            dst_p[dst_i] = dst_p[dst_i] & ~mask;
30113531Sjairo.balart@metempsy.com
30213531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
30313531Sjairo.balart@metempsy.com        } else if (left_shift == 0) {
30413531Sjairo.balart@metempsy.com            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
30513531Sjairo.balart@metempsy.com                dst_p[dst_i] = 0;
30613531Sjairo.balart@metempsy.com            }
30713531Sjairo.balart@metempsy.com            dst_p[dst_i] = 0;
30813531Sjairo.balart@metempsy.com
30913531Sjairo.balart@metempsy.com        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
31013531Sjairo.balart@metempsy.com        } else {
31113531Sjairo.balart@metempsy.com            mask = ~(~0U << left_shift);
31213531Sjairo.balart@metempsy.com            dst_p[dst_i] = (dst_p[dst_i] & mask);
31313531Sjairo.balart@metempsy.com            for (dst_i++; dst_i <= end_i; dst_i++) {
31413531Sjairo.balart@metempsy.com                dst_p[dst_i] = 0;
31513531Sjairo.balart@metempsy.com            }
31613531Sjairo.balart@metempsy.com        }
31713531Sjairo.balart@metempsy.com        break;
31813531Sjairo.balart@metempsy.com    }
31913531Sjairo.balart@metempsy.com    return result;
32013531Sjairo.balart@metempsy.com}
32113531Sjairo.balart@metempsy.com
32213531Sjairo.balart@metempsy.com// Return this object instance's bits as a uint64 without sign extension.
32313531Sjairo.balart@metempsy.com
32413531Sjairo.balart@metempsy.comuint64
32513531Sjairo.balart@metempsy.comsc_signed::concat_get_uint64() const
32613531Sjairo.balart@metempsy.com{
32713531Sjairo.balart@metempsy.com    uint64        result;
32813531Sjairo.balart@metempsy.com    switch (sgn) {
32913531Sjairo.balart@metempsy.com      case SC_POS:
33013531Sjairo.balart@metempsy.com        result = 0;
33113531Sjairo.balart@metempsy.com        if (ndigits > 2)
33213531Sjairo.balart@metempsy.com            result = digit[2];
33313531Sjairo.balart@metempsy.com        if (ndigits > 1)
33413531Sjairo.balart@metempsy.com            result = (result << BITS_PER_DIGIT) | digit[1];
33513531Sjairo.balart@metempsy.com        result = (result << BITS_PER_DIGIT) | digit[0];
33613531Sjairo.balart@metempsy.com        break;
33713531Sjairo.balart@metempsy.com      case SC_NEG:
33813531Sjairo.balart@metempsy.com        result = 0;
33913531Sjairo.balart@metempsy.com        if (ndigits > 2)
34013531Sjairo.balart@metempsy.com            result = digit[2];
34113531Sjairo.balart@metempsy.com        if (ndigits > 1)
34213531Sjairo.balart@metempsy.com            result = (result << BITS_PER_DIGIT) | digit[1];
34313531Sjairo.balart@metempsy.com        result = (result << BITS_PER_DIGIT) | digit[0];
34413531Sjairo.balart@metempsy.com        result = -result;
34513531Sjairo.balart@metempsy.com        if (nbits < 64) {
34613531Sjairo.balart@metempsy.com            uint64 mask = ~0;
34713531Sjairo.balart@metempsy.com            result = result & ~(mask << nbits);
34813531Sjairo.balart@metempsy.com        }
34913531Sjairo.balart@metempsy.com        break;
35013531Sjairo.balart@metempsy.com      default:
35113531Sjairo.balart@metempsy.com        result = 0;
35213531Sjairo.balart@metempsy.com        break;
35313531Sjairo.balart@metempsy.com    }
35413531Sjairo.balart@metempsy.com    return result;
35513531Sjairo.balart@metempsy.com}
35613531Sjairo.balart@metempsy.com
35713531Sjairo.balart@metempsy.com// #### OPTIMIZE
35813531Sjairo.balart@metempsy.comvoid
35913531Sjairo.balart@metempsy.comsc_signed::concat_set(int64 src, int low_i)
36013531Sjairo.balart@metempsy.com{
36113531Sjairo.balart@metempsy.com    *this = (low_i < 64) ? src >> low_i : src >> 63;
36213531Sjairo.balart@metempsy.com}
36313531Sjairo.balart@metempsy.com
36413531Sjairo.balart@metempsy.comvoid
36513531Sjairo.balart@metempsy.comsc_signed::concat_set(const sc_signed &src, int low_i)
36613531Sjairo.balart@metempsy.com{
36713531Sjairo.balart@metempsy.com    if (low_i < src.length())
36813531Sjairo.balart@metempsy.com        *this = src >> low_i;
36913531Sjairo.balart@metempsy.com    else
37013531Sjairo.balart@metempsy.com        *this = (src<0) ? (int_type)-1 : 0;
37113531Sjairo.balart@metempsy.com}
37213531Sjairo.balart@metempsy.com
37313531Sjairo.balart@metempsy.comvoid
37413531Sjairo.balart@metempsy.comsc_signed::concat_set(const sc_unsigned &src, int low_i)
37513531Sjairo.balart@metempsy.com{
37613531Sjairo.balart@metempsy.com    if (low_i < src.length())
37713531Sjairo.balart@metempsy.com        *this = src >> low_i;
37813531Sjairo.balart@metempsy.com    else
37913531Sjairo.balart@metempsy.com        *this = 0;
38013531Sjairo.balart@metempsy.com}
38113531Sjairo.balart@metempsy.com
38213531Sjairo.balart@metempsy.comvoid
38313531Sjairo.balart@metempsy.comsc_signed::concat_set(uint64 src, int low_i)
38413531Sjairo.balart@metempsy.com{
38513531Sjairo.balart@metempsy.com    *this = (low_i < 64) ? src >> low_i : 0;
38613531Sjairo.balart@metempsy.com}
38713531Sjairo.balart@metempsy.com
38813531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
38913531Sjairo.balart@metempsy.com//  SECTION: Public members - Reduction methods.
39013531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
39113531Sjairo.balart@metempsy.com
39213531Sjairo.balart@metempsy.combool
39313531Sjairo.balart@metempsy.comsc_signed::and_reduce() const
39413531Sjairo.balart@metempsy.com{
39513531Sjairo.balart@metempsy.com    sc_digit current; // Current digit examining.
39613531Sjairo.balart@metempsy.com    int i; // Index of digit examining.
39713531Sjairo.balart@metempsy.com
39813531Sjairo.balart@metempsy.com    if (sgn == SC_NEG) {
39913531Sjairo.balart@metempsy.com        current = (1 << BITS_PER_DIGIT);
40013531Sjairo.balart@metempsy.com        for (i = 0; i < ndigits-1; i++) {
40113531Sjairo.balart@metempsy.com            current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
40213531Sjairo.balart@metempsy.com            if ((current & DIGIT_MASK) != DIGIT_MASK) return false;
40313531Sjairo.balart@metempsy.com        }
40413531Sjairo.balart@metempsy.com        current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
40513531Sjairo.balart@metempsy.com        if ((current & ~(~0U << (nbits % BITS_PER_DIGIT))) ==
40613531Sjairo.balart@metempsy.com             static_cast<sc_digit>(~(~0U << (nbits % BITS_PER_DIGIT)))) {
40713531Sjairo.balart@metempsy.com            return true;
40813531Sjairo.balart@metempsy.com        }
40913531Sjairo.balart@metempsy.com    }
41013531Sjairo.balart@metempsy.com    return false;
41113531Sjairo.balart@metempsy.com}
41213531Sjairo.balart@metempsy.com
41313531Sjairo.balart@metempsy.combool
41413531Sjairo.balart@metempsy.comsc_signed::or_reduce() const
41513531Sjairo.balart@metempsy.com{
41613531Sjairo.balart@metempsy.com    return sgn == SC_ZERO ? false : true;
41713531Sjairo.balart@metempsy.com}
41813531Sjairo.balart@metempsy.com
41913531Sjairo.balart@metempsy.combool
42013531Sjairo.balart@metempsy.comsc_signed::xor_reduce() const
42113531Sjairo.balart@metempsy.com{
42213531Sjairo.balart@metempsy.com    int i; // Digit examining.
42313531Sjairo.balart@metempsy.com    int odd; // Flag for odd number of digits.
42413531Sjairo.balart@metempsy.com
42513531Sjairo.balart@metempsy.com    odd = 0;
42613531Sjairo.balart@metempsy.com    for (i = 0; i < nbits; i++)
42713531Sjairo.balart@metempsy.com        if (test(i))
42813531Sjairo.balart@metempsy.com            odd = ~odd;
42913531Sjairo.balart@metempsy.com    return odd ? true : false;
43013531Sjairo.balart@metempsy.com}
43113531Sjairo.balart@metempsy.com
43213531Sjairo.balart@metempsy.com
43313531Sjairo.balart@metempsy.com
43413531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
43513531Sjairo.balart@metempsy.com//  SECTION: Public members - Assignment operators.
43613531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
43713531Sjairo.balart@metempsy.com
43813531Sjairo.balart@metempsy.com// assignment operators
43913531Sjairo.balart@metempsy.com
44013531Sjairo.balart@metempsy.comconst sc_signed &
44113531Sjairo.balart@metempsy.comsc_signed::operator = (const char *a)
44213531Sjairo.balart@metempsy.com{
44313531Sjairo.balart@metempsy.com    if (a == 0) {
44413531Sjairo.balart@metempsy.com        SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_,
44513531Sjairo.balart@metempsy.com                        "character string is zero");
44613531Sjairo.balart@metempsy.com    } else if (*a == 0) {
44713531Sjairo.balart@metempsy.com        SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_,
44813531Sjairo.balart@metempsy.com                        "character string is empty");
44913531Sjairo.balart@metempsy.com    } else try {
45013531Sjairo.balart@metempsy.com        int len = length();
45113531Sjairo.balart@metempsy.com        sc_fix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
45213531Sjairo.balart@metempsy.com        return this->operator = (aa);
45313531Sjairo.balart@metempsy.com    } catch(const sc_core::sc_report &) {
45413531Sjairo.balart@metempsy.com        std::stringstream msg;
45513531Sjairo.balart@metempsy.com        msg << "character string '" << a << "' is not valid";
45613531Sjairo.balart@metempsy.com        SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_, msg.str().c_str());
45713531Sjairo.balart@metempsy.com    }
45813531Sjairo.balart@metempsy.com    return *this;
45913531Sjairo.balart@metempsy.com}
46013531Sjairo.balart@metempsy.com
46113531Sjairo.balart@metempsy.comconst sc_signed &
46213531Sjairo.balart@metempsy.comsc_signed::operator=(int64 v)
46313531Sjairo.balart@metempsy.com{
46413531Sjairo.balart@metempsy.com    sgn = get_sign(v);
46513531Sjairo.balart@metempsy.com    // v >= 0 now.
46613531Sjairo.balart@metempsy.com    if (sgn == SC_ZERO) {
46713531Sjairo.balart@metempsy.com        vec_zero(ndigits, digit);
46813531Sjairo.balart@metempsy.com    } else {
46913531Sjairo.balart@metempsy.com        from_uint(ndigits, digit, (uint64)v);
47013531Sjairo.balart@metempsy.com        if (nbits <= (int)BITS_PER_INT64)
47113531Sjairo.balart@metempsy.com            convert_SM_to_2C_to_SM();
47213531Sjairo.balart@metempsy.com    }
47313531Sjairo.balart@metempsy.com    return *this;
47413531Sjairo.balart@metempsy.com}
47513531Sjairo.balart@metempsy.com
47613531Sjairo.balart@metempsy.comconst sc_signed &
47713531Sjairo.balart@metempsy.comsc_signed::operator=(uint64 v)
47813531Sjairo.balart@metempsy.com{
47913531Sjairo.balart@metempsy.com    sgn = get_sign(v);
48013531Sjairo.balart@metempsy.com    if (sgn == SC_ZERO) {
48113531Sjairo.balart@metempsy.com        vec_zero(ndigits, digit);
48213531Sjairo.balart@metempsy.com    } else {
48313531Sjairo.balart@metempsy.com        from_uint(ndigits, digit, v);
48413531Sjairo.balart@metempsy.com        if (nbits <= (int)BITS_PER_INT64)
48513531Sjairo.balart@metempsy.com            convert_SM_to_2C_to_SM();
48613531Sjairo.balart@metempsy.com    }
48713531Sjairo.balart@metempsy.com    return *this;
48813531Sjairo.balart@metempsy.com}
48913531Sjairo.balart@metempsy.com
49013531Sjairo.balart@metempsy.comconst sc_signed &
49113531Sjairo.balart@metempsy.comsc_signed::operator=(long v)
49213531Sjairo.balart@metempsy.com{
49313531Sjairo.balart@metempsy.com    sgn = get_sign(v);
49413531Sjairo.balart@metempsy.com    // v >= 0 now.
49513531Sjairo.balart@metempsy.com    if (sgn == SC_ZERO) {
49613531Sjairo.balart@metempsy.com        vec_zero(ndigits, digit);
49713531Sjairo.balart@metempsy.com    } else {
49813531Sjairo.balart@metempsy.com        from_uint(ndigits, digit, (unsigned long)v);
49913531Sjairo.balart@metempsy.com        if (nbits <= (int)BITS_PER_LONG)
50013531Sjairo.balart@metempsy.com            convert_SM_to_2C_to_SM();
50113531Sjairo.balart@metempsy.com    }
50213531Sjairo.balart@metempsy.com    return *this;
50313531Sjairo.balart@metempsy.com}
50413531Sjairo.balart@metempsy.com
50513531Sjairo.balart@metempsy.comconst sc_signed &
50613531Sjairo.balart@metempsy.comsc_signed::operator=(unsigned long v)
50713531Sjairo.balart@metempsy.com{
50813531Sjairo.balart@metempsy.com    sgn = get_sign(v);
50913531Sjairo.balart@metempsy.com    if (sgn == SC_ZERO) {
51013531Sjairo.balart@metempsy.com        vec_zero(ndigits, digit);
51113531Sjairo.balart@metempsy.com    } else {
51213531Sjairo.balart@metempsy.com        from_uint(ndigits, digit, v);
51313531Sjairo.balart@metempsy.com        if (nbits <= (int)BITS_PER_LONG)
51413531Sjairo.balart@metempsy.com            convert_SM_to_2C_to_SM();
51513531Sjairo.balart@metempsy.com    }
51613531Sjairo.balart@metempsy.com    return *this;
51713531Sjairo.balart@metempsy.com}
51813531Sjairo.balart@metempsy.com
51913531Sjairo.balart@metempsy.comconst sc_signed &
52013531Sjairo.balart@metempsy.comsc_signed::operator=(double v)
52113531Sjairo.balart@metempsy.com{
52213531Sjairo.balart@metempsy.com    is_bad_double(v);
52313531Sjairo.balart@metempsy.com    if (v < 0) {
52413531Sjairo.balart@metempsy.com        v = -v;
52513531Sjairo.balart@metempsy.com        sgn = SC_NEG;
52613531Sjairo.balart@metempsy.com    } else {
52713531Sjairo.balart@metempsy.com      sgn = SC_POS;
52813531Sjairo.balart@metempsy.com    }
52913531Sjairo.balart@metempsy.com
53013531Sjairo.balart@metempsy.com    int i = 0;
53113531Sjairo.balart@metempsy.com    while (std::floor(v) && (i < ndigits)) {
53213531Sjairo.balart@metempsy.com        digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) &
53313531Sjairo.balart@metempsy.com                                           DIGIT_MASK;
53413531Sjairo.balart@metempsy.com        v /= DIGIT_RADIX;
53513531Sjairo.balart@metempsy.com    }
53613531Sjairo.balart@metempsy.com    vec_zero(i, ndigits, digit);
53713531Sjairo.balart@metempsy.com    convert_SM_to_2C_to_SM();
53813531Sjairo.balart@metempsy.com    return *this;
53913531Sjairo.balart@metempsy.com}
54013531Sjairo.balart@metempsy.com
54113531Sjairo.balart@metempsy.com
54213531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
54313531Sjairo.balart@metempsy.com
54413531Sjairo.balart@metempsy.comconst sc_signed &
54513531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_bv_base &v)
54613531Sjairo.balart@metempsy.com{
54713531Sjairo.balart@metempsy.com    int minlen = sc_min(nbits, v.length());
54813531Sjairo.balart@metempsy.com    int i = 0;
54913531Sjairo.balart@metempsy.com    for (; i < minlen; ++i) {
55013531Sjairo.balart@metempsy.com        safe_set(i, v.get_bit(i), digit);
55113531Sjairo.balart@metempsy.com    }
55213531Sjairo.balart@metempsy.com    for (; i < nbits; ++i) {
55313531Sjairo.balart@metempsy.com        safe_set(i, 0, digit); // zero-extend
55413531Sjairo.balart@metempsy.com    }
55513531Sjairo.balart@metempsy.com    convert_2C_to_SM();
55613531Sjairo.balart@metempsy.com    return *this;
55713531Sjairo.balart@metempsy.com}
55813531Sjairo.balart@metempsy.com
55913531Sjairo.balart@metempsy.comconst sc_signed &
56013531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_lv_base &v)
56113531Sjairo.balart@metempsy.com{
56213531Sjairo.balart@metempsy.com    int minlen = sc_min(nbits, v.length());
56313531Sjairo.balart@metempsy.com    int i = 0;
56413531Sjairo.balart@metempsy.com    for (; i < minlen; ++i) {
56513531Sjairo.balart@metempsy.com        safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit);
56613531Sjairo.balart@metempsy.com    }
56713531Sjairo.balart@metempsy.com    for (; i < nbits; ++i) {
56813531Sjairo.balart@metempsy.com        safe_set(i, 0, digit);  // zero-extend
56913531Sjairo.balart@metempsy.com    }
57013531Sjairo.balart@metempsy.com    convert_2C_to_SM();
57113531Sjairo.balart@metempsy.com    return *this;
57213531Sjairo.balart@metempsy.com}
57313531Sjairo.balart@metempsy.com
57413531Sjairo.balart@metempsy.com
57513531Sjairo.balart@metempsy.com// explicit conversion to character string
57613531Sjairo.balart@metempsy.comconst std::string
57713531Sjairo.balart@metempsy.comsc_signed::to_string(sc_numrep numrep) const
57813531Sjairo.balart@metempsy.com{
57913531Sjairo.balart@metempsy.com    int len = length();
58013531Sjairo.balart@metempsy.com    sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
58113531Sjairo.balart@metempsy.com    return aa.to_string(numrep);
58213531Sjairo.balart@metempsy.com}
58313531Sjairo.balart@metempsy.com
58413531Sjairo.balart@metempsy.comconst std::string
58513531Sjairo.balart@metempsy.comsc_signed::to_string(sc_numrep numrep, bool w_prefix) const
58613531Sjairo.balart@metempsy.com{
58713531Sjairo.balart@metempsy.com    int len = length();
58813531Sjairo.balart@metempsy.com    sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
58913531Sjairo.balart@metempsy.com    return aa.to_string(numrep, w_prefix);
59013531Sjairo.balart@metempsy.com}
59113531Sjairo.balart@metempsy.com
59213531Sjairo.balart@metempsy.com
59313531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
59413531Sjairo.balart@metempsy.com//  SECTION: Interfacing with sc_int_base
59513531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
59613531Sjairo.balart@metempsy.com
59713531Sjairo.balart@metempsy.comconst sc_signed &
59813531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_int_base &v)
59913531Sjairo.balart@metempsy.com{
60013531Sjairo.balart@metempsy.com    return operator = ((int64)v);
60113531Sjairo.balart@metempsy.com}
60213531Sjairo.balart@metempsy.com
60313531Sjairo.balart@metempsy.com
60413531Sjairo.balart@metempsy.comsc_signed
60513531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, const sc_int_base &v)
60613531Sjairo.balart@metempsy.com{
60713531Sjairo.balart@metempsy.com    return operator + (u, static_cast<int64>(v));
60813531Sjairo.balart@metempsy.com}
60913531Sjairo.balart@metempsy.com
61013531Sjairo.balart@metempsy.comsc_signed
61113531Sjairo.balart@metempsy.comoperator + (const sc_int_base &u, const sc_unsigned &v)
61213531Sjairo.balart@metempsy.com{
61313531Sjairo.balart@metempsy.com    return operator + (static_cast<int64>(u), v);
61413531Sjairo.balart@metempsy.com}
61513531Sjairo.balart@metempsy.com
61613531Sjairo.balart@metempsy.comsc_signed
61713531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_int_base &v)
61813531Sjairo.balart@metempsy.com{
61913531Sjairo.balart@metempsy.com    return operator + (u, (int64)v);
62013531Sjairo.balart@metempsy.com}
62113531Sjairo.balart@metempsy.com
62213531Sjairo.balart@metempsy.comsc_signed
62313531Sjairo.balart@metempsy.comoperator + (const sc_int_base &u, const sc_signed &v)
62413531Sjairo.balart@metempsy.com{
62513531Sjairo.balart@metempsy.com    return operator + ((int64)u, v);
62613531Sjairo.balart@metempsy.com}
62713531Sjairo.balart@metempsy.com
62813531Sjairo.balart@metempsy.comconst sc_signed &
62913531Sjairo.balart@metempsy.comsc_signed::operator += (const sc_int_base &v)
63013531Sjairo.balart@metempsy.com{
63113531Sjairo.balart@metempsy.com    return operator += ((int64)v);
63213531Sjairo.balart@metempsy.com}
63313531Sjairo.balart@metempsy.com
63413531Sjairo.balart@metempsy.com
63513531Sjairo.balart@metempsy.comsc_signed
63613531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_int_base &v)
63713531Sjairo.balart@metempsy.com{
63813531Sjairo.balart@metempsy.com    return operator - (u, (int64)v);
63913531Sjairo.balart@metempsy.com}
64013531Sjairo.balart@metempsy.com
64113531Sjairo.balart@metempsy.comsc_signed
64213531Sjairo.balart@metempsy.comoperator - (const sc_int_base &u, const sc_unsigned &v)
64313531Sjairo.balart@metempsy.com{
64413531Sjairo.balart@metempsy.com    return operator - ((int64)u, v);
64513531Sjairo.balart@metempsy.com}
64613531Sjairo.balart@metempsy.com
64713531Sjairo.balart@metempsy.comsc_signed
64813531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_int_base &v)
64913531Sjairo.balart@metempsy.com{
65013531Sjairo.balart@metempsy.com    return operator - (u, (int64)v);
65113531Sjairo.balart@metempsy.com}
65213531Sjairo.balart@metempsy.com
65313531Sjairo.balart@metempsy.comsc_signed
65413531Sjairo.balart@metempsy.comoperator - (const sc_int_base &u, const sc_signed &v)
65513531Sjairo.balart@metempsy.com{
65613531Sjairo.balart@metempsy.com    return operator - ((int64)u, v);
65713531Sjairo.balart@metempsy.com}
65813531Sjairo.balart@metempsy.com
65913531Sjairo.balart@metempsy.comconst sc_signed &
66013531Sjairo.balart@metempsy.comsc_signed::operator -= (const sc_int_base &v)
66113531Sjairo.balart@metempsy.com{
66213531Sjairo.balart@metempsy.com    return operator -= ((int64)v);
66313531Sjairo.balart@metempsy.com}
66413531Sjairo.balart@metempsy.com
66513531Sjairo.balart@metempsy.com
66613531Sjairo.balart@metempsy.comsc_signed
66713531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, const sc_int_base &v)
66813531Sjairo.balart@metempsy.com{
66913531Sjairo.balart@metempsy.com    return operator * (u, static_cast<int64>(v));
67013531Sjairo.balart@metempsy.com}
67113531Sjairo.balart@metempsy.com
67213531Sjairo.balart@metempsy.comsc_signed
67313531Sjairo.balart@metempsy.comoperator * (const sc_int_base &u, const sc_unsigned &v)
67413531Sjairo.balart@metempsy.com{
67513531Sjairo.balart@metempsy.com    return operator * (static_cast<int64>(u), v);
67613531Sjairo.balart@metempsy.com}
67713531Sjairo.balart@metempsy.com
67813531Sjairo.balart@metempsy.comsc_signed
67913531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_int_base &v)
68013531Sjairo.balart@metempsy.com{
68113531Sjairo.balart@metempsy.com    return operator * (u, (int64)v);
68213531Sjairo.balart@metempsy.com}
68313531Sjairo.balart@metempsy.com
68413531Sjairo.balart@metempsy.comsc_signed
68513531Sjairo.balart@metempsy.comoperator * (const sc_int_base &u, const sc_signed &v)
68613531Sjairo.balart@metempsy.com{
68713531Sjairo.balart@metempsy.com    return operator * ((int64)u, v);
68813531Sjairo.balart@metempsy.com}
68913531Sjairo.balart@metempsy.com
69013531Sjairo.balart@metempsy.comconst sc_signed &
69113531Sjairo.balart@metempsy.comsc_signed::operator *= (const sc_int_base &v)
69213531Sjairo.balart@metempsy.com{
69313531Sjairo.balart@metempsy.com    return operator *= ((int64)v);
69413531Sjairo.balart@metempsy.com}
69513531Sjairo.balart@metempsy.com
69613531Sjairo.balart@metempsy.com
69713531Sjairo.balart@metempsy.comsc_signed
69813531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, const sc_int_base &v)
69913531Sjairo.balart@metempsy.com{
70013531Sjairo.balart@metempsy.com    return operator / (u, static_cast<int64>(v));
70113531Sjairo.balart@metempsy.com}
70213531Sjairo.balart@metempsy.com
70313531Sjairo.balart@metempsy.comsc_signed
70413531Sjairo.balart@metempsy.comoperator / (const sc_int_base &u, const sc_unsigned &v)
70513531Sjairo.balart@metempsy.com{
70613531Sjairo.balart@metempsy.com    return operator / (static_cast<int64>(u), v);
70713531Sjairo.balart@metempsy.com}
70813531Sjairo.balart@metempsy.com
70913531Sjairo.balart@metempsy.comsc_signed
71013531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_int_base &v)
71113531Sjairo.balart@metempsy.com{
71213531Sjairo.balart@metempsy.com    return operator / (u, (int64)v);
71313531Sjairo.balart@metempsy.com}
71413531Sjairo.balart@metempsy.com
71513531Sjairo.balart@metempsy.comsc_signed
71613531Sjairo.balart@metempsy.comoperator / (const sc_int_base &u, const sc_signed &v)
71713531Sjairo.balart@metempsy.com{
71813531Sjairo.balart@metempsy.com    return operator / ((int64)u, v);
71913531Sjairo.balart@metempsy.com}
72013531Sjairo.balart@metempsy.com
72113531Sjairo.balart@metempsy.comconst sc_signed &
72213531Sjairo.balart@metempsy.comsc_signed::operator /= (const sc_int_base &v)
72313531Sjairo.balart@metempsy.com{
72413531Sjairo.balart@metempsy.com    return operator /= ((int64)v);
72513531Sjairo.balart@metempsy.com}
72613531Sjairo.balart@metempsy.com
72713531Sjairo.balart@metempsy.com
72813531Sjairo.balart@metempsy.comsc_signed
72913531Sjairo.balart@metempsy.comoperator % (const sc_unsigned &u, const sc_int_base &v)
73013531Sjairo.balart@metempsy.com{
73113531Sjairo.balart@metempsy.com    return operator % (u, static_cast<int64>(v));
73213531Sjairo.balart@metempsy.com}
73313531Sjairo.balart@metempsy.com
73413531Sjairo.balart@metempsy.comsc_signed
73513531Sjairo.balart@metempsy.comoperator % (const sc_int_base &u, const sc_unsigned &v)
73613531Sjairo.balart@metempsy.com{
73713531Sjairo.balart@metempsy.com    return operator % (static_cast<int64>(u), v);
73813531Sjairo.balart@metempsy.com}
73913531Sjairo.balart@metempsy.com
74013531Sjairo.balart@metempsy.comsc_signed
74113531Sjairo.balart@metempsy.comoperator % (const sc_signed &u, const sc_int_base &v)
74213531Sjairo.balart@metempsy.com{
74313531Sjairo.balart@metempsy.com    return operator % (u, (int64)v);
74413531Sjairo.balart@metempsy.com}
74513531Sjairo.balart@metempsy.com
74613531Sjairo.balart@metempsy.comsc_signed
74713531Sjairo.balart@metempsy.comoperator % (const sc_int_base &u, const sc_signed &v)
74813531Sjairo.balart@metempsy.com{
74913531Sjairo.balart@metempsy.com    return operator % ((int64)u, v);
75013531Sjairo.balart@metempsy.com}
75113531Sjairo.balart@metempsy.com
75213531Sjairo.balart@metempsy.comconst sc_signed &
75313531Sjairo.balart@metempsy.comsc_signed::operator %= (const sc_int_base &v)
75413531Sjairo.balart@metempsy.com{
75513531Sjairo.balart@metempsy.com    return operator %= ((int64)v);
75613531Sjairo.balart@metempsy.com}
75713531Sjairo.balart@metempsy.com
75813531Sjairo.balart@metempsy.com
75913531Sjairo.balart@metempsy.comsc_signed
76013531Sjairo.balart@metempsy.comoperator & (const sc_unsigned &u, const sc_int_base &v)
76113531Sjairo.balart@metempsy.com{
76213531Sjairo.balart@metempsy.com    return operator & (u, static_cast<int64>(v));
76313531Sjairo.balart@metempsy.com}
76413531Sjairo.balart@metempsy.com
76513531Sjairo.balart@metempsy.comsc_signed
76613531Sjairo.balart@metempsy.comoperator & (const sc_int_base &u, const sc_unsigned &v)
76713531Sjairo.balart@metempsy.com{
76813531Sjairo.balart@metempsy.com    return operator & (static_cast<int64>(u), v);
76913531Sjairo.balart@metempsy.com}
77013531Sjairo.balart@metempsy.com
77113531Sjairo.balart@metempsy.comsc_signed
77213531Sjairo.balart@metempsy.comoperator & (const sc_signed &u, const sc_int_base &v)
77313531Sjairo.balart@metempsy.com{
77413531Sjairo.balart@metempsy.com    return operator & (u, (int64)v);
77513531Sjairo.balart@metempsy.com}
77613531Sjairo.balart@metempsy.com
77713531Sjairo.balart@metempsy.comsc_signed
77813531Sjairo.balart@metempsy.comoperator & (const sc_int_base &u, const sc_signed &v)
77913531Sjairo.balart@metempsy.com{
78013531Sjairo.balart@metempsy.com    return operator & ((int64)u, v);
78113531Sjairo.balart@metempsy.com}
78213531Sjairo.balart@metempsy.com
78313531Sjairo.balart@metempsy.comconst sc_signed &
78413531Sjairo.balart@metempsy.comsc_signed::operator &= (const sc_int_base &v)
78513531Sjairo.balart@metempsy.com{
78613531Sjairo.balart@metempsy.com    return operator &= ((int64)v);
78713531Sjairo.balart@metempsy.com}
78813531Sjairo.balart@metempsy.com
78913531Sjairo.balart@metempsy.com
79013531Sjairo.balart@metempsy.comsc_signed
79113531Sjairo.balart@metempsy.comoperator | (const sc_unsigned &u, const sc_int_base &v)
79213531Sjairo.balart@metempsy.com{
79313531Sjairo.balart@metempsy.com    return operator | (u, static_cast<int64>(v));
79413531Sjairo.balart@metempsy.com}
79513531Sjairo.balart@metempsy.com
79613531Sjairo.balart@metempsy.comsc_signed
79713531Sjairo.balart@metempsy.comoperator | (const sc_int_base &u, const sc_unsigned &v)
79813531Sjairo.balart@metempsy.com{
79913531Sjairo.balart@metempsy.com    return operator | (static_cast<int64>(u), v);
80013531Sjairo.balart@metempsy.com}
80113531Sjairo.balart@metempsy.com
80213531Sjairo.balart@metempsy.comsc_signed
80313531Sjairo.balart@metempsy.comoperator | (const sc_signed& u, const sc_int_base &v)
80413531Sjairo.balart@metempsy.com{
80513531Sjairo.balart@metempsy.com    return operator|(u, (int64)v);
80613531Sjairo.balart@metempsy.com}
80713531Sjairo.balart@metempsy.com
80813531Sjairo.balart@metempsy.comsc_signed
80913531Sjairo.balart@metempsy.comoperator | (const sc_int_base &u, const sc_signed &v)
81013531Sjairo.balart@metempsy.com{
81113531Sjairo.balart@metempsy.com    return operator | ((int64)u, v);
81213531Sjairo.balart@metempsy.com}
81313531Sjairo.balart@metempsy.com
81413531Sjairo.balart@metempsy.comconst sc_signed &
81513531Sjairo.balart@metempsy.comsc_signed::operator |= (const sc_int_base &v)
81613531Sjairo.balart@metempsy.com{
81713531Sjairo.balart@metempsy.com    return operator |= ((int64)v);
81813531Sjairo.balart@metempsy.com}
81913531Sjairo.balart@metempsy.com
82013531Sjairo.balart@metempsy.com
82113531Sjairo.balart@metempsy.comsc_signed
82213531Sjairo.balart@metempsy.comoperator ^ (const sc_unsigned &u, const sc_int_base &v)
82313531Sjairo.balart@metempsy.com{
82413531Sjairo.balart@metempsy.com    return operator ^ (u, static_cast<int64>(v));
82513531Sjairo.balart@metempsy.com}
82613531Sjairo.balart@metempsy.com
82713531Sjairo.balart@metempsy.comsc_signed
82813531Sjairo.balart@metempsy.comoperator ^ (const sc_int_base &u, const sc_unsigned &v)
82913531Sjairo.balart@metempsy.com{
83013531Sjairo.balart@metempsy.com    return operator ^ (static_cast<int64>(u), v);
83113531Sjairo.balart@metempsy.com}
83213531Sjairo.balart@metempsy.com
83313531Sjairo.balart@metempsy.comsc_signed
83413531Sjairo.balart@metempsy.comoperator ^ (const sc_signed &u, const sc_int_base &v)
83513531Sjairo.balart@metempsy.com{
83613531Sjairo.balart@metempsy.com    return operator ^ (u, (int64)v);
83713531Sjairo.balart@metempsy.com}
83813531Sjairo.balart@metempsy.com
83913531Sjairo.balart@metempsy.comsc_signed
84013531Sjairo.balart@metempsy.comoperator ^ (const sc_int_base &u, const sc_signed &v)
84113531Sjairo.balart@metempsy.com{
84213531Sjairo.balart@metempsy.com    return operator ^ ((int64)u, v);
84313531Sjairo.balart@metempsy.com}
84413531Sjairo.balart@metempsy.com
84513531Sjairo.balart@metempsy.comconst sc_signed &
84613531Sjairo.balart@metempsy.comsc_signed::operator ^= (const sc_int_base &v)
84713531Sjairo.balart@metempsy.com{
84813531Sjairo.balart@metempsy.com    return operator ^= ((int64)v);
84913531Sjairo.balart@metempsy.com}
85013531Sjairo.balart@metempsy.com
85113531Sjairo.balart@metempsy.com
85213531Sjairo.balart@metempsy.comsc_signed
85313531Sjairo.balart@metempsy.comoperator << (const sc_signed &u, const sc_int_base &v)
85413531Sjairo.balart@metempsy.com{
85513531Sjairo.balart@metempsy.com    return operator << (u, (int64)v);
85613531Sjairo.balart@metempsy.com}
85713531Sjairo.balart@metempsy.com
85813531Sjairo.balart@metempsy.comconst sc_signed &
85913531Sjairo.balart@metempsy.comsc_signed::operator <<= (const sc_int_base &v)
86013531Sjairo.balart@metempsy.com{
86113531Sjairo.balart@metempsy.com    return operator <<= ((int64)v);
86213531Sjairo.balart@metempsy.com}
86313531Sjairo.balart@metempsy.com
86413531Sjairo.balart@metempsy.com
86513531Sjairo.balart@metempsy.comsc_signed
86613531Sjairo.balart@metempsy.comoperator >> (const sc_signed &u, const sc_int_base &v)
86713531Sjairo.balart@metempsy.com{
86813531Sjairo.balart@metempsy.com    return operator >> (u, (int64)v);
86913531Sjairo.balart@metempsy.com}
87013531Sjairo.balart@metempsy.com
87113531Sjairo.balart@metempsy.comconst sc_signed &
87213531Sjairo.balart@metempsy.comsc_signed::operator >>= (const sc_int_base &v)
87313531Sjairo.balart@metempsy.com{
87413531Sjairo.balart@metempsy.com    return operator >>= ((int64)v);
87513531Sjairo.balart@metempsy.com}
87613531Sjairo.balart@metempsy.com
87713531Sjairo.balart@metempsy.com
87813531Sjairo.balart@metempsy.combool
87913531Sjairo.balart@metempsy.comoperator == (const sc_signed &u, const sc_int_base &v)
88013531Sjairo.balart@metempsy.com{
88113531Sjairo.balart@metempsy.com    return operator == (u, (int64)v);
88213531Sjairo.balart@metempsy.com}
88313531Sjairo.balart@metempsy.com
88413531Sjairo.balart@metempsy.combool
88513531Sjairo.balart@metempsy.comoperator == (const sc_int_base &u, const sc_signed &v)
88613531Sjairo.balart@metempsy.com{
88713531Sjairo.balart@metempsy.com    return operator == ((int64)u, v);
88813531Sjairo.balart@metempsy.com}
88913531Sjairo.balart@metempsy.com
89013531Sjairo.balart@metempsy.com
89113531Sjairo.balart@metempsy.combool
89213531Sjairo.balart@metempsy.comoperator != (const sc_signed &u, const sc_int_base &v)
89313531Sjairo.balart@metempsy.com{
89413531Sjairo.balart@metempsy.com    return operator != (u, (int64)v);
89513531Sjairo.balart@metempsy.com}
89613531Sjairo.balart@metempsy.com
89713531Sjairo.balart@metempsy.combool
89813531Sjairo.balart@metempsy.comoperator != (const sc_int_base &u, const sc_signed &v)
89913531Sjairo.balart@metempsy.com{
90013531Sjairo.balart@metempsy.com    return operator != ((int64)u, v);
90113531Sjairo.balart@metempsy.com}
90213531Sjairo.balart@metempsy.com
90313531Sjairo.balart@metempsy.com
90413531Sjairo.balart@metempsy.combool
90513531Sjairo.balart@metempsy.comoperator < (const sc_signed &u, const sc_int_base &v)
90613531Sjairo.balart@metempsy.com{
90713531Sjairo.balart@metempsy.com    return operator < (u, (int64)v);
90813531Sjairo.balart@metempsy.com}
90913531Sjairo.balart@metempsy.com
91013531Sjairo.balart@metempsy.combool
91113531Sjairo.balart@metempsy.comoperator  <  (const sc_int_base &u, const sc_signed &v)
91213531Sjairo.balart@metempsy.com{
91313531Sjairo.balart@metempsy.com    return operator < ((int64)u, v);
91413531Sjairo.balart@metempsy.com}
91513531Sjairo.balart@metempsy.com
91613531Sjairo.balart@metempsy.com
91713531Sjairo.balart@metempsy.combool
91813531Sjairo.balart@metempsy.comoperator  <=  (const sc_signed &u, const sc_int_base &v)
91913531Sjairo.balart@metempsy.com{
92013531Sjairo.balart@metempsy.com    return operator <= (u, (int64)v);
92113531Sjairo.balart@metempsy.com}
92213531Sjairo.balart@metempsy.com
92313531Sjairo.balart@metempsy.combool
92413531Sjairo.balart@metempsy.comoperator  <=  (const sc_int_base &u, const sc_signed &v)
92513531Sjairo.balart@metempsy.com{
92613531Sjairo.balart@metempsy.com    return operator <= ((int64)u, v);
92713531Sjairo.balart@metempsy.com}
92813531Sjairo.balart@metempsy.com
92913531Sjairo.balart@metempsy.com
93013531Sjairo.balart@metempsy.combool
93113531Sjairo.balart@metempsy.comoperator  >  (const sc_signed &u, const sc_int_base &v)
93213531Sjairo.balart@metempsy.com{
93313531Sjairo.balart@metempsy.com    return operator > (u, (int64)v);
93413531Sjairo.balart@metempsy.com}
93513531Sjairo.balart@metempsy.com
93613531Sjairo.balart@metempsy.combool
93713531Sjairo.balart@metempsy.comoperator  >  (const sc_int_base &u, const sc_signed &v)
93813531Sjairo.balart@metempsy.com{
93913531Sjairo.balart@metempsy.com    return operator > ((int64)u, v);
94013531Sjairo.balart@metempsy.com}
94113531Sjairo.balart@metempsy.com
94213531Sjairo.balart@metempsy.com
94313531Sjairo.balart@metempsy.combool
94413531Sjairo.balart@metempsy.comoperator  >=  (const sc_signed &u, const sc_int_base &v)
94513531Sjairo.balart@metempsy.com{
94613531Sjairo.balart@metempsy.com    return operator >= (u, (int64)v);
94713531Sjairo.balart@metempsy.com}
94813531Sjairo.balart@metempsy.com
94913531Sjairo.balart@metempsy.combool
95013531Sjairo.balart@metempsy.comoperator  >=  (const sc_int_base &u, const sc_signed &v)
95113531Sjairo.balart@metempsy.com{
95213531Sjairo.balart@metempsy.com    return operator >= ((int64)u, v);
95313531Sjairo.balart@metempsy.com}
95413531Sjairo.balart@metempsy.com
95513531Sjairo.balart@metempsy.com
95613531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
95713531Sjairo.balart@metempsy.com//  SECTION: Interfacing with sc_uint_base
95813531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
95913531Sjairo.balart@metempsy.com
96013531Sjairo.balart@metempsy.comconst sc_signed &
96113531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_uint_base &v)
96213531Sjairo.balart@metempsy.com{
96313531Sjairo.balart@metempsy.com    return operator = ((uint64)v);
96413531Sjairo.balart@metempsy.com}
96513531Sjairo.balart@metempsy.com
96613531Sjairo.balart@metempsy.com
96713531Sjairo.balart@metempsy.comsc_signed
96813531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_uint_base &v)
96913531Sjairo.balart@metempsy.com{
97013531Sjairo.balart@metempsy.com    return operator + (u, (uint64)v);
97113531Sjairo.balart@metempsy.com}
97213531Sjairo.balart@metempsy.com
97313531Sjairo.balart@metempsy.comsc_signed
97413531Sjairo.balart@metempsy.comoperator + (const sc_uint_base &u, const sc_signed &v)
97513531Sjairo.balart@metempsy.com{
97613531Sjairo.balart@metempsy.com    return operator + ((uint64)u, v);
97713531Sjairo.balart@metempsy.com}
97813531Sjairo.balart@metempsy.com
97913531Sjairo.balart@metempsy.comconst sc_signed &
98013531Sjairo.balart@metempsy.comsc_signed::operator += (const sc_uint_base &v)
98113531Sjairo.balart@metempsy.com{
98213531Sjairo.balart@metempsy.com    return operator += ((uint64)v);
98313531Sjairo.balart@metempsy.com}
98413531Sjairo.balart@metempsy.com
98513531Sjairo.balart@metempsy.com
98613531Sjairo.balart@metempsy.comsc_signed
98713531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_uint_base &v)
98813531Sjairo.balart@metempsy.com{
98913531Sjairo.balart@metempsy.com    return operator - (u, (uint64)v);
99013531Sjairo.balart@metempsy.com}
99113531Sjairo.balart@metempsy.com
99213531Sjairo.balart@metempsy.comsc_signed
99313531Sjairo.balart@metempsy.comoperator - (const sc_uint_base &u, const sc_unsigned &v)
99413531Sjairo.balart@metempsy.com{
99513531Sjairo.balart@metempsy.com    return operator - ((uint64)u, v);
99613531Sjairo.balart@metempsy.com}
99713531Sjairo.balart@metempsy.com
99813531Sjairo.balart@metempsy.comsc_signed
99913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_uint_base &v)
100013531Sjairo.balart@metempsy.com{
100113531Sjairo.balart@metempsy.com    return operator - (u, (uint64)v);
100213531Sjairo.balart@metempsy.com}
100313531Sjairo.balart@metempsy.com
100413531Sjairo.balart@metempsy.comsc_signed
100513531Sjairo.balart@metempsy.comoperator - (const sc_uint_base &u, const sc_signed &v)
100613531Sjairo.balart@metempsy.com{
100713531Sjairo.balart@metempsy.com    return operator - ((uint64)u, v);
100813531Sjairo.balart@metempsy.com}
100913531Sjairo.balart@metempsy.com
101013531Sjairo.balart@metempsy.comconst sc_signed &
101113531Sjairo.balart@metempsy.comsc_signed::operator -= (const sc_uint_base &v)
101213531Sjairo.balart@metempsy.com{
101313531Sjairo.balart@metempsy.com    return operator -= ((uint64)v);
101413531Sjairo.balart@metempsy.com}
101513531Sjairo.balart@metempsy.com
101613531Sjairo.balart@metempsy.com
101713531Sjairo.balart@metempsy.comsc_signed
101813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_uint_base &v)
101913531Sjairo.balart@metempsy.com{
102013531Sjairo.balart@metempsy.com    return operator * (u, (uint64)v);
102113531Sjairo.balart@metempsy.com}
102213531Sjairo.balart@metempsy.com
102313531Sjairo.balart@metempsy.comsc_signed
102413531Sjairo.balart@metempsy.comoperator * (const sc_uint_base &u, const sc_signed &v)
102513531Sjairo.balart@metempsy.com{
102613531Sjairo.balart@metempsy.com    return operator * ((uint64)u, v);
102713531Sjairo.balart@metempsy.com}
102813531Sjairo.balart@metempsy.com
102913531Sjairo.balart@metempsy.comconst sc_signed &
103013531Sjairo.balart@metempsy.comsc_signed::operator *= (const sc_uint_base &v)
103113531Sjairo.balart@metempsy.com{
103213531Sjairo.balart@metempsy.com    return operator *= ((uint64)v);
103313531Sjairo.balart@metempsy.com}
103413531Sjairo.balart@metempsy.com
103513531Sjairo.balart@metempsy.com
103613531Sjairo.balart@metempsy.comsc_signed
103713531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_uint_base &v)
103813531Sjairo.balart@metempsy.com{
103913531Sjairo.balart@metempsy.com    return operator / (u, (uint64)v);
104013531Sjairo.balart@metempsy.com}
104113531Sjairo.balart@metempsy.com
104213531Sjairo.balart@metempsy.comsc_signed
104313531Sjairo.balart@metempsy.comoperator / (const sc_uint_base &u, const sc_signed &v)
104413531Sjairo.balart@metempsy.com{
104513531Sjairo.balart@metempsy.com    return operator / ((uint64)u, v);
104613531Sjairo.balart@metempsy.com}
104713531Sjairo.balart@metempsy.com
104813531Sjairo.balart@metempsy.comconst sc_signed &
104913531Sjairo.balart@metempsy.comsc_signed::operator /= (const sc_uint_base &v)
105013531Sjairo.balart@metempsy.com{
105113531Sjairo.balart@metempsy.com    return operator /= ((uint64)v);
105213531Sjairo.balart@metempsy.com}
105313531Sjairo.balart@metempsy.com
105413531Sjairo.balart@metempsy.com
105513531Sjairo.balart@metempsy.comsc_signed
105613531Sjairo.balart@metempsy.comoperator % (const sc_signed &u, const sc_uint_base &v)
105713531Sjairo.balart@metempsy.com{
105813531Sjairo.balart@metempsy.com    return operator % (u, (uint64)v);
105913531Sjairo.balart@metempsy.com}
106013531Sjairo.balart@metempsy.com
106113531Sjairo.balart@metempsy.comsc_signed
106213531Sjairo.balart@metempsy.comoperator % (const sc_uint_base &u, const sc_signed &v)
106313531Sjairo.balart@metempsy.com{
106413531Sjairo.balart@metempsy.com    return operator % ((uint64)u, v);
106513531Sjairo.balart@metempsy.com}
106613531Sjairo.balart@metempsy.com
106713531Sjairo.balart@metempsy.comconst sc_signed&
106813531Sjairo.balart@metempsy.comsc_signed::operator %= (const sc_uint_base &v)
106913531Sjairo.balart@metempsy.com{
107013531Sjairo.balart@metempsy.com    return operator %= ((uint64)v);
107113531Sjairo.balart@metempsy.com}
107213531Sjairo.balart@metempsy.com
107313531Sjairo.balart@metempsy.com
107413531Sjairo.balart@metempsy.comsc_signed
107513531Sjairo.balart@metempsy.comoperator & (const sc_signed &u, const sc_uint_base &v)
107613531Sjairo.balart@metempsy.com{
107713531Sjairo.balart@metempsy.com    return operator & (u, (uint64)v);
107813531Sjairo.balart@metempsy.com}
107913531Sjairo.balart@metempsy.com
108013531Sjairo.balart@metempsy.comsc_signed
108113531Sjairo.balart@metempsy.comoperator & (const sc_uint_base &u, const sc_signed &v)
108213531Sjairo.balart@metempsy.com{
108313531Sjairo.balart@metempsy.com    return operator & ((uint64)u, v);
108413531Sjairo.balart@metempsy.com}
108513531Sjairo.balart@metempsy.com
108613531Sjairo.balart@metempsy.comconst sc_signed &
108713531Sjairo.balart@metempsy.comsc_signed::operator &= (const sc_uint_base &v)
108813531Sjairo.balart@metempsy.com{
108913531Sjairo.balart@metempsy.com    return operator &= ((uint64)v);
109013531Sjairo.balart@metempsy.com}
109113531Sjairo.balart@metempsy.com
109213531Sjairo.balart@metempsy.com
109313531Sjairo.balart@metempsy.comsc_signed
109413531Sjairo.balart@metempsy.comoperator | (const sc_signed &u, const sc_uint_base &v)
109513531Sjairo.balart@metempsy.com{
109613531Sjairo.balart@metempsy.com    return operator | (u, (uint64)v);
109713531Sjairo.balart@metempsy.com}
109813531Sjairo.balart@metempsy.com
109913531Sjairo.balart@metempsy.comsc_signed
110013531Sjairo.balart@metempsy.comoperator | (const sc_uint_base &u, const sc_signed &v)
110113531Sjairo.balart@metempsy.com{
110213531Sjairo.balart@metempsy.com    return operator | ((uint64)u, v);
110313531Sjairo.balart@metempsy.com}
110413531Sjairo.balart@metempsy.com
110513531Sjairo.balart@metempsy.comconst sc_signed &
110613531Sjairo.balart@metempsy.comsc_signed::operator |= (const sc_uint_base &v)
110713531Sjairo.balart@metempsy.com{
110813531Sjairo.balart@metempsy.com    return operator |= ((uint64)v);
110913531Sjairo.balart@metempsy.com}
111013531Sjairo.balart@metempsy.com
111113531Sjairo.balart@metempsy.com
111213531Sjairo.balart@metempsy.comsc_signed
111313531Sjairo.balart@metempsy.comoperator ^ (const sc_signed &u, const sc_uint_base &v)
111413531Sjairo.balart@metempsy.com{
111513531Sjairo.balart@metempsy.com    return operator ^ (u, (uint64)v);
111613531Sjairo.balart@metempsy.com}
111713531Sjairo.balart@metempsy.com
111813531Sjairo.balart@metempsy.comsc_signed
111913531Sjairo.balart@metempsy.comoperator ^ (const sc_uint_base &u, const sc_signed &v)
112013531Sjairo.balart@metempsy.com{
112113531Sjairo.balart@metempsy.com    return operator ^ ((uint64)u, v);
112213531Sjairo.balart@metempsy.com}
112313531Sjairo.balart@metempsy.com
112413531Sjairo.balart@metempsy.comconst sc_signed &
112513531Sjairo.balart@metempsy.comsc_signed::operator ^= (const sc_uint_base &v)
112613531Sjairo.balart@metempsy.com{
112713531Sjairo.balart@metempsy.com    return operator ^= ((uint64)v);
112813531Sjairo.balart@metempsy.com}
112913531Sjairo.balart@metempsy.com
113013531Sjairo.balart@metempsy.com
113113531Sjairo.balart@metempsy.comsc_signed
113213531Sjairo.balart@metempsy.comoperator << (const sc_signed &u, const sc_uint_base &v)
113313531Sjairo.balart@metempsy.com{
113413531Sjairo.balart@metempsy.com    return operator << (u, (uint64)v);
113513531Sjairo.balart@metempsy.com}
113613531Sjairo.balart@metempsy.com
113713531Sjairo.balart@metempsy.comconst sc_signed &
113813531Sjairo.balart@metempsy.comsc_signed::operator <<= (const sc_uint_base &v)
113913531Sjairo.balart@metempsy.com{
114013531Sjairo.balart@metempsy.com    return operator <<= ((uint64)v);
114113531Sjairo.balart@metempsy.com}
114213531Sjairo.balart@metempsy.com
114313531Sjairo.balart@metempsy.com
114413531Sjairo.balart@metempsy.comsc_signed
114513531Sjairo.balart@metempsy.comoperator >> (const sc_signed& u, const sc_uint_base& v)
114613531Sjairo.balart@metempsy.com{
114713531Sjairo.balart@metempsy.com    return operator >> (u, (uint64)v);
114813531Sjairo.balart@metempsy.com}
114913531Sjairo.balart@metempsy.com
115013531Sjairo.balart@metempsy.comconst sc_signed &
115113531Sjairo.balart@metempsy.comsc_signed::operator >>= (const sc_uint_base& v)
115213531Sjairo.balart@metempsy.com{
115313531Sjairo.balart@metempsy.com    return operator >>= ((uint64)v);
115413531Sjairo.balart@metempsy.com}
115513531Sjairo.balart@metempsy.com
115613531Sjairo.balart@metempsy.com
115713531Sjairo.balart@metempsy.combool
115813531Sjairo.balart@metempsy.comoperator == (const sc_signed &u, const sc_uint_base &v)
115913531Sjairo.balart@metempsy.com{
116013531Sjairo.balart@metempsy.com    return operator == (u, (uint64)v);
116113531Sjairo.balart@metempsy.com}
116213531Sjairo.balart@metempsy.com
116313531Sjairo.balart@metempsy.combool
116413531Sjairo.balart@metempsy.comoperator == (const sc_uint_base &u, const sc_signed &v)
116513531Sjairo.balart@metempsy.com{
116613531Sjairo.balart@metempsy.com    return operator == ((uint64)u, v);
116713531Sjairo.balart@metempsy.com}
116813531Sjairo.balart@metempsy.com
116913531Sjairo.balart@metempsy.com
117013531Sjairo.balart@metempsy.combool
117113531Sjairo.balart@metempsy.comoperator != (const sc_signed &u, const sc_uint_base &v)
117213531Sjairo.balart@metempsy.com{
117313531Sjairo.balart@metempsy.com    return operator != (u, (uint64)v);
117413531Sjairo.balart@metempsy.com}
117513531Sjairo.balart@metempsy.com
117613531Sjairo.balart@metempsy.combool
117713531Sjairo.balart@metempsy.comoperator != (const sc_uint_base &u, const sc_signed &v)
117813531Sjairo.balart@metempsy.com{
117913531Sjairo.balart@metempsy.com    return operator != ((uint64)u, v);
118013531Sjairo.balart@metempsy.com}
118113531Sjairo.balart@metempsy.com
118213531Sjairo.balart@metempsy.com
118313531Sjairo.balart@metempsy.combool
118413531Sjairo.balart@metempsy.comoperator < (const sc_signed &u, const sc_uint_base &v)
118513531Sjairo.balart@metempsy.com{
118613531Sjairo.balart@metempsy.com    return operator < (u, (uint64)v);
118713531Sjairo.balart@metempsy.com}
118813531Sjairo.balart@metempsy.com
118913531Sjairo.balart@metempsy.combool
119013531Sjairo.balart@metempsy.comoperator < (const sc_uint_base &u, const sc_signed &v)
119113531Sjairo.balart@metempsy.com{
119213531Sjairo.balart@metempsy.com    return operator < ((uint64)u, v);
119313531Sjairo.balart@metempsy.com}
119413531Sjairo.balart@metempsy.com
119513531Sjairo.balart@metempsy.com
119613531Sjairo.balart@metempsy.combool
119713531Sjairo.balart@metempsy.comoperator <= (const sc_signed &u, const sc_uint_base &v)
119813531Sjairo.balart@metempsy.com{
119913531Sjairo.balart@metempsy.com    return operator <= (u, (uint64)v);
120013531Sjairo.balart@metempsy.com}
120113531Sjairo.balart@metempsy.com
120213531Sjairo.balart@metempsy.combool
120313531Sjairo.balart@metempsy.comoperator <= (const sc_uint_base &u, const sc_signed &v)
120413531Sjairo.balart@metempsy.com{
120513531Sjairo.balart@metempsy.com    return operator <= ((uint64)u, v);
120613531Sjairo.balart@metempsy.com}
120713531Sjairo.balart@metempsy.com
120813531Sjairo.balart@metempsy.com
120913531Sjairo.balart@metempsy.combool
121013531Sjairo.balart@metempsy.comoperator > (const sc_signed &u, const sc_uint_base &v)
121113531Sjairo.balart@metempsy.com{
121213531Sjairo.balart@metempsy.com    return operator > (u, (uint64)v);
121313531Sjairo.balart@metempsy.com}
121413531Sjairo.balart@metempsy.com
121513531Sjairo.balart@metempsy.combool
121613531Sjairo.balart@metempsy.comoperator > (const sc_uint_base &u, const sc_signed &v)
121713531Sjairo.balart@metempsy.com{
121813531Sjairo.balart@metempsy.com    return operator > ((uint64)u, v);
121913531Sjairo.balart@metempsy.com}
122013531Sjairo.balart@metempsy.com
122113531Sjairo.balart@metempsy.com
122213531Sjairo.balart@metempsy.combool
122313531Sjairo.balart@metempsy.comoperator >= (const sc_signed &u, const sc_uint_base &v)
122413531Sjairo.balart@metempsy.com{
122513531Sjairo.balart@metempsy.com    return operator >= (u, (uint64)v);
122613531Sjairo.balart@metempsy.com}
122713531Sjairo.balart@metempsy.com
122813531Sjairo.balart@metempsy.combool
122913531Sjairo.balart@metempsy.comoperator >= (const sc_uint_base &u, const sc_signed &v)
123013531Sjairo.balart@metempsy.com{
123113531Sjairo.balart@metempsy.com    return operator >= ((uint64)u, v);
123213531Sjairo.balart@metempsy.com}
123313531Sjairo.balart@metempsy.com
123413531Sjairo.balart@metempsy.com
123513531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
123613531Sjairo.balart@metempsy.com//  SECTION: Input and output operators
123713531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
123813531Sjairo.balart@metempsy.com
123913531Sjairo.balart@metempsy.com// Operators in this section are included from sc_nbcommon.cpp.
124013531Sjairo.balart@metempsy.com
124113531Sjairo.balart@metempsy.com
124213531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
124313531Sjairo.balart@metempsy.com//  SECTION: Operator macros.
124413531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
124513531Sjairo.balart@metempsy.com
124613531Sjairo.balart@metempsy.com#define CONVERT_LONG(u) \
124713531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \
124813531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_ULONG]; \
124913531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
125013531Sjairo.balart@metempsy.com
125113531Sjairo.balart@metempsy.com#define CONVERT_LONG_2(u) \
125213531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_ULONG]; \
125313531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
125413531Sjairo.balart@metempsy.com
125513531Sjairo.balart@metempsy.com#define CONVERT_INT(u) \
125613531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \
125713531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT]; \
125813531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
125913531Sjairo.balart@metempsy.com
126013531Sjairo.balart@metempsy.com#define CONVERT_INT_2(u) \
126113531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT]; \
126213531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
126313531Sjairo.balart@metempsy.com
126413531Sjairo.balart@metempsy.com#define CONVERT_INT64(u) \
126513531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \
126613531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT64]; \
126713531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
126813531Sjairo.balart@metempsy.com
126913531Sjairo.balart@metempsy.com#define CONVERT_INT64_2(u) \
127013531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT64]; \
127113531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
127213531Sjairo.balart@metempsy.com
127313531Sjairo.balart@metempsy.com
127413531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
127513531Sjairo.balart@metempsy.com//  SECTION: PLUS operators: +, +=, ++
127613531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
127713531Sjairo.balart@metempsy.com
127813531Sjairo.balart@metempsy.com// Cases to consider when computing u + v:
127913531Sjairo.balart@metempsy.com// 1. 0 + v = v
128013531Sjairo.balart@metempsy.com// 2. u + 0 = u
128113531Sjairo.balart@metempsy.com// 3. if sgn(u) == sgn(v)
128213531Sjairo.balart@metempsy.com//    3.1 u + v = +(u + v) = sgn(u) * (u + v)
128313531Sjairo.balart@metempsy.com//    3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
128413531Sjairo.balart@metempsy.com// 4. if sgn(u) != sgn(v)
128513531Sjairo.balart@metempsy.com//    4.1 u + (-v) = u - v = sgn(u) * (u - v)
128613531Sjairo.balart@metempsy.com//    4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
128713531Sjairo.balart@metempsy.com//
128813531Sjairo.balart@metempsy.com// Specialization of above cases for computing ++u or u++:
128913531Sjairo.balart@metempsy.com// 1. 0 + 1 = 1
129013531Sjairo.balart@metempsy.com// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
129113531Sjairo.balart@metempsy.com// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
129213531Sjairo.balart@metempsy.com
129313531Sjairo.balart@metempsy.comsc_signed
129413531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, const sc_signed &v)
129513531Sjairo.balart@metempsy.com{
129613531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
129713531Sjairo.balart@metempsy.com        return sc_signed(v);
129813531Sjairo.balart@metempsy.com
129913531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
130013531Sjairo.balart@metempsy.com        return sc_signed(u);
130113531Sjairo.balart@metempsy.com
130213531Sjairo.balart@metempsy.com    // cases 3 and 4
130313531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
130413531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
130513531Sjairo.balart@metempsy.com}
130613531Sjairo.balart@metempsy.com
130713531Sjairo.balart@metempsy.com
130813531Sjairo.balart@metempsy.comsc_signed
130913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_unsigned &v)
131013531Sjairo.balart@metempsy.com{
131113531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
131213531Sjairo.balart@metempsy.com        return sc_signed(v);
131313531Sjairo.balart@metempsy.com
131413531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
131513531Sjairo.balart@metempsy.com        return sc_signed(u);
131613531Sjairo.balart@metempsy.com
131713531Sjairo.balart@metempsy.com    // cases 3 and 4
131813531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
131913531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
132013531Sjairo.balart@metempsy.com}
132113531Sjairo.balart@metempsy.com
132213531Sjairo.balart@metempsy.com
132313531Sjairo.balart@metempsy.comsc_signed
132413531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_signed &v)
132513531Sjairo.balart@metempsy.com{
132613531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
132713531Sjairo.balart@metempsy.com        return sc_signed(v);
132813531Sjairo.balart@metempsy.com
132913531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
133013531Sjairo.balart@metempsy.com        return sc_signed(u);
133113531Sjairo.balart@metempsy.com
133213531Sjairo.balart@metempsy.com    // cases 3 and 4
133313531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
133413531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
133513531Sjairo.balart@metempsy.com}
133613531Sjairo.balart@metempsy.com
133713531Sjairo.balart@metempsy.com
133813531Sjairo.balart@metempsy.comsc_signed
133913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, int64 v)
134013531Sjairo.balart@metempsy.com{
134113531Sjairo.balart@metempsy.com    if (v == 0) // case 2
134213531Sjairo.balart@metempsy.com        return sc_signed(u);
134313531Sjairo.balart@metempsy.com
134413531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
134513531Sjairo.balart@metempsy.com
134613531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
134713531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
134813531Sjairo.balart@metempsy.com
134913531Sjairo.balart@metempsy.com    // cases 3 and 4
135013531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
135113531Sjairo.balart@metempsy.com                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
135213531Sjairo.balart@metempsy.com}
135313531Sjairo.balart@metempsy.com
135413531Sjairo.balart@metempsy.com
135513531Sjairo.balart@metempsy.comsc_signed
135613531Sjairo.balart@metempsy.comoperator + (int64 u, const sc_signed &v)
135713531Sjairo.balart@metempsy.com{
135813531Sjairo.balart@metempsy.com    if (u == 0) // case 1
135913531Sjairo.balart@metempsy.com        return sc_signed(v);
136013531Sjairo.balart@metempsy.com
136113531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
136213531Sjairo.balart@metempsy.com
136313531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
136413531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
136513531Sjairo.balart@metempsy.com
136613531Sjairo.balart@metempsy.com    // cases 3 and 4
136713531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
136813531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
136913531Sjairo.balart@metempsy.com}
137013531Sjairo.balart@metempsy.com
137113531Sjairo.balart@metempsy.com
137213531Sjairo.balart@metempsy.comsc_signed
137313531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, int64 v)
137413531Sjairo.balart@metempsy.com{
137513531Sjairo.balart@metempsy.com    if (v == 0) // case 2
137613531Sjairo.balart@metempsy.com        return sc_signed(u);
137713531Sjairo.balart@metempsy.com
137813531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
137913531Sjairo.balart@metempsy.com
138013531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
138113531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
138213531Sjairo.balart@metempsy.com
138313531Sjairo.balart@metempsy.com    // cases 3 and 4
138413531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
138513531Sjairo.balart@metempsy.com                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
138613531Sjairo.balart@metempsy.com}
138713531Sjairo.balart@metempsy.com
138813531Sjairo.balart@metempsy.com
138913531Sjairo.balart@metempsy.comsc_signed
139013531Sjairo.balart@metempsy.comoperator + (int64 u, const sc_unsigned &v)
139113531Sjairo.balart@metempsy.com{
139213531Sjairo.balart@metempsy.com    if (u == 0) // case 1
139313531Sjairo.balart@metempsy.com        return sc_signed(v);
139413531Sjairo.balart@metempsy.com
139513531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
139613531Sjairo.balart@metempsy.com
139713531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
139813531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
139913531Sjairo.balart@metempsy.com
140013531Sjairo.balart@metempsy.com    // cases 3 and 4
140113531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
140213531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
140313531Sjairo.balart@metempsy.com}
140413531Sjairo.balart@metempsy.com
140513531Sjairo.balart@metempsy.com
140613531Sjairo.balart@metempsy.comsc_signed
140713531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, uint64 v)
140813531Sjairo.balart@metempsy.com{
140913531Sjairo.balart@metempsy.com    if (v == 0) // case 2
141013531Sjairo.balart@metempsy.com        return sc_signed(u);
141113531Sjairo.balart@metempsy.com
141213531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
141313531Sjairo.balart@metempsy.com
141413531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
141513531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
141613531Sjairo.balart@metempsy.com
141713531Sjairo.balart@metempsy.com    // cases 3 and 4
141813531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
141913531Sjairo.balart@metempsy.com                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
142013531Sjairo.balart@metempsy.com}
142113531Sjairo.balart@metempsy.com
142213531Sjairo.balart@metempsy.com
142313531Sjairo.balart@metempsy.comsc_signed
142413531Sjairo.balart@metempsy.comoperator + (uint64 u, const sc_signed &v)
142513531Sjairo.balart@metempsy.com{
142613531Sjairo.balart@metempsy.com    if (u == 0) // case 1
142713531Sjairo.balart@metempsy.com        return sc_signed(v);
142813531Sjairo.balart@metempsy.com
142913531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
143013531Sjairo.balart@metempsy.com
143113531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
143213531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
143313531Sjairo.balart@metempsy.com
143413531Sjairo.balart@metempsy.com    // cases 3 and 4
143513531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
143613531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
143713531Sjairo.balart@metempsy.com}
143813531Sjairo.balart@metempsy.com
143913531Sjairo.balart@metempsy.com
144013531Sjairo.balart@metempsy.comsc_signed
144113531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, long v)
144213531Sjairo.balart@metempsy.com{
144313531Sjairo.balart@metempsy.com    if (v == 0) // case 2
144413531Sjairo.balart@metempsy.com        return sc_signed(u);
144513531Sjairo.balart@metempsy.com
144613531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
144713531Sjairo.balart@metempsy.com
144813531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
144913531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
145013531Sjairo.balart@metempsy.com
145113531Sjairo.balart@metempsy.com    // cases 3 and 4
145213531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
145313531Sjairo.balart@metempsy.com                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
145413531Sjairo.balart@metempsy.com}
145513531Sjairo.balart@metempsy.com
145613531Sjairo.balart@metempsy.com
145713531Sjairo.balart@metempsy.comsc_signed
145813531Sjairo.balart@metempsy.comoperator + (long u, const sc_signed &v)
145913531Sjairo.balart@metempsy.com{
146013531Sjairo.balart@metempsy.com    if (u == 0) // case 1
146113531Sjairo.balart@metempsy.com        return sc_signed(v);
146213531Sjairo.balart@metempsy.com
146313531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
146413531Sjairo.balart@metempsy.com
146513531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
146613531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
146713531Sjairo.balart@metempsy.com
146813531Sjairo.balart@metempsy.com    // cases 3 and 4
146913531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
147013531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
147113531Sjairo.balart@metempsy.com}
147213531Sjairo.balart@metempsy.com
147313531Sjairo.balart@metempsy.com
147413531Sjairo.balart@metempsy.comsc_signed
147513531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, long v)
147613531Sjairo.balart@metempsy.com{
147713531Sjairo.balart@metempsy.com    if (v == 0) // case 2
147813531Sjairo.balart@metempsy.com        return sc_signed(u);
147913531Sjairo.balart@metempsy.com
148013531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
148113531Sjairo.balart@metempsy.com
148213531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
148313531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
148413531Sjairo.balart@metempsy.com
148513531Sjairo.balart@metempsy.com    // cases 3 and 4
148613531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
148713531Sjairo.balart@metempsy.com                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
148813531Sjairo.balart@metempsy.com}
148913531Sjairo.balart@metempsy.com
149013531Sjairo.balart@metempsy.com
149113531Sjairo.balart@metempsy.comsc_signed
149213531Sjairo.balart@metempsy.comoperator + (long u, const sc_unsigned &v)
149313531Sjairo.balart@metempsy.com{
149413531Sjairo.balart@metempsy.com    if (u == 0) // case 1
149513531Sjairo.balart@metempsy.com        return sc_signed(v);
149613531Sjairo.balart@metempsy.com
149713531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
149813531Sjairo.balart@metempsy.com
149913531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
150013531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
150113531Sjairo.balart@metempsy.com
150213531Sjairo.balart@metempsy.com    // cases 3 and 4
150313531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
150413531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
150513531Sjairo.balart@metempsy.com}
150613531Sjairo.balart@metempsy.com
150713531Sjairo.balart@metempsy.com
150813531Sjairo.balart@metempsy.comsc_signed
150913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, unsigned long v)
151013531Sjairo.balart@metempsy.com{
151113531Sjairo.balart@metempsy.com    if (v == 0) // case 2
151213531Sjairo.balart@metempsy.com        return sc_signed(u);
151313531Sjairo.balart@metempsy.com
151413531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
151513531Sjairo.balart@metempsy.com
151613531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 1
151713531Sjairo.balart@metempsy.com        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
151813531Sjairo.balart@metempsy.com
151913531Sjairo.balart@metempsy.com    // cases 3 and 4
152013531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
152113531Sjairo.balart@metempsy.com                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
152213531Sjairo.balart@metempsy.com}
152313531Sjairo.balart@metempsy.com
152413531Sjairo.balart@metempsy.com
152513531Sjairo.balart@metempsy.comsc_signed
152613531Sjairo.balart@metempsy.comoperator + (unsigned long u, const sc_signed &v)
152713531Sjairo.balart@metempsy.com{
152813531Sjairo.balart@metempsy.com    if (u == 0) // case 1
152913531Sjairo.balart@metempsy.com        return sc_signed(v);
153013531Sjairo.balart@metempsy.com
153113531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
153213531Sjairo.balart@metempsy.com
153313531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO)  // case 2
153413531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
153513531Sjairo.balart@metempsy.com
153613531Sjairo.balart@metempsy.com    // cases 3 and 4
153713531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
153813531Sjairo.balart@metempsy.com                             v.sgn, v.nbits, v.ndigits, v.digit);
153913531Sjairo.balart@metempsy.com}
154013531Sjairo.balart@metempsy.com
154113531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from
154213531Sjairo.balart@metempsy.com// sc_nbcommon.cpp.
154313531Sjairo.balart@metempsy.com
154413531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
154513531Sjairo.balart@metempsy.com//  SECTION: MINUS operators: -, -=, --
154613531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
154713531Sjairo.balart@metempsy.com
154813531Sjairo.balart@metempsy.com// Cases to consider when computing u + v:
154913531Sjairo.balart@metempsy.com// 1. u - 0 = u
155013531Sjairo.balart@metempsy.com// 2. 0 - v = -v
155113531Sjairo.balart@metempsy.com// 3. if sgn(u) != sgn(v)
155213531Sjairo.balart@metempsy.com//    3.1 u - (-v) = u + v = sgn(u) * (u + v)
155313531Sjairo.balart@metempsy.com//    3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
155413531Sjairo.balart@metempsy.com// 4. if sgn(u) == sgn(v)
155513531Sjairo.balart@metempsy.com//    4.1 u - v = +(u - v) = sgn(u) * (u - v)
155613531Sjairo.balart@metempsy.com//    4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
155713531Sjairo.balart@metempsy.com//
155813531Sjairo.balart@metempsy.com// Specialization of above cases for computing --u or u--:
155913531Sjairo.balart@metempsy.com// 1. 0 - 1 = -1
156013531Sjairo.balart@metempsy.com// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
156113531Sjairo.balart@metempsy.com// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
156213531Sjairo.balart@metempsy.com
156313531Sjairo.balart@metempsy.comsc_signed
156413531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_unsigned &v)
156513531Sjairo.balart@metempsy.com{
156613531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO)  // case 1
156713531Sjairo.balart@metempsy.com        return sc_signed(u);
156813531Sjairo.balart@metempsy.com
156913531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
157013531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
157113531Sjairo.balart@metempsy.com
157213531Sjairo.balart@metempsy.com    // cases 3 and 4
157313531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
157413531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
157513531Sjairo.balart@metempsy.com}
157613531Sjairo.balart@metempsy.com
157713531Sjairo.balart@metempsy.com
157813531Sjairo.balart@metempsy.comsc_signed
157913531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_signed &v)
158013531Sjairo.balart@metempsy.com{
158113531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 1
158213531Sjairo.balart@metempsy.com        return sc_signed(u);
158313531Sjairo.balart@metempsy.com
158413531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
158513531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
158613531Sjairo.balart@metempsy.com
158713531Sjairo.balart@metempsy.com    // cases 3 and 4
158813531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
158913531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
159013531Sjairo.balart@metempsy.com}
159113531Sjairo.balart@metempsy.com
159213531Sjairo.balart@metempsy.com
159313531Sjairo.balart@metempsy.comsc_signed
159413531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_unsigned &v)
159513531Sjairo.balart@metempsy.com{
159613531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 1
159713531Sjairo.balart@metempsy.com        return sc_signed(u);
159813531Sjairo.balart@metempsy.com
159913531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
160013531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
160113531Sjairo.balart@metempsy.com
160213531Sjairo.balart@metempsy.com    // cases 3 and 4
160313531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
160413531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
160513531Sjairo.balart@metempsy.com}
160613531Sjairo.balart@metempsy.com
160713531Sjairo.balart@metempsy.com
160813531Sjairo.balart@metempsy.comsc_signed
160913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_signed &v)
161013531Sjairo.balart@metempsy.com{
161113531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO)  // case 1
161213531Sjairo.balart@metempsy.com        return sc_signed(u);
161313531Sjairo.balart@metempsy.com
161413531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
161513531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
161613531Sjairo.balart@metempsy.com
161713531Sjairo.balart@metempsy.com    // cases 3 and 4
161813531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
161913531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
162013531Sjairo.balart@metempsy.com}
162113531Sjairo.balart@metempsy.com
162213531Sjairo.balart@metempsy.com
162313531Sjairo.balart@metempsy.comsc_signed
162413531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, int64 v)
162513531Sjairo.balart@metempsy.com{
162613531Sjairo.balart@metempsy.com    if (v == 0) // case 1
162713531Sjairo.balart@metempsy.com        return sc_signed(u);
162813531Sjairo.balart@metempsy.com
162913531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
163013531Sjairo.balart@metempsy.com
163113531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
163213531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
163313531Sjairo.balart@metempsy.com
163413531Sjairo.balart@metempsy.com    // cases 3 and 4
163513531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
163613531Sjairo.balart@metempsy.com                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
163713531Sjairo.balart@metempsy.com}
163813531Sjairo.balart@metempsy.com
163913531Sjairo.balart@metempsy.com
164013531Sjairo.balart@metempsy.comsc_signed
164113531Sjairo.balart@metempsy.comoperator - (int64 u, const sc_signed &v)
164213531Sjairo.balart@metempsy.com{
164313531Sjairo.balart@metempsy.com    if (u == 0) // case 1
164413531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
164513531Sjairo.balart@metempsy.com
164613531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
164713531Sjairo.balart@metempsy.com
164813531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
164913531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
165013531Sjairo.balart@metempsy.com
165113531Sjairo.balart@metempsy.com    // cases 3 and 4
165213531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
165313531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
165413531Sjairo.balart@metempsy.com}
165513531Sjairo.balart@metempsy.com
165613531Sjairo.balart@metempsy.com
165713531Sjairo.balart@metempsy.comsc_signed
165813531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, int64 v)
165913531Sjairo.balart@metempsy.com{
166013531Sjairo.balart@metempsy.com    if (v == 0) // case 1
166113531Sjairo.balart@metempsy.com        return sc_signed(u);
166213531Sjairo.balart@metempsy.com
166313531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
166413531Sjairo.balart@metempsy.com
166513531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
166613531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
166713531Sjairo.balart@metempsy.com
166813531Sjairo.balart@metempsy.com    // cases 3 and 4
166913531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
167013531Sjairo.balart@metempsy.com                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
167113531Sjairo.balart@metempsy.com}
167213531Sjairo.balart@metempsy.com
167313531Sjairo.balart@metempsy.com
167413531Sjairo.balart@metempsy.comsc_signed
167513531Sjairo.balart@metempsy.comoperator - (int64 u, const sc_unsigned &v)
167613531Sjairo.balart@metempsy.com{
167713531Sjairo.balart@metempsy.com    if (u == 0) // case 1
167813531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
167913531Sjairo.balart@metempsy.com
168013531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
168113531Sjairo.balart@metempsy.com
168213531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
168313531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
168413531Sjairo.balart@metempsy.com
168513531Sjairo.balart@metempsy.com    // cases 3 and 4
168613531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
168713531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
168813531Sjairo.balart@metempsy.com}
168913531Sjairo.balart@metempsy.com
169013531Sjairo.balart@metempsy.com
169113531Sjairo.balart@metempsy.comsc_signed
169213531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, uint64 v)
169313531Sjairo.balart@metempsy.com{
169413531Sjairo.balart@metempsy.com    if (v == 0) // case 1
169513531Sjairo.balart@metempsy.com        return sc_signed(u);
169613531Sjairo.balart@metempsy.com
169713531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
169813531Sjairo.balart@metempsy.com
169913531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
170013531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
170113531Sjairo.balart@metempsy.com
170213531Sjairo.balart@metempsy.com    // cases 3 and 4
170313531Sjairo.balart@metempsy.com
170413531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
170513531Sjairo.balart@metempsy.com                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
170613531Sjairo.balart@metempsy.com}
170713531Sjairo.balart@metempsy.com
170813531Sjairo.balart@metempsy.com
170913531Sjairo.balart@metempsy.comsc_signed
171013531Sjairo.balart@metempsy.comoperator - (uint64 u, const sc_signed &v)
171113531Sjairo.balart@metempsy.com{
171213531Sjairo.balart@metempsy.com    if (u == 0) // case 1
171313531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
171413531Sjairo.balart@metempsy.com
171513531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
171613531Sjairo.balart@metempsy.com
171713531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
171813531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
171913531Sjairo.balart@metempsy.com
172013531Sjairo.balart@metempsy.com    // cases 3 and 4
172113531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
172213531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
172313531Sjairo.balart@metempsy.com}
172413531Sjairo.balart@metempsy.com
172513531Sjairo.balart@metempsy.com
172613531Sjairo.balart@metempsy.comsc_signed
172713531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, uint64 v)
172813531Sjairo.balart@metempsy.com{
172913531Sjairo.balart@metempsy.com    if (v == 0) // case 1
173013531Sjairo.balart@metempsy.com        return sc_signed(u);
173113531Sjairo.balart@metempsy.com
173213531Sjairo.balart@metempsy.com    CONVERT_INT64(v);
173313531Sjairo.balart@metempsy.com
173413531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
173513531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
173613531Sjairo.balart@metempsy.com
173713531Sjairo.balart@metempsy.com    // cases 3 and 4
173813531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
173913531Sjairo.balart@metempsy.com                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
174013531Sjairo.balart@metempsy.com}
174113531Sjairo.balart@metempsy.com
174213531Sjairo.balart@metempsy.com
174313531Sjairo.balart@metempsy.comsc_signed
174413531Sjairo.balart@metempsy.comoperator - (uint64 u, const sc_unsigned &v)
174513531Sjairo.balart@metempsy.com{
174613531Sjairo.balart@metempsy.com    if (u == 0) // case 1
174713531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
174813531Sjairo.balart@metempsy.com
174913531Sjairo.balart@metempsy.com    CONVERT_INT64(u);
175013531Sjairo.balart@metempsy.com
175113531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
175213531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
175313531Sjairo.balart@metempsy.com
175413531Sjairo.balart@metempsy.com    // cases 3 and 4
175513531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
175613531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
175713531Sjairo.balart@metempsy.com}
175813531Sjairo.balart@metempsy.com
175913531Sjairo.balart@metempsy.com
176013531Sjairo.balart@metempsy.comsc_signed
176113531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, long v)
176213531Sjairo.balart@metempsy.com{
176313531Sjairo.balart@metempsy.com    if (v == 0) // case 1
176413531Sjairo.balart@metempsy.com        return sc_signed(u);
176513531Sjairo.balart@metempsy.com
176613531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
176713531Sjairo.balart@metempsy.com
176813531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
176913531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
177013531Sjairo.balart@metempsy.com
177113531Sjairo.balart@metempsy.com    // cases 3 and 4
177213531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
177313531Sjairo.balart@metempsy.com                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
177413531Sjairo.balart@metempsy.com}
177513531Sjairo.balart@metempsy.com
177613531Sjairo.balart@metempsy.com
177713531Sjairo.balart@metempsy.comsc_signed
177813531Sjairo.balart@metempsy.comoperator - (long u, const sc_signed &v)
177913531Sjairo.balart@metempsy.com{
178013531Sjairo.balart@metempsy.com    if (u == 0) // case 1
178113531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
178213531Sjairo.balart@metempsy.com
178313531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
178413531Sjairo.balart@metempsy.com
178513531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
178613531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
178713531Sjairo.balart@metempsy.com
178813531Sjairo.balart@metempsy.com    // cases 3 and 4
178913531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
179013531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
179113531Sjairo.balart@metempsy.com}
179213531Sjairo.balart@metempsy.com
179313531Sjairo.balart@metempsy.com
179413531Sjairo.balart@metempsy.comsc_signed
179513531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, long v)
179613531Sjairo.balart@metempsy.com{
179713531Sjairo.balart@metempsy.com    if (v == 0) // case 1
179813531Sjairo.balart@metempsy.com        return sc_signed(u);
179913531Sjairo.balart@metempsy.com
180013531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
180113531Sjairo.balart@metempsy.com
180213531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
180313531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
180413531Sjairo.balart@metempsy.com
180513531Sjairo.balart@metempsy.com    // cases 3 and 4
180613531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
180713531Sjairo.balart@metempsy.com                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
180813531Sjairo.balart@metempsy.com}
180913531Sjairo.balart@metempsy.com
181013531Sjairo.balart@metempsy.com
181113531Sjairo.balart@metempsy.comsc_signed
181213531Sjairo.balart@metempsy.comoperator - (long u, const sc_unsigned &v)
181313531Sjairo.balart@metempsy.com{
181413531Sjairo.balart@metempsy.com    if (u == 0) // case 1
181513531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
181613531Sjairo.balart@metempsy.com
181713531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
181813531Sjairo.balart@metempsy.com
181913531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
182013531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
182113531Sjairo.balart@metempsy.com
182213531Sjairo.balart@metempsy.com    // cases 3 and 4
182313531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
182413531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
182513531Sjairo.balart@metempsy.com}
182613531Sjairo.balart@metempsy.com
182713531Sjairo.balart@metempsy.com
182813531Sjairo.balart@metempsy.comsc_signed
182913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, unsigned long v)
183013531Sjairo.balart@metempsy.com{
183113531Sjairo.balart@metempsy.com    if (v == 0) // case 1
183213531Sjairo.balart@metempsy.com        return sc_signed(u);
183313531Sjairo.balart@metempsy.com
183413531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
183513531Sjairo.balart@metempsy.com
183613531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
183713531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
183813531Sjairo.balart@metempsy.com
183913531Sjairo.balart@metempsy.com    // cases 3 and 4
184013531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
184113531Sjairo.balart@metempsy.com                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
184213531Sjairo.balart@metempsy.com}
184313531Sjairo.balart@metempsy.com
184413531Sjairo.balart@metempsy.com
184513531Sjairo.balart@metempsy.comsc_signed
184613531Sjairo.balart@metempsy.comoperator - (unsigned long u, const sc_signed &v)
184713531Sjairo.balart@metempsy.com{
184813531Sjairo.balart@metempsy.com    if (u == 0) // case 1
184913531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
185013531Sjairo.balart@metempsy.com
185113531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
185213531Sjairo.balart@metempsy.com
185313531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
185413531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
185513531Sjairo.balart@metempsy.com
185613531Sjairo.balart@metempsy.com    // cases 3 and 4
185713531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
185813531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
185913531Sjairo.balart@metempsy.com}
186013531Sjairo.balart@metempsy.com
186113531Sjairo.balart@metempsy.com
186213531Sjairo.balart@metempsy.comsc_signed
186313531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, unsigned long v)
186413531Sjairo.balart@metempsy.com{
186513531Sjairo.balart@metempsy.com    if (v == 0) // case 1
186613531Sjairo.balart@metempsy.com        return sc_signed(u);
186713531Sjairo.balart@metempsy.com
186813531Sjairo.balart@metempsy.com    CONVERT_LONG(v);
186913531Sjairo.balart@metempsy.com
187013531Sjairo.balart@metempsy.com    if (u.sgn == SC_ZERO) // case 2
187113531Sjairo.balart@metempsy.com        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
187213531Sjairo.balart@metempsy.com
187313531Sjairo.balart@metempsy.com    // cases 3 and 4
187413531Sjairo.balart@metempsy.com    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
187513531Sjairo.balart@metempsy.com                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
187613531Sjairo.balart@metempsy.com}
187713531Sjairo.balart@metempsy.com
187813531Sjairo.balart@metempsy.com
187913531Sjairo.balart@metempsy.comsc_signed
188013531Sjairo.balart@metempsy.comoperator - (unsigned long u, const sc_unsigned &v)
188113531Sjairo.balart@metempsy.com{
188213531Sjairo.balart@metempsy.com    if (u == 0) // case 1
188313531Sjairo.balart@metempsy.com        return sc_signed(v, -v.sgn);
188413531Sjairo.balart@metempsy.com
188513531Sjairo.balart@metempsy.com    CONVERT_LONG(u);
188613531Sjairo.balart@metempsy.com
188713531Sjairo.balart@metempsy.com    if (v.sgn == SC_ZERO) // case 2
188813531Sjairo.balart@metempsy.com        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
188913531Sjairo.balart@metempsy.com
189013531Sjairo.balart@metempsy.com    // cases 3 and 4
189113531Sjairo.balart@metempsy.com    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
189213531Sjairo.balart@metempsy.com                             -v.sgn, v.nbits, v.ndigits, v.digit);
189313531Sjairo.balart@metempsy.com}
189413531Sjairo.balart@metempsy.com
189513531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from
189613531Sjairo.balart@metempsy.com// sc_nbcommon.cpp.
189713531Sjairo.balart@metempsy.com
189813531Sjairo.balart@metempsy.com
189913531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
190013531Sjairo.balart@metempsy.com//  SECTION: MULTIPLICATION operators: *, *=
190113531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
190213531Sjairo.balart@metempsy.com
190313531Sjairo.balart@metempsy.com// Cases to consider when computing u * v:
190413531Sjairo.balart@metempsy.com// 1. u * 0 = 0 * v = 0
190513531Sjairo.balart@metempsy.com// 2. 1 * v = v and -1 * v = -v
190613531Sjairo.balart@metempsy.com// 3. u * 1 = u and u * -1 = -u
190713531Sjairo.balart@metempsy.com// 4. u * v = u * v
190813531Sjairo.balart@metempsy.com
190913531Sjairo.balart@metempsy.comsc_signed
191013531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, const sc_signed &v)
191113531Sjairo.balart@metempsy.com{
191213531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
191313531Sjairo.balart@metempsy.com
191413531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
191513531Sjairo.balart@metempsy.com        return sc_signed();
191613531Sjairo.balart@metempsy.com
191713531Sjairo.balart@metempsy.com    // cases 2-4
191813531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
191913531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
192013531Sjairo.balart@metempsy.com}
192113531Sjairo.balart@metempsy.com
192213531Sjairo.balart@metempsy.com
192313531Sjairo.balart@metempsy.comsc_signed
192413531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_unsigned &v)
192513531Sjairo.balart@metempsy.com{
192613531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
192713531Sjairo.balart@metempsy.com
192813531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
192913531Sjairo.balart@metempsy.com        return sc_signed();
193013531Sjairo.balart@metempsy.com
193113531Sjairo.balart@metempsy.com    // cases 2-4
193213531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
193313531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
193413531Sjairo.balart@metempsy.com}
193513531Sjairo.balart@metempsy.com
193613531Sjairo.balart@metempsy.com
193713531Sjairo.balart@metempsy.comsc_signed
193813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_signed &v)
193913531Sjairo.balart@metempsy.com{
194013531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
194113531Sjairo.balart@metempsy.com
194213531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
194313531Sjairo.balart@metempsy.com        return sc_signed();
194413531Sjairo.balart@metempsy.com
194513531Sjairo.balart@metempsy.com    // cases 2-4
194613531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
194713531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
194813531Sjairo.balart@metempsy.com}
194913531Sjairo.balart@metempsy.com
195013531Sjairo.balart@metempsy.com
195113531Sjairo.balart@metempsy.comsc_signed
195213531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, int64 v)
195313531Sjairo.balart@metempsy.com{
195413531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
195513531Sjairo.balart@metempsy.com
195613531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
195713531Sjairo.balart@metempsy.com        return sc_signed();
195813531Sjairo.balart@metempsy.com
195913531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
196013531Sjairo.balart@metempsy.com
196113531Sjairo.balart@metempsy.com    // cases 2-4
196213531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
196313531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
196413531Sjairo.balart@metempsy.com}
196513531Sjairo.balart@metempsy.com
196613531Sjairo.balart@metempsy.com
196713531Sjairo.balart@metempsy.comsc_signed
196813531Sjairo.balart@metempsy.comoperator * (int64 u, const sc_signed &v)
196913531Sjairo.balart@metempsy.com{
197013531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
197113531Sjairo.balart@metempsy.com
197213531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
197313531Sjairo.balart@metempsy.com        return sc_signed();
197413531Sjairo.balart@metempsy.com
197513531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
197613531Sjairo.balart@metempsy.com
197713531Sjairo.balart@metempsy.com    // cases 2-4
197813531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
197913531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
198013531Sjairo.balart@metempsy.com}
198113531Sjairo.balart@metempsy.com
198213531Sjairo.balart@metempsy.com
198313531Sjairo.balart@metempsy.comsc_signed
198413531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, int64 v)
198513531Sjairo.balart@metempsy.com{
198613531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
198713531Sjairo.balart@metempsy.com
198813531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
198913531Sjairo.balart@metempsy.com        return sc_signed();
199013531Sjairo.balart@metempsy.com
199113531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
199213531Sjairo.balart@metempsy.com
199313531Sjairo.balart@metempsy.com    // cases 2-4
199413531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
199513531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
199613531Sjairo.balart@metempsy.com}
199713531Sjairo.balart@metempsy.com
199813531Sjairo.balart@metempsy.com
199913531Sjairo.balart@metempsy.comsc_signed
200013531Sjairo.balart@metempsy.comoperator * (int64 u, const sc_unsigned &v)
200113531Sjairo.balart@metempsy.com{
200213531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
200313531Sjairo.balart@metempsy.com
200413531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
200513531Sjairo.balart@metempsy.com        return sc_signed();
200613531Sjairo.balart@metempsy.com
200713531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
200813531Sjairo.balart@metempsy.com
200913531Sjairo.balart@metempsy.com    // cases 2-4
201013531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
201113531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
201213531Sjairo.balart@metempsy.com}
201313531Sjairo.balart@metempsy.com
201413531Sjairo.balart@metempsy.com
201513531Sjairo.balart@metempsy.comsc_signed
201613531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, uint64 v)
201713531Sjairo.balart@metempsy.com{
201813531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
201913531Sjairo.balart@metempsy.com
202013531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
202113531Sjairo.balart@metempsy.com        return sc_signed();
202213531Sjairo.balart@metempsy.com
202313531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
202413531Sjairo.balart@metempsy.com
202513531Sjairo.balart@metempsy.com    // cases 2-4
202613531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
202713531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
202813531Sjairo.balart@metempsy.com}
202913531Sjairo.balart@metempsy.com
203013531Sjairo.balart@metempsy.com
203113531Sjairo.balart@metempsy.comsc_signed
203213531Sjairo.balart@metempsy.comoperator * (uint64 u, const sc_signed &v)
203313531Sjairo.balart@metempsy.com{
203413531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
203513531Sjairo.balart@metempsy.com
203613531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
203713531Sjairo.balart@metempsy.com        return sc_signed();
203813531Sjairo.balart@metempsy.com
203913531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
204013531Sjairo.balart@metempsy.com
204113531Sjairo.balart@metempsy.com    // cases 2-4
204213531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
204313531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
204413531Sjairo.balart@metempsy.com}
204513531Sjairo.balart@metempsy.com
204613531Sjairo.balart@metempsy.com
204713531Sjairo.balart@metempsy.comsc_signed
204813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, long v)
204913531Sjairo.balart@metempsy.com{
205013531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
205113531Sjairo.balart@metempsy.com
205213531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
205313531Sjairo.balart@metempsy.com        return sc_signed();
205413531Sjairo.balart@metempsy.com
205513531Sjairo.balart@metempsy.com    CONVERT_LONG_2(v);
205613531Sjairo.balart@metempsy.com
205713531Sjairo.balart@metempsy.com    // cases 2-4
205813531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
205913531Sjairo.balart@metempsy.com                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
206013531Sjairo.balart@metempsy.com}
206113531Sjairo.balart@metempsy.com
206213531Sjairo.balart@metempsy.com
206313531Sjairo.balart@metempsy.comsc_signed
206413531Sjairo.balart@metempsy.comoperator * (long u, const sc_signed &v)
206513531Sjairo.balart@metempsy.com{
206613531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
206713531Sjairo.balart@metempsy.com
206813531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
206913531Sjairo.balart@metempsy.com        return sc_signed();
207013531Sjairo.balart@metempsy.com
207113531Sjairo.balart@metempsy.com    CONVERT_LONG_2(u);
207213531Sjairo.balart@metempsy.com
207313531Sjairo.balart@metempsy.com    // cases 2-4
207413531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
207513531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
207613531Sjairo.balart@metempsy.com}
207713531Sjairo.balart@metempsy.com
207813531Sjairo.balart@metempsy.com
207913531Sjairo.balart@metempsy.comsc_signed
208013531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, long v)
208113531Sjairo.balart@metempsy.com{
208213531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
208313531Sjairo.balart@metempsy.com
208413531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
208513531Sjairo.balart@metempsy.com        return sc_signed();
208613531Sjairo.balart@metempsy.com
208713531Sjairo.balart@metempsy.com    CONVERT_LONG_2(v);
208813531Sjairo.balart@metempsy.com
208913531Sjairo.balart@metempsy.com    // cases 2-4
209013531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
209113531Sjairo.balart@metempsy.com                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
209213531Sjairo.balart@metempsy.com}
209313531Sjairo.balart@metempsy.com
209413531Sjairo.balart@metempsy.com
209513531Sjairo.balart@metempsy.comsc_signed
209613531Sjairo.balart@metempsy.comoperator * (long u, const sc_unsigned &v)
209713531Sjairo.balart@metempsy.com{
209813531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
209913531Sjairo.balart@metempsy.com
210013531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
210113531Sjairo.balart@metempsy.com        return sc_signed();
210213531Sjairo.balart@metempsy.com
210313531Sjairo.balart@metempsy.com    CONVERT_LONG_2(u);
210413531Sjairo.balart@metempsy.com
210513531Sjairo.balart@metempsy.com    // cases 2-4
210613531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
210713531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
210813531Sjairo.balart@metempsy.com}
210913531Sjairo.balart@metempsy.com
211013531Sjairo.balart@metempsy.com
211113531Sjairo.balart@metempsy.comsc_signed
211213531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, unsigned long v)
211313531Sjairo.balart@metempsy.com{
211413531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
211513531Sjairo.balart@metempsy.com
211613531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
211713531Sjairo.balart@metempsy.com        return sc_signed();
211813531Sjairo.balart@metempsy.com
211913531Sjairo.balart@metempsy.com    CONVERT_LONG_2(v);
212013531Sjairo.balart@metempsy.com
212113531Sjairo.balart@metempsy.com    // else cases 2-4
212213531Sjairo.balart@metempsy.com    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
212313531Sjairo.balart@metempsy.com                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
212413531Sjairo.balart@metempsy.com}
212513531Sjairo.balart@metempsy.com
212613531Sjairo.balart@metempsy.comsc_signed
212713531Sjairo.balart@metempsy.comoperator * (unsigned long u, const sc_signed &v)
212813531Sjairo.balart@metempsy.com{
212913531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
213013531Sjairo.balart@metempsy.com
213113531Sjairo.balart@metempsy.com    if (s == SC_ZERO) // case 1
213213531Sjairo.balart@metempsy.com        return sc_signed();
213313531Sjairo.balart@metempsy.com
213413531Sjairo.balart@metempsy.com    CONVERT_LONG_2(u);
213513531Sjairo.balart@metempsy.com
213613531Sjairo.balart@metempsy.com    // cases 2-4
213713531Sjairo.balart@metempsy.com    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
213813531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
213913531Sjairo.balart@metempsy.com}
214013531Sjairo.balart@metempsy.com
214113531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from
214213531Sjairo.balart@metempsy.com// sc_nbcommon.cpp.
214313531Sjairo.balart@metempsy.com
214413531Sjairo.balart@metempsy.com
214513531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
214613531Sjairo.balart@metempsy.com//  SECTION: DIVISION operators: /, /=
214713531Sjairo.balart@metempsy.com// ----------------------------------------------------------------------------
214813531Sjairo.balart@metempsy.com
214913531Sjairo.balart@metempsy.com// Cases to consider when finding the quotient q = floor(u/v):
215013531Sjairo.balart@metempsy.com// Note that u = q * v + r for r < q.
215113531Sjairo.balart@metempsy.com// 1. 0 / 0 or u / 0 => error
215213531Sjairo.balart@metempsy.com// 2. 0 / v => 0 = 0 * v + 0
215313531Sjairo.balart@metempsy.com// 3. u / v & &u = v => u = 1 * u + 0  - u or v can be 1 or -1
215413531Sjairo.balart@metempsy.com// 4. u / v & &u < v => u = 0 * v + u  - u can be 1 or -1
215513531Sjairo.balart@metempsy.com// 5. u / v & &u > v => u = q * v + r  - v can be 1 or -1
215613531Sjairo.balart@metempsy.com
215713531Sjairo.balart@metempsy.comsc_signed
215813531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, const sc_signed &v)
215913531Sjairo.balart@metempsy.com{
216013531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
216113531Sjairo.balart@metempsy.com
216213531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
216313531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
216413531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
216513531Sjairo.balart@metempsy.com    }
216613531Sjairo.balart@metempsy.com
216713531Sjairo.balart@metempsy.com    // other cases
216813531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
216913531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
217013531Sjairo.balart@metempsy.com}
217113531Sjairo.balart@metempsy.com
217213531Sjairo.balart@metempsy.com
217313531Sjairo.balart@metempsy.comsc_signed
217413531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_unsigned &v)
217513531Sjairo.balart@metempsy.com{
217613531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
217713531Sjairo.balart@metempsy.com
217813531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
217913531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
218013531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
218113531Sjairo.balart@metempsy.com    }
218213531Sjairo.balart@metempsy.com
218313531Sjairo.balart@metempsy.com    // other cases
218413531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
218513531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
218613531Sjairo.balart@metempsy.com}
218713531Sjairo.balart@metempsy.com
218813531Sjairo.balart@metempsy.com
218913531Sjairo.balart@metempsy.comsc_signed
219013531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_signed &v)
219113531Sjairo.balart@metempsy.com{
219213531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, v.sgn);
219313531Sjairo.balart@metempsy.com
219413531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
219513531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
219613531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
219713531Sjairo.balart@metempsy.com    }
219813531Sjairo.balart@metempsy.com
219913531Sjairo.balart@metempsy.com    // other cases
220013531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
220113531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
220213531Sjairo.balart@metempsy.com}
220313531Sjairo.balart@metempsy.com
220413531Sjairo.balart@metempsy.com
220513531Sjairo.balart@metempsy.comsc_signed
220613531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, int64 v)
220713531Sjairo.balart@metempsy.com{
220813531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
220913531Sjairo.balart@metempsy.com
221013531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
221113531Sjairo.balart@metempsy.com        div_by_zero(v); // case 1
221213531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
221313531Sjairo.balart@metempsy.com    }
221413531Sjairo.balart@metempsy.com
221513531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
221613531Sjairo.balart@metempsy.com
221713531Sjairo.balart@metempsy.com    // other cases
221813531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
221913531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
222013531Sjairo.balart@metempsy.com}
222113531Sjairo.balart@metempsy.com
222213531Sjairo.balart@metempsy.com
222313531Sjairo.balart@metempsy.comsc_signed
222413531Sjairo.balart@metempsy.comoperator / (int64 u, const sc_signed &v)
222513531Sjairo.balart@metempsy.com{
222613531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
222713531Sjairo.balart@metempsy.com
222813531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
222913531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
223013531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
223113531Sjairo.balart@metempsy.com    }
223213531Sjairo.balart@metempsy.com
223313531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
223413531Sjairo.balart@metempsy.com
223513531Sjairo.balart@metempsy.com    // other cases
223613531Sjairo.balart@metempsy.com    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
223713531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
223813531Sjairo.balart@metempsy.com}
223913531Sjairo.balart@metempsy.com
224013531Sjairo.balart@metempsy.com
224113531Sjairo.balart@metempsy.comsc_signed
224213531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, int64 v)
224313531Sjairo.balart@metempsy.com{
224413531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
224513531Sjairo.balart@metempsy.com
224613531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
224713531Sjairo.balart@metempsy.com        div_by_zero(v); // case 1
224813531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
224913531Sjairo.balart@metempsy.com    }
225013531Sjairo.balart@metempsy.com
225113531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
225213531Sjairo.balart@metempsy.com
225313531Sjairo.balart@metempsy.com    // other cases
225413531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
225513531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
225613531Sjairo.balart@metempsy.com}
225713531Sjairo.balart@metempsy.com
225813531Sjairo.balart@metempsy.com
225913531Sjairo.balart@metempsy.comsc_signed
226013531Sjairo.balart@metempsy.comoperator / (int64 u, const sc_unsigned &v)
226113531Sjairo.balart@metempsy.com{
226213531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
226313531Sjairo.balart@metempsy.com
226413531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
226513531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
226613531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
226713531Sjairo.balart@metempsy.com    }
226813531Sjairo.balart@metempsy.com
226913531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
227013531Sjairo.balart@metempsy.com
227113531Sjairo.balart@metempsy.com    // other cases
227213531Sjairo.balart@metempsy.com    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
227313531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
227413531Sjairo.balart@metempsy.com}
227513531Sjairo.balart@metempsy.com
227613531Sjairo.balart@metempsy.com
227713531Sjairo.balart@metempsy.comsc_signed
227813531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, uint64 v)
227913531Sjairo.balart@metempsy.com{
228013531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
228113531Sjairo.balart@metempsy.com
228213531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
228313531Sjairo.balart@metempsy.com        div_by_zero(v); // case 1
228413531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
228513531Sjairo.balart@metempsy.com    }
228613531Sjairo.balart@metempsy.com
228713531Sjairo.balart@metempsy.com    CONVERT_INT64_2(v);
228813531Sjairo.balart@metempsy.com
228913531Sjairo.balart@metempsy.com    // other cases
229013531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
229113531Sjairo.balart@metempsy.com                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
229213531Sjairo.balart@metempsy.com}
229313531Sjairo.balart@metempsy.com
229413531Sjairo.balart@metempsy.com
229513531Sjairo.balart@metempsy.comsc_signed
229613531Sjairo.balart@metempsy.comoperator / (uint64 u, const sc_signed &v)
229713531Sjairo.balart@metempsy.com{
229813531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
229913531Sjairo.balart@metempsy.com
230013531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
230113531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
230213531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
230313531Sjairo.balart@metempsy.com
230413531Sjairo.balart@metempsy.com    }
230513531Sjairo.balart@metempsy.com
230613531Sjairo.balart@metempsy.com    CONVERT_INT64_2(u);
230713531Sjairo.balart@metempsy.com
230813531Sjairo.balart@metempsy.com    // other cases
230913531Sjairo.balart@metempsy.com    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
231013531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
231113531Sjairo.balart@metempsy.com}
231213531Sjairo.balart@metempsy.com
231313531Sjairo.balart@metempsy.com
231413531Sjairo.balart@metempsy.comsc_signed
231513531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, long v)
231613531Sjairo.balart@metempsy.com{
231713531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
231813531Sjairo.balart@metempsy.com
231913531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
232013531Sjairo.balart@metempsy.com        div_by_zero(v); // case 1
232113531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
232213531Sjairo.balart@metempsy.com    }
232313531Sjairo.balart@metempsy.com
232413531Sjairo.balart@metempsy.com    CONVERT_LONG_2(v);
232513531Sjairo.balart@metempsy.com
232613531Sjairo.balart@metempsy.com    // other cases
232713531Sjairo.balart@metempsy.com    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
232813531Sjairo.balart@metempsy.com                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
232913531Sjairo.balart@metempsy.com}
233013531Sjairo.balart@metempsy.com
233113531Sjairo.balart@metempsy.com
233213531Sjairo.balart@metempsy.comsc_signed
233313531Sjairo.balart@metempsy.comoperator / (long u, const sc_signed &v)
233413531Sjairo.balart@metempsy.com{
233513531Sjairo.balart@metempsy.com    small_type s = mul_signs(v.sgn, get_sign(u));
233613531Sjairo.balart@metempsy.com
233713531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
233813531Sjairo.balart@metempsy.com        div_by_zero(v.sgn); // case 1
233913531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
234013531Sjairo.balart@metempsy.com    }
234113531Sjairo.balart@metempsy.com
234213531Sjairo.balart@metempsy.com    CONVERT_LONG_2(u);
234313531Sjairo.balart@metempsy.com
234413531Sjairo.balart@metempsy.com    // other cases
234513531Sjairo.balart@metempsy.com    return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
234613531Sjairo.balart@metempsy.com                             v.nbits, v.ndigits, v.digit);
234713531Sjairo.balart@metempsy.com}
234813531Sjairo.balart@metempsy.com
234913531Sjairo.balart@metempsy.com
235013531Sjairo.balart@metempsy.comsc_signed
235113531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, long v)
235213531Sjairo.balart@metempsy.com{
235313531Sjairo.balart@metempsy.com    small_type s = mul_signs(u.sgn, get_sign(v));
235413531Sjairo.balart@metempsy.com
235513531Sjairo.balart@metempsy.com    if (s == SC_ZERO) {
235613531Sjairo.balart@metempsy.com        div_by_zero(v); // case 1
235713531Sjairo.balart@metempsy.com        return sc_signed(); // case 2
235813531Sjairo.balart@metempsy.com    }
235913531Sjairo.balart@metempsy.com
236013531Sjairo.balart@metempsy.com    CONVERT_LONG_2(v);
236113531Sjairo.balart@metempsy.com
236213531Sjairo.balart@metempsy.com    // 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
3984