Commit eb4ecad3e3 for qemu.org
commit eb4ecad3e3aa775caa3f533f0e39ebcac822d1db
Author: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Date: Thu Oct 29 11:18:19 2026 +0100
tests/tcg/mipsel: Test MIPS32R6 JIALC and JIC
Now test JI[AL]C.
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
Message-ID: <20261030182546.2508-13-philmd@oss.qualcomm.com>
diff --git a/tests/tcg/mipsel/test_mips32r6_branch.c b/tests/tcg/mipsel/test_mips32r6_branch.c
index 6db2eb6f67..0fd5dfaf22 100644
--- a/tests/tcg/mipsel/test_mips32r6_branch.c
+++ b/tests/tcg/mipsel/test_mips32r6_branch.c
@@ -39,6 +39,75 @@ static int test_balc(void)
return seen != expected;
}
+/* JIALC rt, offset: call to GPR[rt] + offset, link in $ra. */
+#define JIALC(bias, off, seen, expected, tmp) \
+ __asm__ volatile ( \
+ ".set push\n\t" \
+ ".set noreorder\n\t" \
+ "move %0, $zero\n\t" \
+ "lapc %2, 1f\n\t" \
+ "addiu %2, %2, " #bias "\n\t" \
+ "jialc %2, " #off "\n\t" \
+ "2: bc 3f\n\t" \
+ "1: move %0, $ra\n\t" \
+ "jrc $ra\n\t" \
+ "3: lapc %1, 2b\n\t" \
+ ".set pop\n\t" \
+ : "=&r" (seen), "=&r" (expected), "=&r" (tmp) \
+ : \
+ : "ra")
+
+static int test_jialc(void)
+{
+ uint32_t seen, expected, tmp;
+ int ret = 0;
+
+ JIALC(0, 0, seen, expected, tmp);
+ ret |= seen != expected;
+ JIALC(-8, 8, seen, expected, tmp);
+ ret |= seen != expected;
+ JIALC(8, -8, seen, expected, tmp);
+ ret |= seen != expected;
+ if (ret) {
+ TAP_INFO("JIALC: last ra 0x%08x expected 0x%08x", seen, expected);
+ }
+ return ret;
+}
+
+/* JIC rt, offset: jump to GPR[rt] + offset, no link ($ra unchanged). */
+#define JIC(bias, off, res, ra_before, ra_after, tmp) \
+ __asm__ volatile ( \
+ ".set push\n\t" \
+ ".set noreorder\n\t" \
+ "move %0, $zero\n\t" \
+ "move %1, $ra\n\t" \
+ "lapc %3, 1f\n\t" \
+ "addiu %3, %3, " #bias "\n\t" \
+ "jic %3, " #off "\n\t" \
+ "addiu %0, %0, 2\n\t" \
+ "1: addiu %0, %0, 1\n\t" \
+ "move %2, $ra\n\t" \
+ ".set pop\n\t" \
+ : "=&r" (res), "=&r" (ra_before), "=&r" (ra_after), "=&r" (tmp))
+
+static int test_jic(void)
+{
+ uint32_t res, ra_before, ra_after, tmp;
+ int ret = 0;
+
+ JIC(0, 0, res, ra_before, ra_after, tmp);
+ ret |= res != 1 || ra_before != ra_after;
+ JIC(-4, 4, res, ra_before, ra_after, tmp);
+ ret |= res != 1 || ra_before != ra_after;
+ JIC(4, -4, res, ra_before, ra_after, tmp);
+ ret |= res != 1 || ra_before != ra_after;
+ if (ret) {
+ TAP_INFO("JIC: last res %u (expected 1) ra 0x%08x -> 0x%08x",
+ res, ra_before, ra_after);
+ }
+ return ret;
+}
+
static int run(const char *name, int (*test)(void))
{
int ret = test();
@@ -51,6 +120,8 @@ int main(void)
{
TAP_START();
run("BALC", test_balc);
+ run("JIALC", test_jialc);
+ run("JIC", test_jic);
return tap_done();
}