/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_signed.cpp -- Arbitrary precision signed arithmetic.

                   This file includes the definitions of sc_signed_bitref,
                   sc_signed_subref, and sc_signed classes. The first two
                   classes are proxy classes to reference one bit and a range
                   of bits of a sc_signed number, respectively. This file also
                   includes sc_nbcommon.cpp and sc_nbfriends.cpp, which
                   contain the definitions shared by sc_unsigned.

  Original Author: Ali Dasdan, Synopsys, Inc.

 *****************************************************************************/

/*****************************************************************************

  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
  changes you are making here.

      Name, Affiliation, Date:
  Description of Modification:

 *****************************************************************************/


// $Log: sc_signed.cpp,v $
// Revision 1.6  2011/02/18 20:19:15  acg
//  Andy Goodrich: updating Copyright notice.
//
// Revision 1.5  2008/12/10 20:38:45  acg
//  Andy Goodrich: fixed conversion of double values to the digits vector.
//  The bits above the radix were not being masked off.
//
// Revision 1.4  2008/06/19 17:47:56  acg
//  Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
//
// Revision 1.3  2008/04/29 21:20:41  acg
//  Andy Goodrich: added mask to first word transferred when processing
//  a negative sc_signed value in sc_signed::concat_get_data().
//
// Revision 1.2  2007/11/04 21:27:00  acg
//  Andy Goodrich: changes to make sure the proper value is returned from
//  concat_get_data().
//
// Revision 1.1.1.1  2006/12/15 20:20:05  acg
// SystemC 2.3
//
// Revision 1.5  2006/10/23 19:32:47  acg
//  Andy Goodrich: further fix for incorrect value being returned from
//  concat_get_data. This one is in the non-aligned value code.
//
// Revision 1.3  2006/01/13 18:49:32  acg
// Added $Log command so that CVS check in comments are reproduced in the
// source.
//

#include <cctype>
#include <cmath>
#include <sstream>

#include "systemc/ext/dt/bit/sc_bv_base.hh"
#include "systemc/ext/dt/bit/sc_lv_base.hh"
#include "systemc/ext/dt/fx/sc_fix.hh"
#include "systemc/ext/dt/fx/scfx_other_defs.hh"
#include "systemc/ext/dt/int/sc_int_base.hh"
#include "systemc/ext/dt/int/sc_signed.hh"
#include "systemc/ext/dt/int/sc_uint_base.hh"
#include "systemc/ext/dt/int/sc_unsigned.hh"
#include "systemc/ext/dt/misc/sc_concatref.hh"

// explicit template instantiations
namespace sc_core
{

template class sc_vpool<sc_dt::sc_signed_bitref>;
template class sc_vpool<sc_dt::sc_signed_subref>;

} // namespace sc_core

namespace sc_dt
{

// Pool of temporary instances:

sc_core::sc_vpool<sc_signed_bitref> sc_signed_bitref::m_pool(9);
sc_core::sc_vpool<sc_signed_subref> sc_signed_subref::m_pool(9);

void
sc_signed::invalid_init(const char *type_name, int nb) const
{
    std::stringstream msg;
    msg << "sc_signed("<< type_name << ") : nb = " << nb << " is not valid";
    SC_REPORT_ERROR("initialization failed", msg.str().c_str());
}

// ----------------------------------------------------------------------------
// SECTION: Public members - Invalid selections.
// ----------------------------------------------------------------------------

void
sc_signed::invalid_index(int i) const
{
    std::stringstream msg;
    msg << "sc_bigint bit selection: index = " << i << " violates "
           "0 <= index <= " << (nbits - 1);
    SC_REPORT_ERROR("(E5) out of bounds", msg.str().c_str());
    sc_core::sc_abort(); // can't recover from here
}

void
sc_signed::invalid_range(int l, int r) const
{
    std::stringstream msg;
    msg << "sc_bigint part selection: left = " <<
           l << ", right = " << r << " \n"
           "  violates either (" << (nbits-1) << " >= left >= 0) or "
           "(" << (nbits-1) << " >= right >= 0)";
    SC_REPORT_ERROR("(E5) out of bounds", msg.str().c_str());
    sc_core::sc_abort(); // can't recover from here
}


// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
//  SECTION: Public members.
// ----------------------------------------------------------------------------

// Most public members are included from sc_nbcommon.inc. However, some
// concatenation support appears here to optimize between the signed and
// unsigned cases.

// Insert this object's value at the specified place in a vector of biguint
// style values.

bool
sc_signed::concat_get_ctrl(sc_digit *dst_p, int low_i) const
{
    int dst_i; // Index to next word to set in dst_p.
    int end_i; // Index of high order word to set.
    int left_shift; // Amount to shift value left.
    sc_digit mask; // Mask for partial word sets.

    // CALCULATE METRICS FOR DATA MOVEMENT:
    dst_i = low_i / BITS_PER_DIGIT;
    end_i = (low_i + nbits - 1) / BITS_PER_DIGIT;
    left_shift = low_i % BITS_PER_DIGIT;

    // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
    mask = ~(~0U << left_shift);
    dst_p[dst_i] = (dst_p[dst_i] & ~mask);
    dst_i++;

    for (; dst_i <= end_i; dst_i++)
        dst_p[dst_i] = 0;

    return false;
}

bool
sc_signed::concat_get_data(sc_digit *dst_p, int low_i) const
{
    sc_digit carry; // Carry bit for complements.
    int dst_i; // Index to next word to set in dst_p.
    int end_i; // Index of high order word to set.
    int high_i; // Index w/in word of high order bit.
    int left_shift; // Amount to shift value left.
    sc_digit left_word; // High word component for set.
    sc_digit mask; // Mask for partial word sets.
    bool result; // True if inserted non-zero data.
    int right_shift; // Amount to shift value right.
    sc_digit right_word; // Low word component for set.
    int src_i; // Index to next word to get from digit.

    // CALCULATE METRICS FOR DATA MOVEMENT:
    dst_i = low_i / BITS_PER_DIGIT;
    high_i = low_i + nbits - 1;
    end_i = high_i / BITS_PER_DIGIT;
    left_shift = low_i % BITS_PER_DIGIT;

    switch (sgn) {
      // POSITIVE SOURCE VALUE:
      case SC_POS:
        result = true;

        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
        if (dst_i == end_i) {
            mask = ~(~0U << left_shift);
            dst_p[dst_i] = ((dst_p[dst_i] & mask) |
                (digit[0] << left_shift)) & DIGIT_MASK;

        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
        } else if (left_shift == 0) {
            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
                dst_p[dst_i] = digit[src_i];
            }
            high_i = high_i % BITS_PER_DIGIT;
            mask = ~(~1U << high_i) & DIGIT_MASK;
            dst_p[dst_i] = digit[src_i] & mask;

        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
        } else {
            high_i = high_i % BITS_PER_DIGIT;
            right_shift = BITS_PER_DIGIT - left_shift;
            mask = ~(~0U << left_shift);
            right_word = digit[0];
            dst_p[dst_i] = (dst_p[dst_i] & mask) |
                ((right_word << left_shift) & DIGIT_MASK);
            for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
                left_word = digit[src_i];
                dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
                    (right_word >> right_shift);
                right_word = left_word;
            }
            left_word = (src_i < ndigits) ? digit[src_i] : 0;
            mask = ~(~1U << high_i) & DIGIT_MASK;
            dst_p[dst_i] = ((left_word << left_shift) |
                (right_word >> right_shift)) & mask;
        }
        break;

      // SOURCE VALUE IS NEGATIVE:
      case SC_NEG:
        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
        result = true;
        if (dst_i == end_i) {
            mask = ~(~0U << nbits);
            right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
            mask = ~(~0U << left_shift);
            dst_p[dst_i] = ((dst_p[dst_i] & mask) |
                (right_word << left_shift)) & DIGIT_MASK;

        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
        } else if (left_shift == 0) {
            carry = 1;
            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
                right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
                dst_p[dst_i] = right_word &  DIGIT_MASK;
                carry = right_word >> BITS_PER_DIGIT;
            }
            high_i = high_i % BITS_PER_DIGIT;
            mask = (~(~1U << high_i)) & DIGIT_MASK;
            right_word = (src_i < ndigits) ?
                (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
            dst_p[dst_i] = right_word & mask;

        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
        } else {
            high_i = high_i % BITS_PER_DIGIT;
            right_shift = BITS_PER_DIGIT - left_shift;
            mask = ~(~0U << left_shift);
            carry = 1;
            right_word = (digit[0] ^ DIGIT_MASK) + carry;
            dst_p[dst_i] = (dst_p[dst_i] & mask) |
                ((right_word << left_shift) & DIGIT_MASK);
            carry = right_word >> BITS_PER_DIGIT;
            right_word &= DIGIT_MASK;
            for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
                left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
                dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
                    (right_word >> right_shift);
                carry = left_word >> BITS_PER_DIGIT;
                right_word = left_word & DIGIT_MASK;
            }
            left_word = (src_i < ndigits) ?
                (digit[src_i] ^ DIGIT_MASK) + carry : carry;
            mask = ~(~1U << high_i) & DIGIT_MASK;
            dst_p[dst_i] = ((left_word << left_shift) |
                (right_word >> right_shift)) & mask;
        }
        break;

      // VALUE IS ZERO:
      default:
        result = false;
        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
        if (dst_i == end_i) {
            mask = ~(~0U << nbits) << left_shift;
            dst_p[dst_i] = dst_p[dst_i] & ~mask;

        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
        } else if (left_shift == 0) {
            for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
                dst_p[dst_i] = 0;
            }
            dst_p[dst_i] = 0;

        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
        } else {
            mask = ~(~0U << left_shift);
            dst_p[dst_i] = (dst_p[dst_i] & mask);
            for (dst_i++; dst_i <= end_i; dst_i++) {
                dst_p[dst_i] = 0;
            }
        }
        break;
    }
    return result;
}

// Return this object instance's bits as a uint64 without sign extension.

uint64
sc_signed::concat_get_uint64() const
{
    uint64        result;
    switch (sgn) {
      case SC_POS:
        result = 0;
        if (ndigits > 2)
            result = digit[2];
        if (ndigits > 1)
            result = (result << BITS_PER_DIGIT) | digit[1];
        result = (result << BITS_PER_DIGIT) | digit[0];
        break;
      case SC_NEG:
        result = 0;
        if (ndigits > 2)
            result = digit[2];
        if (ndigits > 1)
            result = (result << BITS_PER_DIGIT) | digit[1];
        result = (result << BITS_PER_DIGIT) | digit[0];
        result = -result;
        if (nbits < 64) {
            uint64 mask = ~0;
            result = result & ~(mask << nbits);
        }
        break;
      default:
        result = 0;
        break;
    }
    return result;
}

// #### OPTIMIZE
void
sc_signed::concat_set(int64 src, int low_i)
{
    *this = (low_i < 64) ? src >> low_i : src >> 63;
}

void
sc_signed::concat_set(const sc_signed &src, int low_i)
{
    if (low_i < src.length())
        *this = src >> low_i;
    else
        *this = (src<0) ? (int_type)-1 : 0;
}

void
sc_signed::concat_set(const sc_unsigned &src, int low_i)
{
    if (low_i < src.length())
        *this = src >> low_i;
    else
        *this = 0;
}

void
sc_signed::concat_set(uint64 src, int low_i)
{
    *this = (low_i < 64) ? src >> low_i : 0;
}

// ----------------------------------------------------------------------------
//  SECTION: Public members - Reduction methods.
// ----------------------------------------------------------------------------

bool
sc_signed::and_reduce() const
{
    sc_digit current; // Current digit examining.
    int i; // Index of digit examining.

    if (sgn == SC_NEG) {
        current = (1 << BITS_PER_DIGIT);
        for (i = 0; i < ndigits-1; i++) {
            current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
            if ((current & DIGIT_MASK) != DIGIT_MASK) return false;
        }
        current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK);
        if ((current & ~(~0U << (nbits % BITS_PER_DIGIT))) ==
             static_cast<sc_digit>(~(~0U << (nbits % BITS_PER_DIGIT)))) {
            return true;
        }
    }
    return false;
}

bool
sc_signed::or_reduce() const
{
    return sgn == SC_ZERO ? false : true;
}

bool
sc_signed::xor_reduce() const
{
    int i; // Digit examining.
    int odd; // Flag for odd number of digits.

    odd = 0;
    for (i = 0; i < nbits; i++)
        if (test(i))
            odd = ~odd;
    return odd ? true : false;
}



// ----------------------------------------------------------------------------
//  SECTION: Public members - Assignment operators.
// ----------------------------------------------------------------------------

// assignment operators

const sc_signed &
sc_signed::operator = (const char *a)
{
    if (a == 0) {
        SC_REPORT_ERROR("conversion failed",
                        "character string is zero");
    } else if (*a == 0) {
        SC_REPORT_ERROR("conversion failed",
                        "character string is empty");
    } else try {
        int len = length();
        sc_fix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
        return this->operator = (aa);
    } catch(const sc_core::sc_report &) {
        std::stringstream msg;
        msg << "character string '" << a << "' is not valid";
        SC_REPORT_ERROR("conversion failed", msg.str().c_str());
    }
    return *this;
}

const sc_signed &
sc_signed::operator=(int64 v)
{
    sgn = get_sign(v);
    // v >= 0 now.
    if (sgn == SC_ZERO) {
        vec_zero(ndigits, digit);
    } else {
        from_uint(ndigits, digit, (uint64)v);
        if (nbits <= (int)BITS_PER_INT64)
            convert_SM_to_2C_to_SM();
    }
    return *this;
}

const sc_signed &
sc_signed::operator=(uint64 v)
{
    sgn = get_sign(v);
    if (sgn == SC_ZERO) {
        vec_zero(ndigits, digit);
    } else {
        from_uint(ndigits, digit, v);
        if (nbits <= (int)BITS_PER_INT64)
            convert_SM_to_2C_to_SM();
    }
    return *this;
}

const sc_signed &
sc_signed::operator=(long v)
{
    sgn = get_sign(v);
    // v >= 0 now.
    if (sgn == SC_ZERO) {
        vec_zero(ndigits, digit);
    } else {
        from_uint(ndigits, digit, (unsigned long)v);
        if (nbits <= (int)BITS_PER_LONG)
            convert_SM_to_2C_to_SM();
    }
    return *this;
}

const sc_signed &
sc_signed::operator=(unsigned long v)
{
    sgn = get_sign(v);
    if (sgn == SC_ZERO) {
        vec_zero(ndigits, digit);
    } else {
        from_uint(ndigits, digit, v);
        if (nbits <= (int)BITS_PER_LONG)
            convert_SM_to_2C_to_SM();
    }
    return *this;
}

const sc_signed &
sc_signed::operator=(double v)
{
    is_bad_double(v);
    if (v < 0) {
        v = -v;
        sgn = SC_NEG;
    } else {
      sgn = SC_POS;
    }

    int i = 0;
    while (std::floor(v) && (i < ndigits)) {
        digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) &
                                           DIGIT_MASK;
        v /= DIGIT_RADIX;
    }
    vec_zero(i, ndigits, digit);
    convert_SM_to_2C_to_SM();
    return *this;
}


// ----------------------------------------------------------------------------

const sc_signed &
sc_signed::operator = (const sc_bv_base &v)
{
    int minlen = sc_min(nbits, v.length());
    int i = 0;
    for (; i < minlen; ++i) {
        safe_set(i, v.get_bit(i), digit);
    }
    for (; i < nbits; ++i) {
        safe_set(i, 0, digit); // zero-extend
    }
    convert_2C_to_SM();
    return *this;
}

const sc_signed &
sc_signed::operator = (const sc_lv_base &v)
{
    int minlen = sc_min(nbits, v.length());
    int i = 0;
    for (; i < minlen; ++i) {
        safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit);
    }
    for (; i < nbits; ++i) {
        safe_set(i, 0, digit);  // zero-extend
    }
    convert_2C_to_SM();
    return *this;
}


// explicit conversion to character string
const std::string
sc_signed::to_string(sc_numrep numrep) const
{
    int len = length();
    sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
    return aa.to_string(numrep);
}

const std::string
sc_signed::to_string(sc_numrep numrep, bool w_prefix) const
{
    int len = length();
    sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
    return aa.to_string(numrep, w_prefix);
}


// ----------------------------------------------------------------------------
//  SECTION: Interfacing with sc_int_base
// ----------------------------------------------------------------------------

const sc_signed &
sc_signed::operator = (const sc_int_base &v)
{
    return operator = ((int64)v);
}


sc_signed
operator + (const sc_unsigned &u, const sc_int_base &v)
{
    return operator + (u, static_cast<int64>(v));
}

sc_signed
operator + (const sc_int_base &u, const sc_unsigned &v)
{
    return operator + (static_cast<int64>(u), v);
}

sc_signed
operator + (const sc_signed &u, const sc_int_base &v)
{
    return operator + (u, (int64)v);
}

sc_signed
operator + (const sc_int_base &u, const sc_signed &v)
{
    return operator + ((int64)u, v);
}

const sc_signed &
sc_signed::operator += (const sc_int_base &v)
{
    return operator += ((int64)v);
}


sc_signed
operator - (const sc_unsigned &u, const sc_int_base &v)
{
    return operator - (u, (int64)v);
}

sc_signed
operator - (const sc_int_base &u, const sc_unsigned &v)
{
    return operator - ((int64)u, v);
}

sc_signed
operator - (const sc_signed &u, const sc_int_base &v)
{
    return operator - (u, (int64)v);
}

sc_signed
operator - (const sc_int_base &u, const sc_signed &v)
{
    return operator - ((int64)u, v);
}

const sc_signed &
sc_signed::operator -= (const sc_int_base &v)
{
    return operator -= ((int64)v);
}


sc_signed
operator * (const sc_unsigned &u, const sc_int_base &v)
{
    return operator * (u, static_cast<int64>(v));
}

sc_signed
operator * (const sc_int_base &u, const sc_unsigned &v)
{
    return operator * (static_cast<int64>(u), v);
}

sc_signed
operator * (const sc_signed &u, const sc_int_base &v)
{
    return operator * (u, (int64)v);
}

sc_signed
operator * (const sc_int_base &u, const sc_signed &v)
{
    return operator * ((int64)u, v);
}

const sc_signed &
sc_signed::operator *= (const sc_int_base &v)
{
    return operator *= ((int64)v);
}


sc_signed
operator / (const sc_unsigned &u, const sc_int_base &v)
{
    return operator / (u, static_cast<int64>(v));
}

sc_signed
operator / (const sc_int_base &u, const sc_unsigned &v)
{
    return operator / (static_cast<int64>(u), v);
}

sc_signed
operator / (const sc_signed &u, const sc_int_base &v)
{
    return operator / (u, (int64)v);
}

sc_signed
operator / (const sc_int_base &u, const sc_signed &v)
{
    return operator / ((int64)u, v);
}

const sc_signed &
sc_signed::operator /= (const sc_int_base &v)
{
    return operator /= ((int64)v);
}


sc_signed
operator % (const sc_unsigned &u, const sc_int_base &v)
{
    return operator % (u, static_cast<int64>(v));
}

sc_signed
operator % (const sc_int_base &u, const sc_unsigned &v)
{
    return operator % (static_cast<int64>(u), v);
}

sc_signed
operator % (const sc_signed &u, const sc_int_base &v)
{
    return operator % (u, (int64)v);
}

sc_signed
operator % (const sc_int_base &u, const sc_signed &v)
{
    return operator % ((int64)u, v);
}

const sc_signed &
sc_signed::operator %= (const sc_int_base &v)
{
    return operator %= ((int64)v);
}


sc_signed
operator & (const sc_unsigned &u, const sc_int_base &v)
{
    return operator & (u, static_cast<int64>(v));
}

sc_signed
operator & (const sc_int_base &u, const sc_unsigned &v)
{
    return operator & (static_cast<int64>(u), v);
}

sc_signed
operator & (const sc_signed &u, const sc_int_base &v)
{
    return operator & (u, (int64)v);
}

sc_signed
operator & (const sc_int_base &u, const sc_signed &v)
{
    return operator & ((int64)u, v);
}

const sc_signed &
sc_signed::operator &= (const sc_int_base &v)
{
    return operator &= ((int64)v);
}


sc_signed
operator | (const sc_unsigned &u, const sc_int_base &v)
{
    return operator | (u, static_cast<int64>(v));
}

sc_signed
operator | (const sc_int_base &u, const sc_unsigned &v)
{
    return operator | (static_cast<int64>(u), v);
}

sc_signed
operator | (const sc_signed& u, const sc_int_base &v)
{
    return operator|(u, (int64)v);
}

sc_signed
operator | (const sc_int_base &u, const sc_signed &v)
{
    return operator | ((int64)u, v);
}

const sc_signed &
sc_signed::operator |= (const sc_int_base &v)
{
    return operator |= ((int64)v);
}


sc_signed
operator ^ (const sc_unsigned &u, const sc_int_base &v)
{
    return operator ^ (u, static_cast<int64>(v));
}

sc_signed
operator ^ (const sc_int_base &u, const sc_unsigned &v)
{
    return operator ^ (static_cast<int64>(u), v);
}

sc_signed
operator ^ (const sc_signed &u, const sc_int_base &v)
{
    return operator ^ (u, (int64)v);
}

sc_signed
operator ^ (const sc_int_base &u, const sc_signed &v)
{
    return operator ^ ((int64)u, v);
}

const sc_signed &
sc_signed::operator ^= (const sc_int_base &v)
{
    return operator ^= ((int64)v);
}


sc_signed
operator << (const sc_signed &u, const sc_int_base &v)
{
    return operator << (u, (int64)v);
}

const sc_signed &
sc_signed::operator <<= (const sc_int_base &v)
{
    return operator <<= ((int64)v);
}


sc_signed
operator >> (const sc_signed &u, const sc_int_base &v)
{
    return operator >> (u, (int64)v);
}

const sc_signed &
sc_signed::operator >>= (const sc_int_base &v)
{
    return operator >>= ((int64)v);
}


bool
operator == (const sc_signed &u, const sc_int_base &v)
{
    return operator == (u, (int64)v);
}

bool
operator == (const sc_int_base &u, const sc_signed &v)
{
    return operator == ((int64)u, v);
}


bool
operator != (const sc_signed &u, const sc_int_base &v)
{
    return operator != (u, (int64)v);
}

bool
operator != (const sc_int_base &u, const sc_signed &v)
{
    return operator != ((int64)u, v);
}


bool
operator < (const sc_signed &u, const sc_int_base &v)
{
    return operator < (u, (int64)v);
}

bool
operator  <  (const sc_int_base &u, const sc_signed &v)
{
    return operator < ((int64)u, v);
}


bool
operator  <=  (const sc_signed &u, const sc_int_base &v)
{
    return operator <= (u, (int64)v);
}

bool
operator  <=  (const sc_int_base &u, const sc_signed &v)
{
    return operator <= ((int64)u, v);
}


bool
operator  >  (const sc_signed &u, const sc_int_base &v)
{
    return operator > (u, (int64)v);
}

bool
operator  >  (const sc_int_base &u, const sc_signed &v)
{
    return operator > ((int64)u, v);
}


bool
operator  >=  (const sc_signed &u, const sc_int_base &v)
{
    return operator >= (u, (int64)v);
}

bool
operator  >=  (const sc_int_base &u, const sc_signed &v)
{
    return operator >= ((int64)u, v);
}


// ----------------------------------------------------------------------------
//  SECTION: Interfacing with sc_uint_base
// ----------------------------------------------------------------------------

const sc_signed &
sc_signed::operator = (const sc_uint_base &v)
{
    return operator = ((uint64)v);
}


sc_signed
operator + (const sc_signed &u, const sc_uint_base &v)
{
    return operator + (u, (uint64)v);
}

sc_signed
operator + (const sc_uint_base &u, const sc_signed &v)
{
    return operator + ((uint64)u, v);
}

const sc_signed &
sc_signed::operator += (const sc_uint_base &v)
{
    return operator += ((uint64)v);
}


sc_signed
operator - (const sc_unsigned &u, const sc_uint_base &v)
{
    return operator - (u, (uint64)v);
}

sc_signed
operator - (const sc_uint_base &u, const sc_unsigned &v)
{
    return operator - ((uint64)u, v);
}

sc_signed
operator - (const sc_signed &u, const sc_uint_base &v)
{
    return operator - (u, (uint64)v);
}

sc_signed
operator - (const sc_uint_base &u, const sc_signed &v)
{
    return operator - ((uint64)u, v);
}

const sc_signed &
sc_signed::operator -= (const sc_uint_base &v)
{
    return operator -= ((uint64)v);
}


sc_signed
operator * (const sc_signed &u, const sc_uint_base &v)
{
    return operator * (u, (uint64)v);
}

sc_signed
operator * (const sc_uint_base &u, const sc_signed &v)
{
    return operator * ((uint64)u, v);
}

const sc_signed &
sc_signed::operator *= (const sc_uint_base &v)
{
    return operator *= ((uint64)v);
}


sc_signed
operator / (const sc_signed &u, const sc_uint_base &v)
{
    return operator / (u, (uint64)v);
}

sc_signed
operator / (const sc_uint_base &u, const sc_signed &v)
{
    return operator / ((uint64)u, v);
}

const sc_signed &
sc_signed::operator /= (const sc_uint_base &v)
{
    return operator /= ((uint64)v);
}


sc_signed
operator % (const sc_signed &u, const sc_uint_base &v)
{
    return operator % (u, (uint64)v);
}

sc_signed
operator % (const sc_uint_base &u, const sc_signed &v)
{
    return operator % ((uint64)u, v);
}

const sc_signed&
sc_signed::operator %= (const sc_uint_base &v)
{
    return operator %= ((uint64)v);
}


sc_signed
operator & (const sc_signed &u, const sc_uint_base &v)
{
    return operator & (u, (uint64)v);
}

sc_signed
operator & (const sc_uint_base &u, const sc_signed &v)
{
    return operator & ((uint64)u, v);
}

const sc_signed &
sc_signed::operator &= (const sc_uint_base &v)
{
    return operator &= ((uint64)v);
}


sc_signed
operator | (const sc_signed &u, const sc_uint_base &v)
{
    return operator | (u, (uint64)v);
}

sc_signed
operator | (const sc_uint_base &u, const sc_signed &v)
{
    return operator | ((uint64)u, v);
}

const sc_signed &
sc_signed::operator |= (const sc_uint_base &v)
{
    return operator |= ((uint64)v);
}


sc_signed
operator ^ (const sc_signed &u, const sc_uint_base &v)
{
    return operator ^ (u, (uint64)v);
}

sc_signed
operator ^ (const sc_uint_base &u, const sc_signed &v)
{
    return operator ^ ((uint64)u, v);
}

const sc_signed &
sc_signed::operator ^= (const sc_uint_base &v)
{
    return operator ^= ((uint64)v);
}


sc_signed
operator << (const sc_signed &u, const sc_uint_base &v)
{
    return operator << (u, (uint64)v);
}

const sc_signed &
sc_signed::operator <<= (const sc_uint_base &v)
{
    return operator <<= ((uint64)v);
}


sc_signed
operator >> (const sc_signed& u, const sc_uint_base& v)
{
    return operator >> (u, (uint64)v);
}

const sc_signed &
sc_signed::operator >>= (const sc_uint_base& v)
{
    return operator >>= ((uint64)v);
}


bool
operator == (const sc_signed &u, const sc_uint_base &v)
{
    return operator == (u, (uint64)v);
}

bool
operator == (const sc_uint_base &u, const sc_signed &v)
{
    return operator == ((uint64)u, v);
}


bool
operator != (const sc_signed &u, const sc_uint_base &v)
{
    return operator != (u, (uint64)v);
}

bool
operator != (const sc_uint_base &u, const sc_signed &v)
{
    return operator != ((uint64)u, v);
}


bool
operator < (const sc_signed &u, const sc_uint_base &v)
{
    return operator < (u, (uint64)v);
}

bool
operator < (const sc_uint_base &u, const sc_signed &v)
{
    return operator < ((uint64)u, v);
}


bool
operator <= (const sc_signed &u, const sc_uint_base &v)
{
    return operator <= (u, (uint64)v);
}

bool
operator <= (const sc_uint_base &u, const sc_signed &v)
{
    return operator <= ((uint64)u, v);
}


bool
operator > (const sc_signed &u, const sc_uint_base &v)
{
    return operator > (u, (uint64)v);
}

bool
operator > (const sc_uint_base &u, const sc_signed &v)
{
    return operator > ((uint64)u, v);
}


bool
operator >= (const sc_signed &u, const sc_uint_base &v)
{
    return operator >= (u, (uint64)v);
}

bool
operator >= (const sc_uint_base &u, const sc_signed &v)
{
    return operator >= ((uint64)u, v);
}


// ----------------------------------------------------------------------------
//  SECTION: Input and output operators
// ----------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Operator macros.
// ----------------------------------------------------------------------------

#define CONVERT_LONG(u) \
small_type u ## s = get_sign(u); \
sc_digit u ## d[DIGITS_PER_ULONG]; \
from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);

#define CONVERT_LONG_2(u) \
sc_digit u ## d[DIGITS_PER_ULONG]; \
from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);

#define CONVERT_INT(u) \
small_type u ## s = get_sign(u); \
sc_digit u ## d[DIGITS_PER_UINT]; \
from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);

#define CONVERT_INT_2(u) \
sc_digit u ## d[DIGITS_PER_UINT]; \
from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);

#define CONVERT_INT64(u) \
small_type u ## s = get_sign(u); \
sc_digit u ## d[DIGITS_PER_UINT64]; \
from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);

#define CONVERT_INT64_2(u) \
sc_digit u ## d[DIGITS_PER_UINT64]; \
from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);


// ----------------------------------------------------------------------------
//  SECTION: PLUS operators: +, +=, ++
// ----------------------------------------------------------------------------

// Cases to consider when computing u + v:
// 1. 0 + v = v
// 2. u + 0 = u
// 3. if sgn(u) == sgn(v)
//    3.1 u + v = +(u + v) = sgn(u) * (u + v)
//    3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
// 4. if sgn(u) != sgn(v)
//    4.1 u + (-v) = u - v = sgn(u) * (u - v)
//    4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
//
// Specialization of above cases for computing ++u or u++:
// 1. 0 + 1 = 1
// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)

sc_signed
operator + (const sc_unsigned &u, const sc_signed &v)
{
    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(v);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(u);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, const sc_unsigned &v)
{
    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(v);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(u);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, const sc_signed &v)
{
    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(v);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(u);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, int64 v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator + (int64 u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_unsigned &u, int64 v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator + (int64 u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, uint64 v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator + (uint64 u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, long v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator + (long u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_unsigned &u, long v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator + (long u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator + (const sc_signed &u, unsigned long v)
{
    if (v == 0) // case 2
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 1
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator + (unsigned long u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)  // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.

// ----------------------------------------------------------------------------
//  SECTION: MINUS operators: -, -=, --
// ----------------------------------------------------------------------------

// Cases to consider when computing u + v:
// 1. u - 0 = u
// 2. 0 - v = -v
// 3. if sgn(u) != sgn(v)
//    3.1 u - (-v) = u + v = sgn(u) * (u + v)
//    3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
// 4. if sgn(u) == sgn(v)
//    4.1 u - v = +(u - v) = sgn(u) * (u - v)
//    4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
//
// Specialization of above cases for computing --u or u--:
// 1. 0 - 1 = -1
// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
// 4. u - 1 = u - 1 = sgn(u) * (u - 1)

sc_signed
operator - (const sc_unsigned &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO)  // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v, -v.sgn);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_unsigned &u, const sc_signed &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v, -v.sgn);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v, -v.sgn);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, const sc_signed &v)
{
    if (v.sgn == SC_ZERO)  // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v, -v.sgn);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator - (int64 u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_unsigned &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator - (int64 u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, uint64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4

    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator - (uint64 u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_unsigned &u, uint64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator - (uint64 u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator - (long u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_unsigned &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator - (long u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_signed &u, unsigned long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator - (unsigned long u, const sc_signed &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator - (const sc_unsigned &u, unsigned long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // cases 3 and 4
    return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator - (unsigned long u, const sc_unsigned &v)
{
    if (u == 0) // case 1
        return sc_signed(v, -v.sgn);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO) // case 2
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // cases 3 and 4
    return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             -v.sgn, v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: MULTIPLICATION operators: *, *=
// ----------------------------------------------------------------------------

// Cases to consider when computing u * v:
// 1. u * 0 = 0 * v = 0
// 2. 1 * v = v and -1 * v = -v
// 3. u * 1 = u and u * -1 = -u
// 4. u * v = u * v

sc_signed
operator * (const sc_unsigned &u, const sc_signed &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) // case 1
        return sc_signed();

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, const sc_unsigned &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) // case 1
        return sc_signed();

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, const sc_signed &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) // case 1
        return sc_signed();

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, int64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(v);

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator * (int64 u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_unsigned &u, int64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(v);

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator * (int64 u, const sc_unsigned &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, uint64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(v);

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator * (uint64 u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_INT64_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(v);

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator * (long u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_unsigned &u, long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(v);

    // cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator * (long u, const sc_unsigned &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator * (const sc_signed &u, unsigned long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(v);

    // else cases 2-4
    return mul_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}

sc_signed
operator * (unsigned long u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) // case 1
        return sc_signed();

    CONVERT_LONG_2(u);

    // cases 2-4
    return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: DIVISION operators: /, /=
// ----------------------------------------------------------------------------

// Cases to consider when finding the quotient q = floor(u/v):
// Note that u = q * v + r for r < q.
// 1. 0 / 0 or u / 0 => error
// 2. 0 / v => 0 = 0 * v + 0
// 3. u / v & &u = v => u = 1 * u + 0  - u or v can be 1 or -1
// 4. u / v & &u < v => u = 0 * v + u  - u can be 1 or -1
// 5. u / v & &u > v => u = q * v + r  - v can be 1 or -1

sc_signed
operator / (const sc_unsigned &u, const sc_signed &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, const sc_unsigned &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, const sc_signed &v)
{
    small_type s = mul_signs(u.sgn, v.sgn);

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, int64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator / (int64 u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_unsigned &u, int64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator / (int64 u, const sc_unsigned &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, uint64 v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator / (uint64 u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2

    }

    CONVERT_INT64_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator / (long u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_unsigned &u, long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator / (long u, const sc_unsigned &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator / (const sc_signed &u, unsigned long v)
{
    small_type s = mul_signs(u.sgn, get_sign(v));

    if (s == SC_ZERO) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(v);

    // other cases
    return div_signed_friend(s, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator / (unsigned long u, const sc_signed &v)
{
    small_type s = mul_signs(v.sgn, get_sign(u));

    if (s == SC_ZERO) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2

    }

    CONVERT_LONG_2(u);

    // other cases
    return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: MOD operators: %, %=.
// ----------------------------------------------------------------------------

// Cases to consider when finding the remainder r = u % v:
// Note that u = q * v + r for r < q.
// 1. 0 % 0 or u % 0 => error
// 2. 0 % v => 0 = 0 * v + 0
// 3. u % v & &u = v => u = 1 * u + 0  - u or v can be 1 or -1
// 4. u % v & &u < v => u = 0 * v + u  - u can be 1 or -1
// 5. u % v & &u > v => u = q * v + r  - v can be 1 or -1

sc_signed
operator % (const sc_unsigned &u, const sc_signed &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, const sc_unsigned &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, const sc_signed &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, int64 v)
{
    small_type vs = get_sign(v);

    if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator % (int64 u, const sc_signed &v)
{
    small_type us = get_sign(u);

    if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_unsigned &u, int64 v)
{
    small_type vs = get_sign(v);

    if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator % (int64 u, const sc_unsigned &v)
{
    small_type us = get_sign(u);

    if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, uint64 v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64_2(v);

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator % (uint64 u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_INT64(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, long v)
{
    small_type vs = get_sign(v);

    if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(v);

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator % (long u, const sc_signed &v)
{
    small_type us = get_sign(u);

    if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_unsigned &u, long v)
{

  small_type vs = get_sign(v);

  if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) {
    div_by_zero(v); // case 1
    return sc_signed(); // case 2
  }

  CONVERT_LONG_2(v);

  // other cases
  return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                           BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator % (long u, const sc_unsigned &v)
{
    small_type us = get_sign(u);

    if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}


sc_signed
operator % (const sc_signed &u, unsigned long v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) {
        div_by_zero(v); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG_2(v);

    // other cases
    return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator % (unsigned long u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) {
        div_by_zero(v.sgn); // case 1
        return sc_signed(); // case 2
    }

    CONVERT_LONG(u);

    // other cases
    return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Bitwise AND operators: &, &=
// ----------------------------------------------------------------------------

// Cases to consider when computing u  &v:
// 1. u & 0 = 0  &v = 0
// 2. u  &v => sgn = +
// 3. (-u) & (-v) => sgn = -
// 4. u & (-v) => sgn = +
// 5. (-u)  &v => sgn = +

sc_signed
operator & (const sc_unsigned &u, const sc_signed &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, const sc_unsigned &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, const sc_signed &v)
{
    if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, int64 v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_INT64(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator & (int64 u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_INT64(u);

    // other cases
    return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_unsigned &u, int64 v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_INT64(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator & (int64 u, const sc_unsigned &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_INT64(u);

    // other cases
    return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, uint64 v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_INT64(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator & (uint64 u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_INT64(u);

    // other cases
    return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, long v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_LONG(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator & (long u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_LONG(u);

    // other cases
    return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_unsigned &u, long v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_LONG(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator & (long u, const sc_unsigned &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_LONG(u);

    // other cases
    return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator & (const sc_signed &u, unsigned long v)
{
    if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
        return sc_signed();

    CONVERT_LONG(v);

    // other cases
    return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator & (unsigned long u, const sc_signed &v)
{
    if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
        return sc_signed();

    CONVERT_LONG(u);

    // other cases
    return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Bitwise OR operators: |, |=
// ----------------------------------------------------------------------------

// Cases to consider when computing u | v:
// 1. u | 0 = u
// 2. 0 | v = v
// 3. u | v => sgn = +
// 4. (-u) | (-v) => sgn = -
// 5. u | (-v) => sgn = -
// 6. (-u) | v => sgn = -

sc_signed
operator | (const sc_unsigned &u, const sc_signed &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, const sc_signed &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator | (int64 u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_unsigned &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator | (int64 u, const sc_unsigned &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, uint64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator | (uint64 u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator | (long u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_unsigned &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator | (long u, const sc_unsigned &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator | (const sc_signed &u, unsigned long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                            vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator | (unsigned long u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                            v.sgn, v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Bitwise XOR operators: ^, ^=
// ----------------------------------------------------------------------------

// Cases to consider when computing u ^ v:
// Note that  u ^ v = (~u  &v) | (u & ~v).
// 1. u ^ 0 = u
// 2. 0 ^ v = v
// 3. u ^ v => sgn = +
// 4. (-u) ^ (-v) => sgn = -
// 5. u ^ (-v) => sgn = -
// 6. (-u) ^ v => sgn = +

sc_signed
operator ^ (const sc_unsigned &u, const sc_signed &v)
{

  if (v.sgn == SC_ZERO) // case 1
    return sc_signed(u);

  if (u.sgn == SC_ZERO) // case 2
    return sc_signed(v);

  // other cases
  return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                           v.sgn, v.nbits, v.ndigits, v.digit);

}


sc_signed
operator ^ (const sc_signed &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_signed &u, const sc_signed &v)
{
    if (v.sgn == SC_ZERO) // case 1
        return sc_signed(u);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(v);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_signed &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator ^ (int64 u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_unsigned &u, int64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}


sc_signed
operator ^ (int64 u, const sc_unsigned &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_signed &u, uint64 v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_INT64(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
}

sc_signed
operator ^ (uint64 u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_INT64(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_signed &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator ^ (long u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_unsigned &u, long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}


sc_signed
operator ^ (long u, const sc_unsigned &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}


sc_signed
operator ^ (const sc_signed &u, unsigned long v)
{
    if (v == 0) // case 1
        return sc_signed(u);

    CONVERT_LONG(v);

    if (u.sgn == SC_ZERO) // case 2
        return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);

    // other cases
    return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit,
                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
}

sc_signed
operator ^ (unsigned long u, const sc_signed &v)
{
    if (u == 0)
        return sc_signed(v);

    CONVERT_LONG(u);

    if (v.sgn == SC_ZERO)
        return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);

    // other cases
    return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
                             v.sgn, v.nbits, v.ndigits, v.digit);
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Bitwise NOT operator: ~
// ----------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: LEFT SHIFT operators: <<, <<=
// ----------------------------------------------------------------------------

sc_signed
operator << (const sc_signed &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO)
        return sc_signed(u);

    return operator << (u, v.to_ulong());
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: RIGHT SHIFT operators: >>, >>=
// ----------------------------------------------------------------------------

sc_signed
operator >> (const sc_signed &u, const sc_unsigned &v)
{
    if (v.sgn == SC_ZERO)
        return sc_signed(u);

    return operator >> (u, v.to_ulong());
}

// The rest of the operators in this section are included from
// sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//  SECTION: Unary arithmetic operators.
// ----------------------------------------------------------------------------

sc_signed
operator + (const sc_signed &u)
{
    return sc_signed(u);
}

sc_signed
operator - (const sc_signed &u)
{
    return sc_signed(u, -u.sgn);
}

sc_signed
operator - (const sc_unsigned &u)
{
    return sc_signed(u, -u.sgn);
}


// ----------------------------------------------------------------------------
//    SECTION: EQUAL operator: ==
// ----------------------------------------------------------------------------

bool
operator == (const sc_signed &u, const sc_signed &v)
{
    if (u.sgn != v.sgn)
        return false;

    if (&u == &v)
        return true;

    if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) != 0)
        return false;

    return true;
}


bool
operator == (const sc_signed &u, int64 v)
{
    CONVERT_INT64(v);

    if (u.sgn != vs)
        return false;

    if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
        return false;

    return true;
}


bool
operator == (int64 u, const sc_signed &v)
{
    CONVERT_INT64(u);

    if (us != v.sgn)
        return false;

    if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
        return false;

    return true;
}


bool
operator == (const sc_signed &u, uint64 v)
{
    CONVERT_INT64(v);

    if (u.sgn != vs)
        return false;

    if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0)
        return false;

    return true;
}


bool
operator == (uint64 u, const sc_signed &v)
{
    CONVERT_INT64(u);

    if (us != v.sgn)
        return false;

    if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0)
        return false;

    return true;
}


bool
operator == (const sc_signed &u, long v)
{
    CONVERT_LONG(v);

    if (u.sgn != vs)
        return false;

    if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
        return false;

    return true;
}


bool
operator == (long u, const sc_signed &v)
{
    CONVERT_LONG(u);

    if (us != v.sgn)
        return false;

    if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
        return false;

    return true;
}


bool
operator == (const sc_signed &u, unsigned long v)
{
    CONVERT_LONG(v);

    if (u.sgn != vs)
        return false;

    if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0)
        return false;

    return true;
}


bool
operator == (unsigned long u, const sc_signed &v)
{
    CONVERT_LONG(u);

    if (us != v.sgn)
        return false;

    if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0)
        return false;

    return true;
}


// ----------------------------------------------------------------------------
//    SECTION: NOT_EQUAL operator: !=
// ----------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//    SECTION: LESS THAN operator: <
// ----------------------------------------------------------------------------

bool
operator < (const sc_signed &u, const sc_signed &v)
{
    if (u.sgn < v.sgn)
        return true;

    if (u.sgn > v.sgn)
        return false;

    // u.sgn == v.sgn

    if (&u == &v)
        return false;

    if (u.sgn == SC_POS) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) < 0)
            return true;
    } else if (u.sgn == SC_NEG) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) > 0)
            return true;
    }

    return false;
}


bool
operator < (const sc_signed &u, int64 v)
{
    CONVERT_INT64(v);

    if (u.sgn < vs)
        return true;

    if (u.sgn > vs)
        return false;

    // u.sgn == vs

    if (vs == SC_POS) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
            return true;
    } else if (vs == SC_NEG) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) > 0)
            return true;
    }

    return false;
}


bool
operator < (int64 u, const sc_signed &v)
{
    CONVERT_INT64(u);

    if (us < v.sgn)
        return true;

    if (us > v.sgn)
        return false;

    // us == v.sgn

    if (us == SC_POS) {
        if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
            return true;
    } else if (us == SC_NEG) {
        if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) > 0)
            return true;
    }

    return false;
}


bool
operator < (const sc_signed &u, uint64 v)
{
    CONVERT_INT64(v);

    if (u.sgn < vs)
        return true;

    if (u.sgn > vs)
        return false;

    // u.sgn == vs

    if (vs == SC_POS) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0)
            return true;
    }

    return false;
}


bool
operator < (uint64 u, const sc_signed &v)
{
    CONVERT_INT64(u);

    if (us < v.sgn)
        return true;

    if (us > v.sgn)
        return false;

    // us == v.sgn

    if (us == SC_POS) {
        if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0)
            return true;
    }

    return false;
}


bool
operator < (const sc_signed &u, long v)
{
    CONVERT_LONG(v);

    if (u.sgn < vs)
        return true;

    if (u.sgn > vs)
        return false;

    // u.sgn == vs

    if (vs == SC_POS) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
            return true;

    } else if (vs == SC_NEG) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) > 0)
            return true;
    }

    return false;
}


bool
operator < (long u, const sc_signed &v)
{
    CONVERT_LONG(u);

    if (us < v.sgn)
        return true;

    if (us > v.sgn)
        return false;

    // us == v.sgn

    if (us == SC_POS) {
        if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
            return true;
    } else if (us == SC_NEG) {
        if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) > 0)
            return true;
    }

    return false;
}


bool
operator < (const sc_signed &u, unsigned long v)
{
    CONVERT_LONG(v);

    if (u.sgn < vs)
        return true;

    if (u.sgn > vs)
        return false;

    // u.sgn == vs

    if (vs == SC_POS) {
        if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0)
            return true;
    }

    return false;
}


bool
operator < (unsigned long u, const sc_signed &v)
{
    CONVERT_LONG(u);

    if (us < v.sgn)
        return true;

    if (us > v.sgn)
        return false;

    // us == v.sgn

    if (us == SC_POS) {
        if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0)
            return true;
    }

    return false;
}


// ---------------------------------------------------------------------------
//    SECTION: LESS THAN or EQUAL operator: <=
// ---------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ---------------------------------------------------------------------------
//    SECTION: GREATER THAN operator: >
// ---------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ---------------------------------------------------------------------------
//    SECTION: GREATER THAN or EQUAL operator: >=
// ---------------------------------------------------------------------------

// Operators in this section are included from sc_nbcommon.cpp.


// ---------------------------------------------------------------------------
//    SECTION: Public members - Other utils.
// ---------------------------------------------------------------------------

bool
sc_signed::iszero() const
{
    if (sgn == SC_ZERO)
        return true;
    else if (sgn != SC_NOSIGN)
        return false;
    else
        return check_for_zero(ndigits, digit);
}


bool
sc_signed::sign() const
{
    if (sgn == SC_NEG)
        return 1;
    else if (sgn != SC_NOSIGN)
        return 0;
    else
        return ((digit[ndigits - 1] & one_and_zeros(bit_ord(nbits - 1))) != 0);
}

// The rest of the utils in this section are included from sc_nbcommon.cpp.


// ----------------------------------------------------------------------------
//    SECTION: Private members.
// ----------------------------------------------------------------------------

// The private members in this section are included from sc_nbcommon.cpp.

#define CLASS_TYPE sc_signed
#define CLASS_TYPE_STR "sc_signed"

#define ADD_HELPER add_signed_friend
#define SUB_HELPER sub_signed_friend
#define MUL_HELPER mul_signed_friend
#define DIV_HELPER div_signed_friend
#define MOD_HELPER mod_signed_friend
#define AND_HELPER and_signed_friend
#define OR_HELPER or_signed_friend
#define XOR_HELPER xor_signed_friend

#include "sc_nbfriends.inc"

#undef SC_UNSIGNED
#define SC_SIGNED
#define IF_SC_SIGNED 1 // 1 = sc_signed
#define CLASS_TYPE_SUBREF sc_signed_subref_r
#define OTHER_CLASS_TYPE sc_unsigned
#define OTHER_CLASS_TYPE_SUBREF sc_unsigned_subref_r

#define MUL_ON_HELPER mul_on_help_signed
#define DIV_ON_HELPER div_on_help_signed
#define MOD_ON_HELPER mod_on_help_signed

#include "sc_nbcommon.inc"

#undef MOD_ON_HELPER
#undef DIV_ON_HELPER
#undef MUL_ON_HELPER

#undef OTHER_CLASS_TYPE_SUBREF
#undef OTHER_CLASS_TYPE
#undef CLASS_TYPE_SUBREF
#undef IF_SC_SIGNED
#undef SC_SIGNED

#undef XOR_HELPER
#undef OR_HELPER
#undef AND_HELPER
#undef MOD_HELPER
#undef DIV_HELPER
#undef MUL_HELPER
#undef SUB_HELPER
#undef ADD_HELPER

#undef CLASS_TYPE
#undef CLASS_TYPE_STR

#include "sc_signed_bitref.inc"
#include "sc_signed_subref.inc"

#undef CONVERT_LONG
#undef CONVERT_LONG_2
#undef CONVERT_INT64
#undef CONVERT_INT64_2

} // namespace sc_dt
