diff options
author | Fredrik Noring <noring@nocrew.org> | 2018-12-27 21:24:22 +0100 |
---|---|---|
committer | Aleksandar Markovic <amarkovic@wavecomp.com> | 2019-01-03 17:52:52 +0100 |
commit | 84dc07123611572159f76b409ee5fe085fb4e7fb (patch) | |
tree | 3be2c4fdd316802470efc0e06e4420971d7dfbc6 /tests/tcg | |
parent | 50f299da629b4c2269c17af75a2659641a763d0d (diff) | |
download | qemu-84dc07123611572159f76b409ee5fe085fb4e7fb.zip |
tests/tcg: mips: Test R5900 three-operand MADD1
Test R5900 three-operand MADD1.
Reviewed-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Signed-off-by: Fredrik Noring <noring@nocrew.org>
Diffstat (limited to 'tests/tcg')
-rw-r--r-- | tests/tcg/mips/mipsr5900/madd.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/tests/tcg/mips/mipsr5900/madd.c b/tests/tcg/mips/mipsr5900/madd.c index 9ad2ea6dbb..f6f215e1c3 100644 --- a/tests/tcg/mips/mipsr5900/madd.c +++ b/tests/tcg/mips/mipsr5900/madd.c @@ -1,5 +1,5 @@ /* - * Test R5900-specific three-operand MADD. + * Test R5900-specific three-operand MADD and MADD1. */ #include <stdio.h> @@ -29,12 +29,45 @@ int64_t madd(int64_t a, int32_t rs, int32_t rt) return r; } +int64_t madd1(int64_t a, int32_t rs, int32_t rt) +{ + int32_t lo = a; + int32_t hi = a >> 32; + int32_t rd; + int64_t r; + + __asm__ __volatile__ ( + " mtlo1 %5\n" + " mthi1 %6\n" + " madd1 %0, %3, %4\n" + " mflo1 %1\n" + " mfhi1 %2\n" + : "=r" (rd), "=r" (lo), "=r" (hi) + : "r" (rs), "r" (rt), "r" (lo), "r" (hi)); + r = ((int64_t)hi << 32) | (uint32_t)lo; + + assert(a + (int64_t)rs * rt == r); + assert(rd == lo); + + return r; +} + +static int64_t madd_variants(int64_t a, int32_t rs, int32_t rt) +{ + int64_t rd = madd(a, rs, rt); + int64_t rd1 = madd1(a, rs, rt); + + assert(rd == rd1); + + return rd; +} + static void verify_madd(int64_t a, int32_t rs, int32_t rt, int64_t expected) { - assert(madd(a, rs, rt) == expected); - assert(madd(a, -rs, rt) == a + a - expected); - assert(madd(a, rs, -rt) == a + a - expected); - assert(madd(a, -rs, -rt) == expected); + assert(madd_variants(a, rs, rt) == expected); + assert(madd_variants(a, -rs, rt) == a + a - expected); + assert(madd_variants(a, rs, -rt) == a + a - expected); + assert(madd_variants(a, -rs, -rt) == expected); } int main() |