Path: blob/master/test/hotspot/jtreg/compiler/intrinsics/TestRotate.java
41149 views
/*1* Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 8248830 825682326* @summary Support for scalar rotates ([Integer/Long].rotate[Left/Right]).27* @library /test/lib28* @run main/othervm/timeout=600 -XX:-TieredCompilation -XX:CompileThreshold=1000 -Xbatch29* -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure30* compiler.intrinsics.TestRotate31*/32package compiler.intrinsics;3334public class TestRotate {3536static final int ITERS = 50000;37static final int[] INT_VALUES = {Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 1, 2, 3, 5, 8, 13};38static final long[] LONG_VALUES = {Long.MIN_VALUE, Long.MAX_VALUE, 0L, 1L, 2L, 3L, 5L, 8L, 13L};3940// expected resules41static final int[] TEST_ROR_OR_INT_1_EXPECTED = {1073741824, -1073741825, 0, -2147483648, 1, -2147483647, -2147483646, 4, -2147483642};4243static final int[] TEST_ROR_OR_INT_16_EXPECTED = {32768, -32769, 0, 65536, 131072, 196608, 327680, 524288, 851968};4445static final int[] TEST_ROR_OR_INT_31_EXPECTED = {1, -2, 0, 2, 4, 6, 10, 16, 26};4647static final int[] TEST_ROR_OR_INT_32_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13};4849static final long[] TEST_ROR_OR_LONG_1_EXPECTED = {4611686018427387904L, -4611686018427387905L, 0L, -9223372036854775808L, 1L, -9223372036854775807L, -9223372036854775806L, 4L, -9223372036854775802L};5051static final long[] TEST_ROR_OR_LONG_16_EXPECTED = {140737488355328L, -140737488355329L, 0L, 281474976710656L, 562949953421312L, 844424930131968L, 1407374883553280L, 2251799813685248L, 3659174697238528L};5253static final long[] TEST_ROR_OR_LONG_63_EXPECTED = {1L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L};5455static final long[] TEST_ROR_OR_LONG_64_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L};5657static final int[] TEST_ROR_ADD_INT_1_EXPECTED = TEST_ROR_OR_INT_1_EXPECTED;5859static final int[] TEST_ROR_ADD_INT_16_EXPECTED = TEST_ROR_OR_INT_16_EXPECTED;6061static final int[] TEST_ROR_ADD_INT_31_EXPECTED = TEST_ROR_OR_INT_31_EXPECTED;6263static final int[] TEST_ROR_ADD_INT_32_EXPECTED = {0, -2, 0, 2, 4, 6, 10, 16, 26};6465static final long[] TEST_ROR_ADD_LONG_1_EXPECTED = TEST_ROR_OR_LONG_1_EXPECTED;6667static final long[] TEST_ROR_ADD_LONG_16_EXPECTED = TEST_ROR_OR_LONG_16_EXPECTED;6869static final long[] TEST_ROR_ADD_LONG_63_EXPECTED = TEST_ROR_OR_LONG_63_EXPECTED;7071static final long[] TEST_ROR_ADD_LONG_64_EXPECTED = {0L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L};7273// eor shift expected74static final int[] TEST_EOR_ROR_SHIFT_1_INT_EXPECTED = {-1073741824, -1073741824, 0, -2147483647, 3, -2147483646, -2147483641, 12, -2147483637};7576static final int[] TEST_EOR_ROR_SHIFT_16_INT_EXPECTED = {-2147450880, -2147450880, 0, 65537, 131074, 196611, 327685, 524296, 851981};7778static final int[] TEST_EOR_ROR_SHIFT_31_INT_EXPECTED = {-2147483647, -2147483647, 0, 3, 6, 5, 15, 24, 23};7980static final int[] TEST_EOR_ROR_SHIFT_32_INT_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0};8182static final long[] TEST_EOR_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387904L, -4611686018427387904L, 0L, -9223372036854775807L, 3L, -9223372036854775806L, -9223372036854775801L, 12L, -9223372036854775797L};8384static final long[] TEST_EOR_ROR_SHIFT_16_LONG_EXPECTED = {-9223231299366420480L, -9223231299366420480L, 0L, 281474976710657L, 562949953421314L, 844424930131971L, 1407374883553285L, 2251799813685256L, 3659174697238541L};8586static final long[] TEST_EOR_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775807L, -9223372036854775807L, 0L, 3L, 6L, 5L, 15L, 24L, 23L};8788static final long[] TEST_EOR_ROR_SHIFT_64_LONG_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0};8990// and shift expected91static final int[] TEST_AND_ROR_SHIFT_1_INT_EXPECTED = {0, 1073741823, 0, 0, 0, 1, 0, 0, 4};9293static final int[] TEST_AND_ROR_SHIFT_16_INT_EXPECTED = {0, 2147450879, 0, 0, 0, 0, 0, 0, 0};9495static final int[] TEST_AND_ROR_SHIFT_31_INT_EXPECTED = {0, 2147483646, 0, 0, 0, 2, 0, 0, 8};9697static final int[] TEST_AND_ROR_SHIFT_32_INT_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13};9899static final long[] TEST_AND_ROR_SHIFT_1_LONG_EXPECTED = {0L, 4611686018427387903L, 0L, 0L, 0L, 1L, 0L, 0L, 4L};100101static final long[] TEST_AND_ROR_SHIFT_16_LONG_EXPECTED = {0L, 9223231299366420479L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};102103static final long[] TEST_AND_ROR_SHIFT_63_LONG_EXPECTED = {0L, 9223372036854775806L, 0L, 0L, 0L, 2L, 0L, 0L, 8L};104105static final long[] TEST_AND_ROR_SHIFT_64_LONG_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L};106107// or shift expected108static final int[] TEST_OR_ROR_SHIFT_1_INT_EXPECTED = {-1073741824, -1, 0, -2147483647, 3, -2147483645, -2147483641, 12, -2147483633};109110static final int[] TEST_OR_ROR_SHIFT_16_INT_EXPECTED = {-2147450880, -1, 0, 65537, 131074, 196611, 327685, 524296, 851981};111112static final int[] TEST_OR_ROR_SHIFT_31_INT_EXPECTED = {-2147483647, -1, 0, 3, 6, 7, 15, 24, 31};113114static final int[] TEST_OR_ROR_SHIFT_32_INT_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13};115116static final long[] TEST_OR_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387904L, -1L, 0L, -9223372036854775807L, 3L, -9223372036854775805L, -9223372036854775801L, 12L, -9223372036854775793L};117118static final long[] TEST_OR_ROR_SHIFT_16_LONG_EXPECTED = {-9223231299366420480L, -1L, 0L, 281474976710657L, 562949953421314L, 844424930131971L, 1407374883553285L, 2251799813685256L, 3659174697238541L};119120static final long[] TEST_OR_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775807L, -1L, 0L, 3L, 6L, 7L, 15L, 24L, 31L};121122static final long[] TEST_OR_ROR_SHIFT_64_LONG_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L};123124// eon shift expected125static final int[] TEST_EON_ROR_SHIFT_1_INT_EXPECTED = {1073741823, 1073741823, -1, 2147483646, -4, 2147483645, 2147483640, -13, 2147483636};126127static final int[] TEST_EON_ROR_SHIFT_16_INT_EXPECTED = {2147450879, 2147450879, -1, -65538, -131075, -196612, -327686, -524297, -851982};128129static final int[] TEST_EON_ROR_SHIFT_31_INT_EXPECTED = {2147483646, 2147483646, -1, -4, -7, -6, -16, -25, -24};130131static final int[] TEST_EON_ROR_SHIFT_32_INT_EXPECTED = {-1, -1, -1, -1, -1, -1, -1, -1, -1};132133static final long[] TEST_EON_ROR_SHIFT_1_LONG_EXPECTED = {4611686018427387903L, 4611686018427387903L, -1L, 9223372036854775806L, -4L, 9223372036854775805L, 9223372036854775800L, -13L, 9223372036854775796L};134135static final long[] TEST_EON_ROR_SHIFT_16_LONG_EXPECTED = {9223231299366420479L, 9223231299366420479L, -1L, -281474976710658L, -562949953421315L, -844424930131972L, -1407374883553286L, -2251799813685257L, -3659174697238542L};136137static final long[] TEST_EON_ROR_SHIFT_63_LONG_EXPECTED = {9223372036854775806L, 9223372036854775806L, -1L, -4L, -7L, -6L, -16L, -25L, -24L};138139static final long[] TEST_EON_ROR_SHIFT_64_LONG_EXPECTED = {-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L};140141// bic shift expected142static final int[] TEST_BIC_ROR_SHIFT_1_INT_EXPECTED = {-2147483648, 1073741824, 0, 1, 2, 2, 5, 8, 9};143144static final int[] TEST_BIC_ROR_SHIFT_16_INT_EXPECTED = {-2147483648, 32768, 0, 1, 2, 3, 5, 8, 13};145146static final int[] TEST_BIC_ROR_SHIFT_31_INT_EXPECTED = {-2147483648, 1, 0, 1, 2, 1, 5, 8, 5};147148static final int[] TEST_BIC_ROR_SHIFT_32_INT_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0};149150static final long[] TEST_BIC_ROR_SHIFT_1_LONG_EXPECTED = {-9223372036854775808L, 4611686018427387904L, 0L, 1L, 2L, 2L, 5L, 8L, 9L};151152static final long[] TEST_BIC_ROR_SHIFT_16_LONG_EXPECTED = {-9223372036854775808L, 140737488355328L, 0L, 1L, 2L, 3L, 5L, 8L, 13L};153154static final long[] TEST_BIC_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775808L, 1L, 0L, 1L, 2L, 1L, 5L, 8L, 5L};155156static final long[] TEST_BIC_ROR_SHIFT_64_LONG_EXPECTED = {0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};157158// orn shift expected159static final int[] TEST_ORN_ROR_SHIFT_1_INT_EXPECTED = {-1073741825, 2147483647, -1, 2147483647, -2, 2147483647, 2147483645, -5, 2147483645};160161static final int[] TEST_ORN_ROR_SHIFT_16_INT_EXPECTED = {-32769, 2147483647, -1, -65537, -131073, -196609, -327681, -524289, -851969};162163static final int[] TEST_ORN_ROR_SHIFT_31_INT_EXPECTED = {-2, 2147483647, -1, -3, -5, -5, -11, -17, -19};164165static final int[] TEST_ORN_ROR_SHIFT_32_INT_EXPECTED = {-1, -1, -1, -1, -1, -1, -1, -1, -1};166167static final long[] TEST_ORN_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387905L, 9223372036854775807L, -1L, 9223372036854775807L, -2L, 9223372036854775807L, 9223372036854775805L, -5L, 9223372036854775805L};168169static final long[] TEST_ORN_ROR_SHIFT_16_LONG_EXPECTED = {-140737488355329L, 9223372036854775807L, -1L, -281474976710657L, -562949953421313L, -844424930131969L, -1407374883553281L, -2251799813685249L, -3659174697238529L};170171static final long[] TEST_ORN_ROR_SHIFT_63_LONG_EXPECTED = {-2L, 9223372036854775807L, -1L, -3L, -5L, -5L, -11L, -17L, -19L};172173static final long[] TEST_ORN_ROR_SHIFT_64_LONG_EXPECTED = {-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L};174175static final int[] TEST_ROR_INT_API_1_EXPECTED = TEST_ROR_OR_INT_1_EXPECTED;176177static final int[] TEST_ROR_INT_API_16_EXPECTED = TEST_ROR_OR_INT_16_EXPECTED;178179static final int[] TEST_ROR_INT_API_31_EXPECTED = TEST_ROR_OR_INT_31_EXPECTED;180181static final int[] TEST_ROR_INT_API_32_EXPECTED = TEST_ROR_OR_INT_32_EXPECTED;182183static final long[] TEST_ROR_LONG_API_1_EXPECTED = TEST_ROR_OR_LONG_1_EXPECTED;184185static final long[] TEST_ROR_LONG_API_16_EXPECTED = TEST_ROR_OR_LONG_16_EXPECTED;186187static final long[] TEST_ROR_LONG_API_63_EXPECTED = TEST_ROR_OR_LONG_63_EXPECTED;188189static final long[] TEST_ROR_LONG_API_64_EXPECTED = TEST_ROR_OR_LONG_64_EXPECTED;190191static final int[] TEST_ROL_INT_API_1_EXPECTED = {1, -2, 0, 2, 4, 6, 10, 16, 26};192193static final int[] TEST_ROL_INT_API_16_EXPECTED = {32768, -32769, 0, 65536, 131072, 196608, 327680, 524288, 851968};194195static final int[] TEST_ROL_INT_API_31_EXPECTED = {1073741824, -1073741825, 0, -2147483648, 1, -2147483647, -2147483646, 4, -2147483642};196197static final int[] TEST_ROL_INT_API_32_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13};198199static final long[] TEST_ROL_LONG_API_1_EXPECTED = {1L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L};200201static final long[] TEST_ROL_LONG_API_16_EXPECTED = {32768L, -32769L, 0L, 65536L, 131072L, 196608L, 327680L, 524288L, 851968L};202203static final long[] TEST_ROL_LONG_API_63_EXPECTED = {4611686018427387904L, -4611686018427387905L, 0L, -9223372036854775808L, 1L, -9223372036854775807L, -9223372036854775806L, 4L, -9223372036854775802L};204205static final long[] TEST_ROL_LONG_API_64_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L};206207// verify208static void verify(String text, long ref, long actual) {209if (ref != actual) {210System.err.println(text + " " + ref + " != " + actual);211throw new Error("Fail");212}213}214215static void verify(String text, int ref, int actual) {216if (ref != actual) {217System.err.println(text + " " + ref + " != " + actual);218throw new Error("Fail");219}220}221222// ror test constant223public static int testRorOrInt1(int val) {224return (val >>> 1) | (val << (32 - 1));225}226227public static int testRorOrInt16(int val) {228return (val >>> 16) | (val << (32 - 16));229}230231public static int testRorOrInt31(int val) {232return (val >>> 31) | (val << (32 - 31));233}234235public static int testRorOrInt32(int val) {236return (val >>> 32) | (val << (32 - 32));237}238239public static long testRorOrLong1(long val) {240return (val >>> 1) | (val << (64 - 1));241}242243public static long testRorOrLong16(long val) {244return (val >>> 16) | (val << (64 - 16));245}246247public static long testRorOrLong63(long val) {248return (val >>> 63) | (val << (64 - 63));249}250251public static long testRorOrLong64(long val) {252return (val >>> 64) | (val << (64 - 64));253}254255public static int testRorAddInt1(int val) {256return (val >>> 1) + (val << (32 - 1));257}258259public static int testRorAddInt16(int val) {260return (val >>> 16) + (val << (32 - 16));261}262263public static int testRorAddInt31(int val) {264return (val >>> 31) + (val << (32 - 31));265}266267public static int testRorAddInt32(int val) {268return (val >>> 32) + (val << (32 - 32));269}270271public static long testRorAddLong1(long val) {272return (val >>> 1) + (val << (64 - 1));273}274275public static long testRorAddLong16(long val) {276return (val >>> 16) + (val << (64 - 16));277}278279public static long testRorAddLong63(long val) {280return (val >>> 63) + (val << (64 - 63));281}282283public static long testRorAddLong64(long val) {284return (val >>> 64) + (val << (64 - 64));285}286287// eor(ROR shift)288public static int testRorOrInt1Eor(int val) {289return val ^ ((val >>> 1) | (val << (32 - 1)));290}291292public static int testRorOrInt16Eor(int val) {293return val ^ ((val >>> 16) | (val << (32 - 16)));294}295296public static int testRorOrInt31Eor(int val) {297return val ^ ((val >>> 31) | (val << (32 - 31)));298}299300public static int testRorOrInt32Eor(int val) {301return val ^ ((val >>> 32) | (val << (32 - 32)));302}303304public static long testRorOrLong1Eor(long val) {305return val ^ ((val >>> 1) | (val << (64 - 1)));306}307308public static long testRorOrLong16Eor(long val) {309return val ^ ((val >>> 16) | (val << (64 - 16)));310}311312public static long testRorOrLong63Eor(long val) {313return val ^ ((val >>> 63) | (val << (64 - 63)));314}315316public static long testRorOrLong64Eor(long val) {317return val ^ ((val >>> 64) | (val << (64 - 64)));318}319320// and(ROR shift)321public static int testRorOrInt1And(int val) {322return val & ((val >>> 1) | (val << (32 - 1)));323}324325public static int testRorOrInt16And(int val) {326return val & ((val >>> 16) | (val << (32 - 16)));327}328329public static int testRorOrInt31And(int val) {330return val & ((val >>> 31) | (val << (32 - 31)));331}332333public static int testRorOrInt32And(int val) {334return val & ((val >>> 32) | (val << (32 - 32)));335}336337public static long testRorOrLong1And(long val) {338return val & ((val >>> 1) | (val << (64 - 1)));339}340341public static long testRorOrLong16And(long val) {342return val & ((val >>> 16) | (val << (64 - 16)));343}344345public static long testRorOrLong63And(long val) {346return val & ((val >>> 63) | (val << (64 - 63)));347}348349public static long testRorOrLong64And(long val) {350return val & ((val >>> 64) | (val << (64 - 64)));351}352353// or(ROR shift)354public static int testRorOrInt1Or(int val) {355return val | ((val >>> 1) | (val << (32 - 1)));356}357358public static int testRorOrInt16Or(int val) {359return val | ((val >>> 16) | (val << (32 - 16)));360}361362public static int testRorOrInt31Or(int val) {363return val | ((val >>> 31) | (val << (32 - 31)));364}365366public static int testRorOrInt32Or(int val) {367return val | ((val >>> 32) | (val << (32 - 32)));368}369370public static long testRorOrLong1Or(long val) {371return val | ((val >>> 1) | (val << (64 - 1)));372}373374public static long testRorOrLong16Or(long val) {375return val | ((val >>> 16) | (val << (64 - 16)));376}377378public static long testRorOrLong63Or(long val) {379return val | ((val >>> 63) | (val << (64 - 63)));380}381382public static long testRorOrLong64Or(long val) {383return val | ((val >>> 64) | (val << (64 - 64)));384}385386// eon (ROR shift)387public static int testRorOrInt1Eon(int val) {388return val ^ (-1 ^ ((val >>> 1) | (val << (32 - 1))));389}390391public static int testRorOrInt16Eon(int val) {392return val ^ (-1 ^ ((val >>> 16) | (val << (32 - 16))));393}394395public static int testRorOrInt31Eon(int val) {396return val ^ (-1 ^ ((val >>> 31) | (val << (32 - 31))));397}398399public static int testRorOrInt32Eon(int val) {400return val ^ (-1 ^ ((val >>> 32) | (val << (32 - 32))));401}402403public static long testRorOrLong1Eon(long val) {404return val ^ (-1 ^ ((val >>> 1) | (val << (64 - 1))));405}406407public static long testRorOrLong16Eon(long val) {408return val ^ (-1 ^ ((val >>> 16) | (val << (64 - 16))));409}410411public static long testRorOrLong63Eon(long val) {412return val ^ (-1 ^ ((val >>> 63) | (val << (64 - 63))));413}414415public static long testRorOrLong64Eon(long val) {416return val ^ (-1 ^ ((val >>> 64) | (val << (64 - 64))));417}418419// and (ROR shift)420public static int testRorOrInt1Bic(int val) {421return val & (-1 ^ ((val >>> 1) | (val << (32 - 1))));422}423424public static int testRorOrInt16Bic(int val) {425return val & (-1 ^ ((val >>> 16) | (val << (32 - 16))));426}427428public static int testRorOrInt31Bic(int val) {429return val & (-1 ^ ((val >>> 31) | (val << (32 - 31))));430}431432public static int testRorOrInt32Bic(int val) {433return val & (-1 ^ ((val >>> 32) | (val << (32 - 32))));434}435436public static long testRorOrLong1Bic(long val) {437return val & (-1 ^ ((val >>> 1) | (val << (64 - 1))));438}439440public static long testRorOrLong16Bic(long val) {441return val & (-1 ^ ((val >>> 16) | (val << (64 - 16))));442}443444public static long testRorOrLong63Bic(long val) {445return val & (-1 ^ ((val >>> 63) | (val << (64 - 63))));446}447448public static long testRorOrLong64Bic(long val) {449return val & (-1 ^ ((val >>> 64) | (val << (64 - 64))));450}451452// or (ROR shift)453public static int testRorOrInt1Orn(int val) {454return val | (-1 ^ ((val >>> 1) | (val << (32 - 1))));455}456457public static int testRorOrInt16Orn(int val) {458return val | (-1 ^ ((val >>> 16) | (val << (32 - 16))));459}460461public static int testRorOrInt31Orn(int val) {462return val | (-1 ^ ((val >>> 31) | (val << (32 - 31))));463}464465public static int testRorOrInt32Orn(int val) {466return val | (-1 ^ ((val >>> 32) | (val << (32 - 32))));467}468469public static long testRorOrLong1Orn(long val) {470return val | (-1 ^ ((val >>> 1) | (val << (64 - 1))));471}472473public static long testRorOrLong16Orn(long val) {474return val | (-1 ^ ((val >>> 16) | (val << (64 - 16))));475}476477public static long testRorOrLong63Orn(long val) {478return val | (-1 ^ ((val >>> 63) | (val << (64 - 63))));479}480481public static long testRorOrLong64Orn(long val) {482return val | (-1 ^ ((val >>> 64) | (val << (64 - 64))));483}484485// test rotate API486public static int testRorIntApi(int val, int distance) {487return Integer.rotateRight(val, distance);488}489490public static long testRorLongApi(long val, int distance) {491return Long.rotateRight(val, distance);492}493494public static int testRolIntApi(int val, int distance) {495return Integer.rotateLeft(val, distance);496}497498public static long testRolLongApi(long val, int distance) {499return Long.rotateLeft(val, distance);500}501502public static void testRolIntZero(int val) {503// Count is known to be zero only after loop opts504int count = 42;505for (int i = 0; i < 4; i++) {506if ((i % 2) == 0) {507count = 0;508}509}510int res = Integer.rotateLeft(val, count);511if (res != val) {512throw new RuntimeException("test_rol_int_zero failed: " + res + " != " + val);513}514}515516public static void testRolLongZero(long val) {517// Count is known to be zero only after loop opts518int count = 42;519for (int i = 0; i < 4; i++) {520if ((i % 2) == 0) {521count = 0;522}523}524long res = Long.rotateLeft(val, count);525if (res != val) {526throw new RuntimeException("test_rol_long_zero failed: " + res + " != " + val);527}528}529530public static void testRorIntZero(int val) {531// Count is known to be zero only after loop opts532int count = 42;533for (int i = 0; i < 4; i++) {534if ((i % 2) == 0) {535count = 0;536}537}538int res = Integer.rotateRight(val, count);539if (res != val) {540throw new RuntimeException("test_ror_int_zero failed: " + res + " != " + val);541}542}543544public static void testRorLongZero(long val) {545// Count is known to be zero only after loop opts546int count = 42;547for (int i = 0; i < 4; i++) {548if ((i % 2) == 0) {549count = 0;550}551}552long res = Long.rotateRight(val, count);553if (res != val) {554throw new RuntimeException("test_ror_long_zero failed: " + res + " != " + val);555}556}557558public static void testRorOrInts() {559for (int count = 0; count < ITERS; count++) {560for (int i = 0; i < INT_VALUES.length; i++) {561int val = INT_VALUES[i];562verify("testRorOrInt1(" + val + ")", testRorOrInt1(val), TEST_ROR_OR_INT_1_EXPECTED[i]);563verify("testRorOrInt16(" + val + ")", testRorOrInt16(val), TEST_ROR_OR_INT_16_EXPECTED[i]);564verify("testRorOrInt31(" + val + ")", testRorOrInt31(val), TEST_ROR_OR_INT_31_EXPECTED[i]);565verify("testRorOrInt32(" + val + ")", testRorOrInt32(val), TEST_ROR_OR_INT_32_EXPECTED[i]);566}567}568}569570public static void testRorAddInts() {571for (int count = 0; count < ITERS; count++) {572for (int i = 0; i < INT_VALUES.length; i++) {573int val = INT_VALUES[i];574verify("testRorAddInt1(" + val + ")", testRorAddInt1(val), TEST_ROR_ADD_INT_1_EXPECTED[i]);575verify("testRorAddInt16(" + val + ")", testRorAddInt16(val), TEST_ROR_ADD_INT_16_EXPECTED[i]);576verify("testRorAddInt31(" + val + ")", testRorAddInt31(val), TEST_ROR_ADD_INT_31_EXPECTED[i]);577verify("testRorAddInt32(" + val + ")", testRorAddInt32(val), TEST_ROR_ADD_INT_32_EXPECTED[i]);578}579}580}581582public static void testRorOrIntEors() {583for (int count = 0; count < ITERS; count++) {584for (int i = 0; i < INT_VALUES.length; i++) {585int val = INT_VALUES[i];586verify("testRorOrInt1Eor(" + val + ")", testRorOrInt1Eor(val), TEST_EOR_ROR_SHIFT_1_INT_EXPECTED[i]);587verify("testRorOrInt16Eor(" + val + ")", testRorOrInt16Eor(val), TEST_EOR_ROR_SHIFT_16_INT_EXPECTED[i]);588verify("testRorOrInt31Eor(" + val + ")", testRorOrInt31Eor(val), TEST_EOR_ROR_SHIFT_31_INT_EXPECTED[i]);589verify("testRorOrInt32Eor(" + val + ")", testRorOrInt32Eor(val), TEST_EOR_ROR_SHIFT_32_INT_EXPECTED[i]);590}591}592}593594public static void testRorOrIntAnds() {595for (int count = 0; count < ITERS; count++) {596for (int i = 0; i < INT_VALUES.length; i++) {597int val = INT_VALUES[i];598verify("testRorOrInt1And(" + val + ")", testRorOrInt1And(val), TEST_AND_ROR_SHIFT_1_INT_EXPECTED[i]);599verify("testRorOrInt16And(" + val + ")", testRorOrInt16And(val), TEST_AND_ROR_SHIFT_16_INT_EXPECTED[i]);600verify("testRorOrInt31And(" + val + ")", testRorOrInt31And(val), TEST_AND_ROR_SHIFT_31_INT_EXPECTED[i]);601verify("testRorOrInt32And(" + val + ")", testRorOrInt32And(val), TEST_AND_ROR_SHIFT_32_INT_EXPECTED[i]);602}603}604}605606public static void testRorOrIntOrs() {607for (int count = 0; count < ITERS; count++) {608for (int i = 0; i < INT_VALUES.length; i++) {609int val = INT_VALUES[i];610verify("testRorOrInt1Or(" + val + ")", testRorOrInt1Or(val), TEST_OR_ROR_SHIFT_1_INT_EXPECTED[i]);611verify("testRorOrInt16Or(" + val + ")", testRorOrInt16Or(val), TEST_OR_ROR_SHIFT_16_INT_EXPECTED[i]);612verify("testRorOrInt31Or(" + val + ")", testRorOrInt31Or(val), TEST_OR_ROR_SHIFT_31_INT_EXPECTED[i]);613verify("testRorOrInt32Or(" + val + ")", testRorOrInt32Or(val), TEST_OR_ROR_SHIFT_32_INT_EXPECTED[i]);614}615}616}617618public static void testRorOrIntEons() {619for (int count = 0; count < ITERS; count++) {620for (int i = 0; i < INT_VALUES.length; i++) {621int val = INT_VALUES[i];622verify("testRorOrInt1Eon(" + val + ")", testRorOrInt1Eon(val), TEST_EON_ROR_SHIFT_1_INT_EXPECTED[i]);623verify("testRorOrInt16Eon(" + val + ")", testRorOrInt16Eon(val), TEST_EON_ROR_SHIFT_16_INT_EXPECTED[i]);624verify("testRorOrInt31Eon(" + val + ")", testRorOrInt31Eon(val), TEST_EON_ROR_SHIFT_31_INT_EXPECTED[i]);625verify("testRorOrInt32Eon(" + val + ")", testRorOrInt32Eon(val), TEST_EON_ROR_SHIFT_32_INT_EXPECTED[i]);626}627}628}629630public static void testRorOrIntBics() {631for (int count = 0; count < ITERS; count++) {632for (int i = 0; i < INT_VALUES.length; i++) {633int val = INT_VALUES[i];634verify("testRorOrInt1Bic(" + val + ")", testRorOrInt1Bic(val), TEST_BIC_ROR_SHIFT_1_INT_EXPECTED[i]);635verify("testRorOrInt16Bic(" + val + ")", testRorOrInt16Bic(val), TEST_BIC_ROR_SHIFT_16_INT_EXPECTED[i]);636verify("testRorOrInt31Bic(" + val + ")", testRorOrInt31Bic(val), TEST_BIC_ROR_SHIFT_31_INT_EXPECTED[i]);637verify("testRorOrInt32Bic(" + val + ")", testRorOrInt32Bic(val), TEST_BIC_ROR_SHIFT_32_INT_EXPECTED[i]);638}639}640}641642public static void testRorOrIntOrns() {643for (int count = 0; count < ITERS; count++) {644for (int i = 0; i < INT_VALUES.length; i++) {645int val = INT_VALUES[i];646verify("testRorOrInt1Orn(" + val + ")", testRorOrInt1Orn(val), TEST_ORN_ROR_SHIFT_1_INT_EXPECTED[i]);647verify("testRorOrInt16Orn(" + val + ")", testRorOrInt16Orn(val), TEST_ORN_ROR_SHIFT_16_INT_EXPECTED[i]);648verify("testRorOrInt31Orn(" + val + ")", testRorOrInt31Orn(val), TEST_ORN_ROR_SHIFT_31_INT_EXPECTED[i]);649verify("testRorOrInt32Orn(" + val + ")", testRorOrInt32Orn(val), TEST_ORN_ROR_SHIFT_32_INT_EXPECTED[i]);650}651}652}653654public static void testRorIntApis() {655for (int count = 0; count < ITERS; count++) {656for (int i = 0; i < INT_VALUES.length; i++) {657int val = INT_VALUES[i];658verify("testRorIntApi(" + val + ", 1)", testRorIntApi(val, 1), TEST_ROR_INT_API_1_EXPECTED[i]);659verify("testRorIntApi(" + val + ", 16)", testRorIntApi(val, 16), TEST_ROR_INT_API_16_EXPECTED[i]);660verify("testRorIntApi(" + val + ", 31)", testRorIntApi(val, 31), TEST_ROR_INT_API_31_EXPECTED[i]);661verify("testRorIntApi(" + val + ", 32)", testRorIntApi(val, 32), TEST_ROR_INT_API_32_EXPECTED[i]);662}663}664}665666public static void testRolIntApis() {667for (int count = 0; count < ITERS; count++) {668for (int i = 0; i < INT_VALUES.length; i++) {669int val = INT_VALUES[i];670verify("testRolIntApi(" + val + ", 1)", testRolIntApi(val, 1), TEST_ROL_INT_API_1_EXPECTED[i]);671verify("testRolIntApi(" + val + ", 16)", testRolIntApi(val, 16), TEST_ROL_INT_API_16_EXPECTED[i]);672verify("testRolIntApi(" + val + ", 31)", testRolIntApi(val, 31), TEST_ROL_INT_API_31_EXPECTED[i]);673verify("testRolIntApi(" + val + ", 32)", testRolIntApi(val, 32), TEST_ROL_INT_API_32_EXPECTED[i]);674}675}676}677678public static void testRolrIntZeros() {679for (int count = 0; count < ITERS; count++) {680for (int i = 0; i < INT_VALUES.length; i++) {681int val = INT_VALUES[i];682testRolIntZero(val);683testRorIntZero(val);684}685}686}687688public static void testRorOrLongs() {689for (int count = 0; count < ITERS; count++) {690for (int i = 0; i < LONG_VALUES.length; i++) {691long val = LONG_VALUES[i];692verify("testRorOrLong1(" + val + ")", testRorOrLong1(val), TEST_ROR_OR_LONG_1_EXPECTED[i]);693verify("testRorOrLong16(" + val + ")", testRorOrLong16(val), TEST_ROR_OR_LONG_16_EXPECTED[i]);694verify("testRorOrLong63(" + val + ")", testRorOrLong63(val), TEST_ROR_OR_LONG_63_EXPECTED[i]);695verify("testRorOrLong64(" + val + ")", testRorOrLong64(val), TEST_ROR_OR_LONG_64_EXPECTED[i]);696}697}698}699700public static void testRorAddLongs() {701for (int count = 0; count < ITERS; count++) {702for (int i = 0; i < LONG_VALUES.length; i++) {703long val = LONG_VALUES[i];704verify("testRorAddLong1(" + val + ")", testRorAddLong1(val), TEST_ROR_ADD_LONG_1_EXPECTED[i]);705verify("testRorAddLong16(" + val + ")", testRorAddLong16(val), TEST_ROR_ADD_LONG_16_EXPECTED[i]);706verify("testRorAddLong63(" + val + ")", testRorAddLong63(val), TEST_ROR_ADD_LONG_63_EXPECTED[i]);707verify("testRorAddLong64(" + val + ")", testRorAddLong64(val), TEST_ROR_ADD_LONG_64_EXPECTED[i]);708}709}710}711712public static void testRorOrLongEors() {713for (int count = 0; count < ITERS; count++) {714for (int i = 0; i < LONG_VALUES.length; i++) {715long val = LONG_VALUES[i];716verify("testRorOrLong1Eor(" + val + ")", testRorOrLong1Eor(val), TEST_EOR_ROR_SHIFT_1_LONG_EXPECTED[i]);717verify("testRorOrLong16Eor(" + val + ")", testRorOrLong16Eor(val), TEST_EOR_ROR_SHIFT_16_LONG_EXPECTED[i]);718verify("testRorOrLong63Eor(" + val + ")", testRorOrLong63Eor(val), TEST_EOR_ROR_SHIFT_63_LONG_EXPECTED[i]);719verify("testRorOrLong64Eor(" + val + ")", testRorOrLong64Eor(val), TEST_EOR_ROR_SHIFT_64_LONG_EXPECTED[i]);720}721}722}723724public static void testRorOrLongAnds() {725for (int count = 0; count < ITERS; count++) {726for (int i = 0; i < LONG_VALUES.length; i++) {727long val = LONG_VALUES[i];728verify("testRorOrLong1And(" + val + ")", testRorOrLong1And(val), TEST_AND_ROR_SHIFT_1_LONG_EXPECTED[i]);729verify("testRorOrLong16And(" + val + ")", testRorOrLong16And(val), TEST_AND_ROR_SHIFT_16_LONG_EXPECTED[i]);730verify("testRorOrLong63And(" + val + ")", testRorOrLong63And(val), TEST_AND_ROR_SHIFT_63_LONG_EXPECTED[i]);731verify("testRorOrLong64And(" + val + ")", testRorOrLong64And(val), TEST_AND_ROR_SHIFT_64_LONG_EXPECTED[i]);732}733}734}735736public static void testRorOrLongOrs() {737for (int count = 0; count < ITERS; count++) {738for (int i = 0; i < LONG_VALUES.length; i++) {739long val = LONG_VALUES[i];740verify("testRorOrLong1Or(" + val + ")", testRorOrLong1Or(val), TEST_OR_ROR_SHIFT_1_LONG_EXPECTED[i]);741verify("testRorOrLong16Or(" + val + ")", testRorOrLong16Or(val), TEST_OR_ROR_SHIFT_16_LONG_EXPECTED[i]);742verify("testRorOrLong63Or(" + val + ")", testRorOrLong63Or(val), TEST_OR_ROR_SHIFT_63_LONG_EXPECTED[i]);743verify("testRorOrLong64Or(" + val + ")", testRorOrLong64Or(val), TEST_OR_ROR_SHIFT_64_LONG_EXPECTED[i]);744}745}746}747748public static void testRorOrLongEons() {749for (int count = 0; count < ITERS; count++) {750for (int i = 0; i < LONG_VALUES.length; i++) {751long val = LONG_VALUES[i];752verify("testRorOrLong1Eon(" + val + ")", testRorOrLong1Eon(val), TEST_EON_ROR_SHIFT_1_LONG_EXPECTED[i]);753verify("testRorOrLong16Eon(" + val + ")", testRorOrLong16Eon(val), TEST_EON_ROR_SHIFT_16_LONG_EXPECTED[i]);754verify("testRorOrLong63Eon(" + val + ")", testRorOrLong63Eon(val), TEST_EON_ROR_SHIFT_63_LONG_EXPECTED[i]);755verify("testRorOrLong64Eon(" + val + ")", testRorOrLong64Eon(val), TEST_EON_ROR_SHIFT_64_LONG_EXPECTED[i]);756}757}758}759760public static void testRorOrLongBics() {761for (int count = 0; count < ITERS; count++) {762for (int i = 0; i < LONG_VALUES.length; i++) {763long val = LONG_VALUES[i];764verify("testRorOrLong1Bic(" + val + ")", testRorOrLong1Bic(val), TEST_BIC_ROR_SHIFT_1_LONG_EXPECTED[i]);765verify("testRorOrLong16Bic(" + val + ")", testRorOrLong16Bic(val), TEST_BIC_ROR_SHIFT_16_LONG_EXPECTED[i]);766verify("testRorOrLong63Bic(" + val + ")", testRorOrLong63Bic(val), TEST_BIC_ROR_SHIFT_63_LONG_EXPECTED[i]);767verify("testRorOrLong64Bic(" + val + ")", testRorOrLong64Bic(val), TEST_BIC_ROR_SHIFT_64_LONG_EXPECTED[i]);768}769}770}771772public static void testRorOrLongOrns() {773for (int count = 0; count < ITERS; count++) {774for (int i = 0; i < LONG_VALUES.length; i++) {775long val = LONG_VALUES[i];776verify("testRorOrLong1Orn(" + val + ")", testRorOrLong1Orn(val), TEST_ORN_ROR_SHIFT_1_LONG_EXPECTED[i]);777verify("testRorOrLong16Orn(" + val + ")", testRorOrLong16Orn(val), TEST_ORN_ROR_SHIFT_16_LONG_EXPECTED[i]);778verify("testRorOrLong63Orn(" + val + ")", testRorOrLong63Orn(val), TEST_ORN_ROR_SHIFT_63_LONG_EXPECTED[i]);779verify("testRorOrLong64Orn(" + val + ")", testRorOrLong64Orn(val), TEST_ORN_ROR_SHIFT_64_LONG_EXPECTED[i]);780}781}782}783784public static void testRorLongApis() {785for (int count = 0; count < ITERS; count++) {786for (int i = 0; i < LONG_VALUES.length; i++) {787long val = LONG_VALUES[i];788verify("testRorLongApi(" + val + ", 1)", testRorLongApi(val, 1), TEST_ROR_LONG_API_1_EXPECTED[i]);789verify("testRorLongApi(" + val + ", 16)", testRorLongApi(val, 16), TEST_ROR_LONG_API_16_EXPECTED[i]);790verify("testRorLongApi(" + val + ", 63)", testRorLongApi(val, 63), TEST_ROR_LONG_API_63_EXPECTED[i]);791verify("testRorLongApi(" + val + ", 64)", testRorLongApi(val, 64), TEST_ROR_LONG_API_64_EXPECTED[i]);792}793}794}795796public static void testRolLongApis() {797for (int count = 0; count < ITERS; count++) {798for (int i = 0; i < LONG_VALUES.length; i++) {799long val = LONG_VALUES[i];800verify("testRolLongApi(" + val + ", 1)", testRolLongApi(val, 1), TEST_ROL_LONG_API_1_EXPECTED[i]);801verify("testRolLongApi(" + val + ", 16)", testRolLongApi(val, 16), TEST_ROL_LONG_API_16_EXPECTED[i]);802verify("testRolLongApi(" + val + ", 63)", testRolLongApi(val, 63), TEST_ROL_LONG_API_63_EXPECTED[i]);803verify("testRolLongApi(" + val + ", 64)", testRolLongApi(val, 64), TEST_ROL_LONG_API_64_EXPECTED[i]);804}805}806}807808public static void testRolrLongZeros() {809for (int count = 0; count < ITERS; count++) {810for (int i = 0; i < LONG_VALUES.length; i++) {811long val = LONG_VALUES[i];812testRolLongZero(i);813testRorLongZero(i);814}815}816}817818public static void main(String[] args) {819testRorOrInts();820testRorAddInts();821testRorOrIntEors();822testRorOrIntAnds();823testRorOrIntOrs();824testRorOrIntEons();825testRorOrIntBics();826testRorOrIntOrns();827testRorIntApis();828testRolIntApis();829testRolrIntZeros();830831testRorOrLongs();832testRorAddLongs();833testRorOrLongEors();834testRorOrLongAnds();835testRorOrLongOrs();836testRorOrLongEons();837testRorOrLongBics();838testRorOrLongOrns();839testRorLongApis();840testRolLongApis();841testRolrLongZeros();842}843844}845846847