aboutsummaryrefslogtreecommitdiff
path: root/tests/tcg/ppc64/vector.c
blob: cbf4ae933230d86987a30e3ccb33afc55ee1f4ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <assert.h>
#include <stdint.h>
#include "qemu/compiler.h"

int main(void)
{
    unsigned int result_wi;
    vector unsigned char vbc_bi_src = { 0xFF, 0xFF, 0, 0xFF, 0xFF, 0xFF,
                                        0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0,
                                        0, 0xFF, 0xFF};
    vector unsigned short vbc_hi_src = { 0xFFFF, 0, 0, 0xFFFF,
                                         0, 0, 0xFFFF, 0xFFFF};
    vector unsigned int vbc_wi_src = {0, 0, 0xFFFFFFFF, 0xFFFFFFFF};
    vector unsigned long long vbc_di_src = {0xFFFFFFFFFFFFFFFF, 0};
    vector __uint128_t vbc_qi_src;

    asm("vextractbm %0, %1" : "=r" (result_wi) : "v" (vbc_bi_src));
#if HOST_BIG_ENDIAN
    assert(result_wi == 0b1101111111000011);
#else
    assert(result_wi == 0b1100001111111011);
#endif

    asm("vextracthm %0, %1" : "=r" (result_wi) : "v" (vbc_hi_src));
#if HOST_BIG_ENDIAN
    assert(result_wi == 0b10010011);
#else
    assert(result_wi == 0b11001001);
#endif

    asm("vextractwm %0, %1" : "=r" (result_wi) : "v" (vbc_wi_src));
#if HOST_BIG_ENDIAN
    assert(result_wi == 0b0011);
#else
    assert(result_wi == 0b1100);
#endif

    asm("vextractdm %0, %1" : "=r" (result_wi) : "v" (vbc_di_src));
#if HOST_BIG_ENDIAN
    assert(result_wi == 0b10);
#else
    assert(result_wi == 0b01);
#endif

    vbc_qi_src[0] = 0x1;
    vbc_qi_src[0] = vbc_qi_src[0] << 127;
    asm("vextractqm %0, %1" : "=r" (result_wi) : "v" (vbc_qi_src));
    assert(result_wi == 0b1);

    return 0;
}