| 1 | /* |
| 2 | * Test R5900-specific MFLO1 and MFHI1. |
| 3 | */ |
| 4 | |
| 5 | #include <stdio.h> |
| 6 | #include <inttypes.h> |
| 7 | #include <assert.h> |
| 8 | |
| 9 | int main() |
| 10 | { |
| 11 | int32_t rs = 12207031, rt = 305175781; |
| 12 | int32_t rs1 = 32452867, rt1 = 49979687; |
| 13 | int64_t lo, hi, lo1, hi1; |
| 14 | int64_t r, r1; |
| 15 | |
| 16 | /* Test both LO/HI and LO1/HI1 to verify separation. */ |
| 17 | __asm__ __volatile__ ( |
| 18 | " mult $0, %4, %5\n" |
| 19 | " mult1 $0, %6, %7\n" |
| 20 | " mflo %0\n" |
| 21 | " mfhi %1\n" |
| 22 | " mflo1 %2\n" |
| 23 | " mfhi1 %3\n" |
| 24 | : "=r" (lo), "=r" (hi), |
| 25 | "=r" (lo1), "=r" (hi1) |
| 26 | : "r" (rs), "r" (rt), |
| 27 | "r" (rs1), "r" (rt1)); |
| 28 | r = ((int64_t)hi << 32) | (uint32_t)lo; |
| 29 | r1 = ((int64_t)hi1 << 32) | (uint32_t)lo1; |
| 30 | |
| 31 | assert(r == 3725290219116211); |
| 32 | assert(r1 == 1621984134912629); |
| 33 | |
| 34 | return 0; |
| 35 | } |