1 #include <stdio.h>
2 #include <stdint.h>
3 #include <inttypes.h>
4 #include <assert.h>
5
6 #define WORD_A 0xAAAAAAAAUL
7 #define WORD_B 0xBBBBBBBBUL
8 #define WORD_C 0xCCCCCCCCUL
9 #define WORD_D 0xDDDDDDDDUL
10
11 #define DWORD_HI (WORD_A << 32 | WORD_B)
12 #define DWORD_LO (WORD_C << 32 | WORD_D)
13
14 #define TEST(HI, LO, UIM, RES) \
15 do { \
16 union { \
17 uint64_t u; \
18 double f; \
19 } h = { .u = HI }, l = { .u = LO }; \
20 /* \
21 * Use a pair of FPRs to load the VSR avoiding insns \
22 * newer than xxswapd. \
23 */ \
24 asm("xxmrghd 32, %0, %1\n\t" \
25 "xxspltw 32, 32, %2\n\t" \
26 "xxmrghd %0, 32, %0\n\t" \
27 "xxswapd 32, 32\n\t" \
28 "xxmrghd %1, 32, %1\n\t" \
29 : "+f" (h.f), "+f" (l.f) \
30 : "i" (UIM) \
31 : "v0"); \
32 printf("xxspltw(0x%016" PRIx64 "%016" PRIx64 ", %d) =" \
33 " %016" PRIx64 "%016" PRIx64 "\n", HI, LO, UIM, \
34 h.u, l.u); \
35 assert(h.u == (RES)); \
36 assert(l.u == (RES)); \
37 } while (0)
38
main(void)39 int main(void)
40 {
41 TEST(DWORD_HI, DWORD_LO, 0, WORD_A << 32 | WORD_A);
42 TEST(DWORD_HI, DWORD_LO, 1, WORD_B << 32 | WORD_B);
43 TEST(DWORD_HI, DWORD_LO, 2, WORD_C << 32 | WORD_C);
44 TEST(DWORD_HI, DWORD_LO, 3, WORD_D << 32 | WORD_D);
45 return 0;
46 }
47