112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_unsigned.cpp -- Arbitrary precision signed arithmetic. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de This file includes the definitions of sc_unsigned_bitref, 2512027Sjungma@eit.uni-kl.de sc_unsigned_subref, and sc_unsigned classes. The first two classes 2612027Sjungma@eit.uni-kl.de are proxy classes to reference one bit and a range of bits of a 2712027Sjungma@eit.uni-kl.de sc_unsigned number, respectively. This file also includes 2812027Sjungma@eit.uni-kl.de sc_nbcommon.cpp and sc_nbfriends.cpp, which contain the 2912027Sjungma@eit.uni-kl.de definitions shared by sc_unsigned. 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de Original Author: Ali Dasdan, Synopsys, Inc. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de *****************************************************************************/ 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de/***************************************************************************** 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3812027Sjungma@eit.uni-kl.de changes you are making here. 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 4112027Sjungma@eit.uni-kl.de Description of Modification: 4212027Sjungma@eit.uni-kl.de 4312027Sjungma@eit.uni-kl.de *****************************************************************************/ 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de// $Log: sc_unsigned.cpp,v $ 4712027Sjungma@eit.uni-kl.de// Revision 1.7 2011/02/18 20:19:15 acg 4812027Sjungma@eit.uni-kl.de// Andy Goodrich: updating Copyright notice. 4912027Sjungma@eit.uni-kl.de// 5012027Sjungma@eit.uni-kl.de// Revision 1.6 2008/12/10 20:38:45 acg 5112027Sjungma@eit.uni-kl.de// Andy Goodrich: fixed conversion of double values to the digits vector. 5212027Sjungma@eit.uni-kl.de// The bits above the radix were not being masked off. 5312027Sjungma@eit.uni-kl.de// 5412027Sjungma@eit.uni-kl.de// Revision 1.5 2008/06/19 17:47:57 acg 5512027Sjungma@eit.uni-kl.de// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES. 5612027Sjungma@eit.uni-kl.de// 5712027Sjungma@eit.uni-kl.de// Revision 1.4 2008/06/19 16:57:57 acg 5812027Sjungma@eit.uni-kl.de// Andy Goodrich: added case for negative unsigned values to the support in 5912027Sjungma@eit.uni-kl.de// concate_get_data(). 6012027Sjungma@eit.uni-kl.de// 6112027Sjungma@eit.uni-kl.de// Revision 1.3 2007/11/04 21:27:00 acg 6212027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to make sure the proper value is returned from 6312027Sjungma@eit.uni-kl.de// concat_get_data(). 6412027Sjungma@eit.uni-kl.de// 6512027Sjungma@eit.uni-kl.de// Revision 1.2 2007/02/22 21:35:05 acg 6612027Sjungma@eit.uni-kl.de// Andy Goodrich: cleaned up comments in concat_get_ctrl and concat_get_data. 6712027Sjungma@eit.uni-kl.de// 6812027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 6912027Sjungma@eit.uni-kl.de// SystemC 2.3 7012027Sjungma@eit.uni-kl.de// 7112027Sjungma@eit.uni-kl.de// Revision 1.4 2006/08/29 23:36:54 acg 7212027Sjungma@eit.uni-kl.de// Andy Goodrich: fixed and_reduce and optimized or_reduce. 7312027Sjungma@eit.uni-kl.de// 7412027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:49:32 acg 7512027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the 7612027Sjungma@eit.uni-kl.de// source. 7712027Sjungma@eit.uni-kl.de// 7812027Sjungma@eit.uni-kl.de 7912027Sjungma@eit.uni-kl.de#include <ctype.h> 8012027Sjungma@eit.uni-kl.de#include <math.h> 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h" 8312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h" 8412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h" 8512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h" 8612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h" 8712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h" 8812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h" 8912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bv_base.h" 9012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h" 9112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_concatref.h" 9212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_ufix.h" 9312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_other_defs.h" 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.denamespace sc_dt 9612027Sjungma@eit.uni-kl.de{ 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.de// Pool of temporary instances: 9912027Sjungma@eit.uni-kl.de// The sc_unsigned pool is used by the concatenation support. 10012027Sjungma@eit.uni-kl.de// The bit and part reference pools allow references to be returned. 10112027Sjungma@eit.uni-kl.de 10212027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned> sc_unsigned::m_pool(8); 10312027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned_bitref> sc_unsigned_bitref::m_pool(9); 10412027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned_subref> sc_unsigned_subref::m_pool(9); 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------- 10712027Sjungma@eit.uni-kl.de// SECTION: Public members - Invalid selections. 10812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------- 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.devoid 11112027Sjungma@eit.uni-kl.desc_unsigned::invalid_index( int i ) const 11212027Sjungma@eit.uni-kl.de{ 11312027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 11412027Sjungma@eit.uni-kl.de std::sprintf( msg, 11512027Sjungma@eit.uni-kl.de "sc_biguint bit selection: index = %d violates " 11612027Sjungma@eit.uni-kl.de "0 <= index <= %d", 11712027Sjungma@eit.uni-kl.de i, nbits - 2 ); 11812027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 11912027Sjungma@eit.uni-kl.de} 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.devoid 12212027Sjungma@eit.uni-kl.desc_unsigned::invalid_range( int l, int r ) const 12312027Sjungma@eit.uni-kl.de{ 12412027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 12512027Sjungma@eit.uni-kl.de std::sprintf( msg, 12612027Sjungma@eit.uni-kl.de "sc_biguint part selection: left = %d, right = %d \n" 12712027Sjungma@eit.uni-kl.de " violates either (%d >= left >= 0) or (%d >= right >= 0)", 12812027Sjungma@eit.uni-kl.de l, r, nbits-2, nbits-2 ); 12912027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 13012027Sjungma@eit.uni-kl.de} 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13312027Sjungma@eit.uni-kl.de// SECTION: Public members - Concatenation support. 13412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.de// Most public members are included from sc_nbcommon.inc. However, some 13712027Sjungma@eit.uni-kl.de// concatenation support appears here to optimize between the signed and 13812027Sjungma@eit.uni-kl.de// unsigned cases. 13912027Sjungma@eit.uni-kl.de 14012027Sjungma@eit.uni-kl.de 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de// Insert this object's value at the specified place in a vector of big style 14312027Sjungma@eit.uni-kl.de// values. 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.debool sc_unsigned::concat_get_ctrl( sc_digit* dst_p, int low_i ) const 14612027Sjungma@eit.uni-kl.de{ 14712027Sjungma@eit.uni-kl.de int dst_i; // Index to next word to set in dst_p. 14812027Sjungma@eit.uni-kl.de int end_i; // Index of high order word to set. 14912027Sjungma@eit.uni-kl.de int left_shift; // Amount to shift value left. 15012027Sjungma@eit.uni-kl.de sc_digit mask; // Mask for partial word sets. 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.de // CALCULATE METRICS FOR DATA MOVEMENT: 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 15612027Sjungma@eit.uni-kl.de end_i = (low_i + nbits - 2) / BITS_PER_DIGIT; 15712027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.de // MOVE FIRST WORD (IT MAY BE PARTIAL) AND THEN ANY OTHERS: 16112027Sjungma@eit.uni-kl.de // 16212027Sjungma@eit.uni-kl.de // We may "clobber" upper bits, but they will be written at some point 16312027Sjungma@eit.uni-kl.de // anyway. 16412027Sjungma@eit.uni-kl.de 16512027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 16612027Sjungma@eit.uni-kl.de dst_p[dst_i] = ( dst_p[dst_i] & ~mask ); 16712027Sjungma@eit.uni-kl.de dst_i++; 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0; 17012027Sjungma@eit.uni-kl.de 17112027Sjungma@eit.uni-kl.de return false; 17212027Sjungma@eit.uni-kl.de} 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.debool sc_unsigned::concat_get_data( sc_digit* dst_p, int low_i ) const 17512027Sjungma@eit.uni-kl.de{ 17612027Sjungma@eit.uni-kl.de sc_digit carry; // Carry for negating value. 17712027Sjungma@eit.uni-kl.de int dst_i; // Index to next word to set in dst_p. 17812027Sjungma@eit.uni-kl.de int end_i; // Index of high order word to set. 17912027Sjungma@eit.uni-kl.de int high_i; // Index w/in word of high order bit. 18012027Sjungma@eit.uni-kl.de int left_shift; // Amount to shift value left. 18112027Sjungma@eit.uni-kl.de sc_digit left_word; // High word component for set. 18212027Sjungma@eit.uni-kl.de sc_digit mask; // Mask for partial word sets. 18312027Sjungma@eit.uni-kl.de bool result; // True if inserting non-zero data. 18412027Sjungma@eit.uni-kl.de int right_shift; // Amount to shift value right. 18512027Sjungma@eit.uni-kl.de sc_digit right_word; // Low word component for set. 18612027Sjungma@eit.uni-kl.de int real_bits; // nbits - 1. 18712027Sjungma@eit.uni-kl.de int src_i; // Index to next word to get from digit. 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de // CALCULATE METRICS FOR DATA MOVEMENT: 19112027Sjungma@eit.uni-kl.de 19212027Sjungma@eit.uni-kl.de real_bits = nbits - 1; // Remove that extra sign bit. 19312027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 19412027Sjungma@eit.uni-kl.de high_i = low_i + real_bits - 1; 19512027Sjungma@eit.uni-kl.de end_i = high_i / BITS_PER_DIGIT; 19612027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.de 19912027Sjungma@eit.uni-kl.de switch ( sgn ) 20012027Sjungma@eit.uni-kl.de { 20112027Sjungma@eit.uni-kl.de 20212027Sjungma@eit.uni-kl.de // POSITIVE SOURCE VALUE: 20312027Sjungma@eit.uni-kl.de 20412027Sjungma@eit.uni-kl.de case SC_POS: 20512027Sjungma@eit.uni-kl.de result = true; 20612027Sjungma@eit.uni-kl.de 20712027Sjungma@eit.uni-kl.de // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 20812027Sjungma@eit.uni-kl.de 20912027Sjungma@eit.uni-kl.de if ( dst_i == end_i ) 21012027Sjungma@eit.uni-kl.de { 21112027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 21212027Sjungma@eit.uni-kl.de dst_p[dst_i] = ( ( dst_p[dst_i] & mask ) | 21312027Sjungma@eit.uni-kl.de (digit[0] << left_shift) ) & DIGIT_MASK; 21412027Sjungma@eit.uni-kl.de } 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.de 21712027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de else if ( left_shift == 0 ) 22012027Sjungma@eit.uni-kl.de { 22112027Sjungma@eit.uni-kl.de for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ ) 22212027Sjungma@eit.uni-kl.de { 22312027Sjungma@eit.uni-kl.de dst_p[dst_i] = digit[src_i]; 22412027Sjungma@eit.uni-kl.de } 22512027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 22612027Sjungma@eit.uni-kl.de mask = ~(-2 << high_i) & DIGIT_MASK; 22712027Sjungma@eit.uni-kl.de dst_p[dst_i] = digit[src_i] & mask; 22812027Sjungma@eit.uni-kl.de } 22912027Sjungma@eit.uni-kl.de 23012027Sjungma@eit.uni-kl.de 23112027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 23212027Sjungma@eit.uni-kl.de 23312027Sjungma@eit.uni-kl.de else 23412027Sjungma@eit.uni-kl.de { 23512027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 23612027Sjungma@eit.uni-kl.de right_shift = BITS_PER_DIGIT - left_shift; 23712027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 23812027Sjungma@eit.uni-kl.de right_word = digit[0]; 23912027Sjungma@eit.uni-kl.de dst_p[dst_i] = (dst_p[dst_i] & mask) | 24012027Sjungma@eit.uni-kl.de ((right_word << left_shift) & DIGIT_MASK); 24112027Sjungma@eit.uni-kl.de for ( src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++ ) 24212027Sjungma@eit.uni-kl.de { 24312027Sjungma@eit.uni-kl.de left_word = digit[src_i]; 24412027Sjungma@eit.uni-kl.de dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) | 24512027Sjungma@eit.uni-kl.de (right_word >> right_shift); 24612027Sjungma@eit.uni-kl.de right_word = left_word; 24712027Sjungma@eit.uni-kl.de } 24812027Sjungma@eit.uni-kl.de left_word = (src_i < ndigits) ? digit[src_i] : 0; 24912027Sjungma@eit.uni-kl.de mask = ~(-2 << high_i) & DIGIT_MASK; 25012027Sjungma@eit.uni-kl.de dst_p[dst_i] = ((left_word << left_shift) | 25112027Sjungma@eit.uni-kl.de (right_word >> right_shift)) & mask; 25212027Sjungma@eit.uni-kl.de } 25312027Sjungma@eit.uni-kl.de break; 25412027Sjungma@eit.uni-kl.de 25512027Sjungma@eit.uni-kl.de // SOURCE VALUE IS NEGATIVE: 25612027Sjungma@eit.uni-kl.de 25712027Sjungma@eit.uni-kl.de case SC_NEG: 25812027Sjungma@eit.uni-kl.de 25912027Sjungma@eit.uni-kl.de // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.de result = true; 26212027Sjungma@eit.uni-kl.de if ( dst_i == end_i ) 26312027Sjungma@eit.uni-kl.de { 26412027Sjungma@eit.uni-kl.de mask = ~(-1 << nbits); 26512027Sjungma@eit.uni-kl.de right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask; 26612027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 26712027Sjungma@eit.uni-kl.de dst_p[dst_i] = ( ( dst_p[dst_i] & mask ) | 26812027Sjungma@eit.uni-kl.de (right_word << left_shift) ) & DIGIT_MASK; 26912027Sjungma@eit.uni-kl.de } 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.de 27212027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 27312027Sjungma@eit.uni-kl.de 27412027Sjungma@eit.uni-kl.de else if ( left_shift == 0 ) 27512027Sjungma@eit.uni-kl.de { 27612027Sjungma@eit.uni-kl.de carry = 1; 27712027Sjungma@eit.uni-kl.de for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ ) 27812027Sjungma@eit.uni-kl.de { 27912027Sjungma@eit.uni-kl.de right_word = (digit[src_i] ^ DIGIT_MASK) + carry; 28012027Sjungma@eit.uni-kl.de dst_p[dst_i] = right_word & DIGIT_MASK; 28112027Sjungma@eit.uni-kl.de carry = right_word >> BITS_PER_DIGIT; 28212027Sjungma@eit.uni-kl.de } 28312027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 28412027Sjungma@eit.uni-kl.de mask = (~(-2 << high_i)) & DIGIT_MASK; 28512027Sjungma@eit.uni-kl.de right_word = (src_i < ndigits) ? 28612027Sjungma@eit.uni-kl.de (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry; 28712027Sjungma@eit.uni-kl.de dst_p[dst_i] = right_word & mask; 28812027Sjungma@eit.uni-kl.de } 28912027Sjungma@eit.uni-kl.de 29012027Sjungma@eit.uni-kl.de 29112027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.de else 29412027Sjungma@eit.uni-kl.de { 29512027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 29612027Sjungma@eit.uni-kl.de right_shift = BITS_PER_DIGIT - left_shift; 29712027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 29812027Sjungma@eit.uni-kl.de carry = 1; 29912027Sjungma@eit.uni-kl.de right_word = (digit[0] ^ DIGIT_MASK) + carry; 30012027Sjungma@eit.uni-kl.de dst_p[dst_i] = (dst_p[dst_i] & mask) | 30112027Sjungma@eit.uni-kl.de ((right_word << left_shift) & DIGIT_MASK); 30212027Sjungma@eit.uni-kl.de carry = right_word >> BITS_PER_DIGIT; 30312027Sjungma@eit.uni-kl.de right_word &= DIGIT_MASK; 30412027Sjungma@eit.uni-kl.de for ( src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++ ) 30512027Sjungma@eit.uni-kl.de { 30612027Sjungma@eit.uni-kl.de left_word = (digit[src_i] ^ DIGIT_MASK) + carry; 30712027Sjungma@eit.uni-kl.de dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) | 30812027Sjungma@eit.uni-kl.de (right_word >> right_shift); 30912027Sjungma@eit.uni-kl.de carry = left_word >> BITS_PER_DIGIT; 31012027Sjungma@eit.uni-kl.de right_word = left_word & DIGIT_MASK; 31112027Sjungma@eit.uni-kl.de } 31212027Sjungma@eit.uni-kl.de left_word = (src_i < ndigits) ? 31312027Sjungma@eit.uni-kl.de (digit[src_i] ^ DIGIT_MASK) + carry : carry; 31412027Sjungma@eit.uni-kl.de mask = ~(-2 << high_i) & DIGIT_MASK; 31512027Sjungma@eit.uni-kl.de dst_p[dst_i] = ((left_word << left_shift) | 31612027Sjungma@eit.uni-kl.de (right_word >> right_shift)) & mask; 31712027Sjungma@eit.uni-kl.de } 31812027Sjungma@eit.uni-kl.de break; 31912027Sjungma@eit.uni-kl.de 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.de // VALUE IS ZERO: 32212027Sjungma@eit.uni-kl.de 32312027Sjungma@eit.uni-kl.de default: 32412027Sjungma@eit.uni-kl.de result = false; 32512027Sjungma@eit.uni-kl.de 32612027Sjungma@eit.uni-kl.de // ALL DATA TO BE MOVED IS IN A SINGLE WORD: 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.de if ( dst_i == end_i ) 32912027Sjungma@eit.uni-kl.de { 33012027Sjungma@eit.uni-kl.de mask = ~(-1 << real_bits) << left_shift; 33112027Sjungma@eit.uni-kl.de dst_p[dst_i] = dst_p[dst_i] & ~mask; 33212027Sjungma@eit.uni-kl.de } 33312027Sjungma@eit.uni-kl.de 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED: 33612027Sjungma@eit.uni-kl.de 33712027Sjungma@eit.uni-kl.de else if ( left_shift == 0 ) 33812027Sjungma@eit.uni-kl.de { 33912027Sjungma@eit.uni-kl.de for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ ) 34012027Sjungma@eit.uni-kl.de { 34112027Sjungma@eit.uni-kl.de dst_p[dst_i] = 0; 34212027Sjungma@eit.uni-kl.de } 34312027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 34412027Sjungma@eit.uni-kl.de mask = ~(-2 << high_i) & DIGIT_MASK; 34512027Sjungma@eit.uni-kl.de dst_p[dst_i] = 0; 34612027Sjungma@eit.uni-kl.de } 34712027Sjungma@eit.uni-kl.de 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.de // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED: 35012027Sjungma@eit.uni-kl.de 35112027Sjungma@eit.uni-kl.de else 35212027Sjungma@eit.uni-kl.de { 35312027Sjungma@eit.uni-kl.de high_i = high_i % BITS_PER_DIGIT; 35412027Sjungma@eit.uni-kl.de right_shift = BITS_PER_DIGIT - left_shift; 35512027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 35612027Sjungma@eit.uni-kl.de dst_p[dst_i] = (dst_p[dst_i] & mask); 35712027Sjungma@eit.uni-kl.de for ( dst_i++; dst_i <= end_i; dst_i++ ) 35812027Sjungma@eit.uni-kl.de { 35912027Sjungma@eit.uni-kl.de dst_p[dst_i] = 0; 36012027Sjungma@eit.uni-kl.de } 36112027Sjungma@eit.uni-kl.de } 36212027Sjungma@eit.uni-kl.de break; 36312027Sjungma@eit.uni-kl.de } 36412027Sjungma@eit.uni-kl.de return result; 36512027Sjungma@eit.uni-kl.de} 36612027Sjungma@eit.uni-kl.de 36712027Sjungma@eit.uni-kl.de// Return this object instance's bits as a uint64 without sign extension. 36812027Sjungma@eit.uni-kl.de 36912027Sjungma@eit.uni-kl.deuint64 sc_unsigned::concat_get_uint64() const 37012027Sjungma@eit.uni-kl.de{ 37112027Sjungma@eit.uni-kl.de uint64 result; 37212027Sjungma@eit.uni-kl.de 37312027Sjungma@eit.uni-kl.de switch ( sgn ) 37412027Sjungma@eit.uni-kl.de { 37512027Sjungma@eit.uni-kl.de case SC_POS: 37612027Sjungma@eit.uni-kl.de result = 0; 37712027Sjungma@eit.uni-kl.de if ( ndigits > 2 ) 37812027Sjungma@eit.uni-kl.de result = digit[2]; 37912027Sjungma@eit.uni-kl.de if ( ndigits > 1 ) 38012027Sjungma@eit.uni-kl.de result = (result << BITS_PER_DIGIT) | digit[1]; 38112027Sjungma@eit.uni-kl.de result = (result << BITS_PER_DIGIT) | digit[0]; 38212027Sjungma@eit.uni-kl.de break; 38312027Sjungma@eit.uni-kl.de default: 38412027Sjungma@eit.uni-kl.de result = 0; 38512027Sjungma@eit.uni-kl.de break; 38612027Sjungma@eit.uni-kl.de } 38712027Sjungma@eit.uni-kl.de return result; 38812027Sjungma@eit.uni-kl.de} 38912027Sjungma@eit.uni-kl.de 39012027Sjungma@eit.uni-kl.de// #### OPTIMIZE 39112027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(int64 src, int low_i) 39212027Sjungma@eit.uni-kl.de{ 39312027Sjungma@eit.uni-kl.de *this = (low_i < 64) ? src >> low_i : src >> 63; 39412027Sjungma@eit.uni-kl.de} 39512027Sjungma@eit.uni-kl.de 39612027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(const sc_signed& src, int low_i) 39712027Sjungma@eit.uni-kl.de{ 39812027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 39912027Sjungma@eit.uni-kl.de *this = src >> low_i; 40012027Sjungma@eit.uni-kl.de else 40112027Sjungma@eit.uni-kl.de *this = (src<0) ? (int_type)-1 : 0; 40212027Sjungma@eit.uni-kl.de} 40312027Sjungma@eit.uni-kl.de 40412027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(const sc_unsigned& src, int low_i) 40512027Sjungma@eit.uni-kl.de{ 40612027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 40712027Sjungma@eit.uni-kl.de *this = src >> low_i; 40812027Sjungma@eit.uni-kl.de else 40912027Sjungma@eit.uni-kl.de *this = 0; 41012027Sjungma@eit.uni-kl.de} 41112027Sjungma@eit.uni-kl.de 41212027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(uint64 src, int low_i) 41312027Sjungma@eit.uni-kl.de{ 41412027Sjungma@eit.uni-kl.de *this = (low_i < 64) ? src >> low_i : 0; 41512027Sjungma@eit.uni-kl.de} 41612027Sjungma@eit.uni-kl.de 41712027Sjungma@eit.uni-kl.de 41812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 41912027Sjungma@eit.uni-kl.de// SECTION: Public members - Reduction methods. 42012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 42112027Sjungma@eit.uni-kl.de 42212027Sjungma@eit.uni-kl.debool sc_unsigned::and_reduce() const 42312027Sjungma@eit.uni-kl.de{ 42412027Sjungma@eit.uni-kl.de int i; // Digit examining. 42512027Sjungma@eit.uni-kl.de 42612027Sjungma@eit.uni-kl.de if ( sgn == SC_ZERO ) return false; 42712027Sjungma@eit.uni-kl.de for ( i = 0; i < ndigits-1; i++ ) 42812027Sjungma@eit.uni-kl.de if ( (digit[i] & DIGIT_MASK) != DIGIT_MASK ) return false; 42912027Sjungma@eit.uni-kl.de if ( (digit[i] & ~(-1 << ((nbits-1) % BITS_PER_DIGIT))) == 43012027Sjungma@eit.uni-kl.de (sc_digit)~(-1 << ((nbits-1) % BITS_PER_DIGIT))) 43112027Sjungma@eit.uni-kl.de return true; 43212027Sjungma@eit.uni-kl.de return false; 43312027Sjungma@eit.uni-kl.de} 43412027Sjungma@eit.uni-kl.de 43512027Sjungma@eit.uni-kl.debool sc_unsigned::or_reduce() const 43612027Sjungma@eit.uni-kl.de{ 43712027Sjungma@eit.uni-kl.de return ( sgn == SC_ZERO ) ? false : true; 43812027Sjungma@eit.uni-kl.de} 43912027Sjungma@eit.uni-kl.de 44012027Sjungma@eit.uni-kl.debool sc_unsigned::xor_reduce() const 44112027Sjungma@eit.uni-kl.de{ 44212027Sjungma@eit.uni-kl.de int i; // Digit examining. 44312027Sjungma@eit.uni-kl.de int odd; // Flag for odd number of digits. 44412027Sjungma@eit.uni-kl.de 44512027Sjungma@eit.uni-kl.de odd = 0; 44612027Sjungma@eit.uni-kl.de for ( i = 0; i < nbits-1; i++ ) 44712027Sjungma@eit.uni-kl.de if ( test(i) ) odd = ~odd; 44812027Sjungma@eit.uni-kl.de return odd ? true : false; 44912027Sjungma@eit.uni-kl.de} 45012027Sjungma@eit.uni-kl.de 45112027Sjungma@eit.uni-kl.de 45212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 45312027Sjungma@eit.uni-kl.de// SECTION: Public members - Assignment operators. 45412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 45512027Sjungma@eit.uni-kl.de 45612027Sjungma@eit.uni-kl.de// assignment operators 45712027Sjungma@eit.uni-kl.de 45812027Sjungma@eit.uni-kl.deconst sc_unsigned& 45912027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const char* a ) 46012027Sjungma@eit.uni-kl.de{ 46112027Sjungma@eit.uni-kl.de if( a == 0 ) { 46212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, 46312027Sjungma@eit.uni-kl.de "character string is zero" ); 46412027Sjungma@eit.uni-kl.de } 46512027Sjungma@eit.uni-kl.de if( *a == 0 ) { 46612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, 46712027Sjungma@eit.uni-kl.de "character string is empty" ); 46812027Sjungma@eit.uni-kl.de } 46912027Sjungma@eit.uni-kl.de try { 47012027Sjungma@eit.uni-kl.de int len = length(); 47112027Sjungma@eit.uni-kl.de sc_ufix aa( a, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 47212027Sjungma@eit.uni-kl.de return this->operator = ( aa ); 47312027Sjungma@eit.uni-kl.de } catch( sc_core::sc_report ) { 47412027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 47512027Sjungma@eit.uni-kl.de std::sprintf( msg, "character string '%s' is not valid", a ); 47612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, msg ); 47712027Sjungma@eit.uni-kl.de // never reached 47812027Sjungma@eit.uni-kl.de } 47912027Sjungma@eit.uni-kl.de return *this; 48012027Sjungma@eit.uni-kl.de} 48112027Sjungma@eit.uni-kl.de 48212027Sjungma@eit.uni-kl.deconst sc_unsigned& 48312027Sjungma@eit.uni-kl.desc_unsigned::operator=(int64 v) 48412027Sjungma@eit.uni-kl.de{ 48512027Sjungma@eit.uni-kl.de sgn = get_sign(v); 48612027Sjungma@eit.uni-kl.de if ( sgn == SC_ZERO ) { 48712027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 48812027Sjungma@eit.uni-kl.de } 48912027Sjungma@eit.uni-kl.de else { 49012027Sjungma@eit.uni-kl.de from_uint(ndigits, digit, (uint64) v); 49112027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 49212027Sjungma@eit.uni-kl.de } 49312027Sjungma@eit.uni-kl.de return *this; 49412027Sjungma@eit.uni-kl.de} 49512027Sjungma@eit.uni-kl.de 49612027Sjungma@eit.uni-kl.deconst sc_unsigned& 49712027Sjungma@eit.uni-kl.desc_unsigned::operator=(uint64 v) 49812027Sjungma@eit.uni-kl.de{ 49912027Sjungma@eit.uni-kl.de if (v == 0) { 50012027Sjungma@eit.uni-kl.de sgn = SC_ZERO; 50112027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 50212027Sjungma@eit.uni-kl.de } 50312027Sjungma@eit.uni-kl.de else { 50412027Sjungma@eit.uni-kl.de sgn = SC_POS; 50512027Sjungma@eit.uni-kl.de from_uint(ndigits, digit, v); 50612027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 50712027Sjungma@eit.uni-kl.de } 50812027Sjungma@eit.uni-kl.de return *this; 50912027Sjungma@eit.uni-kl.de} 51012027Sjungma@eit.uni-kl.de 51112027Sjungma@eit.uni-kl.deconst sc_unsigned& 51212027Sjungma@eit.uni-kl.desc_unsigned::operator=(long v) 51312027Sjungma@eit.uni-kl.de{ 51412027Sjungma@eit.uni-kl.de sgn = get_sign(v); 51512027Sjungma@eit.uni-kl.de if ( sgn == SC_ZERO ) { 51612027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 51712027Sjungma@eit.uni-kl.de } 51812027Sjungma@eit.uni-kl.de else { 51912027Sjungma@eit.uni-kl.de from_uint(ndigits, digit, (unsigned long) v); 52012027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 52112027Sjungma@eit.uni-kl.de } 52212027Sjungma@eit.uni-kl.de return *this; 52312027Sjungma@eit.uni-kl.de} 52412027Sjungma@eit.uni-kl.de 52512027Sjungma@eit.uni-kl.deconst sc_unsigned& 52612027Sjungma@eit.uni-kl.desc_unsigned::operator=(unsigned long v) 52712027Sjungma@eit.uni-kl.de{ 52812027Sjungma@eit.uni-kl.de if (v == 0) { 52912027Sjungma@eit.uni-kl.de sgn = SC_ZERO; 53012027Sjungma@eit.uni-kl.de vec_zero(ndigits, digit); 53112027Sjungma@eit.uni-kl.de } 53212027Sjungma@eit.uni-kl.de else { 53312027Sjungma@eit.uni-kl.de sgn = SC_POS; 53412027Sjungma@eit.uni-kl.de from_uint(ndigits, digit, v); 53512027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 53612027Sjungma@eit.uni-kl.de } 53712027Sjungma@eit.uni-kl.de return *this; 53812027Sjungma@eit.uni-kl.de} 53912027Sjungma@eit.uni-kl.de 54012027Sjungma@eit.uni-kl.deconst sc_unsigned& 54112027Sjungma@eit.uni-kl.desc_unsigned::operator=(double v) 54212027Sjungma@eit.uni-kl.de{ 54312027Sjungma@eit.uni-kl.de is_bad_double(v); 54412027Sjungma@eit.uni-kl.de sgn = SC_POS; 54512027Sjungma@eit.uni-kl.de int i = 0; 54612027Sjungma@eit.uni-kl.de while (floor(v) && (i < ndigits)) { 54712027Sjungma@eit.uni-kl.de#ifndef _WIN32 54812027Sjungma@eit.uni-kl.de digit[i++] = ((sc_digit)floor(remainder(v, DIGIT_RADIX))) & DIGIT_MASK; 54912027Sjungma@eit.uni-kl.de#else 55012027Sjungma@eit.uni-kl.de digit[i++] = ((sc_digit)floor(fmod(v, DIGIT_RADIX))) & DIGIT_MASK; 55112027Sjungma@eit.uni-kl.de#endif 55212027Sjungma@eit.uni-kl.de v /= DIGIT_RADIX; 55312027Sjungma@eit.uni-kl.de } 55412027Sjungma@eit.uni-kl.de vec_zero(i, ndigits, digit); 55512027Sjungma@eit.uni-kl.de convert_SM_to_2C_to_SM(); 55612027Sjungma@eit.uni-kl.de return *this; 55712027Sjungma@eit.uni-kl.de} 55812027Sjungma@eit.uni-kl.de 55912027Sjungma@eit.uni-kl.de 56012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 56112027Sjungma@eit.uni-kl.de 56212027Sjungma@eit.uni-kl.deconst sc_unsigned& 56312027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const sc_bv_base& v ) 56412027Sjungma@eit.uni-kl.de{ 56512027Sjungma@eit.uni-kl.de int minlen = sc_min( nbits, v.length() ); 56612027Sjungma@eit.uni-kl.de int i = 0; 56712027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 56812027Sjungma@eit.uni-kl.de safe_set( i, v.get_bit( i ), digit ); 56912027Sjungma@eit.uni-kl.de } 57012027Sjungma@eit.uni-kl.de for( ; i < nbits; ++ i ) { 57112027Sjungma@eit.uni-kl.de safe_set( i, 0, digit ); // zero-extend 57212027Sjungma@eit.uni-kl.de } 57312027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 57412027Sjungma@eit.uni-kl.de return *this; 57512027Sjungma@eit.uni-kl.de} 57612027Sjungma@eit.uni-kl.de 57712027Sjungma@eit.uni-kl.deconst sc_unsigned& 57812027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const sc_lv_base& v ) 57912027Sjungma@eit.uni-kl.de{ 58012027Sjungma@eit.uni-kl.de int minlen = sc_min( nbits, v.length() ); 58112027Sjungma@eit.uni-kl.de int i = 0; 58212027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 58312027Sjungma@eit.uni-kl.de safe_set( i, sc_logic( v.get_bit( i ) ).to_bool(), digit ); 58412027Sjungma@eit.uni-kl.de } 58512027Sjungma@eit.uni-kl.de for( ; i < nbits; ++ i ) { 58612027Sjungma@eit.uni-kl.de safe_set( i, 0, digit ); // zero-extend 58712027Sjungma@eit.uni-kl.de } 58812027Sjungma@eit.uni-kl.de convert_2C_to_SM(); 58912027Sjungma@eit.uni-kl.de return *this; 59012027Sjungma@eit.uni-kl.de} 59112027Sjungma@eit.uni-kl.de 59212027Sjungma@eit.uni-kl.de 59312027Sjungma@eit.uni-kl.de// explicit conversion to character string 59412027Sjungma@eit.uni-kl.de 59512027Sjungma@eit.uni-kl.deconst std::string 59612027Sjungma@eit.uni-kl.desc_unsigned::to_string( sc_numrep numrep ) const 59712027Sjungma@eit.uni-kl.de{ 59812027Sjungma@eit.uni-kl.de int len = length(); 59912027Sjungma@eit.uni-kl.de sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 60012027Sjungma@eit.uni-kl.de return aa.to_string( numrep ); 60112027Sjungma@eit.uni-kl.de} 60212027Sjungma@eit.uni-kl.de 60312027Sjungma@eit.uni-kl.deconst std::string 60412027Sjungma@eit.uni-kl.desc_unsigned::to_string( sc_numrep numrep, bool w_prefix ) const 60512027Sjungma@eit.uni-kl.de{ 60612027Sjungma@eit.uni-kl.de int len = length(); 60712027Sjungma@eit.uni-kl.de sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 60812027Sjungma@eit.uni-kl.de return aa.to_string( numrep, w_prefix ); 60912027Sjungma@eit.uni-kl.de} 61012027Sjungma@eit.uni-kl.de 61112027Sjungma@eit.uni-kl.de 61212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 61312027Sjungma@eit.uni-kl.de// SECTION: Interfacing with sc_int_base 61412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 61512027Sjungma@eit.uni-kl.de 61612027Sjungma@eit.uni-kl.deconst sc_unsigned& 61712027Sjungma@eit.uni-kl.desc_unsigned::operator= (const sc_int_base& v) 61812027Sjungma@eit.uni-kl.de{ return operator=((int64) v); } 61912027Sjungma@eit.uni-kl.de 62012027Sjungma@eit.uni-kl.deconst sc_unsigned& 62112027Sjungma@eit.uni-kl.desc_unsigned::operator+=(const sc_int_base& v) 62212027Sjungma@eit.uni-kl.de{ return operator+=((int64) v); } 62312027Sjungma@eit.uni-kl.de 62412027Sjungma@eit.uni-kl.deconst sc_unsigned& 62512027Sjungma@eit.uni-kl.desc_unsigned::operator-=(const sc_int_base& v) 62612027Sjungma@eit.uni-kl.de{ return operator-=((int64) v); } 62712027Sjungma@eit.uni-kl.de 62812027Sjungma@eit.uni-kl.deconst sc_unsigned& 62912027Sjungma@eit.uni-kl.desc_unsigned::operator*=(const sc_int_base& v) 63012027Sjungma@eit.uni-kl.de{ return operator*=((int64) v); } 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.deconst sc_unsigned& 63312027Sjungma@eit.uni-kl.desc_unsigned::operator/=(const sc_int_base& v) 63412027Sjungma@eit.uni-kl.de{ return operator/=((int64) v); } 63512027Sjungma@eit.uni-kl.de 63612027Sjungma@eit.uni-kl.deconst sc_unsigned& 63712027Sjungma@eit.uni-kl.desc_unsigned::operator%=(const sc_int_base& v) 63812027Sjungma@eit.uni-kl.de{ return operator%=((int64) v); } 63912027Sjungma@eit.uni-kl.de 64012027Sjungma@eit.uni-kl.deconst sc_unsigned& 64112027Sjungma@eit.uni-kl.desc_unsigned::operator&=(const sc_int_base& v) 64212027Sjungma@eit.uni-kl.de{ return operator&=((int64) v); } 64312027Sjungma@eit.uni-kl.de 64412027Sjungma@eit.uni-kl.deconst sc_unsigned& 64512027Sjungma@eit.uni-kl.desc_unsigned::operator|=(const sc_int_base& v) 64612027Sjungma@eit.uni-kl.de{ return operator|=((int64) v); } 64712027Sjungma@eit.uni-kl.de 64812027Sjungma@eit.uni-kl.deconst sc_unsigned& 64912027Sjungma@eit.uni-kl.desc_unsigned::operator^=(const sc_int_base& v) 65012027Sjungma@eit.uni-kl.de{ return operator^=((int64) v); } 65112027Sjungma@eit.uni-kl.de 65212027Sjungma@eit.uni-kl.desc_unsigned 65312027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_int_base& v) 65412027Sjungma@eit.uni-kl.de{ return operator<<(u, (int64) v); } 65512027Sjungma@eit.uni-kl.deconst sc_unsigned& 65612027Sjungma@eit.uni-kl.desc_unsigned::operator<<=(const sc_int_base& v) 65712027Sjungma@eit.uni-kl.de{ return operator<<=((int64) v); } 65812027Sjungma@eit.uni-kl.de 65912027Sjungma@eit.uni-kl.desc_unsigned 66012027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned& u, const sc_int_base& v) 66112027Sjungma@eit.uni-kl.de{ return operator>>(u, (int64) v); } 66212027Sjungma@eit.uni-kl.deconst sc_unsigned& 66312027Sjungma@eit.uni-kl.desc_unsigned::operator>>=(const sc_int_base& v) 66412027Sjungma@eit.uni-kl.de{ return operator>>=((int64) v); } 66512027Sjungma@eit.uni-kl.de 66612027Sjungma@eit.uni-kl.debool 66712027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_int_base& v) 66812027Sjungma@eit.uni-kl.de{ return operator==(u, (int64) v); } 66912027Sjungma@eit.uni-kl.debool 67012027Sjungma@eit.uni-kl.deoperator==(const sc_int_base& u, const sc_unsigned& v) 67112027Sjungma@eit.uni-kl.de{ return operator==((int64) u, v); } 67212027Sjungma@eit.uni-kl.de 67312027Sjungma@eit.uni-kl.debool 67412027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_int_base& v) 67512027Sjungma@eit.uni-kl.de{ return operator!=(u, (int64) v); } 67612027Sjungma@eit.uni-kl.debool 67712027Sjungma@eit.uni-kl.deoperator!=(const sc_int_base& u, const sc_unsigned& v) 67812027Sjungma@eit.uni-kl.de{ return operator!=((int64) u, v); } 67912027Sjungma@eit.uni-kl.de 68012027Sjungma@eit.uni-kl.debool 68112027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_int_base& v) 68212027Sjungma@eit.uni-kl.de{ return operator<(u, (int64) v); } 68312027Sjungma@eit.uni-kl.debool 68412027Sjungma@eit.uni-kl.deoperator<(const sc_int_base& u, const sc_unsigned& v) 68512027Sjungma@eit.uni-kl.de{ return operator<((int64) u, v); } 68612027Sjungma@eit.uni-kl.de 68712027Sjungma@eit.uni-kl.debool 68812027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_int_base& v) 68912027Sjungma@eit.uni-kl.de{ return operator<=(u, (int64) v); } 69012027Sjungma@eit.uni-kl.debool 69112027Sjungma@eit.uni-kl.deoperator<=(const sc_int_base& u, const sc_unsigned& v) 69212027Sjungma@eit.uni-kl.de{ return operator<=((int64) u, v); } 69312027Sjungma@eit.uni-kl.de 69412027Sjungma@eit.uni-kl.debool 69512027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_int_base& v) 69612027Sjungma@eit.uni-kl.de{ return operator>(u, (int64) v); } 69712027Sjungma@eit.uni-kl.debool 69812027Sjungma@eit.uni-kl.deoperator>(const sc_int_base& u, const sc_unsigned& v) 69912027Sjungma@eit.uni-kl.de{ return operator>((int64) u, v); } 70012027Sjungma@eit.uni-kl.de 70112027Sjungma@eit.uni-kl.debool 70212027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_int_base& v) 70312027Sjungma@eit.uni-kl.de{ return operator>=(u, (int64) v); } 70412027Sjungma@eit.uni-kl.debool 70512027Sjungma@eit.uni-kl.deoperator>=(const sc_int_base& u, const sc_unsigned& v) 70612027Sjungma@eit.uni-kl.de{ return operator>=((int64) u, v); } 70712027Sjungma@eit.uni-kl.de 70812027Sjungma@eit.uni-kl.de 70912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 71012027Sjungma@eit.uni-kl.de// SECTION: Interfacing with sc_uint_base 71112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 71212027Sjungma@eit.uni-kl.de 71312027Sjungma@eit.uni-kl.deconst sc_unsigned& 71412027Sjungma@eit.uni-kl.desc_unsigned::operator= (const sc_uint_base& v) 71512027Sjungma@eit.uni-kl.de{ return operator=((uint64) v); } 71612027Sjungma@eit.uni-kl.de 71712027Sjungma@eit.uni-kl.desc_unsigned 71812027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u, const sc_uint_base& v) 71912027Sjungma@eit.uni-kl.de{ return operator+(u, (uint64) v); } 72012027Sjungma@eit.uni-kl.desc_unsigned 72112027Sjungma@eit.uni-kl.deoperator+(const sc_uint_base& u, const sc_unsigned& v) 72212027Sjungma@eit.uni-kl.de{ return operator+((uint64) u, v); } 72312027Sjungma@eit.uni-kl.deconst sc_unsigned& 72412027Sjungma@eit.uni-kl.desc_unsigned::operator+=(const sc_uint_base& v) 72512027Sjungma@eit.uni-kl.de{ return operator+=((uint64) v); } 72612027Sjungma@eit.uni-kl.de 72712027Sjungma@eit.uni-kl.deconst sc_unsigned& 72812027Sjungma@eit.uni-kl.desc_unsigned::operator-=(const sc_uint_base& v) 72912027Sjungma@eit.uni-kl.de{ return operator-=((uint64) v); } 73012027Sjungma@eit.uni-kl.de 73112027Sjungma@eit.uni-kl.desc_unsigned 73212027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, const sc_uint_base& v) 73312027Sjungma@eit.uni-kl.de{ return operator*(u, (uint64) v); } 73412027Sjungma@eit.uni-kl.desc_unsigned 73512027Sjungma@eit.uni-kl.deoperator*(const sc_uint_base& u, const sc_unsigned& v) 73612027Sjungma@eit.uni-kl.de{ return operator*((uint64) u, v); } 73712027Sjungma@eit.uni-kl.deconst sc_unsigned& 73812027Sjungma@eit.uni-kl.desc_unsigned::operator*=(const sc_uint_base& v) 73912027Sjungma@eit.uni-kl.de{ return operator*=((uint64) v); } 74012027Sjungma@eit.uni-kl.de 74112027Sjungma@eit.uni-kl.desc_unsigned 74212027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, const sc_uint_base& v) 74312027Sjungma@eit.uni-kl.de{ return operator/(u, (uint64) v); } 74412027Sjungma@eit.uni-kl.desc_unsigned 74512027Sjungma@eit.uni-kl.deoperator/(const sc_uint_base& u, const sc_unsigned& v) 74612027Sjungma@eit.uni-kl.de{ return operator/((uint64) u, v); } 74712027Sjungma@eit.uni-kl.deconst sc_unsigned& 74812027Sjungma@eit.uni-kl.desc_unsigned::operator/=(const sc_uint_base& v) 74912027Sjungma@eit.uni-kl.de{ return operator/=((uint64) v); } 75012027Sjungma@eit.uni-kl.de 75112027Sjungma@eit.uni-kl.desc_unsigned 75212027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, const sc_uint_base& v) 75312027Sjungma@eit.uni-kl.de{ return operator%(u, (uint64) v); } 75412027Sjungma@eit.uni-kl.desc_unsigned 75512027Sjungma@eit.uni-kl.deoperator%(const sc_uint_base& u, const sc_unsigned& v) 75612027Sjungma@eit.uni-kl.de{ return operator%((uint64) u, v); } 75712027Sjungma@eit.uni-kl.deconst sc_unsigned& 75812027Sjungma@eit.uni-kl.desc_unsigned::operator%=(const sc_uint_base& v) 75912027Sjungma@eit.uni-kl.de{ return operator%=((uint64) v); } 76012027Sjungma@eit.uni-kl.de 76112027Sjungma@eit.uni-kl.desc_unsigned 76212027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, const sc_uint_base& v) 76312027Sjungma@eit.uni-kl.de{ return operator&(u, (uint64) v); } 76412027Sjungma@eit.uni-kl.desc_unsigned 76512027Sjungma@eit.uni-kl.deoperator&(const sc_uint_base& u, const sc_unsigned& v) 76612027Sjungma@eit.uni-kl.de{ return operator&((uint64) u, v); } 76712027Sjungma@eit.uni-kl.deconst sc_unsigned& 76812027Sjungma@eit.uni-kl.desc_unsigned::operator&=(const sc_uint_base& v) 76912027Sjungma@eit.uni-kl.de{ return operator&=((uint64) v); } 77012027Sjungma@eit.uni-kl.de 77112027Sjungma@eit.uni-kl.desc_unsigned 77212027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, const sc_uint_base& v) 77312027Sjungma@eit.uni-kl.de{ return operator|(u, (uint64) v); } 77412027Sjungma@eit.uni-kl.desc_unsigned 77512027Sjungma@eit.uni-kl.deoperator|(const sc_uint_base& u, const sc_unsigned& v) 77612027Sjungma@eit.uni-kl.de{ return operator|((uint64) u, v); } 77712027Sjungma@eit.uni-kl.deconst sc_unsigned& 77812027Sjungma@eit.uni-kl.desc_unsigned::operator|=(const sc_uint_base& v) 77912027Sjungma@eit.uni-kl.de{ return operator|=((uint64) v); } 78012027Sjungma@eit.uni-kl.de 78112027Sjungma@eit.uni-kl.desc_unsigned 78212027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, const sc_uint_base& v) 78312027Sjungma@eit.uni-kl.de{ return operator^(u, (uint64) v); } 78412027Sjungma@eit.uni-kl.desc_unsigned 78512027Sjungma@eit.uni-kl.deoperator^(const sc_uint_base& u, const sc_unsigned& v) 78612027Sjungma@eit.uni-kl.de{ return operator^((uint64) u, v); } 78712027Sjungma@eit.uni-kl.deconst sc_unsigned& 78812027Sjungma@eit.uni-kl.desc_unsigned::operator^=(const sc_uint_base& v) 78912027Sjungma@eit.uni-kl.de{ return operator^=((uint64) v); } 79012027Sjungma@eit.uni-kl.de 79112027Sjungma@eit.uni-kl.desc_unsigned 79212027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_uint_base& v) 79312027Sjungma@eit.uni-kl.de{ return operator<<(u, (uint64) v); } 79412027Sjungma@eit.uni-kl.deconst sc_unsigned& 79512027Sjungma@eit.uni-kl.desc_unsigned::operator<<=(const sc_uint_base& v) 79612027Sjungma@eit.uni-kl.de{ return operator<<=((uint64) v); } 79712027Sjungma@eit.uni-kl.de 79812027Sjungma@eit.uni-kl.desc_unsigned 79912027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned& u, const sc_uint_base& v) 80012027Sjungma@eit.uni-kl.de{ return operator>>(u, (uint64) v); } 80112027Sjungma@eit.uni-kl.deconst sc_unsigned& 80212027Sjungma@eit.uni-kl.desc_unsigned::operator>>=(const sc_uint_base& v) 80312027Sjungma@eit.uni-kl.de{ return operator>>=((uint64) v); } 80412027Sjungma@eit.uni-kl.de 80512027Sjungma@eit.uni-kl.debool 80612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_uint_base& v) 80712027Sjungma@eit.uni-kl.de{ return operator==(u, (uint64) v); } 80812027Sjungma@eit.uni-kl.debool 80912027Sjungma@eit.uni-kl.deoperator==(const sc_uint_base& u, const sc_unsigned& v) 81012027Sjungma@eit.uni-kl.de{ return operator==((uint64) u, v); } 81112027Sjungma@eit.uni-kl.de 81212027Sjungma@eit.uni-kl.debool 81312027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_uint_base& v) 81412027Sjungma@eit.uni-kl.de{ return operator!=(u, (uint64) v); } 81512027Sjungma@eit.uni-kl.debool 81612027Sjungma@eit.uni-kl.deoperator!=(const sc_uint_base& u, const sc_unsigned& v) 81712027Sjungma@eit.uni-kl.de{ return operator!=((uint64) u, v); } 81812027Sjungma@eit.uni-kl.de 81912027Sjungma@eit.uni-kl.debool 82012027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_uint_base& v) 82112027Sjungma@eit.uni-kl.de{ return operator<(u, (uint64) v); } 82212027Sjungma@eit.uni-kl.debool 82312027Sjungma@eit.uni-kl.deoperator<(const sc_uint_base& u, const sc_unsigned& v) 82412027Sjungma@eit.uni-kl.de{ return operator<((uint64) u, v); } 82512027Sjungma@eit.uni-kl.de 82612027Sjungma@eit.uni-kl.debool 82712027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_uint_base& v) 82812027Sjungma@eit.uni-kl.de{ return operator<=(u, (uint64) v); } 82912027Sjungma@eit.uni-kl.debool 83012027Sjungma@eit.uni-kl.deoperator<=(const sc_uint_base& u, const sc_unsigned& v) 83112027Sjungma@eit.uni-kl.de{ return operator<=((uint64) u, v); } 83212027Sjungma@eit.uni-kl.de 83312027Sjungma@eit.uni-kl.debool 83412027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_uint_base& v) 83512027Sjungma@eit.uni-kl.de{ return operator>(u, (uint64) v); } 83612027Sjungma@eit.uni-kl.debool 83712027Sjungma@eit.uni-kl.deoperator>(const sc_uint_base& u, const sc_unsigned& v) 83812027Sjungma@eit.uni-kl.de{ return operator>((uint64) u, v); } 83912027Sjungma@eit.uni-kl.de 84012027Sjungma@eit.uni-kl.debool 84112027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_uint_base& v) 84212027Sjungma@eit.uni-kl.de{ return operator>=(u, (uint64) v); } 84312027Sjungma@eit.uni-kl.debool 84412027Sjungma@eit.uni-kl.deoperator>=(const sc_uint_base& u, const sc_unsigned& v) 84512027Sjungma@eit.uni-kl.de{ return operator>=((uint64) u, v); } 84612027Sjungma@eit.uni-kl.de 84712027Sjungma@eit.uni-kl.de 84812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 84912027Sjungma@eit.uni-kl.de// SECTION: Input and output operators 85012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 85112027Sjungma@eit.uni-kl.de 85212027Sjungma@eit.uni-kl.de// The operators in this section are included from sc_nbcommon.cpp. 85312027Sjungma@eit.uni-kl.de 85412027Sjungma@eit.uni-kl.de 85512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 85612027Sjungma@eit.uni-kl.de// SECTION: Operator macros. 85712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 85812027Sjungma@eit.uni-kl.de 85912027Sjungma@eit.uni-kl.de#define CONVERT_LONG(u) \ 86012027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u); \ 86112027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_ULONG]; \ 86212027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); 86312027Sjungma@eit.uni-kl.de 86412027Sjungma@eit.uni-kl.de#define CONVERT_LONG_2(u) \ 86512027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_ULONG]; \ 86612027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); 86712027Sjungma@eit.uni-kl.de 86812027Sjungma@eit.uni-kl.de#define CONVERT_INT(u) \ 86912027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u); \ 87012027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT]; \ 87112027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); 87212027Sjungma@eit.uni-kl.de 87312027Sjungma@eit.uni-kl.de#define CONVERT_INT_2(u) \ 87412027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT]; \ 87512027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); 87612027Sjungma@eit.uni-kl.de 87712027Sjungma@eit.uni-kl.de#define CONVERT_INT64(u) \ 87812027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u); \ 87912027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT64]; \ 88012027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); 88112027Sjungma@eit.uni-kl.de 88212027Sjungma@eit.uni-kl.de#define CONVERT_INT64_2(u) \ 88312027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT64]; \ 88412027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); 88512027Sjungma@eit.uni-kl.de 88612027Sjungma@eit.uni-kl.de 88712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 88812027Sjungma@eit.uni-kl.de// SECTION: PLUS operators: +, +=, ++ 88912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 89012027Sjungma@eit.uni-kl.de 89112027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v: 89212027Sjungma@eit.uni-kl.de// 1. 0 + v = v 89312027Sjungma@eit.uni-kl.de// 2. u + 0 = u 89412027Sjungma@eit.uni-kl.de// 3. if sgn(u) == sgn(v) 89512027Sjungma@eit.uni-kl.de// 3.1 u + v = +(u + v) = sgn(u) * (u + v) 89612027Sjungma@eit.uni-kl.de// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v) 89712027Sjungma@eit.uni-kl.de// 4. if sgn(u) != sgn(v) 89812027Sjungma@eit.uni-kl.de// 4.1 u + (-v) = u - v = sgn(u) * (u - v) 89912027Sjungma@eit.uni-kl.de// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v) 90012027Sjungma@eit.uni-kl.de// 90112027Sjungma@eit.uni-kl.de// Specialization of above cases for computing ++u or u++: 90212027Sjungma@eit.uni-kl.de// 1. 0 + 1 = 1 90312027Sjungma@eit.uni-kl.de// 3. u + 1 = u + 1 = sgn(u) * (u + 1) 90412027Sjungma@eit.uni-kl.de// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1) 90512027Sjungma@eit.uni-kl.de 90612027Sjungma@eit.uni-kl.desc_unsigned 90712027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u, const sc_unsigned& v) 90812027Sjungma@eit.uni-kl.de{ 90912027Sjungma@eit.uni-kl.de 91012027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 1 91112027Sjungma@eit.uni-kl.de return sc_unsigned(v); 91212027Sjungma@eit.uni-kl.de 91312027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 2 91412027Sjungma@eit.uni-kl.de return sc_unsigned(u); 91512027Sjungma@eit.uni-kl.de 91612027Sjungma@eit.uni-kl.de // cases 3 and 4 91712027Sjungma@eit.uni-kl.de return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 91812027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 91912027Sjungma@eit.uni-kl.de 92012027Sjungma@eit.uni-kl.de} 92112027Sjungma@eit.uni-kl.de 92212027Sjungma@eit.uni-kl.de 92312027Sjungma@eit.uni-kl.desc_unsigned 92412027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned &u, uint64 v) 92512027Sjungma@eit.uni-kl.de{ 92612027Sjungma@eit.uni-kl.de 92712027Sjungma@eit.uni-kl.de if (v == 0) // case 2 92812027Sjungma@eit.uni-kl.de return sc_unsigned(u); 92912027Sjungma@eit.uni-kl.de 93012027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 93112027Sjungma@eit.uni-kl.de 93212027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 1 93312027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 93412027Sjungma@eit.uni-kl.de 93512027Sjungma@eit.uni-kl.de // cases 3 and 4 93612027Sjungma@eit.uni-kl.de return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 93712027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 93812027Sjungma@eit.uni-kl.de 93912027Sjungma@eit.uni-kl.de} 94012027Sjungma@eit.uni-kl.de 94112027Sjungma@eit.uni-kl.de 94212027Sjungma@eit.uni-kl.desc_unsigned 94312027Sjungma@eit.uni-kl.deoperator+(uint64 u, const sc_unsigned &v) 94412027Sjungma@eit.uni-kl.de{ 94512027Sjungma@eit.uni-kl.de 94612027Sjungma@eit.uni-kl.de if (u == 0) // case 1 94712027Sjungma@eit.uni-kl.de return sc_unsigned(v); 94812027Sjungma@eit.uni-kl.de 94912027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 95012027Sjungma@eit.uni-kl.de 95112027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 2 95212027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 95312027Sjungma@eit.uni-kl.de 95412027Sjungma@eit.uni-kl.de // cases 3 and 4 95512027Sjungma@eit.uni-kl.de 95612027Sjungma@eit.uni-kl.de return add_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 95712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 95812027Sjungma@eit.uni-kl.de 95912027Sjungma@eit.uni-kl.de} 96012027Sjungma@eit.uni-kl.de 96112027Sjungma@eit.uni-kl.de 96212027Sjungma@eit.uni-kl.desc_unsigned 96312027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned &u, unsigned long v) 96412027Sjungma@eit.uni-kl.de{ 96512027Sjungma@eit.uni-kl.de 96612027Sjungma@eit.uni-kl.de if (v == 0) // case 2 96712027Sjungma@eit.uni-kl.de return sc_unsigned(u); 96812027Sjungma@eit.uni-kl.de 96912027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 97012027Sjungma@eit.uni-kl.de 97112027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 1 97212027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 97312027Sjungma@eit.uni-kl.de 97412027Sjungma@eit.uni-kl.de // cases 3 and 4 97512027Sjungma@eit.uni-kl.de return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 97612027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 97712027Sjungma@eit.uni-kl.de 97812027Sjungma@eit.uni-kl.de} 97912027Sjungma@eit.uni-kl.de 98012027Sjungma@eit.uni-kl.de 98112027Sjungma@eit.uni-kl.desc_unsigned 98212027Sjungma@eit.uni-kl.deoperator+(unsigned long u, const sc_unsigned &v) 98312027Sjungma@eit.uni-kl.de{ 98412027Sjungma@eit.uni-kl.de 98512027Sjungma@eit.uni-kl.de if (u == 0) // case 1 98612027Sjungma@eit.uni-kl.de return sc_unsigned(v); 98712027Sjungma@eit.uni-kl.de 98812027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 98912027Sjungma@eit.uni-kl.de 99012027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 2 99112027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 99212027Sjungma@eit.uni-kl.de 99312027Sjungma@eit.uni-kl.de // cases 3 and 4 99412027Sjungma@eit.uni-kl.de return add_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 99512027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 99612027Sjungma@eit.uni-kl.de 99712027Sjungma@eit.uni-kl.de} 99812027Sjungma@eit.uni-kl.de 99912027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 100012027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 100112027Sjungma@eit.uni-kl.de 100212027Sjungma@eit.uni-kl.de 100312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 100412027Sjungma@eit.uni-kl.de// SECTION: MINUS operators: -, -=, -- 100512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 100612027Sjungma@eit.uni-kl.de 100712027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v: 100812027Sjungma@eit.uni-kl.de// 1. u - 0 = u 100912027Sjungma@eit.uni-kl.de// 2. 0 - v = -v 101012027Sjungma@eit.uni-kl.de// 3. if sgn(u) != sgn(v) 101112027Sjungma@eit.uni-kl.de// 3.1 u - (-v) = u + v = sgn(u) * (u + v) 101212027Sjungma@eit.uni-kl.de// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v) 101312027Sjungma@eit.uni-kl.de// 4. if sgn(u) == sgn(v) 101412027Sjungma@eit.uni-kl.de// 4.1 u - v = +(u - v) = sgn(u) * (u - v) 101512027Sjungma@eit.uni-kl.de// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v) 101612027Sjungma@eit.uni-kl.de// 101712027Sjungma@eit.uni-kl.de// Specialization of above cases for computing --u or u--: 101812027Sjungma@eit.uni-kl.de// 1. 0 - 1 = -1 101912027Sjungma@eit.uni-kl.de// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1) 102012027Sjungma@eit.uni-kl.de// 4. u - 1 = u - 1 = sgn(u) * (u - 1) 102112027Sjungma@eit.uni-kl.de 102212027Sjungma@eit.uni-kl.de// The operators in this section are included from sc_nbcommon.cpp. 102312027Sjungma@eit.uni-kl.de 102412027Sjungma@eit.uni-kl.de 102512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 102612027Sjungma@eit.uni-kl.de// SECTION: MULTIPLICATION operators: *, *= 102712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 102812027Sjungma@eit.uni-kl.de 102912027Sjungma@eit.uni-kl.de// Cases to consider when computing u * v: 103012027Sjungma@eit.uni-kl.de// 1. u * 0 = 0 * v = 0 103112027Sjungma@eit.uni-kl.de// 2. 1 * v = v and -1 * v = -v 103212027Sjungma@eit.uni-kl.de// 3. u * 1 = u and u * -1 = -u 103312027Sjungma@eit.uni-kl.de// 4. u * v = u * v 103412027Sjungma@eit.uni-kl.de 103512027Sjungma@eit.uni-kl.desc_unsigned 103612027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, const sc_unsigned& v) 103712027Sjungma@eit.uni-kl.de{ 103812027Sjungma@eit.uni-kl.de 103912027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, v.sgn); 104012027Sjungma@eit.uni-kl.de 104112027Sjungma@eit.uni-kl.de if (s == SC_ZERO) // case 1 104212027Sjungma@eit.uni-kl.de return sc_unsigned(); 104312027Sjungma@eit.uni-kl.de 104412027Sjungma@eit.uni-kl.de // cases 2-4 104512027Sjungma@eit.uni-kl.de return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 104612027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 104712027Sjungma@eit.uni-kl.de 104812027Sjungma@eit.uni-kl.de} 104912027Sjungma@eit.uni-kl.de 105012027Sjungma@eit.uni-kl.de 105112027Sjungma@eit.uni-kl.desc_unsigned 105212027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, uint64 v) 105312027Sjungma@eit.uni-kl.de{ 105412027Sjungma@eit.uni-kl.de 105512027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, get_sign(v)); 105612027Sjungma@eit.uni-kl.de 105712027Sjungma@eit.uni-kl.de if (s == SC_ZERO) // case 1 105812027Sjungma@eit.uni-kl.de return sc_unsigned(); 105912027Sjungma@eit.uni-kl.de 106012027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 106112027Sjungma@eit.uni-kl.de 106212027Sjungma@eit.uni-kl.de // cases 2-4 106312027Sjungma@eit.uni-kl.de return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 106412027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 106512027Sjungma@eit.uni-kl.de 106612027Sjungma@eit.uni-kl.de} 106712027Sjungma@eit.uni-kl.de 106812027Sjungma@eit.uni-kl.de 106912027Sjungma@eit.uni-kl.desc_unsigned 107012027Sjungma@eit.uni-kl.deoperator*(uint64 u, const sc_unsigned& v) 107112027Sjungma@eit.uni-kl.de{ 107212027Sjungma@eit.uni-kl.de 107312027Sjungma@eit.uni-kl.de small_type s = mul_signs(v.sgn, get_sign(u)); 107412027Sjungma@eit.uni-kl.de 107512027Sjungma@eit.uni-kl.de if (s == SC_ZERO) // case 1 107612027Sjungma@eit.uni-kl.de return sc_unsigned(); 107712027Sjungma@eit.uni-kl.de 107812027Sjungma@eit.uni-kl.de CONVERT_INT64_2(u); 107912027Sjungma@eit.uni-kl.de 108012027Sjungma@eit.uni-kl.de // cases 2-4 108112027Sjungma@eit.uni-kl.de return mul_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 108212027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 108312027Sjungma@eit.uni-kl.de 108412027Sjungma@eit.uni-kl.de} 108512027Sjungma@eit.uni-kl.de 108612027Sjungma@eit.uni-kl.de 108712027Sjungma@eit.uni-kl.desc_unsigned 108812027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, unsigned long v) 108912027Sjungma@eit.uni-kl.de{ 109012027Sjungma@eit.uni-kl.de 109112027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, get_sign(v)); 109212027Sjungma@eit.uni-kl.de 109312027Sjungma@eit.uni-kl.de if (s == SC_ZERO) // case 1 109412027Sjungma@eit.uni-kl.de return sc_unsigned(); 109512027Sjungma@eit.uni-kl.de 109612027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 109712027Sjungma@eit.uni-kl.de 109812027Sjungma@eit.uni-kl.de // else cases 2-4 109912027Sjungma@eit.uni-kl.de return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 110012027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 110112027Sjungma@eit.uni-kl.de 110212027Sjungma@eit.uni-kl.de} 110312027Sjungma@eit.uni-kl.de 110412027Sjungma@eit.uni-kl.desc_unsigned 110512027Sjungma@eit.uni-kl.deoperator*(unsigned long u, const sc_unsigned& v) 110612027Sjungma@eit.uni-kl.de{ 110712027Sjungma@eit.uni-kl.de 110812027Sjungma@eit.uni-kl.de small_type s = mul_signs(v.sgn, get_sign(u)); 110912027Sjungma@eit.uni-kl.de 111012027Sjungma@eit.uni-kl.de if (s == SC_ZERO) // case 1 111112027Sjungma@eit.uni-kl.de return sc_unsigned(); 111212027Sjungma@eit.uni-kl.de 111312027Sjungma@eit.uni-kl.de CONVERT_LONG_2(u); 111412027Sjungma@eit.uni-kl.de 111512027Sjungma@eit.uni-kl.de // cases 2-4 111612027Sjungma@eit.uni-kl.de return mul_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 111712027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 111812027Sjungma@eit.uni-kl.de 111912027Sjungma@eit.uni-kl.de} 112012027Sjungma@eit.uni-kl.de 112112027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 112212027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 112312027Sjungma@eit.uni-kl.de 112412027Sjungma@eit.uni-kl.de 112512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 112612027Sjungma@eit.uni-kl.de// SECTION: DIVISION operators: /, /= 112712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 112812027Sjungma@eit.uni-kl.de 112912027Sjungma@eit.uni-kl.de// Cases to consider when finding the quotient q = floor(u/v): 113012027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q. 113112027Sjungma@eit.uni-kl.de// 1. 0 / 0 or u / 0 => error 113212027Sjungma@eit.uni-kl.de// 2. 0 / v => 0 = 0 * v + 0 113312027Sjungma@eit.uni-kl.de// 3. u / v && u = v => u = 1 * u + 0 - u or v can be 1 or -1 113412027Sjungma@eit.uni-kl.de// 4. u / v && u < v => u = 0 * v + u - u can be 1 or -1 113512027Sjungma@eit.uni-kl.de// 5. u / v && u > v => u = q * v + r - v can be 1 or -1 113612027Sjungma@eit.uni-kl.de 113712027Sjungma@eit.uni-kl.desc_unsigned 113812027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, const sc_unsigned& v) 113912027Sjungma@eit.uni-kl.de{ 114012027Sjungma@eit.uni-kl.de 114112027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, v.sgn); 114212027Sjungma@eit.uni-kl.de 114312027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 114412027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 114512027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 114612027Sjungma@eit.uni-kl.de } 114712027Sjungma@eit.uni-kl.de 114812027Sjungma@eit.uni-kl.de // other cases 114912027Sjungma@eit.uni-kl.de return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 115012027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 115112027Sjungma@eit.uni-kl.de 115212027Sjungma@eit.uni-kl.de} 115312027Sjungma@eit.uni-kl.de 115412027Sjungma@eit.uni-kl.de 115512027Sjungma@eit.uni-kl.desc_unsigned 115612027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, uint64 v) 115712027Sjungma@eit.uni-kl.de{ 115812027Sjungma@eit.uni-kl.de 115912027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, get_sign(v)); 116012027Sjungma@eit.uni-kl.de 116112027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 116212027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 116312027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 116412027Sjungma@eit.uni-kl.de } 116512027Sjungma@eit.uni-kl.de 116612027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 116712027Sjungma@eit.uni-kl.de 116812027Sjungma@eit.uni-kl.de // other cases 116912027Sjungma@eit.uni-kl.de return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 117012027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 117112027Sjungma@eit.uni-kl.de 117212027Sjungma@eit.uni-kl.de} 117312027Sjungma@eit.uni-kl.de 117412027Sjungma@eit.uni-kl.de 117512027Sjungma@eit.uni-kl.desc_unsigned 117612027Sjungma@eit.uni-kl.deoperator/(uint64 u, const sc_unsigned& v) 117712027Sjungma@eit.uni-kl.de{ 117812027Sjungma@eit.uni-kl.de 117912027Sjungma@eit.uni-kl.de small_type s = mul_signs(v.sgn, get_sign(u)); 118012027Sjungma@eit.uni-kl.de 118112027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 118212027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 118312027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 118412027Sjungma@eit.uni-kl.de 118512027Sjungma@eit.uni-kl.de } 118612027Sjungma@eit.uni-kl.de 118712027Sjungma@eit.uni-kl.de CONVERT_INT64_2(u); 118812027Sjungma@eit.uni-kl.de 118912027Sjungma@eit.uni-kl.de // other cases 119012027Sjungma@eit.uni-kl.de return div_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 119112027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 119212027Sjungma@eit.uni-kl.de 119312027Sjungma@eit.uni-kl.de} 119412027Sjungma@eit.uni-kl.de 119512027Sjungma@eit.uni-kl.de 119612027Sjungma@eit.uni-kl.desc_unsigned 119712027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, unsigned long v) 119812027Sjungma@eit.uni-kl.de{ 119912027Sjungma@eit.uni-kl.de 120012027Sjungma@eit.uni-kl.de small_type s = mul_signs(u.sgn, get_sign(v)); 120112027Sjungma@eit.uni-kl.de 120212027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 120312027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 120412027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 120512027Sjungma@eit.uni-kl.de } 120612027Sjungma@eit.uni-kl.de 120712027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 120812027Sjungma@eit.uni-kl.de 120912027Sjungma@eit.uni-kl.de // other cases 121012027Sjungma@eit.uni-kl.de return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit, 121112027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 121212027Sjungma@eit.uni-kl.de 121312027Sjungma@eit.uni-kl.de} 121412027Sjungma@eit.uni-kl.de 121512027Sjungma@eit.uni-kl.de 121612027Sjungma@eit.uni-kl.desc_unsigned 121712027Sjungma@eit.uni-kl.deoperator/(unsigned long u, const sc_unsigned& v) 121812027Sjungma@eit.uni-kl.de{ 121912027Sjungma@eit.uni-kl.de 122012027Sjungma@eit.uni-kl.de small_type s = mul_signs(v.sgn, get_sign(u)); 122112027Sjungma@eit.uni-kl.de 122212027Sjungma@eit.uni-kl.de if (s == SC_ZERO) { 122312027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 122412027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 122512027Sjungma@eit.uni-kl.de 122612027Sjungma@eit.uni-kl.de } 122712027Sjungma@eit.uni-kl.de 122812027Sjungma@eit.uni-kl.de CONVERT_LONG_2(u); 122912027Sjungma@eit.uni-kl.de 123012027Sjungma@eit.uni-kl.de // other cases 123112027Sjungma@eit.uni-kl.de return div_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 123212027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 123312027Sjungma@eit.uni-kl.de 123412027Sjungma@eit.uni-kl.de} 123512027Sjungma@eit.uni-kl.de 123612027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 123712027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 123812027Sjungma@eit.uni-kl.de 123912027Sjungma@eit.uni-kl.de 124012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 124112027Sjungma@eit.uni-kl.de// SECTION: MOD operators: %, %=. 124212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 124312027Sjungma@eit.uni-kl.de 124412027Sjungma@eit.uni-kl.de// Cases to consider when finding the remainder r = u % v: 124512027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q. 124612027Sjungma@eit.uni-kl.de// 1. 0 % 0 or u % 0 => error 124712027Sjungma@eit.uni-kl.de// 2. 0 % v => 0 = 0 * v + 0 124812027Sjungma@eit.uni-kl.de// 3. u % v && u = v => u = 1 * u + 0 - u or v can be 1 or -1 124912027Sjungma@eit.uni-kl.de// 4. u % v && u < v => u = 0 * v + u - u can be 1 or -1 125012027Sjungma@eit.uni-kl.de// 5. u % v && u > v => u = q * v + r - v can be 1 or -1 125112027Sjungma@eit.uni-kl.de 125212027Sjungma@eit.uni-kl.desc_unsigned 125312027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, const sc_unsigned& v) 125412027Sjungma@eit.uni-kl.de{ 125512027Sjungma@eit.uni-kl.de 125612027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) { 125712027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 125812027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 125912027Sjungma@eit.uni-kl.de } 126012027Sjungma@eit.uni-kl.de 126112027Sjungma@eit.uni-kl.de // other cases 126212027Sjungma@eit.uni-kl.de return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 126312027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 126412027Sjungma@eit.uni-kl.de} 126512027Sjungma@eit.uni-kl.de 126612027Sjungma@eit.uni-kl.de 126712027Sjungma@eit.uni-kl.desc_unsigned 126812027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, uint64 v) 126912027Sjungma@eit.uni-kl.de{ 127012027Sjungma@eit.uni-kl.de 127112027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v == 0)) { 127212027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 127312027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 127412027Sjungma@eit.uni-kl.de } 127512027Sjungma@eit.uni-kl.de 127612027Sjungma@eit.uni-kl.de CONVERT_INT64_2(v); 127712027Sjungma@eit.uni-kl.de 127812027Sjungma@eit.uni-kl.de // other cases 127912027Sjungma@eit.uni-kl.de return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 128012027Sjungma@eit.uni-kl.de BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 128112027Sjungma@eit.uni-kl.de 128212027Sjungma@eit.uni-kl.de} 128312027Sjungma@eit.uni-kl.de 128412027Sjungma@eit.uni-kl.de 128512027Sjungma@eit.uni-kl.desc_unsigned 128612027Sjungma@eit.uni-kl.deoperator%(uint64 u, const sc_unsigned& v) 128712027Sjungma@eit.uni-kl.de{ 128812027Sjungma@eit.uni-kl.de 128912027Sjungma@eit.uni-kl.de if ((u == 0) || (v.sgn == SC_ZERO)) { 129012027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 129112027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 129212027Sjungma@eit.uni-kl.de } 129312027Sjungma@eit.uni-kl.de 129412027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 129512027Sjungma@eit.uni-kl.de 129612027Sjungma@eit.uni-kl.de // other cases 129712027Sjungma@eit.uni-kl.de return mod_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 129812027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 129912027Sjungma@eit.uni-kl.de 130012027Sjungma@eit.uni-kl.de} 130112027Sjungma@eit.uni-kl.de 130212027Sjungma@eit.uni-kl.de 130312027Sjungma@eit.uni-kl.desc_unsigned 130412027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, unsigned long v) 130512027Sjungma@eit.uni-kl.de{ 130612027Sjungma@eit.uni-kl.de 130712027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v == 0)) { 130812027Sjungma@eit.uni-kl.de div_by_zero(v); // case 1 130912027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 131012027Sjungma@eit.uni-kl.de } 131112027Sjungma@eit.uni-kl.de 131212027Sjungma@eit.uni-kl.de CONVERT_LONG_2(v); 131312027Sjungma@eit.uni-kl.de 131412027Sjungma@eit.uni-kl.de // other cases 131512027Sjungma@eit.uni-kl.de return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 131612027Sjungma@eit.uni-kl.de BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 131712027Sjungma@eit.uni-kl.de 131812027Sjungma@eit.uni-kl.de} 131912027Sjungma@eit.uni-kl.de 132012027Sjungma@eit.uni-kl.de 132112027Sjungma@eit.uni-kl.desc_unsigned 132212027Sjungma@eit.uni-kl.deoperator%(unsigned long u, const sc_unsigned& v) 132312027Sjungma@eit.uni-kl.de{ 132412027Sjungma@eit.uni-kl.de 132512027Sjungma@eit.uni-kl.de if ((u == 0) || (v.sgn == SC_ZERO)) { 132612027Sjungma@eit.uni-kl.de div_by_zero(v.sgn); // case 1 132712027Sjungma@eit.uni-kl.de return sc_unsigned(); // case 2 132812027Sjungma@eit.uni-kl.de } 132912027Sjungma@eit.uni-kl.de 133012027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 133112027Sjungma@eit.uni-kl.de 133212027Sjungma@eit.uni-kl.de // other cases 133312027Sjungma@eit.uni-kl.de return mod_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 133412027Sjungma@eit.uni-kl.de v.nbits, v.ndigits, v.digit); 133512027Sjungma@eit.uni-kl.de 133612027Sjungma@eit.uni-kl.de} 133712027Sjungma@eit.uni-kl.de 133812027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 133912027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 134012027Sjungma@eit.uni-kl.de 134112027Sjungma@eit.uni-kl.de 134212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 134312027Sjungma@eit.uni-kl.de// SECTION: Bitwise AND operators: &, &= 134412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 134512027Sjungma@eit.uni-kl.de 134612027Sjungma@eit.uni-kl.de// Cases to consider when computing u & v: 134712027Sjungma@eit.uni-kl.de// 1. u & 0 = 0 & v = 0 134812027Sjungma@eit.uni-kl.de// 2. u & v => sgn = + 134912027Sjungma@eit.uni-kl.de// 3. (-u) & (-v) => sgn = - 135012027Sjungma@eit.uni-kl.de// 4. u & (-v) => sgn = + 135112027Sjungma@eit.uni-kl.de// 5. (-u) & v => sgn = + 135212027Sjungma@eit.uni-kl.de 135312027Sjungma@eit.uni-kl.desc_unsigned 135412027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, const sc_unsigned& v) 135512027Sjungma@eit.uni-kl.de{ 135612027Sjungma@eit.uni-kl.de 135712027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1 135812027Sjungma@eit.uni-kl.de return sc_unsigned(); 135912027Sjungma@eit.uni-kl.de 136012027Sjungma@eit.uni-kl.de // other cases 136112027Sjungma@eit.uni-kl.de return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 136212027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 136312027Sjungma@eit.uni-kl.de 136412027Sjungma@eit.uni-kl.de} 136512027Sjungma@eit.uni-kl.de 136612027Sjungma@eit.uni-kl.de 136712027Sjungma@eit.uni-kl.desc_unsigned 136812027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, uint64 v) 136912027Sjungma@eit.uni-kl.de{ 137012027Sjungma@eit.uni-kl.de 137112027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 137212027Sjungma@eit.uni-kl.de return sc_unsigned(); 137312027Sjungma@eit.uni-kl.de 137412027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 137512027Sjungma@eit.uni-kl.de 137612027Sjungma@eit.uni-kl.de // other cases 137712027Sjungma@eit.uni-kl.de return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 137812027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 137912027Sjungma@eit.uni-kl.de 138012027Sjungma@eit.uni-kl.de} 138112027Sjungma@eit.uni-kl.de 138212027Sjungma@eit.uni-kl.de 138312027Sjungma@eit.uni-kl.desc_unsigned 138412027Sjungma@eit.uni-kl.deoperator&(uint64 u, const sc_unsigned& v) 138512027Sjungma@eit.uni-kl.de{ 138612027Sjungma@eit.uni-kl.de 138712027Sjungma@eit.uni-kl.de if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 138812027Sjungma@eit.uni-kl.de return sc_unsigned(); 138912027Sjungma@eit.uni-kl.de 139012027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 139112027Sjungma@eit.uni-kl.de 139212027Sjungma@eit.uni-kl.de // other cases 139312027Sjungma@eit.uni-kl.de return and_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 139412027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 139512027Sjungma@eit.uni-kl.de 139612027Sjungma@eit.uni-kl.de} 139712027Sjungma@eit.uni-kl.de 139812027Sjungma@eit.uni-kl.de 139912027Sjungma@eit.uni-kl.desc_unsigned 140012027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, unsigned long v) 140112027Sjungma@eit.uni-kl.de{ 140212027Sjungma@eit.uni-kl.de 140312027Sjungma@eit.uni-kl.de if ((u.sgn == SC_ZERO) || (v == 0)) // case 1 140412027Sjungma@eit.uni-kl.de return sc_unsigned(); 140512027Sjungma@eit.uni-kl.de 140612027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 140712027Sjungma@eit.uni-kl.de 140812027Sjungma@eit.uni-kl.de // other cases 140912027Sjungma@eit.uni-kl.de return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 141012027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 141112027Sjungma@eit.uni-kl.de 141212027Sjungma@eit.uni-kl.de} 141312027Sjungma@eit.uni-kl.de 141412027Sjungma@eit.uni-kl.de 141512027Sjungma@eit.uni-kl.desc_unsigned 141612027Sjungma@eit.uni-kl.deoperator&(unsigned long u, const sc_unsigned& v) 141712027Sjungma@eit.uni-kl.de{ 141812027Sjungma@eit.uni-kl.de 141912027Sjungma@eit.uni-kl.de if ((u == 0) || (v.sgn == SC_ZERO)) // case 1 142012027Sjungma@eit.uni-kl.de return sc_unsigned(); 142112027Sjungma@eit.uni-kl.de 142212027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 142312027Sjungma@eit.uni-kl.de 142412027Sjungma@eit.uni-kl.de // other cases 142512027Sjungma@eit.uni-kl.de return and_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 142612027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 142712027Sjungma@eit.uni-kl.de 142812027Sjungma@eit.uni-kl.de} 142912027Sjungma@eit.uni-kl.de 143012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 143112027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 143212027Sjungma@eit.uni-kl.de 143312027Sjungma@eit.uni-kl.de 143412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 143512027Sjungma@eit.uni-kl.de// SECTION: Bitwise OR operators: |, |= 143612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 143712027Sjungma@eit.uni-kl.de 143812027Sjungma@eit.uni-kl.de// Cases to consider when computing u | v: 143912027Sjungma@eit.uni-kl.de// 1. u | 0 = u 144012027Sjungma@eit.uni-kl.de// 2. 0 | v = v 144112027Sjungma@eit.uni-kl.de// 3. u | v => sgn = + 144212027Sjungma@eit.uni-kl.de// 4. (-u) | (-v) => sgn = - 144312027Sjungma@eit.uni-kl.de// 5. u | (-v) => sgn = - 144412027Sjungma@eit.uni-kl.de// 6. (-u) | v => sgn = - 144512027Sjungma@eit.uni-kl.de 144612027Sjungma@eit.uni-kl.desc_unsigned 144712027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, const sc_unsigned& v) 144812027Sjungma@eit.uni-kl.de{ 144912027Sjungma@eit.uni-kl.de 145012027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 145112027Sjungma@eit.uni-kl.de return sc_unsigned(u); 145212027Sjungma@eit.uni-kl.de 145312027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 145412027Sjungma@eit.uni-kl.de return sc_unsigned(v); 145512027Sjungma@eit.uni-kl.de 145612027Sjungma@eit.uni-kl.de // other cases 145712027Sjungma@eit.uni-kl.de return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 145812027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 145912027Sjungma@eit.uni-kl.de 146012027Sjungma@eit.uni-kl.de} 146112027Sjungma@eit.uni-kl.de 146212027Sjungma@eit.uni-kl.de 146312027Sjungma@eit.uni-kl.desc_unsigned 146412027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, uint64 v) 146512027Sjungma@eit.uni-kl.de{ 146612027Sjungma@eit.uni-kl.de 146712027Sjungma@eit.uni-kl.de if (v == 0) // case 1 146812027Sjungma@eit.uni-kl.de return sc_unsigned(u); 146912027Sjungma@eit.uni-kl.de 147012027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 147112027Sjungma@eit.uni-kl.de 147212027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 147312027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 147412027Sjungma@eit.uni-kl.de 147512027Sjungma@eit.uni-kl.de // other cases 147612027Sjungma@eit.uni-kl.de return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 147712027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 147812027Sjungma@eit.uni-kl.de 147912027Sjungma@eit.uni-kl.de} 148012027Sjungma@eit.uni-kl.de 148112027Sjungma@eit.uni-kl.de 148212027Sjungma@eit.uni-kl.desc_unsigned 148312027Sjungma@eit.uni-kl.deoperator|(uint64 u, const sc_unsigned& v) 148412027Sjungma@eit.uni-kl.de{ 148512027Sjungma@eit.uni-kl.de 148612027Sjungma@eit.uni-kl.de if (u == 0) 148712027Sjungma@eit.uni-kl.de return sc_unsigned(v); 148812027Sjungma@eit.uni-kl.de 148912027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 149012027Sjungma@eit.uni-kl.de 149112027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 149212027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 149312027Sjungma@eit.uni-kl.de 149412027Sjungma@eit.uni-kl.de // other cases 149512027Sjungma@eit.uni-kl.de return or_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 149612027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 149712027Sjungma@eit.uni-kl.de 149812027Sjungma@eit.uni-kl.de} 149912027Sjungma@eit.uni-kl.de 150012027Sjungma@eit.uni-kl.de 150112027Sjungma@eit.uni-kl.desc_unsigned 150212027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, unsigned long v) 150312027Sjungma@eit.uni-kl.de{ 150412027Sjungma@eit.uni-kl.de 150512027Sjungma@eit.uni-kl.de if (v == 0) // case 1 150612027Sjungma@eit.uni-kl.de return sc_unsigned(u); 150712027Sjungma@eit.uni-kl.de 150812027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 150912027Sjungma@eit.uni-kl.de 151012027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 151112027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 151212027Sjungma@eit.uni-kl.de 151312027Sjungma@eit.uni-kl.de // other cases 151412027Sjungma@eit.uni-kl.de return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 151512027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 151612027Sjungma@eit.uni-kl.de 151712027Sjungma@eit.uni-kl.de} 151812027Sjungma@eit.uni-kl.de 151912027Sjungma@eit.uni-kl.de 152012027Sjungma@eit.uni-kl.desc_unsigned 152112027Sjungma@eit.uni-kl.deoperator|(unsigned long u, const sc_unsigned& v) 152212027Sjungma@eit.uni-kl.de{ 152312027Sjungma@eit.uni-kl.de 152412027Sjungma@eit.uni-kl.de if (u == 0) 152512027Sjungma@eit.uni-kl.de return sc_unsigned(v); 152612027Sjungma@eit.uni-kl.de 152712027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 152812027Sjungma@eit.uni-kl.de 152912027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 153012027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 153112027Sjungma@eit.uni-kl.de 153212027Sjungma@eit.uni-kl.de // other cases 153312027Sjungma@eit.uni-kl.de return or_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 153412027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 153512027Sjungma@eit.uni-kl.de 153612027Sjungma@eit.uni-kl.de} 153712027Sjungma@eit.uni-kl.de 153812027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 153912027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 154012027Sjungma@eit.uni-kl.de 154112027Sjungma@eit.uni-kl.de 154212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 154312027Sjungma@eit.uni-kl.de// SECTION: Bitwise XOR operators: ^, ^= 154412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 154512027Sjungma@eit.uni-kl.de 154612027Sjungma@eit.uni-kl.de// Cases to consider when computing u ^ v: 154712027Sjungma@eit.uni-kl.de// Note that u ^ v = (~u & v) | (u & ~v). 154812027Sjungma@eit.uni-kl.de// 1. u ^ 0 = u 154912027Sjungma@eit.uni-kl.de// 2. 0 ^ v = v 155012027Sjungma@eit.uni-kl.de// 3. u ^ v => sgn = + 155112027Sjungma@eit.uni-kl.de// 4. (-u) ^ (-v) => sgn = - 155212027Sjungma@eit.uni-kl.de// 5. u ^ (-v) => sgn = - 155312027Sjungma@eit.uni-kl.de// 6. (-u) ^ v => sgn = + 155412027Sjungma@eit.uni-kl.de 155512027Sjungma@eit.uni-kl.desc_unsigned 155612027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, const sc_unsigned& v) 155712027Sjungma@eit.uni-kl.de{ 155812027Sjungma@eit.uni-kl.de 155912027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) // case 1 156012027Sjungma@eit.uni-kl.de return sc_unsigned(u); 156112027Sjungma@eit.uni-kl.de 156212027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 156312027Sjungma@eit.uni-kl.de return sc_unsigned(v); 156412027Sjungma@eit.uni-kl.de 156512027Sjungma@eit.uni-kl.de // other cases 156612027Sjungma@eit.uni-kl.de return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 156712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 156812027Sjungma@eit.uni-kl.de 156912027Sjungma@eit.uni-kl.de} 157012027Sjungma@eit.uni-kl.de 157112027Sjungma@eit.uni-kl.de 157212027Sjungma@eit.uni-kl.desc_unsigned 157312027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, uint64 v) 157412027Sjungma@eit.uni-kl.de{ 157512027Sjungma@eit.uni-kl.de 157612027Sjungma@eit.uni-kl.de if (v == 0) // case 1 157712027Sjungma@eit.uni-kl.de return sc_unsigned(u); 157812027Sjungma@eit.uni-kl.de 157912027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 158012027Sjungma@eit.uni-kl.de 158112027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 158212027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false); 158312027Sjungma@eit.uni-kl.de 158412027Sjungma@eit.uni-kl.de // other cases 158512027Sjungma@eit.uni-kl.de return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 158612027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); 158712027Sjungma@eit.uni-kl.de 158812027Sjungma@eit.uni-kl.de} 158912027Sjungma@eit.uni-kl.de 159012027Sjungma@eit.uni-kl.desc_unsigned 159112027Sjungma@eit.uni-kl.deoperator^(uint64 u, const sc_unsigned& v) 159212027Sjungma@eit.uni-kl.de{ 159312027Sjungma@eit.uni-kl.de if (u == 0) 159412027Sjungma@eit.uni-kl.de return sc_unsigned(v); 159512027Sjungma@eit.uni-kl.de 159612027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 159712027Sjungma@eit.uni-kl.de 159812027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 159912027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false); 160012027Sjungma@eit.uni-kl.de 160112027Sjungma@eit.uni-kl.de // other cases 160212027Sjungma@eit.uni-kl.de return xor_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 160312027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 160412027Sjungma@eit.uni-kl.de 160512027Sjungma@eit.uni-kl.de} 160612027Sjungma@eit.uni-kl.de 160712027Sjungma@eit.uni-kl.de 160812027Sjungma@eit.uni-kl.desc_unsigned 160912027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, unsigned long v) 161012027Sjungma@eit.uni-kl.de{ 161112027Sjungma@eit.uni-kl.de 161212027Sjungma@eit.uni-kl.de if (v == 0) // case 1 161312027Sjungma@eit.uni-kl.de return sc_unsigned(u); 161412027Sjungma@eit.uni-kl.de 161512027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 161612027Sjungma@eit.uni-kl.de 161712027Sjungma@eit.uni-kl.de if (u.sgn == SC_ZERO) // case 2 161812027Sjungma@eit.uni-kl.de return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false); 161912027Sjungma@eit.uni-kl.de 162012027Sjungma@eit.uni-kl.de // other cases 162112027Sjungma@eit.uni-kl.de return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit, 162212027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); 162312027Sjungma@eit.uni-kl.de 162412027Sjungma@eit.uni-kl.de} 162512027Sjungma@eit.uni-kl.de 162612027Sjungma@eit.uni-kl.desc_unsigned 162712027Sjungma@eit.uni-kl.deoperator^(unsigned long u, const sc_unsigned& v) 162812027Sjungma@eit.uni-kl.de{ 162912027Sjungma@eit.uni-kl.de if (u == 0) 163012027Sjungma@eit.uni-kl.de return sc_unsigned(v); 163112027Sjungma@eit.uni-kl.de 163212027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 163312027Sjungma@eit.uni-kl.de 163412027Sjungma@eit.uni-kl.de if (v.sgn == SC_ZERO) 163512027Sjungma@eit.uni-kl.de return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false); 163612027Sjungma@eit.uni-kl.de 163712027Sjungma@eit.uni-kl.de // other cases 163812027Sjungma@eit.uni-kl.de return xor_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 163912027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit); 164012027Sjungma@eit.uni-kl.de 164112027Sjungma@eit.uni-kl.de} 164212027Sjungma@eit.uni-kl.de 164312027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 164412027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 164512027Sjungma@eit.uni-kl.de 164612027Sjungma@eit.uni-kl.de 164712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 164812027Sjungma@eit.uni-kl.de// SECTION: Bitwise NOT operator: ~ 164912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 165012027Sjungma@eit.uni-kl.de 165112027Sjungma@eit.uni-kl.de// Operators in this section are included from sc_nbcommon.cpp. 165212027Sjungma@eit.uni-kl.de 165312027Sjungma@eit.uni-kl.de 165412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 165512027Sjungma@eit.uni-kl.de// SECTION: LEFT SHIFT operators: <<, <<= 165612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 165712027Sjungma@eit.uni-kl.de 165812027Sjungma@eit.uni-kl.desc_unsigned 165912027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_signed& v) 166012027Sjungma@eit.uni-kl.de{ 166112027Sjungma@eit.uni-kl.de if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG)) 166212027Sjungma@eit.uni-kl.de return sc_unsigned(u); 166312027Sjungma@eit.uni-kl.de 166412027Sjungma@eit.uni-kl.de return operator<<(u, v.to_ulong()); 166512027Sjungma@eit.uni-kl.de} 166612027Sjungma@eit.uni-kl.de 166712027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 166812027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 166912027Sjungma@eit.uni-kl.de 167012027Sjungma@eit.uni-kl.de 167112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 167212027Sjungma@eit.uni-kl.de// SECTION: RIGHT SHIFT operators: >>, >>= 167312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 167412027Sjungma@eit.uni-kl.de 167512027Sjungma@eit.uni-kl.desc_unsigned 167612027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned& u, const sc_signed& v) 167712027Sjungma@eit.uni-kl.de{ 167812027Sjungma@eit.uni-kl.de 167912027Sjungma@eit.uni-kl.de if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG)) 168012027Sjungma@eit.uni-kl.de return sc_unsigned(u); 168112027Sjungma@eit.uni-kl.de 168212027Sjungma@eit.uni-kl.de return operator>>(u, v.to_long()); 168312027Sjungma@eit.uni-kl.de 168412027Sjungma@eit.uni-kl.de} 168512027Sjungma@eit.uni-kl.de 168612027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from 168712027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 168812027Sjungma@eit.uni-kl.de 168912027Sjungma@eit.uni-kl.de 169012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 169112027Sjungma@eit.uni-kl.de// SECTION: Unary arithmetic operators. 169212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 169312027Sjungma@eit.uni-kl.de 169412027Sjungma@eit.uni-kl.desc_unsigned 169512027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u) 169612027Sjungma@eit.uni-kl.de{ 169712027Sjungma@eit.uni-kl.de return sc_unsigned(u); 169812027Sjungma@eit.uni-kl.de} 169912027Sjungma@eit.uni-kl.de 170012027Sjungma@eit.uni-kl.de 170112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 170212027Sjungma@eit.uni-kl.de// SECTION: EQUAL operator: == 170312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 170412027Sjungma@eit.uni-kl.de 170512027Sjungma@eit.uni-kl.debool 170612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_unsigned& v) 170712027Sjungma@eit.uni-kl.de{ 170812027Sjungma@eit.uni-kl.de if (&u == &v) 170912027Sjungma@eit.uni-kl.de return true; 171012027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 171112027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) != 0) 171212027Sjungma@eit.uni-kl.de return false; 171312027Sjungma@eit.uni-kl.de return true; 171412027Sjungma@eit.uni-kl.de} 171512027Sjungma@eit.uni-kl.de 171612027Sjungma@eit.uni-kl.de 171712027Sjungma@eit.uni-kl.debool 171812027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_signed& v) 171912027Sjungma@eit.uni-kl.de{ 172012027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 172112027Sjungma@eit.uni-kl.de return false; 172212027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 172312027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) != 0) 172412027Sjungma@eit.uni-kl.de return false; 172512027Sjungma@eit.uni-kl.de return true; 172612027Sjungma@eit.uni-kl.de} 172712027Sjungma@eit.uni-kl.de 172812027Sjungma@eit.uni-kl.de 172912027Sjungma@eit.uni-kl.debool 173012027Sjungma@eit.uni-kl.deoperator==(const sc_signed& u, const sc_unsigned& v) 173112027Sjungma@eit.uni-kl.de{ 173212027Sjungma@eit.uni-kl.de if (u.sgn == SC_NEG) 173312027Sjungma@eit.uni-kl.de return false; 173412027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 173512027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) != 0) 173612027Sjungma@eit.uni-kl.de return false; 173712027Sjungma@eit.uni-kl.de return true; 173812027Sjungma@eit.uni-kl.de} 173912027Sjungma@eit.uni-kl.de 174012027Sjungma@eit.uni-kl.de 174112027Sjungma@eit.uni-kl.debool 174212027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, int64 v) 174312027Sjungma@eit.uni-kl.de{ 174412027Sjungma@eit.uni-kl.de if (v < 0) 174512027Sjungma@eit.uni-kl.de return false; 174612027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 174712027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 174812027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0) 174912027Sjungma@eit.uni-kl.de return false; 175012027Sjungma@eit.uni-kl.de return true; 175112027Sjungma@eit.uni-kl.de} 175212027Sjungma@eit.uni-kl.de 175312027Sjungma@eit.uni-kl.de 175412027Sjungma@eit.uni-kl.debool 175512027Sjungma@eit.uni-kl.deoperator==(int64 u, const sc_unsigned& v) 175612027Sjungma@eit.uni-kl.de{ 175712027Sjungma@eit.uni-kl.de if (u < 0) 175812027Sjungma@eit.uni-kl.de return false; 175912027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 176012027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 176112027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) != 0) 176212027Sjungma@eit.uni-kl.de return false; 176312027Sjungma@eit.uni-kl.de return true; 176412027Sjungma@eit.uni-kl.de} 176512027Sjungma@eit.uni-kl.de 176612027Sjungma@eit.uni-kl.de 176712027Sjungma@eit.uni-kl.debool 176812027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, uint64 v) 176912027Sjungma@eit.uni-kl.de{ 177012027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 177112027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 177212027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0) 177312027Sjungma@eit.uni-kl.de return false; 177412027Sjungma@eit.uni-kl.de return true; 177512027Sjungma@eit.uni-kl.de} 177612027Sjungma@eit.uni-kl.de 177712027Sjungma@eit.uni-kl.de 177812027Sjungma@eit.uni-kl.debool 177912027Sjungma@eit.uni-kl.deoperator==(uint64 u, const sc_unsigned& v) 178012027Sjungma@eit.uni-kl.de{ 178112027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 178212027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 178312027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) != 0) 178412027Sjungma@eit.uni-kl.de return false; 178512027Sjungma@eit.uni-kl.de return true; 178612027Sjungma@eit.uni-kl.de} 178712027Sjungma@eit.uni-kl.de 178812027Sjungma@eit.uni-kl.de 178912027Sjungma@eit.uni-kl.debool 179012027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, long v) 179112027Sjungma@eit.uni-kl.de{ 179212027Sjungma@eit.uni-kl.de if (v < 0) 179312027Sjungma@eit.uni-kl.de return false; 179412027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 179512027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 179612027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0) 179712027Sjungma@eit.uni-kl.de return false; 179812027Sjungma@eit.uni-kl.de return true; 179912027Sjungma@eit.uni-kl.de} 180012027Sjungma@eit.uni-kl.de 180112027Sjungma@eit.uni-kl.de 180212027Sjungma@eit.uni-kl.debool 180312027Sjungma@eit.uni-kl.deoperator==(long u, const sc_unsigned& v) 180412027Sjungma@eit.uni-kl.de{ 180512027Sjungma@eit.uni-kl.de if (u < 0) 180612027Sjungma@eit.uni-kl.de return false; 180712027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 180812027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 180912027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) != 0) 181012027Sjungma@eit.uni-kl.de return false; 181112027Sjungma@eit.uni-kl.de return true; 181212027Sjungma@eit.uni-kl.de} 181312027Sjungma@eit.uni-kl.de 181412027Sjungma@eit.uni-kl.de 181512027Sjungma@eit.uni-kl.debool 181612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, unsigned long v) 181712027Sjungma@eit.uni-kl.de{ 181812027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 181912027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 182012027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0) 182112027Sjungma@eit.uni-kl.de return false; 182212027Sjungma@eit.uni-kl.de return true; 182312027Sjungma@eit.uni-kl.de} 182412027Sjungma@eit.uni-kl.de 182512027Sjungma@eit.uni-kl.de 182612027Sjungma@eit.uni-kl.debool 182712027Sjungma@eit.uni-kl.deoperator==(unsigned long u, const sc_unsigned& v) 182812027Sjungma@eit.uni-kl.de{ 182912027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 183012027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 183112027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) != 0) 183212027Sjungma@eit.uni-kl.de return false; 183312027Sjungma@eit.uni-kl.de return true; 183412027Sjungma@eit.uni-kl.de} 183512027Sjungma@eit.uni-kl.de 183612027Sjungma@eit.uni-kl.de 183712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 183812027Sjungma@eit.uni-kl.de// SECTION: NOT_EQUAL operator: != 183912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 184012027Sjungma@eit.uni-kl.de 184112027Sjungma@eit.uni-kl.debool 184212027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_signed& v) 184312027Sjungma@eit.uni-kl.de{ 184412027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 184512027Sjungma@eit.uni-kl.de} 184612027Sjungma@eit.uni-kl.de 184712027Sjungma@eit.uni-kl.de 184812027Sjungma@eit.uni-kl.debool 184912027Sjungma@eit.uni-kl.deoperator!=(const sc_signed& u, const sc_unsigned& v) 185012027Sjungma@eit.uni-kl.de{ 185112027Sjungma@eit.uni-kl.de return (! operator==(u, v)); 185212027Sjungma@eit.uni-kl.de} 185312027Sjungma@eit.uni-kl.de 185412027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp. 185512027Sjungma@eit.uni-kl.de 185612027Sjungma@eit.uni-kl.de 185712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 185812027Sjungma@eit.uni-kl.de// SECTION: LESS THAN operator: < 185912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 186012027Sjungma@eit.uni-kl.de 186112027Sjungma@eit.uni-kl.debool 186212027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_unsigned& v) 186312027Sjungma@eit.uni-kl.de{ 186412027Sjungma@eit.uni-kl.de if (&u == &v) 186512027Sjungma@eit.uni-kl.de return false; 186612027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 186712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) < 0) 186812027Sjungma@eit.uni-kl.de return true; 186912027Sjungma@eit.uni-kl.de return false; 187012027Sjungma@eit.uni-kl.de} 187112027Sjungma@eit.uni-kl.de 187212027Sjungma@eit.uni-kl.de 187312027Sjungma@eit.uni-kl.debool 187412027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_signed& v) 187512027Sjungma@eit.uni-kl.de{ 187612027Sjungma@eit.uni-kl.de if (v.sgn == SC_NEG) 187712027Sjungma@eit.uni-kl.de return false; 187812027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 187912027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) < 0) 188012027Sjungma@eit.uni-kl.de return true; 188112027Sjungma@eit.uni-kl.de return false; 188212027Sjungma@eit.uni-kl.de} 188312027Sjungma@eit.uni-kl.de 188412027Sjungma@eit.uni-kl.de 188512027Sjungma@eit.uni-kl.debool 188612027Sjungma@eit.uni-kl.deoperator<(const sc_signed& u, const sc_unsigned& v) 188712027Sjungma@eit.uni-kl.de{ 188812027Sjungma@eit.uni-kl.de if (u.sgn == SC_NEG) 188912027Sjungma@eit.uni-kl.de return true; 189012027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 189112027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) < 0) 189212027Sjungma@eit.uni-kl.de return true; 189312027Sjungma@eit.uni-kl.de return false; 189412027Sjungma@eit.uni-kl.de} 189512027Sjungma@eit.uni-kl.de 189612027Sjungma@eit.uni-kl.de 189712027Sjungma@eit.uni-kl.debool 189812027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, int64 v) 189912027Sjungma@eit.uni-kl.de{ 190012027Sjungma@eit.uni-kl.de if (v < 0) 190112027Sjungma@eit.uni-kl.de return false; 190212027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 190312027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 190412027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0) 190512027Sjungma@eit.uni-kl.de return true; 190612027Sjungma@eit.uni-kl.de return false; 190712027Sjungma@eit.uni-kl.de} 190812027Sjungma@eit.uni-kl.de 190912027Sjungma@eit.uni-kl.de 191012027Sjungma@eit.uni-kl.debool 191112027Sjungma@eit.uni-kl.deoperator<(int64 u, const sc_unsigned& v) 191212027Sjungma@eit.uni-kl.de{ 191312027Sjungma@eit.uni-kl.de if (u < 0) 191412027Sjungma@eit.uni-kl.de return true; 191512027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 191612027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 191712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) < 0) 191812027Sjungma@eit.uni-kl.de return true; 191912027Sjungma@eit.uni-kl.de return false; 192012027Sjungma@eit.uni-kl.de} 192112027Sjungma@eit.uni-kl.de 192212027Sjungma@eit.uni-kl.de 192312027Sjungma@eit.uni-kl.debool 192412027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, uint64 v) 192512027Sjungma@eit.uni-kl.de{ 192612027Sjungma@eit.uni-kl.de CONVERT_INT64(v); 192712027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 192812027Sjungma@eit.uni-kl.de vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0) 192912027Sjungma@eit.uni-kl.de return true; 193012027Sjungma@eit.uni-kl.de return false; 193112027Sjungma@eit.uni-kl.de} 193212027Sjungma@eit.uni-kl.de 193312027Sjungma@eit.uni-kl.de 193412027Sjungma@eit.uni-kl.debool 193512027Sjungma@eit.uni-kl.deoperator<(uint64 u, const sc_unsigned& v) 193612027Sjungma@eit.uni-kl.de{ 193712027Sjungma@eit.uni-kl.de CONVERT_INT64(u); 193812027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, 193912027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) < 0) 194012027Sjungma@eit.uni-kl.de return true; 194112027Sjungma@eit.uni-kl.de return false; 194212027Sjungma@eit.uni-kl.de} 194312027Sjungma@eit.uni-kl.de 194412027Sjungma@eit.uni-kl.de 194512027Sjungma@eit.uni-kl.debool 194612027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, long v) 194712027Sjungma@eit.uni-kl.de{ 194812027Sjungma@eit.uni-kl.de if (v < 0) 194912027Sjungma@eit.uni-kl.de return false; 195012027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 195112027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 195212027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0) 195312027Sjungma@eit.uni-kl.de return true; 195412027Sjungma@eit.uni-kl.de return false; 195512027Sjungma@eit.uni-kl.de} 195612027Sjungma@eit.uni-kl.de 195712027Sjungma@eit.uni-kl.de 195812027Sjungma@eit.uni-kl.debool 195912027Sjungma@eit.uni-kl.deoperator<(long u, const sc_unsigned& v) 196012027Sjungma@eit.uni-kl.de{ 196112027Sjungma@eit.uni-kl.de if (u < 0) 196212027Sjungma@eit.uni-kl.de return true; 196312027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 196412027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 196512027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) < 0) 196612027Sjungma@eit.uni-kl.de return true; 196712027Sjungma@eit.uni-kl.de return false; 196812027Sjungma@eit.uni-kl.de} 196912027Sjungma@eit.uni-kl.de 197012027Sjungma@eit.uni-kl.de 197112027Sjungma@eit.uni-kl.debool 197212027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, unsigned long v) 197312027Sjungma@eit.uni-kl.de{ 197412027Sjungma@eit.uni-kl.de CONVERT_LONG(v); 197512027Sjungma@eit.uni-kl.de if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit, 197612027Sjungma@eit.uni-kl.de vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0) 197712027Sjungma@eit.uni-kl.de return true; 197812027Sjungma@eit.uni-kl.de return false; 197912027Sjungma@eit.uni-kl.de} 198012027Sjungma@eit.uni-kl.de 198112027Sjungma@eit.uni-kl.de 198212027Sjungma@eit.uni-kl.debool 198312027Sjungma@eit.uni-kl.deoperator<(unsigned long u, const sc_unsigned& v) 198412027Sjungma@eit.uni-kl.de{ 198512027Sjungma@eit.uni-kl.de CONVERT_LONG(u); 198612027Sjungma@eit.uni-kl.de if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, 198712027Sjungma@eit.uni-kl.de v.sgn, v.nbits, v.ndigits, v.digit) < 0) 198812027Sjungma@eit.uni-kl.de return true; 198912027Sjungma@eit.uni-kl.de return false; 199012027Sjungma@eit.uni-kl.de} 199112027Sjungma@eit.uni-kl.de 199212027Sjungma@eit.uni-kl.de 199312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 199412027Sjungma@eit.uni-kl.de// SECTION: LESS THAN or EQUAL operator: <= 199512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 199612027Sjungma@eit.uni-kl.de 199712027Sjungma@eit.uni-kl.debool 199812027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_signed& v) 199912027Sjungma@eit.uni-kl.de{ 200012027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 200112027Sjungma@eit.uni-kl.de} 200212027Sjungma@eit.uni-kl.de 200312027Sjungma@eit.uni-kl.de 200412027Sjungma@eit.uni-kl.debool 200512027Sjungma@eit.uni-kl.deoperator<=(const sc_signed& u, const sc_unsigned& v) 200612027Sjungma@eit.uni-kl.de{ 200712027Sjungma@eit.uni-kl.de return (operator<(u, v) || operator==(u, v)); 200812027Sjungma@eit.uni-kl.de} 200912027Sjungma@eit.uni-kl.de 201012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp. 201112027Sjungma@eit.uni-kl.de 201212027Sjungma@eit.uni-kl.de 201312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 201412027Sjungma@eit.uni-kl.de// SECTION: GREATER THAN operator: > 201512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 201612027Sjungma@eit.uni-kl.de 201712027Sjungma@eit.uni-kl.debool 201812027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_signed& v) 201912027Sjungma@eit.uni-kl.de{ 202012027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 202112027Sjungma@eit.uni-kl.de} 202212027Sjungma@eit.uni-kl.de 202312027Sjungma@eit.uni-kl.de 202412027Sjungma@eit.uni-kl.debool 202512027Sjungma@eit.uni-kl.deoperator>(const sc_signed& u, const sc_unsigned& v) 202612027Sjungma@eit.uni-kl.de{ 202712027Sjungma@eit.uni-kl.de return (! (operator<=(u, v))); 202812027Sjungma@eit.uni-kl.de} 202912027Sjungma@eit.uni-kl.de 203012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp. 203112027Sjungma@eit.uni-kl.de 203212027Sjungma@eit.uni-kl.de 203312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 203412027Sjungma@eit.uni-kl.de// SECTION: GREATER THAN or EQUAL operator: >= 203512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 203612027Sjungma@eit.uni-kl.de 203712027Sjungma@eit.uni-kl.debool 203812027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_signed& v) 203912027Sjungma@eit.uni-kl.de{ 204012027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 204112027Sjungma@eit.uni-kl.de} 204212027Sjungma@eit.uni-kl.de 204312027Sjungma@eit.uni-kl.de 204412027Sjungma@eit.uni-kl.debool 204512027Sjungma@eit.uni-kl.deoperator>=(const sc_signed& u, const sc_unsigned& v) 204612027Sjungma@eit.uni-kl.de{ 204712027Sjungma@eit.uni-kl.de return (! (operator<(u, v))); 204812027Sjungma@eit.uni-kl.de} 204912027Sjungma@eit.uni-kl.de 205012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp. 205112027Sjungma@eit.uni-kl.de 205212027Sjungma@eit.uni-kl.de 205312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 205412027Sjungma@eit.uni-kl.de// SECTION: Friends 205512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 205612027Sjungma@eit.uni-kl.de 205712027Sjungma@eit.uni-kl.de// Compare u and v as unsigned and return r 205812027Sjungma@eit.uni-kl.de// r = 0 if u == v 205912027Sjungma@eit.uni-kl.de// r < 0 if u < v 206012027Sjungma@eit.uni-kl.de// r > 0 if u > v 206112027Sjungma@eit.uni-kl.de 206212027Sjungma@eit.uni-kl.deint 206312027Sjungma@eit.uni-kl.decompare_unsigned(small_type us, 206412027Sjungma@eit.uni-kl.de int unb, int und, const sc_digit *ud, 206512027Sjungma@eit.uni-kl.de small_type vs, 206612027Sjungma@eit.uni-kl.de int vnb, int vnd, const sc_digit *vd, 206712027Sjungma@eit.uni-kl.de small_type if_u_signed, 206812027Sjungma@eit.uni-kl.de small_type if_v_signed) 206912027Sjungma@eit.uni-kl.de{ 207012027Sjungma@eit.uni-kl.de 207112027Sjungma@eit.uni-kl.de if (us == vs) { 207212027Sjungma@eit.uni-kl.de 207312027Sjungma@eit.uni-kl.de if (us == SC_ZERO) 207412027Sjungma@eit.uni-kl.de return 0; 207512027Sjungma@eit.uni-kl.de 207612027Sjungma@eit.uni-kl.de else { 207712027Sjungma@eit.uni-kl.de 207812027Sjungma@eit.uni-kl.de int cmp_res = vec_skip_and_cmp(und, ud, vnd, vd); 207912027Sjungma@eit.uni-kl.de 208012027Sjungma@eit.uni-kl.de if (us == SC_POS) 208112027Sjungma@eit.uni-kl.de return cmp_res; 208212027Sjungma@eit.uni-kl.de else 208312027Sjungma@eit.uni-kl.de return -cmp_res; 208412027Sjungma@eit.uni-kl.de 208512027Sjungma@eit.uni-kl.de } 208612027Sjungma@eit.uni-kl.de } 208712027Sjungma@eit.uni-kl.de else { 208812027Sjungma@eit.uni-kl.de 208912027Sjungma@eit.uni-kl.de if (us == SC_ZERO) 209012027Sjungma@eit.uni-kl.de return -vs; 209112027Sjungma@eit.uni-kl.de 209212027Sjungma@eit.uni-kl.de if (vs == SC_ZERO) 209312027Sjungma@eit.uni-kl.de return us; 209412027Sjungma@eit.uni-kl.de 209512027Sjungma@eit.uni-kl.de int cmp_res; 209612027Sjungma@eit.uni-kl.de 209712027Sjungma@eit.uni-kl.de int nd = (us == SC_NEG ? und : vnd); 209812027Sjungma@eit.uni-kl.de 209912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 210012027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 210112027Sjungma@eit.uni-kl.de#else 210212027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[nd]; 210312027Sjungma@eit.uni-kl.de#endif 210412027Sjungma@eit.uni-kl.de 210512027Sjungma@eit.uni-kl.de if (us == SC_NEG) { 210612027Sjungma@eit.uni-kl.de 210712027Sjungma@eit.uni-kl.de vec_copy(nd, d, ud); 210812027Sjungma@eit.uni-kl.de vec_complement(nd, d); 210912027Sjungma@eit.uni-kl.de trim(if_u_signed, unb, nd, d); 211012027Sjungma@eit.uni-kl.de cmp_res = vec_skip_and_cmp(nd, d, vnd, vd); 211112027Sjungma@eit.uni-kl.de 211212027Sjungma@eit.uni-kl.de } 211312027Sjungma@eit.uni-kl.de else { 211412027Sjungma@eit.uni-kl.de 211512027Sjungma@eit.uni-kl.de vec_copy(nd, d, vd); 211612027Sjungma@eit.uni-kl.de vec_complement(nd, d); 211712027Sjungma@eit.uni-kl.de trim(if_v_signed, vnb, nd, d); 211812027Sjungma@eit.uni-kl.de cmp_res = vec_skip_and_cmp(und, ud, nd, d); 211912027Sjungma@eit.uni-kl.de 212012027Sjungma@eit.uni-kl.de } 212112027Sjungma@eit.uni-kl.de 212212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 212312027Sjungma@eit.uni-kl.de delete [] d; 212412027Sjungma@eit.uni-kl.de#endif 212512027Sjungma@eit.uni-kl.de 212612027Sjungma@eit.uni-kl.de return cmp_res; 212712027Sjungma@eit.uni-kl.de 212812027Sjungma@eit.uni-kl.de } 212912027Sjungma@eit.uni-kl.de} 213012027Sjungma@eit.uni-kl.de 213112027Sjungma@eit.uni-kl.de 213212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 213312027Sjungma@eit.uni-kl.de// SECTION: Public members - Other utils. 213412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 213512027Sjungma@eit.uni-kl.de 213612027Sjungma@eit.uni-kl.debool 213712027Sjungma@eit.uni-kl.desc_unsigned::iszero() const 213812027Sjungma@eit.uni-kl.de{ 213912027Sjungma@eit.uni-kl.de if (sgn == SC_ZERO) 214012027Sjungma@eit.uni-kl.de return true; 214112027Sjungma@eit.uni-kl.de 214212027Sjungma@eit.uni-kl.de else if (sgn == SC_NEG) { 214312027Sjungma@eit.uni-kl.de 214412027Sjungma@eit.uni-kl.de // A negative unsigned number can be zero, e.g., -16 in 4 bits, so 214512027Sjungma@eit.uni-kl.de // check that. 214612027Sjungma@eit.uni-kl.de 214712027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 214812027Sjungma@eit.uni-kl.de sc_digit d[MAX_NDIGITS]; 214912027Sjungma@eit.uni-kl.de#else 215012027Sjungma@eit.uni-kl.de sc_digit *d = new sc_digit[ndigits]; 215112027Sjungma@eit.uni-kl.de#endif 215212027Sjungma@eit.uni-kl.de 215312027Sjungma@eit.uni-kl.de vec_copy(ndigits, d, digit); 215412027Sjungma@eit.uni-kl.de vec_complement(ndigits, d); 215512027Sjungma@eit.uni-kl.de trim_unsigned(nbits, ndigits, d); 215612027Sjungma@eit.uni-kl.de 215712027Sjungma@eit.uni-kl.de bool res = check_for_zero(ndigits, d); 215812027Sjungma@eit.uni-kl.de 215912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS 216012027Sjungma@eit.uni-kl.de delete [] d; 216112027Sjungma@eit.uni-kl.de#endif 216212027Sjungma@eit.uni-kl.de 216312027Sjungma@eit.uni-kl.de return res; 216412027Sjungma@eit.uni-kl.de 216512027Sjungma@eit.uni-kl.de } 216612027Sjungma@eit.uni-kl.de else 216712027Sjungma@eit.uni-kl.de return false; 216812027Sjungma@eit.uni-kl.de} 216912027Sjungma@eit.uni-kl.de 217012027Sjungma@eit.uni-kl.de// The rest of the utils in this section are included from sc_nbcommon.cpp. 217112027Sjungma@eit.uni-kl.de 217212027Sjungma@eit.uni-kl.de 217312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 217412027Sjungma@eit.uni-kl.de// SECTION: Private members. 217512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 217612027Sjungma@eit.uni-kl.de 217712027Sjungma@eit.uni-kl.de// The private members in this section are included from 217812027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp. 217912027Sjungma@eit.uni-kl.de 218012027Sjungma@eit.uni-kl.de#define CLASS_TYPE sc_unsigned 218112027Sjungma@eit.uni-kl.de#define CLASS_TYPE_STR "sc_unsigned" 218212027Sjungma@eit.uni-kl.de 218312027Sjungma@eit.uni-kl.de#define ADD_HELPER add_unsigned_friend 218412027Sjungma@eit.uni-kl.de#define SUB_HELPER sub_unsigned_friend 218512027Sjungma@eit.uni-kl.de#define MUL_HELPER mul_unsigned_friend 218612027Sjungma@eit.uni-kl.de#define DIV_HELPER div_unsigned_friend 218712027Sjungma@eit.uni-kl.de#define MOD_HELPER mod_unsigned_friend 218812027Sjungma@eit.uni-kl.de#define AND_HELPER and_unsigned_friend 218912027Sjungma@eit.uni-kl.de#define OR_HELPER or_unsigned_friend 219012027Sjungma@eit.uni-kl.de#define XOR_HELPER xor_unsigned_friend 219112027Sjungma@eit.uni-kl.de 219212027Sjungma@eit.uni-kl.de#include "sc_nbfriends.inc" 219312027Sjungma@eit.uni-kl.de 219412027Sjungma@eit.uni-kl.de#undef SC_SIGNED 219512027Sjungma@eit.uni-kl.de#define SC_UNSIGNED 219612027Sjungma@eit.uni-kl.de#define IF_SC_SIGNED 0 // 0 = sc_unsigned 219712027Sjungma@eit.uni-kl.de#define CLASS_TYPE_SUBREF sc_unsigned_subref_r 219812027Sjungma@eit.uni-kl.de#define OTHER_CLASS_TYPE sc_signed 219912027Sjungma@eit.uni-kl.de#define OTHER_CLASS_TYPE_SUBREF sc_signed_subref_r 220012027Sjungma@eit.uni-kl.de 220112027Sjungma@eit.uni-kl.de#define MUL_ON_HELPER mul_on_help_unsigned 220212027Sjungma@eit.uni-kl.de#define DIV_ON_HELPER div_on_help_unsigned 220312027Sjungma@eit.uni-kl.de#define MOD_ON_HELPER mod_on_help_unsigned 220412027Sjungma@eit.uni-kl.de 220512027Sjungma@eit.uni-kl.de#include "sc_nbcommon.inc" 220612027Sjungma@eit.uni-kl.de 220712027Sjungma@eit.uni-kl.de#undef MOD_ON_HELPER 220812027Sjungma@eit.uni-kl.de#undef DIV_ON_HELPER 220912027Sjungma@eit.uni-kl.de#undef MUL_ON_HELPER 221012027Sjungma@eit.uni-kl.de 221112027Sjungma@eit.uni-kl.de#undef OTHER_CLASS_TYPE_SUBREF 221212027Sjungma@eit.uni-kl.de#undef OTHER_CLASS_TYPE 221312027Sjungma@eit.uni-kl.de#undef CLASS_TYPE_SUBREF 221412027Sjungma@eit.uni-kl.de#undef IF_SC_SIGNED 221512027Sjungma@eit.uni-kl.de#undef SC_UNSIGNED 221612027Sjungma@eit.uni-kl.de 221712027Sjungma@eit.uni-kl.de#undef XOR_HELPER 221812027Sjungma@eit.uni-kl.de#undef OR_HELPER 221912027Sjungma@eit.uni-kl.de#undef AND_HELPER 222012027Sjungma@eit.uni-kl.de#undef MOD_HELPER 222112027Sjungma@eit.uni-kl.de#undef DIV_HELPER 222212027Sjungma@eit.uni-kl.de#undef MUL_HELPER 222312027Sjungma@eit.uni-kl.de#undef SUB_HELPER 222412027Sjungma@eit.uni-kl.de#undef ADD_HELPER 222512027Sjungma@eit.uni-kl.de 222612027Sjungma@eit.uni-kl.de#undef CLASS_TYPE 222712027Sjungma@eit.uni-kl.de#undef CLASS_TYPE_STR 222812027Sjungma@eit.uni-kl.de 222912027Sjungma@eit.uni-kl.de#include "sc_unsigned_bitref.inc" 223012027Sjungma@eit.uni-kl.de#include "sc_unsigned_subref.inc" 223112027Sjungma@eit.uni-kl.de 223212027Sjungma@eit.uni-kl.de#undef CONVERT_LONG 223312027Sjungma@eit.uni-kl.de#undef CONVERT_LONG_2 223412027Sjungma@eit.uni-kl.de#undef CONVERT_INT64 223512027Sjungma@eit.uni-kl.de#undef CONVERT_INT64_2 223612027Sjungma@eit.uni-kl.de 223712027Sjungma@eit.uni-kl.de} // namespace sc_dt 223812027Sjungma@eit.uni-kl.de 223912027Sjungma@eit.uni-kl.de 224012027Sjungma@eit.uni-kl.de// End of file. 2241