1 /* { dg-do run { target { power10_hw } } } */
2 /* { dg-do link { target { ! power10_hw } } } */
3 /* { dg-require-effective-target power10_ok } */
4 /* { dg-require-effective-target int128 } */
5 /* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
9 extern void abort (void);
13 /* vec_all_eq not yet supported for arguments of type
14 vector unsigned __int128. */
16 vector_equal (vector
unsigned __int128 a
, vector
unsigned __int128 b
)
22 doTests00000001 (vector
unsigned __int128 a_sources
[],
23 vector
unsigned __int128 b_sources
[],
24 vector
unsigned __int128 c_sources
[]) {
25 for (int i
= 0; i
< NumSamples
; i
++)
26 for (int j
= 0; j
< NumSamples
; j
++)
27 for (int k
= 0; k
< NumSamples
; k
++)
29 vector
unsigned __int128 a
= a_sources
[i
];
30 vector
unsigned __int128 b
= b_sources
[j
];
31 vector
unsigned __int128 c
= c_sources
[k
];
32 vector
unsigned __int128 result
= vec_ternarylogic (a
, b
, c
, 0x01);
33 vector
unsigned __int128 intended
= (a
& b
& c
);
34 if (!vector_equal (result
, intended
))
40 doTests11100101 (vector
unsigned __int128 a_sources
[],
41 vector
unsigned __int128 b_sources
[],
42 vector
unsigned __int128 c_sources
[]) {
43 for (int i
= 0; i
< NumSamples
; i
++)
44 for (int j
= 0; j
< NumSamples
; j
++)
45 for (int k
= 0; k
< NumSamples
; k
++)
47 vector
unsigned __int128 a
= a_sources
[i
];
48 vector
unsigned __int128 b
= b_sources
[j
];
49 vector
unsigned __int128 c
= c_sources
[k
];
50 vector
unsigned __int128 result
= vec_ternarylogic (a
, b
, c
, 0xe5);
51 vector
unsigned __int128 intended
= { 0 };
52 // Supposed to be a ? c: nand (b,c)
53 for (int l
= 0; l
< 1; l
++)
55 for (int m
= 0; m
< 128; m
++)
57 unsigned __int128 bit_selector
= 0x01;
58 bit_selector
= bit_selector
<< m
;
60 if (a
[l
] & bit_selector
)
61 intended
[l
] |= c
[l
] & bit_selector
;
62 else if ((b
[l
] & c
[l
] & bit_selector
) == 0)
63 intended
[l
] |= bit_selector
;
66 if (!vector_equal (result
, intended
))
72 doTests11110011 (vector
unsigned __int128 a_sources
[],
73 vector
unsigned __int128 b_sources
[],
74 vector
unsigned __int128 c_sources
[]) {
75 for (int i
= 0; i
< NumSamples
; i
++)
76 for (int j
= 0; j
< NumSamples
; j
++)
77 for (int k
= 0; k
< NumSamples
; k
++)
79 vector
unsigned __int128 a
= a_sources
[i
];
80 vector
unsigned __int128 b
= b_sources
[j
];
81 vector
unsigned __int128 c
= c_sources
[k
];
82 vector
unsigned __int128 result
= vec_ternarylogic (a
, b
, c
, 0xfb);
83 vector
unsigned __int128 intended
= { 0 };
84 for (int i
= 0; i
< 1; i
++)
85 intended
[i
] = b
[i
] | ~(a
[i
] & c
[i
]);
86 if (!vector_equal (result
, intended
))
91 int main (int argc
, int *argv
[])
93 vector
unsigned __int128 a_sources
[NumSamples
];
94 vector
unsigned __int128 b_sources
[NumSamples
];
95 vector
unsigned __int128 c_sources
[NumSamples
];
97 a_sources
[0][0] = 0x0123456789abcdefull
;
98 a_sources
[0][0] = a_sources
[0][0] << 64 | 0x123456789abcdef0ull
;
99 a_sources
[1][0] = 0x5555555555555555ull
;
100 a_sources
[1][0] = a_sources
[1][0] << 64 | 0xffffffffffffffffull
;
101 a_sources
[2][0] = 0xcccccccc55555555ull
;
102 a_sources
[2][0] = a_sources
[2][0] << 64 | 0x0000000000000000ull
;
103 a_sources
[3][0] = 0xe7e7e7e7e7e7e7e7ull
;
104 a_sources
[3][0] = a_sources
[3][0] << 64 | 0x6969696969696969ull
;
106 b_sources
[0][0] = 0x0123456789abcdefull
;
107 b_sources
[0][0] = b_sources
[0][0] << 64 | 0x123456789abcdef0ull
;
108 b_sources
[1][0] = 0x5555555555555555ull
;
109 b_sources
[1][0] = b_sources
[1][0] << 64 | 0xffffffffffffffffull
;
110 b_sources
[2][0] = 0xcccccccc55555555ull
;
111 b_sources
[2][0] = b_sources
[2][0] << 64 | 0x0000000000000000ull
;
112 b_sources
[3][0] = 0xe7e7e7e7e7e7e7e7ull
;
113 b_sources
[3][0] = b_sources
[3][0] << 64 | 0x6969696969696969ull
;
115 c_sources
[0][0] = 0x0123456789abcdefull
;
116 c_sources
[0][0] = c_sources
[0][0] << 64 | 0x123456789abcdef0ull
;
117 c_sources
[1][0] = 0x5555555555555555ull
;
118 c_sources
[1][0] = c_sources
[1][0] << 64 | 0xffffffffffffffffull
;
119 c_sources
[2][0] = 0xcccccccc55555555ull
;
120 c_sources
[2][0] = c_sources
[2][0] << 64 | 0x0000000000000000ull
;
121 c_sources
[3][0] = 0xe7e7e7e7e7e7e7e7ull
;
122 c_sources
[3][0] = c_sources
[3][0] << 64 | 0x6969696969696969ull
;
124 doTests00000001 (a_sources
, b_sources
, c_sources
);
125 doTests11100101 (a_sources
, b_sources
, c_sources
);
126 doTests11110011 (a_sources
, b_sources
, c_sources
);
131 /* { dg-final { scan-assembler {\mxxeval\M} } } */