aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.h
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-06-06 20:34:24 -0700
committerAndrew Waterman <andrew@sifive.com>2022-06-06 20:54:17 -0700
commit898c0dd6a0c7bfe5e332ab0b6c00b3fd3b3d06a0 (patch)
tree696d666a9be340aa0b7e2b1cc1e9f8a3793e101e /riscv/mmu.h
parentfea4a75d37a0d63e0df41efaea53114248c790c5 (diff)
downloadspike-898c0dd6a0c7bfe5e332ab0b6c00b3fd3b3d06a0.zip
spike-898c0dd6a0c7bfe5e332ab0b6c00b3fd3b3d06a0.tar.gz
spike-898c0dd6a0c7bfe5e332ab0b6c00b3fd3b3d06a0.tar.bz2
Zero-extend instructions when fetching them from memory
...since we no longer rely on their being sign-extended.
Diffstat (limited to 'riscv/mmu.h')
-rw-r--r--riscv/mmu.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h
index 8964e29..5e776a9 100644
--- a/riscv/mmu.h
+++ b/riscv/mmu.h
@@ -319,15 +319,15 @@ public:
int length = insn_length(insn);
if (likely(length == 4)) {
- insn |= (insn_bits_t)from_le(*(const int16_t*)translate_insn_addr_to_host(addr + 2)) << 16;
+ insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 2)) << 16;
} else if (length == 2) {
- insn = (int16_t)insn;
+ // entire instruction already fetched
} else if (length == 6) {
- insn |= (insn_bits_t)from_le(*(const int16_t*)translate_insn_addr_to_host(addr + 4)) << 32;
+ insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 4)) << 32;
insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 2)) << 16;
} else {
static_assert(sizeof(insn_bits_t) == 8, "insn_bits_t must be uint64_t");
- insn |= (insn_bits_t)from_le(*(const int16_t*)translate_insn_addr_to_host(addr + 6)) << 48;
+ insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 6)) << 48;
insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 4)) << 32;
insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 2)) << 16;
}