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