mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 12:30:03 +00:00
[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:
parent
dc8f487bae
commit
d34e7b0500
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
140
tests/corelib/bigint_add_test.dart
Normal file
140
tests/corelib/bigint_add_test.dart
Normal 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");
|
||||
}
|
84
tests/corelib/bigint_div_test.dart
Normal file
84
tests/corelib/bigint_div_test.dart
Normal 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");
|
||||
}
|
112
tests/corelib/bigint_mod_test.dart
Normal file
112
tests/corelib/bigint_mod_test.dart
Normal 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");
|
||||
}
|
136
tests/corelib/bigint_mul_test.dart
Normal file
136
tests/corelib/bigint_mul_test.dart
Normal 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");
|
||||
}
|
61
tests/corelib/bigint_sll_test.dart
Normal file
61
tests/corelib/bigint_sll_test.dart
Normal 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");
|
||||
}
|
61
tests/corelib/bigint_sra_test.dart
Normal file
61
tests/corelib/bigint_sra_test.dart
Normal 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");
|
||||
}
|
140
tests/corelib/bigint_sub_test.dart
Normal file
140
tests/corelib/bigint_sub_test.dart
Normal 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");
|
||||
}
|
142
tests/corelib_2/bigint_add_test.dart
Normal file
142
tests/corelib_2/bigint_add_test.dart
Normal 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");
|
||||
}
|
86
tests/corelib_2/bigint_div_test.dart
Normal file
86
tests/corelib_2/bigint_div_test.dart
Normal 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");
|
||||
}
|
114
tests/corelib_2/bigint_mod_test.dart
Normal file
114
tests/corelib_2/bigint_mod_test.dart
Normal 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");
|
||||
}
|
138
tests/corelib_2/bigint_mul_test.dart
Normal file
138
tests/corelib_2/bigint_mul_test.dart
Normal 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");
|
||||
}
|
63
tests/corelib_2/bigint_sll_test.dart
Normal file
63
tests/corelib_2/bigint_sll_test.dart
Normal 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");
|
||||
}
|
63
tests/corelib_2/bigint_sra_test.dart
Normal file
63
tests/corelib_2/bigint_sra_test.dart
Normal 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");
|
||||
}
|
142
tests/corelib_2/bigint_sub_test.dart
Normal file
142
tests/corelib_2/bigint_sub_test.dart
Normal 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");
|
||||
}
|
Loading…
Reference in a new issue