blob: 1c81e496eace35ee93a65ee9e42b365173f1c27f [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2012 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Flags: --allow-natives-syntax --expose-gc
29
30// Test shift operations that can be replaced by rotate operation.
31
32function SideEffect() {
33 with ({}) { } // not inlinable
34}
35
36function Twenty() {
37 SideEffect();
38 return 20;
39}
40
41function Twelve() {
42 SideEffect();
43 return 12;
44}
45
46
47function ROR(x, sa) {
48 return (x >>> sa) | (x << (32 - sa));
49}
50
51function ROR1(x, sa) {
52 return (x >>> sa) | (x << (32 - sa));
53}
54
55function ROR2(x, sa) {
56 return (x >>> (32 - sa)) | (x << (sa));
57}
58
59function ROR3(x, sa) {
60 return (x << (32 - sa)) | (x >>> sa);
61}
62
63function ROR4(x, sa) {
64 return (x << (sa)) | (x >>> (32 - sa));
65}
66
67assertEquals(1 << ((2 % 32)), ROR(1, 30));
68assertEquals(1 << ((2 % 32)), ROR(1, 30));
69%OptimizeFunctionOnNextCall(ROR);
70assertEquals(1 << ((2 % 32)), ROR(1, 30));
71
72assertEquals(0xF0000FFF | 0, ROR1(0x0000FFFF, 4));
73assertEquals(0xF0000FFF | 0, ROR1(0x0000FFFF, 4));
74%OptimizeFunctionOnNextCall(ROR1);
75assertEquals(0xF0000FFF | 0, ROR1(0x0000FFFF, 4));
76
77assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, 20));
78assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, 20));
79%OptimizeFunctionOnNextCall(ROR1);
80assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, 20));
81
82assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, Twenty()));
83assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, Twenty()));
84%OptimizeFunctionOnNextCall(ROR1);
85assertEquals(0x0FFFF000 | 0, ROR1(0x0000FFFF, Twenty()));
86
87for (var i = 0; i <= 100; i++) {
88 assertEquals(0xFFFFFFFF | 0, ROR1(0xFFFFFFFF, i));
89 assertEquals(0xFFFFFFFF | 0, ROR1(0xFFFFFFFF, i));
90 %OptimizeFunctionOnNextCall(ROR1);
91 assertEquals(0xFFFFFFFF | 0, ROR1(0xFFFFFFFF, i));
92}
93
94for (var i = 0; i <= 100; i++) {
95 assertEquals(-1, ROR1(-1, i));
96 assertEquals(-1, ROR1(-1, i));
97 %OptimizeFunctionOnNextCall(ROR1);
98 assertEquals(-1, ROR1(-1, i));
99}
100
101for (var i = 0; i <= 100; i++) {
102 assertEquals(1 << (32 - (i % 32)), ROR1(1, i));
103 assertEquals(1 << (32 - (i % 32)), ROR1(1, i));
104 %OptimizeFunctionOnNextCall(ROR1);
105 assertEquals(1 << (32 - (i % 32)), ROR1(1, i));
106}
107
108for (var i = 0; i <= 100; i++) {
109 assertEquals(1 << (32 - (i % 32)), ROR1(1.4, i));
110 assertEquals(1 << (32 - (i % 32)), ROR1(1.4, i));
111 %OptimizeFunctionOnNextCall(ROR1);
112 assertEquals(1 << (32 - (i % 32)), ROR1(1.4, i));
113}
114
115
116
117assertEquals(0xF0000FFF | 0, ROR2(0x0000FFFF, 28));
118assertEquals(0xF0000FFF | 0, ROR2(0x0000FFFF, 28));
119%OptimizeFunctionOnNextCall(ROR2);
120assertEquals(0xF0000FFF | 0, ROR2(0x0000FFFF, 28));
121
122assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, 12));
123assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, 12));
124%OptimizeFunctionOnNextCall(ROR2);
125assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, 12));
126
127assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, Twelve()));
128assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, Twelve()));
129%OptimizeFunctionOnNextCall(ROR2);
130assertEquals(0x0FFFF000 | 0, ROR2(0x0000FFFF, Twelve()));
131
132for (var i = 0; i <= 100; i++) {
133 assertEquals(0xFFFFFFFF | 0, ROR2(0xFFFFFFFF, i));
134 assertEquals(0xFFFFFFFF | 0, ROR2(0xFFFFFFFF, i));
135 %OptimizeFunctionOnNextCall(ROR2);
136 assertEquals(0xFFFFFFFF | 0, ROR2(0xFFFFFFFF, i));
137}
138
139for (var i = 0; i <= 100; i++) {
140 assertEquals(-1, ROR2(-1, i));
141 assertEquals(-1, ROR2(-1, i));
142 %OptimizeFunctionOnNextCall(ROR2);
143 assertEquals(-1, ROR2(-1, i));
144}
145
146for (var i = 0; i <= 100; i++) {
147 assertEquals(1 << ((i % 32)), ROR2(1, i));
148 assertEquals(1 << ((i % 32)), ROR2(1, i));
149 %OptimizeFunctionOnNextCall(ROR2);
150 assertEquals(1 << ((i % 32)), ROR2(1, i));
151}
152
153assertEquals(0xF0000FFF | 0, ROR3(0x0000FFFF, 4));
154assertEquals(0xF0000FFF | 0, ROR3(0x0000FFFF, 4));
155%OptimizeFunctionOnNextCall(ROR3);
156assertEquals(0xF0000FFF | 0, ROR3(0x0000FFFF, 4));
157
158assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, 20));
159assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, 20));
160%OptimizeFunctionOnNextCall(ROR3);
161assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, 20));
162
163assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, Twenty()));
164assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, Twenty()));
165%OptimizeFunctionOnNextCall(ROR3);
166assertEquals(0x0FFFF000 | 0, ROR3(0x0000FFFF, Twenty()));
167
168for (var i = 0; i <= 100; i++) {
169 assertEquals(0xFFFFFFFF | 0, ROR3(0xFFFFFFFF, i));
170 assertEquals(0xFFFFFFFF | 0, ROR3(0xFFFFFFFF, i));
171 %OptimizeFunctionOnNextCall(ROR3);
172 assertEquals(0xFFFFFFFF | 0, ROR3(0xFFFFFFFF, i));
173}
174
175for (var i = 0; i <= 100; i++) {
176 assertEquals(-1, ROR3(-1, i));
177 assertEquals(-1, ROR3(-1, i));
178 %OptimizeFunctionOnNextCall(ROR3);
179 assertEquals(-1, ROR3(-1, i));
180}
181
182for (var i = 0; i <= 100; i++) {
183 assertEquals(1 << (32 - (i % 32)), ROR3(1, i));
184 assertEquals(1 << (32 - (i % 32)), ROR3(1, i));
185 %OptimizeFunctionOnNextCall(ROR3);
186 assertEquals(1 << (32 - (i % 32)), ROR3(1, i));
187}
188
189assertEquals(0xF0000FFF | 0, ROR4(0x0000FFFF, 28));
190assertEquals(0xF0000FFF | 0, ROR4(0x0000FFFF, 28));
191%OptimizeFunctionOnNextCall(ROR4);
192assertEquals(0xF0000FFF | 0, ROR4(0x0000FFFF, 28));
193
194assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, 12));
195assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, 12));
196%OptimizeFunctionOnNextCall(ROR4);
197assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, 12));
198
199assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, Twelve()));
200assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, Twelve()));
201%OptimizeFunctionOnNextCall(ROR4);
202assertEquals(0x0FFFF000 | 0, ROR4(0x0000FFFF, Twelve()));
203
204for (var i = 0; i <= 100; i++) {
205 assertEquals(0xFFFFFFFF | 0, ROR4(0xFFFFFFFF, i));
206 assertEquals(0xFFFFFFFF | 0, ROR4(0xFFFFFFFF, i));
207 %OptimizeFunctionOnNextCall(ROR4);
208 assertEquals(0xFFFFFFFF | 0, ROR4(0xFFFFFFFF, i));
209}
210
211for (var i = 0; i <= 100; i++) {
212 assertEquals(-1, ROR4(-1, i));
213 assertEquals(-1, ROR4(-1, i));
214 %OptimizeFunctionOnNextCall(ROR4);
215 assertEquals(-1, ROR4(-1, i));
216}
217
218for (var i = 0; i <= 100; i++) {
219 assertEquals(1 << ((i % 32)), ROR4(1, i));
220 assertEquals(1 << ((i % 32)), ROR4(1, i));
221 %OptimizeFunctionOnNextCall(ROR4);
222 assertEquals(1 << ((i % 32)), ROR4(1, i));
223}
224
225//---------------------------------------------------------
226// add test cases for constant operand
227//---------------------------------------------------------
228// constant operand: 20
229function ROR1_sa20(x) {
230 return (x >>> 20) | (x << 12);
231}
232
233function ROR2_sa20(x) {
234 return (x >>> 12) | (x << 20);
235}
236
237function ROR3_sa20(x, sa) {
238 return (x << 12) | (x >>> 20);
239}
240
241function ROR4_sa20(x) {
242 return (x << 20) | (x >>> 12);
243}
244
245// constant operand: 40
246function ROR1_sa40(x) {
247 return (x >>> 40) | (x << -8);
248}
249
250function ROR2_sa40(x) {
251 return (x >>> -8) | (x << 40);
252}
253
254function ROR3_sa40(x, sa) {
255 return (x << -8) | (x >>> 40);
256}
257
258function ROR4_sa40(x) {
259 return (x << 40) | (x >>> -8);
260}
261
262// ROR1_sa20
263assertEquals(ROR1(0x0000FFFF, 20), ROR1_sa20(0x0000FFFF));
264assertEquals(ROR1(0x0000FFFF, 20), ROR1_sa20(0x0000FFFF));
265%OptimizeFunctionOnNextCall(ROR1_sa20);
266assertEquals(ROR1(0x0000FFFF, 20), ROR1_sa20(0x0000FFFF));
267
268// ROR1_sa40
269assertEquals(ROR1(0x0000FFFF, 40), ROR1_sa40(0x0000FFFF));
270assertEquals(ROR1(0x0000FFFF, 40), ROR1_sa40(0x0000FFFF));
271%OptimizeFunctionOnNextCall(ROR1_sa40);
272assertEquals(ROR1(0x0000FFFF, 40), ROR1_sa40(0x0000FFFF));
273
274// ROR2_sa20
275assertEquals(ROR2(0xFFFFFFFF, 20), ROR2_sa20(0xFFFFFFFF));
276assertEquals(ROR2(0xFFFFFFFF, 20), ROR2_sa20(0xFFFFFFFF));
277%OptimizeFunctionOnNextCall(ROR2_sa20);
278assertEquals(ROR2(0xFFFFFFFF, 20), ROR2_sa20(0xFFFFFFFF));
279
280// ROR2_sa40
281assertEquals(ROR2(0x0000FFFF, 40), ROR2_sa40(0x0000FFFF));
282assertEquals(ROR2(0x0000FFFF, 40), ROR2_sa40(0x0000FFFF));
283%OptimizeFunctionOnNextCall(ROR2_sa40);
284assertEquals(ROR2(0x0000FFFF, 40), ROR2_sa40(0x0000FFFF));
285
286// ROR3_sa20
287assertEquals(ROR3(0x0000FFFF, 20), ROR3_sa20(0x0000FFFF));
288assertEquals(ROR3(0x0000FFFF, 20), ROR3_sa20(0x0000FFFF));
289%OptimizeFunctionOnNextCall(ROR3_sa20);
290assertEquals(ROR3(0x0000FFFF, 20), ROR3_sa20(0x0000FFFF));
291
292// ROR3_sa40
293assertEquals(ROR3(0x0000FFFF, 40), ROR3_sa40(0x0000FFFF));
294assertEquals(ROR3(0x0000FFFF, 40), ROR3_sa40(0x0000FFFF));
295%OptimizeFunctionOnNextCall(ROR3_sa40);
296assertEquals(ROR3(0x0000FFFF, 40), ROR3_sa40(0x0000FFFF));
297
298// ROR4_sa20
299assertEquals(ROR4(0x0000FFFF, 20), ROR4_sa20(0x0000FFFF));
300assertEquals(ROR4(0x0000FFFF, 20), ROR4_sa20(0x0000FFFF));
301%OptimizeFunctionOnNextCall(ROR4_sa20);
302assertEquals(ROR4(0x0000FFFF, 20), ROR4_sa20(0x0000FFFF));
303
304// ROR4_sa40
305assertEquals(ROR4(0xFFFFFFFF, 40), ROR4_sa40(0xFFFFFFFF));
306assertEquals(ROR4(0xFFFFFFFF, 40), ROR4_sa40(0xFFFFFFFF));
307%OptimizeFunctionOnNextCall(ROR4_sa40);
308assertEquals(ROR4(0xFFFFFFFF, 40), ROR4_sa40(0xFFFFFFFF));