47 lines
2.0 KiB
C
47 lines
2.0 KiB
C
|
#include <stdio.h>
|
||
|
#include <stdint.h>
|
||
|
#include <inttypes.h>
|
||
|
#include <assert.h>
|
||
|
|
||
|
#define WORD_A 0xAAAAAAAAUL
|
||
|
#define WORD_B 0xBBBBBBBBUL
|
||
|
#define WORD_C 0xCCCCCCCCUL
|
||
|
#define WORD_D 0xDDDDDDDDUL
|
||
|
|
||
|
#define DWORD_HI (WORD_A << 32 | WORD_B)
|
||
|
#define DWORD_LO (WORD_C << 32 | WORD_D)
|
||
|
|
||
|
#define TEST(HI, LO, UIM, RES) \
|
||
|
do { \
|
||
|
union { \
|
||
|
uint64_t u; \
|
||
|
double f; \
|
||
|
} h = { .u = HI }, l = { .u = LO }; \
|
||
|
/* \
|
||
|
* Use a pair of FPRs to load the VSR avoiding insns \
|
||
|
* newer than xxswapd. \
|
||
|
*/ \
|
||
|
asm("xxmrghd 32, %0, %1\n\t" \
|
||
|
"xxspltw 32, 32, %2\n\t" \
|
||
|
"xxmrghd %0, 32, %0\n\t" \
|
||
|
"xxswapd 32, 32\n\t" \
|
||
|
"xxmrghd %1, 32, %1\n\t" \
|
||
|
: "+f" (h.f), "+f" (l.f) \
|
||
|
: "i" (UIM) \
|
||
|
: "v0"); \
|
||
|
printf("xxspltw(0x%016" PRIx64 "%016" PRIx64 ", %d) =" \
|
||
|
" %016" PRIx64 "%016" PRIx64 "\n", HI, LO, UIM, \
|
||
|
h.u, l.u); \
|
||
|
assert(h.u == (RES)); \
|
||
|
assert(l.u == (RES)); \
|
||
|
} while (0)
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
TEST(DWORD_HI, DWORD_LO, 0, WORD_A << 32 | WORD_A);
|
||
|
TEST(DWORD_HI, DWORD_LO, 1, WORD_B << 32 | WORD_B);
|
||
|
TEST(DWORD_HI, DWORD_LO, 2, WORD_C << 32 | WORD_C);
|
||
|
TEST(DWORD_HI, DWORD_LO, 3, WORD_D << 32 | WORD_D);
|
||
|
return 0;
|
||
|
}
|