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:
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;