From 92b96a26c8c633651bddb78a8fce1f06a5baa5e2 Mon Sep 17 00:00:00 2001 From: Jonas Bewig Date: Wed, 22 Apr 2026 22:52:12 +0200 Subject: [PATCH] CR16C: Fix abs24 and disp20 rel load/stor insns --- target/cr16c/insn.decode | 2 +- tests/tcg/cr16c/testxx-loads.S | 63 ++++++++++++++++++++++++++++++---- tests/tcg/cr16c/testxy-stors.S | 52 ++++++++++++++++++++++------ 3 files changed, 100 insertions(+), 17 deletions(-) diff --git a/target/cr16c/insn.decode b/target/cr16c/insn.decode index f2dcb96519..a72f7cbad0 100644 --- a/target/cr16c/insn.decode +++ b/target/cr16c/insn.decode @@ -170,7 +170,7 @@ EXCP 0000 0000 1100 id:4 ### Load and Store ### %addr_abs20 32:20 !function=reloc_abs20 -%addr_disp24 40:4 16:16 32:4 +%addr_disp24 32:4 40:4 16:16 &load rd ra dbase disp width &load_rrp rd rrp disp width diff --git a/tests/tcg/cr16c/testxx-loads.S b/tests/tcg/cr16c/testxx-loads.S index 275c63603e..41daadec80 100644 --- a/tests/tcg/cr16c/testxx-loads.S +++ b/tests/tcg/cr16c/testxx-loads.S @@ -60,8 +60,22 @@ _start: EXPECTD 0x12345603, r12 RESET - /* Relocation, abs20 rel and abs24 tests not implemented yet because of - some unclear behavior in gnu assembler we need to look at */ + /* LOADB abs20 rel */ + movd $0xFF00, (r12) + loadb [r12]0xF4, r1 + EXPECT 0x0A04, r1 + loadb [r12]0xF5, r13 + EXPECTD 0x87654305, r13 + RESET + + /* LOADB abs24 */ + storb $3, 0xEEFFF3 + storb $4, 0xEEFFF4 + loadb 0xEEFFF3, r0 + EXPECT 0x0B03, r0 + loadb 0xEEFFF4, r13 + EXPECTD 0x87654304, r13 + RESET /*** 16 BIT ***/ @@ -116,8 +130,24 @@ _start: EXPECTD 0x12340403, r12 RESET - /* Relocation, abs20 rel and abs24 tests not implemented yet because of - some unclear behavior in gnu assembler we need to look at */ + /* LOADW abs20 rel */ + movd $0xFF00, (r12) + loadw [r12]0xF4, r1 + EXPECT 0x0504, r1 + loadw [r12]0xF6, r13 + EXPECTD 0x87650706, r13 + RESET + + /* LOADW abs24 */ + storb $3, 0xEEFFF3 + storb $4, 0xEEFFF4 + storb $5, 0xEEFFF5 + storb $6, 0xEEFFF6 + loadw 0xEEFFF3, r0 + EXPECT 0x0403, r0 + loadw 0xEEFFF5, r13 + EXPECTD 0x87650605, r13 + RESET /*** 32 BIT ***/ @@ -177,8 +207,29 @@ _start: EXPECTD 0x05040302, r12 RESET - /* Relocation, abs20 rel and abs24 tests not implemented yet because of - some unclear behavior in gnu assembler we need to look at */ + /* LOADD abs20 rel */ + movd $0xFF00, (r12) + loadd [r12]0xF4, (r1,r0) + EXPECT 0x0504, r0 + EXPECT 0x0706, r1 + loadd [r12]0xF0, (r13) + EXPECTD 0x03020100, r13 + RESET + + /* LOADD abs24 */ + storb $0, 0xEEFFF0 + storb $1, 0xEEFFF1 + storb $2, 0xEEFFF2 + storb $3, 0xEEFFF3 + storb $4, 0xEEFFF4 + storb $5, 0xEEFFF5 + storb $6, 0xEEFFF6 + loadd 0xEEFFF3, (r1,r0) + EXPECT 0x0403, r0 + EXPECT 0x0605, r1 + loadd 0xEEFFF0, (r13) + EXPECTD 0x03020100, r13 + RESET /*** LOADM(P) ***/ diff --git a/tests/tcg/cr16c/testxy-stors.S b/tests/tcg/cr16c/testxy-stors.S index b03ce5fe96..1ac6b92767 100644 --- a/tests/tcg/cr16c/testxy-stors.S +++ b/tests/tcg/cr16c/testxy-stors.S @@ -50,14 +50,22 @@ _start: EXPECTM 0x0502, 0xFFF4 RESET - /* STORB rrp abs20 */ + /* STORB abs20 rel */ movd $0xFFF0, (r12) storb r2, [r12]1 EXPECTM 0x0202, 0xFFF1 RESET /* STORB abs24 */ - /* TODO */ + storb $0x0, 0xEEFFF0 + storb $0x1, 0xEEFFF1 + storb $0x2, 0xEEFFF2 + storb $0x3, 0xEEFFF3 + storb r0, 0xEEFFF2 + EXPECTM 0x0300, 0xEEFFF2 + storb r12, 0xEEFFF0 + EXPECTM 0x0178, 0xEEFFF0 + RESET /* STORB rrp disp14 imm */ movd $0x4, (r12) @@ -104,7 +112,10 @@ _start: RESET /* STORB abs24 imm */ - /* TODO */ + storb $0x2, 0xEEFFF0 + storb $0x3, 0xEEFFF1 + EXPECTM 0x302, 0xEEFFF0 + RESET /*** 16 BIT ***/ @@ -149,14 +160,22 @@ _start: EXPECTM 0x0902, 0xFFF4 RESET - /* STORW rrp abs20 */ + /* STORW abs20 rel */ movd $0xFFF0, (r12) storw r2, [r12]1 EXPECTM 0x0902, 0xFFF1 RESET - /* STORW rrp abs24 */ - /* TODO */ + /* STORW abs24 */ + storb $0x0, 0xEEFFF0 + storb $0x1, 0xEEFFF1 + storb $0x2, 0xEEFFF2 + storb $0x3, 0xEEFFF3 + storw r0, 0xEEFFF2 + EXPECTM 0x0B00, 0xEEFFF2 + storw r12, 0xEEFFF0 + EXPECTM 0x5678, 0xEEFFF0 + RESET /* STORW rrp disp14 imm */ movd $0x4, (r12) @@ -203,7 +222,10 @@ _start: RESET /* STORW abs24 imm */ - /* TODO */ + storw $0x1, 0xEEFFF1 + storw $0x2, 0xEEFFF0 + EXPECTM 0x2, 0xEEFFF0 + RESET /*** 32 BIT ***/ @@ -254,15 +276,25 @@ _start: EXPECTM 0x0803, 0xFFF6 RESET - /* STORD rrp abs20 */ + /* STORD abs20 rel */ movd $0xFFF0, (r12) stord (r3,r2), [r12]1 EXPECTM 0x0902, 0xFFF1 EXPECTM 0x0803, 0xFFF3 RESET - /* STORD rrp abs24 */ - /* TODO */ + /* STORD abs24 */ + storb $0x0, 0xEEFFF0 + storb $0x1, 0xEEFFF1 + storb $0x2, 0xEEFFF2 + storb $0x3, 0xEEFFF3 + stord (r1,r0), 0xEEFFF0 + EXPECTM 0x0B00, 0xEEFFF0 + EXPECTM 0x0A01, 0xEEFFF2 + stord (r12), 0xEEFFF0 + EXPECTM 0x5678, 0xEEFFF0 + EXPECTM 0x1234, 0xEEFFF2 + RESET /*** STORM(P) ***/