2022-01-04 09:55:34 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
#define TEST(INSN, B_HI, B_LO, T_HI, T_LO) \
|
|
|
|
do { \
|
|
|
|
uint64_t th, tl, bh = B_HI, bl = B_LO; \
|
2022-03-05 09:16:46 +03:00
|
|
|
asm("mtvsrd 32, %2\n\t" \
|
|
|
|
"mtvsrd 33, %3\n\t" \
|
|
|
|
"xxmrghd 32, 32, 33\n\t" \
|
|
|
|
INSN " 32, 32\n\t" \
|
|
|
|
"mfvsrd %0, 32\n\t" \
|
|
|
|
"xxswapd 32, 32\n\t" \
|
|
|
|
"mfvsrd %1, 32\n\t" \
|
2022-01-04 09:55:34 +03:00
|
|
|
: "=r" (th), "=r" (tl) \
|
|
|
|
: "r" (bh), "r" (bl) \
|
2022-03-05 09:16:46 +03:00
|
|
|
: "v0", "v1"); \
|
2022-01-04 09:55:34 +03:00
|
|
|
printf(INSN "(0x%016" PRIx64 "%016" PRIx64 ") = 0x%016" PRIx64 \
|
|
|
|
"%016" PRIx64 "\n", bh, bl, th, tl); \
|
|
|
|
assert(th == T_HI && tl == T_LO); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
/* SNaN shouldn't be silenced */
|
|
|
|
TEST("xscvspdpn", 0x7fbfffff00000000ULL, 0x0, 0x7ff7ffffe0000000ULL, 0x0);
|
|
|
|
TEST("xscvdpspn", 0x7ff7ffffffffffffULL, 0x0, 0x7fbfffff7fbfffffULL, 0x0);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SNaN inputs having no significant bits in the upper 23 bits of the
|
|
|
|
* signifcand will return Infinity as the result.
|
|
|
|
*/
|
|
|
|
TEST("xscvdpspn", 0x7ff000001fffffffULL, 0x0, 0x7f8000007f800000ULL, 0x0);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|