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_nbcommon.cpp -- Functions common to both sc_signed and sc_unsigned.
2312027Sjungma@eit.uni-kl.de                     This file is included in sc_signed.cpp and
2412027Sjungma@eit.uni-kl.de                     sc_unsigned.cpp after the macros are defined accordingly.
2512027Sjungma@eit.uni-kl.de                     For example, sc_signed.cpp will first define CLASS_TYPE
2612027Sjungma@eit.uni-kl.de                     as sc_signed before including this file. This file like
2712027Sjungma@eit.uni-kl.de                     sc_nbfriends.cpp and sc_nbexterns.cpp is created in order
2812027Sjungma@eit.uni-kl.de                     to ensure only one version of each function, regardless
2912027Sjungma@eit.uni-kl.de                     of the class that they interface to.
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// ----------------------------------------------------------------------------
4712027Sjungma@eit.uni-kl.de//  SECTION : Public members
4812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.de// Create a CLASS_TYPE number with nb bits.
5112027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE( int nb ) :
5212027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(), nbits(), ndigits(), digit()
5312027Sjungma@eit.uni-kl.de{
5412027Sjungma@eit.uni-kl.de    sgn = default_sign();
5512027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
5612027Sjungma@eit.uni-kl.de	nbits = num_bits( nb );
5712027Sjungma@eit.uni-kl.de    } else {
5812027Sjungma@eit.uni-kl.de	char msg[BUFSIZ];
5912027Sjungma@eit.uni-kl.de	std::sprintf( msg, "%s::%s( int nb ) : nb = %d is not valid",
6012027Sjungma@eit.uni-kl.de		 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
6112027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
6212027Sjungma@eit.uni-kl.de    }
6312027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
6412027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
6512027Sjungma@eit.uni-kl.de    test_bound(nb);
6612027Sjungma@eit.uni-kl.de#else
6712027Sjungma@eit.uni-kl.de    digit = new sc_digit[ndigits];
6812027Sjungma@eit.uni-kl.de#endif
6912027Sjungma@eit.uni-kl.de    makezero();
7012027Sjungma@eit.uni-kl.de}
7112027Sjungma@eit.uni-kl.de
7212027Sjungma@eit.uni-kl.de
7312027Sjungma@eit.uni-kl.de// Create a copy of v with sgn s. v is of the same type.
7412027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE& v) :
7512027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(v.sgn), nbits(v.nbits), ndigits(v.ndigits), digit()
7612027Sjungma@eit.uni-kl.de{
7712027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
7812027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
7912027Sjungma@eit.uni-kl.de#endif
8012027Sjungma@eit.uni-kl.de
8112027Sjungma@eit.uni-kl.de  vec_copy(ndigits, digit, v.digit);
8212027Sjungma@eit.uni-kl.de}
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.de
8512027Sjungma@eit.uni-kl.de// Create a copy of v where v is of the different type.
8612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE& v) :
8712027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(v.sgn), nbits(num_bits(v.nbits)), ndigits(), digit()
8812027Sjungma@eit.uni-kl.de{
8912027Sjungma@eit.uni-kl.de#if (IF_SC_SIGNED == 1)
9012027Sjungma@eit.uni-kl.de  ndigits = v.ndigits;
9112027Sjungma@eit.uni-kl.de#else
9212027Sjungma@eit.uni-kl.de  ndigits = DIV_CEIL(nbits);
9312027Sjungma@eit.uni-kl.de#endif
9412027Sjungma@eit.uni-kl.de
9512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
9612027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
9712027Sjungma@eit.uni-kl.de#endif
9812027Sjungma@eit.uni-kl.de
9912027Sjungma@eit.uni-kl.de  copy_digits(v.nbits, v.ndigits, v.digit);
10012027Sjungma@eit.uni-kl.de}
10112027Sjungma@eit.uni-kl.de
10212027Sjungma@eit.uni-kl.de// Create a copy of v where v is an sign-less instance.
10312027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_bv_base& v) :
10412027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(), nbits(), ndigits(), digit()
10512027Sjungma@eit.uni-kl.de{
10612027Sjungma@eit.uni-kl.de    int nb = v.length();
10712027Sjungma@eit.uni-kl.de    sgn = default_sign();
10812027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
10912027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
11012027Sjungma@eit.uni-kl.de    } else {
11112027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
11212027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_bv_base ) : nb = %d is not valid",
11312027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
11412027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
11512027Sjungma@eit.uni-kl.de    }
11612027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
11712027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
11812027Sjungma@eit.uni-kl.de        test_bound(nb);
11912027Sjungma@eit.uni-kl.de#    else
12012027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
12112027Sjungma@eit.uni-kl.de#    endif
12212027Sjungma@eit.uni-kl.de    makezero();
12312027Sjungma@eit.uni-kl.de    *this = v;
12412027Sjungma@eit.uni-kl.de}
12512027Sjungma@eit.uni-kl.de
12612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_lv_base& v) :
12712027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(), nbits(), ndigits(), digit()
12812027Sjungma@eit.uni-kl.de{
12912027Sjungma@eit.uni-kl.de    int nb = v.length();
13012027Sjungma@eit.uni-kl.de    sgn = default_sign();
13112027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
13212027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
13312027Sjungma@eit.uni-kl.de    } else {
13412027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
13512027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_lv_base ) : nb = %d is not valid",
13612027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
13712027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
13812027Sjungma@eit.uni-kl.de    }
13912027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
14012027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
14112027Sjungma@eit.uni-kl.de        test_bound(nb);
14212027Sjungma@eit.uni-kl.de#    else
14312027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
14412027Sjungma@eit.uni-kl.de#    endif
14512027Sjungma@eit.uni-kl.de    makezero();
14612027Sjungma@eit.uni-kl.de    *this = v;
14712027Sjungma@eit.uni-kl.de}
14812027Sjungma@eit.uni-kl.de
14912027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_int_subref_r& v) :
15012027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(), nbits(), ndigits(), digit()
15112027Sjungma@eit.uni-kl.de{
15212027Sjungma@eit.uni-kl.de    int nb = v.length();
15312027Sjungma@eit.uni-kl.de    sgn = default_sign();
15412027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
15512027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
15612027Sjungma@eit.uni-kl.de    } else {
15712027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
15812027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_int_subref ) : nb = %d is not valid",
15912027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
16012027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
16112027Sjungma@eit.uni-kl.de    }
16212027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
16312027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
16412027Sjungma@eit.uni-kl.de        test_bound(nb);
16512027Sjungma@eit.uni-kl.de#    else
16612027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
16712027Sjungma@eit.uni-kl.de#    endif
16812027Sjungma@eit.uni-kl.de    makezero();
16912027Sjungma@eit.uni-kl.de    *this = v.to_uint64();
17012027Sjungma@eit.uni-kl.de}
17112027Sjungma@eit.uni-kl.de
17212027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_uint_subref_r& v) :
17312027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(), nbits(), ndigits(), digit()
17412027Sjungma@eit.uni-kl.de{
17512027Sjungma@eit.uni-kl.de    int nb = v.length();
17612027Sjungma@eit.uni-kl.de    sgn = default_sign();
17712027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
17812027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
17912027Sjungma@eit.uni-kl.de    } else {
18012027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
18112027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_uint_subref ) : nb = %d is not valid",
18212027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
18312027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
18412027Sjungma@eit.uni-kl.de    }
18512027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
18612027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
18712027Sjungma@eit.uni-kl.de        test_bound(nb);
18812027Sjungma@eit.uni-kl.de#    else
18912027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
19012027Sjungma@eit.uni-kl.de#    endif
19112027Sjungma@eit.uni-kl.de    makezero();
19212027Sjungma@eit.uni-kl.de    *this = v.to_uint64();
19312027Sjungma@eit.uni-kl.de}
19412027Sjungma@eit.uni-kl.de
19512027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_signed_subref_r& v) :
19612027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(), nbits(), ndigits(), digit()
19712027Sjungma@eit.uni-kl.de{
19812027Sjungma@eit.uni-kl.de    int nb = v.length();
19912027Sjungma@eit.uni-kl.de    sgn = default_sign();
20012027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
20112027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
20212027Sjungma@eit.uni-kl.de    } else {
20312027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
20412027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_signed_subref ) : nb = %d is not valid",
20512027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
20612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
20712027Sjungma@eit.uni-kl.de    }
20812027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
20912027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
21012027Sjungma@eit.uni-kl.de        test_bound(nb);
21112027Sjungma@eit.uni-kl.de#    else
21212027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
21312027Sjungma@eit.uni-kl.de#    endif
21412027Sjungma@eit.uni-kl.de    makezero();
21512027Sjungma@eit.uni-kl.de    *this = sc_unsigned(v.m_obj_p, v.m_left, v.m_right);
21612027Sjungma@eit.uni-kl.de}
21712027Sjungma@eit.uni-kl.de
21812027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const sc_unsigned_subref_r& v) :
21912027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(), nbits(), ndigits(), digit()
22012027Sjungma@eit.uni-kl.de{
22112027Sjungma@eit.uni-kl.de    int nb = v.length();
22212027Sjungma@eit.uni-kl.de    sgn = default_sign();
22312027Sjungma@eit.uni-kl.de    if( nb > 0 ) {
22412027Sjungma@eit.uni-kl.de        nbits = num_bits( nb );
22512027Sjungma@eit.uni-kl.de    } else {
22612027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
22712027Sjungma@eit.uni-kl.de        std::sprintf( msg, "%s::%s( sc_unsigned_subref ) : nb = %d is not valid",
22812027Sjungma@eit.uni-kl.de                 CLASS_TYPE_STR, CLASS_TYPE_STR, nb );
22912027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
23012027Sjungma@eit.uni-kl.de    }
23112027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL(nbits);
23212027Sjungma@eit.uni-kl.de#   ifdef SC_MAX_NBITS
23312027Sjungma@eit.uni-kl.de        test_bound(nb);
23412027Sjungma@eit.uni-kl.de#    else
23512027Sjungma@eit.uni-kl.de        digit = new sc_digit[ndigits];
23612027Sjungma@eit.uni-kl.de#    endif
23712027Sjungma@eit.uni-kl.de    makezero();
23812027Sjungma@eit.uni-kl.de    *this = sc_unsigned(v.m_obj_p, v.m_left, v.m_right);
23912027Sjungma@eit.uni-kl.de}
24012027Sjungma@eit.uni-kl.de
24112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
24212027Sjungma@eit.uni-kl.de//  SECTION: Public members - Concatenation support.
24312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
24412027Sjungma@eit.uni-kl.de
24512027Sjungma@eit.uni-kl.de
24612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
24712027Sjungma@eit.uni-kl.de//  SECTION: Public members - Assignment operators.
24812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
24912027Sjungma@eit.uni-kl.de
25012027Sjungma@eit.uni-kl.de// Assignment from v of the same type.
25112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
25212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const CLASS_TYPE& v)
25312027Sjungma@eit.uni-kl.de{
25412027Sjungma@eit.uni-kl.de  if (this != &v) {
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de    sgn = v.sgn;
25712027Sjungma@eit.uni-kl.de
25812027Sjungma@eit.uni-kl.de    if (sgn == SC_ZERO)
25912027Sjungma@eit.uni-kl.de      vec_zero(ndigits, digit);
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de    else
26212027Sjungma@eit.uni-kl.de      copy_digits(v.nbits, v.ndigits, v.digit);
26312027Sjungma@eit.uni-kl.de
26412027Sjungma@eit.uni-kl.de  }
26512027Sjungma@eit.uni-kl.de
26612027Sjungma@eit.uni-kl.de  return *this;
26712027Sjungma@eit.uni-kl.de}
26812027Sjungma@eit.uni-kl.de
26912027Sjungma@eit.uni-kl.de
27012027Sjungma@eit.uni-kl.de// Assignment from v of the different type.
27112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
27212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const OTHER_CLASS_TYPE& v)
27312027Sjungma@eit.uni-kl.de{
27412027Sjungma@eit.uni-kl.de  sgn = v.sgn;
27512027Sjungma@eit.uni-kl.de
27612027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
27712027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
27812027Sjungma@eit.uni-kl.de
27912027Sjungma@eit.uni-kl.de  else
28012027Sjungma@eit.uni-kl.de    copy_digits(v.nbits, v.ndigits, v.digit);
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de  return *this;
28312027Sjungma@eit.uni-kl.de}
28412027Sjungma@eit.uni-kl.de
28512027Sjungma@eit.uni-kl.de
28612027Sjungma@eit.uni-kl.de// Assignment from an sc_unsigned_subref_r
28712027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
28812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const sc_unsigned_subref_r& v)
28912027Sjungma@eit.uni-kl.de{
29012027Sjungma@eit.uni-kl.de  return operator=(sc_unsigned(v));
29112027Sjungma@eit.uni-kl.de}
29212027Sjungma@eit.uni-kl.de
29312027Sjungma@eit.uni-kl.de
29412027Sjungma@eit.uni-kl.de// Assignment from an sc_signed_subref_r
29512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
29612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator=(const sc_signed_subref_r& v)
29712027Sjungma@eit.uni-kl.de{
29812027Sjungma@eit.uni-kl.de  return operator=(sc_unsigned(v));
29912027Sjungma@eit.uni-kl.de}
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de
30212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
30312027Sjungma@eit.uni-kl.de//  SECTION: Input and output operators
30412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
30512027Sjungma@eit.uni-kl.de
30612027Sjungma@eit.uni-kl.devoid
30712027Sjungma@eit.uni-kl.deCLASS_TYPE::scan( ::std::istream& is )
30812027Sjungma@eit.uni-kl.de{
30912027Sjungma@eit.uni-kl.de    std::string s;
31012027Sjungma@eit.uni-kl.de    is >> s;
31112027Sjungma@eit.uni-kl.de    *this = s.c_str();
31212027Sjungma@eit.uni-kl.de}
31312027Sjungma@eit.uni-kl.de
31412027Sjungma@eit.uni-kl.de
31512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31612027Sjungma@eit.uni-kl.de//  SECTION: PLUS operators: +, +=, ++
31712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31812027Sjungma@eit.uni-kl.de
31912027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v:
32012027Sjungma@eit.uni-kl.de// 1. 0 + v = v
32112027Sjungma@eit.uni-kl.de// 2. u + 0 = u
32212027Sjungma@eit.uni-kl.de// 3. if sgn(u) == sgn(v)
32312027Sjungma@eit.uni-kl.de//    3.1 u + v = +(u + v) = sgn(u) * (u + v)
32412027Sjungma@eit.uni-kl.de//    3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
32512027Sjungma@eit.uni-kl.de// 4. if sgn(u) != sgn(v)
32612027Sjungma@eit.uni-kl.de//    4.1 u + (-v) = u - v = sgn(u) * (u - v)
32712027Sjungma@eit.uni-kl.de//    4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
32812027Sjungma@eit.uni-kl.de//
32912027Sjungma@eit.uni-kl.de// Specialization of above cases for computing ++u or u++:
33012027Sjungma@eit.uni-kl.de// 1. 0 + 1 = 1
33112027Sjungma@eit.uni-kl.de// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
33212027Sjungma@eit.uni-kl.de// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
33512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(const CLASS_TYPE& v)
33612027Sjungma@eit.uni-kl.de{
33712027Sjungma@eit.uni-kl.de  // u = *this
33812027Sjungma@eit.uni-kl.de
33912027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
34012027Sjungma@eit.uni-kl.de    return (*this = v);
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO) // case 2
34312027Sjungma@eit.uni-kl.de    return *this;
34412027Sjungma@eit.uni-kl.de
34512027Sjungma@eit.uni-kl.de  // cases 3 and 4
34612027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
34712027Sjungma@eit.uni-kl.de              v.sgn, v.nbits, v.ndigits, v.digit);
34812027Sjungma@eit.uni-kl.de
34912027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
35012027Sjungma@eit.uni-kl.de
35112027Sjungma@eit.uni-kl.de  return *this;
35212027Sjungma@eit.uni-kl.de}
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de
35512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
35612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(const OTHER_CLASS_TYPE& v)
35712027Sjungma@eit.uni-kl.de{
35812027Sjungma@eit.uni-kl.de  // u = *this
35912027Sjungma@eit.uni-kl.de
36012027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
36112027Sjungma@eit.uni-kl.de    return (*this = v);
36212027Sjungma@eit.uni-kl.de
36312027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO) // case 2
36412027Sjungma@eit.uni-kl.de    return *this;
36512027Sjungma@eit.uni-kl.de
36612027Sjungma@eit.uni-kl.de  // cases 3 and 4
36712027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
36812027Sjungma@eit.uni-kl.de              v.sgn, v.nbits, v.ndigits, v.digit);
36912027Sjungma@eit.uni-kl.de
37012027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
37112027Sjungma@eit.uni-kl.de
37212027Sjungma@eit.uni-kl.de  return *this;
37312027Sjungma@eit.uni-kl.de}
37412027Sjungma@eit.uni-kl.de
37512027Sjungma@eit.uni-kl.de
37612027Sjungma@eit.uni-kl.deCLASS_TYPE&
37712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator++() // prefix
37812027Sjungma@eit.uni-kl.de{
37912027Sjungma@eit.uni-kl.de    *this = *this + 1;
38012027Sjungma@eit.uni-kl.de    return *this;
38112027Sjungma@eit.uni-kl.de}
38212027Sjungma@eit.uni-kl.de
38312027Sjungma@eit.uni-kl.de
38412027Sjungma@eit.uni-kl.deconst CLASS_TYPE
38512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator++(int) // postfix
38612027Sjungma@eit.uni-kl.de{
38712027Sjungma@eit.uni-kl.de  // Copy digit into d.
38812027Sjungma@eit.uni-kl.de
38912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
39012027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
39112027Sjungma@eit.uni-kl.de#else
39212027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[ndigits];
39312027Sjungma@eit.uni-kl.de#endif
39412027Sjungma@eit.uni-kl.de
39512027Sjungma@eit.uni-kl.de  small_type s = sgn;
39612027Sjungma@eit.uni-kl.de
39712027Sjungma@eit.uni-kl.de  vec_copy(ndigits, d, digit);
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de  *this = *this + 1;
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de  return CLASS_TYPE(s, nbits, ndigits, d);
40212027Sjungma@eit.uni-kl.de}
40312027Sjungma@eit.uni-kl.de
40412027Sjungma@eit.uni-kl.de
40512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
40612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(int64 v)
40712027Sjungma@eit.uni-kl.de{
40812027Sjungma@eit.uni-kl.de  // u = *this
40912027Sjungma@eit.uni-kl.de
41012027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 1
41112027Sjungma@eit.uni-kl.de    return (*this = v);
41212027Sjungma@eit.uni-kl.de
41312027Sjungma@eit.uni-kl.de  if (v == 0) // case 2
41412027Sjungma@eit.uni-kl.de    return *this;
41512027Sjungma@eit.uni-kl.de
41612027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de  // cases 3 and 4
41912027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
42012027Sjungma@eit.uni-kl.de              vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
42312027Sjungma@eit.uni-kl.de
42412027Sjungma@eit.uni-kl.de  return *this;
42512027Sjungma@eit.uni-kl.de}
42612027Sjungma@eit.uni-kl.de
42712027Sjungma@eit.uni-kl.de
42812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
42912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(uint64 v)
43012027Sjungma@eit.uni-kl.de{
43112027Sjungma@eit.uni-kl.de  // u = *this
43212027Sjungma@eit.uni-kl.de
43312027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 1
43412027Sjungma@eit.uni-kl.de    return (*this = v);
43512027Sjungma@eit.uni-kl.de
43612027Sjungma@eit.uni-kl.de  if (v == 0)  // case 2
43712027Sjungma@eit.uni-kl.de    return *this;
43812027Sjungma@eit.uni-kl.de
43912027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
44012027Sjungma@eit.uni-kl.de
44112027Sjungma@eit.uni-kl.de  // cases 3 and 4
44212027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
44312027Sjungma@eit.uni-kl.de              vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
44412027Sjungma@eit.uni-kl.de
44512027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
44612027Sjungma@eit.uni-kl.de
44712027Sjungma@eit.uni-kl.de  return *this;
44812027Sjungma@eit.uni-kl.de}
44912027Sjungma@eit.uni-kl.de
45012027Sjungma@eit.uni-kl.de
45112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
45212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(long v)
45312027Sjungma@eit.uni-kl.de{
45412027Sjungma@eit.uni-kl.de  // u = *this
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 1
45712027Sjungma@eit.uni-kl.de    return (*this = v);
45812027Sjungma@eit.uni-kl.de
45912027Sjungma@eit.uni-kl.de  if (v == 0) // case 2
46012027Sjungma@eit.uni-kl.de    return *this;
46112027Sjungma@eit.uni-kl.de
46212027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
46312027Sjungma@eit.uni-kl.de
46412027Sjungma@eit.uni-kl.de  // cases 3 and 4
46512027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
46612027Sjungma@eit.uni-kl.de              vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
46712027Sjungma@eit.uni-kl.de
46812027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
46912027Sjungma@eit.uni-kl.de
47012027Sjungma@eit.uni-kl.de  return *this;
47112027Sjungma@eit.uni-kl.de}
47212027Sjungma@eit.uni-kl.de
47312027Sjungma@eit.uni-kl.de
47412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
47512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator+=(unsigned long v)
47612027Sjungma@eit.uni-kl.de{
47712027Sjungma@eit.uni-kl.de  // u = *this
47812027Sjungma@eit.uni-kl.de
47912027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 1
48012027Sjungma@eit.uni-kl.de    return (*this = v);
48112027Sjungma@eit.uni-kl.de
48212027Sjungma@eit.uni-kl.de  if (v == 0)  // case 2
48312027Sjungma@eit.uni-kl.de    return *this;
48412027Sjungma@eit.uni-kl.de
48512027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de  // cases 3 and 4
48812027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
48912027Sjungma@eit.uni-kl.de              vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
49012027Sjungma@eit.uni-kl.de
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.de
49712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
49812027Sjungma@eit.uni-kl.de//  SECTION: MINUS operators: -, -=, --
49912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
50012027Sjungma@eit.uni-kl.de
50112027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v:
50212027Sjungma@eit.uni-kl.de// 1. u - 0 = u
50312027Sjungma@eit.uni-kl.de// 2. 0 - v = -v
50412027Sjungma@eit.uni-kl.de// 3. if sgn(u) != sgn(v)
50512027Sjungma@eit.uni-kl.de//    3.1 u - (-v) = u + v = sgn(u) * (u + v)
50612027Sjungma@eit.uni-kl.de//    3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
50712027Sjungma@eit.uni-kl.de// 4. if sgn(u) == sgn(v)
50812027Sjungma@eit.uni-kl.de//    4.1 u - v = +(u - v) = sgn(u) * (u - v)
50912027Sjungma@eit.uni-kl.de//    4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
51012027Sjungma@eit.uni-kl.de//
51112027Sjungma@eit.uni-kl.de// Specialization of above cases for computing --u or u--:
51212027Sjungma@eit.uni-kl.de// 1. 0 - 1 = -1
51312027Sjungma@eit.uni-kl.de// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
51412027Sjungma@eit.uni-kl.de// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
51512027Sjungma@eit.uni-kl.de
51612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
51712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(const CLASS_TYPE& v)
51812027Sjungma@eit.uni-kl.de{
51912027Sjungma@eit.uni-kl.de  // u = *this
52012027Sjungma@eit.uni-kl.de
52112027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
52212027Sjungma@eit.uni-kl.de    return *this;
52312027Sjungma@eit.uni-kl.de
52412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) { // case 2
52512027Sjungma@eit.uni-kl.de
52612027Sjungma@eit.uni-kl.de    sgn = -v.sgn;
52712027Sjungma@eit.uni-kl.de    copy_digits(v.nbits, v.ndigits, v.digit);
52812027Sjungma@eit.uni-kl.de
52912027Sjungma@eit.uni-kl.de  }
53012027Sjungma@eit.uni-kl.de  else {
53112027Sjungma@eit.uni-kl.de
53212027Sjungma@eit.uni-kl.de    // cases 3 and 4
53312027Sjungma@eit.uni-kl.de    add_on_help(sgn, nbits, ndigits, digit,
53412027Sjungma@eit.uni-kl.de                -v.sgn, v.nbits, v.ndigits, v.digit);
53512027Sjungma@eit.uni-kl.de
53612027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
53712027Sjungma@eit.uni-kl.de
53812027Sjungma@eit.uni-kl.de  }
53912027Sjungma@eit.uni-kl.de
54012027Sjungma@eit.uni-kl.de  return *this;
54112027Sjungma@eit.uni-kl.de}
54212027Sjungma@eit.uni-kl.de
54312027Sjungma@eit.uni-kl.de
54412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
54512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(const OTHER_CLASS_TYPE& v)
54612027Sjungma@eit.uni-kl.de{
54712027Sjungma@eit.uni-kl.de  // u = *this
54812027Sjungma@eit.uni-kl.de
54912027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
55012027Sjungma@eit.uni-kl.de    return *this;
55112027Sjungma@eit.uni-kl.de
55212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) { // case 2
55312027Sjungma@eit.uni-kl.de
55412027Sjungma@eit.uni-kl.de    sgn = -v.sgn;
55512027Sjungma@eit.uni-kl.de    copy_digits(v.nbits, v.ndigits, v.digit);
55612027Sjungma@eit.uni-kl.de
55712027Sjungma@eit.uni-kl.de  }
55812027Sjungma@eit.uni-kl.de  else {
55912027Sjungma@eit.uni-kl.de
56012027Sjungma@eit.uni-kl.de    // cases 3 and 4
56112027Sjungma@eit.uni-kl.de    add_on_help(sgn, nbits, ndigits, digit,
56212027Sjungma@eit.uni-kl.de                -v.sgn, v.nbits, v.ndigits, v.digit);
56312027Sjungma@eit.uni-kl.de
56412027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
56512027Sjungma@eit.uni-kl.de
56612027Sjungma@eit.uni-kl.de  }
56712027Sjungma@eit.uni-kl.de
56812027Sjungma@eit.uni-kl.de  return *this;
56912027Sjungma@eit.uni-kl.de}
57012027Sjungma@eit.uni-kl.de
57112027Sjungma@eit.uni-kl.de
57212027Sjungma@eit.uni-kl.deCLASS_TYPE&
57312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator--() // prefix
57412027Sjungma@eit.uni-kl.de{
57512027Sjungma@eit.uni-kl.de    *this = *this - 1;
57612027Sjungma@eit.uni-kl.de    return *this;
57712027Sjungma@eit.uni-kl.de}
57812027Sjungma@eit.uni-kl.de
57912027Sjungma@eit.uni-kl.de
58012027Sjungma@eit.uni-kl.deconst CLASS_TYPE
58112027Sjungma@eit.uni-kl.deCLASS_TYPE::operator--(int) // postfix
58212027Sjungma@eit.uni-kl.de{
58312027Sjungma@eit.uni-kl.de  // Copy digit into d.
58412027Sjungma@eit.uni-kl.de
58512027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
58612027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
58712027Sjungma@eit.uni-kl.de#else
58812027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[ndigits];
58912027Sjungma@eit.uni-kl.de#endif
59012027Sjungma@eit.uni-kl.de
59112027Sjungma@eit.uni-kl.de  small_type s = sgn;
59212027Sjungma@eit.uni-kl.de
59312027Sjungma@eit.uni-kl.de  vec_copy(ndigits, d, digit);
59412027Sjungma@eit.uni-kl.de
59512027Sjungma@eit.uni-kl.de  *this = *this - 1;
59612027Sjungma@eit.uni-kl.de
59712027Sjungma@eit.uni-kl.de  return CLASS_TYPE(s, nbits, ndigits, d);
59812027Sjungma@eit.uni-kl.de}
59912027Sjungma@eit.uni-kl.de
60012027Sjungma@eit.uni-kl.de
60112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
60212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(int64 v)
60312027Sjungma@eit.uni-kl.de{
60412027Sjungma@eit.uni-kl.de  // u = *this
60512027Sjungma@eit.uni-kl.de
60612027Sjungma@eit.uni-kl.de  if (v == 0) // case 1
60712027Sjungma@eit.uni-kl.de    return *this;
60812027Sjungma@eit.uni-kl.de
60912027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 2
61012027Sjungma@eit.uni-kl.de    return (*this = -v);
61112027Sjungma@eit.uni-kl.de
61212027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
61312027Sjungma@eit.uni-kl.de
61412027Sjungma@eit.uni-kl.de  // cases 3 and 4
61512027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
61612027Sjungma@eit.uni-kl.de              -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
61712027Sjungma@eit.uni-kl.de
61812027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
61912027Sjungma@eit.uni-kl.de
62012027Sjungma@eit.uni-kl.de  return *this;
62112027Sjungma@eit.uni-kl.de}
62212027Sjungma@eit.uni-kl.de
62312027Sjungma@eit.uni-kl.de
62412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
62512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(uint64 v)
62612027Sjungma@eit.uni-kl.de{
62712027Sjungma@eit.uni-kl.de  // u = *this
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.de  if (v == 0) // case 1
63012027Sjungma@eit.uni-kl.de    return *this;
63112027Sjungma@eit.uni-kl.de
63212027Sjungma@eit.uni-kl.de  int64 v2 = (int64) v;
63312027Sjungma@eit.uni-kl.de
63412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 2
63512027Sjungma@eit.uni-kl.de    return (*this = -v2);
63612027Sjungma@eit.uni-kl.de
63712027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
63812027Sjungma@eit.uni-kl.de
63912027Sjungma@eit.uni-kl.de  // cases 3 and 4
64012027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
64112027Sjungma@eit.uni-kl.de              -vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
64212027Sjungma@eit.uni-kl.de
64312027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
64412027Sjungma@eit.uni-kl.de
64512027Sjungma@eit.uni-kl.de  return *this;
64612027Sjungma@eit.uni-kl.de}
64712027Sjungma@eit.uni-kl.de
64812027Sjungma@eit.uni-kl.de
64912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
65012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(long v)
65112027Sjungma@eit.uni-kl.de{
65212027Sjungma@eit.uni-kl.de  // u = *this
65312027Sjungma@eit.uni-kl.de
65412027Sjungma@eit.uni-kl.de  if (v == 0) // case 1
65512027Sjungma@eit.uni-kl.de    return *this;
65612027Sjungma@eit.uni-kl.de
65712027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 2
65812027Sjungma@eit.uni-kl.de    return (*this = -v);
65912027Sjungma@eit.uni-kl.de
66012027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
66112027Sjungma@eit.uni-kl.de
66212027Sjungma@eit.uni-kl.de  // cases 3 and 4
66312027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
66412027Sjungma@eit.uni-kl.de              -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
66512027Sjungma@eit.uni-kl.de
66612027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
66712027Sjungma@eit.uni-kl.de
66812027Sjungma@eit.uni-kl.de  return *this;
66912027Sjungma@eit.uni-kl.de}
67012027Sjungma@eit.uni-kl.de
67112027Sjungma@eit.uni-kl.de
67212027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
67312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator-=(unsigned long v)
67412027Sjungma@eit.uni-kl.de{
67512027Sjungma@eit.uni-kl.de  // u = *this
67612027Sjungma@eit.uni-kl.de
67712027Sjungma@eit.uni-kl.de  if (v == 0) // case 1
67812027Sjungma@eit.uni-kl.de    return *this;
67912027Sjungma@eit.uni-kl.de
68012027Sjungma@eit.uni-kl.de  long v2 = (long) v;
68112027Sjungma@eit.uni-kl.de
68212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 2
68312027Sjungma@eit.uni-kl.de    return (*this = -v2);
68412027Sjungma@eit.uni-kl.de
68512027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
68612027Sjungma@eit.uni-kl.de
68712027Sjungma@eit.uni-kl.de  // cases 3 and 4
68812027Sjungma@eit.uni-kl.de  add_on_help(sgn, nbits, ndigits, digit,
68912027Sjungma@eit.uni-kl.de              -vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
69012027Sjungma@eit.uni-kl.de
69112027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
69212027Sjungma@eit.uni-kl.de
69312027Sjungma@eit.uni-kl.de  return *this;
69412027Sjungma@eit.uni-kl.de}
69512027Sjungma@eit.uni-kl.de
69612027Sjungma@eit.uni-kl.de
69712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
69812027Sjungma@eit.uni-kl.de//  SECTION: MULTIPLICATION operators: *, *=
69912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
70012027Sjungma@eit.uni-kl.de
70112027Sjungma@eit.uni-kl.de// Cases to consider when computing u * v:
70212027Sjungma@eit.uni-kl.de// 1. u * 0 = 0 * v = 0
70312027Sjungma@eit.uni-kl.de// 2. 1 * v = v and -1 * v = -v
70412027Sjungma@eit.uni-kl.de// 3. u * 1 = u and u * -1 = -u
70512027Sjungma@eit.uni-kl.de// 4. u * v = u * v
70612027Sjungma@eit.uni-kl.de
70712027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
70812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(const CLASS_TYPE& v)
70912027Sjungma@eit.uni-kl.de{
71012027Sjungma@eit.uni-kl.de  // u = *this
71112027Sjungma@eit.uni-kl.de
71212027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, v.sgn);
71312027Sjungma@eit.uni-kl.de
71412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
71512027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
71612027Sjungma@eit.uni-kl.de
71712027Sjungma@eit.uni-kl.de  else
71812027Sjungma@eit.uni-kl.de    // cases 2-4
71912027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
72012027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
72112027Sjungma@eit.uni-kl.de
72212027Sjungma@eit.uni-kl.de  return *this;
72312027Sjungma@eit.uni-kl.de}
72412027Sjungma@eit.uni-kl.de
72512027Sjungma@eit.uni-kl.de
72612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
72712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(const OTHER_CLASS_TYPE& v)
72812027Sjungma@eit.uni-kl.de{
72912027Sjungma@eit.uni-kl.de  // u = *this
73012027Sjungma@eit.uni-kl.de
73112027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, v.sgn);
73212027Sjungma@eit.uni-kl.de
73312027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
73412027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
73512027Sjungma@eit.uni-kl.de
73612027Sjungma@eit.uni-kl.de  else
73712027Sjungma@eit.uni-kl.de    // cases 2-4
73812027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
73912027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
74012027Sjungma@eit.uni-kl.de
74112027Sjungma@eit.uni-kl.de  return *this;
74212027Sjungma@eit.uni-kl.de}
74312027Sjungma@eit.uni-kl.de
74412027Sjungma@eit.uni-kl.de
74512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
74612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(int64 v)
74712027Sjungma@eit.uni-kl.de{
74812027Sjungma@eit.uni-kl.de  // u = *this
74912027Sjungma@eit.uni-kl.de
75012027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
75112027Sjungma@eit.uni-kl.de
75212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
75312027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
75412027Sjungma@eit.uni-kl.de
75512027Sjungma@eit.uni-kl.de  else {  // cases 2-4
75612027Sjungma@eit.uni-kl.de
75712027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
75812027Sjungma@eit.uni-kl.de
75912027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
76012027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
76112027Sjungma@eit.uni-kl.de
76212027Sjungma@eit.uni-kl.de  }
76312027Sjungma@eit.uni-kl.de
76412027Sjungma@eit.uni-kl.de  return *this;
76512027Sjungma@eit.uni-kl.de}
76612027Sjungma@eit.uni-kl.de
76712027Sjungma@eit.uni-kl.de
76812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
76912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(uint64 v)
77012027Sjungma@eit.uni-kl.de{
77112027Sjungma@eit.uni-kl.de  // u = *this
77212027Sjungma@eit.uni-kl.de
77312027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
77412027Sjungma@eit.uni-kl.de
77512027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
77612027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
77712027Sjungma@eit.uni-kl.de
77812027Sjungma@eit.uni-kl.de  else { // cases 2-4
77912027Sjungma@eit.uni-kl.de
78012027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
78112027Sjungma@eit.uni-kl.de
78212027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
78312027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
78412027Sjungma@eit.uni-kl.de
78512027Sjungma@eit.uni-kl.de  }
78612027Sjungma@eit.uni-kl.de
78712027Sjungma@eit.uni-kl.de  return *this;
78812027Sjungma@eit.uni-kl.de}
78912027Sjungma@eit.uni-kl.de
79012027Sjungma@eit.uni-kl.de
79112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
79212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(long v)
79312027Sjungma@eit.uni-kl.de{
79412027Sjungma@eit.uni-kl.de  // u = *this
79512027Sjungma@eit.uni-kl.de
79612027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
79712027Sjungma@eit.uni-kl.de
79812027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
79912027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
80012027Sjungma@eit.uni-kl.de
80112027Sjungma@eit.uni-kl.de  else {   // cases 2-4
80212027Sjungma@eit.uni-kl.de
80312027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
80412027Sjungma@eit.uni-kl.de
80512027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
80612027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
80712027Sjungma@eit.uni-kl.de
80812027Sjungma@eit.uni-kl.de  }
80912027Sjungma@eit.uni-kl.de
81012027Sjungma@eit.uni-kl.de  return *this;
81112027Sjungma@eit.uni-kl.de}
81212027Sjungma@eit.uni-kl.de
81312027Sjungma@eit.uni-kl.de
81412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
81512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator*=(unsigned long v)
81612027Sjungma@eit.uni-kl.de{
81712027Sjungma@eit.uni-kl.de  // u = *this
81812027Sjungma@eit.uni-kl.de
81912027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
82012027Sjungma@eit.uni-kl.de
82112027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) // case 1
82212027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
82312027Sjungma@eit.uni-kl.de
82412027Sjungma@eit.uni-kl.de  else {  // cases 2-4
82512027Sjungma@eit.uni-kl.de
82612027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
82712027Sjungma@eit.uni-kl.de
82812027Sjungma@eit.uni-kl.de    MUL_ON_HELPER(sgn,  nbits, ndigits, digit,
82912027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
83012027Sjungma@eit.uni-kl.de
83112027Sjungma@eit.uni-kl.de  }
83212027Sjungma@eit.uni-kl.de
83312027Sjungma@eit.uni-kl.de  return *this;
83412027Sjungma@eit.uni-kl.de}
83512027Sjungma@eit.uni-kl.de
83612027Sjungma@eit.uni-kl.de
83712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
83812027Sjungma@eit.uni-kl.de//  SECTION: DIVISION operators: /, /=
83912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
84012027Sjungma@eit.uni-kl.de
84112027Sjungma@eit.uni-kl.de// Cases to consider when finding the quotient q = floor(u/v):
84212027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q.
84312027Sjungma@eit.uni-kl.de// 1. 0 / 0 or u / 0 => error
84412027Sjungma@eit.uni-kl.de// 2. 0 / v => 0 = 0 * v + 0
84512027Sjungma@eit.uni-kl.de// 3. u / v && u = v => u = 1 * u + 0  - u or v can be 1 or -1
84612027Sjungma@eit.uni-kl.de// 4. u / v && u < v => u = 0 * v + u  - u can be 1 or -1
84712027Sjungma@eit.uni-kl.de// 5. u / v && u > v => u = q * v + r  - v can be 1 or -1
84812027Sjungma@eit.uni-kl.de
84912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
85012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(const CLASS_TYPE& v)
85112027Sjungma@eit.uni-kl.de{
85212027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, v.sgn);
85312027Sjungma@eit.uni-kl.de
85412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
85512027Sjungma@eit.uni-kl.de
85612027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn); // case 1
85712027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
85812027Sjungma@eit.uni-kl.de
85912027Sjungma@eit.uni-kl.de  }
86012027Sjungma@eit.uni-kl.de  else  // other cases
86112027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn, nbits, ndigits, digit,
86212027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
86312027Sjungma@eit.uni-kl.de
86412027Sjungma@eit.uni-kl.de  return *this;
86512027Sjungma@eit.uni-kl.de}
86612027Sjungma@eit.uni-kl.de
86712027Sjungma@eit.uni-kl.de
86812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
86912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(const OTHER_CLASS_TYPE& v)
87012027Sjungma@eit.uni-kl.de{
87112027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, v.sgn);
87212027Sjungma@eit.uni-kl.de
87312027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
87412027Sjungma@eit.uni-kl.de
87512027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn); // case 1
87612027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
87712027Sjungma@eit.uni-kl.de
87812027Sjungma@eit.uni-kl.de  }
87912027Sjungma@eit.uni-kl.de  else  // other cases
88012027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn, nbits, ndigits, digit,
88112027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
88212027Sjungma@eit.uni-kl.de
88312027Sjungma@eit.uni-kl.de  return *this;
88412027Sjungma@eit.uni-kl.de}
88512027Sjungma@eit.uni-kl.de
88612027Sjungma@eit.uni-kl.de
88712027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
88812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(int64 v)
88912027Sjungma@eit.uni-kl.de{
89012027Sjungma@eit.uni-kl.de  // u = *this
89112027Sjungma@eit.uni-kl.de
89212027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
89312027Sjungma@eit.uni-kl.de
89412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
89512027Sjungma@eit.uni-kl.de
89612027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
89712027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit); // case 2
89812027Sjungma@eit.uni-kl.de
89912027Sjungma@eit.uni-kl.de  }
90012027Sjungma@eit.uni-kl.de  else {
90112027Sjungma@eit.uni-kl.de
90212027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
90312027Sjungma@eit.uni-kl.de
90412027Sjungma@eit.uni-kl.de    // other cases
90512027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn, nbits, ndigits, digit,
90612027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
90712027Sjungma@eit.uni-kl.de
90812027Sjungma@eit.uni-kl.de  }
90912027Sjungma@eit.uni-kl.de
91012027Sjungma@eit.uni-kl.de  return *this;
91112027Sjungma@eit.uni-kl.de}
91212027Sjungma@eit.uni-kl.de
91312027Sjungma@eit.uni-kl.de
91412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
91512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(uint64 v)
91612027Sjungma@eit.uni-kl.de{
91712027Sjungma@eit.uni-kl.de  // u = *this
91812027Sjungma@eit.uni-kl.de
91912027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
92012027Sjungma@eit.uni-kl.de
92112027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
92212027Sjungma@eit.uni-kl.de
92312027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
92412027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
92512027Sjungma@eit.uni-kl.de
92612027Sjungma@eit.uni-kl.de  }
92712027Sjungma@eit.uni-kl.de  else {
92812027Sjungma@eit.uni-kl.de
92912027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
93012027Sjungma@eit.uni-kl.de
93112027Sjungma@eit.uni-kl.de    // other cases
93212027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn, nbits, ndigits, digit,
93312027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
93412027Sjungma@eit.uni-kl.de
93512027Sjungma@eit.uni-kl.de  }
93612027Sjungma@eit.uni-kl.de
93712027Sjungma@eit.uni-kl.de  return *this;
93812027Sjungma@eit.uni-kl.de}
93912027Sjungma@eit.uni-kl.de
94012027Sjungma@eit.uni-kl.de
94112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
94212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(long v)
94312027Sjungma@eit.uni-kl.de{
94412027Sjungma@eit.uni-kl.de  // u = *this
94512027Sjungma@eit.uni-kl.de
94612027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
94712027Sjungma@eit.uni-kl.de
94812027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
94912027Sjungma@eit.uni-kl.de
95012027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
95112027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit); // case 2
95212027Sjungma@eit.uni-kl.de
95312027Sjungma@eit.uni-kl.de  }
95412027Sjungma@eit.uni-kl.de  else {
95512027Sjungma@eit.uni-kl.de
95612027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
95712027Sjungma@eit.uni-kl.de
95812027Sjungma@eit.uni-kl.de    // other cases
95912027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn,  nbits, ndigits, digit,
96012027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
96112027Sjungma@eit.uni-kl.de
96212027Sjungma@eit.uni-kl.de  }
96312027Sjungma@eit.uni-kl.de
96412027Sjungma@eit.uni-kl.de  return *this;
96512027Sjungma@eit.uni-kl.de}
96612027Sjungma@eit.uni-kl.de
96712027Sjungma@eit.uni-kl.de
96812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
96912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator/=(unsigned long v)
97012027Sjungma@eit.uni-kl.de{
97112027Sjungma@eit.uni-kl.de  // u = *this
97212027Sjungma@eit.uni-kl.de
97312027Sjungma@eit.uni-kl.de  sgn = mul_signs(sgn, get_sign(v));
97412027Sjungma@eit.uni-kl.de
97512027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO) {
97612027Sjungma@eit.uni-kl.de
97712027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
97812027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
97912027Sjungma@eit.uni-kl.de
98012027Sjungma@eit.uni-kl.de  }
98112027Sjungma@eit.uni-kl.de  else {
98212027Sjungma@eit.uni-kl.de
98312027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
98412027Sjungma@eit.uni-kl.de
98512027Sjungma@eit.uni-kl.de    // other cases
98612027Sjungma@eit.uni-kl.de    DIV_ON_HELPER(sgn,  nbits, ndigits, digit,
98712027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
98812027Sjungma@eit.uni-kl.de
98912027Sjungma@eit.uni-kl.de  }
99012027Sjungma@eit.uni-kl.de
99112027Sjungma@eit.uni-kl.de  return *this;
99212027Sjungma@eit.uni-kl.de}
99312027Sjungma@eit.uni-kl.de
99412027Sjungma@eit.uni-kl.de
99512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
99612027Sjungma@eit.uni-kl.de//  SECTION: MOD operators: %, %=.
99712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
99812027Sjungma@eit.uni-kl.de
99912027Sjungma@eit.uni-kl.de// Cases to consider when finding the remainder r = u % v:
100012027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q.
100112027Sjungma@eit.uni-kl.de// 1. 0 % 0 or u % 0 => error
100212027Sjungma@eit.uni-kl.de// 2. 0 % v => 0 = 0 * v + 0
100312027Sjungma@eit.uni-kl.de// 3. u % v && u = v => u = 1 * u + 0  - u or v can be 1 or -1
100412027Sjungma@eit.uni-kl.de// 4. u % v && u < v => u = 0 * v + u  - u can be 1 or -1
100512027Sjungma@eit.uni-kl.de// 5. u % v && u > v => u = q * v + r  - v can be 1 or -1
100612027Sjungma@eit.uni-kl.de
100712027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
100812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(const CLASS_TYPE& v)
100912027Sjungma@eit.uni-kl.de{
101012027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
101112027Sjungma@eit.uni-kl.de
101212027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
101312027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
101412027Sjungma@eit.uni-kl.de
101512027Sjungma@eit.uni-kl.de  }
101612027Sjungma@eit.uni-kl.de  else // other cases
101712027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
101812027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
101912027Sjungma@eit.uni-kl.de
102012027Sjungma@eit.uni-kl.de  return *this;
102112027Sjungma@eit.uni-kl.de}
102212027Sjungma@eit.uni-kl.de
102312027Sjungma@eit.uni-kl.de
102412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
102512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(const OTHER_CLASS_TYPE& v)
102612027Sjungma@eit.uni-kl.de{
102712027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
102812027Sjungma@eit.uni-kl.de
102912027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
103012027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
103112027Sjungma@eit.uni-kl.de
103212027Sjungma@eit.uni-kl.de  }
103312027Sjungma@eit.uni-kl.de  else  // other cases
103412027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
103512027Sjungma@eit.uni-kl.de                  v.nbits, v.ndigits, v.digit);
103612027Sjungma@eit.uni-kl.de
103712027Sjungma@eit.uni-kl.de  return *this;
103812027Sjungma@eit.uni-kl.de}
103912027Sjungma@eit.uni-kl.de
104012027Sjungma@eit.uni-kl.de
104112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
104212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(int64 v)
104312027Sjungma@eit.uni-kl.de{
104412027Sjungma@eit.uni-kl.de  small_type vs = get_sign(v);
104512027Sjungma@eit.uni-kl.de
104612027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (vs == SC_ZERO)) {
104712027Sjungma@eit.uni-kl.de
104812027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
104912027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
105012027Sjungma@eit.uni-kl.de
105112027Sjungma@eit.uni-kl.de  }
105212027Sjungma@eit.uni-kl.de  else {
105312027Sjungma@eit.uni-kl.de
105412027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
105512027Sjungma@eit.uni-kl.de
105612027Sjungma@eit.uni-kl.de    // other cases
105712027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
105812027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
105912027Sjungma@eit.uni-kl.de
106012027Sjungma@eit.uni-kl.de  }
106112027Sjungma@eit.uni-kl.de
106212027Sjungma@eit.uni-kl.de  return *this;
106312027Sjungma@eit.uni-kl.de}
106412027Sjungma@eit.uni-kl.de
106512027Sjungma@eit.uni-kl.de
106612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
106712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(uint64 v)
106812027Sjungma@eit.uni-kl.de{
106912027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0)) {
107012027Sjungma@eit.uni-kl.de
107112027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
107212027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
107312027Sjungma@eit.uni-kl.de
107412027Sjungma@eit.uni-kl.de  }
107512027Sjungma@eit.uni-kl.de  else {
107612027Sjungma@eit.uni-kl.de
107712027Sjungma@eit.uni-kl.de    CONVERT_INT64_2(v);
107812027Sjungma@eit.uni-kl.de
107912027Sjungma@eit.uni-kl.de    // other cases
108012027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
108112027Sjungma@eit.uni-kl.de                  BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
108212027Sjungma@eit.uni-kl.de
108312027Sjungma@eit.uni-kl.de  }
108412027Sjungma@eit.uni-kl.de
108512027Sjungma@eit.uni-kl.de  return *this;
108612027Sjungma@eit.uni-kl.de}
108712027Sjungma@eit.uni-kl.de
108812027Sjungma@eit.uni-kl.de
108912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
109012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(long v)
109112027Sjungma@eit.uni-kl.de{
109212027Sjungma@eit.uni-kl.de  small_type vs = get_sign(v);
109312027Sjungma@eit.uni-kl.de
109412027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (vs == SC_ZERO)) {
109512027Sjungma@eit.uni-kl.de
109612027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
109712027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
109812027Sjungma@eit.uni-kl.de
109912027Sjungma@eit.uni-kl.de  }
110012027Sjungma@eit.uni-kl.de  else {
110112027Sjungma@eit.uni-kl.de
110212027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
110312027Sjungma@eit.uni-kl.de
110412027Sjungma@eit.uni-kl.de    // other cases
110512027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
110612027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
110712027Sjungma@eit.uni-kl.de
110812027Sjungma@eit.uni-kl.de  }
110912027Sjungma@eit.uni-kl.de
111012027Sjungma@eit.uni-kl.de  return *this;
111112027Sjungma@eit.uni-kl.de}
111212027Sjungma@eit.uni-kl.de
111312027Sjungma@eit.uni-kl.de
111412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
111512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator%=(unsigned long v)
111612027Sjungma@eit.uni-kl.de{
111712027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0)) {
111812027Sjungma@eit.uni-kl.de
111912027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
112012027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);  // case 2
112112027Sjungma@eit.uni-kl.de
112212027Sjungma@eit.uni-kl.de  }
112312027Sjungma@eit.uni-kl.de  else {
112412027Sjungma@eit.uni-kl.de
112512027Sjungma@eit.uni-kl.de    CONVERT_LONG_2(v);
112612027Sjungma@eit.uni-kl.de
112712027Sjungma@eit.uni-kl.de    // other cases
112812027Sjungma@eit.uni-kl.de    MOD_ON_HELPER(sgn, nbits, ndigits, digit,
112912027Sjungma@eit.uni-kl.de                  BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
113012027Sjungma@eit.uni-kl.de
113112027Sjungma@eit.uni-kl.de  }
113212027Sjungma@eit.uni-kl.de
113312027Sjungma@eit.uni-kl.de  return *this;
113412027Sjungma@eit.uni-kl.de}
113512027Sjungma@eit.uni-kl.de
113612027Sjungma@eit.uni-kl.de
113712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
113812027Sjungma@eit.uni-kl.de//  SECTION: Bitwise AND operators: &, &=
113912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
114012027Sjungma@eit.uni-kl.de
114112027Sjungma@eit.uni-kl.de// Cases to consider when computing u & v:
114212027Sjungma@eit.uni-kl.de// 1. u & 0 = 0 & v = 0
114312027Sjungma@eit.uni-kl.de// 2. u & v => sgn = +
114412027Sjungma@eit.uni-kl.de// 3. (-u) & (-v) => sgn = -
114512027Sjungma@eit.uni-kl.de// 4. u & (-v) => sgn = +
114612027Sjungma@eit.uni-kl.de// 5. (-u) & v => sgn = +
114712027Sjungma@eit.uni-kl.de
114812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
114912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(const CLASS_TYPE& v)
115012027Sjungma@eit.uni-kl.de{
115112027Sjungma@eit.uni-kl.de  // u = *this
115212027Sjungma@eit.uni-kl.de
115312027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
115412027Sjungma@eit.uni-kl.de    makezero();
115512027Sjungma@eit.uni-kl.de
115612027Sjungma@eit.uni-kl.de  else  {  // other cases
115712027Sjungma@eit.uni-kl.de
115812027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
115912027Sjungma@eit.uni-kl.de                v.sgn, v.nbits, v.ndigits, v.digit);
116012027Sjungma@eit.uni-kl.de
116112027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
116212027Sjungma@eit.uni-kl.de
116312027Sjungma@eit.uni-kl.de  }
116412027Sjungma@eit.uni-kl.de
116512027Sjungma@eit.uni-kl.de  return *this;
116612027Sjungma@eit.uni-kl.de}
116712027Sjungma@eit.uni-kl.de
116812027Sjungma@eit.uni-kl.de
116912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
117012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(const OTHER_CLASS_TYPE& v)
117112027Sjungma@eit.uni-kl.de{
117212027Sjungma@eit.uni-kl.de  // u = *this
117312027Sjungma@eit.uni-kl.de
117412027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
117512027Sjungma@eit.uni-kl.de    makezero();
117612027Sjungma@eit.uni-kl.de
117712027Sjungma@eit.uni-kl.de  else {  // other cases
117812027Sjungma@eit.uni-kl.de
117912027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
118012027Sjungma@eit.uni-kl.de                v.sgn, v.nbits, v.ndigits, v.digit);
118112027Sjungma@eit.uni-kl.de
118212027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
118312027Sjungma@eit.uni-kl.de
118412027Sjungma@eit.uni-kl.de  }
118512027Sjungma@eit.uni-kl.de
118612027Sjungma@eit.uni-kl.de  return *this;
118712027Sjungma@eit.uni-kl.de}
118812027Sjungma@eit.uni-kl.de
118912027Sjungma@eit.uni-kl.de
119012027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
119112027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(int64 v)
119212027Sjungma@eit.uni-kl.de{
119312027Sjungma@eit.uni-kl.de  // u = *this
119412027Sjungma@eit.uni-kl.de
119512027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0)) // case 1
119612027Sjungma@eit.uni-kl.de    makezero();
119712027Sjungma@eit.uni-kl.de
119812027Sjungma@eit.uni-kl.de  else {    // other cases
119912027Sjungma@eit.uni-kl.de
120012027Sjungma@eit.uni-kl.de    CONVERT_INT64(v);
120112027Sjungma@eit.uni-kl.de
120212027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
120312027Sjungma@eit.uni-kl.de                vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
120412027Sjungma@eit.uni-kl.de
120512027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
120612027Sjungma@eit.uni-kl.de
120712027Sjungma@eit.uni-kl.de  }
120812027Sjungma@eit.uni-kl.de
120912027Sjungma@eit.uni-kl.de  return *this;
121012027Sjungma@eit.uni-kl.de}
121112027Sjungma@eit.uni-kl.de
121212027Sjungma@eit.uni-kl.de
121312027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
121412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(uint64 v)
121512027Sjungma@eit.uni-kl.de{
121612027Sjungma@eit.uni-kl.de  // u = *this
121712027Sjungma@eit.uni-kl.de
121812027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0))  // case 1
121912027Sjungma@eit.uni-kl.de    makezero();
122012027Sjungma@eit.uni-kl.de
122112027Sjungma@eit.uni-kl.de  else {  // other cases
122212027Sjungma@eit.uni-kl.de
122312027Sjungma@eit.uni-kl.de    CONVERT_INT64(v);
122412027Sjungma@eit.uni-kl.de
122512027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
122612027Sjungma@eit.uni-kl.de                vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
122712027Sjungma@eit.uni-kl.de
122812027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
122912027Sjungma@eit.uni-kl.de
123012027Sjungma@eit.uni-kl.de  }
123112027Sjungma@eit.uni-kl.de
123212027Sjungma@eit.uni-kl.de  return *this;
123312027Sjungma@eit.uni-kl.de}
123412027Sjungma@eit.uni-kl.de
123512027Sjungma@eit.uni-kl.de
123612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
123712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(long v)
123812027Sjungma@eit.uni-kl.de{
123912027Sjungma@eit.uni-kl.de  // u = *this
124012027Sjungma@eit.uni-kl.de
124112027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0))  // case 1
124212027Sjungma@eit.uni-kl.de    makezero();
124312027Sjungma@eit.uni-kl.de
124412027Sjungma@eit.uni-kl.de  else {      // other cases
124512027Sjungma@eit.uni-kl.de
124612027Sjungma@eit.uni-kl.de    CONVERT_LONG(v);
124712027Sjungma@eit.uni-kl.de
124812027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
124912027Sjungma@eit.uni-kl.de                vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
125012027Sjungma@eit.uni-kl.de
125112027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
125212027Sjungma@eit.uni-kl.de
125312027Sjungma@eit.uni-kl.de  }
125412027Sjungma@eit.uni-kl.de
125512027Sjungma@eit.uni-kl.de  return *this;
125612027Sjungma@eit.uni-kl.de}
125712027Sjungma@eit.uni-kl.de
125812027Sjungma@eit.uni-kl.de
125912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
126012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator&=(unsigned long v)
126112027Sjungma@eit.uni-kl.de{
126212027Sjungma@eit.uni-kl.de  // u = *this
126312027Sjungma@eit.uni-kl.de
126412027Sjungma@eit.uni-kl.de  if ((sgn == SC_ZERO) || (v == 0))  // case 1
126512027Sjungma@eit.uni-kl.de    makezero();
126612027Sjungma@eit.uni-kl.de
126712027Sjungma@eit.uni-kl.de  else {  // other cases
126812027Sjungma@eit.uni-kl.de
126912027Sjungma@eit.uni-kl.de    CONVERT_LONG(v);
127012027Sjungma@eit.uni-kl.de
127112027Sjungma@eit.uni-kl.de    and_on_help(sgn, nbits, ndigits, digit,
127212027Sjungma@eit.uni-kl.de                vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
127312027Sjungma@eit.uni-kl.de
127412027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
127512027Sjungma@eit.uni-kl.de
127612027Sjungma@eit.uni-kl.de  }
127712027Sjungma@eit.uni-kl.de
127812027Sjungma@eit.uni-kl.de  return *this;
127912027Sjungma@eit.uni-kl.de}
128012027Sjungma@eit.uni-kl.de
128112027Sjungma@eit.uni-kl.de
128212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
128312027Sjungma@eit.uni-kl.de//  SECTION: Bitwise OR operators: |, |=
128412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
128512027Sjungma@eit.uni-kl.de
128612027Sjungma@eit.uni-kl.de// Cases to consider when computing u | v:
128712027Sjungma@eit.uni-kl.de// 1. u | 0 = u
128812027Sjungma@eit.uni-kl.de// 2. 0 | v = v
128912027Sjungma@eit.uni-kl.de// 3. u | v => sgn = +
129012027Sjungma@eit.uni-kl.de// 4. (-u) | (-v) => sgn = -
129112027Sjungma@eit.uni-kl.de// 5. u | (-v) => sgn = -
129212027Sjungma@eit.uni-kl.de// 6. (-u) | v => sgn = -
129312027Sjungma@eit.uni-kl.de
129412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
129512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(const CLASS_TYPE& v)
129612027Sjungma@eit.uni-kl.de{
129712027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
129812027Sjungma@eit.uni-kl.de    return *this;
129912027Sjungma@eit.uni-kl.de
130012027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
130112027Sjungma@eit.uni-kl.de    return (*this = v);
130212027Sjungma@eit.uni-kl.de
130312027Sjungma@eit.uni-kl.de  // other cases
130412027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
130512027Sjungma@eit.uni-kl.de             v.sgn, v.nbits, v.ndigits, v.digit);
130612027Sjungma@eit.uni-kl.de
130712027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
130812027Sjungma@eit.uni-kl.de
130912027Sjungma@eit.uni-kl.de  return *this;
131012027Sjungma@eit.uni-kl.de}
131112027Sjungma@eit.uni-kl.de
131212027Sjungma@eit.uni-kl.de
131312027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
131412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(const OTHER_CLASS_TYPE& v)
131512027Sjungma@eit.uni-kl.de{
131612027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
131712027Sjungma@eit.uni-kl.de    return *this;
131812027Sjungma@eit.uni-kl.de
131912027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
132012027Sjungma@eit.uni-kl.de    return (*this = v);
132112027Sjungma@eit.uni-kl.de
132212027Sjungma@eit.uni-kl.de  // other cases
132312027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
132412027Sjungma@eit.uni-kl.de             v.sgn, v.nbits, v.ndigits, v.digit);
132512027Sjungma@eit.uni-kl.de
132612027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
132712027Sjungma@eit.uni-kl.de
132812027Sjungma@eit.uni-kl.de  return *this;
132912027Sjungma@eit.uni-kl.de}
133012027Sjungma@eit.uni-kl.de
133112027Sjungma@eit.uni-kl.de
133212027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
133312027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(int64 v)
133412027Sjungma@eit.uni-kl.de{
133512027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
133612027Sjungma@eit.uni-kl.de    return *this;
133712027Sjungma@eit.uni-kl.de
133812027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
133912027Sjungma@eit.uni-kl.de    return (*this = v);
134012027Sjungma@eit.uni-kl.de
134112027Sjungma@eit.uni-kl.de  // other cases
134212027Sjungma@eit.uni-kl.de
134312027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
134412027Sjungma@eit.uni-kl.de
134512027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
134612027Sjungma@eit.uni-kl.de             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
134712027Sjungma@eit.uni-kl.de
134812027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
134912027Sjungma@eit.uni-kl.de
135012027Sjungma@eit.uni-kl.de  return *this;
135112027Sjungma@eit.uni-kl.de}
135212027Sjungma@eit.uni-kl.de
135312027Sjungma@eit.uni-kl.de
135412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
135512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(uint64 v)
135612027Sjungma@eit.uni-kl.de{
135712027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
135812027Sjungma@eit.uni-kl.de    return *this;
135912027Sjungma@eit.uni-kl.de
136012027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
136112027Sjungma@eit.uni-kl.de    return (*this = v);
136212027Sjungma@eit.uni-kl.de
136312027Sjungma@eit.uni-kl.de  // other cases
136412027Sjungma@eit.uni-kl.de
136512027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
136612027Sjungma@eit.uni-kl.de
136712027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
136812027Sjungma@eit.uni-kl.de             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
136912027Sjungma@eit.uni-kl.de
137012027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
137112027Sjungma@eit.uni-kl.de
137212027Sjungma@eit.uni-kl.de  return *this;
137312027Sjungma@eit.uni-kl.de}
137412027Sjungma@eit.uni-kl.de
137512027Sjungma@eit.uni-kl.de
137612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
137712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(long v)
137812027Sjungma@eit.uni-kl.de{
137912027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
138012027Sjungma@eit.uni-kl.de    return *this;
138112027Sjungma@eit.uni-kl.de
138212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
138312027Sjungma@eit.uni-kl.de    return (*this = v);
138412027Sjungma@eit.uni-kl.de
138512027Sjungma@eit.uni-kl.de  // other cases
138612027Sjungma@eit.uni-kl.de
138712027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
138812027Sjungma@eit.uni-kl.de
138912027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
139012027Sjungma@eit.uni-kl.de             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
139112027Sjungma@eit.uni-kl.de
139212027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
139312027Sjungma@eit.uni-kl.de
139412027Sjungma@eit.uni-kl.de  return *this;
139512027Sjungma@eit.uni-kl.de}
139612027Sjungma@eit.uni-kl.de
139712027Sjungma@eit.uni-kl.de
139812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
139912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator|=(unsigned long v)
140012027Sjungma@eit.uni-kl.de{
140112027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
140212027Sjungma@eit.uni-kl.de    return *this;
140312027Sjungma@eit.uni-kl.de
140412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
140512027Sjungma@eit.uni-kl.de    return (*this = v);
140612027Sjungma@eit.uni-kl.de
140712027Sjungma@eit.uni-kl.de  // other cases
140812027Sjungma@eit.uni-kl.de
140912027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
141012027Sjungma@eit.uni-kl.de
141112027Sjungma@eit.uni-kl.de  or_on_help(sgn, nbits, ndigits, digit,
141212027Sjungma@eit.uni-kl.de             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
141312027Sjungma@eit.uni-kl.de
141412027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
141512027Sjungma@eit.uni-kl.de
141612027Sjungma@eit.uni-kl.de  return *this;
141712027Sjungma@eit.uni-kl.de}
141812027Sjungma@eit.uni-kl.de
141912027Sjungma@eit.uni-kl.de
142012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
142112027Sjungma@eit.uni-kl.de//  SECTION: Bitwise XOR operators: ^, ^=
142212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
142312027Sjungma@eit.uni-kl.de
142412027Sjungma@eit.uni-kl.de// Cases to consider when computing u ^ v:
142512027Sjungma@eit.uni-kl.de// Note that  u ^ v = (~u & v) | (u & ~v).
142612027Sjungma@eit.uni-kl.de// 1. u ^ 0 = u
142712027Sjungma@eit.uni-kl.de// 2. 0 ^ v = v
142812027Sjungma@eit.uni-kl.de// 3. u ^ v => sgn = +
142912027Sjungma@eit.uni-kl.de// 4. (-u) ^ (-v) => sgn = -
143012027Sjungma@eit.uni-kl.de// 5. u ^ (-v) => sgn = -
143112027Sjungma@eit.uni-kl.de// 6. (-u) ^ v => sgn = +
143212027Sjungma@eit.uni-kl.de
143312027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
143412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(const CLASS_TYPE& v)
143512027Sjungma@eit.uni-kl.de{
143612027Sjungma@eit.uni-kl.de  // u = *this
143712027Sjungma@eit.uni-kl.de
143812027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
143912027Sjungma@eit.uni-kl.de    return *this;
144012027Sjungma@eit.uni-kl.de
144112027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
144212027Sjungma@eit.uni-kl.de    return (*this = v);
144312027Sjungma@eit.uni-kl.de
144412027Sjungma@eit.uni-kl.de  // other cases
144512027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
144612027Sjungma@eit.uni-kl.de              v.sgn, v.nbits, v.ndigits, v.digit);
144712027Sjungma@eit.uni-kl.de
144812027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
144912027Sjungma@eit.uni-kl.de
145012027Sjungma@eit.uni-kl.de  return *this;
145112027Sjungma@eit.uni-kl.de}
145212027Sjungma@eit.uni-kl.de
145312027Sjungma@eit.uni-kl.de
145412027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
145512027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(const OTHER_CLASS_TYPE& v)
145612027Sjungma@eit.uni-kl.de{
145712027Sjungma@eit.uni-kl.de  // u = *this
145812027Sjungma@eit.uni-kl.de
145912027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
146012027Sjungma@eit.uni-kl.de    return *this;
146112027Sjungma@eit.uni-kl.de
146212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
146312027Sjungma@eit.uni-kl.de    return (*this = v);
146412027Sjungma@eit.uni-kl.de
146512027Sjungma@eit.uni-kl.de  // other cases
146612027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
146712027Sjungma@eit.uni-kl.de              v.sgn, v.nbits, v.ndigits, v.digit);
146812027Sjungma@eit.uni-kl.de
146912027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
147012027Sjungma@eit.uni-kl.de
147112027Sjungma@eit.uni-kl.de  return *this;
147212027Sjungma@eit.uni-kl.de}
147312027Sjungma@eit.uni-kl.de
147412027Sjungma@eit.uni-kl.de
147512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
147612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(int64 v)
147712027Sjungma@eit.uni-kl.de{
147812027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
147912027Sjungma@eit.uni-kl.de    return *this;
148012027Sjungma@eit.uni-kl.de
148112027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
148212027Sjungma@eit.uni-kl.de    return (*this = v);
148312027Sjungma@eit.uni-kl.de
148412027Sjungma@eit.uni-kl.de  // other cases
148512027Sjungma@eit.uni-kl.de
148612027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
148712027Sjungma@eit.uni-kl.de
148812027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
148912027Sjungma@eit.uni-kl.de              vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
149012027Sjungma@eit.uni-kl.de
149112027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
149212027Sjungma@eit.uni-kl.de
149312027Sjungma@eit.uni-kl.de  return *this;
149412027Sjungma@eit.uni-kl.de}
149512027Sjungma@eit.uni-kl.de
149612027Sjungma@eit.uni-kl.de
149712027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
149812027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(uint64 v)
149912027Sjungma@eit.uni-kl.de{
150012027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
150112027Sjungma@eit.uni-kl.de    return *this;
150212027Sjungma@eit.uni-kl.de
150312027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
150412027Sjungma@eit.uni-kl.de    return (*this = v);
150512027Sjungma@eit.uni-kl.de
150612027Sjungma@eit.uni-kl.de  // other cases
150712027Sjungma@eit.uni-kl.de
150812027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
150912027Sjungma@eit.uni-kl.de
151012027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
151112027Sjungma@eit.uni-kl.de              vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
151212027Sjungma@eit.uni-kl.de
151312027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
151412027Sjungma@eit.uni-kl.de
151512027Sjungma@eit.uni-kl.de  return *this;
151612027Sjungma@eit.uni-kl.de}
151712027Sjungma@eit.uni-kl.de
151812027Sjungma@eit.uni-kl.de
151912027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
152012027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(long v)
152112027Sjungma@eit.uni-kl.de{
152212027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
152312027Sjungma@eit.uni-kl.de    return *this;
152412027Sjungma@eit.uni-kl.de
152512027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
152612027Sjungma@eit.uni-kl.de    return (*this = v);
152712027Sjungma@eit.uni-kl.de
152812027Sjungma@eit.uni-kl.de  // other cases
152912027Sjungma@eit.uni-kl.de
153012027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
153112027Sjungma@eit.uni-kl.de
153212027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
153312027Sjungma@eit.uni-kl.de              vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
153412027Sjungma@eit.uni-kl.de
153512027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
153612027Sjungma@eit.uni-kl.de
153712027Sjungma@eit.uni-kl.de  return *this;
153812027Sjungma@eit.uni-kl.de}
153912027Sjungma@eit.uni-kl.de
154012027Sjungma@eit.uni-kl.de
154112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
154212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator^=(unsigned long v)
154312027Sjungma@eit.uni-kl.de{
154412027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
154512027Sjungma@eit.uni-kl.de    return *this;
154612027Sjungma@eit.uni-kl.de
154712027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)  // case 2
154812027Sjungma@eit.uni-kl.de    return (*this = v);
154912027Sjungma@eit.uni-kl.de
155012027Sjungma@eit.uni-kl.de  // other cases
155112027Sjungma@eit.uni-kl.de
155212027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
155312027Sjungma@eit.uni-kl.de
155412027Sjungma@eit.uni-kl.de  xor_on_help(sgn, nbits, ndigits, digit,
155512027Sjungma@eit.uni-kl.de              vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
155612027Sjungma@eit.uni-kl.de
155712027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
155812027Sjungma@eit.uni-kl.de
155912027Sjungma@eit.uni-kl.de  return *this;
156012027Sjungma@eit.uni-kl.de}
156112027Sjungma@eit.uni-kl.de
156212027Sjungma@eit.uni-kl.de
156312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
156412027Sjungma@eit.uni-kl.de//  SECTION: Bitwise NOT operator: ~
156512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
156612027Sjungma@eit.uni-kl.de
156712027Sjungma@eit.uni-kl.deCLASS_TYPE
156812027Sjungma@eit.uni-kl.deoperator~(const CLASS_TYPE& u)
156912027Sjungma@eit.uni-kl.de{
157012027Sjungma@eit.uni-kl.de  small_type s = u.sgn;
157112027Sjungma@eit.uni-kl.de
157212027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
157312027Sjungma@eit.uni-kl.de
157412027Sjungma@eit.uni-kl.de    sc_digit d = 1;
157512027Sjungma@eit.uni-kl.de    return CLASS_TYPE(SC_NEG, u.nbits, 1, &d, false);
157612027Sjungma@eit.uni-kl.de
157712027Sjungma@eit.uni-kl.de  }
157812027Sjungma@eit.uni-kl.de
157912027Sjungma@eit.uni-kl.de  int nd = u.ndigits;
158012027Sjungma@eit.uni-kl.de
158112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
158212027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
158312027Sjungma@eit.uni-kl.de#else
158412027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[nd];
158512027Sjungma@eit.uni-kl.de#endif
158612027Sjungma@eit.uni-kl.de
158712027Sjungma@eit.uni-kl.de  vec_copy(nd, d, u.digit);
158812027Sjungma@eit.uni-kl.de
158912027Sjungma@eit.uni-kl.de  if (s == SC_POS) {
159012027Sjungma@eit.uni-kl.de
159112027Sjungma@eit.uni-kl.de    s = SC_NEG;
159212027Sjungma@eit.uni-kl.de    vec_add_small_on(nd, d, 1);
159312027Sjungma@eit.uni-kl.de
159412027Sjungma@eit.uni-kl.de  }
159512027Sjungma@eit.uni-kl.de  else {
159612027Sjungma@eit.uni-kl.de
159712027Sjungma@eit.uni-kl.de    s = SC_POS;
159812027Sjungma@eit.uni-kl.de    vec_sub_small_on(nd, d, 1);
159912027Sjungma@eit.uni-kl.de
160012027Sjungma@eit.uni-kl.de    if (check_for_zero(nd, d))
160112027Sjungma@eit.uni-kl.de      s = SC_ZERO;
160212027Sjungma@eit.uni-kl.de
160312027Sjungma@eit.uni-kl.de  }
160412027Sjungma@eit.uni-kl.de
160512027Sjungma@eit.uni-kl.de  return CLASS_TYPE(s, u.nbits, nd, d);
160612027Sjungma@eit.uni-kl.de}
160712027Sjungma@eit.uni-kl.de
160812027Sjungma@eit.uni-kl.de
160912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
161012027Sjungma@eit.uni-kl.de//  SECTION: LEFT SHIFT operators: <<, <<=
161112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
161212027Sjungma@eit.uni-kl.de
161312027Sjungma@eit.uni-kl.deCLASS_TYPE
161412027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, const CLASS_TYPE& v)
161512027Sjungma@eit.uni-kl.de{
161612027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
161712027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
161812027Sjungma@eit.uni-kl.de
161912027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED
162012027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
162112027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
162212027Sjungma@eit.uni-kl.de#endif
162312027Sjungma@eit.uni-kl.de
162412027Sjungma@eit.uni-kl.de  return operator<<(u, v.to_ulong());
162512027Sjungma@eit.uni-kl.de}
162612027Sjungma@eit.uni-kl.de
162712027Sjungma@eit.uni-kl.de
162812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
162912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(const CLASS_TYPE& v)
163012027Sjungma@eit.uni-kl.de{
163112027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
163212027Sjungma@eit.uni-kl.de    return *this;
163312027Sjungma@eit.uni-kl.de
163412027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED
163512027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
163612027Sjungma@eit.uni-kl.de    return *this;
163712027Sjungma@eit.uni-kl.de#endif
163812027Sjungma@eit.uni-kl.de
163912027Sjungma@eit.uni-kl.de  return operator<<=(v.to_ulong());
164012027Sjungma@eit.uni-kl.de}
164112027Sjungma@eit.uni-kl.de
164212027Sjungma@eit.uni-kl.de
164312027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
164412027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(const OTHER_CLASS_TYPE& v)
164512027Sjungma@eit.uni-kl.de{
164612027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
164712027Sjungma@eit.uni-kl.de    return *this;
164812027Sjungma@eit.uni-kl.de
164912027Sjungma@eit.uni-kl.de#ifdef SC_UNSIGNED
165012027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
165112027Sjungma@eit.uni-kl.de    return *this;
165212027Sjungma@eit.uni-kl.de#endif
165312027Sjungma@eit.uni-kl.de
165412027Sjungma@eit.uni-kl.de  return operator<<=(v.to_ulong());
165512027Sjungma@eit.uni-kl.de}
165612027Sjungma@eit.uni-kl.de
165712027Sjungma@eit.uni-kl.de
165812027Sjungma@eit.uni-kl.deCLASS_TYPE
165912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, int64 v)
166012027Sjungma@eit.uni-kl.de{
166112027Sjungma@eit.uni-kl.de  if (v <= 0)
166212027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
166312027Sjungma@eit.uni-kl.de
166412027Sjungma@eit.uni-kl.de  return operator<<(u, (unsigned long) v);
166512027Sjungma@eit.uni-kl.de}
166612027Sjungma@eit.uni-kl.de
166712027Sjungma@eit.uni-kl.de
166812027Sjungma@eit.uni-kl.deCLASS_TYPE
166912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, uint64 v)
167012027Sjungma@eit.uni-kl.de{
167112027Sjungma@eit.uni-kl.de  if (v == 0)
167212027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
167312027Sjungma@eit.uni-kl.de
167412027Sjungma@eit.uni-kl.de  return operator<<(u, (unsigned long) v);
167512027Sjungma@eit.uni-kl.de}
167612027Sjungma@eit.uni-kl.de
167712027Sjungma@eit.uni-kl.de
167812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
167912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(int64 v)
168012027Sjungma@eit.uni-kl.de{
168112027Sjungma@eit.uni-kl.de  if (v <= 0)
168212027Sjungma@eit.uni-kl.de    return *this;
168312027Sjungma@eit.uni-kl.de
168412027Sjungma@eit.uni-kl.de  return operator<<=((unsigned long) v);
168512027Sjungma@eit.uni-kl.de}
168612027Sjungma@eit.uni-kl.de
168712027Sjungma@eit.uni-kl.de
168812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
168912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(uint64 v)
169012027Sjungma@eit.uni-kl.de{
169112027Sjungma@eit.uni-kl.de  if (v == 0)
169212027Sjungma@eit.uni-kl.de    return *this;
169312027Sjungma@eit.uni-kl.de
169412027Sjungma@eit.uni-kl.de  return operator<<=((unsigned long) v);
169512027Sjungma@eit.uni-kl.de}
169612027Sjungma@eit.uni-kl.de
169712027Sjungma@eit.uni-kl.de
169812027Sjungma@eit.uni-kl.deCLASS_TYPE
169912027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, long v)
170012027Sjungma@eit.uni-kl.de{
170112027Sjungma@eit.uni-kl.de  if (v <= 0)
170212027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
170312027Sjungma@eit.uni-kl.de
170412027Sjungma@eit.uni-kl.de  return operator<<(u, (unsigned long) v);
170512027Sjungma@eit.uni-kl.de}
170612027Sjungma@eit.uni-kl.de
170712027Sjungma@eit.uni-kl.deCLASS_TYPE
170812027Sjungma@eit.uni-kl.deoperator<<(const CLASS_TYPE& u, unsigned long v)
170912027Sjungma@eit.uni-kl.de{
171012027Sjungma@eit.uni-kl.de  if (v == 0)
171112027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
171212027Sjungma@eit.uni-kl.de
171312027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)
171412027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
171512027Sjungma@eit.uni-kl.de
171612027Sjungma@eit.uni-kl.de  int nb = u.nbits + v;
171712027Sjungma@eit.uni-kl.de  int nd = DIV_CEIL(nb);
171812027Sjungma@eit.uni-kl.de
171912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
172012027Sjungma@eit.uni-kl.de  test_bound(nb);
172112027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
172212027Sjungma@eit.uni-kl.de#else
172312027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[nd];
172412027Sjungma@eit.uni-kl.de#endif
172512027Sjungma@eit.uni-kl.de
172612027Sjungma@eit.uni-kl.de  vec_copy_and_zero(nd, d, u.ndigits, u.digit);
172712027Sjungma@eit.uni-kl.de
172812027Sjungma@eit.uni-kl.de  convert_SM_to_2C(u.sgn, nd, d);
172912027Sjungma@eit.uni-kl.de
173012027Sjungma@eit.uni-kl.de  vec_shift_left(nd, d, v);
173112027Sjungma@eit.uni-kl.de
173212027Sjungma@eit.uni-kl.de  small_type s = convert_signed_2C_to_SM(nb, nd, d);
173312027Sjungma@eit.uni-kl.de
173412027Sjungma@eit.uni-kl.de  return CLASS_TYPE(s, nb, nd, d);
173512027Sjungma@eit.uni-kl.de}
173612027Sjungma@eit.uni-kl.de
173712027Sjungma@eit.uni-kl.de
173812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
173912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(long v)
174012027Sjungma@eit.uni-kl.de{
174112027Sjungma@eit.uni-kl.de  if (v <= 0)
174212027Sjungma@eit.uni-kl.de    return *this;
174312027Sjungma@eit.uni-kl.de
174412027Sjungma@eit.uni-kl.de  return operator<<=((unsigned long) v);
174512027Sjungma@eit.uni-kl.de}
174612027Sjungma@eit.uni-kl.de
174712027Sjungma@eit.uni-kl.de
174812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
174912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator<<=(unsigned long v)
175012027Sjungma@eit.uni-kl.de{
175112027Sjungma@eit.uni-kl.de  if (v == 0)
175212027Sjungma@eit.uni-kl.de    return *this;
175312027Sjungma@eit.uni-kl.de
175412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
175512027Sjungma@eit.uni-kl.de    return *this;
175612027Sjungma@eit.uni-kl.de
175712027Sjungma@eit.uni-kl.de  convert_SM_to_2C();
175812027Sjungma@eit.uni-kl.de
175912027Sjungma@eit.uni-kl.de  vec_shift_left(ndigits, digit, v);
176012027Sjungma@eit.uni-kl.de
176112027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
176212027Sjungma@eit.uni-kl.de
176312027Sjungma@eit.uni-kl.de  return *this;
176412027Sjungma@eit.uni-kl.de}
176512027Sjungma@eit.uni-kl.de
176612027Sjungma@eit.uni-kl.de
176712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
176812027Sjungma@eit.uni-kl.de//  SECTION: RIGHT SHIFT operators: >>, >>=
176912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
177012027Sjungma@eit.uni-kl.de
177112027Sjungma@eit.uni-kl.deCLASS_TYPE
177212027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, const CLASS_TYPE& v)
177312027Sjungma@eit.uni-kl.de{
177412027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
177512027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
177612027Sjungma@eit.uni-kl.de
177712027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED
177812027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
177912027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
178012027Sjungma@eit.uni-kl.de#endif
178112027Sjungma@eit.uni-kl.de
178212027Sjungma@eit.uni-kl.de  return operator>>(u, v.to_long());
178312027Sjungma@eit.uni-kl.de}
178412027Sjungma@eit.uni-kl.de
178512027Sjungma@eit.uni-kl.de
178612027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
178712027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(const CLASS_TYPE& v)
178812027Sjungma@eit.uni-kl.de{
178912027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
179012027Sjungma@eit.uni-kl.de    return *this;
179112027Sjungma@eit.uni-kl.de
179212027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED
179312027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
179412027Sjungma@eit.uni-kl.de    return *this;
179512027Sjungma@eit.uni-kl.de#endif
179612027Sjungma@eit.uni-kl.de
179712027Sjungma@eit.uni-kl.de  return operator>>=(v.to_long());
179812027Sjungma@eit.uni-kl.de}
179912027Sjungma@eit.uni-kl.de
180012027Sjungma@eit.uni-kl.de
180112027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
180212027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(const OTHER_CLASS_TYPE& v)
180312027Sjungma@eit.uni-kl.de{
180412027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
180512027Sjungma@eit.uni-kl.de    return *this;
180612027Sjungma@eit.uni-kl.de
180712027Sjungma@eit.uni-kl.de#ifdef SC_UNSIGNED
180812027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
180912027Sjungma@eit.uni-kl.de    return *this;
181012027Sjungma@eit.uni-kl.de#endif
181112027Sjungma@eit.uni-kl.de
181212027Sjungma@eit.uni-kl.de  return operator>>=(v.to_ulong());
181312027Sjungma@eit.uni-kl.de}
181412027Sjungma@eit.uni-kl.de
181512027Sjungma@eit.uni-kl.de
181612027Sjungma@eit.uni-kl.deCLASS_TYPE
181712027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, int64 v)
181812027Sjungma@eit.uni-kl.de{
181912027Sjungma@eit.uni-kl.de  if (v <= 0)
182012027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
182112027Sjungma@eit.uni-kl.de
182212027Sjungma@eit.uni-kl.de  return operator>>(u, (unsigned long) v);
182312027Sjungma@eit.uni-kl.de}
182412027Sjungma@eit.uni-kl.de
182512027Sjungma@eit.uni-kl.de
182612027Sjungma@eit.uni-kl.deCLASS_TYPE
182712027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, uint64 v)
182812027Sjungma@eit.uni-kl.de{
182912027Sjungma@eit.uni-kl.de  if (v == 0)
183012027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
183112027Sjungma@eit.uni-kl.de
183212027Sjungma@eit.uni-kl.de  return operator>>(u, (unsigned long) v);
183312027Sjungma@eit.uni-kl.de}
183412027Sjungma@eit.uni-kl.de
183512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
183612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(int64 v)
183712027Sjungma@eit.uni-kl.de{
183812027Sjungma@eit.uni-kl.de  if (v <= 0)
183912027Sjungma@eit.uni-kl.de    return *this;
184012027Sjungma@eit.uni-kl.de
184112027Sjungma@eit.uni-kl.de  return operator>>=((unsigned long) v);
184212027Sjungma@eit.uni-kl.de}
184312027Sjungma@eit.uni-kl.de
184412027Sjungma@eit.uni-kl.de
184512027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
184612027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(uint64 v)
184712027Sjungma@eit.uni-kl.de{
184812027Sjungma@eit.uni-kl.de  if (v == 0)
184912027Sjungma@eit.uni-kl.de    return *this;
185012027Sjungma@eit.uni-kl.de
185112027Sjungma@eit.uni-kl.de  return operator>>=((unsigned long) v);
185212027Sjungma@eit.uni-kl.de}
185312027Sjungma@eit.uni-kl.de
185412027Sjungma@eit.uni-kl.de
185512027Sjungma@eit.uni-kl.deCLASS_TYPE
185612027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, long v)
185712027Sjungma@eit.uni-kl.de{
185812027Sjungma@eit.uni-kl.de  if (v <= 0)
185912027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
186012027Sjungma@eit.uni-kl.de
186112027Sjungma@eit.uni-kl.de  return operator>>(u, (unsigned long) v);
186212027Sjungma@eit.uni-kl.de}
186312027Sjungma@eit.uni-kl.de
186412027Sjungma@eit.uni-kl.de
186512027Sjungma@eit.uni-kl.deCLASS_TYPE
186612027Sjungma@eit.uni-kl.deoperator>>(const CLASS_TYPE& u, unsigned long v)
186712027Sjungma@eit.uni-kl.de{
186812027Sjungma@eit.uni-kl.de  if (v == 0)
186912027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
187012027Sjungma@eit.uni-kl.de
187112027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)
187212027Sjungma@eit.uni-kl.de    return CLASS_TYPE(u);
187312027Sjungma@eit.uni-kl.de
187412027Sjungma@eit.uni-kl.de  int nb = u.nbits;
187512027Sjungma@eit.uni-kl.de  int nd = u.ndigits;
187612027Sjungma@eit.uni-kl.de
187712027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
187812027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
187912027Sjungma@eit.uni-kl.de#else
188012027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[nd];
188112027Sjungma@eit.uni-kl.de#endif
188212027Sjungma@eit.uni-kl.de
188312027Sjungma@eit.uni-kl.de  vec_copy(nd, d, u.digit);
188412027Sjungma@eit.uni-kl.de
188512027Sjungma@eit.uni-kl.de  convert_SM_to_2C(u.sgn, nd, d);
188612027Sjungma@eit.uni-kl.de
188712027Sjungma@eit.uni-kl.de  if (u.sgn == SC_NEG)
188812027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, v, DIGIT_MASK);
188912027Sjungma@eit.uni-kl.de  else
189012027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, v, 0);
189112027Sjungma@eit.uni-kl.de
189212027Sjungma@eit.uni-kl.de  small_type s = convert_signed_2C_to_SM(nb, nd, d);
189312027Sjungma@eit.uni-kl.de
189412027Sjungma@eit.uni-kl.de  return CLASS_TYPE(s, nb, nd, d);
189512027Sjungma@eit.uni-kl.de}
189612027Sjungma@eit.uni-kl.de
189712027Sjungma@eit.uni-kl.de
189812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
189912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(long v)
190012027Sjungma@eit.uni-kl.de{
190112027Sjungma@eit.uni-kl.de  if (v <= 0)
190212027Sjungma@eit.uni-kl.de    return *this;
190312027Sjungma@eit.uni-kl.de
190412027Sjungma@eit.uni-kl.de  return operator>>=((unsigned long) v);
190512027Sjungma@eit.uni-kl.de}
190612027Sjungma@eit.uni-kl.de
190712027Sjungma@eit.uni-kl.de
190812027Sjungma@eit.uni-kl.deconst CLASS_TYPE&
190912027Sjungma@eit.uni-kl.deCLASS_TYPE::operator>>=(unsigned long v)
191012027Sjungma@eit.uni-kl.de{
191112027Sjungma@eit.uni-kl.de  if (v == 0)
191212027Sjungma@eit.uni-kl.de    return *this;
191312027Sjungma@eit.uni-kl.de
191412027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
191512027Sjungma@eit.uni-kl.de    return *this;
191612027Sjungma@eit.uni-kl.de
191712027Sjungma@eit.uni-kl.de  convert_SM_to_2C();
191812027Sjungma@eit.uni-kl.de
191912027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG)
192012027Sjungma@eit.uni-kl.de    vec_shift_right(ndigits, digit, v, DIGIT_MASK);
192112027Sjungma@eit.uni-kl.de  else
192212027Sjungma@eit.uni-kl.de    vec_shift_right(ndigits, digit, v, 0);
192312027Sjungma@eit.uni-kl.de
192412027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
192512027Sjungma@eit.uni-kl.de
192612027Sjungma@eit.uni-kl.de  return *this;
192712027Sjungma@eit.uni-kl.de}
192812027Sjungma@eit.uni-kl.de
192912027Sjungma@eit.uni-kl.de
193012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
193112027Sjungma@eit.uni-kl.de//  SECTION: EQUAL TO operator: ==
193212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
193312027Sjungma@eit.uni-kl.de
193412027Sjungma@eit.uni-kl.de// Defined in the sc_signed.cpp and sc_unsigned.cpp.
193512027Sjungma@eit.uni-kl.de
193612027Sjungma@eit.uni-kl.de
193712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
193812027Sjungma@eit.uni-kl.de//  SECTION: NOT_EQUAL operator: !=
193912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
194012027Sjungma@eit.uni-kl.de
194112027Sjungma@eit.uni-kl.debool
194212027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, const CLASS_TYPE& v)
194312027Sjungma@eit.uni-kl.de{
194412027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
194512027Sjungma@eit.uni-kl.de}
194612027Sjungma@eit.uni-kl.de
194712027Sjungma@eit.uni-kl.de
194812027Sjungma@eit.uni-kl.debool
194912027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, int64 v)
195012027Sjungma@eit.uni-kl.de{
195112027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
195212027Sjungma@eit.uni-kl.de}
195312027Sjungma@eit.uni-kl.de
195412027Sjungma@eit.uni-kl.de
195512027Sjungma@eit.uni-kl.debool
195612027Sjungma@eit.uni-kl.deoperator!=(int64 u, const CLASS_TYPE& v)
195712027Sjungma@eit.uni-kl.de{
195812027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
195912027Sjungma@eit.uni-kl.de}
196012027Sjungma@eit.uni-kl.de
196112027Sjungma@eit.uni-kl.de
196212027Sjungma@eit.uni-kl.debool
196312027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, uint64 v)
196412027Sjungma@eit.uni-kl.de{
196512027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
196612027Sjungma@eit.uni-kl.de}
196712027Sjungma@eit.uni-kl.de
196812027Sjungma@eit.uni-kl.de
196912027Sjungma@eit.uni-kl.debool
197012027Sjungma@eit.uni-kl.deoperator!=(uint64 u, const CLASS_TYPE& v)
197112027Sjungma@eit.uni-kl.de{
197212027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
197312027Sjungma@eit.uni-kl.de}
197412027Sjungma@eit.uni-kl.de
197512027Sjungma@eit.uni-kl.de
197612027Sjungma@eit.uni-kl.debool
197712027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, long v)
197812027Sjungma@eit.uni-kl.de{
197912027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
198012027Sjungma@eit.uni-kl.de}
198112027Sjungma@eit.uni-kl.de
198212027Sjungma@eit.uni-kl.de
198312027Sjungma@eit.uni-kl.debool
198412027Sjungma@eit.uni-kl.deoperator!=(long u, const CLASS_TYPE& v)
198512027Sjungma@eit.uni-kl.de{
198612027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
198712027Sjungma@eit.uni-kl.de}
198812027Sjungma@eit.uni-kl.de
198912027Sjungma@eit.uni-kl.de
199012027Sjungma@eit.uni-kl.debool
199112027Sjungma@eit.uni-kl.deoperator!=(const CLASS_TYPE& u, unsigned long v)
199212027Sjungma@eit.uni-kl.de{
199312027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
199412027Sjungma@eit.uni-kl.de}
199512027Sjungma@eit.uni-kl.de
199612027Sjungma@eit.uni-kl.de
199712027Sjungma@eit.uni-kl.debool
199812027Sjungma@eit.uni-kl.deoperator!=(unsigned long u, const CLASS_TYPE& v)
199912027Sjungma@eit.uni-kl.de{
200012027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
200112027Sjungma@eit.uni-kl.de}
200212027Sjungma@eit.uni-kl.de
200312027Sjungma@eit.uni-kl.de
200412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
200512027Sjungma@eit.uni-kl.de//  SECTION: LESS THAN operator: <
200612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
200712027Sjungma@eit.uni-kl.de
200812027Sjungma@eit.uni-kl.de// Defined in the sc_signed.cpp and sc_unsigned.cpp.
200912027Sjungma@eit.uni-kl.de
201012027Sjungma@eit.uni-kl.de
201112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
201212027Sjungma@eit.uni-kl.de//  SECTION: LESS THAN or EQUAL operator: <=
201312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
201412027Sjungma@eit.uni-kl.de
201512027Sjungma@eit.uni-kl.debool
201612027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, const CLASS_TYPE& v)
201712027Sjungma@eit.uni-kl.de{
201812027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
201912027Sjungma@eit.uni-kl.de}
202012027Sjungma@eit.uni-kl.de
202112027Sjungma@eit.uni-kl.de
202212027Sjungma@eit.uni-kl.debool
202312027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, int64 v)
202412027Sjungma@eit.uni-kl.de{
202512027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
202612027Sjungma@eit.uni-kl.de}
202712027Sjungma@eit.uni-kl.de
202812027Sjungma@eit.uni-kl.de
202912027Sjungma@eit.uni-kl.debool
203012027Sjungma@eit.uni-kl.deoperator<=(int64 u, const CLASS_TYPE& v)
203112027Sjungma@eit.uni-kl.de{
203212027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
203312027Sjungma@eit.uni-kl.de}
203412027Sjungma@eit.uni-kl.de
203512027Sjungma@eit.uni-kl.de
203612027Sjungma@eit.uni-kl.debool
203712027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, uint64 v)
203812027Sjungma@eit.uni-kl.de{
203912027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
204012027Sjungma@eit.uni-kl.de}
204112027Sjungma@eit.uni-kl.de
204212027Sjungma@eit.uni-kl.de
204312027Sjungma@eit.uni-kl.debool
204412027Sjungma@eit.uni-kl.deoperator<=(uint64 u, const CLASS_TYPE& v)
204512027Sjungma@eit.uni-kl.de{
204612027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
204712027Sjungma@eit.uni-kl.de}
204812027Sjungma@eit.uni-kl.de
204912027Sjungma@eit.uni-kl.de
205012027Sjungma@eit.uni-kl.debool
205112027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, long v)
205212027Sjungma@eit.uni-kl.de{
205312027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
205412027Sjungma@eit.uni-kl.de}
205512027Sjungma@eit.uni-kl.de
205612027Sjungma@eit.uni-kl.de
205712027Sjungma@eit.uni-kl.debool
205812027Sjungma@eit.uni-kl.deoperator<=(long u, const CLASS_TYPE& v)
205912027Sjungma@eit.uni-kl.de{
206012027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
206112027Sjungma@eit.uni-kl.de}
206212027Sjungma@eit.uni-kl.de
206312027Sjungma@eit.uni-kl.de
206412027Sjungma@eit.uni-kl.debool
206512027Sjungma@eit.uni-kl.deoperator<=(const CLASS_TYPE& u, unsigned long v)
206612027Sjungma@eit.uni-kl.de{
206712027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
206812027Sjungma@eit.uni-kl.de}
206912027Sjungma@eit.uni-kl.de
207012027Sjungma@eit.uni-kl.de
207112027Sjungma@eit.uni-kl.debool
207212027Sjungma@eit.uni-kl.deoperator<=(unsigned long u, const CLASS_TYPE& v)
207312027Sjungma@eit.uni-kl.de{
207412027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
207512027Sjungma@eit.uni-kl.de}
207612027Sjungma@eit.uni-kl.de
207712027Sjungma@eit.uni-kl.de
207812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
207912027Sjungma@eit.uni-kl.de//  SECTION: GREATER THAN operator: >
208012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
208112027Sjungma@eit.uni-kl.de
208212027Sjungma@eit.uni-kl.debool
208312027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, const CLASS_TYPE& v)
208412027Sjungma@eit.uni-kl.de{
208512027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
208612027Sjungma@eit.uni-kl.de}
208712027Sjungma@eit.uni-kl.de
208812027Sjungma@eit.uni-kl.de
208912027Sjungma@eit.uni-kl.debool
209012027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, int64 v)
209112027Sjungma@eit.uni-kl.de{
209212027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
209312027Sjungma@eit.uni-kl.de}
209412027Sjungma@eit.uni-kl.de
209512027Sjungma@eit.uni-kl.de
209612027Sjungma@eit.uni-kl.debool
209712027Sjungma@eit.uni-kl.deoperator>(int64 u, const CLASS_TYPE& v)
209812027Sjungma@eit.uni-kl.de{
209912027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
210012027Sjungma@eit.uni-kl.de}
210112027Sjungma@eit.uni-kl.de
210212027Sjungma@eit.uni-kl.de
210312027Sjungma@eit.uni-kl.debool
210412027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, uint64 v)
210512027Sjungma@eit.uni-kl.de{
210612027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
210712027Sjungma@eit.uni-kl.de}
210812027Sjungma@eit.uni-kl.de
210912027Sjungma@eit.uni-kl.de
211012027Sjungma@eit.uni-kl.debool
211112027Sjungma@eit.uni-kl.deoperator>(uint64 u, const CLASS_TYPE& v)
211212027Sjungma@eit.uni-kl.de{
211312027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
211412027Sjungma@eit.uni-kl.de}
211512027Sjungma@eit.uni-kl.de
211612027Sjungma@eit.uni-kl.de
211712027Sjungma@eit.uni-kl.debool
211812027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, long v)
211912027Sjungma@eit.uni-kl.de{
212012027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
212112027Sjungma@eit.uni-kl.de}
212212027Sjungma@eit.uni-kl.de
212312027Sjungma@eit.uni-kl.de
212412027Sjungma@eit.uni-kl.debool
212512027Sjungma@eit.uni-kl.deoperator>(long u, const CLASS_TYPE& v)
212612027Sjungma@eit.uni-kl.de{
212712027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
212812027Sjungma@eit.uni-kl.de}
212912027Sjungma@eit.uni-kl.de
213012027Sjungma@eit.uni-kl.de
213112027Sjungma@eit.uni-kl.debool
213212027Sjungma@eit.uni-kl.deoperator>(const CLASS_TYPE& u, unsigned long v)
213312027Sjungma@eit.uni-kl.de{
213412027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
213512027Sjungma@eit.uni-kl.de}
213612027Sjungma@eit.uni-kl.de
213712027Sjungma@eit.uni-kl.de
213812027Sjungma@eit.uni-kl.debool
213912027Sjungma@eit.uni-kl.deoperator>(unsigned long u, const CLASS_TYPE& v)
214012027Sjungma@eit.uni-kl.de{
214112027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
214212027Sjungma@eit.uni-kl.de}
214312027Sjungma@eit.uni-kl.de
214412027Sjungma@eit.uni-kl.de
214512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
214612027Sjungma@eit.uni-kl.de//  SECTION: GREATER THAN or EQUAL operator: >=
214712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
214812027Sjungma@eit.uni-kl.de
214912027Sjungma@eit.uni-kl.debool
215012027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, const CLASS_TYPE& v)
215112027Sjungma@eit.uni-kl.de{
215212027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
215312027Sjungma@eit.uni-kl.de}
215412027Sjungma@eit.uni-kl.de
215512027Sjungma@eit.uni-kl.de
215612027Sjungma@eit.uni-kl.debool
215712027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, int64 v)
215812027Sjungma@eit.uni-kl.de{
215912027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
216012027Sjungma@eit.uni-kl.de}
216112027Sjungma@eit.uni-kl.de
216212027Sjungma@eit.uni-kl.de
216312027Sjungma@eit.uni-kl.debool
216412027Sjungma@eit.uni-kl.deoperator>=(int64 u, const CLASS_TYPE& v)
216512027Sjungma@eit.uni-kl.de{
216612027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
216712027Sjungma@eit.uni-kl.de}
216812027Sjungma@eit.uni-kl.de
216912027Sjungma@eit.uni-kl.de
217012027Sjungma@eit.uni-kl.debool
217112027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, uint64 v)
217212027Sjungma@eit.uni-kl.de{
217312027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
217412027Sjungma@eit.uni-kl.de}
217512027Sjungma@eit.uni-kl.de
217612027Sjungma@eit.uni-kl.de
217712027Sjungma@eit.uni-kl.debool
217812027Sjungma@eit.uni-kl.deoperator>=(uint64 u, const CLASS_TYPE& v)
217912027Sjungma@eit.uni-kl.de{
218012027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
218112027Sjungma@eit.uni-kl.de}
218212027Sjungma@eit.uni-kl.de
218312027Sjungma@eit.uni-kl.de
218412027Sjungma@eit.uni-kl.debool
218512027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, long v)
218612027Sjungma@eit.uni-kl.de{
218712027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
218812027Sjungma@eit.uni-kl.de}
218912027Sjungma@eit.uni-kl.de
219012027Sjungma@eit.uni-kl.de
219112027Sjungma@eit.uni-kl.debool
219212027Sjungma@eit.uni-kl.deoperator>=(long u, const CLASS_TYPE& v)
219312027Sjungma@eit.uni-kl.de{
219412027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
219512027Sjungma@eit.uni-kl.de}
219612027Sjungma@eit.uni-kl.de
219712027Sjungma@eit.uni-kl.de
219812027Sjungma@eit.uni-kl.debool
219912027Sjungma@eit.uni-kl.deoperator>=(const CLASS_TYPE& u, unsigned long v)
220012027Sjungma@eit.uni-kl.de{
220112027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
220212027Sjungma@eit.uni-kl.de}
220312027Sjungma@eit.uni-kl.de
220412027Sjungma@eit.uni-kl.de
220512027Sjungma@eit.uni-kl.debool
220612027Sjungma@eit.uni-kl.deoperator>=(unsigned long u, const CLASS_TYPE& v)
220712027Sjungma@eit.uni-kl.de{
220812027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
220912027Sjungma@eit.uni-kl.de}
221012027Sjungma@eit.uni-kl.de
221112027Sjungma@eit.uni-kl.de
221212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
221312027Sjungma@eit.uni-kl.de//  SECTION: Public members - Other utils.
221412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
221512027Sjungma@eit.uni-kl.de
221612027Sjungma@eit.uni-kl.de// Convert to int64, long, or int.
221712027Sjungma@eit.uni-kl.de#define TO_INTX(RET_TYPE, UP_RET_TYPE)   \
221812027Sjungma@eit.uni-kl.de                                                             \
221912027Sjungma@eit.uni-kl.deif (sgn == SC_ZERO)                                          \
222012027Sjungma@eit.uni-kl.dereturn 0;                                                    \
222112027Sjungma@eit.uni-kl.de                                                             \
222212027Sjungma@eit.uni-kl.deint vnd = sc_min((int)DIGITS_PER_ ## UP_RET_TYPE, ndigits); \
222312027Sjungma@eit.uni-kl.de                                                             \
222412027Sjungma@eit.uni-kl.deRET_TYPE v = 0;                                              \
222512027Sjungma@eit.uni-kl.dewhile (--vnd >= 0)                                           \
222612027Sjungma@eit.uni-kl.dev = (v << BITS_PER_DIGIT) + digit[vnd];                      \
222712027Sjungma@eit.uni-kl.de                                                             \
222812027Sjungma@eit.uni-kl.deif (sgn == SC_NEG)                                           \
222912027Sjungma@eit.uni-kl.dereturn -v;                                                   \
223012027Sjungma@eit.uni-kl.deelse                                                         \
223112027Sjungma@eit.uni-kl.dereturn v;
223212027Sjungma@eit.uni-kl.de
223312027Sjungma@eit.uni-kl.de
223412027Sjungma@eit.uni-kl.deint64
223512027Sjungma@eit.uni-kl.deCLASS_TYPE::to_int64() const
223612027Sjungma@eit.uni-kl.de{
223712027Sjungma@eit.uni-kl.de  TO_INTX(int64, INT64);
223812027Sjungma@eit.uni-kl.de}
223912027Sjungma@eit.uni-kl.de
224012027Sjungma@eit.uni-kl.de
224112027Sjungma@eit.uni-kl.delong
224212027Sjungma@eit.uni-kl.deCLASS_TYPE::to_long() const
224312027Sjungma@eit.uni-kl.de{
224412027Sjungma@eit.uni-kl.de  TO_INTX(long, LONG);
224512027Sjungma@eit.uni-kl.de}
224612027Sjungma@eit.uni-kl.de
224712027Sjungma@eit.uni-kl.de
224812027Sjungma@eit.uni-kl.deint
224912027Sjungma@eit.uni-kl.deCLASS_TYPE::to_int() const
225012027Sjungma@eit.uni-kl.de{
225112027Sjungma@eit.uni-kl.de  TO_INTX(int, INT);
225212027Sjungma@eit.uni-kl.de}
225312027Sjungma@eit.uni-kl.de
225412027Sjungma@eit.uni-kl.de
225512027Sjungma@eit.uni-kl.de// Convert to unsigned int64, unsigned long or unsigned
225612027Sjungma@eit.uni-kl.de// int. to_uint64, to_ulong, and to_uint have the same body except for
225712027Sjungma@eit.uni-kl.de// the type of v defined inside.
225812027Sjungma@eit.uni-kl.deuint64
225912027Sjungma@eit.uni-kl.deCLASS_TYPE::to_uint64() const
226012027Sjungma@eit.uni-kl.de{
226112027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
226212027Sjungma@eit.uni-kl.de    return 0;
226312027Sjungma@eit.uni-kl.de
226412027Sjungma@eit.uni-kl.de  int vnd = sc_min((int)DIGITS_PER_INT64, ndigits);
226512027Sjungma@eit.uni-kl.de
226612027Sjungma@eit.uni-kl.de  uint64 v = 0;
226712027Sjungma@eit.uni-kl.de
226812027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG) {
226912027Sjungma@eit.uni-kl.de
227012027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
227112027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
227212027Sjungma@eit.uni-kl.de#else
227312027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[ndigits];
227412027Sjungma@eit.uni-kl.de#endif
227512027Sjungma@eit.uni-kl.de
227612027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
227712027Sjungma@eit.uni-kl.de
227812027Sjungma@eit.uni-kl.de    convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d);
227912027Sjungma@eit.uni-kl.de
228012027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
228112027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + d[vnd];
228212027Sjungma@eit.uni-kl.de
228312027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
228412027Sjungma@eit.uni-kl.de    delete [] d;
228512027Sjungma@eit.uni-kl.de#endif
228612027Sjungma@eit.uni-kl.de
228712027Sjungma@eit.uni-kl.de  }
228812027Sjungma@eit.uni-kl.de  else {
228912027Sjungma@eit.uni-kl.de
229012027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
229112027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + digit[vnd];
229212027Sjungma@eit.uni-kl.de
229312027Sjungma@eit.uni-kl.de  }
229412027Sjungma@eit.uni-kl.de
229512027Sjungma@eit.uni-kl.de  return v;
229612027Sjungma@eit.uni-kl.de}
229712027Sjungma@eit.uni-kl.de
229812027Sjungma@eit.uni-kl.de
229912027Sjungma@eit.uni-kl.deunsigned long
230012027Sjungma@eit.uni-kl.deCLASS_TYPE::to_ulong() const
230112027Sjungma@eit.uni-kl.de{
230212027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
230312027Sjungma@eit.uni-kl.de    return 0;
230412027Sjungma@eit.uni-kl.de
230512027Sjungma@eit.uni-kl.de  int vnd = sc_min((int)DIGITS_PER_LONG, ndigits);
230612027Sjungma@eit.uni-kl.de
230712027Sjungma@eit.uni-kl.de  unsigned long v = 0;
230812027Sjungma@eit.uni-kl.de
230912027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG) {
231012027Sjungma@eit.uni-kl.de
231112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
231212027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
231312027Sjungma@eit.uni-kl.de#else
231412027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[ndigits];
231512027Sjungma@eit.uni-kl.de#endif
231612027Sjungma@eit.uni-kl.de
231712027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
231812027Sjungma@eit.uni-kl.de
231912027Sjungma@eit.uni-kl.de    convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d);
232012027Sjungma@eit.uni-kl.de
232112027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
232212027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + d[vnd];
232312027Sjungma@eit.uni-kl.de
232412027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
232512027Sjungma@eit.uni-kl.de    delete [] d;
232612027Sjungma@eit.uni-kl.de#endif
232712027Sjungma@eit.uni-kl.de
232812027Sjungma@eit.uni-kl.de  }
232912027Sjungma@eit.uni-kl.de  else {
233012027Sjungma@eit.uni-kl.de
233112027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
233212027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + digit[vnd];
233312027Sjungma@eit.uni-kl.de
233412027Sjungma@eit.uni-kl.de  }
233512027Sjungma@eit.uni-kl.de
233612027Sjungma@eit.uni-kl.de  return v;
233712027Sjungma@eit.uni-kl.de}
233812027Sjungma@eit.uni-kl.de
233912027Sjungma@eit.uni-kl.de
234012027Sjungma@eit.uni-kl.deunsigned int
234112027Sjungma@eit.uni-kl.deCLASS_TYPE::to_uint() const
234212027Sjungma@eit.uni-kl.de{
234312027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
234412027Sjungma@eit.uni-kl.de    return 0;
234512027Sjungma@eit.uni-kl.de
234612027Sjungma@eit.uni-kl.de  int vnd = sc_min((int)DIGITS_PER_INT, ndigits);
234712027Sjungma@eit.uni-kl.de
234812027Sjungma@eit.uni-kl.de  unsigned int v = 0;
234912027Sjungma@eit.uni-kl.de
235012027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG) {
235112027Sjungma@eit.uni-kl.de
235212027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
235312027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
235412027Sjungma@eit.uni-kl.de#else
235512027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[ndigits];
235612027Sjungma@eit.uni-kl.de#endif
235712027Sjungma@eit.uni-kl.de
235812027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
235912027Sjungma@eit.uni-kl.de
236012027Sjungma@eit.uni-kl.de    convert_SM_to_2C_trimmed(IF_SC_SIGNED, sgn, nbits, ndigits, d);
236112027Sjungma@eit.uni-kl.de
236212027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
236312027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + d[vnd];
236412027Sjungma@eit.uni-kl.de
236512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
236612027Sjungma@eit.uni-kl.de    delete [] d;
236712027Sjungma@eit.uni-kl.de#endif
236812027Sjungma@eit.uni-kl.de
236912027Sjungma@eit.uni-kl.de  }
237012027Sjungma@eit.uni-kl.de  else {
237112027Sjungma@eit.uni-kl.de
237212027Sjungma@eit.uni-kl.de    while (--vnd >= 0)
237312027Sjungma@eit.uni-kl.de      v = (v << BITS_PER_DIGIT) + digit[vnd];
237412027Sjungma@eit.uni-kl.de
237512027Sjungma@eit.uni-kl.de  }
237612027Sjungma@eit.uni-kl.de
237712027Sjungma@eit.uni-kl.de  return v;
237812027Sjungma@eit.uni-kl.de}
237912027Sjungma@eit.uni-kl.de
238012027Sjungma@eit.uni-kl.de
238112027Sjungma@eit.uni-kl.de// Convert to double.
238212027Sjungma@eit.uni-kl.dedouble
238312027Sjungma@eit.uni-kl.deCLASS_TYPE::to_double() const
238412027Sjungma@eit.uni-kl.de{
238512027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
238612027Sjungma@eit.uni-kl.de    return (double) 0.0;
238712027Sjungma@eit.uni-kl.de
238812027Sjungma@eit.uni-kl.de  int vnd = ndigits;
238912027Sjungma@eit.uni-kl.de
239012027Sjungma@eit.uni-kl.de  double v = 0.0;
239112027Sjungma@eit.uni-kl.de  while (--vnd >= 0)
239212027Sjungma@eit.uni-kl.de    v = v * DIGIT_RADIX + digit[vnd];
239312027Sjungma@eit.uni-kl.de
239412027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG)
239512027Sjungma@eit.uni-kl.de    return -v;
239612027Sjungma@eit.uni-kl.de  else
239712027Sjungma@eit.uni-kl.de    return v;
239812027Sjungma@eit.uni-kl.de}
239912027Sjungma@eit.uni-kl.de
240012027Sjungma@eit.uni-kl.de
240112027Sjungma@eit.uni-kl.de// Return true if the bit i is 1, false otherwise. If i is outside the
240212027Sjungma@eit.uni-kl.de// bounds, return 1/0 according to the sign of the number by assuming
240312027Sjungma@eit.uni-kl.de// that the number has infinite length.
240412027Sjungma@eit.uni-kl.de
240512027Sjungma@eit.uni-kl.debool
240612027Sjungma@eit.uni-kl.deCLASS_TYPE::test(int i) const
240712027Sjungma@eit.uni-kl.de{
240812027Sjungma@eit.uni-kl.de#ifdef SC_SIGNED
240912027Sjungma@eit.uni-kl.de  if (check_if_outside(i)) {
241012027Sjungma@eit.uni-kl.de    if (sgn == SC_NEG)
241112027Sjungma@eit.uni-kl.de      return 1;
241212027Sjungma@eit.uni-kl.de    else
241312027Sjungma@eit.uni-kl.de      return 0;
241412027Sjungma@eit.uni-kl.de  }
241512027Sjungma@eit.uni-kl.de#else
241612027Sjungma@eit.uni-kl.de  if (check_if_outside(i))
241712027Sjungma@eit.uni-kl.de    return 0;
241812027Sjungma@eit.uni-kl.de#endif
241912027Sjungma@eit.uni-kl.de
242012027Sjungma@eit.uni-kl.de  int bit_num = bit_ord(i);
242112027Sjungma@eit.uni-kl.de  int digit_num = digit_ord(i);
242212027Sjungma@eit.uni-kl.de
242312027Sjungma@eit.uni-kl.de  if (sgn == SC_NEG) {
242412027Sjungma@eit.uni-kl.de
242512027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
242612027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
242712027Sjungma@eit.uni-kl.de#else
242812027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[ndigits];
242912027Sjungma@eit.uni-kl.de#endif
243012027Sjungma@eit.uni-kl.de
243112027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
243212027Sjungma@eit.uni-kl.de    vec_complement(ndigits, d);
243312027Sjungma@eit.uni-kl.de    bool val = ((d[digit_num] & one_and_zeros(bit_num)) != 0);
243412027Sjungma@eit.uni-kl.de
243512027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
243612027Sjungma@eit.uni-kl.de    delete [] d;
243712027Sjungma@eit.uni-kl.de#endif
243812027Sjungma@eit.uni-kl.de
243912027Sjungma@eit.uni-kl.de    return val;
244012027Sjungma@eit.uni-kl.de
244112027Sjungma@eit.uni-kl.de  }
244212027Sjungma@eit.uni-kl.de  else
244312027Sjungma@eit.uni-kl.de    return ((digit[digit_num] & one_and_zeros(bit_num)) != 0);
244412027Sjungma@eit.uni-kl.de}
244512027Sjungma@eit.uni-kl.de
244612027Sjungma@eit.uni-kl.de
244712027Sjungma@eit.uni-kl.de// Set the ith bit with 1.
244812027Sjungma@eit.uni-kl.devoid
244912027Sjungma@eit.uni-kl.deCLASS_TYPE::set(int i)
245012027Sjungma@eit.uni-kl.de{
245112027Sjungma@eit.uni-kl.de  if (check_if_outside(i))
245212027Sjungma@eit.uni-kl.de    return;
245312027Sjungma@eit.uni-kl.de
245412027Sjungma@eit.uni-kl.de  int bit_num = bit_ord(i);
245512027Sjungma@eit.uni-kl.de  int digit_num = digit_ord(i);
245612027Sjungma@eit.uni-kl.de
245712027Sjungma@eit.uni-kl.de  convert_SM_to_2C();
245812027Sjungma@eit.uni-kl.de  digit[digit_num] |= one_and_zeros(bit_num);
245912027Sjungma@eit.uni-kl.de  digit[digit_num] &= DIGIT_MASK; // Needed to zero the overflow bits.
246012027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
246112027Sjungma@eit.uni-kl.de}
246212027Sjungma@eit.uni-kl.de
246312027Sjungma@eit.uni-kl.de
246412027Sjungma@eit.uni-kl.de// Set the ith bit with 0, i.e., clear the ith bit.
246512027Sjungma@eit.uni-kl.devoid
246612027Sjungma@eit.uni-kl.deCLASS_TYPE::clear(int i)
246712027Sjungma@eit.uni-kl.de{
246812027Sjungma@eit.uni-kl.de  if (check_if_outside(i))
246912027Sjungma@eit.uni-kl.de    return;
247012027Sjungma@eit.uni-kl.de
247112027Sjungma@eit.uni-kl.de  int bit_num = bit_ord(i);
247212027Sjungma@eit.uni-kl.de  int digit_num = digit_ord(i);
247312027Sjungma@eit.uni-kl.de
247412027Sjungma@eit.uni-kl.de  convert_SM_to_2C();
247512027Sjungma@eit.uni-kl.de  digit[digit_num] &= ~(one_and_zeros(bit_num));
247612027Sjungma@eit.uni-kl.de  digit[digit_num] &= DIGIT_MASK; // Needed to zero the overflow bits.
247712027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
247812027Sjungma@eit.uni-kl.de}
247912027Sjungma@eit.uni-kl.de
248012027Sjungma@eit.uni-kl.de
248112027Sjungma@eit.uni-kl.de// Create a mirror image of the number.
248212027Sjungma@eit.uni-kl.devoid
248312027Sjungma@eit.uni-kl.deCLASS_TYPE::reverse()
248412027Sjungma@eit.uni-kl.de{
248512027Sjungma@eit.uni-kl.de  convert_SM_to_2C();
248612027Sjungma@eit.uni-kl.de  vec_reverse(length(), ndigits, digit, length() - 1);
248712027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
248812027Sjungma@eit.uni-kl.de}
248912027Sjungma@eit.uni-kl.de
249012027Sjungma@eit.uni-kl.de
249112027Sjungma@eit.uni-kl.de// Get a packed bit representation of the number.
249212027Sjungma@eit.uni-kl.devoid
249312027Sjungma@eit.uni-kl.deCLASS_TYPE::get_packed_rep(sc_digit *buf) const
249412027Sjungma@eit.uni-kl.de{
249512027Sjungma@eit.uni-kl.de  int buf_ndigits = (length() - 1) / BITS_PER_DIGIT_TYPE + 1;
249612027Sjungma@eit.uni-kl.de
249712027Sjungma@eit.uni-kl.de  // Initialize buf to zero.
249812027Sjungma@eit.uni-kl.de  vec_zero(buf_ndigits, buf);
249912027Sjungma@eit.uni-kl.de
250012027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
250112027Sjungma@eit.uni-kl.de    return;
250212027Sjungma@eit.uni-kl.de
250312027Sjungma@eit.uni-kl.de  const sc_digit *digit_or_d;
250412027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
250512027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
250612027Sjungma@eit.uni-kl.de#else
250712027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[ndigits];
250812027Sjungma@eit.uni-kl.de#endif
250912027Sjungma@eit.uni-kl.de
251012027Sjungma@eit.uni-kl.de  if (sgn == SC_POS)
251112027Sjungma@eit.uni-kl.de    digit_or_d = digit;
251212027Sjungma@eit.uni-kl.de
251312027Sjungma@eit.uni-kl.de  else
251412027Sjungma@eit.uni-kl.de  {
251512027Sjungma@eit.uni-kl.de    // If sgn is negative, we have to convert digit to its 2's
251612027Sjungma@eit.uni-kl.de    // complement. Since this function is const, we can not do it on
251712027Sjungma@eit.uni-kl.de    // digit. Since buf doesn't have overflow bits, we cannot also do
251812027Sjungma@eit.uni-kl.de    // it on buf. Thus, we have to do the complementation on a copy of
251912027Sjungma@eit.uni-kl.de    // digit, i.e., on d.
252012027Sjungma@eit.uni-kl.de
252112027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
252212027Sjungma@eit.uni-kl.de    vec_complement(ndigits, d);
252312027Sjungma@eit.uni-kl.de
252412027Sjungma@eit.uni-kl.de    buf[buf_ndigits - 1] = ~((sc_digit) 0);
252512027Sjungma@eit.uni-kl.de
252612027Sjungma@eit.uni-kl.de    digit_or_d = d;
252712027Sjungma@eit.uni-kl.de
252812027Sjungma@eit.uni-kl.de  }
252912027Sjungma@eit.uni-kl.de
253012027Sjungma@eit.uni-kl.de  // Copy the bits from digit to buf. The division and mod operations
253112027Sjungma@eit.uni-kl.de  // below can be converted to addition/subtraction and comparison
253212027Sjungma@eit.uni-kl.de  // operations at the expense of complicating the code. We can do it
253312027Sjungma@eit.uni-kl.de  // if we see any performance problems.
253412027Sjungma@eit.uni-kl.de
253512027Sjungma@eit.uni-kl.de  for (int i = length() - 1; i >= 0; --i) {
253612027Sjungma@eit.uni-kl.de
253712027Sjungma@eit.uni-kl.de    if ((digit_or_d[digit_ord(i)] & one_and_zeros(bit_ord(i))) != 0) // Test.
253812027Sjungma@eit.uni-kl.de
253912027Sjungma@eit.uni-kl.de      buf[i / BITS_PER_DIGIT_TYPE] |=
254012027Sjungma@eit.uni-kl.de        one_and_zeros(i % BITS_PER_DIGIT_TYPE); // Set.
254112027Sjungma@eit.uni-kl.de
254212027Sjungma@eit.uni-kl.de    else
254312027Sjungma@eit.uni-kl.de
254412027Sjungma@eit.uni-kl.de      buf[i / BITS_PER_DIGIT_TYPE] &=
254512027Sjungma@eit.uni-kl.de        ~(one_and_zeros(i % BITS_PER_DIGIT_TYPE));  // Clear.
254612027Sjungma@eit.uni-kl.de
254712027Sjungma@eit.uni-kl.de  }
254812027Sjungma@eit.uni-kl.de
254912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
255012027Sjungma@eit.uni-kl.de    delete[] d;
255112027Sjungma@eit.uni-kl.de#endif
255212027Sjungma@eit.uni-kl.de}
255312027Sjungma@eit.uni-kl.de
255412027Sjungma@eit.uni-kl.de
255512027Sjungma@eit.uni-kl.de// Set a packed bit representation of the number.
255612027Sjungma@eit.uni-kl.devoid
255712027Sjungma@eit.uni-kl.deCLASS_TYPE::set_packed_rep(sc_digit *buf)
255812027Sjungma@eit.uni-kl.de{
255912027Sjungma@eit.uni-kl.de  // Initialize digit to zero.
256012027Sjungma@eit.uni-kl.de  vec_zero(ndigits, digit);
256112027Sjungma@eit.uni-kl.de
256212027Sjungma@eit.uni-kl.de  // Copy the bits from buf to digit.
256312027Sjungma@eit.uni-kl.de  for (int i = length() - 1; i >= 0; --i) {
256412027Sjungma@eit.uni-kl.de
256512027Sjungma@eit.uni-kl.de    if ((buf[i / BITS_PER_DIGIT_TYPE] &
256612027Sjungma@eit.uni-kl.de         one_and_zeros(i % BITS_PER_DIGIT_TYPE)) != 0) // Test.
256712027Sjungma@eit.uni-kl.de
256812027Sjungma@eit.uni-kl.de      digit[digit_ord(i)] |= one_and_zeros(bit_ord(i));     // Set.
256912027Sjungma@eit.uni-kl.de
257012027Sjungma@eit.uni-kl.de    else
257112027Sjungma@eit.uni-kl.de
257212027Sjungma@eit.uni-kl.de      digit[digit_ord(i)] &= ~(one_and_zeros(bit_ord(i)));  // Clear
257312027Sjungma@eit.uni-kl.de
257412027Sjungma@eit.uni-kl.de  }
257512027Sjungma@eit.uni-kl.de
257612027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
257712027Sjungma@eit.uni-kl.de}
257812027Sjungma@eit.uni-kl.de
257912027Sjungma@eit.uni-kl.de
258012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
258112027Sjungma@eit.uni-kl.de//  SECTION: Private members.
258212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
258312027Sjungma@eit.uni-kl.de
258412027Sjungma@eit.uni-kl.de// Create a copy of v with sgn s.
258512027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE& v, small_type s) :
258612027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(s), nbits(v.nbits), ndigits(v.ndigits), digit()
258712027Sjungma@eit.uni-kl.de{
258812027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
258912027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
259012027Sjungma@eit.uni-kl.de#endif
259112027Sjungma@eit.uni-kl.de
259212027Sjungma@eit.uni-kl.de  vec_copy(ndigits, digit, v.digit);
259312027Sjungma@eit.uni-kl.de}
259412027Sjungma@eit.uni-kl.de
259512027Sjungma@eit.uni-kl.de
259612027Sjungma@eit.uni-kl.de// Create a copy of v where v is of the different type.
259712027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE& v, small_type s) :
259812027Sjungma@eit.uni-kl.de    sc_value_base(v), sgn(s), nbits(num_bits(v.nbits)), ndigits(), digit()
259912027Sjungma@eit.uni-kl.de{
260012027Sjungma@eit.uni-kl.de#if (IF_SC_SIGNED == 1)
260112027Sjungma@eit.uni-kl.de  ndigits = v.ndigits;
260212027Sjungma@eit.uni-kl.de#else
260312027Sjungma@eit.uni-kl.de  ndigits = DIV_CEIL(nbits);
260412027Sjungma@eit.uni-kl.de#endif
260512027Sjungma@eit.uni-kl.de
260612027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
260712027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
260812027Sjungma@eit.uni-kl.de#endif
260912027Sjungma@eit.uni-kl.de
261012027Sjungma@eit.uni-kl.de  copy_digits(v.nbits, v.ndigits, v.digit);
261112027Sjungma@eit.uni-kl.de}
261212027Sjungma@eit.uni-kl.de
261312027Sjungma@eit.uni-kl.de
261412027Sjungma@eit.uni-kl.de// Create a signed number with (s, nb, nd, d) as its attributes (as
261512027Sjungma@eit.uni-kl.de// defined in class CLASS_TYPE). If alloc is set, delete d.
261612027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(small_type s, int nb,
261712027Sjungma@eit.uni-kl.de                       int nd, sc_digit *d,
261812027Sjungma@eit.uni-kl.de                       bool alloc) :
261912027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(s), nbits(num_bits(nb)), ndigits(), digit()
262012027Sjungma@eit.uni-kl.de{
262112027Sjungma@eit.uni-kl.de  ndigits = DIV_CEIL(nbits);
262212027Sjungma@eit.uni-kl.de
262312027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
262412027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
262512027Sjungma@eit.uni-kl.de#endif
262612027Sjungma@eit.uni-kl.de
262712027Sjungma@eit.uni-kl.de  if (ndigits <= nd)
262812027Sjungma@eit.uni-kl.de    vec_copy(ndigits, digit, d);
262912027Sjungma@eit.uni-kl.de  else
263012027Sjungma@eit.uni-kl.de    vec_copy_and_zero(ndigits, digit, nd, d);
263112027Sjungma@eit.uni-kl.de
263212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
263312027Sjungma@eit.uni-kl.de  if (alloc)
263412027Sjungma@eit.uni-kl.de    delete [] d;
263512027Sjungma@eit.uni-kl.de#endif
263612027Sjungma@eit.uni-kl.de}
263712027Sjungma@eit.uni-kl.de
263812027Sjungma@eit.uni-kl.de// This constructor is mainly used in finding a "range" of bits from a
263912027Sjungma@eit.uni-kl.de// number of type CLASS_TYPE. The function range(l, r) can have
264012027Sjungma@eit.uni-kl.de// arbitrary precedence between l and r. If l is smaller than r, then
264112027Sjungma@eit.uni-kl.de// the output is the reverse of range(r, l).
264212027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const CLASS_TYPE* u, int l, int r) :
264312027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(), nbits(), ndigits(), digit()
264412027Sjungma@eit.uni-kl.de{
264512027Sjungma@eit.uni-kl.de  bool reversed = false;
264612027Sjungma@eit.uni-kl.de
264712027Sjungma@eit.uni-kl.de  if( l < r ) {
264812027Sjungma@eit.uni-kl.de    reversed = true;
264912027Sjungma@eit.uni-kl.de    int tmp = l;
265012027Sjungma@eit.uni-kl.de    l = r;
265112027Sjungma@eit.uni-kl.de    r = tmp;
265212027Sjungma@eit.uni-kl.de  }
265312027Sjungma@eit.uni-kl.de
265412027Sjungma@eit.uni-kl.de  // at this point, l >= r
265512027Sjungma@eit.uni-kl.de
265612027Sjungma@eit.uni-kl.de  // make sure that l and r point to the bits of u
265712027Sjungma@eit.uni-kl.de  r = sc_max( r, 0 );
265812027Sjungma@eit.uni-kl.de  l = sc_min( l, u->nbits - 1 );
265912027Sjungma@eit.uni-kl.de
266012027Sjungma@eit.uni-kl.de  nbits = num_bits( l - r + 1 );
266112027Sjungma@eit.uni-kl.de
266212027Sjungma@eit.uni-kl.de  // nbits can still be <= 0 because l and r have just been updated
266312027Sjungma@eit.uni-kl.de  // with the bounds of u.
266412027Sjungma@eit.uni-kl.de
266512027Sjungma@eit.uni-kl.de  // if u == 0 or the range is out of bounds, return 0
266612027Sjungma@eit.uni-kl.de  if( u->sgn == SC_ZERO || nbits <= num_bits( 0 ) ) {
266712027Sjungma@eit.uni-kl.de    sgn = SC_ZERO;
266812027Sjungma@eit.uni-kl.de    if( nbits <= num_bits( 0 ) ) {
266912027Sjungma@eit.uni-kl.de      nbits = 1;
267012027Sjungma@eit.uni-kl.de    }
267112027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL( nbits );
267212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
267312027Sjungma@eit.uni-kl.de    digit = new sc_digit[ndigits];
267412027Sjungma@eit.uni-kl.de#endif
267512027Sjungma@eit.uni-kl.de    vec_zero( ndigits, digit );
267612027Sjungma@eit.uni-kl.de    return;
267712027Sjungma@eit.uni-kl.de  }
267812027Sjungma@eit.uni-kl.de
267912027Sjungma@eit.uni-kl.de  // The rest will be executed if u is not zero.
268012027Sjungma@eit.uni-kl.de
268112027Sjungma@eit.uni-kl.de  ndigits = DIV_CEIL(nbits);
268212027Sjungma@eit.uni-kl.de
268312027Sjungma@eit.uni-kl.de  // The number of bits up to and including l and r, respectively.
268412027Sjungma@eit.uni-kl.de  int nl = l + 1;
268512027Sjungma@eit.uni-kl.de  int nr = r + 1;
268612027Sjungma@eit.uni-kl.de
268712027Sjungma@eit.uni-kl.de  // The indices of the digits that have lth and rth bits, respectively.
268812027Sjungma@eit.uni-kl.de  int left_digit = DIV_CEIL(nl) - 1;
268912027Sjungma@eit.uni-kl.de  int right_digit = DIV_CEIL(nr) - 1;
269012027Sjungma@eit.uni-kl.de
269112027Sjungma@eit.uni-kl.de  int nd;
269212027Sjungma@eit.uni-kl.de
269312027Sjungma@eit.uni-kl.de  // The range is performed on the 2's complement representation, so
269412027Sjungma@eit.uni-kl.de  // first get the indices for that.
269512027Sjungma@eit.uni-kl.de  if (u->sgn == SC_NEG)
269612027Sjungma@eit.uni-kl.de    nd = left_digit + 1;
269712027Sjungma@eit.uni-kl.de  else
269812027Sjungma@eit.uni-kl.de    nd = left_digit - right_digit + 1;
269912027Sjungma@eit.uni-kl.de
270012027Sjungma@eit.uni-kl.de  // Allocate memory for the range.
270112027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
270212027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
270312027Sjungma@eit.uni-kl.de#else
270412027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
270512027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[nd];
270612027Sjungma@eit.uni-kl.de#endif
270712027Sjungma@eit.uni-kl.de
270812027Sjungma@eit.uni-kl.de  // Getting the range on the 2's complement representation.
270912027Sjungma@eit.uni-kl.de  if (u->sgn == SC_NEG) {
271012027Sjungma@eit.uni-kl.de
271112027Sjungma@eit.uni-kl.de    vec_copy(nd, d, u->digit);
271212027Sjungma@eit.uni-kl.de    vec_complement(nd, d);  // d = -d;
271312027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, r, DIGIT_MASK);
271412027Sjungma@eit.uni-kl.de
271512027Sjungma@eit.uni-kl.de  }
271612027Sjungma@eit.uni-kl.de  else {
271712027Sjungma@eit.uni-kl.de
271812027Sjungma@eit.uni-kl.de    for (int i = right_digit; i <= left_digit; ++i)
271912027Sjungma@eit.uni-kl.de      d[i - right_digit] = u->digit[i];
272012027Sjungma@eit.uni-kl.de
272112027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, r - right_digit * BITS_PER_DIGIT, 0);
272212027Sjungma@eit.uni-kl.de
272312027Sjungma@eit.uni-kl.de  }
272412027Sjungma@eit.uni-kl.de
272512027Sjungma@eit.uni-kl.de  vec_zero(ndigits, digit);
272612027Sjungma@eit.uni-kl.de
272712027Sjungma@eit.uni-kl.de  if (! reversed)
272812027Sjungma@eit.uni-kl.de    vec_copy(sc_min(nd, ndigits), digit, d);
272912027Sjungma@eit.uni-kl.de
273012027Sjungma@eit.uni-kl.de  else {
273112027Sjungma@eit.uni-kl.de
273212027Sjungma@eit.uni-kl.de    // If l < r, i.e., reversed is set, reverse the bits of digit.  d
273312027Sjungma@eit.uni-kl.de    // will be used as a temporary store. The following code tries to
273412027Sjungma@eit.uni-kl.de    // minimize the use of bit_ord and digit_ord, which use mod and
273512027Sjungma@eit.uni-kl.de    // div operators. Since these operators are function calls to
273612027Sjungma@eit.uni-kl.de    // standard library routines, they are slow. The main idea in
273712027Sjungma@eit.uni-kl.de    // reversing is "read bits out of d from left to right and push
273812027Sjungma@eit.uni-kl.de    // them into digit using right shifting."
273912027Sjungma@eit.uni-kl.de
274012027Sjungma@eit.uni-kl.de    // Take care of the last digit.
274112027Sjungma@eit.uni-kl.de    int nd_less_1 = nd - 1;
274212027Sjungma@eit.uni-kl.de
274312027Sjungma@eit.uni-kl.de    // Deletions will start from the left end and move one position
274412027Sjungma@eit.uni-kl.de    // after each deletion.
274512027Sjungma@eit.uni-kl.de    sc_digit del_mask = one_and_zeros(bit_ord(l - r));
274612027Sjungma@eit.uni-kl.de
274712027Sjungma@eit.uni-kl.de    while (del_mask) {
274812027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit, 1, ((d[nd_less_1] & del_mask) != 0));
274912027Sjungma@eit.uni-kl.de      del_mask >>= 1;
275012027Sjungma@eit.uni-kl.de    }
275112027Sjungma@eit.uni-kl.de
275212027Sjungma@eit.uni-kl.de    // Take care of the other digits if any.
275312027Sjungma@eit.uni-kl.de
275412027Sjungma@eit.uni-kl.de    // Insertion to digit will always occur at the left end.
275512027Sjungma@eit.uni-kl.de    sc_digit ins_mask = one_and_zeros(BITS_PER_DIGIT - 1);
275612027Sjungma@eit.uni-kl.de
275712027Sjungma@eit.uni-kl.de    for (int j = nd - 2; j >= 0; --j) { // j = nd - 2
275812027Sjungma@eit.uni-kl.de
275912027Sjungma@eit.uni-kl.de      // Deletions will start from the left end and move one position
276012027Sjungma@eit.uni-kl.de      // after each deletion.
276112027Sjungma@eit.uni-kl.de      del_mask = ins_mask;
276212027Sjungma@eit.uni-kl.de
276312027Sjungma@eit.uni-kl.de      while (del_mask) {
276412027Sjungma@eit.uni-kl.de        vec_shift_right(ndigits, digit, 1, ((d[j] & del_mask) != 0));
276512027Sjungma@eit.uni-kl.de        del_mask >>= 1;
276612027Sjungma@eit.uni-kl.de      }
276712027Sjungma@eit.uni-kl.de    }
276812027Sjungma@eit.uni-kl.de
276912027Sjungma@eit.uni-kl.de    if (u->sgn == SC_NEG)
277012027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit,
277112027Sjungma@eit.uni-kl.de                      ndigits * BITS_PER_DIGIT - length(), DIGIT_MASK);
277212027Sjungma@eit.uni-kl.de    else
277312027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit,
277412027Sjungma@eit.uni-kl.de                      ndigits * BITS_PER_DIGIT - length(), 0);
277512027Sjungma@eit.uni-kl.de
277612027Sjungma@eit.uni-kl.de
277712027Sjungma@eit.uni-kl.de  }  // if reversed.
277812027Sjungma@eit.uni-kl.de
277912027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
278012027Sjungma@eit.uni-kl.de
278112027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
278212027Sjungma@eit.uni-kl.de  delete [] d;
278312027Sjungma@eit.uni-kl.de#endif
278412027Sjungma@eit.uni-kl.de}
278512027Sjungma@eit.uni-kl.de
278612027Sjungma@eit.uni-kl.de// This constructor is mainly used in finding a "range" of bits from a
278712027Sjungma@eit.uni-kl.de// number of type OTHER_CLASS_TYPE. The function range(l, r) can have
278812027Sjungma@eit.uni-kl.de// arbitrary precedence between l and r. If l is smaller than r, then
278912027Sjungma@eit.uni-kl.de// the output is the reverse of range(r, l).
279012027Sjungma@eit.uni-kl.deCLASS_TYPE::CLASS_TYPE(const OTHER_CLASS_TYPE* u, int l, int r) :
279112027Sjungma@eit.uni-kl.de    sc_value_base(), sgn(), nbits(), ndigits(), digit()
279212027Sjungma@eit.uni-kl.de{
279312027Sjungma@eit.uni-kl.de  bool reversed = false;
279412027Sjungma@eit.uni-kl.de
279512027Sjungma@eit.uni-kl.de  if( l < r ) {
279612027Sjungma@eit.uni-kl.de    reversed = true;
279712027Sjungma@eit.uni-kl.de    int tmp = l;
279812027Sjungma@eit.uni-kl.de    l = r;
279912027Sjungma@eit.uni-kl.de    r = tmp;
280012027Sjungma@eit.uni-kl.de  }
280112027Sjungma@eit.uni-kl.de
280212027Sjungma@eit.uni-kl.de  // at this point, l >= r
280312027Sjungma@eit.uni-kl.de
280412027Sjungma@eit.uni-kl.de  // make sure that l and r point to the bits of u
280512027Sjungma@eit.uni-kl.de  r = sc_max( r, 0 );
280612027Sjungma@eit.uni-kl.de  l = sc_min( l, u->nbits - 1 );
280712027Sjungma@eit.uni-kl.de
280812027Sjungma@eit.uni-kl.de  nbits = num_bits( l - r + 1 );
280912027Sjungma@eit.uni-kl.de
281012027Sjungma@eit.uni-kl.de  // nbits can still be <= 0 because l and r have just been updated
281112027Sjungma@eit.uni-kl.de  // with the bounds of u.
281212027Sjungma@eit.uni-kl.de
281312027Sjungma@eit.uni-kl.de  // if u == 0 or the range is out of bounds, return 0
281412027Sjungma@eit.uni-kl.de  if( u->sgn == SC_ZERO || nbits <= num_bits( 0 ) ) {
281512027Sjungma@eit.uni-kl.de    sgn = SC_ZERO;
281612027Sjungma@eit.uni-kl.de    if( nbits <= num_bits( 0 ) ) {
281712027Sjungma@eit.uni-kl.de      nbits = 1;
281812027Sjungma@eit.uni-kl.de    }
281912027Sjungma@eit.uni-kl.de    ndigits = DIV_CEIL( nbits );
282012027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
282112027Sjungma@eit.uni-kl.de    digit = new sc_digit[ndigits];
282212027Sjungma@eit.uni-kl.de#endif
282312027Sjungma@eit.uni-kl.de    vec_zero( ndigits, digit );
282412027Sjungma@eit.uni-kl.de    return;
282512027Sjungma@eit.uni-kl.de  }
282612027Sjungma@eit.uni-kl.de
282712027Sjungma@eit.uni-kl.de  // The rest will be executed if u is not zero.
282812027Sjungma@eit.uni-kl.de
282912027Sjungma@eit.uni-kl.de  ndigits = DIV_CEIL(nbits);
283012027Sjungma@eit.uni-kl.de
283112027Sjungma@eit.uni-kl.de  // The number of bits up to and including l and r, respectively.
283212027Sjungma@eit.uni-kl.de  int nl = l + 1;
283312027Sjungma@eit.uni-kl.de  int nr = r + 1;
283412027Sjungma@eit.uni-kl.de
283512027Sjungma@eit.uni-kl.de  // The indices of the digits that have lth and rth bits, respectively.
283612027Sjungma@eit.uni-kl.de  int left_digit = DIV_CEIL(nl) - 1;
283712027Sjungma@eit.uni-kl.de  int right_digit = DIV_CEIL(nr) - 1;
283812027Sjungma@eit.uni-kl.de
283912027Sjungma@eit.uni-kl.de  int nd;
284012027Sjungma@eit.uni-kl.de
284112027Sjungma@eit.uni-kl.de  // The range is performed on the 2's complement representation, so
284212027Sjungma@eit.uni-kl.de  // first get the indices for that.
284312027Sjungma@eit.uni-kl.de  if (u->sgn == SC_NEG)
284412027Sjungma@eit.uni-kl.de    nd = left_digit + 1;
284512027Sjungma@eit.uni-kl.de  else
284612027Sjungma@eit.uni-kl.de    nd = left_digit - right_digit + 1;
284712027Sjungma@eit.uni-kl.de
284812027Sjungma@eit.uni-kl.de  // Allocate memory for the range.
284912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
285012027Sjungma@eit.uni-kl.de  sc_digit d[MAX_NDIGITS];
285112027Sjungma@eit.uni-kl.de#else
285212027Sjungma@eit.uni-kl.de  digit = new sc_digit[ndigits];
285312027Sjungma@eit.uni-kl.de  sc_digit *d = new sc_digit[nd];
285412027Sjungma@eit.uni-kl.de#endif
285512027Sjungma@eit.uni-kl.de
285612027Sjungma@eit.uni-kl.de  // Getting the range on the 2's complement representation.
285712027Sjungma@eit.uni-kl.de  if (u->sgn == SC_NEG) {
285812027Sjungma@eit.uni-kl.de
285912027Sjungma@eit.uni-kl.de    vec_copy(nd, d, u->digit);
286012027Sjungma@eit.uni-kl.de    vec_complement(nd, d);  // d = -d;
286112027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, r, DIGIT_MASK);
286212027Sjungma@eit.uni-kl.de
286312027Sjungma@eit.uni-kl.de  }
286412027Sjungma@eit.uni-kl.de  else {
286512027Sjungma@eit.uni-kl.de
286612027Sjungma@eit.uni-kl.de    for (int i = right_digit; i <= left_digit; ++i)
286712027Sjungma@eit.uni-kl.de      d[i - right_digit] = u->digit[i];
286812027Sjungma@eit.uni-kl.de
286912027Sjungma@eit.uni-kl.de    vec_shift_right(nd, d, r - right_digit * BITS_PER_DIGIT, 0);
287012027Sjungma@eit.uni-kl.de
287112027Sjungma@eit.uni-kl.de  }
287212027Sjungma@eit.uni-kl.de
287312027Sjungma@eit.uni-kl.de  vec_zero(ndigits, digit);
287412027Sjungma@eit.uni-kl.de
287512027Sjungma@eit.uni-kl.de  if (! reversed)
287612027Sjungma@eit.uni-kl.de    vec_copy(sc_min(nd, ndigits), digit, d);
287712027Sjungma@eit.uni-kl.de
287812027Sjungma@eit.uni-kl.de  else {
287912027Sjungma@eit.uni-kl.de
288012027Sjungma@eit.uni-kl.de    // If l < r, i.e., reversed is set, reverse the bits of digit.  d
288112027Sjungma@eit.uni-kl.de    // will be used as a temporary store. The following code tries to
288212027Sjungma@eit.uni-kl.de    // minimize the use of bit_ord and digit_ord, which use mod and
288312027Sjungma@eit.uni-kl.de    // div operators. Since these operators are function calls to
288412027Sjungma@eit.uni-kl.de    // standard library routines, they are slow. The main idea in
288512027Sjungma@eit.uni-kl.de    // reversing is "read bits out of d from left to right and push
288612027Sjungma@eit.uni-kl.de    // them into digit using right shifting."
288712027Sjungma@eit.uni-kl.de
288812027Sjungma@eit.uni-kl.de    // Take care of the last digit.
288912027Sjungma@eit.uni-kl.de    int nd_less_1 = nd - 1;
289012027Sjungma@eit.uni-kl.de
289112027Sjungma@eit.uni-kl.de    // Deletions will start from the left end and move one position
289212027Sjungma@eit.uni-kl.de    // after each deletion.
289312027Sjungma@eit.uni-kl.de    sc_digit del_mask = one_and_zeros(bit_ord(l - r));
289412027Sjungma@eit.uni-kl.de
289512027Sjungma@eit.uni-kl.de    while (del_mask) {
289612027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit, 1, ((d[nd_less_1] & del_mask) != 0));
289712027Sjungma@eit.uni-kl.de      del_mask >>= 1;
289812027Sjungma@eit.uni-kl.de    }
289912027Sjungma@eit.uni-kl.de
290012027Sjungma@eit.uni-kl.de    // Take care of the other digits if any.
290112027Sjungma@eit.uni-kl.de
290212027Sjungma@eit.uni-kl.de    // Insertion to digit will always occur at the left end.
290312027Sjungma@eit.uni-kl.de    sc_digit ins_mask = one_and_zeros(BITS_PER_DIGIT - 1);
290412027Sjungma@eit.uni-kl.de
290512027Sjungma@eit.uni-kl.de    for (int j = nd - 2; j >= 0; --j) { // j = nd - 2
290612027Sjungma@eit.uni-kl.de
290712027Sjungma@eit.uni-kl.de      // Deletions will start from the left end and move one position
290812027Sjungma@eit.uni-kl.de      // after each deletion.
290912027Sjungma@eit.uni-kl.de      del_mask = ins_mask;
291012027Sjungma@eit.uni-kl.de
291112027Sjungma@eit.uni-kl.de      while (del_mask) {
291212027Sjungma@eit.uni-kl.de        vec_shift_right(ndigits, digit, 1, ((d[j] & del_mask) != 0));
291312027Sjungma@eit.uni-kl.de        del_mask >>= 1;
291412027Sjungma@eit.uni-kl.de      }
291512027Sjungma@eit.uni-kl.de    }
291612027Sjungma@eit.uni-kl.de
291712027Sjungma@eit.uni-kl.de    if (u->sgn == SC_NEG)
291812027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit,
291912027Sjungma@eit.uni-kl.de                      ndigits * BITS_PER_DIGIT - length(), DIGIT_MASK);
292012027Sjungma@eit.uni-kl.de    else
292112027Sjungma@eit.uni-kl.de      vec_shift_right(ndigits, digit,
292212027Sjungma@eit.uni-kl.de                      ndigits * BITS_PER_DIGIT - length(), 0);
292312027Sjungma@eit.uni-kl.de
292412027Sjungma@eit.uni-kl.de
292512027Sjungma@eit.uni-kl.de  }  // if reversed.
292612027Sjungma@eit.uni-kl.de
292712027Sjungma@eit.uni-kl.de  convert_2C_to_SM();
292812027Sjungma@eit.uni-kl.de
292912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
293012027Sjungma@eit.uni-kl.de  delete [] d;
293112027Sjungma@eit.uni-kl.de#endif
293212027Sjungma@eit.uni-kl.de}
293312027Sjungma@eit.uni-kl.de
293412027Sjungma@eit.uni-kl.de
293512027Sjungma@eit.uni-kl.de// Print out all the physical attributes.
293612027Sjungma@eit.uni-kl.devoid
293712027Sjungma@eit.uni-kl.deCLASS_TYPE::dump(::std::ostream& os) const
293812027Sjungma@eit.uni-kl.de{
293912027Sjungma@eit.uni-kl.de  // Save the current setting, and set the base to decimal.
294012027Sjungma@eit.uni-kl.de#if defined(__MINGW32__)
294112027Sjungma@eit.uni-kl.de  std::_Ios_Fmtflags old_flags = os.setf(::std::ios::dec,::std::ios::basefield);
294212027Sjungma@eit.uni-kl.de#else
294312027Sjungma@eit.uni-kl.de  fmtflags old_flags = os.setf(::std::ios::dec, ::std::ios::basefield);
294412027Sjungma@eit.uni-kl.de#endif
294512027Sjungma@eit.uni-kl.de
294612027Sjungma@eit.uni-kl.de  os << "width = " << length() << ::std::endl;
294712027Sjungma@eit.uni-kl.de  os << "value = " << *this << ::std::endl;
294812027Sjungma@eit.uni-kl.de  os << "bits  = ";
294912027Sjungma@eit.uni-kl.de
295012027Sjungma@eit.uni-kl.de  int len = length();
295112027Sjungma@eit.uni-kl.de
295212027Sjungma@eit.uni-kl.de  for (int i = len - 1; i >= 0; --i) {
295312027Sjungma@eit.uni-kl.de
295412027Sjungma@eit.uni-kl.de    os << "01"[test(i)];
295512027Sjungma@eit.uni-kl.de    if (--len % 4 == 0)
295612027Sjungma@eit.uni-kl.de      os << " ";
295712027Sjungma@eit.uni-kl.de
295812027Sjungma@eit.uni-kl.de  }
295912027Sjungma@eit.uni-kl.de
296012027Sjungma@eit.uni-kl.de  os << ::std::endl;
296112027Sjungma@eit.uni-kl.de
296212027Sjungma@eit.uni-kl.de  // Restore old_flags.
296312027Sjungma@eit.uni-kl.de  os.setf(old_flags, ::std::ios::basefield);
296412027Sjungma@eit.uni-kl.de}
296512027Sjungma@eit.uni-kl.de
296612027Sjungma@eit.uni-kl.de
296712027Sjungma@eit.uni-kl.de// Checks to see if bit_num is out of bounds.
296812027Sjungma@eit.uni-kl.debool
296912027Sjungma@eit.uni-kl.deCLASS_TYPE::check_if_outside(int bit_num) const
297012027Sjungma@eit.uni-kl.de{
297112027Sjungma@eit.uni-kl.de  if ((bit_num < 0) || (num_bits(bit_num) >= nbits)) {
297212027Sjungma@eit.uni-kl.de
297312027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
297412027Sjungma@eit.uni-kl.de      if( bit_num < 0 || bit_num >= nbits ) {
297512027Sjungma@eit.uni-kl.de	  char msg[BUFSIZ];
297612027Sjungma@eit.uni-kl.de	  std::sprintf( msg, "%s::check_if_outside( int bit_num ) : "
297712027Sjungma@eit.uni-kl.de		   "bit_num = %d is out of bounds",
297812027Sjungma@eit.uni-kl.de		   CLASS_TYPE_STR, bit_num );
297912027Sjungma@eit.uni-kl.de	  SC_REPORT_WARNING( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
298012027Sjungma@eit.uni-kl.de      }
298112027Sjungma@eit.uni-kl.de#endif
298212027Sjungma@eit.uni-kl.de
298312027Sjungma@eit.uni-kl.de    return true;
298412027Sjungma@eit.uni-kl.de  }
298512027Sjungma@eit.uni-kl.de
298612027Sjungma@eit.uni-kl.de  return false;
298712027Sjungma@eit.uni-kl.de}
298812027Sjungma@eit.uni-kl.de
298912027Sjungma@eit.uni-kl.de// End of file.
2990