annotate gcc/testsuite/gcc.c-torture/execute/pr89369.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR target/89369 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8 && __CHAR_BIT__ == 8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 struct S { unsigned int u[4]; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 foo (struct S *out, struct S const *in, int shift)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 unsigned long long th, tl, oh, ol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 th = ((unsigned long long) in->u[3] << 32) | in->u[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 tl = ((unsigned long long) in->u[1] << 32) | in->u[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 oh = th >> (shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 ol = tl >> (shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 ol |= th << (64 - shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 out->u[1] = ol >> 32;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 out->u[0] = ol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 out->u[3] = oh >> 32;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 out->u[2] = oh;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 bar (struct S *out, struct S const *in, int shift)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 unsigned long long th, tl, oh, ol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 th = ((unsigned long long) in->u[3] << 32) | in->u[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 tl = ((unsigned long long) in->u[1] << 32) | in->u[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 oh = th << (shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 ol = tl << (shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 oh |= tl >> (64 - shift * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 out->u[1] = ol >> 32;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 out->u[0] = ol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 out->u[3] = oh >> 32;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 out->u[2] = oh;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 __attribute__((noipa)) static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 baz (struct S *r, struct S *a, struct S *b, struct S *c, struct S *d)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 struct S x, y;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 bar (&x, a, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 foo (&y, c, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> 11) & 0xdfffffefU) ^ y.u[0] ^ (d->u[0] << 18);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> 11) & 0xddfecb7fU) ^ y.u[1] ^ (d->u[1] << 18);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> 11) & 0xbffaffffU) ^ y.u[2] ^ (d->u[2] << 18);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> 11) & 0xbffffff6U) ^ y.u[3] ^ (d->u[3] << 18);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 main ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 struct S a[] = { { 0x000004d3, 0xbc5448db, 0xf22bde9f, 0xebb44f8f },
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 { 0x03a32799, 0x60be8246, 0xa2d266ed, 0x7aa18536 },
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 { 0x15a38518, 0xcf655ce1, 0xf3e09994, 0x50ef69fe },
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 { 0x88274b07, 0xe7c94866, 0xc0ea9f47, 0xb6a83c43 },
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 { 0xcd0d0032, 0x5d47f5d7, 0x5a0afbf6, 0xaea87b24 },
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 { 0, 0, 0, 0 } };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 baz (&a[5], &a[0], &a[1], &a[2], &a[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 if (a[4].u[0] != a[5].u[0] || a[4].u[1] != a[5].u[1]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 || a[4].u[2] != a[5].u[2] || a[4].u[3] != a[5].u[3])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 __builtin_abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 main ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 #endif