Skip to content

Commit 6e62ede

Browse files
committed
testsuite, rs6000: Fix builtins-6-p9-runnable.c for BE [PR114744]
Test case builtins-6-p9-runnable.c doesn't work well on BE due to two problems: - When applying vec_xl_len onto data_128 and data_u128 with length 8, it expects to load 1280000[01] from the memory, but unfortunately assigning 1280000[01] to a {vector} {u,}int128 type variable, the value isn't guaranteed to be at the beginning of storage (in the low part of memory), which means the loaded value can be unexpected (as shown on BE). So this patch is to introduce getU128 which can ensure the given value shows up as expected and also update some dumping code for debugging. - When applying vec_xl_len_r with length 16, on BE it's just like the normal vector load, so the expected data should not be reversed from the original. PR testsuite/114744 gcc/testsuite/ChangeLog: * gcc.target/powerpc/builtins-6-p9-runnable.c: Adjust for BE by fixing data_{u,}128, their uses and vec_uc_expected1, also adjust some formats.
1 parent 58a0b19 commit 6e62ede

File tree

1 file changed

+64
-55
lines changed

1 file changed

+64
-55
lines changed

gcc/testsuite/gcc.target/powerpc/builtins-6-p9-runnable.c

Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,30 @@ void print_f (vector float vec_expected,
337337
}
338338
#endif
339339

340+
typedef union
341+
{
342+
vector __int128_t i1;
343+
__int128_t i2;
344+
vector __uint128_t u1;
345+
__uint128_t u2;
346+
struct
347+
{
348+
long long d1;
349+
long long d2;
350+
};
351+
} U128;
352+
353+
/* For a given long long VALUE, ensure it's stored from the beginning
354+
of {u,}int128 memory storage (the low address), it avoids to load
355+
unexpected data without the whole vector length. */
356+
357+
static inline void
358+
getU128 (U128 *pu, unsigned long long value)
359+
{
360+
pu->d1 = value;
361+
pu->d2 = 0;
362+
}
363+
340364
int main() {
341365
int i, j;
342366
size_t len;
@@ -835,21 +859,24 @@ int main() {
835859
#endif
836860
}
837861

862+
U128 u_temp;
838863
/* vec_xl_len() tests */
839864
for (i = 0; i < 100; i++)
840865
{
841-
data_c[i] = i;
842-
data_uc[i] = i+1;
843-
data_ssi[i] = i+10;
844-
data_usi[i] = i+11;
845-
data_si[i] = i+100;
846-
data_ui[i] = i+101;
847-
data_sll[i] = i+1000;
848-
data_ull[i] = i+1001;
849-
data_f[i] = i+100000.0;
850-
data_d[i] = i+1000000.0;
851-
data_128[i] = i + 12800000;
852-
data_u128[i] = i + 12800001;
866+
data_c[i] = i;
867+
data_uc[i] = i + 1;
868+
data_ssi[i] = i + 10;
869+
data_usi[i] = i + 11;
870+
data_si[i] = i + 100;
871+
data_ui[i] = i + 101;
872+
data_sll[i] = i + 1000;
873+
data_ull[i] = i + 1001;
874+
data_f[i] = i + 100000.0;
875+
data_d[i] = i + 1000000.0;
876+
getU128 (&u_temp, i + 12800000);
877+
data_128[i] = u_temp.i2;
878+
getU128 (&u_temp, i + 12800001);
879+
data_u128[i] = u_temp.u2;
853880
}
854881

855882
len = 16;
@@ -1160,34 +1187,38 @@ int main() {
11601187
#endif
11611188
}
11621189

1163-
vec_s128_expected1 = (vector __int128_t){12800000};
1190+
getU128 (&u_temp, 12800000);
1191+
vec_s128_expected1 = u_temp.i1;
11641192
vec_s128_result1 = vec_xl_len (data_128, len);
11651193

11661194
if (vec_s128_expected1[0] != vec_s128_result1[0])
11671195
{
11681196
#ifdef DEBUG
1169-
printf("Error: vec_xl_len(), len = %d, vec_s128_result1[0] = %lld %llu; ",
1170-
len, vec_s128_result1[0] >> 64,
1171-
vec_s128_result1[0] & (__int128_t)0xFFFFFFFFFFFFFFFF);
1172-
printf("vec_s128_expected1[0] = %lld %llu\n",
1173-
vec_s128_expected1[0] >> 64,
1174-
vec_s128_expected1[0] & (__int128_t)0xFFFFFFFFFFFFFFFF);
1197+
U128 u1, u2;
1198+
u1.i1 = vec_s128_result1;
1199+
u2.i1 = vec_s128_expected1;
1200+
printf ("Error: vec_xl_len(), len = %d,"
1201+
"vec_s128_result1[0] = %llx %llx; ",
1202+
len, u1.d1, u1.d2);
1203+
printf ("vec_s128_expected1[0] = %llx %llx\n", u2.d1, u2.d2);
11751204
#else
11761205
abort ();
11771206
#endif
11781207
}
11791208

11801209
vec_u128_result1 = vec_xl_len (data_u128, len);
1181-
vec_u128_expected1 = (vector __uint128_t){12800001};
1210+
getU128 (&u_temp, 12800001);
1211+
vec_u128_expected1 = u_temp.u1;
11821212
if (vec_u128_expected1[0] != vec_u128_result1[0])
11831213
#ifdef DEBUG
11841214
{
1185-
printf("Error: vec_xl_len(), len = %d, vec_u128_result1[0] = %lld; ",
1186-
len, vec_u128_result1[0] >> 64,
1187-
vec_u128_result1[0] & (__int128_t)0xFFFFFFFFFFFFFFFF);
1188-
printf("vec_u128_expected1[0] = %lld\n",
1189-
vec_u128_expected1[0] >> 64,
1190-
vec_u128_expected1[0] & (__int128_t)0xFFFFFFFFFFFFFFFF);
1215+
U128 u1, u2;
1216+
u1.u1 = vec_u128_result1;
1217+
u2.u1 = vec_u128_expected1;
1218+
printf ("Error: vec_xl_len(), len = %d,"
1219+
"vec_u128_result1[0] = %llx %llx; ",
1220+
len, u1.d1, u1.d2);
1221+
printf ("vec_u128_expected1[0] = %llx %llx\n", u2.d1, u2.d2);
11911222
}
11921223
#else
11931224
abort ();
@@ -1421,8 +1452,13 @@ int main() {
14211452
and post data initialization is done. */
14221453

14231454
len = 16;
1424-
vec_uc_expected1 = (vector unsigned char){ 16,15, 14, 13, 12, 11, 10, 9,
1425-
8, 7, 6, 5, 4, 3, 2, 1 };
1455+
#if __LITTLE_ENDIAN__
1456+
vec_uc_expected1 = (vector unsigned char){16, 15, 14, 13, 12, 11, 10, 9,
1457+
8, 7, 6, 5, 4, 3, 2, 1};
1458+
#else
1459+
vec_uc_expected1 = (vector unsigned char){1, 2, 3, 4, 5, 6, 7, 8,
1460+
9, 10, 11, 12, 13, 14, 15, 16};
1461+
#endif
14261462
input_uc = (vector unsigned char){ 1, 2, 3, 4, 5, 6, 7, 8, 9,
14271463
10, 11, 12, 13, 14, 15, 16 };
14281464
vec_uc_result1 = vec_xl_len_r (&input_uc[0], len);
@@ -1441,30 +1477,3 @@ int main() {
14411477
}
14421478

14431479
}
1444-
1445-
1446-
1447-
1448-
1449-
1450-
1451-
1452-
1453-
1454-
1455-
1456-
1457-
1458-
1459-
1460-
1461-
1462-
1463-
1464-
1465-
1466-
1467-
1468-
1469-
1470-

0 commit comments

Comments
 (0)