12#ifndef MCRL2_DATA_DETAIL_MACHINE_WORD_H
13#define MCRL2_DATA_DETAIL_MACHINE_WORD_H
26namespace sort_machine_word
82 return n==std::numeric_limits<std::size_t>::max();
90inline bool equal_word(
const std::size_t n1,
const std::size_t n2)
95inline bool less_word(
const std::size_t n1,
const std::size_t n2)
105inline std::size_t
add_word(
const std::size_t n1,
const std::size_t n2)
133inline std::size_t
times_word(
const std::size_t n1,
const std::size_t n2)
147inline std::size_t
minus_word(
const std::size_t n1,
const std::size_t n2)
152inline std::size_t
monus_word(
const std::size_t n1,
const std::size_t n2)
161inline std::size_t
div_word(
const std::size_t n1,
const std::size_t n2)
166inline std::size_t
mod_word(
const std::size_t n1,
const std::size_t n2)
171std::size_t
div_doubleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3);
173std::size_t
mod_doubleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3);
175std::size_t
div_double_doubleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3,
const std::size_t n4);
177std::size_t
mod_double_doubleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3,
const std::size_t n4);
179std::size_t
div_triple_doubleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3,
const std::size_t n4,
const std::size_t n5);
186std::size_t
sqrt_doubleword(
const std::size_t n1,
const std::size_t n2);
188std::size_t
sqrt_tripleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3);
192std::size_t
sqrt_quadrupleword(
const std::size_t n1,
const std::size_t n2,
const std::size_t n3,
const std::size_t n4);
213 std::size_t m = n>>1;
216 return m |
static_cast<std::size_t
>(1)<<((8*
sizeof(std::size_t))-1);
354 atermpp::down_cast<machine_number>(e1).value(),
355 atermpp::down_cast<machine_number>(e2).value());
368 atermpp::down_cast<machine_number>(e1).value(),
369 atermpp::down_cast<machine_number>(e2).value());
381 const bool b=
detail::less_word(atermpp::down_cast<machine_number>(e1).value(),atermpp::down_cast<machine_number>(e2).value());
393 const bool b=
detail::less_equal_word(atermpp::down_cast<machine_number>(e1).value(),atermpp::down_cast<machine_number>(e2).value());
405 const bool b=
detail::less_word(atermpp::down_cast<machine_number>(e2).value(),atermpp::down_cast<machine_number>(e1).value());
417 const bool b=
detail::less_equal_word(atermpp::down_cast<machine_number>(e2).value(),atermpp::down_cast<machine_number>(e1).value());
430 atermpp::down_cast<machine_number>(e1).value(),
431 atermpp::down_cast<machine_number>(e2).value()));
443 atermpp::down_cast<machine_number>(e1).value(),
444 atermpp::down_cast<machine_number>(e2).value()));
456 atermpp::down_cast<machine_number>(e1).value(),
457 atermpp::down_cast<machine_number>(e2).value()))
474 atermpp::down_cast<machine_number>(e1).value(),
475 atermpp::down_cast<machine_number>(e2).value()))
492 atermpp::down_cast<machine_number>(e1).value(),
493 atermpp::down_cast<machine_number>(e2).value()));
505 atermpp::down_cast<machine_number>(e1).value(),
506 atermpp::down_cast<machine_number>(e2).value(),
507 atermpp::down_cast<machine_number>(e3).value()));
519 atermpp::down_cast<machine_number>(e1).value(),
520 atermpp::down_cast<machine_number>(e2).value()));
532 atermpp::down_cast<machine_number>(e1).value(),
533 atermpp::down_cast<machine_number>(e2).value(),
534 atermpp::down_cast<machine_number>(e3).value()));
546 atermpp::down_cast<machine_number>(e1).value(),
547 atermpp::down_cast<machine_number>(e2).value()));
559 atermpp::down_cast<machine_number>(e1).value(),
560 atermpp::down_cast<machine_number>(e2).value()));
572 atermpp::down_cast<machine_number>(e1).value(),
573 atermpp::down_cast<machine_number>(e2).value()));
585 atermpp::down_cast<machine_number>(e1).value(),
586 atermpp::down_cast<machine_number>(e2).value()));
609 atermpp::down_cast<machine_number>(e1).value(),
610 atermpp::down_cast<machine_number>(e2).value(),
611 atermpp::down_cast<machine_number>(e3).value()));
625 atermpp::down_cast<machine_number>(e1).value(),
626 atermpp::down_cast<machine_number>(e2).value(),
627 atermpp::down_cast<machine_number>(e3).value(),
628 atermpp::down_cast<machine_number>(e4).value()));
649 atermpp::down_cast<machine_number>(e1).value(),
650 atermpp::down_cast<machine_number>(e2).value(),
651 atermpp::down_cast<machine_number>(e3).value(),
652 atermpp::down_cast<machine_number>(e4).value(),
653 atermpp::down_cast<machine_number>(e5).value()));
667 atermpp::down_cast<machine_number>(e1).value(),
668 atermpp::down_cast<machine_number>(e2).value(),
669 atermpp::down_cast<machine_number>(e3).value(),
670 atermpp::down_cast<machine_number>(e4).value()));
682 atermpp::down_cast<machine_number>(e1).value(),
683 atermpp::down_cast<machine_number>(e2).value()));
696 atermpp::down_cast<machine_number>(e1).value(),
697 atermpp::down_cast<machine_number>(e2).value(),
698 atermpp::down_cast<machine_number>(e3).value()));
711 atermpp::down_cast<machine_number>(e1).value(),
712 atermpp::down_cast<machine_number>(e2).value(),
713 atermpp::down_cast<machine_number>(e3).value()));
726 atermpp::down_cast<machine_number>(e1).value(),
727 atermpp::down_cast<machine_number>(e2).value(),
728 atermpp::down_cast<machine_number>(e3).value()));
747 atermpp::down_cast<machine_number>(e1).value(),
748 atermpp::down_cast<machine_number>(e2).value(),
749 atermpp::down_cast<machine_number>(e3).value(),
750 atermpp::down_cast<machine_number>(e4).value()));
769 atermpp::down_cast<machine_number>(e1).value(),
770 atermpp::down_cast<machine_number>(e2).value(),
771 atermpp::down_cast<machine_number>(e3).value(),
772 atermpp::down_cast<machine_number>(e4).value()));
The class machine_number, which is a subclass of data_expression.
The standard sort machine_word.
const function_symbol & false_()
Constructor for function symbol false.
const function_symbol & true_()
Constructor for function symbol true.
std::size_t sqrt_quadrupleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
const machine_number & four_word()
std::size_t shift_right(const data_expression &e1, const std::size_t n)
std::size_t sqrt_tripleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t times_with_carry_overflow_word(const std::size_t n1, const std::size_t n2, std::size_t n3)
bool equals_zero_word(const std::size_t n)
std::size_t div_word(const std::size_t n1, const std::size_t n2)
std::size_t succ_word(const std::size_t n)
bool less_word(const std::size_t n1, const std::size_t n2)
std::size_t div_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t pred_word(const std::size_t n)
std::size_t add_word(const std::size_t n1, const std::size_t n2)
const machine_number & one_word()
std::size_t mod_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
bool equals_max_word(const std::size_t n)
std::size_t sqrt_word(const std::size_t n)
std::size_t times_overflow_word(const std::size_t n1, const std::size_t n2)
const machine_number & max_word()
bool equal_word(const std::size_t n1, const std::size_t n2)
std::size_t times_word(const std::size_t n1, const std::size_t n2)
bool add_overflow_word(const std::size_t n1, const std::size_t n2)
std::size_t div_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
bool add_with_carry_overflow_word(const std::size_t n1, const std::size_t n2)
std::size_t minus_word(const std::size_t n1, const std::size_t n2)
std::size_t add_with_carry_word(const std::size_t n1, const std::size_t n2)
const machine_number & three_word()
bool less_equal_word(const std::size_t n1, const std::size_t n2)
bool equals_one_word(const std::size_t n)
std::size_t mod_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
std::size_t mod_word(const std::size_t n1, const std::size_t n2)
std::size_t div_triple_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4, const std::size_t n5)
const machine_number & two_word()
std::size_t sqrt_doubleword(const std::size_t n1, const std::size_t n2)
std::size_t sqrt_tripleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t times_with_carry_word(const std::size_t n1, const std::size_t n2, const std::size_t n3)
const machine_number & zero_word()
void rightmost_bit(data_expression &result, const std::size_t n)
std::size_t sqrt_quadrupleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
const function_symbol & sqrt_word()
Constructor for function symbol @sqrt_word.
void times_with_carry_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
The result of multiplying two words and adding a third divided by the maximal representable machine w...
void sqrt_tripleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates the least significant word of the square root of base*(base*e1+e2)+e3.
void pred_word_manual_implementation(data_expression &result, const data_expression &e)
The predecessor function on a machine numbers, that wraps around.
void add_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of adding two words modulo the maximal representable machine word plus 1.
void two_word_manual_implementation(data_expression &result)
The machine number representing 2.
const function_symbol & add_word()
Constructor for function symbol @add_word.
void shift_right_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The machine word shifted one position to the right.
const function_symbol & div_double_doubleword()
Constructor for function symbol @div_double_doubleword.
void times_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of multiplying two words modulo the maximal representable machine word plus 1.
const function_symbol & div_word()
Constructor for function symbol @div_word.
void equals_zero_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to 0.
void div_triple_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4, const data_expression &e5)
Calculates (base*(base*e1 + e2)+e3) div (base*e4 + e5).
const function_symbol & pred_word()
Constructor for function symbol @pred_word.
const function_symbol & equals_max_word()
Constructor for function symbol @equals_max_word.
const function_symbol & equals_one_word()
Constructor for function symbol @equals_one_word.
void zero_word_manual_implementation(data_expression &result)
The machine number representing 0.
const function_symbol & mod_word()
Constructor for function symbol @mod_word.
const function_symbol & div_doubleword()
Constructor for function symbol @div_doubleword.
const function_symbol & succ_word()
Constructor for function symbol @succ_word.
void times_with_carry_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
The result of multiplying two words and adding the third modulo the maximal representable machine wor...
const function_symbol & sqrt_quadrupleword_overflow()
Constructor for function symbol @sqrt_quadrupleword_overflow.
const function_symbol & less_word()
Constructor for function symbol @less.
void three_word_manual_implementation(data_expression &result)
The machine number representing 3.
const function_symbol & add_with_carry_word()
Constructor for function symbol @add_with_carry_word.
void times_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of multiplying two words divided by the maximal representable machine word plus 1.
void sqrt_quadrupleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates the least significant word of the square root of base*(base*(base*e1+e2)+e3)+e4.
const function_symbol & monus_word()
Constructor for function symbol @monus_word.
void not_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The non equality function on two machine words.
const function_symbol & sqrt_tripleword_overflow()
Constructor for function symbol @sqrt_tripleword_overflow.
const function_symbol & sqrt_quadrupleword()
Constructor for function symbol @sqrt_quadrupleword.
void less_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The less than or equal function on two machine words.
const function_symbol & equals_zero_word()
Constructor for function symbol @equals_zero_word.
const function_symbol & minus_word()
Constructor for function symbol @minus_word.
const function_symbol & add_with_carry_overflow_word()
Constructor for function symbol @add_with_carry_overflow_word.
const function_symbol & times_with_carry_word()
Constructor for function symbol @times_with_carry_word.
void sqrt_tripleword_overflow_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates the most significant word of the square root of base*(base*e1+e2)+e3.
void sqrt_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The square root of base*e1+e2 rounded down.
void greater_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The greater than or equal function on two machine words.
const function_symbol & times_with_carry_overflow_word()
Constructor for function symbol @times_with_carry_overflow_word.
void div_double_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates (base*e1 + e2) div (base*e3 + e4).
const function_symbol & div_triple_doubleword()
Constructor for function symbol @div_triple_doubleword.
void equals_one_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to 1.
const function_symbol & times_overflow_word()
Constructor for function symbol @times_overflow_word.
void div_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates (base*e1 + e2) div e3.
void mod_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
Calculates e1 modulo e2.
void sqrt_quadrupleword_overflow_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates the most significant word of the square root of base*(base*(base*e1+e2)+e3)+e4.
void not_equals_zero_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is not equal to 0.
void less_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The less than function on two machine words.
void max_word_manual_implementation(data_expression &result)
The largest representable machine number.
const function_symbol & equal_word()
Constructor for function symbol @equal.
const function_symbol & mod_doubleword()
Constructor for function symbol @mod_doubleword.
void add_with_carry_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of adding two words plus 1 modulo the maximal representable machine word plus 1.
const function_symbol & sqrt_tripleword()
Constructor for function symbol @sqrt_tripleword.
const function_symbol & rightmost_bit()
Constructor for function symbol @rightmost_bit.
void one_word_manual_implementation(data_expression &result)
The machine number representing 1.
const function_symbol & less_equal_word()
Constructor for function symbol @less_equal.
void equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The equality function on two machine words.
void four_word_manual_implementation(data_expression &result)
The machine number representing 4.
void minus_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of subtracting two words modulo the maximal representable machine word plus 1.
void succ_word_manual_implementation(data_expression &result, const data_expression &e)
The successor function on a machine numbers, that wraps around.
void equals_max_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to the largest 64 bit number.
void mod_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates (base*e1 + e2) mod e3. The result fits in one word.
void add_with_carry_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
An indication whether an overflow occurs when e1 and e2 are added.
void add_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
An indication whether an overflow occurs when e1 and e2 are added.
void mod_double_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates (base*e1 + e2) mod (base*e3 + e4).
void sqrt_word_manual_implementation(data_expression &result, const data_expression &e)
The square root of e, rounded down to a machine word.
const function_symbol & times_word()
Constructor for function symbol @times_word.
void rightmost_bit_manual_implementation(data_expression &result, const data_expression &e)
The right most bit of a machine number.
void greater_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The greater than function on two machine words.
const function_symbol & sqrt_doubleword()
Constructor for function symbol @sqrt_doubleword.
void div_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
Calculates the division of the first word by the second.
const function_symbol & shift_right()
Constructor for function symbol @shift_right.
void monus_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of subtracting two words. If the result is negative 0 is returned.
const function_symbol & add_overflow_word()
Constructor for function symbol @add_overflow_word.
void make_machine_number(atermpp::aterm &t, size_t n)
data_expression max(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...