[RS6000] Tests that use int128_t and -m32
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vsx-store-element-truncate-longlong.c
blobc137ce2d19f680da18aea184c31c45de94df40bf
1 /*
2 Test of vec_xst_trunc (truncate and store rightmost vector element) */
4 /* { dg-do compile {target power10_ok} } */
5 /* { dg-do run {target power10_hw} } */
6 /* { dg-require-effective-target int128 } */
8 /* Deliberately set optization to zero for this test to confirm
9 the stxvr*x instruction is generated. At higher optimization levels
10 the instruction we are looking for is sometimes replaced by other
11 store instructions. */
12 /* { dg-options "-mdejagnu-cpu=power10 -O0" } */
14 /* { dg-final { scan-assembler-times {\mstxvrdx\M} 2 } } */
15 /* { dg-final { scan-assembler-times {\mstwx\M} 0 } } */
17 #include <altivec.h>
18 #include <stdio.h>
19 #include <inttypes.h>
20 #include <string.h>
21 #include <stdlib.h>
23 vector signed __int128 store_this_s[4] = {
24 { (__int128) 0x7000000000000000 << 64 | (__int128) 0x123456789abcdef8ULL},
25 { (__int128) 0x8000000000000000 << 64 | (__int128) 0xfedcba9876543217ULL},
26 { (__int128) 0x1000000000000000 << 64 | (__int128) 0xccccccccccccccccULL},
27 { (__int128) 0xf000000000000000 << 64 | (__int128) 0xaaaaaaaaaaaaaaaaULL}
30 vector unsigned __int128 store_this_us[4] = {
31 { (unsigned __int128) 0x7000000000000000 << 64 | (unsigned __int128) 0x123456789abcdef8ULL},
32 { (unsigned __int128) 0x8000000000000000 << 64 | (unsigned __int128) 0xfedcba9876543217ULL},
33 { (unsigned __int128) 0x1000000000000000 << 64 | (unsigned __int128) 0xeeeeeeeeeeeeeeeeULL},
34 { (unsigned __int128) 0xf000000000000000 << 64 | (unsigned __int128) 0x5555555555555555ULL}
37 #define NUM_VEC_ELEMS 2
39 vector signed long long signed_expected[5] = {
40 { 0x123456789abcdef8, 0x0},
41 { 0x7654321700000000, 0xfedcba98},
42 { 0x0000000000000000, 0xcccccccccccccccc},
43 { 0x0000000000000000, 0xaaaaaaaa00000000} /*note that some data written into the next word */
45 vector unsigned long long unsigned_expected[5] = {
46 { 0x123456789abcdef8, 0x0},
47 { 0x7654321700000000, 0xfedcba98},
48 { 0x0000000000000000, 0xeeeeeeeeeeeeeeee},
49 { 0x0000000000000000, 0x5555555500000000}
52 unsigned long long rawbuffer[32];
53 signed long long * vsbuffer = (long long *)rawbuffer;
54 unsigned long long * vubuffer = (unsigned long long *)rawbuffer;
56 void reset_buffer() {
57 memset (&rawbuffer,0,sizeof(rawbuffer));
60 #define PRINT_VEC(V) \
61 for (int j=0;j<NUM_VEC_ELEMS;j++) { printf ("(0x%lx) ", V[j] ); }
63 void test_signed_store(vector signed __int128 myvec, int offset, signed long long * store_data ) {
64 vec_xst_trunc (myvec, offset, store_data);
67 void test_unsigned_store(vector unsigned __int128 myvec, int offset, unsigned long long * store_data ) {
68 vec_xst_trunc (myvec, offset, store_data);
71 int main (int argc, char *argv [])
73 int i;
74 int memcmpresult;
75 int mismatch=0;
76 int verbose=0;
78 #if VERBOSE
79 verbose=1;
80 printf("%s %s\n", __DATE__, __TIME__);
81 #endif
83 if (verbose) {
84 printf("expected results from signed tests:\n");
85 for (i = 0; i < 4 ; i++ ) {
86 PRINT_VEC(signed_expected[i]);
87 printf("\n");
91 for (i = 0; i < 4 ; i++ ) {
92 reset_buffer();
93 test_signed_store (store_this_s[i], 4*i, vsbuffer);
94 memcmpresult = memcmp(rawbuffer,&signed_expected[i],sizeof(vector long long));
95 if (memcmpresult) {
96 printf("mismatch signed buffer, i %d (memcmpresult:%d) \n",i,memcmpresult);
97 mismatch++;
98 if (verbose) {
99 printf("results: ");
100 PRINT_VEC(vsbuffer);
101 printf("\n");
106 for (i = 0; i < 4 ; i++ ) {
107 reset_buffer();
108 test_unsigned_store (store_this_us[i], 4*i, vubuffer);
109 memcmpresult = memcmp(rawbuffer,&unsigned_expected[i],sizeof(vector long long));
110 if (memcmpresult) {
111 printf("mismatch unsigned buffer, i %d (memcmpresult:%d) \n",i,memcmpresult);
112 mismatch++;
113 if (verbose) {
114 printf("results :");
115 PRINT_VEC(vubuffer);
116 printf("\n");
121 if (mismatch) {
122 printf("%d mismatches. \n",mismatch);
123 abort();
125 return 0;