]>
Commit | Line | Data |
---|---|---|
152834fe HJ |
1 | /* { dg-do run { target { ! ia32 } } } */ |
2 | /* { dg-options "-O2 -mcmpccxadd" } */ | |
3 | /* { dg-require-effective-target cmpccxadd } */ | |
4 | ||
5 | #include <stdlib.h> | |
6 | #include <x86gprintrin.h> | |
7 | ||
8 | int | |
9 | main() | |
10 | { | |
11 | if (!__builtin_cpu_supports("cmpccxadd")) | |
12 | return 0; | |
13 | ||
14 | int srcdest1[16] = { -2147483648,1,1,1,1,2,1,2,1,2,4,2,1,1,1,2 }; | |
15 | int srcdest2[16] = { 1,1,2,1,1,1,1,1,2,1,1,1,2,1,1,1 }; | |
16 | int src3[16] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; | |
17 | int _srcdest1[16], _srcdest2[16], res[16], cond[16]; | |
18 | long long srcdest1_64[16] = { -9223372036854775807LL-1,1,1,1,1,2,1,2,1,2,4,2,1,1,1,2 }; | |
19 | long long srcdest2_64[16] = { 1,1,2,1,1,1,1,1,2,1,1,1,2,1,1,1 }; | |
20 | long long src3_64[16] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; | |
21 | long long _srcdest1_64[16], _srcdest2_64[16], res_64[16], cond_64[16]; | |
22 | ||
23 | int tmp2[16]; | |
24 | long long tmp2_64[16]; | |
25 | ||
26 | int cf[16] = { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 }; | |
27 | int of[16] = { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; | |
28 | int sf[16] = { 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0 }; | |
29 | int zf[16] = { 0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0 }; | |
30 | int af[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; | |
31 | int pf[16] = { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 }; | |
32 | ||
33 | for (int i = 0; i < 16; i++) | |
34 | { | |
35 | tmp2[i] = srcdest1[i] + src3[i]; | |
36 | tmp2_64[i] = srcdest1_64[i] + src3_64[i]; | |
37 | } | |
38 | ||
39 | cond[0] = of[0] == 1 ? 1 : 0; | |
40 | cond[1] = of[1] == 0 ? 1 : 0; | |
41 | cond[2] = cf[2] == 1 ? 1 : 0; | |
42 | cond[3] = cf[3] == 0 ? 1 : 0; | |
43 | cond[4] = zf[4] == 1 ? 1 : 0; | |
44 | cond[5] = zf[5] == 0 ? 1 : 0; | |
45 | cond[6] = (cf[6] || zf[6]) == 1 ? 1 : 0; | |
46 | cond[7] = (cf[7] || zf[7]) == 0 ? 1 : 0; | |
47 | cond[8] = sf[8] == 1 ? 1 : 0; | |
48 | cond[9] = sf[9] == 0 ? 1 : 0; | |
49 | cond[10] = pf[10] == 1 ? 1 : 0; | |
50 | cond[11] = pf[11] == 0 ? 1 : 0; | |
51 | cond[12] = ((sf[12] && !of[12]) || (!sf[12] && of[12])) == 1 ? 1 : 0; | |
52 | cond[13] = ((sf[13] && !of[13]) || (!sf[13] && of[13])) == 0 ? 1 : 0; | |
53 | cond[14] = (((sf[14] && !of[14]) || (!sf[14] && of[14])) || zf[14]) == 1 ? 1 : 0; | |
54 | cond[15] = (((sf[15] && !of[15]) || (!sf[15] && of[15])) || zf[15]) == 0 ? 1 : 0; | |
55 | ||
56 | cond_64[0] = of[0] == 1 ? 1 : 0; | |
57 | cond_64[1] = of[1] == 0 ? 1 : 0; | |
58 | cond_64[2] = cf[2] == 1 ? 1 : 0; | |
59 | cond_64[3] = cf[3] == 0 ? 1 : 0; | |
60 | cond_64[4] = zf[4] == 1 ? 1 : 0; | |
61 | cond_64[5] = zf[5] == 0 ? 1 : 0; | |
62 | cond_64[6] = (cf[6] || zf[6]) == 1 ? 1 : 0; | |
63 | cond_64[7] = (cf[7] || zf[7]) == 0 ? 1 : 0; | |
64 | cond_64[8] = sf[8] == 1 ? 1 : 0; | |
65 | cond_64[9] = sf[9] == 0 ? 1 : 0; | |
66 | cond_64[10] = pf[10] == 1 ? 1 : 0; | |
67 | cond_64[11] = pf[11] == 0 ? 1 : 0; | |
68 | cond_64[12] = ((sf[12] && !of[12]) || (!sf[12] && of[12])) == 1 ? 1 : 0; | |
69 | cond_64[13] = ((sf[13] && !of[13]) || (!sf[13] && of[13])) == 0 ? 1 : 0; | |
70 | cond_64[14] = (((sf[14] && !of[14]) || (!sf[14] && of[14])) || zf[14]) == 1 ? 1 : 0; | |
71 | cond_64[15] = (((sf[15] && !of[15]) || (!sf[15] && of[15])) || zf[15]) == 0 ? 1 : 0; | |
72 | ||
73 | for (int i = 0; i < 16; i++) | |
74 | { | |
75 | if (cond[i] == 1) | |
76 | { | |
77 | _srcdest1[i] = tmp2[i]; | |
78 | } | |
79 | else | |
80 | { | |
81 | _srcdest1[i] = srcdest1[i]; | |
82 | } | |
83 | if (cond_64[i] == 1) | |
84 | { | |
85 | _srcdest1_64[i] = tmp2_64[i]; | |
86 | } | |
87 | else | |
88 | { | |
89 | _srcdest1_64[i] = srcdest1_64[i]; | |
90 | } | |
91 | _srcdest2[i] = srcdest1[i]; | |
92 | _srcdest2_64[i] = srcdest1_64[i]; | |
93 | } | |
94 | ||
fb33e104 HJ |
95 | res[0] = _cmpccxadd_epi32 (&srcdest1[0], srcdest2[0], src3[0], _CMPCCX_O); |
96 | res[1] = _cmpccxadd_epi32 (&srcdest1[1], srcdest2[1], src3[1], _CMPCCX_NO); | |
97 | res[2] = _cmpccxadd_epi32 (&srcdest1[2], srcdest2[2], src3[2], _CMPCCX_B); | |
98 | res[3] = _cmpccxadd_epi32 (&srcdest1[3], srcdest2[3], src3[3], _CMPCCX_NB); | |
99 | res[4] = _cmpccxadd_epi32 (&srcdest1[4], srcdest2[4], src3[4], _CMPCCX_Z); | |
100 | res[5] = _cmpccxadd_epi32 (&srcdest1[5], srcdest2[5], src3[5], _CMPCCX_NZ); | |
101 | res[6] = _cmpccxadd_epi32 (&srcdest1[6], srcdest2[6], src3[6], _CMPCCX_BE); | |
102 | res[7] = _cmpccxadd_epi32 (&srcdest1[7], srcdest2[7], src3[7], _CMPCCX_NBE); | |
103 | res[8] = _cmpccxadd_epi32 (&srcdest1[8], srcdest2[8], src3[8], _CMPCCX_S); | |
104 | res[9] = _cmpccxadd_epi32 (&srcdest1[9], srcdest2[9], src3[9], _CMPCCX_NS); | |
105 | res[10] = _cmpccxadd_epi32 (&srcdest1[10], srcdest2[10], src3[10], _CMPCCX_P); | |
106 | res[11] = _cmpccxadd_epi32 (&srcdest1[11], srcdest2[11], src3[11], _CMPCCX_NP); | |
107 | res[12] = _cmpccxadd_epi32 (&srcdest1[12], srcdest2[12], src3[12], _CMPCCX_L); | |
108 | res[13] = _cmpccxadd_epi32 (&srcdest1[13], srcdest2[13], src3[13], _CMPCCX_NL); | |
109 | res[14] = _cmpccxadd_epi32 (&srcdest1[14], srcdest2[14], src3[14], _CMPCCX_LE); | |
110 | res[15] = _cmpccxadd_epi32 (&srcdest1[15], srcdest2[15], src3[15], _CMPCCX_NLE); | |
152834fe | 111 | |
fb33e104 HJ |
112 | res_64[0] = _cmpccxadd_epi64 (&srcdest1_64[0], srcdest2_64[0], src3_64[0], _CMPCCX_O); |
113 | res_64[1] = _cmpccxadd_epi64 (&srcdest1_64[1], srcdest2_64[1], src3_64[1], _CMPCCX_NO); | |
114 | res_64[2] = _cmpccxadd_epi64 (&srcdest1_64[2], srcdest2_64[2], src3_64[2], _CMPCCX_B); | |
115 | res_64[3] = _cmpccxadd_epi64 (&srcdest1_64[3], srcdest2_64[3], src3_64[3], _CMPCCX_NB); | |
116 | res_64[4] = _cmpccxadd_epi64 (&srcdest1_64[4], srcdest2_64[4], src3_64[4], _CMPCCX_Z); | |
117 | res_64[5] = _cmpccxadd_epi64 (&srcdest1_64[5], srcdest2_64[5], src3_64[5], _CMPCCX_NZ); | |
118 | res_64[6] = _cmpccxadd_epi64 (&srcdest1_64[6], srcdest2_64[6], src3_64[6], _CMPCCX_BE); | |
119 | res_64[7] = _cmpccxadd_epi64 (&srcdest1_64[7], srcdest2_64[7], src3_64[7], _CMPCCX_NBE); | |
120 | res_64[8] = _cmpccxadd_epi64 (&srcdest1_64[8], srcdest2_64[8], src3_64[8], _CMPCCX_S); | |
121 | res_64[9] = _cmpccxadd_epi64 (&srcdest1_64[9], srcdest2_64[9], src3_64[9], _CMPCCX_NS); | |
122 | res_64[10] = _cmpccxadd_epi64 (&srcdest1_64[10], srcdest2_64[10], src3_64[10], _CMPCCX_P); | |
123 | res_64[11] = _cmpccxadd_epi64 (&srcdest1_64[11], srcdest2_64[11], src3_64[11], _CMPCCX_NP); | |
124 | res_64[12] = _cmpccxadd_epi64 (&srcdest1_64[12], srcdest2_64[12], src3_64[12], _CMPCCX_L); | |
125 | res_64[13] = _cmpccxadd_epi64 (&srcdest1_64[13], srcdest2_64[13], src3_64[13], _CMPCCX_NL); | |
126 | res_64[14] = _cmpccxadd_epi64 (&srcdest1_64[14], srcdest2_64[14], src3_64[14], _CMPCCX_LE); | |
127 | res_64[15] = _cmpccxadd_epi64 (&srcdest1_64[15], srcdest2_64[15], src3_64[15], _CMPCCX_NLE); | |
152834fe HJ |
128 | |
129 | for (int i = 0; i < 16; i++) | |
130 | { | |
131 | if ((srcdest1[i] != _srcdest1[i]) || (res[i] != _srcdest2[i])) | |
132 | abort(); | |
133 | if ((srcdest1_64[i] != _srcdest1_64[i]) || (res_64[i] != _srcdest2_64[i])) | |
134 | abort(); | |
135 | } | |
136 | ||
137 | return 0; | |
138 | } |