[vm, compiler] RISC-V BigInt intrinsics.

Note that unlike x86 and ARM, RISC-V has no carry flag, so we must synthesize the carry in a GPR using sltu.

TEST=ci, RSA
Change-Id: I24898cb8b7166d5769ae98c535ec29b2206340d7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235063
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak 2022-03-08 18:08:44 +00:00 committed by Commit Bot
parent dc8f487bae
commit d34e7b0500
16 changed files with 2199 additions and 17 deletions

View file

@ -223,7 +223,7 @@ void AsmIntrinsifier::Bigint_lsh(Assembler* assembler, Label* normal_ir_body) {
}
void AsmIntrinsifier::Bigint_rsh(Assembler* assembler, Label* normal_ir_body) {
// static void _lsh(Uint32List x_digits, int x_used, int n,
// static void _rsh(Uint32List x_digits, int x_used, int n,
// Uint32List r_digits)
// R2 = x_used, R3 = x_digits, x_used > 0, x_used is Smi.

View file

@ -156,49 +156,749 @@ void AsmIntrinsifier::Smi_bitLength(Assembler* assembler,
}
void AsmIntrinsifier::Bigint_lsh(Assembler* assembler, Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// static void _lsh(Uint32List src_digits, int src_used,
// int shift_amount,
// Uint32List result_digits)
Label loop, done;
__ lx(T0, Address(SP, 3 * target::kWordSize)); // src_digits
__ lx(T1, Address(SP, 2 * target::kWordSize)); // src_used
__ lx(T2, Address(SP, 1 * target::kWordSize)); // shift_amount
__ lx(T3, Address(SP, 0 * target::kWordSize)); // result_digits
#if XLEN == 32
// 1 word = 1 digit
__ SmiUntag(T1);
#else
// 1 word = 2 digits
__ addi(T1, T1, target::ToRawSmi(1)); // Round up to even
__ srai(T1, T1, kSmiTagSize + 1);
#endif
__ SmiUntag(T2);
__ srai(T4, T2, target::kBitsPerWordLog2); // T4 = word shift
__ andi(T5, T2, target::kBitsPerWord - 1); // T5 = bit shift
__ li(T6, target::kBitsPerWord);
__ sub(T6, T6, T5); // T6 = carry bit shift
__ slli(TMP, T1, target::kWordSizeLog2);
__ add(T0, T0, TMP);
__ subi(T0, T0, target::kWordSize); // T0 = &src_digits[src_used - 1]
__ add(TMP, T1, T4);
__ slli(TMP, TMP, target::kWordSizeLog2);
__ add(T3, T3, TMP); // T3 = &dst_digits[src_used + word_shift]
__ li(T2, 0); // carry
__ Bind(&loop);
__ beqz(T1, &done, Assembler::kNearJump);
__ lx(TMP, FieldAddress(T0, target::TypedData::payload_offset()));
__ srl(TMP2, TMP, T6);
__ or_(TMP2, TMP2, T2);
__ sx(TMP2, FieldAddress(T3, target::TypedData::payload_offset()));
__ sll(T2, TMP, T5);
__ subi(T0, T0, target::kWordSize);
__ subi(T3, T3, target::kWordSize);
__ subi(T1, T1, 1);
__ j(&loop);
__ Bind(&done);
__ sx(T2, FieldAddress(T3, target::TypedData::payload_offset()));
__ LoadObject(A0, NullObject());
__ ret();
}
void AsmIntrinsifier::Bigint_rsh(Assembler* assembler, Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// static void _rsh(Uint32List src_digits, int src_used,
// int shift_amount,
// Uint32List result_digits)
Label loop, done;
__ lx(T0, Address(SP, 3 * target::kWordSize)); // src_digits
__ lx(T1, Address(SP, 2 * target::kWordSize)); // src_used
__ lx(T2, Address(SP, 1 * target::kWordSize)); // shift_amount
__ lx(T3, Address(SP, 0 * target::kWordSize)); // result_digits
#if XLEN == 32
// 1 word = 1 digit
__ SmiUntag(T1);
#else
// 1 word = 2 digits
__ addi(T1, T1, target::ToRawSmi(1)); // Round up to even
__ srai(T1, T1, kSmiTagSize + 1);
#endif
__ SmiUntag(T2);
__ srai(T4, T2, target::kBitsPerWordLog2); // T4 = word shift
__ andi(T5, T2, target::kBitsPerWord - 1); // T5 = bit shift
__ li(T6, target::kBitsPerWord);
__ sub(T6, T6, T5); // T6 = carry bit shift
__ slli(TMP, T4, target::kWordSizeLog2);
__ add(T0, T0, TMP); // T0 = &src_digits[word_shift]
__ li(T2, 0); // carry
__ lx(T2, FieldAddress(T0, target::TypedData::payload_offset()));
__ srl(T2, T2, T5);
__ addi(T0, T0, target::kWordSize);
__ subi(T1, T1, 1);
__ Bind(&loop);
__ beqz(T1, &done, Assembler::kNearJump);
__ lx(TMP, FieldAddress(T0, target::TypedData::payload_offset()));
__ sll(TMP2, TMP, T6);
__ or_(TMP2, TMP2, T2);
__ sx(TMP2, FieldAddress(T3, target::TypedData::payload_offset()));
__ srl(T2, TMP, T5);
__ addi(T0, T0, target::kWordSize);
__ addi(T3, T3, target::kWordSize);
__ subi(T1, T1, 1);
__ j(&loop);
__ Bind(&done);
__ sx(T2, FieldAddress(T3, target::TypedData::payload_offset()));
__ LoadObject(A0, NullObject());
__ ret();
}
void AsmIntrinsifier::Bigint_absAdd(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// static void _absAdd(Uint32List longer_digits, int longer_used,
// Uint32List shorter_digits, int shorter_used,
// Uint32List result_digits)
Label first_loop, second_loop, last_carry, done;
__ lx(T0, Address(SP, 4 * target::kWordSize)); // longer_digits
__ lx(T1, Address(SP, 3 * target::kWordSize)); // longer_used
__ lx(T2, Address(SP, 2 * target::kWordSize)); // shorter_digits
__ lx(T3, Address(SP, 1 * target::kWordSize)); // shorter_used
__ lx(T4, Address(SP, 0 * target::kWordSize)); // result_digits
#if XLEN == 32
// 1 word = 1 digit
__ SmiUntag(T1);
__ SmiUntag(T3);
#else
// 1 word = 2 digits
__ addi(T1, T1, target::ToRawSmi(1)); // Round up to even
__ srai(T1, T1, kSmiTagSize + 1);
__ addi(T3, T3, target::ToRawSmi(1)); // Round up to even
__ srai(T3, T3, kSmiTagSize + 1);
#endif
__ li(T5, 0); // Carry
__ Bind(&first_loop);
__ beqz(T3, &second_loop);
__ lx(A0, FieldAddress(T0, target::TypedData::payload_offset()));
__ lx(A1, FieldAddress(T2, target::TypedData::payload_offset()));
__ add(A0, A0, A1);
__ sltu(TMP, A0, A1); // Carry
__ add(A0, A0, T5);
__ sltu(TMP2, A0, T5); // Carry
__ add(T5, TMP, TMP2);
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T0, T0, target::kWordSize);
__ addi(T2, T2, target::kWordSize);
__ addi(T4, T4, target::kWordSize);
__ subi(T1, T1, 1);
__ subi(T3, T3, 1);
__ j(&first_loop);
__ Bind(&second_loop);
__ beqz(T1, &last_carry);
__ lx(A0, FieldAddress(T0, target::TypedData::payload_offset()));
__ add(TMP, A0, T5);
__ sltu(T5, TMP, A0); // Carry
__ sx(TMP, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T0, T0, target::kWordSize);
__ addi(T4, T4, target::kWordSize);
__ subi(T1, T1, 1);
__ j(&second_loop);
__ Bind(&last_carry);
__ beqz(T5, &done);
__ sx(T5, FieldAddress(T4, target::TypedData::payload_offset()));
__ Bind(&done);
__ LoadObject(A0, NullObject());
__ ret();
}
void AsmIntrinsifier::Bigint_absSub(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// static void _absSub(Uint32List longer_digits, int longer_used,
// Uint32List shorter_digits, int shorter_used,
// Uint32List result_digits)
Label first_loop, second_loop, last_borrow, done;
__ lx(T0, Address(SP, 4 * target::kWordSize)); // longer_digits
__ lx(T1, Address(SP, 3 * target::kWordSize)); // longer_used
__ lx(T2, Address(SP, 2 * target::kWordSize)); // shorter_digits
__ lx(T3, Address(SP, 1 * target::kWordSize)); // shorter_used
__ lx(T4, Address(SP, 0 * target::kWordSize)); // result_digits
#if XLEN == 32
// 1 word = 1 digit
__ SmiUntag(T1);
__ SmiUntag(T3);
#else
// 1 word = 2 digits
__ addi(T1, T1, target::ToRawSmi(1)); // Round up to even
__ srai(T1, T1, kSmiTagSize + 1);
__ addi(T3, T3, target::ToRawSmi(1)); // Round up to even
__ srai(T3, T3, kSmiTagSize + 1);
#endif
__ li(T5, 0); // Borrow
__ Bind(&first_loop);
__ beqz(T3, &second_loop);
__ lx(A0, FieldAddress(T0, target::TypedData::payload_offset()));
__ lx(A1, FieldAddress(T2, target::TypedData::payload_offset()));
__ sltu(TMP, A0, A1); // Borrow
__ sub(A0, A0, A1);
__ sltu(TMP2, A0, T5); // Borrow
__ sub(A0, A0, T5);
__ add(T5, TMP, TMP2);
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T0, T0, target::kWordSize);
__ addi(T2, T2, target::kWordSize);
__ addi(T4, T4, target::kWordSize);
__ subi(T1, T1, 1);
__ subi(T3, T3, 1);
__ j(&first_loop);
__ Bind(&second_loop);
__ beqz(T1, &last_borrow);
__ lx(A0, FieldAddress(T0, target::TypedData::payload_offset()));
__ sltu(TMP, A0, T5); // Borrow
__ sub(A0, A0, T5);
__ mv(T5, TMP);
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T0, T0, target::kWordSize);
__ addi(T4, T4, target::kWordSize);
__ subi(T1, T1, 1);
__ j(&second_loop);
__ Bind(&last_borrow);
__ beqz(T5, &done);
__ neg(T5, T5);
__ sx(T5, FieldAddress(T4, target::TypedData::payload_offset()));
__ Bind(&done);
__ LoadObject(A0, NullObject());
__ ret();
}
void AsmIntrinsifier::Bigint_mulAdd(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// Pseudo code:
// static int _mulAdd(Uint32List x_digits, int xi,
// Uint32List m_digits, int i,
// Uint32List a_digits, int j, int n) {
// uint64_t x = x_digits[xi >> 1 .. (xi >> 1) + 1]; // xi is Smi and even.
// if (x == 0 || n == 0) {
// return 2;
// }
// uint64_t* mip = &m_digits[i >> 1]; // i is Smi and even.
// uint64_t* ajp = &a_digits[j >> 1]; // j is Smi and even.
// uint64_t c = 0;
// SmiUntag(n); // n is Smi and even.
// n = (n + 1)/2; // Number of pairs to process.
// do {
// uint64_t mi = *mip++;
// uint64_t aj = *ajp;
// uint128_t t = x*mi + aj + c; // 64-bit * 64-bit -> 128-bit.
// *ajp++ = low64(t);
// c = high64(t);
// } while (--n > 0);
// while (c != 0) {
// uint128_t t = *ajp + c;
// *ajp++ = low64(t);
// c = high64(t); // c == 0 or 1.
// }
// return 2;
// }
Label done;
__ lx(T0, Address(SP, 6 * target::kWordSize)); // x_digits
__ lx(T1, Address(SP, 5 * target::kWordSize)); // xi
__ lx(T2, Address(SP, 4 * target::kWordSize)); // m_digits
__ lx(T3, Address(SP, 3 * target::kWordSize)); // i
__ lx(T4, Address(SP, 2 * target::kWordSize)); // a_digits
__ lx(T5, Address(SP, 1 * target::kWordSize)); // j
__ lx(T6, Address(SP, 0 * target::kWordSize)); // n
// R3 = x, no_op if x == 0
// T0 = xi as Smi, R1 = x_digits.
__ slli(T1, T1, 1);
__ add(T0, T0, T1);
__ lx(T0, FieldAddress(T0, target::TypedData::payload_offset()));
__ beqz(T0, &done);
// R6 = (SmiUntag(n) + 1)/2, no_op if n == 0
#if XLEN == 32
// 1 word = 1 digit
__ SmiUntag(T6);
#else
// 1 word = 2 digits
__ addi(T6, T6, target::ToRawSmi(1));
__ srai(T6, T6, 2);
#endif
__ beqz(T6, &done);
// R4 = mip = &m_digits[i >> 1]
// R0 = i as Smi, R1 = m_digits.
__ slli(T3, T3, 1);
__ add(T2, T2, T3);
// R5 = ajp = &a_digits[j >> 1]
// R0 = j as Smi, R1 = a_digits.
__ slli(T5, T5, 1);
__ add(T4, T4, T5);
// T1 = c = 0
__ li(T1, 0);
Label muladd_loop;
__ Bind(&muladd_loop);
// x: T0
// mip: T2
// ajp: T4
// c: T1
// n: T6
// t: A7:A6 (not live at loop entry)
// uint64_t mi = *mip++
__ lx(A0, FieldAddress(T2, target::TypedData::payload_offset()));
__ addi(T2, T2, target::kWordSize);
// uint64_t aj = *ajp
__ lx(A1, FieldAddress(T4, target::TypedData::payload_offset()));
// uint128_t t = x*mi + aj + c
// Macro-op fusion: when both products are required, the recommended sequence
// is high first.
__ mulhu(A7, A0, T0); // A7 = high64(A0*T0), t = A7:A6 = x*mi.
__ mul(A6, A0, T0); // A6 = low64(A0*T0).
__ add(A6, A6, A1);
__ sltu(TMP, A6, A1); // Carry
__ add(A7, A7, TMP); // t += aj
__ add(A6, A6, T1);
__ sltu(TMP, A6, T1); // Carry
__ add(A7, A7, TMP); // t += c
__ mv(T1, A7); // c = high64(t)
// *ajp++ = low64(t) = R0
__ sx(A6, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T4, T4, target::kWordSize);
// while (--n > 0)
__ subi(T6, T6, 1); // --n
__ bnez(T6, &muladd_loop);
__ beqz(T1, &done);
// *ajp++ += c
__ lx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ add(A0, A0, T1);
__ sltu(T1, A0, T1); // Carry
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T4, T4, target::kWordSize);
__ beqz(T1, &done);
Label propagate_carry_loop;
__ Bind(&propagate_carry_loop);
__ lx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ add(A0, A0, T1);
__ sltu(T1, A0, T1); // Carry
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset()));
__ addi(T4, T4, target::kWordSize);
__ bnez(T1, &propagate_carry_loop);
__ Bind(&done);
// Result = One or two digits processed.
__ li(A0, target::ToRawSmi(target::kWordSize / kBytesPerBigIntDigit));
__ ret();
}
void AsmIntrinsifier::Bigint_sqrAdd(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// Pseudo code:
// static int _sqrAdd(Uint32List x_digits, int i,
// Uint32List a_digits, int used) {
// uint64_t* xip = &x_digits[i >> 1]; // i is Smi and even.
// uint64_t x = *xip++;
// if (x == 0) return 2;
// uint64_t* ajp = &a_digits[i]; // j == 2*i, i is Smi.
// uint64_t aj = *ajp;
// uint128_t t = x*x + aj;
// *ajp++ = low64(t);
// uint128_t c = high64(t);
// int n = ((used - i + 2) >> 2) - 1; // used and i are Smi. n: num pairs.
// while (--n >= 0) {
// uint64_t xi = *xip++;
// uint64_t aj = *ajp;
// uint192_t t = 2*x*xi + aj + c; // 2-bit * 64-bit * 64-bit -> 129-bit.
// *ajp++ = low64(t);
// c = high128(t); // 65-bit.
// }
// uint64_t aj = *ajp;
// uint128_t t = aj + c; // 64-bit + 65-bit -> 66-bit.
// *ajp++ = low64(t);
// *ajp = high64(t);
// return 2;
// }
// T2 = xip = &x_digits[i >> 1]
// T0 = i as Smi, T1 = x_digits
__ lx(T0, Address(SP, 2 * target::kWordSize));
__ lx(T1, Address(SP, 3 * target::kWordSize));
__ slli(TMP, T0, 1);
__ add(T1, T1, TMP);
__ addi(T2, T1, target::TypedData::payload_offset() - kHeapObjectTag);
// T1 = x = *xip++, return if x == 0
Label x_zero;
__ lx(T1, Address(T2, 0));
__ addi(T2, T2, target::kWordSize);
__ beqz(T1, &x_zero);
// T3 = ajp = &a_digits[i]
__ lx(A1, Address(SP, 1 * target::kWordSize)); // a_digits
__ slli(TMP, T0, 2);
__ add(A1, A1, TMP); // j == 2*i, i is Smi.
__ addi(T3, A1, target::TypedData::payload_offset() - kHeapObjectTag);
// T4:A1 = t = x*x + *ajp
__ lx(A0, Address(T3, 0));
__ mul(A1, T1, T1); // A1 = low64(T1*T1).
__ mulhu(T4, T1, T1); // T4 = high64(T1*T1).
__ add(A1, A1, A0); // T4:A1 += *ajp.
__ sltu(TMP, A1, A0);
__ add(T4, T4, TMP); // T4 = low64(c) = high64(t).
__ li(T5, 0); // T5 = high64(c) = 0.
// *ajp++ = low64(t) = A1
__ sx(A1, Address(T3, 0));
__ addi(T3, T3, target::kWordSize);
__ lx(A0, Address(SP, 0 * target::kWordSize)); // used is Smi
#if XLEN == 32
// int n = used - i - 2;
__ sub(T6, A0, T0);
__ SmiUntag(T6);
__ subi(T6, T6, 2);
#else
// int n = (used - i + 1)/2 - 1
__ sub(T6, A0, T0);
__ addi(T6, T6, 2);
__ srai(T6, T6, 2);
__ subi(T6, T6, 2);
#endif
Label loop, done;
__ bltz(T6, &done); // while (--n >= 0)
__ Bind(&loop);
// x: T1
// xip: T2
// ajp: T3
// c: T5:T4
// t: T0:A1:A0 (not live at loop entry)
// n: T6
// uint64_t xi = *xip++
__ lx(T0, Address(T2, 0));
__ addi(T2, T2, target::kWordSize);
// uint192_t t = T0:A1:A0 = 2*x*xi + aj + c
__ mul(A0, T0, T1); // A0 = low64(T0*T1) = low64(x*xi).
__ mulhu(A1, T0, T1); // A1 = high64(T0*T1) = high64(x*xi).
__ mv(TMP, A0);
__ add(A0, A0, A0);
__ sltu(TMP, A0, TMP);
__ mv(TMP2, A1);
__ add(A1, A1, A1);
__ sltu(TMP2, A1, TMP2);
__ add(A1, A1, TMP);
__ sltu(TMP, A1, TMP);
__ add(T0, TMP, TMP2); // T0:A1:A0 = A1:A0 + A1:A0 = 2*x*xi.
__ add(A0, A0, T4);
__ sltu(TMP, A0, T4);
__ add(A1, A1, T5);
__ sltu(TMP2, A1, T5);
__ add(A1, A1, TMP);
__ sltu(TMP, A1, TMP);
__ add(T0, T0, TMP);
__ add(T0, T0, TMP2); // T0:A1:A0 += c.
__ lx(T5, Address(T3, 0)); // T5 = aj = *ajp.
__ add(A0, A0, T5);
__ sltu(TMP, A0, T5);
__ add(T4, A1, TMP);
__ sltu(TMP, T4, A1);
__ add(T5, T0, TMP); // T5:T4:A0 = 2*x*xi + aj + c.
// *ajp++ = low64(t) = A0
__ sx(A0, Address(T3, 0));
__ addi(T3, T3, target::kWordSize);
// while (--n >= 0)
__ subi(T6, T6, 1); // --n
__ bgez(T6, &loop);
__ Bind(&done);
// uint64_t aj = *ajp
__ lx(A0, Address(T3, 0));
// uint128_t t = aj + c
__ add(T4, T4, A0);
__ sltu(TMP, T4, A0);
__ add(T5, T5, TMP);
// *ajp = low64(t) = T4
// *(ajp + 1) = high64(t) = T5
__ sx(T4, Address(T3, 0));
__ sx(T5, Address(T3, target::kWordSize));
__ Bind(&x_zero);
// Result = One or two digits processed.
__ li(A0, target::ToRawSmi(target::kWordSize / kBytesPerBigIntDigit));
__ ret();
}
void AsmIntrinsifier::Bigint_estimateQuotientDigit(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// There is no 128-bit by 64-bit division instruction on arm64, so we use two
// 64-bit by 32-bit divisions and two 64-bit by 64-bit multiplications to
// adjust the two 32-bit digits of the estimated quotient.
//
// Pseudo code:
// static int _estQuotientDigit(Uint32List args, Uint32List digits, int i) {
// uint64_t yt = args[_YT_LO .. _YT]; // _YT_LO == 0, _YT == 1.
// uint64_t* dp = &digits[(i >> 1) - 1]; // i is Smi.
// uint64_t dh = dp[0]; // dh == digits[(i >> 1) - 1 .. i >> 1].
// uint64_t qd;
// if (dh == yt) {
// qd = (DIGIT_MASK << 32) | DIGIT_MASK;
// } else {
// dl = dp[-1]; // dl == digits[(i >> 1) - 3 .. (i >> 1) - 2].
// // We cannot calculate qd = dh:dl / yt, so ...
// uint64_t yth = yt >> 32;
// uint64_t qh = dh / yth;
// uint128_t ph:pl = yt*qh;
// uint64_t tl = (dh << 32)|(dl >> 32);
// uint64_t th = dh >> 32;
// while ((ph > th) || ((ph == th) && (pl > tl))) {
// if (pl < yt) --ph;
// pl -= yt;
// --qh;
// }
// qd = qh << 32;
// tl = (pl << 32);
// th = (ph << 32)|(pl >> 32);
// if (tl > dl) ++th;
// dl -= tl;
// dh -= th;
// uint64_t ql = ((dh << 32)|(dl >> 32)) / yth;
// ph:pl = yt*ql;
// while ((ph > dh) || ((ph == dh) && (pl > dl))) {
// if (pl < yt) --ph;
// pl -= yt;
// --ql;
// }
// qd |= ql;
// }
// args[_QD .. _QD_HI] = qd; // _QD == 2, _QD_HI == 3.
// return 2;
// }
__ lx(T4, Address(SP, 2 * target::kWordSize)); // args
#if XLEN == 32
// ECX = yt = args[1]
__ lx(T3, FieldAddress(T4, target::TypedData::payload_offset() +
kBytesPerBigIntDigit));
#else
// T3 = yt = args[0..1]
__ lx(T3, FieldAddress(T4, target::TypedData::payload_offset()));
#endif
__ lx(A0, Address(SP, 0 * target::kWordSize)); // A0 = i as Smi
__ lx(T1, Address(SP, 1 * target::kWordSize)); // T1 = digits
__ slli(TMP, A0, 1);
__ add(T1, T1, TMP);
#if XLEN == 32
// EBX = dp = &digits[i >> 1]
__ lx(T2, FieldAddress(T1, target::TypedData::payload_offset()));
#else
// T2 = dh = digits[(i >> 1) - 1 .. i >> 1]
__ lx(T2, FieldAddress(T1, target::TypedData::payload_offset() -
kBytesPerBigIntDigit));
#endif
// A0 = qd = (DIGIT_MASK << 32) | DIGIT_MASK = -1
__ li(A0, -1);
// Return qd if dh == yt
Label return_qd;
__ beq(T2, T3, &return_qd);
#if XLEN == 32
// EAX = dl = dp[-1]
__ lx(T1, FieldAddress(T1, target::TypedData::payload_offset() -
kBytesPerBigIntDigit));
#else
// T1 = dl = digits[(i >> 1) - 3 .. (i >> 1) - 2]
__ lx(T1, FieldAddress(T1, target::TypedData::payload_offset() -
3 * kBytesPerBigIntDigit));
#endif
// T5 = yth = yt >> 32
__ srli(T5, T3, target::kWordSize * 4);
// T6 = qh = dh / yth
__ divu(T6, T2, T5);
// A6:A1 = ph:pl = yt*qh
__ mulhu(A6, T3, T6);
__ mul(A1, T3, T6);
// A7 = tl = (dh << 32)|(dl >> 32)
__ slli(A7, T2, target::kWordSize * 4);
__ srli(TMP, T1, target::kWordSize * 4);
__ or_(A7, A7, TMP);
// S3 = th = dh >> 32
__ srli(S3, T2, target::kWordSize * 4);
// while ((ph > th) || ((ph == th) && (pl > tl)))
Label qh_adj_loop, qh_adj, qh_ok;
__ Bind(&qh_adj_loop);
__ bgtu(A6, S3, &qh_adj);
__ bne(A6, S3, &qh_ok);
__ bleu(A1, A7, &qh_ok);
__ Bind(&qh_adj);
// if (pl < yt) --ph
__ sltu(TMP, A1, T3);
__ sub(A6, A6, TMP);
// pl -= yt
__ sub(A1, A1, T3);
// --qh
__ subi(T6, T6, 1);
// Continue while loop.
__ j(&qh_adj_loop);
__ Bind(&qh_ok);
// A0 = qd = qh << 32
__ slli(A0, T6, target::kWordSize * 4);
// tl = (pl << 32)
__ slli(A7, A1, target::kWordSize * 4);
// th = (ph << 32)|(pl >> 32);
__ slli(S3, A6, target::kWordSize * 4);
__ srli(TMP, A1, target::kWordSize * 4);
__ or_(S3, S3, TMP);
// if (tl > dl) ++th
__ sltu(TMP, T1, A7);
__ add(S3, S3, TMP);
// dl -= tl
__ sub(T1, T1, A7);
// dh -= th
__ sub(T2, T2, S3);
// T6 = ql = ((dh << 32)|(dl >> 32)) / yth
__ slli(T6, T2, target::kWordSize * 4);
__ srli(TMP, T1, target::kWordSize * 4);
__ or_(T6, T6, TMP);
__ divu(T6, T6, T5);
// A6:A1 = ph:pl = yt*ql
__ mulhu(A6, T3, T6);
__ mul(A1, T3, T6);
// while ((ph > dh) || ((ph == dh) && (pl > dl))) {
Label ql_adj_loop, ql_adj, ql_ok;
__ Bind(&ql_adj_loop);
__ bgtu(A6, T2, &ql_adj);
__ bne(A6, T2, &ql_ok);
__ bleu(A1, T1, &ql_ok);
__ Bind(&ql_adj);
// if (pl < yt) --ph
__ sltu(TMP, A1, T3);
__ sub(A6, A6, TMP);
// pl -= yt
__ sub(A1, A1, T3);
// --ql
__ subi(T6, T6, 1);
// Continue while loop.
__ j(&ql_adj_loop);
__ Bind(&ql_ok);
// qd |= ql;
__ or_(A0, A0, T6);
__ Bind(&return_qd);
// args[2..3] = qd
__ sx(A0, FieldAddress(T4, target::TypedData::payload_offset() +
2 * kBytesPerBigIntDigit));
// Result = One or two digits processed.
__ li(A0, target::ToRawSmi(target::kWordSize / kBytesPerBigIntDigit));
__ ret();
}
void AsmIntrinsifier::Montgomery_mulMod(Assembler* assembler,
Label* normal_ir_body) {
// TODO(riscv)
__ Bind(normal_ir_body);
// Pseudo code:
// static int _mulMod(Uint32List args, Uint32List digits, int i) {
// uint64_t rho = args[_RHO .. _RHO_HI]; // _RHO == 2, _RHO_HI == 3.
// uint64_t d = digits[i >> 1 .. (i >> 1) + 1]; // i is Smi and even.
// uint128_t t = rho*d;
// args[_MU .. _MU_HI] = t mod DIGIT_BASE^2; // _MU == 4, _MU_HI == 5.
// return 2;
// }
__ lx(T0, Address(SP, 2 * target::kWordSize)); // args
__ lx(T1, Address(SP, 1 * target::kWordSize)); // digits
__ lx(T2, Address(SP, 0 * target::kWordSize)); // i as Smi
// T3 = rho = args[2..3]
__ lx(T3, FieldAddress(T0, target::TypedData::payload_offset() +
2 * kBytesPerBigIntDigit));
// T4 = digits[i >> 1 .. (i >> 1) + 1]
__ slli(T2, T2, 1);
__ add(T1, T1, T2);
__ lx(T4, FieldAddress(T1, target::TypedData::payload_offset()));
// T5 = rho*d mod DIGIT_BASE
__ mul(T5, T4, T3); // T5 = low64(T4*T3).
// args[4 .. 5] = T5
__ sx(T5, FieldAddress(T0, target::TypedData::payload_offset() +
4 * kBytesPerBigIntDigit));
// Result = One or two digits processed.
__ li(A0, target::ToRawSmi(target::kWordSize / kBytesPerBigIntDigit));
__ ret();
}
// FA0: left

View file

@ -0,0 +1,140 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectSum(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a + b;
String actualString = actual.toRadixString(16);
print("$aString + $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87beca98ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa36c2e74f9845c182e303993e0efa8184");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"d87beca98ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa36c2e74f9845c182e303993e0efa8184");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
}

View file

@ -0,0 +1,84 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectQuotient(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a ~/ b;
String actualString = actual.toRadixString(16);
print("$aString ~/ $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "1");
expectQuotient("d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e", "157b1");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e", "36662bd");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "141bfd63e");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "3714fb67de7");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "-1");
expectQuotient("-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e", "-157b1");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e", "-36662bd");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "-141bfd63e");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "-3714fb67de7");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "-1");
expectQuotient("d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e", "-157b1");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e", "-36662bd");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "-141bfd63e");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "-3714fb67de7");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "1");
expectQuotient("-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e", "157b1");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e", "36662bd");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "141bfd63e");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "3714fb67de7");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
}

View file

@ -0,0 +1,112 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectRemainder(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a % b;
String actualString = actual.toRadixString(16);
print("$aString % $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"1fdbde7efec117ff81df42cc8367092a65e4");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"359d4ac0e4440150310acc0e96fdb973c");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "84c9b202365aef6ea4b442ff6897d72e");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "2c66626e41743605244c026579e4f0");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1", "0");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d11b55d5217bfadc012a3502892428b8c9906d8a");
expectRemainder(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"8163cdbfe36a817074a6295b3e8fcf60892a");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"3c526a361d552fe1825b7b010d68af57d2");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "2775302963150716c7737ef76ff317e0");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "127bc92b2e824f670375f473110a1e");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1", "0");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"1fdbde7efec117ff81df42cc8367092a65e4");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"359d4ac0e4440150310acc0e96fdb973c");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "84c9b202365aef6ea4b442ff6897d72e");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "2c66626e41743605244c026579e4f0");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1", "0");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d11b55d5217bfadc012a3502892428b8c9906d8a");
expectRemainder(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"8163cdbfe36a817074a6295b3e8fcf60892a");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"3c526a361d552fe1825b7b010d68af57d2");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "2775302963150716c7737ef76ff317e0");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "127bc92b2e824f670375f473110a1e");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1", "0");
}

View file

@ -0,0 +1,136 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectProduct(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a * b;
String actualString = actual.toRadixString(16);
print("$aString * $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0", "0");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0", "0");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0", "0");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0", "0");
}

View file

@ -0,0 +1,61 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectShifted(aString, n, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a << n;
String actualString = actual.toRadixString(16);
print("$aString << $n");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"1b0f7d9546e0392f6636b70109e56b669cf0ae124");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"361efb2a8dc0725ecc6d6e0213cad6cd39e15c248");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"d87becaa3701c97b31b5b8084f2b5b34e785709200000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"6c3df6551b80e4bd98dadc042795ad9a73c2b8490000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae124");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"-361efb2a8dc0725ecc6d6e0213cad6cd39e15c248");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"-d87becaa3701c97b31b5b8084f2b5b34e785709200000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b8490000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
}

View file

@ -0,0 +1,61 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectShifted(aString, n, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a >> n;
String actualString = actual.toRadixString(16);
print("$aString >> $n");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"6c3df6551b80e4bd98dadc042795ad9a73c2b849");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"361efb2a8dc0725ecc6d6e0213cad6cd39e15c24");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"1b0f7d9546e0392f6636b70109e56b669");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"d87becaa3701c97b31b5b8084f2b5b34");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"6c3df6551b80e4bd98dadc042795ad9a");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"1b0f7d9546e0392f6636b7010");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"d87becaa3701c97b31b5b808");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"6c3df6551b80e4bd98dadc04");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b849");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"-361efb2a8dc0725ecc6d6e0213cad6cd39e15c25");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"-1b0f7d9546e0392f6636b70109e56b66a");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"-d87becaa3701c97b31b5b8084f2b5b35");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"-6c3df6551b80e4bd98dadc042795ad9b");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"-1b0f7d9546e0392f6636b7011");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"-d87becaa3701c97b31b5b809");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-6c3df6551b80e4bd98dadc05");
}

View file

@ -0,0 +1,140 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectDifference(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a - b;
String actualString = actual.toRadixString(16);
print("$aString - $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"d87beca98ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa36c2e74f9845c182e303993e0efa8184");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87beca98ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa36c2e74f9845c182e303993e0efa8184");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
}

View file

@ -0,0 +1,142 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectSum(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a + b;
String actualString = actual.toRadixString(16);
print("$aString + $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87beca98ac2e74f9845c182e303993e0efa8184");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa36c2e74f9845c182e303993e0efa8184");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"d87beca98ac2e74f9845c182e303993e0efa8184");
expectSum(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa36c2e74f9845c182e303993e0efa8184");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectSum("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectSum(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectSum("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
}

View file

@ -0,0 +1,86 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectQuotient(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a ~/ b;
String actualString = actual.toRadixString(16);
print("$aString ~/ $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "1");
expectQuotient("d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e", "157b1");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e", "36662bd");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "141bfd63e");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "3714fb67de7");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "-1");
expectQuotient("-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e", "-157b1");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e", "-36662bd");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "-141bfd63e");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "-3714fb67de7");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "-1");
expectQuotient("d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e", "-157b1");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e", "-36662bd");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "-141bfd63e");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "-3714fb67de7");
expectQuotient("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e", "1");
expectQuotient("-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e", "157b1");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e", "36662bd");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "141bfd63e");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "3714fb67de7");
expectQuotient("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
}

View file

@ -0,0 +1,114 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectRemainder(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a % b;
String actualString = actual.toRadixString(16);
print("$aString % $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"1fdbde7efec117ff81df42cc8367092a65e4");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"359d4ac0e4440150310acc0e96fdb973c");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "84c9b202365aef6ea4b442ff6897d72e");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "2c66626e41743605244c026579e4f0");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1", "0");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d11b55d5217bfadc012a3502892428b8c9906d8a");
expectRemainder(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"8163cdbfe36a817074a6295b3e8fcf60892a");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"3c526a361d552fe1825b7b010d68af57d2");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e", "2775302963150716c7737ef76ff317e0");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e", "127bc92b2e824f670375f473110a1e");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1", "0");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"1fdbde7efec117ff81df42cc8367092a65e4");
expectRemainder(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"359d4ac0e4440150310acc0e96fdb973c");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "84c9b202365aef6ea4b442ff6897d72e");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "2c66626e41743605244c026579e4f0");
expectRemainder("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1", "0");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d11b55d5217bfadc012a3502892428b8c9906d8a");
expectRemainder(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"8163cdbfe36a817074a6295b3e8fcf60892a");
expectRemainder(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"3c526a361d552fe1825b7b010d68af57d2");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e", "2775302963150716c7737ef76ff317e0");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e", "127bc92b2e824f670375f473110a1e");
expectRemainder("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1", "0");
}

View file

@ -0,0 +1,138 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectProduct(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a * b;
String actualString = actual.toRadixString(16);
print("$aString * $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0", "0");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0", "0");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0", "0");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"b3f2d29d6885d40866b040adf8f545352154823b15fed8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"885bc7febac39cd5592e28ce964bfea66a31ea38d8aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"35d827ae2b7d1edeeae0115c81ba4a2496fe6d06aa8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"91a87047f3ae4999a45912763e9eb292049652bc8c35c5c223fcf4bf6eb904401c1875fc");
expectProduct(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"352d4596b9163adef2fad0a96d914a7908ab1a7435c5c223fcf4bf6eb904401c1875fc");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectProduct("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0", "0");
}

View file

@ -0,0 +1,63 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectShifted(aString, n, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a << n;
String actualString = actual.toRadixString(16);
print("$aString << $n");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"1b0f7d9546e0392f6636b70109e56b669cf0ae124");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"361efb2a8dc0725ecc6d6e0213cad6cd39e15c248");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"d87becaa3701c97b31b5b8084f2b5b34e785709200000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"6c3df6551b80e4bd98dadc042795ad9a73c2b8490000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae124");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"-361efb2a8dc0725ecc6d6e0213cad6cd39e15c248");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"-d87becaa3701c97b31b5b8084f2b5b34e785709200000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b8490000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
}

View file

@ -0,0 +1,63 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectShifted(aString, n, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a >> n;
String actualString = actual.toRadixString(16);
print("$aString >> $n");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"6c3df6551b80e4bd98dadc042795ad9a73c2b849");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"361efb2a8dc0725ecc6d6e0213cad6cd39e15c24");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"1b0f7d9546e0392f6636b70109e56b669");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"d87becaa3701c97b31b5b8084f2b5b34");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"6c3df6551b80e4bd98dadc042795ad9a");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"1b0f7d9546e0392f6636b7010");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"d87becaa3701c97b31b5b808");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"6c3df6551b80e4bd98dadc04");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 1,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b849");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 2,
"-361efb2a8dc0725ecc6d6e0213cad6cd39e15c25");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 31,
"-1b0f7d9546e0392f6636b70109e56b66a");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 32,
"-d87becaa3701c97b31b5b8084f2b5b35");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 33,
"-6c3df6551b80e4bd98dadc042795ad9b");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 63,
"-1b0f7d9546e0392f6636b7011");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 64,
"-d87becaa3701c97b31b5b809");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-6c3df6551b80e4bd98dadc05");
}

View file

@ -0,0 +1,142 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--no-intrinsify --no-enable-asserts
import "package:expect/expect.dart";
expectDifference(aString, bString, expectedString) {
BigInt a = BigInt.parse(aString, radix: 16);
BigInt b = BigInt.parse(bString, radix: 16);
BigInt expected = BigInt.parse(expectedString, radix: 16);
BigInt actual = a - b;
String actualString = actual.toRadixString(16);
print("$aString - $bString");
print(" = $actualString (expected $expectedString)");
Expect.equals(expected, actual);
}
main() {
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"d87beca98ac2e74f9845c182e303993e0efa8184");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa36c2e74f9845c182e303993e0efa8184");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"1ad478de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"d87c8de9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"d87bece9e340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"d87becaae340aba6cb25ae8dbb531d2bc0105fa0");
expectDifference(
"d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"d87becaa3740aba6cb25ae8dbb531d2bc0105fa0");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"d87becaa3701c97b31b5b8084f2b5b34e7857093");
expectDifference("d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"d87becaa3701c97b31b5b8084f2b5b34e7857092");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d4cba13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"3b04b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-a13fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87b4b6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3fac3ee22b996ff6856c27c1f6d88aef0e",
"-d87bec6a8ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-ac3ee22b996ff6856c27c1f6d88aef0e",
"-d87beca98ac2e74f9845c182e303993e0efa8184");
expectDifference(
"-d87becaa3701c97b31b5b8084f2b5b34e7857092",
"-3ee22b996ff6856c27c1f6d88aef0e",
"-d87becaa36c2e74f9845c182e303993e0efa8184");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-1",
"-d87becaa3701c97b31b5b8084f2b5b34e7857091");
expectDifference("-d87becaa3701c97b31b5b8084f2b5b34e7857092", "-0",
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
}