xref: /qemu/tests/tcg/ppc64/vector.c (revision 83ecdb18)
1 #include <assert.h>
2 #include <stdint.h>
3 #include "qemu/compiler.h"
4 
5 int main(void)
6 {
7     unsigned int result_wi;
8     vector unsigned char vbc_bi_src = { 0xFF, 0xFF, 0, 0xFF, 0xFF, 0xFF,
9                                         0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0,
10                                         0, 0xFF, 0xFF};
11     vector unsigned short vbc_hi_src = { 0xFFFF, 0, 0, 0xFFFF,
12                                          0, 0, 0xFFFF, 0xFFFF};
13     vector unsigned int vbc_wi_src = {0, 0, 0xFFFFFFFF, 0xFFFFFFFF};
14     vector unsigned long long vbc_di_src = {0xFFFFFFFFFFFFFFFF, 0};
15     vector __uint128_t vbc_qi_src;
16 
17     asm("vextractbm %0, %1" : "=r" (result_wi) : "v" (vbc_bi_src));
18 #if HOST_BIG_ENDIAN
19     assert(result_wi == 0b1101111111000011);
20 #else
21     assert(result_wi == 0b1100001111111011);
22 #endif
23 
24     asm("vextracthm %0, %1" : "=r" (result_wi) : "v" (vbc_hi_src));
25 #if HOST_BIG_ENDIAN
26     assert(result_wi == 0b10010011);
27 #else
28     assert(result_wi == 0b11001001);
29 #endif
30 
31     asm("vextractwm %0, %1" : "=r" (result_wi) : "v" (vbc_wi_src));
32 #if HOST_BIG_ENDIAN
33     assert(result_wi == 0b0011);
34 #else
35     assert(result_wi == 0b1100);
36 #endif
37 
38     asm("vextractdm %0, %1" : "=r" (result_wi) : "v" (vbc_di_src));
39 #if HOST_BIG_ENDIAN
40     assert(result_wi == 0b10);
41 #else
42     assert(result_wi == 0b01);
43 #endif
44 
45     vbc_qi_src[0] = 0x1;
46     vbc_qi_src[0] = vbc_qi_src[0] << 127;
47     asm("vextractqm %0, %1" : "=r" (result_wi) : "v" (vbc_qi_src));
48     assert(result_wi == 0b1);
49 
50     return 0;
51 }
52