diff options
author | Andrew Waterman <andrew@sifive.com> | 2022-06-06 20:34:24 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2022-06-06 20:54:17 -0700 |
commit | 898c0dd6a0c7bfe5e332ab0b6c00b3fd3b3d06a0 (patch) | |
tree | 696d666a9be340aa0b7e2b1cc1e9f8a3793e101e | |
parent | fea4a75d37a0d63e0df41efaea53114248c790c5 (diff) | |
download | spike-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.
-rw-r--r-- | riscv/mmu.h | 8 |
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; } |