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 } } */
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
;
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
[])
80 printf("%s %s\n", __DATE__
, __TIME__
);
84 printf("expected results from signed tests:\n");
85 for (i
= 0; i
< 4 ; i
++ ) {
86 PRINT_VEC(signed_expected
[i
]);
91 for (i
= 0; i
< 4 ; i
++ ) {
93 test_signed_store (store_this_s
[i
], 4*i
, vsbuffer
);
94 memcmpresult
= memcmp(rawbuffer
,&signed_expected
[i
],sizeof(vector
long long));
96 printf("mismatch signed buffer, i %d (memcmpresult:%d) \n",i
,memcmpresult
);
106 for (i
= 0; i
< 4 ; i
++ ) {
108 test_unsigned_store (store_this_us
[i
], 4*i
, vubuffer
);
109 memcmpresult
= memcmp(rawbuffer
,&unsigned_expected
[i
],sizeof(vector
long long));
111 printf("mismatch unsigned buffer, i %d (memcmpresult:%d) \n",i
,memcmpresult
);
122 printf("%d mismatches. \n",mismatch
);