Chromium Code Reviews| Index: src/mips64/simulator-mips64.cc |
| diff --git a/src/mips64/simulator-mips64.cc b/src/mips64/simulator-mips64.cc |
| index 9519865c8231eab71bcc54840827e82537b702fe..e225b8482c7f9738899af2abcabd113caa018fb9 100644 |
| --- a/src/mips64/simulator-mips64.cc |
| +++ b/src/mips64/simulator-mips64.cc |
| @@ -3431,10 +3431,37 @@ void Simulator::DecodeTypeRegisterSPECIAL() { |
| SetResult(rd_reg(), alu_out); |
| break; |
| case DSRL: |
| - SetResult(rd_reg(), rt_u() >> sa()); |
| + if (rs_reg() == 0) { |
| + // Regular logical right shift of a word by a fixed number of |
| + // bits instruction. RS field is always equal to 0. |
| + // Sign-extend the 64-bit result. |
|
balazs.kilvady
2016/04/12 10:18:00
Is it realy necessary to use double conversion in
Marija Antic
2016/04/12 12:59:16
Done.
|
| + alu_out = static_cast<int64_t>(static_cast<uint64_t>(rt_u()) >> sa()); |
|
Ilija.Pavlovic1
2016/04/12 12:31:32
rt_u() already returns uint64_t.
|
| + } else { |
| + // Logical right-rotate of a word by a fixed number of bits. This |
| + // is special case of SRL instruction, added in MIPS32 Release 2. |
| + // RS field is equal to 00001. |
| + alu_out = static_cast<int64_t>( |
| + base::bits::RotateRight64(static_cast<const uint64_t>(rt_u()), |
| + static_cast<const uint64_t>(sa()))); |
|
balazs.kilvady
2016/04/12 10:18:00
RotateRight64() gets its inputs by value so conver
Marija Antic
2016/04/12 12:59:16
Done.
|
| + } |
| + SetResult(rd_reg(), alu_out); |
| break; |
|
Ilija.Pavlovic1
2016/04/12 12:31:32
Rs field has defined values 0 and 1. Other values
Marija Antic
2016/04/12 12:59:16
Done.
|
| case DSRL32: |
| - SetResult(rd_reg(), rt_u() >> sa() >> 32); |
| + if (rs_reg() == 0) { |
| + // Regular logical right shift of a word by a fixed number of |
| + // bits instruction. RS field is always equal to 0. |
| + // Sign-extend the 64-bit result. |
| + alu_out = |
| + static_cast<int64_t>(static_cast<uint64_t>(rt_u()) >> sa() >> 32); |
| + } else { |
| + // Logical right-rotate of a word by a fixed number of bits. This |
| + // is special case of SRL instruction, added in MIPS32 Release 2. |
| + // RS field is equal to 00001. |
| + alu_out = static_cast<int64_t>( |
| + base::bits::RotateRight64(static_cast<const uint64_t>(rt_u()), |
| + static_cast<const uint64_t>(sa()) + 32)); |
| + } |
|
balazs.kilvady
2016/04/12 10:18:00
Same conversion notes like above.
|
| + SetResult(rd_reg(), alu_out); |
| break; |
|
Ilija.Pavlovic1
2016/04/12 12:31:32
To use "switch-case" as for DSRL.
Marija Antic
2016/04/12 12:59:16
Keeping it with rs_reg() (it does the same), in or
|
| case SRA: |
| SetResult(rd_reg(), (int32_t)rt() >> sa()); |