1 /* { dg-do run } */
2 /* { dg-options "-O2 --save-temps -fno-inline" } */
3
4 extern void abort (void);
5
6 int
tst_si_test1(int a,int b,int c)7 tst_si_test1 (int a, int b, int c)
8 {
9 int d = a & b;
10
11 /* { dg-final { scan-assembler-times "tst\tw\[0-9\]+, w\[0-9\]+" 2 } } */
12 if (d == 0)
13 return 12;
14 else
15 return 18;
16 }
17
18 int
tst_si_test2(int a,int b,int c)19 tst_si_test2 (int a, int b, int c)
20 {
21 int d = a & 0x99999999;
22
23 /* { dg-final { scan-assembler "tst\tw\[0-9\]+, -1717986919" } } */
24 if (d == 0)
25 return 12;
26 else
27 return 18;
28 }
29
30 int
tst_si_test3(int a,int b,int c)31 tst_si_test3 (int a, int b, int c)
32 {
33 int d = a & (b << 3);
34
35 /* { dg-final { scan-assembler "tst\tw\[0-9\]+, w\[0-9\]+, lsl 3" } } */
36 if (d == 0)
37 return 12;
38 else
39 return 18;
40 }
41
42 typedef long long s64;
43
44 s64
tst_di_test1(s64 a,s64 b,s64 c)45 tst_di_test1 (s64 a, s64 b, s64 c)
46 {
47 s64 d = a & b;
48
49 /* { dg-final { scan-assembler-times "tst\tx\[0-9\]+, x\[0-9\]+" 2 } } */
50 if (d == 0)
51 return 12;
52 else
53 return 18;
54 }
55
56 s64
tst_di_test2(s64 a,s64 b,s64 c)57 tst_di_test2 (s64 a, s64 b, s64 c)
58 {
59 s64 d = a & 0xaaaaaaaaaaaaaaaall;
60
61 /* { dg-final { scan-assembler "tst\tx\[0-9\]+, -6148914691236517206" } } */
62 if (d == 0)
63 return 12;
64 else
65 return 18;
66 }
67
68 s64
tst_di_test3(s64 a,s64 b,s64 c)69 tst_di_test3 (s64 a, s64 b, s64 c)
70 {
71 s64 d = a & (b << 3);
72
73 /* { dg-final { scan-assembler "tst\tx\[0-9\]+, x\[0-9\]+, lsl 3" } } */
74 if (d == 0)
75 return 12;
76 else
77 return 18;
78 }
79
80 int
main()81 main ()
82 {
83 int x;
84 s64 y;
85
86 x = tst_si_test1 (29, 4, 5);
87 if (x != 18)
88 abort ();
89
90 x = tst_si_test1 (5, 2, 20);
91 if (x != 12)
92 abort ();
93
94 x = tst_si_test2 (29, 4, 5);
95 if (x != 18)
96 abort ();
97
98 x = tst_si_test2 (1024, 2, 20);
99 if (x != 12)
100 abort ();
101
102 x = tst_si_test3 (35, 4, 5);
103 if (x != 18)
104 abort ();
105
106 x = tst_si_test3 (5, 2, 20);
107 if (x != 12)
108 abort ();
109
110 y = tst_di_test1 (0x130000029ll,
111 0x320000004ll,
112 0x505050505ll);
113
114 if (y != 18)
115 abort ();
116
117 y = tst_di_test1 (0x5000500050005ll,
118 0x2111211121112ll,
119 0x0000000002020ll);
120 if (y != 12)
121 abort ();
122
123 y = tst_di_test2 (0x130000029ll,
124 0x320000004ll,
125 0x505050505ll);
126 if (y != 18)
127 abort ();
128
129 y = tst_di_test2 (0x540004100ll,
130 0x320000004ll,
131 0x805050205ll);
132 if (y != 12)
133 abort ();
134
135 y = tst_di_test3 (0x130000029ll,
136 0x064000008ll,
137 0x505050505ll);
138 if (y != 18)
139 abort ();
140
141 y = tst_di_test3 (0x130002900ll,
142 0x088000008ll,
143 0x505050505ll);
144 if (y != 12)
145 abort ();
146
147 return 0;
148 }
149
150