This commit is contained in:
nora 2025-03-09 18:17:31 +01:00
parent f88ec3c7eb
commit 1d20052465
2 changed files with 78 additions and 1 deletions

View file

@ -250,7 +250,7 @@ impl Emulator {
}
Inst::Lhu { offset, dest, base } => {
let addr = self[base].wrapping_add(offset);
self[dest] = self.mem.load_u8(addr)? as u32;
self[dest] = self.mem.load_u16(addr)? as u32;
}
Inst::Lw { offset, dest, base } => {
let addr = self[base].wrapping_add(offset);

77
tests/check/mem.S Normal file
View file

@ -0,0 +1,77 @@
# Load and Store Instructions
#include "../helper.S"
.macro CASE_NO_OFFSET_DIFF_RESULT s l value result
li t1, \value
\s t1, 0(t0)
\l t2, 0(t0)
ASSERT_EQ t2, \result
.endm
.macro CASE_NO_OFFSET s l value
CASE_NO_OFFSET_DIFF_RESULT \s, \l, \value, \value
.endm
.macro CASE_SAME_OFFSET s l value offset
li t1, \value
\s t1, \offset(t0)
\l t2, \offset(t0)
ASSERT_EQ t2, \value
.endm
.macro CASE_ADDED_OFFSET s l value offset
addi t3, t0, \offset
li t1, \value
\s t1, \offset(t0)
\l t2, 0(t3)
ASSERT_EQ t2, \value
.endm
START_TEST
li t0, 0
##### word
CASE_NO_OFFSET sw, lw, -4
CASE_SAME_OFFSET sw, lw, -5, 4
CASE_SAME_OFFSET sw, lw, -6, 1000
CASE_ADDED_OFFSET sw, lw, -7, 4
CASE_ADDED_OFFSET sw, lw, -8, 1000
##### half
CASE_NO_OFFSET_DIFF_RESULT sh, lh, 65535, -1
CASE_NO_OFFSET sh, lhu, 65535
CASE_NO_OFFSET sh, lh, 21450
CASE_SAME_OFFSET sh, lh, 21451, 4
CASE_SAME_OFFSET sh, lh, 21452, 1000
CASE_ADDED_OFFSET sh, lh, 21453, 4
CASE_ADDED_OFFSET sh, lh, 21454, 1000
CASE_NO_OFFSET sh, lhu, 20420
CASE_SAME_OFFSET sh, lhu, 20421, 4
CASE_SAME_OFFSET sh, lhu, 20422, 1000
CASE_ADDED_OFFSET sh, lhu, 20423, 4
CASE_ADDED_OFFSET sh, lhu, 20424, 1000
##### byte
CASE_NO_OFFSET_DIFF_RESULT sb, lb, 255, -1
CASE_NO_OFFSET sb, lbu, 255
CASE_NO_OFFSET sb, lb, 90
CASE_SAME_OFFSET sb, lb, 90, 4
CASE_SAME_OFFSET sb, lb, 91, 1000
CASE_ADDED_OFFSET sb, lb, 92, 4
CASE_ADDED_OFFSET sb, lb, 93, 1000
CASE_NO_OFFSET sb, lbu, 110
CASE_SAME_OFFSET sb, lbu, 110, 4
CASE_SAME_OFFSET sb, lbu, 111, 1000
CASE_ADDED_OFFSET sb, lbu, 112, 4
CASE_ADDED_OFFSET sb, lbu, 113, 1000
PASS