aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/alu.cpp
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-01-15 14:36:31 +0100
committerKarel Kočí <cynerd@email.cz>2018-01-15 14:36:31 +0100
commited851a24951417b2493211835f9e488448890be6 (patch)
treee9e3647ab470c10da519ec4593834979d17f7852 /qtmips_machine/alu.cpp
parent78534f29b90fcf7484ed8b64e404a7059a69abea (diff)
downloadqtmips-ed851a24951417b2493211835f9e488448890be6.tar.gz
qtmips-ed851a24951417b2493211835f9e488448890be6.tar.bz2
qtmips-ed851a24951417b2493211835f9e488448890be6.zip
Fix SRA and SRAV instructions
This implementation is correct one but there is no guarantee that it will work with all compilers so we should always check on given platform that tests pass (and potentially fix it).
Diffstat (limited to 'qtmips_machine/alu.cpp')
-rw-r--r--qtmips_machine/alu.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/qtmips_machine/alu.cpp b/qtmips_machine/alu.cpp
index 0d40bf0..f266c9b 100644
--- a/qtmips_machine/alu.cpp
+++ b/qtmips_machine/alu.cpp
@@ -11,15 +11,15 @@ std::uint32_t machine::alu_operate(enum AluOp operation, std::uint32_t s, std::u
case ALU_OP_SRL:
return t >> sa;
case ALU_OP_SRA:
- // TODO is this correct implementation? (Should we be masking top most bit?)
- return ((t & 0x7fffffff) >> sa) | (t & 0x80000000);
+ // Note: This might be broken with some compilers but works with gcc
+ return (std::int32_t)t >> sa;
case ALU_OP_SLLV:
return t << s;
case ALU_OP_SRLV:
return t >> s;
case ALU_OP_SRAV:
- // TODO is this correct implementation? (Should we be masking top most bit?)
- return ((t & 0x7fffffff) >> s) | (t & 0x80000000);
+ // Note: same note as in case of SRA
+ return (std::int32_t)t >> s;
case ALU_OP_JR:
case ALU_OP_JALR:
// Do nothing as we solve this when we are handling program counter in instruction decode (handle_pc)