sc_signed.cc revision 13325
113531Sjairo.balart@metempsy.com/***************************************************************************** 213531Sjairo.balart@metempsy.com 313531Sjairo.balart@metempsy.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 413531Sjairo.balart@metempsy.com more contributor license agreements. See the NOTICE file distributed 513531Sjairo.balart@metempsy.com with this work for additional information regarding copyright ownership. 613531Sjairo.balart@metempsy.com Accellera licenses this file to you under the Apache License, Version 2.0 713531Sjairo.balart@metempsy.com (the "License"); you may not use this file except in compliance with the 813531Sjairo.balart@metempsy.com License. You may obtain a copy of the License at 913531Sjairo.balart@metempsy.com 1013531Sjairo.balart@metempsy.com http://www.apache.org/licenses/LICENSE-2.0 1113531Sjairo.balart@metempsy.com 1213531Sjairo.balart@metempsy.com Unless required by applicable law or agreed to in writing, software 1313531Sjairo.balart@metempsy.com distributed under the License is distributed on an "AS IS" BASIS, 1413531Sjairo.balart@metempsy.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1513531Sjairo.balart@metempsy.com implied. See the License for the specific language governing 1613531Sjairo.balart@metempsy.com permissions and limitations under the License. 1713531Sjairo.balart@metempsy.com 1813531Sjairo.balart@metempsy.com *****************************************************************************/ 1913531Sjairo.balart@metempsy.com 2013531Sjairo.balart@metempsy.com/***************************************************************************** 2113531Sjairo.balart@metempsy.com 2213531Sjairo.balart@metempsy.com sc_signed.cpp -- Arbitrary precision signed arithmetic. 2313531Sjairo.balart@metempsy.com 2413531Sjairo.balart@metempsy.com This file includes the definitions of sc_signed_bitref, 2513531Sjairo.balart@metempsy.com sc_signed_subref, and sc_signed classes. The first two 2613531Sjairo.balart@metempsy.com classes are proxy classes to reference one bit and a range 2713531Sjairo.balart@metempsy.com of bits of a sc_signed number, respectively. This file also 2813531Sjairo.balart@metempsy.com includes sc_nbcommon.cpp and sc_nbfriends.cpp, which 2913531Sjairo.balart@metempsy.com contain the definitions shared by sc_unsigned. 3013531Sjairo.balart@metempsy.com 3113531Sjairo.balart@metempsy.com Original Author: Ali Dasdan, Synopsys, Inc. 3213531Sjairo.balart@metempsy.com 3313531Sjairo.balart@metempsy.com *****************************************************************************/ 3413531Sjairo.balart@metempsy.com 3513531Sjairo.balart@metempsy.com/***************************************************************************** 3613531Sjairo.balart@metempsy.com 3713531Sjairo.balart@metempsy.com MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3813531Sjairo.balart@metempsy.com changes you are making here. 3913531Sjairo.balart@metempsy.com 4013531Sjairo.balart@metempsy.com Name, Affiliation, Date: 4113531Sjairo.balart@metempsy.com Description of Modification: 4213531Sjairo.balart@metempsy.com 4313531Sjairo.balart@metempsy.com *****************************************************************************/ 4413531Sjairo.balart@metempsy.com 4513531Sjairo.balart@metempsy.com 4613531Sjairo.balart@metempsy.com// $Log: sc_signed.cpp,v $ 4713531Sjairo.balart@metempsy.com// Revision 1.6 2011/02/18 20:19:15 acg 4813531Sjairo.balart@metempsy.com// Andy Goodrich: updating Copyright notice. 4913531Sjairo.balart@metempsy.com// 5013531Sjairo.balart@metempsy.com// Revision 1.5 2008/12/10 20:38:45 acg 5113531Sjairo.balart@metempsy.com// Andy Goodrich: fixed conversion of double values to the digits vector. 5213531Sjairo.balart@metempsy.com// The bits above the radix were not being masked off. 5313531Sjairo.balart@metempsy.com// 5413531Sjairo.balart@metempsy.com// Revision 1.4 2008/06/19 17:47:56 acg 5513531Sjairo.balart@metempsy.com// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES. 5613531Sjairo.balart@metempsy.com// 5713531Sjairo.balart@metempsy.com// Revision 1.3 2008/04/29 21:20:41 acg 5813531Sjairo.balart@metempsy.com// Andy Goodrich: added mask to first word transferred when processing 5913531Sjairo.balart@metempsy.com// a negative sc_signed value in sc_signed::concat_get_data(). 6013531Sjairo.balart@metempsy.com// 6113531Sjairo.balart@metempsy.com// Revision 1.2 2007/11/04 21:27:00 acg 6213531Sjairo.balart@metempsy.com// Andy Goodrich: changes to make sure the proper value is returned from 6313531Sjairo.balart@metempsy.com// concat_get_data(). 6413531Sjairo.balart@metempsy.com// 6513531Sjairo.balart@metempsy.com// Revision 1.1.1.1 2006/12/15 20:20:05 acg 6613531Sjairo.balart@metempsy.com// SystemC 2.3 6713531Sjairo.balart@metempsy.com// 6813531Sjairo.balart@metempsy.com// Revision 1.5 2006/10/23 19:32:47 acg 6913531Sjairo.balart@metempsy.com// Andy Goodrich: further fix for incorrect value being returned from 7013531Sjairo.balart@metempsy.com// concat_get_data. This one is in the non-aligned value code. 7113531Sjairo.balart@metempsy.com// 7213531Sjairo.balart@metempsy.com// Revision 1.3 2006/01/13 18:49:32 acg 7313531Sjairo.balart@metempsy.com// Added $Log command so that CVS check in comments are reproduced in the 7413531Sjairo.balart@metempsy.com// source. 7513531Sjairo.balart@metempsy.com// 7613531Sjairo.balart@metempsy.com 7713531Sjairo.balart@metempsy.com#include <cctype> 7813531Sjairo.balart@metempsy.com#include <cmath> 7913531Sjairo.balart@metempsy.com#include <sstream> 8013531Sjairo.balart@metempsy.com 8113531Sjairo.balart@metempsy.com#include "systemc/ext/dt/bit/sc_bv_base.hh" 8213531Sjairo.balart@metempsy.com#include "systemc/ext/dt/bit/sc_lv_base.hh" 8313531Sjairo.balart@metempsy.com#include "systemc/ext/dt/fx/sc_fix.hh" 8413531Sjairo.balart@metempsy.com#include "systemc/ext/dt/fx/scfx_other_defs.hh" 8513531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/messages.hh" 8613531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_int_base.hh" 8713531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_signed.hh" 8813531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_uint_base.hh" 8913531Sjairo.balart@metempsy.com#include "systemc/ext/dt/int/sc_unsigned.hh" 9013531Sjairo.balart@metempsy.com#include "systemc/ext/dt/misc/sc_concatref.hh" 9113531Sjairo.balart@metempsy.com 9213531Sjairo.balart@metempsy.com// explicit template instantiations 9313531Sjairo.balart@metempsy.comnamespace sc_core 9413531Sjairo.balart@metempsy.com{ 9513531Sjairo.balart@metempsy.com 9613531Sjairo.balart@metempsy.comtemplate class sc_vpool<sc_dt::sc_signed_bitref>; 9713531Sjairo.balart@metempsy.comtemplate class sc_vpool<sc_dt::sc_signed_subref>; 9813531Sjairo.balart@metempsy.com 9913531Sjairo.balart@metempsy.com} // namespace sc_core 10013531Sjairo.balart@metempsy.com 10113531Sjairo.balart@metempsy.comnamespace sc_dt 10213531Sjairo.balart@metempsy.com{ 10313531Sjairo.balart@metempsy.com 10413531Sjairo.balart@metempsy.com// Pool of temporary instances: 10513531Sjairo.balart@metempsy.com 10613531Sjairo.balart@metempsy.comsc_core::sc_vpool<sc_signed_bitref> sc_signed_bitref::m_pool(9); 10713531Sjairo.balart@metempsy.comsc_core::sc_vpool<sc_signed_subref> sc_signed_subref::m_pool(9); 10813531Sjairo.balart@metempsy.com 10913531Sjairo.balart@metempsy.comvoid 11013531Sjairo.balart@metempsy.comsc_signed::invalid_init(const char *type_name, int nb) const 11113531Sjairo.balart@metempsy.com{ 11213531Sjairo.balart@metempsy.com std::stringstream msg; 11313531Sjairo.balart@metempsy.com msg << "sc_signed("<< type_name << ") : nb = " << nb << " is not valid"; 11413531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_INIT_FAILED_, msg.str().c_str()); 11513531Sjairo.balart@metempsy.com} 11613531Sjairo.balart@metempsy.com 11713531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 11813531Sjairo.balart@metempsy.com// SECTION: Public members - Invalid selections. 11913531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 12013531Sjairo.balart@metempsy.com 12113531Sjairo.balart@metempsy.comvoid 12213531Sjairo.balart@metempsy.comsc_signed::invalid_index(int i) const 12313531Sjairo.balart@metempsy.com{ 12413531Sjairo.balart@metempsy.com std::stringstream msg; 12513531Sjairo.balart@metempsy.com msg << "sc_bigint bit selection: index = " << i << " violates " 12613531Sjairo.balart@metempsy.com "0 <= index <= " << (nbits - 1); 12713531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str()); 12813531Sjairo.balart@metempsy.com sc_core::sc_abort(); // can't recover from here 12913531Sjairo.balart@metempsy.com} 13013531Sjairo.balart@metempsy.com 13113531Sjairo.balart@metempsy.comvoid 13213531Sjairo.balart@metempsy.comsc_signed::invalid_range(int l, int r) const 13313531Sjairo.balart@metempsy.com{ 13413531Sjairo.balart@metempsy.com std::stringstream msg; 13513531Sjairo.balart@metempsy.com msg << "sc_bigint part selection: left = " << 13613531Sjairo.balart@metempsy.com l << ", right = " << r << " \n" 13713531Sjairo.balart@metempsy.com " violates either (" << (nbits-1) << " >= left >= 0) or " 13813531Sjairo.balart@metempsy.com "(" << (nbits-1) << " >= right >= 0)"; 13913531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_OUT_OF_BOUNDS_, msg.str().c_str()); 14013531Sjairo.balart@metempsy.com sc_core::sc_abort(); // can't recover from here 14113531Sjairo.balart@metempsy.com} 14213531Sjairo.balart@metempsy.com 14313531Sjairo.balart@metempsy.com 14413531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 14513531Sjairo.balart@metempsy.com 14613531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 14713531Sjairo.balart@metempsy.com// SECTION: Public members. 14813531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 14913531Sjairo.balart@metempsy.com 15013531Sjairo.balart@metempsy.com// Most public members are included from sc_nbcommon.inc. However, some 15113531Sjairo.balart@metempsy.com// concatenation support appears here to optimize between the signed and 15213531Sjairo.balart@metempsy.com// unsigned cases. 15313531Sjairo.balart@metempsy.com 15413531Sjairo.balart@metempsy.com// Insert this object's value at the specified place in a vector of biguint 15513531Sjairo.balart@metempsy.com// style values. 15613531Sjairo.balart@metempsy.com 15713531Sjairo.balart@metempsy.combool 15813531Sjairo.balart@metempsy.comsc_signed::concat_get_ctrl(sc_digit *dst_p, int low_i) const 15913531Sjairo.balart@metempsy.com{ 16013531Sjairo.balart@metempsy.com int dst_i; // Index to next word to set in dst_p. 16113531Sjairo.balart@metempsy.com int end_i; // Index of high order word to set. 16213531Sjairo.balart@metempsy.com int left_shift; // Amount to shift value left. 16313531Sjairo.balart@metempsy.com sc_digit mask; // Mask for partial word sets. 16413531Sjairo.balart@metempsy.com 16513531Sjairo.balart@metempsy.com // CALCULATE METRICS FOR DATA MOVEMENT: 16613531Sjairo.balart@metempsy.com dst_i = low_i / BITS_PER_DIGIT; 16713531Sjairo.balart@metempsy.com end_i = (low_i + nbits - 1) / BITS_PER_DIGIT; 16813531Sjairo.balart@metempsy.com left_shift = low_i % BITS_PER_DIGIT; 16913531Sjairo.balart@metempsy.com 17013531Sjairo.balart@metempsy.com // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 17113531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 17213531Sjairo.balart@metempsy.com dst_p[dst_i] = (dst_p[dst_i] & ~mask); 17313531Sjairo.balart@metempsy.com dst_i++; 17413531Sjairo.balart@metempsy.com 17513531Sjairo.balart@metempsy.com for (; dst_i <= end_i; dst_i++) 17613531Sjairo.balart@metempsy.com dst_p[dst_i] = 0; 17713531Sjairo.balart@metempsy.com 17813531Sjairo.balart@metempsy.com return false; 17913531Sjairo.balart@metempsy.com} 18013531Sjairo.balart@metempsy.com 18113531Sjairo.balart@metempsy.combool 18213531Sjairo.balart@metempsy.comsc_signed::concat_get_data(sc_digit *dst_p, int low_i) const 18313531Sjairo.balart@metempsy.com{ 18413531Sjairo.balart@metempsy.com sc_digit carry; // Carry bit for complements. 18513531Sjairo.balart@metempsy.com int dst_i; // Index to next word to set in dst_p. 18613531Sjairo.balart@metempsy.com int end_i; // Index of high order word to set. 18713531Sjairo.balart@metempsy.com int high_i; // Index w/in word of high order bit. 18813531Sjairo.balart@metempsy.com int left_shift; // Amount to shift value left. 18913531Sjairo.balart@metempsy.com sc_digit left_word; // High word component for set. 19013531Sjairo.balart@metempsy.com sc_digit mask; // Mask for partial word sets. 19113531Sjairo.balart@metempsy.com bool result; // True if inserted non-zero data. 19213531Sjairo.balart@metempsy.com int right_shift; // Amount to shift value right. 19313531Sjairo.balart@metempsy.com sc_digit right_word; // Low word component for set. 19413531Sjairo.balart@metempsy.com int src_i; // Index to next word to get from digit. 19513531Sjairo.balart@metempsy.com 19613531Sjairo.balart@metempsy.com // CALCULATE METRICS FOR DATA MOVEMENT: 19713531Sjairo.balart@metempsy.com dst_i = low_i / BITS_PER_DIGIT; 19813531Sjairo.balart@metempsy.com high_i = low_i + nbits - 1; 19913531Sjairo.balart@metempsy.com end_i = high_i / BITS_PER_DIGIT; 20013531Sjairo.balart@metempsy.com left_shift = low_i % BITS_PER_DIGIT; 20113531Sjairo.balart@metempsy.com 20213531Sjairo.balart@metempsy.com switch (sgn) { 20313531Sjairo.balart@metempsy.com // POSITIVE SOURCE VALUE: 20413531Sjairo.balart@metempsy.com case SC_POS: 20513531Sjairo.balart@metempsy.com result = true; 20613531Sjairo.balart@metempsy.com 20713531Sjairo.balart@metempsy.com // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 20813531Sjairo.balart@metempsy.com if (dst_i == end_i) { 20913531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 21013531Sjairo.balart@metempsy.com dst_p[dst_i] = ((dst_p[dst_i] & mask) | 21113531Sjairo.balart@metempsy.com (digit[0] << left_shift)) & DIGIT_MASK; 21213531Sjairo.balart@metempsy.com 21313531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 21413531Sjairo.balart@metempsy.com } else if (left_shift == 0) { 21513531Sjairo.balart@metempsy.com for (src_i = 0; dst_i < end_i; dst_i++, src_i++) { 21613531Sjairo.balart@metempsy.com dst_p[dst_i] = digit[src_i]; 21713531Sjairo.balart@metempsy.com } 21813531Sjairo.balart@metempsy.com high_i = high_i % BITS_PER_DIGIT; 21913531Sjairo.balart@metempsy.com mask = ~(~1U << high_i) & DIGIT_MASK; 22013531Sjairo.balart@metempsy.com dst_p[dst_i] = digit[src_i] & mask; 22113531Sjairo.balart@metempsy.com 22213531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 22313531Sjairo.balart@metempsy.com } else { 22413531Sjairo.balart@metempsy.com high_i = high_i % BITS_PER_DIGIT; 22513531Sjairo.balart@metempsy.com right_shift = BITS_PER_DIGIT - left_shift; 22613531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 22713531Sjairo.balart@metempsy.com right_word = digit[0]; 22813531Sjairo.balart@metempsy.com dst_p[dst_i] = (dst_p[dst_i] & mask) | 22913531Sjairo.balart@metempsy.com ((right_word << left_shift) & DIGIT_MASK); 23013531Sjairo.balart@metempsy.com for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) { 23113531Sjairo.balart@metempsy.com left_word = digit[src_i]; 23213531Sjairo.balart@metempsy.com dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) | 23313531Sjairo.balart@metempsy.com (right_word >> right_shift); 23413531Sjairo.balart@metempsy.com right_word = left_word; 23513531Sjairo.balart@metempsy.com } 23613531Sjairo.balart@metempsy.com left_word = (src_i < ndigits) ? digit[src_i] : 0; 23713531Sjairo.balart@metempsy.com mask = ~(~1U << high_i) & DIGIT_MASK; 23813531Sjairo.balart@metempsy.com dst_p[dst_i] = ((left_word << left_shift) | 23913531Sjairo.balart@metempsy.com (right_word >> right_shift)) & mask; 24013531Sjairo.balart@metempsy.com } 24113531Sjairo.balart@metempsy.com break; 24213531Sjairo.balart@metempsy.com 24313531Sjairo.balart@metempsy.com // SOURCE VALUE IS NEGATIVE: 24413531Sjairo.balart@metempsy.com case SC_NEG: 24513531Sjairo.balart@metempsy.com // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 24613531Sjairo.balart@metempsy.com result = true; 24713531Sjairo.balart@metempsy.com if (dst_i == end_i) { 24813531Sjairo.balart@metempsy.com mask = ~(~0U << nbits); 24913531Sjairo.balart@metempsy.com right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask; 25013531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 25113531Sjairo.balart@metempsy.com dst_p[dst_i] = ((dst_p[dst_i] & mask) | 25213531Sjairo.balart@metempsy.com (right_word << left_shift)) & DIGIT_MASK; 25313531Sjairo.balart@metempsy.com 25413531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 25513531Sjairo.balart@metempsy.com } else if (left_shift == 0) { 25613531Sjairo.balart@metempsy.com carry = 1; 25713531Sjairo.balart@metempsy.com for (src_i = 0; dst_i < end_i; dst_i++, src_i++) { 25813531Sjairo.balart@metempsy.com right_word = (digit[src_i] ^ DIGIT_MASK) + carry; 25913531Sjairo.balart@metempsy.com dst_p[dst_i] = right_word & DIGIT_MASK; 26013531Sjairo.balart@metempsy.com carry = right_word >> BITS_PER_DIGIT; 26113531Sjairo.balart@metempsy.com } 26213531Sjairo.balart@metempsy.com high_i = high_i % BITS_PER_DIGIT; 26313531Sjairo.balart@metempsy.com mask = (~(~1U << high_i)) & DIGIT_MASK; 26413531Sjairo.balart@metempsy.com right_word = (src_i < ndigits) ? 26513531Sjairo.balart@metempsy.com (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry; 26613531Sjairo.balart@metempsy.com dst_p[dst_i] = right_word & mask; 26713531Sjairo.balart@metempsy.com 26813531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 26913531Sjairo.balart@metempsy.com } else { 27013531Sjairo.balart@metempsy.com high_i = high_i % BITS_PER_DIGIT; 27113531Sjairo.balart@metempsy.com right_shift = BITS_PER_DIGIT - left_shift; 27213531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 27313531Sjairo.balart@metempsy.com carry = 1; 27413531Sjairo.balart@metempsy.com right_word = (digit[0] ^ DIGIT_MASK) + carry; 27513531Sjairo.balart@metempsy.com dst_p[dst_i] = (dst_p[dst_i] & mask) | 27613531Sjairo.balart@metempsy.com ((right_word << left_shift) & DIGIT_MASK); 27713531Sjairo.balart@metempsy.com carry = right_word >> BITS_PER_DIGIT; 27813531Sjairo.balart@metempsy.com right_word &= DIGIT_MASK; 27913531Sjairo.balart@metempsy.com for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) { 28013531Sjairo.balart@metempsy.com left_word = (digit[src_i] ^ DIGIT_MASK) + carry; 28113531Sjairo.balart@metempsy.com dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) | 28213531Sjairo.balart@metempsy.com (right_word >> right_shift); 28313531Sjairo.balart@metempsy.com carry = left_word >> BITS_PER_DIGIT; 28413531Sjairo.balart@metempsy.com right_word = left_word & DIGIT_MASK; 28513531Sjairo.balart@metempsy.com } 28613531Sjairo.balart@metempsy.com left_word = (src_i < ndigits) ? 28713531Sjairo.balart@metempsy.com (digit[src_i] ^ DIGIT_MASK) + carry : carry; 28813531Sjairo.balart@metempsy.com mask = ~(~1U << high_i) & DIGIT_MASK; 28913531Sjairo.balart@metempsy.com dst_p[dst_i] = ((left_word << left_shift) | 29013531Sjairo.balart@metempsy.com (right_word >> right_shift)) & mask; 29113531Sjairo.balart@metempsy.com } 29213531Sjairo.balart@metempsy.com break; 29313531Sjairo.balart@metempsy.com 29413531Sjairo.balart@metempsy.com // VALUE IS ZERO: 29513531Sjairo.balart@metempsy.com default: 29613531Sjairo.balart@metempsy.com result = false; 29713531Sjairo.balart@metempsy.com // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 29813531Sjairo.balart@metempsy.com if (dst_i == end_i) { 29913531Sjairo.balart@metempsy.com mask = ~(~0U << nbits) << left_shift; 30013531Sjairo.balart@metempsy.com dst_p[dst_i] = dst_p[dst_i] & ~mask; 30113531Sjairo.balart@metempsy.com 30213531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 30313531Sjairo.balart@metempsy.com } else if (left_shift == 0) { 30413531Sjairo.balart@metempsy.com for (src_i = 0; dst_i < end_i; dst_i++, src_i++) { 30513531Sjairo.balart@metempsy.com dst_p[dst_i] = 0; 30613531Sjairo.balart@metempsy.com } 30713531Sjairo.balart@metempsy.com dst_p[dst_i] = 0; 30813531Sjairo.balart@metempsy.com 30913531Sjairo.balart@metempsy.com // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 31013531Sjairo.balart@metempsy.com } else { 31113531Sjairo.balart@metempsy.com mask = ~(~0U << left_shift); 31213531Sjairo.balart@metempsy.com dst_p[dst_i] = (dst_p[dst_i] & mask); 31313531Sjairo.balart@metempsy.com for (dst_i++; dst_i <= end_i; dst_i++) { 31413531Sjairo.balart@metempsy.com dst_p[dst_i] = 0; 31513531Sjairo.balart@metempsy.com } 31613531Sjairo.balart@metempsy.com } 31713531Sjairo.balart@metempsy.com break; 31813531Sjairo.balart@metempsy.com } 31913531Sjairo.balart@metempsy.com return result; 32013531Sjairo.balart@metempsy.com} 32113531Sjairo.balart@metempsy.com 32213531Sjairo.balart@metempsy.com// Return this object instance's bits as a uint64 without sign extension. 32313531Sjairo.balart@metempsy.com 32413531Sjairo.balart@metempsy.comuint64 32513531Sjairo.balart@metempsy.comsc_signed::concat_get_uint64() const 32613531Sjairo.balart@metempsy.com{ 32713531Sjairo.balart@metempsy.com uint64 result; 32813531Sjairo.balart@metempsy.com switch (sgn) { 32913531Sjairo.balart@metempsy.com case SC_POS: 33013531Sjairo.balart@metempsy.com result = 0; 33113531Sjairo.balart@metempsy.com if (ndigits > 2) 33213531Sjairo.balart@metempsy.com result = digit[2]; 33313531Sjairo.balart@metempsy.com if (ndigits > 1) 33413531Sjairo.balart@metempsy.com result = (result << BITS_PER_DIGIT) | digit[1]; 33513531Sjairo.balart@metempsy.com result = (result << BITS_PER_DIGIT) | digit[0]; 33613531Sjairo.balart@metempsy.com break; 33713531Sjairo.balart@metempsy.com case SC_NEG: 33813531Sjairo.balart@metempsy.com result = 0; 33913531Sjairo.balart@metempsy.com if (ndigits > 2) 34013531Sjairo.balart@metempsy.com result = digit[2]; 34113531Sjairo.balart@metempsy.com if (ndigits > 1) 34213531Sjairo.balart@metempsy.com result = (result << BITS_PER_DIGIT) | digit[1]; 34313531Sjairo.balart@metempsy.com result = (result << BITS_PER_DIGIT) | digit[0]; 34413531Sjairo.balart@metempsy.com result = -result; 34513531Sjairo.balart@metempsy.com if (nbits < 64) { 34613531Sjairo.balart@metempsy.com uint64 mask = ~0; 34713531Sjairo.balart@metempsy.com result = result & ~(mask << nbits); 34813531Sjairo.balart@metempsy.com } 34913531Sjairo.balart@metempsy.com break; 35013531Sjairo.balart@metempsy.com default: 35113531Sjairo.balart@metempsy.com result = 0; 35213531Sjairo.balart@metempsy.com break; 35313531Sjairo.balart@metempsy.com } 35413531Sjairo.balart@metempsy.com return result; 35513531Sjairo.balart@metempsy.com} 35613531Sjairo.balart@metempsy.com 35713531Sjairo.balart@metempsy.com// #### OPTIMIZE 35813531Sjairo.balart@metempsy.comvoid 35913531Sjairo.balart@metempsy.comsc_signed::concat_set(int64 src, int low_i) 36013531Sjairo.balart@metempsy.com{ 36113531Sjairo.balart@metempsy.com *this = (low_i < 64) ? src >> low_i : src >> 63; 36213531Sjairo.balart@metempsy.com} 36313531Sjairo.balart@metempsy.com 36413531Sjairo.balart@metempsy.comvoid 36513531Sjairo.balart@metempsy.comsc_signed::concat_set(const sc_signed &src, int low_i) 36613531Sjairo.balart@metempsy.com{ 36713531Sjairo.balart@metempsy.com if (low_i < src.length()) 36813531Sjairo.balart@metempsy.com *this = src >> low_i; 36913531Sjairo.balart@metempsy.com else 37013531Sjairo.balart@metempsy.com *this = (src<0) ? (int_type)-1 : 0; 37113531Sjairo.balart@metempsy.com} 37213531Sjairo.balart@metempsy.com 37313531Sjairo.balart@metempsy.comvoid 37413531Sjairo.balart@metempsy.comsc_signed::concat_set(const sc_unsigned &src, int low_i) 37513531Sjairo.balart@metempsy.com{ 37613531Sjairo.balart@metempsy.com if (low_i < src.length()) 37713531Sjairo.balart@metempsy.com *this = src >> low_i; 37813531Sjairo.balart@metempsy.com else 37913531Sjairo.balart@metempsy.com *this = 0; 38013531Sjairo.balart@metempsy.com} 38113531Sjairo.balart@metempsy.com 38213531Sjairo.balart@metempsy.comvoid 38313531Sjairo.balart@metempsy.comsc_signed::concat_set(uint64 src, int low_i) 38413531Sjairo.balart@metempsy.com{ 38513531Sjairo.balart@metempsy.com *this = (low_i < 64) ? src >> low_i : 0; 38613531Sjairo.balart@metempsy.com} 38713531Sjairo.balart@metempsy.com 38813531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 38913531Sjairo.balart@metempsy.com// SECTION: Public members - Reduction methods. 39013531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 39113531Sjairo.balart@metempsy.com 39213531Sjairo.balart@metempsy.combool 39313531Sjairo.balart@metempsy.comsc_signed::and_reduce() const 39413531Sjairo.balart@metempsy.com{ 39513531Sjairo.balart@metempsy.com sc_digit current; // Current digit examining. 39613531Sjairo.balart@metempsy.com int i; // Index of digit examining. 39713531Sjairo.balart@metempsy.com 39813531Sjairo.balart@metempsy.com if (sgn == SC_NEG) { 39913531Sjairo.balart@metempsy.com current = (1 << BITS_PER_DIGIT); 40013531Sjairo.balart@metempsy.com for (i = 0; i < ndigits-1; i++) { 40113531Sjairo.balart@metempsy.com current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK); 40213531Sjairo.balart@metempsy.com if ((current & DIGIT_MASK) != DIGIT_MASK) return false; 40313531Sjairo.balart@metempsy.com } 40413531Sjairo.balart@metempsy.com current = (current >> BITS_PER_DIGIT) + (digit[i]^DIGIT_MASK); 40513531Sjairo.balart@metempsy.com if ((current & ~(~0U << (nbits % BITS_PER_DIGIT))) == 40613531Sjairo.balart@metempsy.com static_cast<sc_digit>(~(~0U << (nbits % BITS_PER_DIGIT)))) { 40713531Sjairo.balart@metempsy.com return true; 40813531Sjairo.balart@metempsy.com } 40913531Sjairo.balart@metempsy.com } 41013531Sjairo.balart@metempsy.com return false; 41113531Sjairo.balart@metempsy.com} 41213531Sjairo.balart@metempsy.com 41313531Sjairo.balart@metempsy.combool 41413531Sjairo.balart@metempsy.comsc_signed::or_reduce() const 41513531Sjairo.balart@metempsy.com{ 41613531Sjairo.balart@metempsy.com return sgn == SC_ZERO ? false : true; 41713531Sjairo.balart@metempsy.com} 41813531Sjairo.balart@metempsy.com 41913531Sjairo.balart@metempsy.combool 42013531Sjairo.balart@metempsy.comsc_signed::xor_reduce() const 42113531Sjairo.balart@metempsy.com{ 42213531Sjairo.balart@metempsy.com int i; // Digit examining. 42313531Sjairo.balart@metempsy.com int odd; // Flag for odd number of digits. 42413531Sjairo.balart@metempsy.com 42513531Sjairo.balart@metempsy.com odd = 0; 42613531Sjairo.balart@metempsy.com for (i = 0; i < nbits; i++) 42713531Sjairo.balart@metempsy.com if (test(i)) 42813531Sjairo.balart@metempsy.com odd = ~odd; 42913531Sjairo.balart@metempsy.com return odd ? true : false; 43013531Sjairo.balart@metempsy.com} 43113531Sjairo.balart@metempsy.com 43213531Sjairo.balart@metempsy.com 43313531Sjairo.balart@metempsy.com 43413531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 43513531Sjairo.balart@metempsy.com// SECTION: Public members - Assignment operators. 43613531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 43713531Sjairo.balart@metempsy.com 43813531Sjairo.balart@metempsy.com// assignment operators 43913531Sjairo.balart@metempsy.com 44013531Sjairo.balart@metempsy.comconst sc_signed & 44113531Sjairo.balart@metempsy.comsc_signed::operator = (const char *a) 44213531Sjairo.balart@metempsy.com{ 44313531Sjairo.balart@metempsy.com if (a == 0) { 44413531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_, 44513531Sjairo.balart@metempsy.com "character string is zero"); 44613531Sjairo.balart@metempsy.com } else if (*a == 0) { 44713531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_, 44813531Sjairo.balart@metempsy.com "character string is empty"); 44913531Sjairo.balart@metempsy.com } else try { 45013531Sjairo.balart@metempsy.com int len = length(); 45113531Sjairo.balart@metempsy.com sc_fix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON); 45213531Sjairo.balart@metempsy.com return this->operator = (aa); 45313531Sjairo.balart@metempsy.com } catch(const sc_core::sc_report &) { 45413531Sjairo.balart@metempsy.com std::stringstream msg; 45513531Sjairo.balart@metempsy.com msg << "character string '" << a << "' is not valid"; 45613531Sjairo.balart@metempsy.com SC_REPORT_ERROR(sc_core::SC_ID_CONVERSION_FAILED_, msg.str().c_str()); 45713531Sjairo.balart@metempsy.com } 45813531Sjairo.balart@metempsy.com return *this; 45913531Sjairo.balart@metempsy.com} 46013531Sjairo.balart@metempsy.com 46113531Sjairo.balart@metempsy.comconst sc_signed & 46213531Sjairo.balart@metempsy.comsc_signed::operator=(int64 v) 46313531Sjairo.balart@metempsy.com{ 46413531Sjairo.balart@metempsy.com sgn = get_sign(v); 46513531Sjairo.balart@metempsy.com // v >= 0 now. 46613531Sjairo.balart@metempsy.com if (sgn == SC_ZERO) { 46713531Sjairo.balart@metempsy.com vec_zero(ndigits, digit); 46813531Sjairo.balart@metempsy.com } else { 46913531Sjairo.balart@metempsy.com from_uint(ndigits, digit, (uint64)v); 47013531Sjairo.balart@metempsy.com if (nbits <= (int)BITS_PER_INT64) 47113531Sjairo.balart@metempsy.com convert_SM_to_2C_to_SM(); 47213531Sjairo.balart@metempsy.com } 47313531Sjairo.balart@metempsy.com return *this; 47413531Sjairo.balart@metempsy.com} 47513531Sjairo.balart@metempsy.com 47613531Sjairo.balart@metempsy.comconst sc_signed & 47713531Sjairo.balart@metempsy.comsc_signed::operator=(uint64 v) 47813531Sjairo.balart@metempsy.com{ 47913531Sjairo.balart@metempsy.com sgn = get_sign(v); 48013531Sjairo.balart@metempsy.com if (sgn == SC_ZERO) { 48113531Sjairo.balart@metempsy.com vec_zero(ndigits, digit); 48213531Sjairo.balart@metempsy.com } else { 48313531Sjairo.balart@metempsy.com from_uint(ndigits, digit, v); 48413531Sjairo.balart@metempsy.com if (nbits <= (int)BITS_PER_INT64) 48513531Sjairo.balart@metempsy.com convert_SM_to_2C_to_SM(); 48613531Sjairo.balart@metempsy.com } 48713531Sjairo.balart@metempsy.com return *this; 48813531Sjairo.balart@metempsy.com} 48913531Sjairo.balart@metempsy.com 49013531Sjairo.balart@metempsy.comconst sc_signed & 49113531Sjairo.balart@metempsy.comsc_signed::operator=(long v) 49213531Sjairo.balart@metempsy.com{ 49313531Sjairo.balart@metempsy.com sgn = get_sign(v); 49413531Sjairo.balart@metempsy.com // v >= 0 now. 49513531Sjairo.balart@metempsy.com if (sgn == SC_ZERO) { 49613531Sjairo.balart@metempsy.com vec_zero(ndigits, digit); 49713531Sjairo.balart@metempsy.com } else { 49813531Sjairo.balart@metempsy.com from_uint(ndigits, digit, (unsigned long)v); 49913531Sjairo.balart@metempsy.com if (nbits <= (int)BITS_PER_LONG) 50013531Sjairo.balart@metempsy.com convert_SM_to_2C_to_SM(); 50113531Sjairo.balart@metempsy.com } 50213531Sjairo.balart@metempsy.com return *this; 50313531Sjairo.balart@metempsy.com} 50413531Sjairo.balart@metempsy.com 50513531Sjairo.balart@metempsy.comconst sc_signed & 50613531Sjairo.balart@metempsy.comsc_signed::operator=(unsigned long v) 50713531Sjairo.balart@metempsy.com{ 50813531Sjairo.balart@metempsy.com sgn = get_sign(v); 50913531Sjairo.balart@metempsy.com if (sgn == SC_ZERO) { 51013531Sjairo.balart@metempsy.com vec_zero(ndigits, digit); 51113531Sjairo.balart@metempsy.com } else { 51213531Sjairo.balart@metempsy.com from_uint(ndigits, digit, v); 51313531Sjairo.balart@metempsy.com if (nbits <= (int)BITS_PER_LONG) 51413531Sjairo.balart@metempsy.com convert_SM_to_2C_to_SM(); 51513531Sjairo.balart@metempsy.com } 51613531Sjairo.balart@metempsy.com return *this; 51713531Sjairo.balart@metempsy.com} 51813531Sjairo.balart@metempsy.com 51913531Sjairo.balart@metempsy.comconst sc_signed & 52013531Sjairo.balart@metempsy.comsc_signed::operator=(double v) 52113531Sjairo.balart@metempsy.com{ 52213531Sjairo.balart@metempsy.com is_bad_double(v); 52313531Sjairo.balart@metempsy.com if (v < 0) { 52413531Sjairo.balart@metempsy.com v = -v; 52513531Sjairo.balart@metempsy.com sgn = SC_NEG; 52613531Sjairo.balart@metempsy.com } else { 52713531Sjairo.balart@metempsy.com sgn = SC_POS; 52813531Sjairo.balart@metempsy.com } 52913531Sjairo.balart@metempsy.com 53013531Sjairo.balart@metempsy.com int i = 0; 53113531Sjairo.balart@metempsy.com while (std::floor(v) && (i < ndigits)) { 53213531Sjairo.balart@metempsy.com digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) & 53313531Sjairo.balart@metempsy.com DIGIT_MASK; 53413531Sjairo.balart@metempsy.com v /= DIGIT_RADIX; 53513531Sjairo.balart@metempsy.com } 53613531Sjairo.balart@metempsy.com vec_zero(i, ndigits, digit); 53713531Sjairo.balart@metempsy.com convert_SM_to_2C_to_SM(); 53813531Sjairo.balart@metempsy.com return *this; 53913531Sjairo.balart@metempsy.com} 54013531Sjairo.balart@metempsy.com 54113531Sjairo.balart@metempsy.com 54213531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 54313531Sjairo.balart@metempsy.com 54413531Sjairo.balart@metempsy.comconst sc_signed & 54513531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_bv_base &v) 54613531Sjairo.balart@metempsy.com{ 54713531Sjairo.balart@metempsy.com int minlen = sc_min(nbits, v.length()); 54813531Sjairo.balart@metempsy.com int i = 0; 54913531Sjairo.balart@metempsy.com for (; i < minlen; ++i) { 55013531Sjairo.balart@metempsy.com safe_set(i, v.get_bit(i), digit); 55113531Sjairo.balart@metempsy.com } 55213531Sjairo.balart@metempsy.com for (; i < nbits; ++i) { 55313531Sjairo.balart@metempsy.com safe_set(i, 0, digit); // zero-extend 55413531Sjairo.balart@metempsy.com } 55513531Sjairo.balart@metempsy.com convert_2C_to_SM(); 55613531Sjairo.balart@metempsy.com return *this; 55713531Sjairo.balart@metempsy.com} 55813531Sjairo.balart@metempsy.com 55913531Sjairo.balart@metempsy.comconst sc_signed & 56013531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_lv_base &v) 56113531Sjairo.balart@metempsy.com{ 56213531Sjairo.balart@metempsy.com int minlen = sc_min(nbits, v.length()); 56313531Sjairo.balart@metempsy.com int i = 0; 56413531Sjairo.balart@metempsy.com for (; i < minlen; ++i) { 56513531Sjairo.balart@metempsy.com safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit); 56613531Sjairo.balart@metempsy.com } 56713531Sjairo.balart@metempsy.com for (; i < nbits; ++i) { 56813531Sjairo.balart@metempsy.com safe_set(i, 0, digit); // zero-extend 56913531Sjairo.balart@metempsy.com } 57013531Sjairo.balart@metempsy.com convert_2C_to_SM(); 57113531Sjairo.balart@metempsy.com return *this; 57213531Sjairo.balart@metempsy.com} 57313531Sjairo.balart@metempsy.com 57413531Sjairo.balart@metempsy.com 57513531Sjairo.balart@metempsy.com// explicit conversion to character string 57613531Sjairo.balart@metempsy.comconst std::string 57713531Sjairo.balart@metempsy.comsc_signed::to_string(sc_numrep numrep) const 57813531Sjairo.balart@metempsy.com{ 57913531Sjairo.balart@metempsy.com int len = length(); 58013531Sjairo.balart@metempsy.com sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON); 58113531Sjairo.balart@metempsy.com return aa.to_string(numrep); 58213531Sjairo.balart@metempsy.com} 58313531Sjairo.balart@metempsy.com 58413531Sjairo.balart@metempsy.comconst std::string 58513531Sjairo.balart@metempsy.comsc_signed::to_string(sc_numrep numrep, bool w_prefix) const 58613531Sjairo.balart@metempsy.com{ 58713531Sjairo.balart@metempsy.com int len = length(); 58813531Sjairo.balart@metempsy.com sc_fix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON); 58913531Sjairo.balart@metempsy.com return aa.to_string(numrep, w_prefix); 59013531Sjairo.balart@metempsy.com} 59113531Sjairo.balart@metempsy.com 59213531Sjairo.balart@metempsy.com 59313531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 59413531Sjairo.balart@metempsy.com// SECTION: Interfacing with sc_int_base 59513531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 59613531Sjairo.balart@metempsy.com 59713531Sjairo.balart@metempsy.comconst sc_signed & 59813531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_int_base &v) 59913531Sjairo.balart@metempsy.com{ 60013531Sjairo.balart@metempsy.com return operator = ((int64)v); 60113531Sjairo.balart@metempsy.com} 60213531Sjairo.balart@metempsy.com 60313531Sjairo.balart@metempsy.com 60413531Sjairo.balart@metempsy.comsc_signed 60513531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, const sc_int_base &v) 60613531Sjairo.balart@metempsy.com{ 60713531Sjairo.balart@metempsy.com return operator + (u, static_cast<int64>(v)); 60813531Sjairo.balart@metempsy.com} 60913531Sjairo.balart@metempsy.com 61013531Sjairo.balart@metempsy.comsc_signed 61113531Sjairo.balart@metempsy.comoperator + (const sc_int_base &u, const sc_unsigned &v) 61213531Sjairo.balart@metempsy.com{ 61313531Sjairo.balart@metempsy.com return operator + (static_cast<int64>(u), v); 61413531Sjairo.balart@metempsy.com} 61513531Sjairo.balart@metempsy.com 61613531Sjairo.balart@metempsy.comsc_signed 61713531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_int_base &v) 61813531Sjairo.balart@metempsy.com{ 61913531Sjairo.balart@metempsy.com return operator + (u, (int64)v); 62013531Sjairo.balart@metempsy.com} 62113531Sjairo.balart@metempsy.com 62213531Sjairo.balart@metempsy.comsc_signed 62313531Sjairo.balart@metempsy.comoperator + (const sc_int_base &u, const sc_signed &v) 62413531Sjairo.balart@metempsy.com{ 62513531Sjairo.balart@metempsy.com return operator + ((int64)u, v); 62613531Sjairo.balart@metempsy.com} 62713531Sjairo.balart@metempsy.com 62813531Sjairo.balart@metempsy.comconst sc_signed & 62913531Sjairo.balart@metempsy.comsc_signed::operator += (const sc_int_base &v) 63013531Sjairo.balart@metempsy.com{ 63113531Sjairo.balart@metempsy.com return operator += ((int64)v); 63213531Sjairo.balart@metempsy.com} 63313531Sjairo.balart@metempsy.com 63413531Sjairo.balart@metempsy.com 63513531Sjairo.balart@metempsy.comsc_signed 63613531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_int_base &v) 63713531Sjairo.balart@metempsy.com{ 63813531Sjairo.balart@metempsy.com return operator - (u, (int64)v); 63913531Sjairo.balart@metempsy.com} 64013531Sjairo.balart@metempsy.com 64113531Sjairo.balart@metempsy.comsc_signed 64213531Sjairo.balart@metempsy.comoperator - (const sc_int_base &u, const sc_unsigned &v) 64313531Sjairo.balart@metempsy.com{ 64413531Sjairo.balart@metempsy.com return operator - ((int64)u, v); 64513531Sjairo.balart@metempsy.com} 64613531Sjairo.balart@metempsy.com 64713531Sjairo.balart@metempsy.comsc_signed 64813531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_int_base &v) 64913531Sjairo.balart@metempsy.com{ 65013531Sjairo.balart@metempsy.com return operator - (u, (int64)v); 65113531Sjairo.balart@metempsy.com} 65213531Sjairo.balart@metempsy.com 65313531Sjairo.balart@metempsy.comsc_signed 65413531Sjairo.balart@metempsy.comoperator - (const sc_int_base &u, const sc_signed &v) 65513531Sjairo.balart@metempsy.com{ 65613531Sjairo.balart@metempsy.com return operator - ((int64)u, v); 65713531Sjairo.balart@metempsy.com} 65813531Sjairo.balart@metempsy.com 65913531Sjairo.balart@metempsy.comconst sc_signed & 66013531Sjairo.balart@metempsy.comsc_signed::operator -= (const sc_int_base &v) 66113531Sjairo.balart@metempsy.com{ 66213531Sjairo.balart@metempsy.com return operator -= ((int64)v); 66313531Sjairo.balart@metempsy.com} 66413531Sjairo.balart@metempsy.com 66513531Sjairo.balart@metempsy.com 66613531Sjairo.balart@metempsy.comsc_signed 66713531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, const sc_int_base &v) 66813531Sjairo.balart@metempsy.com{ 66913531Sjairo.balart@metempsy.com return operator * (u, static_cast<int64>(v)); 67013531Sjairo.balart@metempsy.com} 67113531Sjairo.balart@metempsy.com 67213531Sjairo.balart@metempsy.comsc_signed 67313531Sjairo.balart@metempsy.comoperator * (const sc_int_base &u, const sc_unsigned &v) 67413531Sjairo.balart@metempsy.com{ 67513531Sjairo.balart@metempsy.com return operator * (static_cast<int64>(u), v); 67613531Sjairo.balart@metempsy.com} 67713531Sjairo.balart@metempsy.com 67813531Sjairo.balart@metempsy.comsc_signed 67913531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_int_base &v) 68013531Sjairo.balart@metempsy.com{ 68113531Sjairo.balart@metempsy.com return operator * (u, (int64)v); 68213531Sjairo.balart@metempsy.com} 68313531Sjairo.balart@metempsy.com 68413531Sjairo.balart@metempsy.comsc_signed 68513531Sjairo.balart@metempsy.comoperator * (const sc_int_base &u, const sc_signed &v) 68613531Sjairo.balart@metempsy.com{ 68713531Sjairo.balart@metempsy.com return operator * ((int64)u, v); 68813531Sjairo.balart@metempsy.com} 68913531Sjairo.balart@metempsy.com 69013531Sjairo.balart@metempsy.comconst sc_signed & 69113531Sjairo.balart@metempsy.comsc_signed::operator *= (const sc_int_base &v) 69213531Sjairo.balart@metempsy.com{ 69313531Sjairo.balart@metempsy.com return operator *= ((int64)v); 69413531Sjairo.balart@metempsy.com} 69513531Sjairo.balart@metempsy.com 69613531Sjairo.balart@metempsy.com 69713531Sjairo.balart@metempsy.comsc_signed 69813531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, const sc_int_base &v) 69913531Sjairo.balart@metempsy.com{ 70013531Sjairo.balart@metempsy.com return operator / (u, static_cast<int64>(v)); 70113531Sjairo.balart@metempsy.com} 70213531Sjairo.balart@metempsy.com 70313531Sjairo.balart@metempsy.comsc_signed 70413531Sjairo.balart@metempsy.comoperator / (const sc_int_base &u, const sc_unsigned &v) 70513531Sjairo.balart@metempsy.com{ 70613531Sjairo.balart@metempsy.com return operator / (static_cast<int64>(u), v); 70713531Sjairo.balart@metempsy.com} 70813531Sjairo.balart@metempsy.com 70913531Sjairo.balart@metempsy.comsc_signed 71013531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_int_base &v) 71113531Sjairo.balart@metempsy.com{ 71213531Sjairo.balart@metempsy.com return operator / (u, (int64)v); 71313531Sjairo.balart@metempsy.com} 71413531Sjairo.balart@metempsy.com 71513531Sjairo.balart@metempsy.comsc_signed 71613531Sjairo.balart@metempsy.comoperator / (const sc_int_base &u, const sc_signed &v) 71713531Sjairo.balart@metempsy.com{ 71813531Sjairo.balart@metempsy.com return operator / ((int64)u, v); 71913531Sjairo.balart@metempsy.com} 72013531Sjairo.balart@metempsy.com 72113531Sjairo.balart@metempsy.comconst sc_signed & 72213531Sjairo.balart@metempsy.comsc_signed::operator /= (const sc_int_base &v) 72313531Sjairo.balart@metempsy.com{ 72413531Sjairo.balart@metempsy.com return operator /= ((int64)v); 72513531Sjairo.balart@metempsy.com} 72613531Sjairo.balart@metempsy.com 72713531Sjairo.balart@metempsy.com 72813531Sjairo.balart@metempsy.comsc_signed 72913531Sjairo.balart@metempsy.comoperator % (const sc_unsigned &u, const sc_int_base &v) 73013531Sjairo.balart@metempsy.com{ 73113531Sjairo.balart@metempsy.com return operator % (u, static_cast<int64>(v)); 73213531Sjairo.balart@metempsy.com} 73313531Sjairo.balart@metempsy.com 73413531Sjairo.balart@metempsy.comsc_signed 73513531Sjairo.balart@metempsy.comoperator % (const sc_int_base &u, const sc_unsigned &v) 73613531Sjairo.balart@metempsy.com{ 73713531Sjairo.balart@metempsy.com return operator % (static_cast<int64>(u), v); 73813531Sjairo.balart@metempsy.com} 73913531Sjairo.balart@metempsy.com 74013531Sjairo.balart@metempsy.comsc_signed 74113531Sjairo.balart@metempsy.comoperator % (const sc_signed &u, const sc_int_base &v) 74213531Sjairo.balart@metempsy.com{ 74313531Sjairo.balart@metempsy.com return operator % (u, (int64)v); 74413531Sjairo.balart@metempsy.com} 74513531Sjairo.balart@metempsy.com 74613531Sjairo.balart@metempsy.comsc_signed 74713531Sjairo.balart@metempsy.comoperator % (const sc_int_base &u, const sc_signed &v) 74813531Sjairo.balart@metempsy.com{ 74913531Sjairo.balart@metempsy.com return operator % ((int64)u, v); 75013531Sjairo.balart@metempsy.com} 75113531Sjairo.balart@metempsy.com 75213531Sjairo.balart@metempsy.comconst sc_signed & 75313531Sjairo.balart@metempsy.comsc_signed::operator %= (const sc_int_base &v) 75413531Sjairo.balart@metempsy.com{ 75513531Sjairo.balart@metempsy.com return operator %= ((int64)v); 75613531Sjairo.balart@metempsy.com} 75713531Sjairo.balart@metempsy.com 75813531Sjairo.balart@metempsy.com 75913531Sjairo.balart@metempsy.comsc_signed 76013531Sjairo.balart@metempsy.comoperator & (const sc_unsigned &u, const sc_int_base &v) 76113531Sjairo.balart@metempsy.com{ 76213531Sjairo.balart@metempsy.com return operator & (u, static_cast<int64>(v)); 76313531Sjairo.balart@metempsy.com} 76413531Sjairo.balart@metempsy.com 76513531Sjairo.balart@metempsy.comsc_signed 76613531Sjairo.balart@metempsy.comoperator & (const sc_int_base &u, const sc_unsigned &v) 76713531Sjairo.balart@metempsy.com{ 76813531Sjairo.balart@metempsy.com return operator & (static_cast<int64>(u), v); 76913531Sjairo.balart@metempsy.com} 77013531Sjairo.balart@metempsy.com 77113531Sjairo.balart@metempsy.comsc_signed 77213531Sjairo.balart@metempsy.comoperator & (const sc_signed &u, const sc_int_base &v) 77313531Sjairo.balart@metempsy.com{ 77413531Sjairo.balart@metempsy.com return operator & (u, (int64)v); 77513531Sjairo.balart@metempsy.com} 77613531Sjairo.balart@metempsy.com 77713531Sjairo.balart@metempsy.comsc_signed 77813531Sjairo.balart@metempsy.comoperator & (const sc_int_base &u, const sc_signed &v) 77913531Sjairo.balart@metempsy.com{ 78013531Sjairo.balart@metempsy.com return operator & ((int64)u, v); 78113531Sjairo.balart@metempsy.com} 78213531Sjairo.balart@metempsy.com 78313531Sjairo.balart@metempsy.comconst sc_signed & 78413531Sjairo.balart@metempsy.comsc_signed::operator &= (const sc_int_base &v) 78513531Sjairo.balart@metempsy.com{ 78613531Sjairo.balart@metempsy.com return operator &= ((int64)v); 78713531Sjairo.balart@metempsy.com} 78813531Sjairo.balart@metempsy.com 78913531Sjairo.balart@metempsy.com 79013531Sjairo.balart@metempsy.comsc_signed 79113531Sjairo.balart@metempsy.comoperator | (const sc_unsigned &u, const sc_int_base &v) 79213531Sjairo.balart@metempsy.com{ 79313531Sjairo.balart@metempsy.com return operator | (u, static_cast<int64>(v)); 79413531Sjairo.balart@metempsy.com} 79513531Sjairo.balart@metempsy.com 79613531Sjairo.balart@metempsy.comsc_signed 79713531Sjairo.balart@metempsy.comoperator | (const sc_int_base &u, const sc_unsigned &v) 79813531Sjairo.balart@metempsy.com{ 79913531Sjairo.balart@metempsy.com return operator | (static_cast<int64>(u), v); 80013531Sjairo.balart@metempsy.com} 80113531Sjairo.balart@metempsy.com 80213531Sjairo.balart@metempsy.comsc_signed 80313531Sjairo.balart@metempsy.comoperator | (const sc_signed& u, const sc_int_base &v) 80413531Sjairo.balart@metempsy.com{ 80513531Sjairo.balart@metempsy.com return operator|(u, (int64)v); 80613531Sjairo.balart@metempsy.com} 80713531Sjairo.balart@metempsy.com 80813531Sjairo.balart@metempsy.comsc_signed 80913531Sjairo.balart@metempsy.comoperator | (const sc_int_base &u, const sc_signed &v) 81013531Sjairo.balart@metempsy.com{ 81113531Sjairo.balart@metempsy.com return operator | ((int64)u, v); 81213531Sjairo.balart@metempsy.com} 81313531Sjairo.balart@metempsy.com 81413531Sjairo.balart@metempsy.comconst sc_signed & 81513531Sjairo.balart@metempsy.comsc_signed::operator |= (const sc_int_base &v) 81613531Sjairo.balart@metempsy.com{ 81713531Sjairo.balart@metempsy.com return operator |= ((int64)v); 81813531Sjairo.balart@metempsy.com} 81913531Sjairo.balart@metempsy.com 82013531Sjairo.balart@metempsy.com 82113531Sjairo.balart@metempsy.comsc_signed 82213531Sjairo.balart@metempsy.comoperator ^ (const sc_unsigned &u, const sc_int_base &v) 82313531Sjairo.balart@metempsy.com{ 82413531Sjairo.balart@metempsy.com return operator ^ (u, static_cast<int64>(v)); 82513531Sjairo.balart@metempsy.com} 82613531Sjairo.balart@metempsy.com 82713531Sjairo.balart@metempsy.comsc_signed 82813531Sjairo.balart@metempsy.comoperator ^ (const sc_int_base &u, const sc_unsigned &v) 82913531Sjairo.balart@metempsy.com{ 83013531Sjairo.balart@metempsy.com return operator ^ (static_cast<int64>(u), v); 83113531Sjairo.balart@metempsy.com} 83213531Sjairo.balart@metempsy.com 83313531Sjairo.balart@metempsy.comsc_signed 83413531Sjairo.balart@metempsy.comoperator ^ (const sc_signed &u, const sc_int_base &v) 83513531Sjairo.balart@metempsy.com{ 83613531Sjairo.balart@metempsy.com return operator ^ (u, (int64)v); 83713531Sjairo.balart@metempsy.com} 83813531Sjairo.balart@metempsy.com 83913531Sjairo.balart@metempsy.comsc_signed 84013531Sjairo.balart@metempsy.comoperator ^ (const sc_int_base &u, const sc_signed &v) 84113531Sjairo.balart@metempsy.com{ 84213531Sjairo.balart@metempsy.com return operator ^ ((int64)u, v); 84313531Sjairo.balart@metempsy.com} 84413531Sjairo.balart@metempsy.com 84513531Sjairo.balart@metempsy.comconst sc_signed & 84613531Sjairo.balart@metempsy.comsc_signed::operator ^= (const sc_int_base &v) 84713531Sjairo.balart@metempsy.com{ 84813531Sjairo.balart@metempsy.com return operator ^= ((int64)v); 84913531Sjairo.balart@metempsy.com} 85013531Sjairo.balart@metempsy.com 85113531Sjairo.balart@metempsy.com 85213531Sjairo.balart@metempsy.comsc_signed 85313531Sjairo.balart@metempsy.comoperator << (const sc_signed &u, const sc_int_base &v) 85413531Sjairo.balart@metempsy.com{ 85513531Sjairo.balart@metempsy.com return operator << (u, (int64)v); 85613531Sjairo.balart@metempsy.com} 85713531Sjairo.balart@metempsy.com 85813531Sjairo.balart@metempsy.comconst sc_signed & 85913531Sjairo.balart@metempsy.comsc_signed::operator <<= (const sc_int_base &v) 86013531Sjairo.balart@metempsy.com{ 86113531Sjairo.balart@metempsy.com return operator <<= ((int64)v); 86213531Sjairo.balart@metempsy.com} 86313531Sjairo.balart@metempsy.com 86413531Sjairo.balart@metempsy.com 86513531Sjairo.balart@metempsy.comsc_signed 86613531Sjairo.balart@metempsy.comoperator >> (const sc_signed &u, const sc_int_base &v) 86713531Sjairo.balart@metempsy.com{ 86813531Sjairo.balart@metempsy.com return operator >> (u, (int64)v); 86913531Sjairo.balart@metempsy.com} 87013531Sjairo.balart@metempsy.com 87113531Sjairo.balart@metempsy.comconst sc_signed & 87213531Sjairo.balart@metempsy.comsc_signed::operator >>= (const sc_int_base &v) 87313531Sjairo.balart@metempsy.com{ 87413531Sjairo.balart@metempsy.com return operator >>= ((int64)v); 87513531Sjairo.balart@metempsy.com} 87613531Sjairo.balart@metempsy.com 87713531Sjairo.balart@metempsy.com 87813531Sjairo.balart@metempsy.combool 87913531Sjairo.balart@metempsy.comoperator == (const sc_signed &u, const sc_int_base &v) 88013531Sjairo.balart@metempsy.com{ 88113531Sjairo.balart@metempsy.com return operator == (u, (int64)v); 88213531Sjairo.balart@metempsy.com} 88313531Sjairo.balart@metempsy.com 88413531Sjairo.balart@metempsy.combool 88513531Sjairo.balart@metempsy.comoperator == (const sc_int_base &u, const sc_signed &v) 88613531Sjairo.balart@metempsy.com{ 88713531Sjairo.balart@metempsy.com return operator == ((int64)u, v); 88813531Sjairo.balart@metempsy.com} 88913531Sjairo.balart@metempsy.com 89013531Sjairo.balart@metempsy.com 89113531Sjairo.balart@metempsy.combool 89213531Sjairo.balart@metempsy.comoperator != (const sc_signed &u, const sc_int_base &v) 89313531Sjairo.balart@metempsy.com{ 89413531Sjairo.balart@metempsy.com return operator != (u, (int64)v); 89513531Sjairo.balart@metempsy.com} 89613531Sjairo.balart@metempsy.com 89713531Sjairo.balart@metempsy.combool 89813531Sjairo.balart@metempsy.comoperator != (const sc_int_base &u, const sc_signed &v) 89913531Sjairo.balart@metempsy.com{ 90013531Sjairo.balart@metempsy.com return operator != ((int64)u, v); 90113531Sjairo.balart@metempsy.com} 90213531Sjairo.balart@metempsy.com 90313531Sjairo.balart@metempsy.com 90413531Sjairo.balart@metempsy.combool 90513531Sjairo.balart@metempsy.comoperator < (const sc_signed &u, const sc_int_base &v) 90613531Sjairo.balart@metempsy.com{ 90713531Sjairo.balart@metempsy.com return operator < (u, (int64)v); 90813531Sjairo.balart@metempsy.com} 90913531Sjairo.balart@metempsy.com 91013531Sjairo.balart@metempsy.combool 91113531Sjairo.balart@metempsy.comoperator < (const sc_int_base &u, const sc_signed &v) 91213531Sjairo.balart@metempsy.com{ 91313531Sjairo.balart@metempsy.com return operator < ((int64)u, v); 91413531Sjairo.balart@metempsy.com} 91513531Sjairo.balart@metempsy.com 91613531Sjairo.balart@metempsy.com 91713531Sjairo.balart@metempsy.combool 91813531Sjairo.balart@metempsy.comoperator <= (const sc_signed &u, const sc_int_base &v) 91913531Sjairo.balart@metempsy.com{ 92013531Sjairo.balart@metempsy.com return operator <= (u, (int64)v); 92113531Sjairo.balart@metempsy.com} 92213531Sjairo.balart@metempsy.com 92313531Sjairo.balart@metempsy.combool 92413531Sjairo.balart@metempsy.comoperator <= (const sc_int_base &u, const sc_signed &v) 92513531Sjairo.balart@metempsy.com{ 92613531Sjairo.balart@metempsy.com return operator <= ((int64)u, v); 92713531Sjairo.balart@metempsy.com} 92813531Sjairo.balart@metempsy.com 92913531Sjairo.balart@metempsy.com 93013531Sjairo.balart@metempsy.combool 93113531Sjairo.balart@metempsy.comoperator > (const sc_signed &u, const sc_int_base &v) 93213531Sjairo.balart@metempsy.com{ 93313531Sjairo.balart@metempsy.com return operator > (u, (int64)v); 93413531Sjairo.balart@metempsy.com} 93513531Sjairo.balart@metempsy.com 93613531Sjairo.balart@metempsy.combool 93713531Sjairo.balart@metempsy.comoperator > (const sc_int_base &u, const sc_signed &v) 93813531Sjairo.balart@metempsy.com{ 93913531Sjairo.balart@metempsy.com return operator > ((int64)u, v); 94013531Sjairo.balart@metempsy.com} 94113531Sjairo.balart@metempsy.com 94213531Sjairo.balart@metempsy.com 94313531Sjairo.balart@metempsy.combool 94413531Sjairo.balart@metempsy.comoperator >= (const sc_signed &u, const sc_int_base &v) 94513531Sjairo.balart@metempsy.com{ 94613531Sjairo.balart@metempsy.com return operator >= (u, (int64)v); 94713531Sjairo.balart@metempsy.com} 94813531Sjairo.balart@metempsy.com 94913531Sjairo.balart@metempsy.combool 95013531Sjairo.balart@metempsy.comoperator >= (const sc_int_base &u, const sc_signed &v) 95113531Sjairo.balart@metempsy.com{ 95213531Sjairo.balart@metempsy.com return operator >= ((int64)u, v); 95313531Sjairo.balart@metempsy.com} 95413531Sjairo.balart@metempsy.com 95513531Sjairo.balart@metempsy.com 95613531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 95713531Sjairo.balart@metempsy.com// SECTION: Interfacing with sc_uint_base 95813531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 95913531Sjairo.balart@metempsy.com 96013531Sjairo.balart@metempsy.comconst sc_signed & 96113531Sjairo.balart@metempsy.comsc_signed::operator = (const sc_uint_base &v) 96213531Sjairo.balart@metempsy.com{ 96313531Sjairo.balart@metempsy.com return operator = ((uint64)v); 96413531Sjairo.balart@metempsy.com} 96513531Sjairo.balart@metempsy.com 96613531Sjairo.balart@metempsy.com 96713531Sjairo.balart@metempsy.comsc_signed 96813531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_uint_base &v) 96913531Sjairo.balart@metempsy.com{ 97013531Sjairo.balart@metempsy.com return operator + (u, (uint64)v); 97113531Sjairo.balart@metempsy.com} 97213531Sjairo.balart@metempsy.com 97313531Sjairo.balart@metempsy.comsc_signed 97413531Sjairo.balart@metempsy.comoperator + (const sc_uint_base &u, const sc_signed &v) 97513531Sjairo.balart@metempsy.com{ 97613531Sjairo.balart@metempsy.com return operator + ((uint64)u, v); 97713531Sjairo.balart@metempsy.com} 97813531Sjairo.balart@metempsy.com 97913531Sjairo.balart@metempsy.comconst sc_signed & 98013531Sjairo.balart@metempsy.comsc_signed::operator += (const sc_uint_base &v) 98113531Sjairo.balart@metempsy.com{ 98213531Sjairo.balart@metempsy.com return operator += ((uint64)v); 98313531Sjairo.balart@metempsy.com} 98413531Sjairo.balart@metempsy.com 98513531Sjairo.balart@metempsy.com 98613531Sjairo.balart@metempsy.comsc_signed 98713531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_uint_base &v) 98813531Sjairo.balart@metempsy.com{ 98913531Sjairo.balart@metempsy.com return operator - (u, (uint64)v); 99013531Sjairo.balart@metempsy.com} 99113531Sjairo.balart@metempsy.com 99213531Sjairo.balart@metempsy.comsc_signed 99313531Sjairo.balart@metempsy.comoperator - (const sc_uint_base &u, const sc_unsigned &v) 99413531Sjairo.balart@metempsy.com{ 99513531Sjairo.balart@metempsy.com return operator - ((uint64)u, v); 99613531Sjairo.balart@metempsy.com} 99713531Sjairo.balart@metempsy.com 99813531Sjairo.balart@metempsy.comsc_signed 99913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_uint_base &v) 100013531Sjairo.balart@metempsy.com{ 100113531Sjairo.balart@metempsy.com return operator - (u, (uint64)v); 100213531Sjairo.balart@metempsy.com} 100313531Sjairo.balart@metempsy.com 100413531Sjairo.balart@metempsy.comsc_signed 100513531Sjairo.balart@metempsy.comoperator - (const sc_uint_base &u, const sc_signed &v) 100613531Sjairo.balart@metempsy.com{ 100713531Sjairo.balart@metempsy.com return operator - ((uint64)u, v); 100813531Sjairo.balart@metempsy.com} 100913531Sjairo.balart@metempsy.com 101013531Sjairo.balart@metempsy.comconst sc_signed & 101113531Sjairo.balart@metempsy.comsc_signed::operator -= (const sc_uint_base &v) 101213531Sjairo.balart@metempsy.com{ 101313531Sjairo.balart@metempsy.com return operator -= ((uint64)v); 101413531Sjairo.balart@metempsy.com} 101513531Sjairo.balart@metempsy.com 101613531Sjairo.balart@metempsy.com 101713531Sjairo.balart@metempsy.comsc_signed 101813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_uint_base &v) 101913531Sjairo.balart@metempsy.com{ 102013531Sjairo.balart@metempsy.com return operator * (u, (uint64)v); 102113531Sjairo.balart@metempsy.com} 102213531Sjairo.balart@metempsy.com 102313531Sjairo.balart@metempsy.comsc_signed 102413531Sjairo.balart@metempsy.comoperator * (const sc_uint_base &u, const sc_signed &v) 102513531Sjairo.balart@metempsy.com{ 102613531Sjairo.balart@metempsy.com return operator * ((uint64)u, v); 102713531Sjairo.balart@metempsy.com} 102813531Sjairo.balart@metempsy.com 102913531Sjairo.balart@metempsy.comconst sc_signed & 103013531Sjairo.balart@metempsy.comsc_signed::operator *= (const sc_uint_base &v) 103113531Sjairo.balart@metempsy.com{ 103213531Sjairo.balart@metempsy.com return operator *= ((uint64)v); 103313531Sjairo.balart@metempsy.com} 103413531Sjairo.balart@metempsy.com 103513531Sjairo.balart@metempsy.com 103613531Sjairo.balart@metempsy.comsc_signed 103713531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_uint_base &v) 103813531Sjairo.balart@metempsy.com{ 103913531Sjairo.balart@metempsy.com return operator / (u, (uint64)v); 104013531Sjairo.balart@metempsy.com} 104113531Sjairo.balart@metempsy.com 104213531Sjairo.balart@metempsy.comsc_signed 104313531Sjairo.balart@metempsy.comoperator / (const sc_uint_base &u, const sc_signed &v) 104413531Sjairo.balart@metempsy.com{ 104513531Sjairo.balart@metempsy.com return operator / ((uint64)u, v); 104613531Sjairo.balart@metempsy.com} 104713531Sjairo.balart@metempsy.com 104813531Sjairo.balart@metempsy.comconst sc_signed & 104913531Sjairo.balart@metempsy.comsc_signed::operator /= (const sc_uint_base &v) 105013531Sjairo.balart@metempsy.com{ 105113531Sjairo.balart@metempsy.com return operator /= ((uint64)v); 105213531Sjairo.balart@metempsy.com} 105313531Sjairo.balart@metempsy.com 105413531Sjairo.balart@metempsy.com 105513531Sjairo.balart@metempsy.comsc_signed 105613531Sjairo.balart@metempsy.comoperator % (const sc_signed &u, const sc_uint_base &v) 105713531Sjairo.balart@metempsy.com{ 105813531Sjairo.balart@metempsy.com return operator % (u, (uint64)v); 105913531Sjairo.balart@metempsy.com} 106013531Sjairo.balart@metempsy.com 106113531Sjairo.balart@metempsy.comsc_signed 106213531Sjairo.balart@metempsy.comoperator % (const sc_uint_base &u, const sc_signed &v) 106313531Sjairo.balart@metempsy.com{ 106413531Sjairo.balart@metempsy.com return operator % ((uint64)u, v); 106513531Sjairo.balart@metempsy.com} 106613531Sjairo.balart@metempsy.com 106713531Sjairo.balart@metempsy.comconst sc_signed& 106813531Sjairo.balart@metempsy.comsc_signed::operator %= (const sc_uint_base &v) 106913531Sjairo.balart@metempsy.com{ 107013531Sjairo.balart@metempsy.com return operator %= ((uint64)v); 107113531Sjairo.balart@metempsy.com} 107213531Sjairo.balart@metempsy.com 107313531Sjairo.balart@metempsy.com 107413531Sjairo.balart@metempsy.comsc_signed 107513531Sjairo.balart@metempsy.comoperator & (const sc_signed &u, const sc_uint_base &v) 107613531Sjairo.balart@metempsy.com{ 107713531Sjairo.balart@metempsy.com return operator & (u, (uint64)v); 107813531Sjairo.balart@metempsy.com} 107913531Sjairo.balart@metempsy.com 108013531Sjairo.balart@metempsy.comsc_signed 108113531Sjairo.balart@metempsy.comoperator & (const sc_uint_base &u, const sc_signed &v) 108213531Sjairo.balart@metempsy.com{ 108313531Sjairo.balart@metempsy.com return operator & ((uint64)u, v); 108413531Sjairo.balart@metempsy.com} 108513531Sjairo.balart@metempsy.com 108613531Sjairo.balart@metempsy.comconst sc_signed & 108713531Sjairo.balart@metempsy.comsc_signed::operator &= (const sc_uint_base &v) 108813531Sjairo.balart@metempsy.com{ 108913531Sjairo.balart@metempsy.com return operator &= ((uint64)v); 109013531Sjairo.balart@metempsy.com} 109113531Sjairo.balart@metempsy.com 109213531Sjairo.balart@metempsy.com 109313531Sjairo.balart@metempsy.comsc_signed 109413531Sjairo.balart@metempsy.comoperator | (const sc_signed &u, const sc_uint_base &v) 109513531Sjairo.balart@metempsy.com{ 109613531Sjairo.balart@metempsy.com return operator | (u, (uint64)v); 109713531Sjairo.balart@metempsy.com} 109813531Sjairo.balart@metempsy.com 109913531Sjairo.balart@metempsy.comsc_signed 110013531Sjairo.balart@metempsy.comoperator | (const sc_uint_base &u, const sc_signed &v) 110113531Sjairo.balart@metempsy.com{ 110213531Sjairo.balart@metempsy.com return operator | ((uint64)u, v); 110313531Sjairo.balart@metempsy.com} 110413531Sjairo.balart@metempsy.com 110513531Sjairo.balart@metempsy.comconst sc_signed & 110613531Sjairo.balart@metempsy.comsc_signed::operator |= (const sc_uint_base &v) 110713531Sjairo.balart@metempsy.com{ 110813531Sjairo.balart@metempsy.com return operator |= ((uint64)v); 110913531Sjairo.balart@metempsy.com} 111013531Sjairo.balart@metempsy.com 111113531Sjairo.balart@metempsy.com 111213531Sjairo.balart@metempsy.comsc_signed 111313531Sjairo.balart@metempsy.comoperator ^ (const sc_signed &u, const sc_uint_base &v) 111413531Sjairo.balart@metempsy.com{ 111513531Sjairo.balart@metempsy.com return operator ^ (u, (uint64)v); 111613531Sjairo.balart@metempsy.com} 111713531Sjairo.balart@metempsy.com 111813531Sjairo.balart@metempsy.comsc_signed 111913531Sjairo.balart@metempsy.comoperator ^ (const sc_uint_base &u, const sc_signed &v) 112013531Sjairo.balart@metempsy.com{ 112113531Sjairo.balart@metempsy.com return operator ^ ((uint64)u, v); 112213531Sjairo.balart@metempsy.com} 112313531Sjairo.balart@metempsy.com 112413531Sjairo.balart@metempsy.comconst sc_signed & 112513531Sjairo.balart@metempsy.comsc_signed::operator ^= (const sc_uint_base &v) 112613531Sjairo.balart@metempsy.com{ 112713531Sjairo.balart@metempsy.com return operator ^= ((uint64)v); 112813531Sjairo.balart@metempsy.com} 112913531Sjairo.balart@metempsy.com 113013531Sjairo.balart@metempsy.com 113113531Sjairo.balart@metempsy.comsc_signed 113213531Sjairo.balart@metempsy.comoperator << (const sc_signed &u, const sc_uint_base &v) 113313531Sjairo.balart@metempsy.com{ 113413531Sjairo.balart@metempsy.com return operator << (u, (uint64)v); 113513531Sjairo.balart@metempsy.com} 113613531Sjairo.balart@metempsy.com 113713531Sjairo.balart@metempsy.comconst sc_signed & 113813531Sjairo.balart@metempsy.comsc_signed::operator <<= (const sc_uint_base &v) 113913531Sjairo.balart@metempsy.com{ 114013531Sjairo.balart@metempsy.com return operator <<= ((uint64)v); 114113531Sjairo.balart@metempsy.com} 114213531Sjairo.balart@metempsy.com 114313531Sjairo.balart@metempsy.com 114413531Sjairo.balart@metempsy.comsc_signed 114513531Sjairo.balart@metempsy.comoperator >> (const sc_signed& u, const sc_uint_base& v) 114613531Sjairo.balart@metempsy.com{ 114713531Sjairo.balart@metempsy.com return operator >> (u, (uint64)v); 114813531Sjairo.balart@metempsy.com} 114913531Sjairo.balart@metempsy.com 115013531Sjairo.balart@metempsy.comconst sc_signed & 115113531Sjairo.balart@metempsy.comsc_signed::operator >>= (const sc_uint_base& v) 115213531Sjairo.balart@metempsy.com{ 115313531Sjairo.balart@metempsy.com return operator >>= ((uint64)v); 115413531Sjairo.balart@metempsy.com} 115513531Sjairo.balart@metempsy.com 115613531Sjairo.balart@metempsy.com 115713531Sjairo.balart@metempsy.combool 115813531Sjairo.balart@metempsy.comoperator == (const sc_signed &u, const sc_uint_base &v) 115913531Sjairo.balart@metempsy.com{ 116013531Sjairo.balart@metempsy.com return operator == (u, (uint64)v); 116113531Sjairo.balart@metempsy.com} 116213531Sjairo.balart@metempsy.com 116313531Sjairo.balart@metempsy.combool 116413531Sjairo.balart@metempsy.comoperator == (const sc_uint_base &u, const sc_signed &v) 116513531Sjairo.balart@metempsy.com{ 116613531Sjairo.balart@metempsy.com return operator == ((uint64)u, v); 116713531Sjairo.balart@metempsy.com} 116813531Sjairo.balart@metempsy.com 116913531Sjairo.balart@metempsy.com 117013531Sjairo.balart@metempsy.combool 117113531Sjairo.balart@metempsy.comoperator != (const sc_signed &u, const sc_uint_base &v) 117213531Sjairo.balart@metempsy.com{ 117313531Sjairo.balart@metempsy.com return operator != (u, (uint64)v); 117413531Sjairo.balart@metempsy.com} 117513531Sjairo.balart@metempsy.com 117613531Sjairo.balart@metempsy.combool 117713531Sjairo.balart@metempsy.comoperator != (const sc_uint_base &u, const sc_signed &v) 117813531Sjairo.balart@metempsy.com{ 117913531Sjairo.balart@metempsy.com return operator != ((uint64)u, v); 118013531Sjairo.balart@metempsy.com} 118113531Sjairo.balart@metempsy.com 118213531Sjairo.balart@metempsy.com 118313531Sjairo.balart@metempsy.combool 118413531Sjairo.balart@metempsy.comoperator < (const sc_signed &u, const sc_uint_base &v) 118513531Sjairo.balart@metempsy.com{ 118613531Sjairo.balart@metempsy.com return operator < (u, (uint64)v); 118713531Sjairo.balart@metempsy.com} 118813531Sjairo.balart@metempsy.com 118913531Sjairo.balart@metempsy.combool 119013531Sjairo.balart@metempsy.comoperator < (const sc_uint_base &u, const sc_signed &v) 119113531Sjairo.balart@metempsy.com{ 119213531Sjairo.balart@metempsy.com return operator < ((uint64)u, v); 119313531Sjairo.balart@metempsy.com} 119413531Sjairo.balart@metempsy.com 119513531Sjairo.balart@metempsy.com 119613531Sjairo.balart@metempsy.combool 119713531Sjairo.balart@metempsy.comoperator <= (const sc_signed &u, const sc_uint_base &v) 119813531Sjairo.balart@metempsy.com{ 119913531Sjairo.balart@metempsy.com return operator <= (u, (uint64)v); 120013531Sjairo.balart@metempsy.com} 120113531Sjairo.balart@metempsy.com 120213531Sjairo.balart@metempsy.combool 120313531Sjairo.balart@metempsy.comoperator <= (const sc_uint_base &u, const sc_signed &v) 120413531Sjairo.balart@metempsy.com{ 120513531Sjairo.balart@metempsy.com return operator <= ((uint64)u, v); 120613531Sjairo.balart@metempsy.com} 120713531Sjairo.balart@metempsy.com 120813531Sjairo.balart@metempsy.com 120913531Sjairo.balart@metempsy.combool 121013531Sjairo.balart@metempsy.comoperator > (const sc_signed &u, const sc_uint_base &v) 121113531Sjairo.balart@metempsy.com{ 121213531Sjairo.balart@metempsy.com return operator > (u, (uint64)v); 121313531Sjairo.balart@metempsy.com} 121413531Sjairo.balart@metempsy.com 121513531Sjairo.balart@metempsy.combool 121613531Sjairo.balart@metempsy.comoperator > (const sc_uint_base &u, const sc_signed &v) 121713531Sjairo.balart@metempsy.com{ 121813531Sjairo.balart@metempsy.com return operator > ((uint64)u, v); 121913531Sjairo.balart@metempsy.com} 122013531Sjairo.balart@metempsy.com 122113531Sjairo.balart@metempsy.com 122213531Sjairo.balart@metempsy.combool 122313531Sjairo.balart@metempsy.comoperator >= (const sc_signed &u, const sc_uint_base &v) 122413531Sjairo.balart@metempsy.com{ 122513531Sjairo.balart@metempsy.com return operator >= (u, (uint64)v); 122613531Sjairo.balart@metempsy.com} 122713531Sjairo.balart@metempsy.com 122813531Sjairo.balart@metempsy.combool 122913531Sjairo.balart@metempsy.comoperator >= (const sc_uint_base &u, const sc_signed &v) 123013531Sjairo.balart@metempsy.com{ 123113531Sjairo.balart@metempsy.com return operator >= ((uint64)u, v); 123213531Sjairo.balart@metempsy.com} 123313531Sjairo.balart@metempsy.com 123413531Sjairo.balart@metempsy.com 123513531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 123613531Sjairo.balart@metempsy.com// SECTION: Input and output operators 123713531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 123813531Sjairo.balart@metempsy.com 123913531Sjairo.balart@metempsy.com// Operators in this section are included from sc_nbcommon.cpp. 124013531Sjairo.balart@metempsy.com 124113531Sjairo.balart@metempsy.com 124213531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 124313531Sjairo.balart@metempsy.com// SECTION: Operator macros. 124413531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 124513531Sjairo.balart@metempsy.com 124613531Sjairo.balart@metempsy.com#define CONVERT_LONG(u) \ 124713531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \ 124813531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_ULONG]; \ 124913531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); 125013531Sjairo.balart@metempsy.com 125113531Sjairo.balart@metempsy.com#define CONVERT_LONG_2(u) \ 125213531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_ULONG]; \ 125313531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); 125413531Sjairo.balart@metempsy.com 125513531Sjairo.balart@metempsy.com#define CONVERT_INT(u) \ 125613531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \ 125713531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT]; \ 125813531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); 125913531Sjairo.balart@metempsy.com 126013531Sjairo.balart@metempsy.com#define CONVERT_INT_2(u) \ 126113531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT]; \ 126213531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); 126313531Sjairo.balart@metempsy.com 126413531Sjairo.balart@metempsy.com#define CONVERT_INT64(u) \ 126513531Sjairo.balart@metempsy.comsmall_type u ## s = get_sign(u); \ 126613531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT64]; \ 126713531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); 126813531Sjairo.balart@metempsy.com 126913531Sjairo.balart@metempsy.com#define CONVERT_INT64_2(u) \ 127013531Sjairo.balart@metempsy.comsc_digit u ## d[DIGITS_PER_UINT64]; \ 127113531Sjairo.balart@metempsy.comfrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); 127213531Sjairo.balart@metempsy.com 127313531Sjairo.balart@metempsy.com 127413531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 127513531Sjairo.balart@metempsy.com// SECTION: PLUS operators: +, +=, ++ 127613531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 127713531Sjairo.balart@metempsy.com 127813531Sjairo.balart@metempsy.com// Cases to consider when computing u + v: 127913531Sjairo.balart@metempsy.com// 1. 0 + v = v 128013531Sjairo.balart@metempsy.com// 2. u + 0 = u 128113531Sjairo.balart@metempsy.com// 3. if sgn(u) == sgn(v) 128213531Sjairo.balart@metempsy.com// 3.1 u + v = +(u + v) = sgn(u) * (u + v) 128313531Sjairo.balart@metempsy.com// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v) 128413531Sjairo.balart@metempsy.com// 4. if sgn(u) != sgn(v) 128513531Sjairo.balart@metempsy.com// 4.1 u + (-v) = u - v = sgn(u) * (u - v) 128613531Sjairo.balart@metempsy.com// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v) 128713531Sjairo.balart@metempsy.com// 128813531Sjairo.balart@metempsy.com// Specialization of above cases for computing ++u or u++: 128913531Sjairo.balart@metempsy.com// 1. 0 + 1 = 1 129013531Sjairo.balart@metempsy.com// 3. u + 1 = u + 1 = sgn(u) * (u + 1) 129113531Sjairo.balart@metempsy.com// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1) 129213531Sjairo.balart@metempsy.com 129313531Sjairo.balart@metempsy.comsc_signed 129413531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, const sc_signed &v) 129513531Sjairo.balart@metempsy.com{ 129613531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 129713531Sjairo.balart@metempsy.com return sc_signed(v); 129813531Sjairo.balart@metempsy.com 129913531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 130013531Sjairo.balart@metempsy.com return sc_signed(u); 130113531Sjairo.balart@metempsy.com 130213531Sjairo.balart@metempsy.com // cases 3 and 4 130313531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 130413531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 130513531Sjairo.balart@metempsy.com} 130613531Sjairo.balart@metempsy.com 130713531Sjairo.balart@metempsy.com 130813531Sjairo.balart@metempsy.comsc_signed 130913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_unsigned &v) 131013531Sjairo.balart@metempsy.com{ 131113531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 131213531Sjairo.balart@metempsy.com return sc_signed(v); 131313531Sjairo.balart@metempsy.com 131413531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 131513531Sjairo.balart@metempsy.com return sc_signed(u); 131613531Sjairo.balart@metempsy.com 131713531Sjairo.balart@metempsy.com // cases 3 and 4 131813531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 131913531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 132013531Sjairo.balart@metempsy.com} 132113531Sjairo.balart@metempsy.com 132213531Sjairo.balart@metempsy.com 132313531Sjairo.balart@metempsy.comsc_signed 132413531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, const sc_signed &v) 132513531Sjairo.balart@metempsy.com{ 132613531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 132713531Sjairo.balart@metempsy.com return sc_signed(v); 132813531Sjairo.balart@metempsy.com 132913531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 133013531Sjairo.balart@metempsy.com return sc_signed(u); 133113531Sjairo.balart@metempsy.com 133213531Sjairo.balart@metempsy.com // cases 3 and 4 133313531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 133413531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 133513531Sjairo.balart@metempsy.com} 133613531Sjairo.balart@metempsy.com 133713531Sjairo.balart@metempsy.com 133813531Sjairo.balart@metempsy.comsc_signed 133913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, int64 v) 134013531Sjairo.balart@metempsy.com{ 134113531Sjairo.balart@metempsy.com if (v == 0) // case 2 134213531Sjairo.balart@metempsy.com return sc_signed(u); 134313531Sjairo.balart@metempsy.com 134413531Sjairo.balart@metempsy.com CONVERT_INT64(v); 134513531Sjairo.balart@metempsy.com 134613531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 134713531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 134813531Sjairo.balart@metempsy.com 134913531Sjairo.balart@metempsy.com // cases 3 and 4 135013531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 135113531Sjairo.balart@metempsy.com vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 135213531Sjairo.balart@metempsy.com} 135313531Sjairo.balart@metempsy.com 135413531Sjairo.balart@metempsy.com 135513531Sjairo.balart@metempsy.comsc_signed 135613531Sjairo.balart@metempsy.comoperator + (int64 u, const sc_signed &v) 135713531Sjairo.balart@metempsy.com{ 135813531Sjairo.balart@metempsy.com if (u == 0) // case 1 135913531Sjairo.balart@metempsy.com return sc_signed(v); 136013531Sjairo.balart@metempsy.com 136113531Sjairo.balart@metempsy.com CONVERT_INT64(u); 136213531Sjairo.balart@metempsy.com 136313531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 136413531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 136513531Sjairo.balart@metempsy.com 136613531Sjairo.balart@metempsy.com // cases 3 and 4 136713531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 136813531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 136913531Sjairo.balart@metempsy.com} 137013531Sjairo.balart@metempsy.com 137113531Sjairo.balart@metempsy.com 137213531Sjairo.balart@metempsy.comsc_signed 137313531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, int64 v) 137413531Sjairo.balart@metempsy.com{ 137513531Sjairo.balart@metempsy.com if (v == 0) // case 2 137613531Sjairo.balart@metempsy.com return sc_signed(u); 137713531Sjairo.balart@metempsy.com 137813531Sjairo.balart@metempsy.com CONVERT_INT64(v); 137913531Sjairo.balart@metempsy.com 138013531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 138113531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 138213531Sjairo.balart@metempsy.com 138313531Sjairo.balart@metempsy.com // cases 3 and 4 138413531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 138513531Sjairo.balart@metempsy.com vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 138613531Sjairo.balart@metempsy.com} 138713531Sjairo.balart@metempsy.com 138813531Sjairo.balart@metempsy.com 138913531Sjairo.balart@metempsy.comsc_signed 139013531Sjairo.balart@metempsy.comoperator + (int64 u, const sc_unsigned &v) 139113531Sjairo.balart@metempsy.com{ 139213531Sjairo.balart@metempsy.com if (u == 0) // case 1 139313531Sjairo.balart@metempsy.com return sc_signed(v); 139413531Sjairo.balart@metempsy.com 139513531Sjairo.balart@metempsy.com CONVERT_INT64(u); 139613531Sjairo.balart@metempsy.com 139713531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 139813531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 139913531Sjairo.balart@metempsy.com 140013531Sjairo.balart@metempsy.com // cases 3 and 4 140113531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 140213531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 140313531Sjairo.balart@metempsy.com} 140413531Sjairo.balart@metempsy.com 140513531Sjairo.balart@metempsy.com 140613531Sjairo.balart@metempsy.comsc_signed 140713531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, uint64 v) 140813531Sjairo.balart@metempsy.com{ 140913531Sjairo.balart@metempsy.com if (v == 0) // case 2 141013531Sjairo.balart@metempsy.com return sc_signed(u); 141113531Sjairo.balart@metempsy.com 141213531Sjairo.balart@metempsy.com CONVERT_INT64(v); 141313531Sjairo.balart@metempsy.com 141413531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 141513531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 141613531Sjairo.balart@metempsy.com 141713531Sjairo.balart@metempsy.com // cases 3 and 4 141813531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 141913531Sjairo.balart@metempsy.com vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 142013531Sjairo.balart@metempsy.com} 142113531Sjairo.balart@metempsy.com 142213531Sjairo.balart@metempsy.com 142313531Sjairo.balart@metempsy.comsc_signed 142413531Sjairo.balart@metempsy.comoperator + (uint64 u, const sc_signed &v) 142513531Sjairo.balart@metempsy.com{ 142613531Sjairo.balart@metempsy.com if (u == 0) // case 1 142713531Sjairo.balart@metempsy.com return sc_signed(v); 142813531Sjairo.balart@metempsy.com 142913531Sjairo.balart@metempsy.com CONVERT_INT64(u); 143013531Sjairo.balart@metempsy.com 143113531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 143213531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 143313531Sjairo.balart@metempsy.com 143413531Sjairo.balart@metempsy.com // cases 3 and 4 143513531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 143613531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 143713531Sjairo.balart@metempsy.com} 143813531Sjairo.balart@metempsy.com 143913531Sjairo.balart@metempsy.com 144013531Sjairo.balart@metempsy.comsc_signed 144113531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, long v) 144213531Sjairo.balart@metempsy.com{ 144313531Sjairo.balart@metempsy.com if (v == 0) // case 2 144413531Sjairo.balart@metempsy.com return sc_signed(u); 144513531Sjairo.balart@metempsy.com 144613531Sjairo.balart@metempsy.com CONVERT_LONG(v); 144713531Sjairo.balart@metempsy.com 144813531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 144913531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 145013531Sjairo.balart@metempsy.com 145113531Sjairo.balart@metempsy.com // cases 3 and 4 145213531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 145313531Sjairo.balart@metempsy.com vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 145413531Sjairo.balart@metempsy.com} 145513531Sjairo.balart@metempsy.com 145613531Sjairo.balart@metempsy.com 145713531Sjairo.balart@metempsy.comsc_signed 145813531Sjairo.balart@metempsy.comoperator + (long u, const sc_signed &v) 145913531Sjairo.balart@metempsy.com{ 146013531Sjairo.balart@metempsy.com if (u == 0) // case 1 146113531Sjairo.balart@metempsy.com return sc_signed(v); 146213531Sjairo.balart@metempsy.com 146313531Sjairo.balart@metempsy.com CONVERT_LONG(u); 146413531Sjairo.balart@metempsy.com 146513531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 146613531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 146713531Sjairo.balart@metempsy.com 146813531Sjairo.balart@metempsy.com // cases 3 and 4 146913531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 147013531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 147113531Sjairo.balart@metempsy.com} 147213531Sjairo.balart@metempsy.com 147313531Sjairo.balart@metempsy.com 147413531Sjairo.balart@metempsy.comsc_signed 147513531Sjairo.balart@metempsy.comoperator + (const sc_unsigned &u, long v) 147613531Sjairo.balart@metempsy.com{ 147713531Sjairo.balart@metempsy.com if (v == 0) // case 2 147813531Sjairo.balart@metempsy.com return sc_signed(u); 147913531Sjairo.balart@metempsy.com 148013531Sjairo.balart@metempsy.com CONVERT_LONG(v); 148113531Sjairo.balart@metempsy.com 148213531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 148313531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 148413531Sjairo.balart@metempsy.com 148513531Sjairo.balart@metempsy.com // cases 3 and 4 148613531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 148713531Sjairo.balart@metempsy.com vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 148813531Sjairo.balart@metempsy.com} 148913531Sjairo.balart@metempsy.com 149013531Sjairo.balart@metempsy.com 149113531Sjairo.balart@metempsy.comsc_signed 149213531Sjairo.balart@metempsy.comoperator + (long u, const sc_unsigned &v) 149313531Sjairo.balart@metempsy.com{ 149413531Sjairo.balart@metempsy.com if (u == 0) // case 1 149513531Sjairo.balart@metempsy.com return sc_signed(v); 149613531Sjairo.balart@metempsy.com 149713531Sjairo.balart@metempsy.com CONVERT_LONG(u); 149813531Sjairo.balart@metempsy.com 149913531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 150013531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 150113531Sjairo.balart@metempsy.com 150213531Sjairo.balart@metempsy.com // cases 3 and 4 150313531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 150413531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 150513531Sjairo.balart@metempsy.com} 150613531Sjairo.balart@metempsy.com 150713531Sjairo.balart@metempsy.com 150813531Sjairo.balart@metempsy.comsc_signed 150913531Sjairo.balart@metempsy.comoperator + (const sc_signed &u, unsigned long v) 151013531Sjairo.balart@metempsy.com{ 151113531Sjairo.balart@metempsy.com if (v == 0) // case 2 151213531Sjairo.balart@metempsy.com return sc_signed(u); 151313531Sjairo.balart@metempsy.com 151413531Sjairo.balart@metempsy.com CONVERT_LONG(v); 151513531Sjairo.balart@metempsy.com 151613531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 1 151713531Sjairo.balart@metempsy.com return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 151813531Sjairo.balart@metempsy.com 151913531Sjairo.balart@metempsy.com // cases 3 and 4 152013531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 152113531Sjairo.balart@metempsy.com vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 152213531Sjairo.balart@metempsy.com} 152313531Sjairo.balart@metempsy.com 152413531Sjairo.balart@metempsy.com 152513531Sjairo.balart@metempsy.comsc_signed 152613531Sjairo.balart@metempsy.comoperator + (unsigned long u, const sc_signed &v) 152713531Sjairo.balart@metempsy.com{ 152813531Sjairo.balart@metempsy.com if (u == 0) // case 1 152913531Sjairo.balart@metempsy.com return sc_signed(v); 153013531Sjairo.balart@metempsy.com 153113531Sjairo.balart@metempsy.com CONVERT_LONG(u); 153213531Sjairo.balart@metempsy.com 153313531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 153413531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 153513531Sjairo.balart@metempsy.com 153613531Sjairo.balart@metempsy.com // cases 3 and 4 153713531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 153813531Sjairo.balart@metempsy.com v.sgn, v.nbits, v.ndigits, v.digit); 153913531Sjairo.balart@metempsy.com} 154013531Sjairo.balart@metempsy.com 154113531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from 154213531Sjairo.balart@metempsy.com// sc_nbcommon.cpp. 154313531Sjairo.balart@metempsy.com 154413531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 154513531Sjairo.balart@metempsy.com// SECTION: MINUS operators: -, -=, -- 154613531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 154713531Sjairo.balart@metempsy.com 154813531Sjairo.balart@metempsy.com// Cases to consider when computing u + v: 154913531Sjairo.balart@metempsy.com// 1. u - 0 = u 155013531Sjairo.balart@metempsy.com// 2. 0 - v = -v 155113531Sjairo.balart@metempsy.com// 3. if sgn(u) != sgn(v) 155213531Sjairo.balart@metempsy.com// 3.1 u - (-v) = u + v = sgn(u) * (u + v) 155313531Sjairo.balart@metempsy.com// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v) 155413531Sjairo.balart@metempsy.com// 4. if sgn(u) == sgn(v) 155513531Sjairo.balart@metempsy.com// 4.1 u - v = +(u - v) = sgn(u) * (u - v) 155613531Sjairo.balart@metempsy.com// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v) 155713531Sjairo.balart@metempsy.com// 155813531Sjairo.balart@metempsy.com// Specialization of above cases for computing --u or u--: 155913531Sjairo.balart@metempsy.com// 1. 0 - 1 = -1 156013531Sjairo.balart@metempsy.com// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1) 156113531Sjairo.balart@metempsy.com// 4. u - 1 = u - 1 = sgn(u) * (u - 1) 156213531Sjairo.balart@metempsy.com 156313531Sjairo.balart@metempsy.comsc_signed 156413531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_unsigned &v) 156513531Sjairo.balart@metempsy.com{ 156613531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 1 156713531Sjairo.balart@metempsy.com return sc_signed(u); 156813531Sjairo.balart@metempsy.com 156913531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 157013531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 157113531Sjairo.balart@metempsy.com 157213531Sjairo.balart@metempsy.com // cases 3 and 4 157313531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 157413531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 157513531Sjairo.balart@metempsy.com} 157613531Sjairo.balart@metempsy.com 157713531Sjairo.balart@metempsy.com 157813531Sjairo.balart@metempsy.comsc_signed 157913531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, const sc_signed &v) 158013531Sjairo.balart@metempsy.com{ 158113531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 1 158213531Sjairo.balart@metempsy.com return sc_signed(u); 158313531Sjairo.balart@metempsy.com 158413531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 158513531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 158613531Sjairo.balart@metempsy.com 158713531Sjairo.balart@metempsy.com // cases 3 and 4 158813531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 158913531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 159013531Sjairo.balart@metempsy.com} 159113531Sjairo.balart@metempsy.com 159213531Sjairo.balart@metempsy.com 159313531Sjairo.balart@metempsy.comsc_signed 159413531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_unsigned &v) 159513531Sjairo.balart@metempsy.com{ 159613531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 1 159713531Sjairo.balart@metempsy.com return sc_signed(u); 159813531Sjairo.balart@metempsy.com 159913531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 160013531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 160113531Sjairo.balart@metempsy.com 160213531Sjairo.balart@metempsy.com // cases 3 and 4 160313531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 160413531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 160513531Sjairo.balart@metempsy.com} 160613531Sjairo.balart@metempsy.com 160713531Sjairo.balart@metempsy.com 160813531Sjairo.balart@metempsy.comsc_signed 160913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, const sc_signed &v) 161013531Sjairo.balart@metempsy.com{ 161113531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 1 161213531Sjairo.balart@metempsy.com return sc_signed(u); 161313531Sjairo.balart@metempsy.com 161413531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 161513531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 161613531Sjairo.balart@metempsy.com 161713531Sjairo.balart@metempsy.com // cases 3 and 4 161813531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 161913531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 162013531Sjairo.balart@metempsy.com} 162113531Sjairo.balart@metempsy.com 162213531Sjairo.balart@metempsy.com 162313531Sjairo.balart@metempsy.comsc_signed 162413531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, int64 v) 162513531Sjairo.balart@metempsy.com{ 162613531Sjairo.balart@metempsy.com if (v == 0) // case 1 162713531Sjairo.balart@metempsy.com return sc_signed(u); 162813531Sjairo.balart@metempsy.com 162913531Sjairo.balart@metempsy.com CONVERT_INT64(v); 163013531Sjairo.balart@metempsy.com 163113531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 163213531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 163313531Sjairo.balart@metempsy.com 163413531Sjairo.balart@metempsy.com // cases 3 and 4 163513531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 163613531Sjairo.balart@metempsy.com -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 163713531Sjairo.balart@metempsy.com} 163813531Sjairo.balart@metempsy.com 163913531Sjairo.balart@metempsy.com 164013531Sjairo.balart@metempsy.comsc_signed 164113531Sjairo.balart@metempsy.comoperator - (int64 u, const sc_signed &v) 164213531Sjairo.balart@metempsy.com{ 164313531Sjairo.balart@metempsy.com if (u == 0) // case 1 164413531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 164513531Sjairo.balart@metempsy.com 164613531Sjairo.balart@metempsy.com CONVERT_INT64(u); 164713531Sjairo.balart@metempsy.com 164813531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 164913531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 165013531Sjairo.balart@metempsy.com 165113531Sjairo.balart@metempsy.com // cases 3 and 4 165213531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 165313531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 165413531Sjairo.balart@metempsy.com} 165513531Sjairo.balart@metempsy.com 165613531Sjairo.balart@metempsy.com 165713531Sjairo.balart@metempsy.comsc_signed 165813531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, int64 v) 165913531Sjairo.balart@metempsy.com{ 166013531Sjairo.balart@metempsy.com if (v == 0) // case 1 166113531Sjairo.balart@metempsy.com return sc_signed(u); 166213531Sjairo.balart@metempsy.com 166313531Sjairo.balart@metempsy.com CONVERT_INT64(v); 166413531Sjairo.balart@metempsy.com 166513531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 166613531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 166713531Sjairo.balart@metempsy.com 166813531Sjairo.balart@metempsy.com // cases 3 and 4 166913531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 167013531Sjairo.balart@metempsy.com -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 167113531Sjairo.balart@metempsy.com} 167213531Sjairo.balart@metempsy.com 167313531Sjairo.balart@metempsy.com 167413531Sjairo.balart@metempsy.comsc_signed 167513531Sjairo.balart@metempsy.comoperator - (int64 u, const sc_unsigned &v) 167613531Sjairo.balart@metempsy.com{ 167713531Sjairo.balart@metempsy.com if (u == 0) // case 1 167813531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 167913531Sjairo.balart@metempsy.com 168013531Sjairo.balart@metempsy.com CONVERT_INT64(u); 168113531Sjairo.balart@metempsy.com 168213531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 168313531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 168413531Sjairo.balart@metempsy.com 168513531Sjairo.balart@metempsy.com // cases 3 and 4 168613531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 168713531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 168813531Sjairo.balart@metempsy.com} 168913531Sjairo.balart@metempsy.com 169013531Sjairo.balart@metempsy.com 169113531Sjairo.balart@metempsy.comsc_signed 169213531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, uint64 v) 169313531Sjairo.balart@metempsy.com{ 169413531Sjairo.balart@metempsy.com if (v == 0) // case 1 169513531Sjairo.balart@metempsy.com return sc_signed(u); 169613531Sjairo.balart@metempsy.com 169713531Sjairo.balart@metempsy.com CONVERT_INT64(v); 169813531Sjairo.balart@metempsy.com 169913531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 170013531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 170113531Sjairo.balart@metempsy.com 170213531Sjairo.balart@metempsy.com // cases 3 and 4 170313531Sjairo.balart@metempsy.com 170413531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 170513531Sjairo.balart@metempsy.com -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 170613531Sjairo.balart@metempsy.com} 170713531Sjairo.balart@metempsy.com 170813531Sjairo.balart@metempsy.com 170913531Sjairo.balart@metempsy.comsc_signed 171013531Sjairo.balart@metempsy.comoperator - (uint64 u, const sc_signed &v) 171113531Sjairo.balart@metempsy.com{ 171213531Sjairo.balart@metempsy.com if (u == 0) // case 1 171313531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 171413531Sjairo.balart@metempsy.com 171513531Sjairo.balart@metempsy.com CONVERT_INT64(u); 171613531Sjairo.balart@metempsy.com 171713531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 171813531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 171913531Sjairo.balart@metempsy.com 172013531Sjairo.balart@metempsy.com // cases 3 and 4 172113531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 172213531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 172313531Sjairo.balart@metempsy.com} 172413531Sjairo.balart@metempsy.com 172513531Sjairo.balart@metempsy.com 172613531Sjairo.balart@metempsy.comsc_signed 172713531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, uint64 v) 172813531Sjairo.balart@metempsy.com{ 172913531Sjairo.balart@metempsy.com if (v == 0) // case 1 173013531Sjairo.balart@metempsy.com return sc_signed(u); 173113531Sjairo.balart@metempsy.com 173213531Sjairo.balart@metempsy.com CONVERT_INT64(v); 173313531Sjairo.balart@metempsy.com 173413531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 173513531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 173613531Sjairo.balart@metempsy.com 173713531Sjairo.balart@metempsy.com // cases 3 and 4 173813531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 173913531Sjairo.balart@metempsy.com -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 174013531Sjairo.balart@metempsy.com} 174113531Sjairo.balart@metempsy.com 174213531Sjairo.balart@metempsy.com 174313531Sjairo.balart@metempsy.comsc_signed 174413531Sjairo.balart@metempsy.comoperator - (uint64 u, const sc_unsigned &v) 174513531Sjairo.balart@metempsy.com{ 174613531Sjairo.balart@metempsy.com if (u == 0) // case 1 174713531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 174813531Sjairo.balart@metempsy.com 174913531Sjairo.balart@metempsy.com CONVERT_INT64(u); 175013531Sjairo.balart@metempsy.com 175113531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 175213531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 175313531Sjairo.balart@metempsy.com 175413531Sjairo.balart@metempsy.com // cases 3 and 4 175513531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 175613531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 175713531Sjairo.balart@metempsy.com} 175813531Sjairo.balart@metempsy.com 175913531Sjairo.balart@metempsy.com 176013531Sjairo.balart@metempsy.comsc_signed 176113531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, long v) 176213531Sjairo.balart@metempsy.com{ 176313531Sjairo.balart@metempsy.com if (v == 0) // case 1 176413531Sjairo.balart@metempsy.com return sc_signed(u); 176513531Sjairo.balart@metempsy.com 176613531Sjairo.balart@metempsy.com CONVERT_LONG(v); 176713531Sjairo.balart@metempsy.com 176813531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 176913531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 177013531Sjairo.balart@metempsy.com 177113531Sjairo.balart@metempsy.com // cases 3 and 4 177213531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 177313531Sjairo.balart@metempsy.com -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 177413531Sjairo.balart@metempsy.com} 177513531Sjairo.balart@metempsy.com 177613531Sjairo.balart@metempsy.com 177713531Sjairo.balart@metempsy.comsc_signed 177813531Sjairo.balart@metempsy.comoperator - (long u, const sc_signed &v) 177913531Sjairo.balart@metempsy.com{ 178013531Sjairo.balart@metempsy.com if (u == 0) // case 1 178113531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 178213531Sjairo.balart@metempsy.com 178313531Sjairo.balart@metempsy.com CONVERT_LONG(u); 178413531Sjairo.balart@metempsy.com 178513531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 178613531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 178713531Sjairo.balart@metempsy.com 178813531Sjairo.balart@metempsy.com // cases 3 and 4 178913531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 179013531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 179113531Sjairo.balart@metempsy.com} 179213531Sjairo.balart@metempsy.com 179313531Sjairo.balart@metempsy.com 179413531Sjairo.balart@metempsy.comsc_signed 179513531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, long v) 179613531Sjairo.balart@metempsy.com{ 179713531Sjairo.balart@metempsy.com if (v == 0) // case 1 179813531Sjairo.balart@metempsy.com return sc_signed(u); 179913531Sjairo.balart@metempsy.com 180013531Sjairo.balart@metempsy.com CONVERT_LONG(v); 180113531Sjairo.balart@metempsy.com 180213531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 180313531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 180413531Sjairo.balart@metempsy.com 180513531Sjairo.balart@metempsy.com // cases 3 and 4 180613531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 180713531Sjairo.balart@metempsy.com -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 180813531Sjairo.balart@metempsy.com} 180913531Sjairo.balart@metempsy.com 181013531Sjairo.balart@metempsy.com 181113531Sjairo.balart@metempsy.comsc_signed 181213531Sjairo.balart@metempsy.comoperator - (long u, const sc_unsigned &v) 181313531Sjairo.balart@metempsy.com{ 181413531Sjairo.balart@metempsy.com if (u == 0) // case 1 181513531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 181613531Sjairo.balart@metempsy.com 181713531Sjairo.balart@metempsy.com CONVERT_LONG(u); 181813531Sjairo.balart@metempsy.com 181913531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 182013531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 182113531Sjairo.balart@metempsy.com 182213531Sjairo.balart@metempsy.com // cases 3 and 4 182313531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 182413531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 182513531Sjairo.balart@metempsy.com} 182613531Sjairo.balart@metempsy.com 182713531Sjairo.balart@metempsy.com 182813531Sjairo.balart@metempsy.comsc_signed 182913531Sjairo.balart@metempsy.comoperator - (const sc_signed &u, unsigned long v) 183013531Sjairo.balart@metempsy.com{ 183113531Sjairo.balart@metempsy.com if (v == 0) // case 1 183213531Sjairo.balart@metempsy.com return sc_signed(u); 183313531Sjairo.balart@metempsy.com 183413531Sjairo.balart@metempsy.com CONVERT_LONG(v); 183513531Sjairo.balart@metempsy.com 183613531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 183713531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 183813531Sjairo.balart@metempsy.com 183913531Sjairo.balart@metempsy.com // cases 3 and 4 184013531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 184113531Sjairo.balart@metempsy.com -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 184213531Sjairo.balart@metempsy.com} 184313531Sjairo.balart@metempsy.com 184413531Sjairo.balart@metempsy.com 184513531Sjairo.balart@metempsy.comsc_signed 184613531Sjairo.balart@metempsy.comoperator - (unsigned long u, const sc_signed &v) 184713531Sjairo.balart@metempsy.com{ 184813531Sjairo.balart@metempsy.com if (u == 0) // case 1 184913531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 185013531Sjairo.balart@metempsy.com 185113531Sjairo.balart@metempsy.com CONVERT_LONG(u); 185213531Sjairo.balart@metempsy.com 185313531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 185413531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 185513531Sjairo.balart@metempsy.com 185613531Sjairo.balart@metempsy.com // cases 3 and 4 185713531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 185813531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 185913531Sjairo.balart@metempsy.com} 186013531Sjairo.balart@metempsy.com 186113531Sjairo.balart@metempsy.com 186213531Sjairo.balart@metempsy.comsc_signed 186313531Sjairo.balart@metempsy.comoperator - (const sc_unsigned &u, unsigned long v) 186413531Sjairo.balart@metempsy.com{ 186513531Sjairo.balart@metempsy.com if (v == 0) // case 1 186613531Sjairo.balart@metempsy.com return sc_signed(u); 186713531Sjairo.balart@metempsy.com 186813531Sjairo.balart@metempsy.com CONVERT_LONG(v); 186913531Sjairo.balart@metempsy.com 187013531Sjairo.balart@metempsy.com if (u.sgn == SC_ZERO) // case 2 187113531Sjairo.balart@metempsy.com return sc_signed(-vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 187213531Sjairo.balart@metempsy.com 187313531Sjairo.balart@metempsy.com // cases 3 and 4 187413531Sjairo.balart@metempsy.com return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 187513531Sjairo.balart@metempsy.com -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 187613531Sjairo.balart@metempsy.com} 187713531Sjairo.balart@metempsy.com 187813531Sjairo.balart@metempsy.com 187913531Sjairo.balart@metempsy.comsc_signed 188013531Sjairo.balart@metempsy.comoperator - (unsigned long u, const sc_unsigned &v) 188113531Sjairo.balart@metempsy.com{ 188213531Sjairo.balart@metempsy.com if (u == 0) // case 1 188313531Sjairo.balart@metempsy.com return sc_signed(v, -v.sgn); 188413531Sjairo.balart@metempsy.com 188513531Sjairo.balart@metempsy.com CONVERT_LONG(u); 188613531Sjairo.balart@metempsy.com 188713531Sjairo.balart@metempsy.com if (v.sgn == SC_ZERO) // case 2 188813531Sjairo.balart@metempsy.com return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 188913531Sjairo.balart@metempsy.com 189013531Sjairo.balart@metempsy.com // cases 3 and 4 189113531Sjairo.balart@metempsy.com return add_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 189213531Sjairo.balart@metempsy.com -v.sgn, v.nbits, v.ndigits, v.digit); 189313531Sjairo.balart@metempsy.com} 189413531Sjairo.balart@metempsy.com 189513531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from 189613531Sjairo.balart@metempsy.com// sc_nbcommon.cpp. 189713531Sjairo.balart@metempsy.com 189813531Sjairo.balart@metempsy.com 189913531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 190013531Sjairo.balart@metempsy.com// SECTION: MULTIPLICATION operators: *, *= 190113531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 190213531Sjairo.balart@metempsy.com 190313531Sjairo.balart@metempsy.com// Cases to consider when computing u * v: 190413531Sjairo.balart@metempsy.com// 1. u * 0 = 0 * v = 0 190513531Sjairo.balart@metempsy.com// 2. 1 * v = v and -1 * v = -v 190613531Sjairo.balart@metempsy.com// 3. u * 1 = u and u * -1 = -u 190713531Sjairo.balart@metempsy.com// 4. u * v = u * v 190813531Sjairo.balart@metempsy.com 190913531Sjairo.balart@metempsy.comsc_signed 191013531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, const sc_signed &v) 191113531Sjairo.balart@metempsy.com{ 191213531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 191313531Sjairo.balart@metempsy.com 191413531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 191513531Sjairo.balart@metempsy.com return sc_signed(); 191613531Sjairo.balart@metempsy.com 191713531Sjairo.balart@metempsy.com // cases 2-4 191813531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 191913531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 192013531Sjairo.balart@metempsy.com} 192113531Sjairo.balart@metempsy.com 192213531Sjairo.balart@metempsy.com 192313531Sjairo.balart@metempsy.comsc_signed 192413531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_unsigned &v) 192513531Sjairo.balart@metempsy.com{ 192613531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 192713531Sjairo.balart@metempsy.com 192813531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 192913531Sjairo.balart@metempsy.com return sc_signed(); 193013531Sjairo.balart@metempsy.com 193113531Sjairo.balart@metempsy.com // cases 2-4 193213531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 193313531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 193413531Sjairo.balart@metempsy.com} 193513531Sjairo.balart@metempsy.com 193613531Sjairo.balart@metempsy.com 193713531Sjairo.balart@metempsy.comsc_signed 193813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, const sc_signed &v) 193913531Sjairo.balart@metempsy.com{ 194013531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 194113531Sjairo.balart@metempsy.com 194213531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 194313531Sjairo.balart@metempsy.com return sc_signed(); 194413531Sjairo.balart@metempsy.com 194513531Sjairo.balart@metempsy.com // cases 2-4 194613531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 194713531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 194813531Sjairo.balart@metempsy.com} 194913531Sjairo.balart@metempsy.com 195013531Sjairo.balart@metempsy.com 195113531Sjairo.balart@metempsy.comsc_signed 195213531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, int64 v) 195313531Sjairo.balart@metempsy.com{ 195413531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 195513531Sjairo.balart@metempsy.com 195613531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 195713531Sjairo.balart@metempsy.com return sc_signed(); 195813531Sjairo.balart@metempsy.com 195913531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 196013531Sjairo.balart@metempsy.com 196113531Sjairo.balart@metempsy.com // cases 2-4 196213531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 196313531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 196413531Sjairo.balart@metempsy.com} 196513531Sjairo.balart@metempsy.com 196613531Sjairo.balart@metempsy.com 196713531Sjairo.balart@metempsy.comsc_signed 196813531Sjairo.balart@metempsy.comoperator * (int64 u, const sc_signed &v) 196913531Sjairo.balart@metempsy.com{ 197013531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 197113531Sjairo.balart@metempsy.com 197213531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 197313531Sjairo.balart@metempsy.com return sc_signed(); 197413531Sjairo.balart@metempsy.com 197513531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 197613531Sjairo.balart@metempsy.com 197713531Sjairo.balart@metempsy.com // cases 2-4 197813531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 197913531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 198013531Sjairo.balart@metempsy.com} 198113531Sjairo.balart@metempsy.com 198213531Sjairo.balart@metempsy.com 198313531Sjairo.balart@metempsy.comsc_signed 198413531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, int64 v) 198513531Sjairo.balart@metempsy.com{ 198613531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 198713531Sjairo.balart@metempsy.com 198813531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 198913531Sjairo.balart@metempsy.com return sc_signed(); 199013531Sjairo.balart@metempsy.com 199113531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 199213531Sjairo.balart@metempsy.com 199313531Sjairo.balart@metempsy.com // cases 2-4 199413531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 199513531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 199613531Sjairo.balart@metempsy.com} 199713531Sjairo.balart@metempsy.com 199813531Sjairo.balart@metempsy.com 199913531Sjairo.balart@metempsy.comsc_signed 200013531Sjairo.balart@metempsy.comoperator * (int64 u, const sc_unsigned &v) 200113531Sjairo.balart@metempsy.com{ 200213531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 200313531Sjairo.balart@metempsy.com 200413531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 200513531Sjairo.balart@metempsy.com return sc_signed(); 200613531Sjairo.balart@metempsy.com 200713531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 200813531Sjairo.balart@metempsy.com 200913531Sjairo.balart@metempsy.com // cases 2-4 201013531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 201113531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 201213531Sjairo.balart@metempsy.com} 201313531Sjairo.balart@metempsy.com 201413531Sjairo.balart@metempsy.com 201513531Sjairo.balart@metempsy.comsc_signed 201613531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, uint64 v) 201713531Sjairo.balart@metempsy.com{ 201813531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 201913531Sjairo.balart@metempsy.com 202013531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 202113531Sjairo.balart@metempsy.com return sc_signed(); 202213531Sjairo.balart@metempsy.com 202313531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 202413531Sjairo.balart@metempsy.com 202513531Sjairo.balart@metempsy.com // cases 2-4 202613531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 202713531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 202813531Sjairo.balart@metempsy.com} 202913531Sjairo.balart@metempsy.com 203013531Sjairo.balart@metempsy.com 203113531Sjairo.balart@metempsy.comsc_signed 203213531Sjairo.balart@metempsy.comoperator * (uint64 u, const sc_signed &v) 203313531Sjairo.balart@metempsy.com{ 203413531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 203513531Sjairo.balart@metempsy.com 203613531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 203713531Sjairo.balart@metempsy.com return sc_signed(); 203813531Sjairo.balart@metempsy.com 203913531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 204013531Sjairo.balart@metempsy.com 204113531Sjairo.balart@metempsy.com // cases 2-4 204213531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 204313531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 204413531Sjairo.balart@metempsy.com} 204513531Sjairo.balart@metempsy.com 204613531Sjairo.balart@metempsy.com 204713531Sjairo.balart@metempsy.comsc_signed 204813531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, long v) 204913531Sjairo.balart@metempsy.com{ 205013531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 205113531Sjairo.balart@metempsy.com 205213531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 205313531Sjairo.balart@metempsy.com return sc_signed(); 205413531Sjairo.balart@metempsy.com 205513531Sjairo.balart@metempsy.com CONVERT_LONG_2(v); 205613531Sjairo.balart@metempsy.com 205713531Sjairo.balart@metempsy.com // cases 2-4 205813531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 205913531Sjairo.balart@metempsy.com BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 206013531Sjairo.balart@metempsy.com} 206113531Sjairo.balart@metempsy.com 206213531Sjairo.balart@metempsy.com 206313531Sjairo.balart@metempsy.comsc_signed 206413531Sjairo.balart@metempsy.comoperator * (long u, const sc_signed &v) 206513531Sjairo.balart@metempsy.com{ 206613531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 206713531Sjairo.balart@metempsy.com 206813531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 206913531Sjairo.balart@metempsy.com return sc_signed(); 207013531Sjairo.balart@metempsy.com 207113531Sjairo.balart@metempsy.com CONVERT_LONG_2(u); 207213531Sjairo.balart@metempsy.com 207313531Sjairo.balart@metempsy.com // cases 2-4 207413531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 207513531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 207613531Sjairo.balart@metempsy.com} 207713531Sjairo.balart@metempsy.com 207813531Sjairo.balart@metempsy.com 207913531Sjairo.balart@metempsy.comsc_signed 208013531Sjairo.balart@metempsy.comoperator * (const sc_unsigned &u, long v) 208113531Sjairo.balart@metempsy.com{ 208213531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 208313531Sjairo.balart@metempsy.com 208413531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 208513531Sjairo.balart@metempsy.com return sc_signed(); 208613531Sjairo.balart@metempsy.com 208713531Sjairo.balart@metempsy.com CONVERT_LONG_2(v); 208813531Sjairo.balart@metempsy.com 208913531Sjairo.balart@metempsy.com // cases 2-4 209013531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 209113531Sjairo.balart@metempsy.com BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 209213531Sjairo.balart@metempsy.com} 209313531Sjairo.balart@metempsy.com 209413531Sjairo.balart@metempsy.com 209513531Sjairo.balart@metempsy.comsc_signed 209613531Sjairo.balart@metempsy.comoperator * (long u, const sc_unsigned &v) 209713531Sjairo.balart@metempsy.com{ 209813531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 209913531Sjairo.balart@metempsy.com 210013531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 210113531Sjairo.balart@metempsy.com return sc_signed(); 210213531Sjairo.balart@metempsy.com 210313531Sjairo.balart@metempsy.com CONVERT_LONG_2(u); 210413531Sjairo.balart@metempsy.com 210513531Sjairo.balart@metempsy.com // cases 2-4 210613531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 210713531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 210813531Sjairo.balart@metempsy.com} 210913531Sjairo.balart@metempsy.com 211013531Sjairo.balart@metempsy.com 211113531Sjairo.balart@metempsy.comsc_signed 211213531Sjairo.balart@metempsy.comoperator * (const sc_signed &u, unsigned long v) 211313531Sjairo.balart@metempsy.com{ 211413531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 211513531Sjairo.balart@metempsy.com 211613531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 211713531Sjairo.balart@metempsy.com return sc_signed(); 211813531Sjairo.balart@metempsy.com 211913531Sjairo.balart@metempsy.com CONVERT_LONG_2(v); 212013531Sjairo.balart@metempsy.com 212113531Sjairo.balart@metempsy.com // else cases 2-4 212213531Sjairo.balart@metempsy.com return mul_signed_friend(s, u.nbits, u.ndigits, u.digit, 212313531Sjairo.balart@metempsy.com BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 212413531Sjairo.balart@metempsy.com} 212513531Sjairo.balart@metempsy.com 212613531Sjairo.balart@metempsy.comsc_signed 212713531Sjairo.balart@metempsy.comoperator * (unsigned long u, const sc_signed &v) 212813531Sjairo.balart@metempsy.com{ 212913531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 213013531Sjairo.balart@metempsy.com 213113531Sjairo.balart@metempsy.com if (s == SC_ZERO) // case 1 213213531Sjairo.balart@metempsy.com return sc_signed(); 213313531Sjairo.balart@metempsy.com 213413531Sjairo.balart@metempsy.com CONVERT_LONG_2(u); 213513531Sjairo.balart@metempsy.com 213613531Sjairo.balart@metempsy.com // cases 2-4 213713531Sjairo.balart@metempsy.com return mul_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 213813531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 213913531Sjairo.balart@metempsy.com} 214013531Sjairo.balart@metempsy.com 214113531Sjairo.balart@metempsy.com// The rest of the operators in this section are included from 214213531Sjairo.balart@metempsy.com// sc_nbcommon.cpp. 214313531Sjairo.balart@metempsy.com 214413531Sjairo.balart@metempsy.com 214513531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 214613531Sjairo.balart@metempsy.com// SECTION: DIVISION operators: /, /= 214713531Sjairo.balart@metempsy.com// ---------------------------------------------------------------------------- 214813531Sjairo.balart@metempsy.com 214913531Sjairo.balart@metempsy.com// Cases to consider when finding the quotient q = floor(u/v): 215013531Sjairo.balart@metempsy.com// Note that u = q * v + r for r < q. 215113531Sjairo.balart@metempsy.com// 1. 0 / 0 or u / 0 => error 215213531Sjairo.balart@metempsy.com// 2. 0 / v => 0 = 0 * v + 0 215313531Sjairo.balart@metempsy.com// 3. u / v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1 215413531Sjairo.balart@metempsy.com// 4. u / v & &u < v => u = 0 * v + u - u can be 1 or -1 215513531Sjairo.balart@metempsy.com// 5. u / v & &u > v => u = q * v + r - v can be 1 or -1 215613531Sjairo.balart@metempsy.com 215713531Sjairo.balart@metempsy.comsc_signed 215813531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, const sc_signed &v) 215913531Sjairo.balart@metempsy.com{ 216013531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 216113531Sjairo.balart@metempsy.com 216213531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 216313531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 216413531Sjairo.balart@metempsy.com return sc_signed(); // case 2 216513531Sjairo.balart@metempsy.com } 216613531Sjairo.balart@metempsy.com 216713531Sjairo.balart@metempsy.com // other cases 216813531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 216913531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 217013531Sjairo.balart@metempsy.com} 217113531Sjairo.balart@metempsy.com 217213531Sjairo.balart@metempsy.com 217313531Sjairo.balart@metempsy.comsc_signed 217413531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_unsigned &v) 217513531Sjairo.balart@metempsy.com{ 217613531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 217713531Sjairo.balart@metempsy.com 217813531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 217913531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 218013531Sjairo.balart@metempsy.com return sc_signed(); // case 2 218113531Sjairo.balart@metempsy.com } 218213531Sjairo.balart@metempsy.com 218313531Sjairo.balart@metempsy.com // other cases 218413531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 218513531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 218613531Sjairo.balart@metempsy.com} 218713531Sjairo.balart@metempsy.com 218813531Sjairo.balart@metempsy.com 218913531Sjairo.balart@metempsy.comsc_signed 219013531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, const sc_signed &v) 219113531Sjairo.balart@metempsy.com{ 219213531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, v.sgn); 219313531Sjairo.balart@metempsy.com 219413531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 219513531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 219613531Sjairo.balart@metempsy.com return sc_signed(); // case 2 219713531Sjairo.balart@metempsy.com } 219813531Sjairo.balart@metempsy.com 219913531Sjairo.balart@metempsy.com // other cases 220013531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 220113531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 220213531Sjairo.balart@metempsy.com} 220313531Sjairo.balart@metempsy.com 220413531Sjairo.balart@metempsy.com 220513531Sjairo.balart@metempsy.comsc_signed 220613531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, int64 v) 220713531Sjairo.balart@metempsy.com{ 220813531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 220913531Sjairo.balart@metempsy.com 221013531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 221113531Sjairo.balart@metempsy.com div_by_zero(v); // case 1 221213531Sjairo.balart@metempsy.com return sc_signed(); // case 2 221313531Sjairo.balart@metempsy.com } 221413531Sjairo.balart@metempsy.com 221513531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 221613531Sjairo.balart@metempsy.com 221713531Sjairo.balart@metempsy.com // other cases 221813531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 221913531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 222013531Sjairo.balart@metempsy.com} 222113531Sjairo.balart@metempsy.com 222213531Sjairo.balart@metempsy.com 222313531Sjairo.balart@metempsy.comsc_signed 222413531Sjairo.balart@metempsy.comoperator / (int64 u, const sc_signed &v) 222513531Sjairo.balart@metempsy.com{ 222613531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 222713531Sjairo.balart@metempsy.com 222813531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 222913531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 223013531Sjairo.balart@metempsy.com return sc_signed(); // case 2 223113531Sjairo.balart@metempsy.com } 223213531Sjairo.balart@metempsy.com 223313531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 223413531Sjairo.balart@metempsy.com 223513531Sjairo.balart@metempsy.com // other cases 223613531Sjairo.balart@metempsy.com return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 223713531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 223813531Sjairo.balart@metempsy.com} 223913531Sjairo.balart@metempsy.com 224013531Sjairo.balart@metempsy.com 224113531Sjairo.balart@metempsy.comsc_signed 224213531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, int64 v) 224313531Sjairo.balart@metempsy.com{ 224413531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 224513531Sjairo.balart@metempsy.com 224613531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 224713531Sjairo.balart@metempsy.com div_by_zero(v); // case 1 224813531Sjairo.balart@metempsy.com return sc_signed(); // case 2 224913531Sjairo.balart@metempsy.com } 225013531Sjairo.balart@metempsy.com 225113531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 225213531Sjairo.balart@metempsy.com 225313531Sjairo.balart@metempsy.com // other cases 225413531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 225513531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 225613531Sjairo.balart@metempsy.com} 225713531Sjairo.balart@metempsy.com 225813531Sjairo.balart@metempsy.com 225913531Sjairo.balart@metempsy.comsc_signed 226013531Sjairo.balart@metempsy.comoperator / (int64 u, const sc_unsigned &v) 226113531Sjairo.balart@metempsy.com{ 226213531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 226313531Sjairo.balart@metempsy.com 226413531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 226513531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 226613531Sjairo.balart@metempsy.com return sc_signed(); // case 2 226713531Sjairo.balart@metempsy.com } 226813531Sjairo.balart@metempsy.com 226913531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 227013531Sjairo.balart@metempsy.com 227113531Sjairo.balart@metempsy.com // other cases 227213531Sjairo.balart@metempsy.com return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 227313531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 227413531Sjairo.balart@metempsy.com} 227513531Sjairo.balart@metempsy.com 227613531Sjairo.balart@metempsy.com 227713531Sjairo.balart@metempsy.comsc_signed 227813531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, uint64 v) 227913531Sjairo.balart@metempsy.com{ 228013531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 228113531Sjairo.balart@metempsy.com 228213531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 228313531Sjairo.balart@metempsy.com div_by_zero(v); // case 1 228413531Sjairo.balart@metempsy.com return sc_signed(); // case 2 228513531Sjairo.balart@metempsy.com } 228613531Sjairo.balart@metempsy.com 228713531Sjairo.balart@metempsy.com CONVERT_INT64_2(v); 228813531Sjairo.balart@metempsy.com 228913531Sjairo.balart@metempsy.com // other cases 229013531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 229113531Sjairo.balart@metempsy.com BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 229213531Sjairo.balart@metempsy.com} 229313531Sjairo.balart@metempsy.com 229413531Sjairo.balart@metempsy.com 229513531Sjairo.balart@metempsy.comsc_signed 229613531Sjairo.balart@metempsy.comoperator / (uint64 u, const sc_signed &v) 229713531Sjairo.balart@metempsy.com{ 229813531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 229913531Sjairo.balart@metempsy.com 230013531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 230113531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 230213531Sjairo.balart@metempsy.com return sc_signed(); // case 2 230313531Sjairo.balart@metempsy.com 230413531Sjairo.balart@metempsy.com } 230513531Sjairo.balart@metempsy.com 230613531Sjairo.balart@metempsy.com CONVERT_INT64_2(u); 230713531Sjairo.balart@metempsy.com 230813531Sjairo.balart@metempsy.com // other cases 230913531Sjairo.balart@metempsy.com return div_signed_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 231013531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 231113531Sjairo.balart@metempsy.com} 231213531Sjairo.balart@metempsy.com 231313531Sjairo.balart@metempsy.com 231413531Sjairo.balart@metempsy.comsc_signed 231513531Sjairo.balart@metempsy.comoperator / (const sc_signed &u, long v) 231613531Sjairo.balart@metempsy.com{ 231713531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 231813531Sjairo.balart@metempsy.com 231913531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 232013531Sjairo.balart@metempsy.com div_by_zero(v); // case 1 232113531Sjairo.balart@metempsy.com return sc_signed(); // case 2 232213531Sjairo.balart@metempsy.com } 232313531Sjairo.balart@metempsy.com 232413531Sjairo.balart@metempsy.com CONVERT_LONG_2(v); 232513531Sjairo.balart@metempsy.com 232613531Sjairo.balart@metempsy.com // other cases 232713531Sjairo.balart@metempsy.com return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 232813531Sjairo.balart@metempsy.com BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 232913531Sjairo.balart@metempsy.com} 233013531Sjairo.balart@metempsy.com 233113531Sjairo.balart@metempsy.com 233213531Sjairo.balart@metempsy.comsc_signed 233313531Sjairo.balart@metempsy.comoperator / (long u, const sc_signed &v) 233413531Sjairo.balart@metempsy.com{ 233513531Sjairo.balart@metempsy.com small_type s = mul_signs(v.sgn, get_sign(u)); 233613531Sjairo.balart@metempsy.com 233713531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 233813531Sjairo.balart@metempsy.com div_by_zero(v.sgn); // case 1 233913531Sjairo.balart@metempsy.com return sc_signed(); // case 2 234013531Sjairo.balart@metempsy.com } 234113531Sjairo.balart@metempsy.com 234213531Sjairo.balart@metempsy.com CONVERT_LONG_2(u); 234313531Sjairo.balart@metempsy.com 234413531Sjairo.balart@metempsy.com // other cases 234513531Sjairo.balart@metempsy.com return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 234613531Sjairo.balart@metempsy.com v.nbits, v.ndigits, v.digit); 234713531Sjairo.balart@metempsy.com} 234813531Sjairo.balart@metempsy.com 234913531Sjairo.balart@metempsy.com 235013531Sjairo.balart@metempsy.comsc_signed 235113531Sjairo.balart@metempsy.comoperator / (const sc_unsigned &u, long v) 235213531Sjairo.balart@metempsy.com{ 235313531Sjairo.balart@metempsy.com small_type s = mul_signs(u.sgn, get_sign(v)); 235413531Sjairo.balart@metempsy.com 235513531Sjairo.balart@metempsy.com if (s == SC_ZERO) { 235613531Sjairo.balart@metempsy.com div_by_zero(v); // case 1 235713531Sjairo.balart@metempsy.com return sc_signed(); // case 2 235813531Sjairo.balart@metempsy.com } 235913531Sjairo.balart@metempsy.com 236013531Sjairo.balart@metempsy.com CONVERT_LONG_2(v); 236113531Sjairo.balart@metempsy.com 236213531Sjairo.balart@metempsy.com // other cases 2363 return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 2364 BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2365} 2366 2367 2368sc_signed 2369operator / (long u, const sc_unsigned &v) 2370{ 2371 small_type s = mul_signs(v.sgn, get_sign(u)); 2372 2373 if (s == SC_ZERO) { 2374 div_by_zero(v.sgn); // case 1 2375 return sc_signed(); // case 2 2376 } 2377 2378 CONVERT_LONG_2(u); 2379 2380 // other cases 2381 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2382 v.nbits, v.ndigits, v.digit); 2383} 2384 2385 2386sc_signed 2387operator / (const sc_signed &u, unsigned long v) 2388{ 2389 small_type s = mul_signs(u.sgn, get_sign(v)); 2390 2391 if (s == SC_ZERO) { 2392 div_by_zero(v); // case 1 2393 return sc_signed(); // case 2 2394 } 2395 2396 CONVERT_LONG_2(v); 2397 2398 // other cases 2399 return div_signed_friend(s, u.nbits, u.ndigits, u.digit, 2400 BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2401} 2402 2403 2404sc_signed 2405operator / (unsigned long u, const sc_signed &v) 2406{ 2407 small_type s = mul_signs(v.sgn, get_sign(u)); 2408 2409 if (s == SC_ZERO) { 2410 div_by_zero(v.sgn); // case 1 2411 return sc_signed(); // case 2 2412 2413 } 2414 2415 CONVERT_LONG_2(u); 2416 2417 // other cases 2418 return div_signed_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2419 v.nbits, v.ndigits, v.digit); 2420} 2421 2422// The rest of the operators in this section are included from 2423// sc_nbcommon.cpp. 2424 2425 2426// ---------------------------------------------------------------------------- 2427// SECTION: MOD operators: %, %=. 2428// ---------------------------------------------------------------------------- 2429 2430// Cases to consider when finding the remainder r = u % v: 2431// Note that u = q * v + r for r < q. 2432// 1. 0 % 0 or u % 0 => error 2433// 2. 0 % v => 0 = 0 * v + 0 2434// 3. u % v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1 2435// 4. u % v & &u < v => u = 0 * v + u - u can be 1 or -1 2436// 5. u % v & &u > v => u = q * v + r - v can be 1 or -1 2437 2438sc_signed 2439operator % (const sc_unsigned &u, const sc_signed &v) 2440{ 2441 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 2442 div_by_zero(v.sgn); // case 1 2443 return sc_signed(); // case 2 2444 } 2445 2446 // other cases 2447 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2448 v.nbits, v.ndigits, v.digit); 2449} 2450 2451 2452sc_signed 2453operator % (const sc_signed &u, const sc_unsigned &v) 2454{ 2455 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 2456 div_by_zero(v.sgn); // case 1 2457 return sc_signed(); // case 2 2458 } 2459 2460 // other cases 2461 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2462 v.nbits, v.ndigits, v.digit); 2463} 2464 2465 2466sc_signed 2467operator % (const sc_signed &u, const sc_signed &v) 2468{ 2469 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 2470 div_by_zero(v.sgn); // case 1 2471 return sc_signed(); // case 2 2472 } 2473 2474 // other cases 2475 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2476 v.nbits, v.ndigits, v.digit); 2477} 2478 2479 2480sc_signed 2481operator % (const sc_signed &u, int64 v) 2482{ 2483 small_type vs = get_sign(v); 2484 2485 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) { 2486 div_by_zero(v); // case 1 2487 return sc_signed(); // case 2 2488 } 2489 2490 CONVERT_INT64_2(v); 2491 2492 // other cases 2493 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2494 BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2495} 2496 2497 2498sc_signed 2499operator % (int64 u, const sc_signed &v) 2500{ 2501 small_type us = get_sign(u); 2502 2503 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) { 2504 div_by_zero(v.sgn); // case 1 2505 return sc_signed(); // case 2 2506 } 2507 2508 CONVERT_INT64_2(u); 2509 2510 // other cases 2511 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2512 v.nbits, v.ndigits, v.digit); 2513} 2514 2515 2516sc_signed 2517operator % (const sc_unsigned &u, int64 v) 2518{ 2519 small_type vs = get_sign(v); 2520 2521 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) { 2522 div_by_zero(v); // case 1 2523 return sc_signed(); // case 2 2524 } 2525 2526 CONVERT_INT64_2(v); 2527 2528 // other cases 2529 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2530 BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2531} 2532 2533 2534sc_signed 2535operator % (int64 u, const sc_unsigned &v) 2536{ 2537 small_type us = get_sign(u); 2538 2539 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) { 2540 div_by_zero(v.sgn); // case 1 2541 return sc_signed(); // case 2 2542 } 2543 2544 CONVERT_INT64_2(u); 2545 2546 // other cases 2547 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2548 v.nbits, v.ndigits, v.digit); 2549} 2550 2551 2552sc_signed 2553operator % (const sc_signed &u, uint64 v) 2554{ 2555 if ((u.sgn == SC_ZERO) || (v == 0)) { 2556 div_by_zero(v); // case 1 2557 return sc_signed(); // case 2 2558 } 2559 2560 CONVERT_INT64_2(v); 2561 2562 // other cases 2563 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2564 BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2565} 2566 2567 2568sc_signed 2569operator % (uint64 u, const sc_signed &v) 2570{ 2571 if ((u == 0) || (v.sgn == SC_ZERO)) { 2572 div_by_zero(v.sgn); // case 1 2573 return sc_signed(); // case 2 2574 } 2575 2576 CONVERT_INT64(u); 2577 2578 // other cases 2579 return mod_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2580 v.nbits, v.ndigits, v.digit); 2581} 2582 2583 2584sc_signed 2585operator % (const sc_signed &u, long v) 2586{ 2587 small_type vs = get_sign(v); 2588 2589 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) { 2590 div_by_zero(v); // case 1 2591 return sc_signed(); // case 2 2592 } 2593 2594 CONVERT_LONG_2(v); 2595 2596 // other cases 2597 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2598 BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2599} 2600 2601 2602sc_signed 2603operator % (long u, const sc_signed &v) 2604{ 2605 small_type us = get_sign(u); 2606 2607 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) { 2608 div_by_zero(v.sgn); // case 1 2609 return sc_signed(); // case 2 2610 } 2611 2612 CONVERT_LONG_2(u); 2613 2614 // other cases 2615 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2616 v.nbits, v.ndigits, v.digit); 2617} 2618 2619 2620sc_signed 2621operator % (const sc_unsigned &u, long v) 2622{ 2623 2624 small_type vs = get_sign(v); 2625 2626 if ((u.sgn == SC_ZERO) || (vs == SC_ZERO)) { 2627 div_by_zero(v); // case 1 2628 return sc_signed(); // case 2 2629 } 2630 2631 CONVERT_LONG_2(v); 2632 2633 // other cases 2634 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2635 BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2636} 2637 2638 2639sc_signed 2640operator % (long u, const sc_unsigned &v) 2641{ 2642 small_type us = get_sign(u); 2643 2644 if ((us == SC_ZERO) || (v.sgn == SC_ZERO)) { 2645 div_by_zero(v.sgn); // case 1 2646 return sc_signed(); // case 2 2647 } 2648 2649 CONVERT_LONG_2(u); 2650 2651 // other cases 2652 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2653 v.nbits, v.ndigits, v.digit); 2654} 2655 2656 2657sc_signed 2658operator % (const sc_signed &u, unsigned long v) 2659{ 2660 if ((u.sgn == SC_ZERO) || (v == 0)) { 2661 div_by_zero(v); // case 1 2662 return sc_signed(); // case 2 2663 } 2664 2665 CONVERT_LONG_2(v); 2666 2667 // other cases 2668 return mod_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2669 BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2670} 2671 2672 2673sc_signed 2674operator % (unsigned long u, const sc_signed &v) 2675{ 2676 if ((u == 0) || (v.sgn == SC_ZERO)) { 2677 div_by_zero(v.sgn); // case 1 2678 return sc_signed(); // case 2 2679 } 2680 2681 CONVERT_LONG(u); 2682 2683 // other cases 2684 return mod_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2685 v.nbits, v.ndigits, v.digit); 2686} 2687 2688// The rest of the operators in this section are included from 2689// sc_nbcommon.cpp. 2690 2691 2692// ---------------------------------------------------------------------------- 2693// SECTION: Bitwise AND operators: &, &= 2694// ---------------------------------------------------------------------------- 2695 2696// Cases to consider when computing u &v: 2697// 1. u & 0 = 0 &v = 0 2698// 2. u &v => sgn = + 2699// 3. (-u) & (-v) => sgn = - 2700// 4. u & (-v) => sgn = + 2701// 5. (-u) &v => sgn = + 2702 2703sc_signed 2704operator & (const sc_unsigned &u, const sc_signed &v) 2705{ 2706 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 2707 return sc_signed(); 2708 2709 // other cases 2710 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2711 v.sgn, v.nbits, v.ndigits, v.digit); 2712} 2713 2714 2715sc_signed 2716operator & (const sc_signed &u, const sc_unsigned &v) 2717{ 2718 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 2719 return sc_signed(); 2720 2721 // other cases 2722 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2723 v.sgn, v.nbits, v.ndigits, v.digit); 2724} 2725 2726 2727sc_signed 2728operator & (const sc_signed &u, const sc_signed &v) 2729{ 2730 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 2731 return sc_signed(); 2732 2733 // other cases 2734 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2735 v.sgn, v.nbits, v.ndigits, v.digit); 2736} 2737 2738 2739sc_signed 2740operator & (const sc_signed &u, int64 v) 2741{ 2742 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2743 return sc_signed(); 2744 2745 CONVERT_INT64(v); 2746 2747 // other cases 2748 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2749 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2750} 2751 2752 2753sc_signed 2754operator & (int64 u, const sc_signed &v) 2755{ 2756 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2757 return sc_signed(); 2758 2759 CONVERT_INT64(u); 2760 2761 // other cases 2762 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2763 v.sgn, v.nbits, v.ndigits, v.digit); 2764} 2765 2766 2767sc_signed 2768operator & (const sc_unsigned &u, int64 v) 2769{ 2770 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2771 return sc_signed(); 2772 2773 CONVERT_INT64(v); 2774 2775 // other cases 2776 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2777 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2778} 2779 2780 2781sc_signed 2782operator & (int64 u, const sc_unsigned &v) 2783{ 2784 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2785 return sc_signed(); 2786 2787 CONVERT_INT64(u); 2788 2789 // other cases 2790 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2791 v.sgn, v.nbits, v.ndigits, v.digit); 2792} 2793 2794 2795sc_signed 2796operator & (const sc_signed &u, uint64 v) 2797{ 2798 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2799 return sc_signed(); 2800 2801 CONVERT_INT64(v); 2802 2803 // other cases 2804 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2805 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2806} 2807 2808 2809sc_signed 2810operator & (uint64 u, const sc_signed &v) 2811{ 2812 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2813 return sc_signed(); 2814 2815 CONVERT_INT64(u); 2816 2817 // other cases 2818 return and_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2819 v.sgn, v.nbits, v.ndigits, v.digit); 2820} 2821 2822 2823sc_signed 2824operator & (const sc_signed &u, long v) 2825{ 2826 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2827 return sc_signed(); 2828 2829 CONVERT_LONG(v); 2830 2831 // other cases 2832 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2833 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2834} 2835 2836 2837sc_signed 2838operator & (long u, const sc_signed &v) 2839{ 2840 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2841 return sc_signed(); 2842 2843 CONVERT_LONG(u); 2844 2845 // other cases 2846 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2847 v.sgn, v.nbits, v.ndigits, v.digit); 2848} 2849 2850 2851sc_signed 2852operator & (const sc_unsigned &u, long v) 2853{ 2854 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2855 return sc_signed(); 2856 2857 CONVERT_LONG(v); 2858 2859 // other cases 2860 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2861 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2862} 2863 2864 2865sc_signed 2866operator & (long u, const sc_unsigned &v) 2867{ 2868 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2869 return sc_signed(); 2870 2871 CONVERT_LONG(u); 2872 2873 // other cases 2874 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2875 v.sgn, v.nbits, v.ndigits, v.digit); 2876} 2877 2878 2879sc_signed 2880operator & (const sc_signed &u, unsigned long v) 2881{ 2882 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 2883 return sc_signed(); 2884 2885 CONVERT_LONG(v); 2886 2887 // other cases 2888 return and_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2889 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 2890} 2891 2892 2893sc_signed 2894operator & (unsigned long u, const sc_signed &v) 2895{ 2896 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 2897 return sc_signed(); 2898 2899 CONVERT_LONG(u); 2900 2901 // other cases 2902 return and_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 2903 v.sgn, v.nbits, v.ndigits, v.digit); 2904} 2905 2906// The rest of the operators in this section are included from 2907// sc_nbcommon.cpp. 2908 2909 2910// ---------------------------------------------------------------------------- 2911// SECTION: Bitwise OR operators: |, |= 2912// ---------------------------------------------------------------------------- 2913 2914// Cases to consider when computing u | v: 2915// 1. u | 0 = u 2916// 2. 0 | v = v 2917// 3. u | v => sgn = + 2918// 4. (-u) | (-v) => sgn = - 2919// 5. u | (-v) => sgn = - 2920// 6. (-u) | v => sgn = - 2921 2922sc_signed 2923operator | (const sc_unsigned &u, const sc_signed &v) 2924{ 2925 if (v.sgn == SC_ZERO) // case 1 2926 return sc_signed(u); 2927 2928 if (u.sgn == SC_ZERO) // case 2 2929 return sc_signed(v); 2930 2931 // other cases 2932 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2933 v.sgn, v.nbits, v.ndigits, v.digit); 2934} 2935 2936 2937sc_signed 2938operator | (const sc_signed &u, const sc_unsigned &v) 2939{ 2940 if (v.sgn == SC_ZERO) // case 1 2941 return sc_signed(u); 2942 2943 if (u.sgn == SC_ZERO) // case 2 2944 return sc_signed(v); 2945 2946 // other cases 2947 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2948 v.sgn, v.nbits, v.ndigits, v.digit); 2949} 2950 2951 2952sc_signed 2953operator | (const sc_signed &u, const sc_signed &v) 2954{ 2955 if (v.sgn == SC_ZERO) // case 1 2956 return sc_signed(u); 2957 2958 if (u.sgn == SC_ZERO) // case 2 2959 return sc_signed(v); 2960 2961 // other cases 2962 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2963 v.sgn, v.nbits, v.ndigits, v.digit); 2964} 2965 2966 2967sc_signed 2968operator | (const sc_signed &u, int64 v) 2969{ 2970 if (v == 0) // case 1 2971 return sc_signed(u); 2972 2973 CONVERT_INT64(v); 2974 2975 if (u.sgn == SC_ZERO) // case 2 2976 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 2977 2978 // other cases 2979 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 2980 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 2981} 2982 2983 2984sc_signed 2985operator | (int64 u, const sc_signed &v) 2986{ 2987 if (u == 0) 2988 return sc_signed(v); 2989 2990 CONVERT_INT64(u); 2991 2992 if (v.sgn == SC_ZERO) 2993 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 2994 2995 // other cases 2996 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 2997 v.sgn, v.nbits, v.ndigits, v.digit); 2998} 2999 3000 3001sc_signed 3002operator | (const sc_unsigned &u, int64 v) 3003{ 3004 if (v == 0) // case 1 3005 return sc_signed(u); 3006 3007 CONVERT_INT64(v); 3008 3009 if (u.sgn == SC_ZERO) // case 2 3010 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 3011 3012 // other cases 3013 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3014 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 3015} 3016 3017 3018sc_signed 3019operator | (int64 u, const sc_unsigned &v) 3020{ 3021 if (u == 0) 3022 return sc_signed(v); 3023 3024 CONVERT_INT64(u); 3025 3026 if (v.sgn == SC_ZERO) 3027 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 3028 3029 // other cases 3030 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 3031 v.sgn, v.nbits, v.ndigits, v.digit); 3032} 3033 3034 3035sc_signed 3036operator | (const sc_signed &u, uint64 v) 3037{ 3038 if (v == 0) // case 1 3039 return sc_signed(u); 3040 3041 CONVERT_INT64(v); 3042 3043 if (u.sgn == SC_ZERO) // case 2 3044 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 3045 3046 // other cases 3047 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3048 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 3049} 3050 3051 3052sc_signed 3053operator | (uint64 u, const sc_signed &v) 3054{ 3055 if (u == 0) 3056 return sc_signed(v); 3057 3058 CONVERT_INT64(u); 3059 3060 if (v.sgn == SC_ZERO) 3061 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 3062 3063 // other cases 3064 return or_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 3065 v.sgn, v.nbits, v.ndigits, v.digit); 3066} 3067 3068 3069sc_signed 3070operator | (const sc_signed &u, long v) 3071{ 3072 if (v == 0) // case 1 3073 return sc_signed(u); 3074 3075 CONVERT_LONG(v); 3076 3077 if (u.sgn == SC_ZERO) // case 2 3078 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3079 3080 // other cases 3081 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3082 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3083} 3084 3085 3086sc_signed 3087operator | (long u, const sc_signed &v) 3088{ 3089 if (u == 0) 3090 return sc_signed(v); 3091 3092 CONVERT_LONG(u); 3093 3094 if (v.sgn == SC_ZERO) 3095 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3096 3097 // other cases 3098 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3099 v.sgn, v.nbits, v.ndigits, v.digit); 3100} 3101 3102 3103sc_signed 3104operator | (const sc_unsigned &u, long v) 3105{ 3106 if (v == 0) // case 1 3107 return sc_signed(u); 3108 3109 CONVERT_LONG(v); 3110 3111 if (u.sgn == SC_ZERO) // case 2 3112 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3113 3114 // other cases 3115 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3116 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3117} 3118 3119 3120sc_signed 3121operator | (long u, const sc_unsigned &v) 3122{ 3123 if (u == 0) 3124 return sc_signed(v); 3125 3126 CONVERT_LONG(u); 3127 3128 if (v.sgn == SC_ZERO) 3129 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3130 3131 // other cases 3132 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3133 v.sgn, v.nbits, v.ndigits, v.digit); 3134} 3135 3136 3137sc_signed 3138operator | (const sc_signed &u, unsigned long v) 3139{ 3140 if (v == 0) // case 1 3141 return sc_signed(u); 3142 3143 CONVERT_LONG(v); 3144 3145 if (u.sgn == SC_ZERO) // case 2 3146 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3147 3148 // other cases 3149 return or_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3150 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3151} 3152 3153 3154sc_signed 3155operator | (unsigned long u, const sc_signed &v) 3156{ 3157 if (u == 0) 3158 return sc_signed(v); 3159 3160 CONVERT_LONG(u); 3161 3162 if (v.sgn == SC_ZERO) 3163 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3164 3165 // other cases 3166 return or_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3167 v.sgn, v.nbits, v.ndigits, v.digit); 3168} 3169 3170// The rest of the operators in this section are included from 3171// sc_nbcommon.cpp. 3172 3173 3174// ---------------------------------------------------------------------------- 3175// SECTION: Bitwise XOR operators: ^, ^= 3176// ---------------------------------------------------------------------------- 3177 3178// Cases to consider when computing u ^ v: 3179// Note that u ^ v = (~u &v) | (u & ~v). 3180// 1. u ^ 0 = u 3181// 2. 0 ^ v = v 3182// 3. u ^ v => sgn = + 3183// 4. (-u) ^ (-v) => sgn = - 3184// 5. u ^ (-v) => sgn = - 3185// 6. (-u) ^ v => sgn = + 3186 3187sc_signed 3188operator ^ (const sc_unsigned &u, const sc_signed &v) 3189{ 3190 3191 if (v.sgn == SC_ZERO) // case 1 3192 return sc_signed(u); 3193 3194 if (u.sgn == SC_ZERO) // case 2 3195 return sc_signed(v); 3196 3197 // other cases 3198 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3199 v.sgn, v.nbits, v.ndigits, v.digit); 3200 3201} 3202 3203 3204sc_signed 3205operator ^ (const sc_signed &u, const sc_unsigned &v) 3206{ 3207 if (v.sgn == SC_ZERO) // case 1 3208 return sc_signed(u); 3209 3210 if (u.sgn == SC_ZERO) // case 2 3211 return sc_signed(v); 3212 3213 // other cases 3214 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3215 v.sgn, v.nbits, v.ndigits, v.digit); 3216} 3217 3218 3219sc_signed 3220operator ^ (const sc_signed &u, const sc_signed &v) 3221{ 3222 if (v.sgn == SC_ZERO) // case 1 3223 return sc_signed(u); 3224 3225 if (u.sgn == SC_ZERO) // case 2 3226 return sc_signed(v); 3227 3228 // other cases 3229 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3230 v.sgn, v.nbits, v.ndigits, v.digit); 3231} 3232 3233 3234sc_signed 3235operator ^ (const sc_signed &u, int64 v) 3236{ 3237 if (v == 0) // case 1 3238 return sc_signed(u); 3239 3240 CONVERT_INT64(v); 3241 3242 if (u.sgn == SC_ZERO) // case 2 3243 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 3244 3245 // other cases 3246 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3247 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 3248} 3249 3250 3251sc_signed 3252operator ^ (int64 u, const sc_signed &v) 3253{ 3254 if (u == 0) 3255 return sc_signed(v); 3256 3257 CONVERT_INT64(u); 3258 3259 if (v.sgn == SC_ZERO) 3260 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 3261 3262 // other cases 3263 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 3264 v.sgn, v.nbits, v.ndigits, v.digit); 3265} 3266 3267 3268sc_signed 3269operator ^ (const sc_unsigned &u, int64 v) 3270{ 3271 if (v == 0) // case 1 3272 return sc_signed(u); 3273 3274 CONVERT_INT64(v); 3275 3276 if (u.sgn == SC_ZERO) // case 2 3277 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 3278 3279 // other cases 3280 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3281 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 3282} 3283 3284 3285sc_signed 3286operator ^ (int64 u, const sc_unsigned &v) 3287{ 3288 if (u == 0) 3289 return sc_signed(v); 3290 3291 CONVERT_INT64(u); 3292 3293 if (v.sgn == SC_ZERO) 3294 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 3295 3296 // other cases 3297 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 3298 v.sgn, v.nbits, v.ndigits, v.digit); 3299} 3300 3301 3302sc_signed 3303operator ^ (const sc_signed &u, uint64 v) 3304{ 3305 if (v == 0) // case 1 3306 return sc_signed(u); 3307 3308 CONVERT_INT64(v); 3309 3310 if (u.sgn == SC_ZERO) // case 2 3311 return sc_signed(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 3312 3313 // other cases 3314 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3315 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 3316} 3317 3318sc_signed 3319operator ^ (uint64 u, const sc_signed &v) 3320{ 3321 if (u == 0) 3322 return sc_signed(v); 3323 3324 CONVERT_INT64(u); 3325 3326 if (v.sgn == SC_ZERO) 3327 return sc_signed(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 3328 3329 // other cases 3330 return xor_signed_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 3331 v.sgn, v.nbits, v.ndigits, v.digit); 3332} 3333 3334 3335sc_signed 3336operator ^ (const sc_signed &u, long v) 3337{ 3338 if (v == 0) // case 1 3339 return sc_signed(u); 3340 3341 CONVERT_LONG(v); 3342 3343 if (u.sgn == SC_ZERO) // case 2 3344 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3345 3346 // other cases 3347 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3348 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3349} 3350 3351 3352sc_signed 3353operator ^ (long u, const sc_signed &v) 3354{ 3355 if (u == 0) 3356 return sc_signed(v); 3357 3358 CONVERT_LONG(u); 3359 3360 if (v.sgn == SC_ZERO) 3361 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3362 3363 // other cases 3364 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3365 v.sgn, v.nbits, v.ndigits, v.digit); 3366} 3367 3368 3369sc_signed 3370operator ^ (const sc_unsigned &u, long v) 3371{ 3372 if (v == 0) // case 1 3373 return sc_signed(u); 3374 3375 CONVERT_LONG(v); 3376 3377 if (u.sgn == SC_ZERO) // case 2 3378 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3379 3380 // other cases 3381 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3382 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3383} 3384 3385 3386sc_signed 3387operator ^ (long u, const sc_unsigned &v) 3388{ 3389 if (u == 0) 3390 return sc_signed(v); 3391 3392 CONVERT_LONG(u); 3393 3394 if (v.sgn == SC_ZERO) 3395 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3396 3397 // other cases 3398 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3399 v.sgn, v.nbits, v.ndigits, v.digit); 3400} 3401 3402 3403sc_signed 3404operator ^ (const sc_signed &u, unsigned long v) 3405{ 3406 if (v == 0) // case 1 3407 return sc_signed(u); 3408 3409 CONVERT_LONG(v); 3410 3411 if (u.sgn == SC_ZERO) // case 2 3412 return sc_signed(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 3413 3414 // other cases 3415 return xor_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, 3416 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 3417} 3418 3419sc_signed 3420operator ^ (unsigned long u, const sc_signed &v) 3421{ 3422 if (u == 0) 3423 return sc_signed(v); 3424 3425 CONVERT_LONG(u); 3426 3427 if (v.sgn == SC_ZERO) 3428 return sc_signed(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 3429 3430 // other cases 3431 return xor_signed_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 3432 v.sgn, v.nbits, v.ndigits, v.digit); 3433} 3434 3435// The rest of the operators in this section are included from 3436// sc_nbcommon.cpp. 3437 3438 3439// ---------------------------------------------------------------------------- 3440// SECTION: Bitwise NOT operator: ~ 3441// ---------------------------------------------------------------------------- 3442 3443// Operators in this section are included from sc_nbcommon.cpp. 3444 3445 3446// ---------------------------------------------------------------------------- 3447// SECTION: LEFT SHIFT operators: <<, <<= 3448// ---------------------------------------------------------------------------- 3449 3450sc_signed 3451operator << (const sc_signed &u, const sc_unsigned &v) 3452{ 3453 if (v.sgn == SC_ZERO) 3454 return sc_signed(u); 3455 3456 return operator << (u, v.to_ulong()); 3457} 3458 3459// The rest of the operators in this section are included from 3460// sc_nbcommon.cpp. 3461 3462 3463// ---------------------------------------------------------------------------- 3464// SECTION: RIGHT SHIFT operators: >>, >>= 3465// ---------------------------------------------------------------------------- 3466 3467sc_signed 3468operator >> (const sc_signed &u, const sc_unsigned &v) 3469{ 3470 if (v.sgn == SC_ZERO) 3471 return sc_signed(u); 3472 3473 return operator >> (u, v.to_ulong()); 3474} 3475 3476// The rest of the operators in this section are included from 3477// sc_nbcommon.cpp. 3478 3479 3480// ---------------------------------------------------------------------------- 3481// SECTION: Unary arithmetic operators. 3482// ---------------------------------------------------------------------------- 3483 3484sc_signed 3485operator + (const sc_signed &u) 3486{ 3487 return sc_signed(u); 3488} 3489 3490sc_signed 3491operator - (const sc_signed &u) 3492{ 3493 return sc_signed(u, -u.sgn); 3494} 3495 3496sc_signed 3497operator - (const sc_unsigned &u) 3498{ 3499 return sc_signed(u, -u.sgn); 3500} 3501 3502 3503// ---------------------------------------------------------------------------- 3504// SECTION: EQUAL operator: == 3505// ---------------------------------------------------------------------------- 3506 3507bool 3508operator == (const sc_signed &u, const sc_signed &v) 3509{ 3510 if (u.sgn != v.sgn) 3511 return false; 3512 3513 if (&u == &v) 3514 return true; 3515 3516 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) != 0) 3517 return false; 3518 3519 return true; 3520} 3521 3522 3523bool 3524operator == (const sc_signed &u, int64 v) 3525{ 3526 CONVERT_INT64(v); 3527 3528 if (u.sgn != vs) 3529 return false; 3530 3531 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0) 3532 return false; 3533 3534 return true; 3535} 3536 3537 3538bool 3539operator == (int64 u, const sc_signed &v) 3540{ 3541 CONVERT_INT64(u); 3542 3543 if (us != v.sgn) 3544 return false; 3545 3546 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0) 3547 return false; 3548 3549 return true; 3550} 3551 3552 3553bool 3554operator == (const sc_signed &u, uint64 v) 3555{ 3556 CONVERT_INT64(v); 3557 3558 if (u.sgn != vs) 3559 return false; 3560 3561 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) != 0) 3562 return false; 3563 3564 return true; 3565} 3566 3567 3568bool 3569operator == (uint64 u, const sc_signed &v) 3570{ 3571 CONVERT_INT64(u); 3572 3573 if (us != v.sgn) 3574 return false; 3575 3576 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) != 0) 3577 return false; 3578 3579 return true; 3580} 3581 3582 3583bool 3584operator == (const sc_signed &u, long v) 3585{ 3586 CONVERT_LONG(v); 3587 3588 if (u.sgn != vs) 3589 return false; 3590 3591 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0) 3592 return false; 3593 3594 return true; 3595} 3596 3597 3598bool 3599operator == (long u, const sc_signed &v) 3600{ 3601 CONVERT_LONG(u); 3602 3603 if (us != v.sgn) 3604 return false; 3605 3606 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0) 3607 return false; 3608 3609 return true; 3610} 3611 3612 3613bool 3614operator == (const sc_signed &u, unsigned long v) 3615{ 3616 CONVERT_LONG(v); 3617 3618 if (u.sgn != vs) 3619 return false; 3620 3621 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) != 0) 3622 return false; 3623 3624 return true; 3625} 3626 3627 3628bool 3629operator == (unsigned long u, const sc_signed &v) 3630{ 3631 CONVERT_LONG(u); 3632 3633 if (us != v.sgn) 3634 return false; 3635 3636 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) != 0) 3637 return false; 3638 3639 return true; 3640} 3641 3642 3643// ---------------------------------------------------------------------------- 3644// SECTION: NOT_EQUAL operator: != 3645// ---------------------------------------------------------------------------- 3646 3647// Operators in this section are included from sc_nbcommon.cpp. 3648 3649 3650// ---------------------------------------------------------------------------- 3651// SECTION: LESS THAN operator: < 3652// ---------------------------------------------------------------------------- 3653 3654bool 3655operator < (const sc_signed &u, const sc_signed &v) 3656{ 3657 if (u.sgn < v.sgn) 3658 return true; 3659 3660 if (u.sgn > v.sgn) 3661 return false; 3662 3663 // u.sgn == v.sgn 3664 3665 if (&u == &v) 3666 return false; 3667 3668 if (u.sgn == SC_POS) { 3669 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) < 0) 3670 return true; 3671 } else if (u.sgn == SC_NEG) { 3672 if (vec_skip_and_cmp(u.ndigits, u.digit, v.ndigits, v.digit) > 0) 3673 return true; 3674 } 3675 3676 return false; 3677} 3678 3679 3680bool 3681operator < (const sc_signed &u, int64 v) 3682{ 3683 CONVERT_INT64(v); 3684 3685 if (u.sgn < vs) 3686 return true; 3687 3688 if (u.sgn > vs) 3689 return false; 3690 3691 // u.sgn == vs 3692 3693 if (vs == SC_POS) { 3694 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0) 3695 return true; 3696 } else if (vs == SC_NEG) { 3697 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) > 0) 3698 return true; 3699 } 3700 3701 return false; 3702} 3703 3704 3705bool 3706operator < (int64 u, const sc_signed &v) 3707{ 3708 CONVERT_INT64(u); 3709 3710 if (us < v.sgn) 3711 return true; 3712 3713 if (us > v.sgn) 3714 return false; 3715 3716 // us == v.sgn 3717 3718 if (us == SC_POS) { 3719 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0) 3720 return true; 3721 } else if (us == SC_NEG) { 3722 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) > 0) 3723 return true; 3724 } 3725 3726 return false; 3727} 3728 3729 3730bool 3731operator < (const sc_signed &u, uint64 v) 3732{ 3733 CONVERT_INT64(v); 3734 3735 if (u.sgn < vs) 3736 return true; 3737 3738 if (u.sgn > vs) 3739 return false; 3740 3741 // u.sgn == vs 3742 3743 if (vs == SC_POS) { 3744 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_INT64, vd) < 0) 3745 return true; 3746 } 3747 3748 return false; 3749} 3750 3751 3752bool 3753operator < (uint64 u, const sc_signed &v) 3754{ 3755 CONVERT_INT64(u); 3756 3757 if (us < v.sgn) 3758 return true; 3759 3760 if (us > v.sgn) 3761 return false; 3762 3763 // us == v.sgn 3764 3765 if (us == SC_POS) { 3766 if (vec_skip_and_cmp(DIGITS_PER_INT64, ud, v.ndigits, v.digit) < 0) 3767 return true; 3768 } 3769 3770 return false; 3771} 3772 3773 3774bool 3775operator < (const sc_signed &u, long v) 3776{ 3777 CONVERT_LONG(v); 3778 3779 if (u.sgn < vs) 3780 return true; 3781 3782 if (u.sgn > vs) 3783 return false; 3784 3785 // u.sgn == vs 3786 3787 if (vs == SC_POS) { 3788 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0) 3789 return true; 3790 3791 } else if (vs == SC_NEG) { 3792 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) > 0) 3793 return true; 3794 } 3795 3796 return false; 3797} 3798 3799 3800bool 3801operator < (long u, const sc_signed &v) 3802{ 3803 CONVERT_LONG(u); 3804 3805 if (us < v.sgn) 3806 return true; 3807 3808 if (us > v.sgn) 3809 return false; 3810 3811 // us == v.sgn 3812 3813 if (us == SC_POS) { 3814 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0) 3815 return true; 3816 } else if (us == SC_NEG) { 3817 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) > 0) 3818 return true; 3819 } 3820 3821 return false; 3822} 3823 3824 3825bool 3826operator < (const sc_signed &u, unsigned long v) 3827{ 3828 CONVERT_LONG(v); 3829 3830 if (u.sgn < vs) 3831 return true; 3832 3833 if (u.sgn > vs) 3834 return false; 3835 3836 // u.sgn == vs 3837 3838 if (vs == SC_POS) { 3839 if (vec_skip_and_cmp(u.ndigits, u.digit, DIGITS_PER_LONG, vd) < 0) 3840 return true; 3841 } 3842 3843 return false; 3844} 3845 3846 3847bool 3848operator < (unsigned long u, const sc_signed &v) 3849{ 3850 CONVERT_LONG(u); 3851 3852 if (us < v.sgn) 3853 return true; 3854 3855 if (us > v.sgn) 3856 return false; 3857 3858 // us == v.sgn 3859 3860 if (us == SC_POS) { 3861 if (vec_skip_and_cmp(DIGITS_PER_LONG, ud, v.ndigits, v.digit) < 0) 3862 return true; 3863 } 3864 3865 return false; 3866} 3867 3868 3869// --------------------------------------------------------------------------- 3870// SECTION: LESS THAN or EQUAL operator: <= 3871// --------------------------------------------------------------------------- 3872 3873// Operators in this section are included from sc_nbcommon.cpp. 3874 3875 3876// --------------------------------------------------------------------------- 3877// SECTION: GREATER THAN operator: > 3878// --------------------------------------------------------------------------- 3879 3880// Operators in this section are included from sc_nbcommon.cpp. 3881 3882 3883// --------------------------------------------------------------------------- 3884// SECTION: GREATER THAN or EQUAL operator: >= 3885// --------------------------------------------------------------------------- 3886 3887// Operators in this section are included from sc_nbcommon.cpp. 3888 3889 3890// --------------------------------------------------------------------------- 3891// SECTION: Public members - Other utils. 3892// --------------------------------------------------------------------------- 3893 3894bool 3895sc_signed::iszero() const 3896{ 3897 if (sgn == SC_ZERO) 3898 return true; 3899 else if (sgn != SC_NOSIGN) 3900 return false; 3901 else 3902 return check_for_zero(ndigits, digit); 3903} 3904 3905 3906bool 3907sc_signed::sign() const 3908{ 3909 if (sgn == SC_NEG) 3910 return 1; 3911 else if (sgn != SC_NOSIGN) 3912 return 0; 3913 else 3914 return ((digit[ndigits - 1] & one_and_zeros(bit_ord(nbits - 1))) != 0); 3915} 3916 3917// The rest of the utils in this section are included from sc_nbcommon.cpp. 3918 3919 3920// ---------------------------------------------------------------------------- 3921// SECTION: Private members. 3922// ---------------------------------------------------------------------------- 3923 3924// The private members in this section are included from sc_nbcommon.cpp. 3925 3926#define CLASS_TYPE sc_signed 3927#define CLASS_TYPE_STR "sc_signed" 3928 3929#define ADD_HELPER add_signed_friend 3930#define SUB_HELPER sub_signed_friend 3931#define MUL_HELPER mul_signed_friend 3932#define DIV_HELPER div_signed_friend 3933#define MOD_HELPER mod_signed_friend 3934#define AND_HELPER and_signed_friend 3935#define OR_HELPER or_signed_friend 3936#define XOR_HELPER xor_signed_friend 3937 3938#include "sc_nbfriends.inc" 3939 3940#undef SC_UNSIGNED 3941#define SC_SIGNED 3942#define IF_SC_SIGNED 1 // 1 = sc_signed 3943#define CLASS_TYPE_SUBREF sc_signed_subref_r 3944#define OTHER_CLASS_TYPE sc_unsigned 3945#define OTHER_CLASS_TYPE_SUBREF sc_unsigned_subref_r 3946 3947#define MUL_ON_HELPER mul_on_help_signed 3948#define DIV_ON_HELPER div_on_help_signed 3949#define MOD_ON_HELPER mod_on_help_signed 3950 3951#include "sc_nbcommon.inc" 3952 3953#undef MOD_ON_HELPER 3954#undef DIV_ON_HELPER 3955#undef MUL_ON_HELPER 3956 3957#undef OTHER_CLASS_TYPE_SUBREF 3958#undef OTHER_CLASS_TYPE 3959#undef CLASS_TYPE_SUBREF 3960#undef IF_SC_SIGNED 3961#undef SC_SIGNED 3962 3963#undef XOR_HELPER 3964#undef OR_HELPER 3965#undef AND_HELPER 3966#undef MOD_HELPER 3967#undef DIV_HELPER 3968#undef MUL_HELPER 3969#undef SUB_HELPER 3970#undef ADD_HELPER 3971 3972#undef CLASS_TYPE 3973#undef CLASS_TYPE_STR 3974 3975#include "sc_signed_bitref.inc" 3976#include "sc_signed_subref.inc" 3977 3978#undef CONVERT_LONG 3979#undef CONVERT_LONG_2 3980#undef CONVERT_INT64 3981#undef CONVERT_INT64_2 3982 3983} // namespace sc_dt 3984