kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit 8626ea4a1c51ff379de454ddd107dea711309609
parent 9d57dd046e198673042c8cfca233666f7bfc7480
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Tue, 19 May 2026 17:36:36 -0700

Fix AArch64 logical immediate rotation

Diffstat:
Msrc/arch/aa64/isa.h | 2+-
Mtest/arch/aa64_isa_test.c | 17+++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/arch/aa64/isa.h b/src/arch/aa64/isa.h @@ -284,7 +284,7 @@ static inline int aa64_logimm_encode(u64 imm, u32 sf, u32 *N_out, u32 neg_size_shl1 = ((u32)(-(i32)size) << 1) & 0x3Fu; *imms_out = neg_size_shl1 | ((ones - 1u) & 0x3Fu); } - *immr_out = rotation; + *immr_out = rotation ? (size - rotation) & (size - 1u) : 0u; return 1; } diff --git a/test/arch/aa64_isa_test.c b/test/arch/aa64_isa_test.c @@ -186,6 +186,23 @@ int main(void) { ++cases; } + /* Logical immediates: 0xff00 must not be encoded as the rotated + * 0xff000000 mask. */ + { + u32 N = 0, immr = 0, imms = 0; + ++cases; + if (!aa64_logimm_encode(0xff00u, 0, &N, &immr, &imms)) { + fprintf(stderr, "FAIL: aa64_logimm_encode rejected 0xff00\n"); + ++fails; + } else { + u32 w = aa64_and_imm(0, 19, 19, N, immr, imms); + if (w != 0x12181e73u) { + fprintf(stderr, "FAIL: and w19,w19,#0xff00 encoded 0x%08x\n", w); + ++fails; + } + } + } + if (fails) { fprintf(stderr, "%d / %d failed\n", fails, cases); return 1;