[vm, compiler] Fix BigInt._rsh intrinsic when shifting out at least one word on RISC-V.

TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/49067
Change-Id: I3f7041243334da3a106534f7cf4903a7c34b272c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/245780
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Ryan Macnak 2022-05-26 22:54:29 +00:00 committed by Commit Bot
parent cc17a98514
commit 38f9b339e3
5 changed files with 38 additions and 1 deletions

View file

@ -245,11 +245,12 @@ void AsmIntrinsifier::Bigint_rsh(Assembler* assembler, Label* normal_ir_body) {
__ andi(T5, T2, target::kBitsPerWord - 1); // T5 = bit shift
__ li(T6, target::kBitsPerWord);
__ sub(T6, T6, T5); // T6 = carry bit shift
__ sub(T1, T1, T4); // T1 = words to process
__ slli(TMP, T4, target::kWordSizeLog2);
__ add(T0, T0, TMP); // T0 = &src_digits[word_shift]
__ li(T2, 0); // carry
// T2 = carry
__ lx(T2, FieldAddress(T0, target::TypedData::payload_offset()));
__ srl(T2, T2, T5);
__ addi(T0, T0, target::kWordSize);

View file

@ -39,6 +39,12 @@ main() {
"d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
"6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
"d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
"1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@ -58,4 +64,10 @@ main() {
"-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
"-d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
}

View file

@ -39,6 +39,9 @@ main() {
"d87becaa3701c97b31b5b808");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"6c3df6551b80e4bd98dadc04");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "1b0f7d954");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "d87becaa");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "6c3df655");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@ -58,4 +61,7 @@ main() {
"-d87becaa3701c97b31b5b809");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-6c3df6551b80e4bd98dadc05");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "-1b0f7d955");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "-d87becab");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "-6c3df656");
}

View file

@ -41,6 +41,12 @@ main() {
"d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
"6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
"d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
"1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@ -60,4 +66,10 @@ main() {
"-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
"-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
"-d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
"-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
}

View file

@ -41,6 +41,9 @@ main() {
"d87becaa3701c97b31b5b808");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"6c3df6551b80e4bd98dadc04");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "1b0f7d954");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "d87becaa");
expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "6c3df655");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
"-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@ -60,4 +63,7 @@ main() {
"-d87becaa3701c97b31b5b809");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
"-6c3df6551b80e4bd98dadc05");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "-1b0f7d955");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "-d87becab");
expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "-6c3df656");
}