Index: src/mips64/simulator-mips64.cc |
diff --git a/src/mips64/simulator-mips64.cc b/src/mips64/simulator-mips64.cc |
index 9519865c8231eab71bcc54840827e82537b702fe..0916e48d4353af713e468214b649c6605fcc47cf 100644 |
--- a/src/mips64/simulator-mips64.cc |
+++ b/src/mips64/simulator-mips64.cc |
@@ -3420,21 +3420,50 @@ void Simulator::DecodeTypeRegisterSPECIAL() { |
// bits instruction. RS field is always equal to 0. |
// Sign-extend the 32-bit result. |
alu_out = static_cast<int32_t>(static_cast<uint32_t>(rt_u()) >> sa()); |
balazs.kilvady
2016/04/12 13:14:33
I see. A lot of unnecessary casting existed alread
|
- } else { |
+ } else if (rs_reg() == 1) { |
// 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<int32_t>( |
base::bits::RotateRight32(static_cast<const uint32_t>(rt_u()), |
static_cast<const uint32_t>(sa()))); |
balazs.kilvady
2016/04/12 13:14:33
I see. A lot of unecessary comment existed already
|
+ } else { |
+ UNREACHABLE(); |
} |
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. |
+ alu_out = static_cast<int64_t>(rt_u() >> sa()); |
+ } else if (rs_reg() == 1) { |
+ // 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(rt_u(), sa())); |
+ } else { |
+ UNREACHABLE(); |
+ } |
+ SetResult(rd_reg(), alu_out); |
break; |
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>(rt_u() >> sa() >> 32); |
+ } else if (rs_reg() == 1) { |
+ // 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(rt_u(), sa() + 32)); |
+ } else { |
+ UNREACHABLE(); |
+ } |
+ SetResult(rd_reg(), alu_out); |
break; |
case SRA: |
SetResult(rd_reg(), (int32_t)rt() >> sa()); |
@@ -3470,12 +3499,13 @@ void Simulator::DecodeTypeRegisterSPECIAL() { |
if (sa() == 0) { |
// Regular logical right-shift of a word by a variable number of |
// bits instruction. SA field is always equal to 0. |
- alu_out = rt_u() >> rs(); |
+ alu_out = static_cast<int64_t>(rt_u() >> rs()); |
} else { |
// Logical right-rotate of a word by a variable number of bits. |
// This is special case od SRLV instruction, added in MIPS32 |
// Release 2. SA field is equal to 00001. |
- alu_out = base::bits::RotateRight64(rt_u(), rs_u()); |
+ alu_out = |
+ static_cast<int64_t>(base::bits::RotateRight64(rt_u(), rs_u())); |
} |
SetResult(rd_reg(), alu_out); |
break; |