| Index: runtime/vm/simulator_arm64.cc
|
| diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
|
| index 4e8fde227829e2ce610d177a28560e77c516865c..3c0c99b63782a3603a1d010265de45d69c1eccdc 100644
|
| --- a/runtime/vm/simulator_arm64.cc
|
| +++ b/runtime/vm/simulator_arm64.cc
|
| @@ -2261,7 +2261,8 @@ int64_t Simulator::ShiftOperand(uint8_t reg_size,
|
| value &= kWRegMask;
|
| }
|
| return (static_cast<uint64_t>(value) >> amount) |
|
| - ((value & ((1L << amount) - 1L)) << (reg_size - amount));
|
| + ((static_cast<uint64_t>(value) & ((1ULL << amount) - 1ULL))
|
| + << (reg_size - amount));
|
| }
|
| default:
|
| UNIMPLEMENTED();
|
| @@ -2673,12 +2674,12 @@ void Simulator::DecodeMiscDP3Source(Instr* instr) {
|
| const uint64_t rm_val = get_register(rm, R31IsZR);
|
| #if defined(TARGET_OS_WINDOWS)
|
| // Visual Studio does not support __int128.
|
| - int64_t alu_out;
|
| - Multiply128(rn_val, rm_val, &alu_out);
|
| + uint64_t alu_out;
|
| + UnsignedMultiply128(rn_val, rm_val, &alu_out);
|
| #else
|
| - const __int128 res =
|
| - static_cast<__int128>(rn_val) * static_cast<__int128>(rm_val);
|
| - const int64_t alu_out = static_cast<int64_t>(res >> 64);
|
| + const unsigned __int128 res = static_cast<unsigned __int128>(rn_val) *
|
| + static_cast<unsigned __int128>(rm_val);
|
| + const uint64_t alu_out = static_cast<uint64_t>(res >> 64);
|
| #endif // TARGET_OS_WINDOWS
|
| set_register(instr, rd, alu_out, R31IsZR);
|
| } else if ((instr->Bits(29, 3) == 4) && (instr->Bits(21, 3) == 5) &&
|
|
|