]>
Commit | Line | Data |
---|---|---|
6231646a AK |
1 | /* This revealed a bug when rotates are expanded into |
2 | two shifts. */ | |
3 | ||
4 | /* { dg-do run } */ | |
5 | /* { dg-options "-O1 -std=c99" } */ | |
6 | ||
fa484029 | 7 | extern void abort (void); |
6231646a | 8 | |
aca2b8da PB |
9 | #if __INT_MAX__ == 2147483647 |
10 | typedef unsigned int uint32_t; | |
11 | #elif __LONG_MAX__ == 2147483647 | |
12 | typedef unsigned long uint32_t; | |
13 | #else | |
14 | #error unable to find 32-bit integer type | |
15 | #endif | |
6231646a AK |
16 | |
17 | uint32_t | |
18 | f (uint32_t *S, int j) | |
19 | { | |
20 | uint32_t A, B, k, L[2] = {1234, 5678}; | |
21 | int i, m; | |
22 | ||
23 | A = B = 0; | |
24 | for (i = 0; i < j; i++) | |
25 | { | |
26 | k = (S[i] + A + B) & 0xffffffffL; | |
27 | A = S[i] = | |
28 | ((k << (3 & 0x1f)) | ((k & 0xffffffff) >> (32 - (3 & 0x1f)))); | |
29 | ||
30 | m = (int) (A + B); | |
31 | k = (L[i] + A + B) & 0xffffffffL; | |
32 | B = L[i] = | |
33 | ((k << (m & 0x1f)) | ((k & 0xffffffff) >> (32 - (m & 0x1f)))); | |
34 | } | |
35 | return L[0] + L[1]; | |
36 | } | |
37 | ||
38 | int | |
39 | main () | |
40 | { | |
41 | uint32_t S[2] = {0xffff, 0xffffff}; | |
42 | ||
43 | if (f (S,2)!= 1392607300) | |
44 | abort(); | |
45 | ||
46 | return 0; | |
47 | } |