xref: /aosp_15_r20/art/test/567-checker-builder-intrinsics/src/TestRotate.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class TestRotate {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftByte(byte, int) builder (after)
20*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:b\d+>>  ParameterValue
21*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
23*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftByte(byte, int) builder (after)
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
27*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftByte(byte value, int distance)28*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftByte(byte value, int distance) {
29*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
30*795d594fSAndroid Build Coastguard Worker   }
31*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftByte(byte value, int distance)32*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftByte(byte value, int distance) {
33*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
34*795d594fSAndroid Build Coastguard Worker   }
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftShort(short, int) builder (after)
37*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:s\d+>>  ParameterValue
38*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftShort(short, int) builder (after)
43*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
44*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftShort(short value, int distance)45*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftShort(short value, int distance) {
46*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftShort(short value, int distance)49*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftShort(short value, int distance) {
50*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
51*795d594fSAndroid Build Coastguard Worker   }
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftChar(char, int) builder (after)
54*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:c\d+>>  ParameterValue
55*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
57*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftChar(char, int) builder (after)
60*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
61*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftChar(char value, int distance)62*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftChar(char value, int distance) {
63*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
64*795d594fSAndroid Build Coastguard Worker   }
65*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftChar(char value, int distance)66*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftChar(char value, int distance) {
67*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
68*795d594fSAndroid Build Coastguard Worker   }
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftInt(int, int) builder (after)
71*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
72*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftInt(int, int) builder (after)
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
78*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftInt(int value, int distance)79*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftInt(int value, int distance) {
80*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
81*795d594fSAndroid Build Coastguard Worker   }
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestRotate.$noinline$rotateLeftInt(int, int) instruction_simplifier_arm64 (after)
84*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
85*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
86*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<neg:i\d+>>     Neg [<<ArgDist>>]
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<neg>>]
88*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestRotate.$noinline$rotateLeftInt(int, int) disassembly (after)
91*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           neg {{w\d+}}, {{w\d+}}
92*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           ror {{w\d+}}, {{w\d+}}, {{w\d+}}
93*795d594fSAndroid Build Coastguard Worker 
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-RISCV64: int TestRotate.$noinline$rotateLeftInt(int, int) disassembly (after)
95*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           rolw {{a\d+}}, {{a\d+}}, {{a\d+}}
96*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftInt(int value, int distance)97*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftInt(int value, int distance) {
98*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
99*795d594fSAndroid Build Coastguard Worker   }
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestRotate.$noinline$rotateLeftIntMulNegDistance(int, int) scheduler (before)
102*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
103*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<neg:i\d+>>     Neg [<<ArgDist>>]
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ror:i\d+>>     Ror [<<ArgVal>>,<<neg>>]
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Mul [<<neg>>,<<ror>>]
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
108*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftIntMulNegDistance(int value, int distance)109*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftIntMulNegDistance(int value, int distance) {
110*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance) * -distance;
111*795d594fSAndroid Build Coastguard Worker   }
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$noinline$rotateLeftIntConstant(int) builder (after)
114*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>   ParameterValue
115*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<Constant:i\d+>> IntConstant 31
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>   Rol [<<ArgVal>>,<<Constant>>]
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Result>>]
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestRotate.$noinline$rotateLeftIntConstant(int) disassembly (after)
120*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           ror {{w\d+}}, {{w\d+}}, #1
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-RISCV64: int TestRotate.$noinline$rotateLeftIntConstant(int) disassembly (after)
123*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           roriw {{a\d+}}, {{a\d+}}, 1
124*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftIntConstant(int value)125*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftIntConstant(int value) {
126*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, 31);
127*795d594fSAndroid Build Coastguard Worker   }
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestRotate.$inline$rotateLeftLong(long, int) builder (after)
130*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:j\d+>>  ParameterValue
131*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:j\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestRotate.$inline$rotateLeftLong(long, int) builder (after)
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
137*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftLong(long value, int distance)138*795d594fSAndroid Build Coastguard Worker   private static long $inline$rotateLeftLong(long value, int distance) {
139*795d594fSAndroid Build Coastguard Worker     return Long.rotateLeft(value, distance);
140*795d594fSAndroid Build Coastguard Worker   }
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestRotate.$noinline$rotateLeftLong(long, int) instruction_simplifier_arm64 (after)
143*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:j\d+>>  ParameterValue
144*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<neg:i\d+>>     Neg [<<ArgDist>>]
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:j\d+>>  Ror [<<ArgVal>>,<<neg>>]
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
148*795d594fSAndroid Build Coastguard Worker 
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestRotate.$noinline$rotateLeftLong(long, int) disassembly (after)
150*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           neg {{w\d+}}, {{w\d+}}
151*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           ror {{x\d+}}, {{x\d+}}, {{x\d+}}
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-RISCV64: long TestRotate.$noinline$rotateLeftLong(long, int) disassembly (after)
154*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           rol {{a\d+}}, {{a\d+}}, {{a\d+}}
155*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftLong(long value, int distance)156*795d594fSAndroid Build Coastguard Worker   private static long $noinline$rotateLeftLong(long value, int distance) {
157*795d594fSAndroid Build Coastguard Worker     return Long.rotateLeft(value, distance);
158*795d594fSAndroid Build Coastguard Worker   }
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestRotate.$noinline$rotateLeftLongConstant(long) builder (after)
161*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:j\d+>>   ParameterValue
162*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<Constant:i\d+>> IntConstant 63
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:j\d+>>   Rol [<<ArgVal>>,<<Constant>>]
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Result>>]
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestRotate.$noinline$rotateLeftLongConstant(long) disassembly (after)
167*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           ror {{x\d+}}, {{x\d+}}, #1
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-RISCV64: long TestRotate.$noinline$rotateLeftLongConstant(long) disassembly (after)
170*795d594fSAndroid Build Coastguard Worker   /// CHECK:                           rori {{a\d+}}, {{a\d+}}, 1
171*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftLongConstant(long value)172*795d594fSAndroid Build Coastguard Worker   private static long $noinline$rotateLeftLongConstant(long value) {
173*795d594fSAndroid Build Coastguard Worker     return Long.rotateLeft(value, 63);
174*795d594fSAndroid Build Coastguard Worker   }
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightByte(byte, int) builder (after)
177*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:b\d+>>  ParameterValue
178*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
179*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
180*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
181*795d594fSAndroid Build Coastguard Worker 
182*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightByte(byte, int) builder (after)
183*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
184*795d594fSAndroid Build Coastguard Worker 
rotateRightByte(byte value, int distance)185*795d594fSAndroid Build Coastguard Worker   private static int rotateRightByte(byte value, int distance) {
186*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(value, distance);
187*795d594fSAndroid Build Coastguard Worker   }
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightShort(short, int) builder (after)
190*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:s\d+>>  ParameterValue
191*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
193*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
194*795d594fSAndroid Build Coastguard Worker 
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightShort(short, int) builder (after)
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
197*795d594fSAndroid Build Coastguard Worker 
rotateRightShort(short value, int distance)198*795d594fSAndroid Build Coastguard Worker   private static int rotateRightShort(short value, int distance) {
199*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(value, distance);
200*795d594fSAndroid Build Coastguard Worker   }
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightChar(char, int) builder (after)
203*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:c\d+>>  ParameterValue
204*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
205*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
206*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightChar(char, int) builder (after)
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
210*795d594fSAndroid Build Coastguard Worker 
rotateRightChar(char value, int distance)211*795d594fSAndroid Build Coastguard Worker   private static int rotateRightChar(char value, int distance) {
212*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(value, distance);
213*795d594fSAndroid Build Coastguard Worker   }
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightInt(int, int) builder (after)
216*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
217*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
220*795d594fSAndroid Build Coastguard Worker 
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightInt(int, int) builder (after)
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
223*795d594fSAndroid Build Coastguard Worker 
rotateRightInt(int value, int distance)224*795d594fSAndroid Build Coastguard Worker   private static int rotateRightInt(int value, int distance) {
225*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(value, distance);
226*795d594fSAndroid Build Coastguard Worker   }
227*795d594fSAndroid Build Coastguard Worker 
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestRotate.rotateRightLong(long, int) builder (after)
229*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:j\d+>>  ParameterValue
230*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:j\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
233*795d594fSAndroid Build Coastguard Worker 
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestRotate.rotateRightLong(long, int) builder (after)
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
236*795d594fSAndroid Build Coastguard Worker 
rotateRightLong(long value, int distance)237*795d594fSAndroid Build Coastguard Worker   private static long rotateRightLong(long value, int distance) {
238*795d594fSAndroid Build Coastguard Worker     return Long.rotateRight(value, distance);
239*795d594fSAndroid Build Coastguard Worker   }
240*795d594fSAndroid Build Coastguard Worker 
241*795d594fSAndroid Build Coastguard Worker 
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftIntWithByteDistance(int, byte) builder (after)
243*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
244*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:b\d+>> ParameterValue
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
247*795d594fSAndroid Build Coastguard Worker 
248*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftIntWithByteDistance(int, byte) builder (after)
249*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
250*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftIntWithByteDistance(int value, byte distance)251*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftIntWithByteDistance(int value, byte distance) {
252*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
253*795d594fSAndroid Build Coastguard Worker   }
254*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftIntWithByteDistance(int value, byte distance)255*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftIntWithByteDistance(int value, byte distance) {
256*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(value, distance);
257*795d594fSAndroid Build Coastguard Worker   }
258*795d594fSAndroid Build Coastguard Worker 
259*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightIntWithByteDistance(int, byte) builder (after)
260*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:i\d+>>  ParameterValue
261*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:b\d+>> ParameterValue
262*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
263*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
264*795d594fSAndroid Build Coastguard Worker 
265*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightIntWithByteDistance(int, byte) builder (after)
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
267*795d594fSAndroid Build Coastguard Worker 
rotateRightIntWithByteDistance(int value, byte distance)268*795d594fSAndroid Build Coastguard Worker   private static int rotateRightIntWithByteDistance(int value, byte distance) {
269*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(value, distance);
270*795d594fSAndroid Build Coastguard Worker   }
271*795d594fSAndroid Build Coastguard Worker 
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) builder (after)
273*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
274*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<One:i\d+>>     IntConstant 1
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<Val>>,<<ArgDist>>]
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
280*795d594fSAndroid Build Coastguard Worker 
281*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) builder (after)
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) select_generator (after)
285*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
286*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
287*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<One:i\d+>>     IntConstant 1
289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<SelVal:i\d+>>  Select [<<Zero>>,<<One>>,<<ArgVal>>]
290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<SelVal>>,<<ArgDist>>]
291*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
292*795d594fSAndroid Build Coastguard Worker 
293*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) select_generator (after)
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Phi
295*795d594fSAndroid Build Coastguard Worker 
296*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) instruction_simplifier$before_codegen (after)
297*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
298*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
299*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Rol [<<ArgVal>>,<<ArgDist>>]
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
301*795d594fSAndroid Build Coastguard Worker 
302*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.$inline$rotateLeftBoolean(boolean, int) instruction_simplifier$before_codegen (after)
303*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Select
304*795d594fSAndroid Build Coastguard Worker 
$inline$rotateLeftBoolean(boolean value, int distance)305*795d594fSAndroid Build Coastguard Worker   private static int $inline$rotateLeftBoolean(boolean value, int distance) {
306*795d594fSAndroid Build Coastguard Worker     // Note: D8 would replace the ternary expression `value ? 1 : 0` with `value`
307*795d594fSAndroid Build Coastguard Worker     // but explicit `if` is preserved.
308*795d594fSAndroid Build Coastguard Worker     int src;
309*795d594fSAndroid Build Coastguard Worker     if (value) {
310*795d594fSAndroid Build Coastguard Worker       src = 1;
311*795d594fSAndroid Build Coastguard Worker     } else {
312*795d594fSAndroid Build Coastguard Worker       src = 0;
313*795d594fSAndroid Build Coastguard Worker     }
314*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(src, distance);
315*795d594fSAndroid Build Coastguard Worker   }
316*795d594fSAndroid Build Coastguard Worker 
$noinline$rotateLeftBoolean(boolean value, int distance)317*795d594fSAndroid Build Coastguard Worker   private static int $noinline$rotateLeftBoolean(boolean value, int distance) {
318*795d594fSAndroid Build Coastguard Worker     // Note: D8 would replace the ternary expression `value ? 1 : 0` with `value`
319*795d594fSAndroid Build Coastguard Worker     // but explicit `if` is preserved.
320*795d594fSAndroid Build Coastguard Worker     int src;
321*795d594fSAndroid Build Coastguard Worker     if (value) {
322*795d594fSAndroid Build Coastguard Worker       src = 1;
323*795d594fSAndroid Build Coastguard Worker     } else {
324*795d594fSAndroid Build Coastguard Worker       src = 0;
325*795d594fSAndroid Build Coastguard Worker     }
326*795d594fSAndroid Build Coastguard Worker     return Integer.rotateLeft(src, distance);
327*795d594fSAndroid Build Coastguard Worker   }
328*795d594fSAndroid Build Coastguard Worker 
testRotateLeftBoolean()329*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftBoolean() {
330*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
331*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
332*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0, $inline$rotateLeftBoolean(false, i));
333*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $inline$rotateLeftBoolean(true, i));
334*795d594fSAndroid Build Coastguard Worker 
335*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0, $noinline$rotateLeftBoolean(false, i));
336*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $noinline$rotateLeftBoolean(true, i));
337*795d594fSAndroid Build Coastguard Worker     }
338*795d594fSAndroid Build Coastguard Worker   }
339*795d594fSAndroid Build Coastguard Worker 
testRotateLeftByte()340*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftByte() {
341*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftByte((byte)0x01, 0));
342*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $inline$rotateLeftByte((byte)0x01, 1));
343*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $inline$rotateLeftByte((byte)0x01, 31));
344*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftByte((byte)0x01, 32));  // overshoot
345*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFF03, $inline$rotateLeftByte((byte)0x81, 1));
346*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFE07, $inline$rotateLeftByte((byte)0x81, 2));
347*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000120, $inline$rotateLeftByte((byte)0x12, 4));
348*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF9AFF, $inline$rotateLeftByte((byte)0x9A, 8));
349*795d594fSAndroid Build Coastguard Worker 
350*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftByte((byte)0x01, 0));
351*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $noinline$rotateLeftByte((byte)0x01, 1));
352*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftByte((byte)0x01, 31));
353*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftByte((byte)0x01, 32));  // overshoot
354*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFF03, $noinline$rotateLeftByte((byte)0x81, 1));
355*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFE07, $noinline$rotateLeftByte((byte)0x81, 2));
356*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000120, $noinline$rotateLeftByte((byte)0x12, 4));
357*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF9AFF, $noinline$rotateLeftByte((byte)0x9A, 8));
358*795d594fSAndroid Build Coastguard Worker 
359*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
360*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
361*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $inline$rotateLeftByte((byte)0x0000, i));
362*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $inline$rotateLeftByte((byte)0xFFFF, i));
363*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $inline$rotateLeftByte((byte)0x0001, i));
364*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12 << j) | (0x12 >>> -j), $inline$rotateLeftByte((byte)0x12, i));
365*795d594fSAndroid Build Coastguard Worker 
366*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $noinline$rotateLeftByte((byte)0x0000, i));
367*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $noinline$rotateLeftByte((byte)0xFFFF, i));
368*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $noinline$rotateLeftByte((byte)0x0001, i));
369*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12 << j) | (0x12 >>> -j), $noinline$rotateLeftByte((byte)0x12, i));
370*795d594fSAndroid Build Coastguard Worker     }
371*795d594fSAndroid Build Coastguard Worker   }
372*795d594fSAndroid Build Coastguard Worker 
testRotateLeftShort()373*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftShort() {
374*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftShort((short)0x0001, 0));
375*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $inline$rotateLeftShort((short)0x0001, 1));
376*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $inline$rotateLeftShort((short)0x0001, 31));
377*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftShort((short)0x0001, 32));  // overshoot
378*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF0003, $inline$rotateLeftShort((short)0x8001, 1));
379*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFE0007, $inline$rotateLeftShort((short)0x8001, 2));
380*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00012340, $inline$rotateLeftShort((short)0x1234, 4));
381*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFF9ABCFF, $inline$rotateLeftShort((short)0x9ABC, 8));
382*795d594fSAndroid Build Coastguard Worker 
383*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftShort((short)0x0001, 0));
384*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $noinline$rotateLeftShort((short)0x0001, 1));
385*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftShort((short)0x0001, 31));
386*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftShort((short)0x0001, 32));  // overshoot
387*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF0003, $noinline$rotateLeftShort((short)0x8001, 1));
388*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFE0007, $noinline$rotateLeftShort((short)0x8001, 2));
389*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00012340, $noinline$rotateLeftShort((short)0x1234, 4));
390*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFF9ABCFF, $noinline$rotateLeftShort((short)0x9ABC, 8));
391*795d594fSAndroid Build Coastguard Worker 
392*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
393*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
394*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $inline$rotateLeftShort((short)0x0000, i));
395*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $inline$rotateLeftShort((short)0xFFFF, i));
396*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $inline$rotateLeftShort((short)0x0001, i));
397*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 << j) | (0x1234 >>> -j), $inline$rotateLeftShort((short)0x1234, i));
398*795d594fSAndroid Build Coastguard Worker 
399*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $noinline$rotateLeftShort((short)0x0000, i));
400*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $noinline$rotateLeftShort((short)0xFFFF, i));
401*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $noinline$rotateLeftShort((short)0x0001, i));
402*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 << j) | (0x1234 >>> -j), $noinline$rotateLeftShort((short)0x1234, i));
403*795d594fSAndroid Build Coastguard Worker     }
404*795d594fSAndroid Build Coastguard Worker   }
405*795d594fSAndroid Build Coastguard Worker 
testRotateLeftChar()406*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftChar() {
407*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftChar((char)0x0001, 0));
408*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $inline$rotateLeftChar((char)0x0001, 1));
409*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $inline$rotateLeftChar((char)0x0001, 31));
410*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftChar((char)0x0001, 32));  // overshoot
411*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00010002, $inline$rotateLeftChar((char)0x8001, 1));
412*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00020004, $inline$rotateLeftChar((char)0x8001, 2));
413*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00012340, $inline$rotateLeftChar((char)0x1234, 4));
414*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x009ABC00, $inline$rotateLeftChar((char)0x9ABC, 8));
415*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00FF0000, $inline$rotateLeftChar((char)0xFF00, 8));
416*795d594fSAndroid Build Coastguard Worker 
417*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftChar((char)0x0001, 0));
418*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $noinline$rotateLeftChar((char)0x0001, 1));
419*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftChar((char)0x0001, 31));
420*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftChar((char)0x0001, 32));  // overshoot
421*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00010002, $noinline$rotateLeftChar((char)0x8001, 1));
422*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00020004, $noinline$rotateLeftChar((char)0x8001, 2));
423*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00012340, $noinline$rotateLeftChar((char)0x1234, 4));
424*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x009ABC00, $noinline$rotateLeftChar((char)0x9ABC, 8));
425*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00FF0000, $noinline$rotateLeftChar((char)0xFF00, 8));
426*795d594fSAndroid Build Coastguard Worker 
427*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
428*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
429*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $inline$rotateLeftChar((char)0x0000, i));
430*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $inline$rotateLeftChar((char)0x0001, i));
431*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 << j) | (0x1234 >>> -j), $inline$rotateLeftChar((char)0x1234, i));
432*795d594fSAndroid Build Coastguard Worker 
433*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $noinline$rotateLeftChar((char)0x0000, i));
434*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((1 << j), $noinline$rotateLeftChar((char)0x0001, i));
435*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 << j) | (0x1234 >>> -j), $noinline$rotateLeftChar((char)0x1234, i));
436*795d594fSAndroid Build Coastguard Worker     }
437*795d594fSAndroid Build Coastguard Worker   }
438*795d594fSAndroid Build Coastguard Worker 
testRotateLeftInt()439*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftInt() {
440*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftInt(0x00000001, 0));
441*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $inline$rotateLeftInt(0x00000001, 1));
442*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $inline$rotateLeftInt(0x00000001, 31));
443*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftInt(0x00000001, 32));  // overshoot
444*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000003, $inline$rotateLeftInt(0x80000001, 1));
445*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000006, $inline$rotateLeftInt(0x80000001, 2));
446*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x23456781, $inline$rotateLeftInt(0x12345678, 4));
447*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBCDEF09A, $inline$rotateLeftInt(0x9ABCDEF0, 8));
448*795d594fSAndroid Build Coastguard Worker 
449*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftInt(0x00000001, 0));
450*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $noinline$rotateLeftInt(0x00000001, 1));
451*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftInt(0x00000001, 31));
452*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftInt(0x00000001, 32));  // overshoot
453*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000003, $noinline$rotateLeftInt(0x80000001, 1));
454*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000006, $noinline$rotateLeftInt(0x80000001, 2));
455*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x23456781, $noinline$rotateLeftInt(0x12345678, 4));
456*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBCDEF09A, $noinline$rotateLeftInt(0x9ABCDEF0, 8));
457*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftIntConstant(0x00000001));
458*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(Integer.MIN_VALUE, $noinline$rotateLeftIntMulNegDistance(1, -2));
459*795d594fSAndroid Build Coastguard Worker 
460*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
461*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
462*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $inline$rotateLeftInt(0x00000000, i));
463*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $inline$rotateLeftInt(0xFFFFFFFF, i));
464*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $inline$rotateLeftInt(0x00000001, i));
465*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 << j) | (0x12345678 >>> -j),
466*795d594fSAndroid Build Coastguard Worker                       $inline$rotateLeftInt(0x12345678, i));
467*795d594fSAndroid Build Coastguard Worker 
468*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $noinline$rotateLeftInt(0x00000000, i));
469*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $noinline$rotateLeftInt(0xFFFFFFFF, i));
470*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $noinline$rotateLeftInt(0x00000001, i));
471*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 << j) | (0x12345678 >>> -j),
472*795d594fSAndroid Build Coastguard Worker                       $noinline$rotateLeftInt(0x12345678, i));
473*795d594fSAndroid Build Coastguard Worker     }
474*795d594fSAndroid Build Coastguard Worker   }
475*795d594fSAndroid Build Coastguard Worker 
testRotateLeftLong()476*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftLong() {
477*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000001L, $inline$rotateLeftLong(0x0000000000000001L, 0));
478*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000002L, $inline$rotateLeftLong(0x0000000000000001L, 1));
479*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x8000000000000000L, $inline$rotateLeftLong(0x0000000000000001L, 63));
480*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x8000000000000000L, $noinline$rotateLeftLongConstant(0x0000000000000001L));
481*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000001L,
482*795d594fSAndroid Build Coastguard Worker                      $inline$rotateLeftLong(0x0000000000000001L, 64));  // overshoot
483*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000003L, $inline$rotateLeftLong(0x8000000000000001L, 1));
484*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000006L, $inline$rotateLeftLong(0x8000000000000001L, 2));
485*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x23456789ABCDEF01L, $inline$rotateLeftLong(0x123456789ABCDEF0L, 4));
486*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x3456789ABCDEF012L, $inline$rotateLeftLong(0x123456789ABCDEF0L, 8));
487*795d594fSAndroid Build Coastguard Worker 
488*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000001L, $noinline$rotateLeftLong(0x0000000000000001L, 0));
489*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000002L, $noinline$rotateLeftLong(0x0000000000000001L, 1));
490*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x8000000000000000L, $noinline$rotateLeftLong(0x0000000000000001L, 63));
491*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000001L,
492*795d594fSAndroid Build Coastguard Worker                      $noinline$rotateLeftLong(0x0000000000000001L, 64));  // overshoot
493*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000003L, $noinline$rotateLeftLong(0x8000000000000001L, 1));
494*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000006L, $noinline$rotateLeftLong(0x8000000000000001L, 2));
495*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x23456789ABCDEF01L, $noinline$rotateLeftLong(0x123456789ABCDEF0L, 4));
496*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x3456789ABCDEF012L, $noinline$rotateLeftLong(0x123456789ABCDEF0L, 8));
497*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 70; i++) {  // overshoot a bit
498*795d594fSAndroid Build Coastguard Worker       int j = i & 63;
499*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0x0000000000000000L, $inline$rotateLeftLong(0x0000000000000000L, i));
500*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0xFFFFFFFFFFFFFFFFL, $inline$rotateLeftLong(0xFFFFFFFFFFFFFFFFL, i));
501*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(1L << j, $inline$rotateLeftLong(0x0000000000000001, i));
502*795d594fSAndroid Build Coastguard Worker       expectEqualsLong((0x123456789ABCDEF0L << j) | (0x123456789ABCDEF0L >>> -j),
503*795d594fSAndroid Build Coastguard Worker                        $inline$rotateLeftLong(0x123456789ABCDEF0L, i));
504*795d594fSAndroid Build Coastguard Worker 
505*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0x0000000000000000L, $noinline$rotateLeftLong(0x0000000000000000L, i));
506*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0xFFFFFFFFFFFFFFFFL, $noinline$rotateLeftLong(0xFFFFFFFFFFFFFFFFL, i));
507*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(1L << j, $noinline$rotateLeftLong(0x0000000000000001, i));
508*795d594fSAndroid Build Coastguard Worker       expectEqualsLong((0x123456789ABCDEF0L << j) | (0x123456789ABCDEF0L >>> -j),
509*795d594fSAndroid Build Coastguard Worker                        $noinline$rotateLeftLong(0x123456789ABCDEF0L, i));
510*795d594fSAndroid Build Coastguard Worker     }
511*795d594fSAndroid Build Coastguard Worker   }
512*795d594fSAndroid Build Coastguard Worker 
513*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) builder (after)
514*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
515*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
516*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
517*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<One:i\d+>>     IntConstant 1
518*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
519*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<Val>>,<<ArgDist>>]
520*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
521*795d594fSAndroid Build Coastguard Worker 
522*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) builder (after)
523*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InvokeStaticOrDirect
524*795d594fSAndroid Build Coastguard Worker 
525*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) select_generator (after)
526*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
527*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
528*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
529*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<One:i\d+>>     IntConstant 1
530*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<SelVal:i\d+>>  Select [<<Zero>>,<<One>>,<<ArgVal>>]
531*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<SelVal>>,<<ArgDist>>]
532*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
533*795d594fSAndroid Build Coastguard Worker 
534*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) select_generator (after)
535*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
536*795d594fSAndroid Build Coastguard Worker 
537*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) instruction_simplifier$before_codegen (after)
538*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgVal:z\d+>>  ParameterValue
539*795d594fSAndroid Build Coastguard Worker   /// CHECK:         <<ArgDist:i\d+>> ParameterValue
540*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Result>>]
542*795d594fSAndroid Build Coastguard Worker 
543*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestRotate.rotateRightBoolean(boolean, int) instruction_simplifier$before_codegen (after)
544*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Select
545*795d594fSAndroid Build Coastguard Worker 
rotateRightBoolean(boolean value, int distance)546*795d594fSAndroid Build Coastguard Worker   private static int rotateRightBoolean(boolean value, int distance) {
547*795d594fSAndroid Build Coastguard Worker     // Note: D8 would replace the ternary expression `value ? 1 : 0` with `value`
548*795d594fSAndroid Build Coastguard Worker     // but explicit `if` is preserved.
549*795d594fSAndroid Build Coastguard Worker     int src;
550*795d594fSAndroid Build Coastguard Worker     if (value) {
551*795d594fSAndroid Build Coastguard Worker       src = 1;
552*795d594fSAndroid Build Coastguard Worker     } else {
553*795d594fSAndroid Build Coastguard Worker       src = 0;
554*795d594fSAndroid Build Coastguard Worker     }
555*795d594fSAndroid Build Coastguard Worker     return Integer.rotateRight(src, distance);
556*795d594fSAndroid Build Coastguard Worker   }
557*795d594fSAndroid Build Coastguard Worker 
testRotateRightBoolean()558*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightBoolean() {
559*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
560*795d594fSAndroid Build Coastguard Worker       int j = (-i) & 31;
561*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0, rotateRightBoolean(false, i));
562*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, rotateRightBoolean(true, i));
563*795d594fSAndroid Build Coastguard Worker     }
564*795d594fSAndroid Build Coastguard Worker   }
565*795d594fSAndroid Build Coastguard Worker 
testRotateRightByte()566*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightByte() {
567*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFF80, rotateRightByte((byte)0x80, 0));
568*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x7FFFFFC0, rotateRightByte((byte)0x80, 1));
569*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFF01, rotateRightByte((byte)0x80, 31));
570*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFF80, rotateRightByte((byte)0x80, 32));  // overshoot
571*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFFFC0, rotateRightByte((byte)0x81, 1));
572*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x7FFFFFE0, rotateRightByte((byte)0x81, 2));
573*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x20000001, rotateRightByte((byte)0x12, 4));
574*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x9AFFFFFF, rotateRightByte((byte)0x9A, 8));
575*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
576*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
577*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, rotateRightByte((byte)0x00, i));
578*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, rotateRightByte((byte)0xFF, i));
579*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << (32 - j), rotateRightByte((byte)0x01, i));
580*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12 >>> j) | (0x12 << -j), rotateRightByte((byte)0x12, i));
581*795d594fSAndroid Build Coastguard Worker     }
582*795d594fSAndroid Build Coastguard Worker   }
583*795d594fSAndroid Build Coastguard Worker 
testRotateRightShort()584*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightShort() {
585*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF8000, rotateRightShort((short)0x8000, 0));
586*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x7FFFC000, rotateRightShort((short)0x8000, 1));
587*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF0001, rotateRightShort((short)0x8000, 31));
588*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFF8000, rotateRightShort((short)0x8000, 32));  // overshoot
589*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xFFFFC000, rotateRightShort((short)0x8001, 1));
590*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x7FFFE000, rotateRightShort((short)0x8001, 2));
591*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x40000123, rotateRightShort((short)0x1234, 4));
592*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBCFFFF9A, rotateRightShort((short)0x9ABC, 8));
593*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
594*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
595*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, rotateRightShort((short)0x0000, i));
596*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, rotateRightShort((short)0xFFFF, i));
597*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << (32 - j), rotateRightShort((short)0x0001, i));
598*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 >>> j) | (0x1234 << -j), rotateRightShort((short)0x1234, i));
599*795d594fSAndroid Build Coastguard Worker     }
600*795d594fSAndroid Build Coastguard Worker   }
601*795d594fSAndroid Build Coastguard Worker 
testRotateRightChar()602*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightChar() {
603*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00008000, rotateRightChar((char)0x8000, 0));
604*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00004000, rotateRightChar((char)0x8000, 1));
605*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00010000, rotateRightChar((char)0x8000, 31));
606*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00008000, rotateRightChar((char)0x8000, 32));  // overshoot
607*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80004000, rotateRightChar((char)0x8001, 1));
608*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x40002000, rotateRightChar((char)0x8001, 2));
609*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x40000123, rotateRightChar((char)0x1234, 4));
610*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBC00009A, rotateRightChar((char)0x9ABC, 8));
611*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
612*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
613*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, rotateRightChar((char)0x0000, i));
614*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << (32 - j), rotateRightChar((char)0x0001, i));
615*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x1234 >>> j) | (0x1234 << -j), rotateRightChar((char)0x1234, i));
616*795d594fSAndroid Build Coastguard Worker     }
617*795d594fSAndroid Build Coastguard Worker   }
618*795d594fSAndroid Build Coastguard Worker 
testRotateRightInt()619*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightInt() {
620*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, rotateRightInt(0x80000000, 0));
621*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x40000000, rotateRightInt(0x80000000, 1));
622*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, rotateRightInt(0x80000000, 31));
623*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, rotateRightInt(0x80000000, 32));  // overshoot
624*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xC0000000, rotateRightInt(0x80000001, 1));
625*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x60000000, rotateRightInt(0x80000001, 2));
626*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x81234567, rotateRightInt(0x12345678, 4));
627*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xF09ABCDE, rotateRightInt(0x9ABCDEF0, 8));
628*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 40; i++) {  // overshoot a bit
629*795d594fSAndroid Build Coastguard Worker       int j = i & 31;
630*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, rotateRightInt(0x00000000, i));
631*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, rotateRightInt(0xFFFFFFFF, i));
632*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x80000000 >>> j, rotateRightInt(0x80000000, i));
633*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 >>> j) | (0x12345678 << -j), rotateRightInt(0x12345678, i));
634*795d594fSAndroid Build Coastguard Worker     }
635*795d594fSAndroid Build Coastguard Worker   }
636*795d594fSAndroid Build Coastguard Worker 
testRotateRightLong()637*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightLong() {
638*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x8000000000000000L, rotateRightLong(0x8000000000000000L, 0));
639*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x4000000000000000L, rotateRightLong(0x8000000000000000L, 1));
640*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0000000000000001L, rotateRightLong(0x8000000000000000L, 63));
641*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x8000000000000000L, rotateRightLong(0x8000000000000000L, 64));  // overshoot
642*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0xC000000000000000L, rotateRightLong(0x8000000000000001L, 1));
643*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x6000000000000000L, rotateRightLong(0x8000000000000001L, 2));
644*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0x0123456789ABCDEFL, rotateRightLong(0x123456789ABCDEF0L, 4));
645*795d594fSAndroid Build Coastguard Worker     expectEqualsLong(0xF0123456789ABCDEL, rotateRightLong(0x123456789ABCDEF0L, 8));
646*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 70; i++) {  // overshoot a bit
647*795d594fSAndroid Build Coastguard Worker       int j = i & 63;
648*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0x0000000000000000L, rotateRightLong(0x0000000000000000L, i));
649*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0xFFFFFFFFFFFFFFFFL, rotateRightLong(0xFFFFFFFFFFFFFFFFL, i));
650*795d594fSAndroid Build Coastguard Worker       expectEqualsLong(0x8000000000000000L >>> j, rotateRightLong(0x8000000000000000L, i));
651*795d594fSAndroid Build Coastguard Worker       expectEqualsLong((0x123456789ABCDEF0L >>> j) | (0x123456789ABCDEF0L << -j),
652*795d594fSAndroid Build Coastguard Worker                        rotateRightLong(0x123456789ABCDEF0L, i));
653*795d594fSAndroid Build Coastguard Worker     }
654*795d594fSAndroid Build Coastguard Worker   }
655*795d594fSAndroid Build Coastguard Worker 
656*795d594fSAndroid Build Coastguard Worker 
testRotateLeftIntWithByteDistance()657*795d594fSAndroid Build Coastguard Worker   public static void testRotateLeftIntWithByteDistance() {
658*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $inline$rotateLeftIntWithByteDistance(0x00000001, (byte)0));
659*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $inline$rotateLeftIntWithByteDistance(0x00000001, (byte)1));
660*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $inline$rotateLeftIntWithByteDistance(0x00000001, (byte)31));
661*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001,
662*795d594fSAndroid Build Coastguard Worker                     $inline$rotateLeftIntWithByteDistance(0x00000001, (byte)32));  // overshoot
663*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000003, $inline$rotateLeftIntWithByteDistance(0x80000001, (byte)1));
664*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000006, $inline$rotateLeftIntWithByteDistance(0x80000001, (byte)2));
665*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x23456781, $inline$rotateLeftIntWithByteDistance(0x12345678, (byte)4));
666*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBCDEF09A, $inline$rotateLeftIntWithByteDistance(0x9ABCDEF0, (byte)8));
667*795d594fSAndroid Build Coastguard Worker 
668*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, $noinline$rotateLeftIntWithByteDistance(0x00000001, (byte)0));
669*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000002, $noinline$rotateLeftIntWithByteDistance(0x00000001, (byte)1));
670*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, $noinline$rotateLeftIntWithByteDistance(0x00000001, (byte)31));
671*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001,
672*795d594fSAndroid Build Coastguard Worker                     $noinline$rotateLeftIntWithByteDistance(0x00000001, (byte)32));  // overshoot
673*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000003, $noinline$rotateLeftIntWithByteDistance(0x80000001, (byte)1));
674*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000006, $noinline$rotateLeftIntWithByteDistance(0x80000001, (byte)2));
675*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x23456781, $noinline$rotateLeftIntWithByteDistance(0x12345678, (byte)4));
676*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xBCDEF09A, $noinline$rotateLeftIntWithByteDistance(0x9ABCDEF0, (byte)8));
677*795d594fSAndroid Build Coastguard Worker 
678*795d594fSAndroid Build Coastguard Worker     for (byte i = 0; i < 40; i++) {  // overshoot a bit
679*795d594fSAndroid Build Coastguard Worker       byte j = (byte)(i & 31);
680*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $inline$rotateLeftIntWithByteDistance(0x00000000, i));
681*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $inline$rotateLeftIntWithByteDistance(0xFFFFFFFF, i));
682*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $inline$rotateLeftIntWithByteDistance(0x00000001, i));
683*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 << j) | (0x12345678 >>> -j),
684*795d594fSAndroid Build Coastguard Worker                       $inline$rotateLeftIntWithByteDistance(0x12345678, i));
685*795d594fSAndroid Build Coastguard Worker 
686*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, $noinline$rotateLeftIntWithByteDistance(0x00000000, i));
687*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, $noinline$rotateLeftIntWithByteDistance(0xFFFFFFFF, i));
688*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(1 << j, $noinline$rotateLeftIntWithByteDistance(0x00000001, i));
689*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 << j) | (0x12345678 >>> -j),
690*795d594fSAndroid Build Coastguard Worker                       $noinline$rotateLeftIntWithByteDistance(0x12345678, i));
691*795d594fSAndroid Build Coastguard Worker     }
692*795d594fSAndroid Build Coastguard Worker   }
693*795d594fSAndroid Build Coastguard Worker 
testRotateRightIntWithByteDistance()694*795d594fSAndroid Build Coastguard Worker   public static void testRotateRightIntWithByteDistance() {
695*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000, rotateRightIntWithByteDistance(0x80000000, (byte)0));
696*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x40000000, rotateRightIntWithByteDistance(0x80000000, (byte)1));
697*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x00000001, rotateRightIntWithByteDistance(0x80000000, (byte)31));
698*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x80000000,
699*795d594fSAndroid Build Coastguard Worker                     rotateRightIntWithByteDistance(0x80000000, (byte)32));  // overshoot
700*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xC0000000, rotateRightIntWithByteDistance(0x80000001, (byte)1));
701*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x60000000, rotateRightIntWithByteDistance(0x80000001, (byte)2));
702*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0x81234567, rotateRightIntWithByteDistance(0x12345678, (byte)4));
703*795d594fSAndroid Build Coastguard Worker     expectEqualsInt(0xF09ABCDE, rotateRightIntWithByteDistance(0x9ABCDEF0, (byte)8));
704*795d594fSAndroid Build Coastguard Worker     for (byte i = 0; i < 40; i++) {  // overshoot a bit
705*795d594fSAndroid Build Coastguard Worker       byte j = (byte)(i & 31);
706*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x00000000, rotateRightIntWithByteDistance(0x00000000, i));
707*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0xFFFFFFFF, rotateRightIntWithByteDistance(0xFFFFFFFF, i));
708*795d594fSAndroid Build Coastguard Worker       expectEqualsInt(0x80000000 >>> j, rotateRightIntWithByteDistance(0x80000000, i));
709*795d594fSAndroid Build Coastguard Worker       expectEqualsInt((0x12345678 >>> j) | (0x12345678 << -j),
710*795d594fSAndroid Build Coastguard Worker                       rotateRightIntWithByteDistance(0x12345678, i));
711*795d594fSAndroid Build Coastguard Worker     }
712*795d594fSAndroid Build Coastguard Worker   }
713*795d594fSAndroid Build Coastguard Worker 
714*795d594fSAndroid Build Coastguard Worker 
main()715*795d594fSAndroid Build Coastguard Worker   public static void main() {
716*795d594fSAndroid Build Coastguard Worker     testRotateLeftBoolean();
717*795d594fSAndroid Build Coastguard Worker     testRotateLeftByte();
718*795d594fSAndroid Build Coastguard Worker     testRotateLeftShort();
719*795d594fSAndroid Build Coastguard Worker     testRotateLeftChar();
720*795d594fSAndroid Build Coastguard Worker     testRotateLeftInt();
721*795d594fSAndroid Build Coastguard Worker     testRotateLeftLong();
722*795d594fSAndroid Build Coastguard Worker 
723*795d594fSAndroid Build Coastguard Worker     testRotateRightBoolean();
724*795d594fSAndroid Build Coastguard Worker     testRotateRightByte();
725*795d594fSAndroid Build Coastguard Worker     testRotateRightShort();
726*795d594fSAndroid Build Coastguard Worker     testRotateRightChar();
727*795d594fSAndroid Build Coastguard Worker     testRotateRightInt();
728*795d594fSAndroid Build Coastguard Worker     testRotateRightLong();
729*795d594fSAndroid Build Coastguard Worker 
730*795d594fSAndroid Build Coastguard Worker     // Also exercise distance values with types other than int.
731*795d594fSAndroid Build Coastguard Worker     testRotateLeftIntWithByteDistance();
732*795d594fSAndroid Build Coastguard Worker     testRotateRightIntWithByteDistance();
733*795d594fSAndroid Build Coastguard Worker 
734*795d594fSAndroid Build Coastguard Worker     System.out.println("TestRotate passed");
735*795d594fSAndroid Build Coastguard Worker   }
736*795d594fSAndroid Build Coastguard Worker 
737*795d594fSAndroid Build Coastguard Worker 
expectEqualsInt(int expected, int result)738*795d594fSAndroid Build Coastguard Worker   private static void expectEqualsInt(int expected, int result) {
739*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
740*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
741*795d594fSAndroid Build Coastguard Worker     }
742*795d594fSAndroid Build Coastguard Worker   }
743*795d594fSAndroid Build Coastguard Worker 
expectEqualsLong(long expected, long result)744*795d594fSAndroid Build Coastguard Worker   private static void expectEqualsLong(long expected, long result) {
745*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
746*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
747*795d594fSAndroid Build Coastguard Worker     }
748*795d594fSAndroid Build Coastguard Worker   }
749*795d594fSAndroid Build Coastguard Worker }
750