/* * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /** * @test * @bug 8248830 8256823 * @summary Support for scalar rotates ([Integer/Long].rotate[Left/Right]). * @library /test/lib * @run main/othervm/timeout=600 -XX:-TieredCompilation -XX:CompileThreshold=1000 -Xbatch * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure * compiler.intrinsics.TestRotate */ package compiler.intrinsics; public class TestRotate { static final int ITERS = 50000; static final int[] INT_VALUES = {Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 1, 2, 3, 5, 8, 13}; static final long[] LONG_VALUES = {Long.MIN_VALUE, Long.MAX_VALUE, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; // expected resules static final int[] TEST_ROR_OR_INT_1_EXPECTED = {1073741824, -1073741825, 0, -2147483648, 1, -2147483647, -2147483646, 4, -2147483642}; static final int[] TEST_ROR_OR_INT_16_EXPECTED = {32768, -32769, 0, 65536, 131072, 196608, 327680, 524288, 851968}; static final int[] TEST_ROR_OR_INT_31_EXPECTED = {1, -2, 0, 2, 4, 6, 10, 16, 26}; static final int[] TEST_ROR_OR_INT_32_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13}; static final long[] TEST_ROR_OR_LONG_1_EXPECTED = {4611686018427387904L, -4611686018427387905L, 0L, -9223372036854775808L, 1L, -9223372036854775807L, -9223372036854775806L, 4L, -9223372036854775802L}; static final long[] TEST_ROR_OR_LONG_16_EXPECTED = {140737488355328L, -140737488355329L, 0L, 281474976710656L, 562949953421312L, 844424930131968L, 1407374883553280L, 2251799813685248L, 3659174697238528L}; static final long[] TEST_ROR_OR_LONG_63_EXPECTED = {1L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L}; static final long[] TEST_ROR_OR_LONG_64_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; static final int[] TEST_ROR_ADD_INT_1_EXPECTED = TEST_ROR_OR_INT_1_EXPECTED; static final int[] TEST_ROR_ADD_INT_16_EXPECTED = TEST_ROR_OR_INT_16_EXPECTED; static final int[] TEST_ROR_ADD_INT_31_EXPECTED = TEST_ROR_OR_INT_31_EXPECTED; static final int[] TEST_ROR_ADD_INT_32_EXPECTED = {0, -2, 0, 2, 4, 6, 10, 16, 26}; static final long[] TEST_ROR_ADD_LONG_1_EXPECTED = TEST_ROR_OR_LONG_1_EXPECTED; static final long[] TEST_ROR_ADD_LONG_16_EXPECTED = TEST_ROR_OR_LONG_16_EXPECTED; static final long[] TEST_ROR_ADD_LONG_63_EXPECTED = TEST_ROR_OR_LONG_63_EXPECTED; static final long[] TEST_ROR_ADD_LONG_64_EXPECTED = {0L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L}; // eor shift expected static final int[] TEST_EOR_ROR_SHIFT_1_INT_EXPECTED = {-1073741824, -1073741824, 0, -2147483647, 3, -2147483646, -2147483641, 12, -2147483637}; static final int[] TEST_EOR_ROR_SHIFT_16_INT_EXPECTED = {-2147450880, -2147450880, 0, 65537, 131074, 196611, 327685, 524296, 851981}; static final int[] TEST_EOR_ROR_SHIFT_31_INT_EXPECTED = {-2147483647, -2147483647, 0, 3, 6, 5, 15, 24, 23}; static final int[] TEST_EOR_ROR_SHIFT_32_INT_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0}; static final long[] TEST_EOR_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387904L, -4611686018427387904L, 0L, -9223372036854775807L, 3L, -9223372036854775806L, -9223372036854775801L, 12L, -9223372036854775797L}; static final long[] TEST_EOR_ROR_SHIFT_16_LONG_EXPECTED = {-9223231299366420480L, -9223231299366420480L, 0L, 281474976710657L, 562949953421314L, 844424930131971L, 1407374883553285L, 2251799813685256L, 3659174697238541L}; static final long[] TEST_EOR_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775807L, -9223372036854775807L, 0L, 3L, 6L, 5L, 15L, 24L, 23L}; static final long[] TEST_EOR_ROR_SHIFT_64_LONG_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // and shift expected static final int[] TEST_AND_ROR_SHIFT_1_INT_EXPECTED = {0, 1073741823, 0, 0, 0, 1, 0, 0, 4}; static final int[] TEST_AND_ROR_SHIFT_16_INT_EXPECTED = {0, 2147450879, 0, 0, 0, 0, 0, 0, 0}; static final int[] TEST_AND_ROR_SHIFT_31_INT_EXPECTED = {0, 2147483646, 0, 0, 0, 2, 0, 0, 8}; static final int[] TEST_AND_ROR_SHIFT_32_INT_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13}; static final long[] TEST_AND_ROR_SHIFT_1_LONG_EXPECTED = {0L, 4611686018427387903L, 0L, 0L, 0L, 1L, 0L, 0L, 4L}; static final long[] TEST_AND_ROR_SHIFT_16_LONG_EXPECTED = {0L, 9223231299366420479L, 0L, 0L, 0L, 0L, 0L, 0L, 0L}; static final long[] TEST_AND_ROR_SHIFT_63_LONG_EXPECTED = {0L, 9223372036854775806L, 0L, 0L, 0L, 2L, 0L, 0L, 8L}; static final long[] TEST_AND_ROR_SHIFT_64_LONG_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; // or shift expected static final int[] TEST_OR_ROR_SHIFT_1_INT_EXPECTED = {-1073741824, -1, 0, -2147483647, 3, -2147483645, -2147483641, 12, -2147483633}; static final int[] TEST_OR_ROR_SHIFT_16_INT_EXPECTED = {-2147450880, -1, 0, 65537, 131074, 196611, 327685, 524296, 851981}; static final int[] TEST_OR_ROR_SHIFT_31_INT_EXPECTED = {-2147483647, -1, 0, 3, 6, 7, 15, 24, 31}; static final int[] TEST_OR_ROR_SHIFT_32_INT_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13}; static final long[] TEST_OR_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387904L, -1L, 0L, -9223372036854775807L, 3L, -9223372036854775805L, -9223372036854775801L, 12L, -9223372036854775793L}; static final long[] TEST_OR_ROR_SHIFT_16_LONG_EXPECTED = {-9223231299366420480L, -1L, 0L, 281474976710657L, 562949953421314L, 844424930131971L, 1407374883553285L, 2251799813685256L, 3659174697238541L}; static final long[] TEST_OR_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775807L, -1L, 0L, 3L, 6L, 7L, 15L, 24L, 31L}; static final long[] TEST_OR_ROR_SHIFT_64_LONG_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; // eon shift expected static final int[] TEST_EON_ROR_SHIFT_1_INT_EXPECTED = {1073741823, 1073741823, -1, 2147483646, -4, 2147483645, 2147483640, -13, 2147483636}; static final int[] TEST_EON_ROR_SHIFT_16_INT_EXPECTED = {2147450879, 2147450879, -1, -65538, -131075, -196612, -327686, -524297, -851982}; static final int[] TEST_EON_ROR_SHIFT_31_INT_EXPECTED = {2147483646, 2147483646, -1, -4, -7, -6, -16, -25, -24}; static final int[] TEST_EON_ROR_SHIFT_32_INT_EXPECTED = {-1, -1, -1, -1, -1, -1, -1, -1, -1}; static final long[] TEST_EON_ROR_SHIFT_1_LONG_EXPECTED = {4611686018427387903L, 4611686018427387903L, -1L, 9223372036854775806L, -4L, 9223372036854775805L, 9223372036854775800L, -13L, 9223372036854775796L}; static final long[] TEST_EON_ROR_SHIFT_16_LONG_EXPECTED = {9223231299366420479L, 9223231299366420479L, -1L, -281474976710658L, -562949953421315L, -844424930131972L, -1407374883553286L, -2251799813685257L, -3659174697238542L}; static final long[] TEST_EON_ROR_SHIFT_63_LONG_EXPECTED = {9223372036854775806L, 9223372036854775806L, -1L, -4L, -7L, -6L, -16L, -25L, -24L}; static final long[] TEST_EON_ROR_SHIFT_64_LONG_EXPECTED = {-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L}; // bic shift expected static final int[] TEST_BIC_ROR_SHIFT_1_INT_EXPECTED = {-2147483648, 1073741824, 0, 1, 2, 2, 5, 8, 9}; static final int[] TEST_BIC_ROR_SHIFT_16_INT_EXPECTED = {-2147483648, 32768, 0, 1, 2, 3, 5, 8, 13}; static final int[] TEST_BIC_ROR_SHIFT_31_INT_EXPECTED = {-2147483648, 1, 0, 1, 2, 1, 5, 8, 5}; static final int[] TEST_BIC_ROR_SHIFT_32_INT_EXPECTED = {0, 0, 0, 0, 0, 0, 0, 0, 0}; static final long[] TEST_BIC_ROR_SHIFT_1_LONG_EXPECTED = {-9223372036854775808L, 4611686018427387904L, 0L, 1L, 2L, 2L, 5L, 8L, 9L}; static final long[] TEST_BIC_ROR_SHIFT_16_LONG_EXPECTED = {-9223372036854775808L, 140737488355328L, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; static final long[] TEST_BIC_ROR_SHIFT_63_LONG_EXPECTED = {-9223372036854775808L, 1L, 0L, 1L, 2L, 1L, 5L, 8L, 5L}; static final long[] TEST_BIC_ROR_SHIFT_64_LONG_EXPECTED = {0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L}; // orn shift expected static final int[] TEST_ORN_ROR_SHIFT_1_INT_EXPECTED = {-1073741825, 2147483647, -1, 2147483647, -2, 2147483647, 2147483645, -5, 2147483645}; static final int[] TEST_ORN_ROR_SHIFT_16_INT_EXPECTED = {-32769, 2147483647, -1, -65537, -131073, -196609, -327681, -524289, -851969}; static final int[] TEST_ORN_ROR_SHIFT_31_INT_EXPECTED = {-2, 2147483647, -1, -3, -5, -5, -11, -17, -19}; static final int[] TEST_ORN_ROR_SHIFT_32_INT_EXPECTED = {-1, -1, -1, -1, -1, -1, -1, -1, -1}; static final long[] TEST_ORN_ROR_SHIFT_1_LONG_EXPECTED = {-4611686018427387905L, 9223372036854775807L, -1L, 9223372036854775807L, -2L, 9223372036854775807L, 9223372036854775805L, -5L, 9223372036854775805L}; static final long[] TEST_ORN_ROR_SHIFT_16_LONG_EXPECTED = {-140737488355329L, 9223372036854775807L, -1L, -281474976710657L, -562949953421313L, -844424930131969L, -1407374883553281L, -2251799813685249L, -3659174697238529L}; static final long[] TEST_ORN_ROR_SHIFT_63_LONG_EXPECTED = {-2L, 9223372036854775807L, -1L, -3L, -5L, -5L, -11L, -17L, -19L}; static final long[] TEST_ORN_ROR_SHIFT_64_LONG_EXPECTED = {-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L}; static final int[] TEST_ROR_INT_API_1_EXPECTED = TEST_ROR_OR_INT_1_EXPECTED; static final int[] TEST_ROR_INT_API_16_EXPECTED = TEST_ROR_OR_INT_16_EXPECTED; static final int[] TEST_ROR_INT_API_31_EXPECTED = TEST_ROR_OR_INT_31_EXPECTED; static final int[] TEST_ROR_INT_API_32_EXPECTED = TEST_ROR_OR_INT_32_EXPECTED; static final long[] TEST_ROR_LONG_API_1_EXPECTED = TEST_ROR_OR_LONG_1_EXPECTED; static final long[] TEST_ROR_LONG_API_16_EXPECTED = TEST_ROR_OR_LONG_16_EXPECTED; static final long[] TEST_ROR_LONG_API_63_EXPECTED = TEST_ROR_OR_LONG_63_EXPECTED; static final long[] TEST_ROR_LONG_API_64_EXPECTED = TEST_ROR_OR_LONG_64_EXPECTED; static final int[] TEST_ROL_INT_API_1_EXPECTED = {1, -2, 0, 2, 4, 6, 10, 16, 26}; static final int[] TEST_ROL_INT_API_16_EXPECTED = {32768, -32769, 0, 65536, 131072, 196608, 327680, 524288, 851968}; static final int[] TEST_ROL_INT_API_31_EXPECTED = {1073741824, -1073741825, 0, -2147483648, 1, -2147483647, -2147483646, 4, -2147483642}; static final int[] TEST_ROL_INT_API_32_EXPECTED = {-2147483648, 2147483647, 0, 1, 2, 3, 5, 8, 13}; static final long[] TEST_ROL_LONG_API_1_EXPECTED = {1L, -2L, 0L, 2L, 4L, 6L, 10L, 16L, 26L}; static final long[] TEST_ROL_LONG_API_16_EXPECTED = {32768L, -32769L, 0L, 65536L, 131072L, 196608L, 327680L, 524288L, 851968L}; static final long[] TEST_ROL_LONG_API_63_EXPECTED = {4611686018427387904L, -4611686018427387905L, 0L, -9223372036854775808L, 1L, -9223372036854775807L, -9223372036854775806L, 4L, -9223372036854775802L}; static final long[] TEST_ROL_LONG_API_64_EXPECTED = {-9223372036854775808L, 9223372036854775807L, 0L, 1L, 2L, 3L, 5L, 8L, 13L}; // verify static void verify(String text, long ref, long actual) { if (ref != actual) { System.err.println(text + " " + ref + " != " + actual); throw new Error("Fail"); } } static void verify(String text, int ref, int actual) { if (ref != actual) { System.err.println(text + " " + ref + " != " + actual); throw new Error("Fail"); } } // ror test constant public static int testRorOrInt1(int val) { return (val >>> 1) | (val << (32 - 1)); } public static int testRorOrInt16(int val) { return (val >>> 16) | (val << (32 - 16)); } public static int testRorOrInt31(int val) { return (val >>> 31) | (val << (32 - 31)); } public static int testRorOrInt32(int val) { return (val >>> 32) | (val << (32 - 32)); } public static long testRorOrLong1(long val) { return (val >>> 1) | (val << (64 - 1)); } public static long testRorOrLong16(long val) { return (val >>> 16) | (val << (64 - 16)); } public static long testRorOrLong63(long val) { return (val >>> 63) | (val << (64 - 63)); } public static long testRorOrLong64(long val) { return (val >>> 64) | (val << (64 - 64)); } public static int testRorAddInt1(int val) { return (val >>> 1) + (val << (32 - 1)); } public static int testRorAddInt16(int val) { return (val >>> 16) + (val << (32 - 16)); } public static int testRorAddInt31(int val) { return (val >>> 31) + (val << (32 - 31)); } public static int testRorAddInt32(int val) { return (val >>> 32) + (val << (32 - 32)); } public static long testRorAddLong1(long val) { return (val >>> 1) + (val << (64 - 1)); } public static long testRorAddLong16(long val) { return (val >>> 16) + (val << (64 - 16)); } public static long testRorAddLong63(long val) { return (val >>> 63) + (val << (64 - 63)); } public static long testRorAddLong64(long val) { return (val >>> 64) + (val << (64 - 64)); } // eor(ROR shift) public static int testRorOrInt1Eor(int val) { return val ^ ((val >>> 1) | (val << (32 - 1))); } public static int testRorOrInt16Eor(int val) { return val ^ ((val >>> 16) | (val << (32 - 16))); } public static int testRorOrInt31Eor(int val) { return val ^ ((val >>> 31) | (val << (32 - 31))); } public static int testRorOrInt32Eor(int val) { return val ^ ((val >>> 32) | (val << (32 - 32))); } public static long testRorOrLong1Eor(long val) { return val ^ ((val >>> 1) | (val << (64 - 1))); } public static long testRorOrLong16Eor(long val) { return val ^ ((val >>> 16) | (val << (64 - 16))); } public static long testRorOrLong63Eor(long val) { return val ^ ((val >>> 63) | (val << (64 - 63))); } public static long testRorOrLong64Eor(long val) { return val ^ ((val >>> 64) | (val << (64 - 64))); } // and(ROR shift) public static int testRorOrInt1And(int val) { return val & ((val >>> 1) | (val << (32 - 1))); } public static int testRorOrInt16And(int val) { return val & ((val >>> 16) | (val << (32 - 16))); } public static int testRorOrInt31And(int val) { return val & ((val >>> 31) | (val << (32 - 31))); } public static int testRorOrInt32And(int val) { return val & ((val >>> 32) | (val << (32 - 32))); } public static long testRorOrLong1And(long val) { return val & ((val >>> 1) | (val << (64 - 1))); } public static long testRorOrLong16And(long val) { return val & ((val >>> 16) | (val << (64 - 16))); } public static long testRorOrLong63And(long val) { return val & ((val >>> 63) | (val << (64 - 63))); } public static long testRorOrLong64And(long val) { return val & ((val >>> 64) | (val << (64 - 64))); } // or(ROR shift) public static int testRorOrInt1Or(int val) { return val | ((val >>> 1) | (val << (32 - 1))); } public static int testRorOrInt16Or(int val) { return val | ((val >>> 16) | (val << (32 - 16))); } public static int testRorOrInt31Or(int val) { return val | ((val >>> 31) | (val << (32 - 31))); } public static int testRorOrInt32Or(int val) { return val | ((val >>> 32) | (val << (32 - 32))); } public static long testRorOrLong1Or(long val) { return val | ((val >>> 1) | (val << (64 - 1))); } public static long testRorOrLong16Or(long val) { return val | ((val >>> 16) | (val << (64 - 16))); } public static long testRorOrLong63Or(long val) { return val | ((val >>> 63) | (val << (64 - 63))); } public static long testRorOrLong64Or(long val) { return val | ((val >>> 64) | (val << (64 - 64))); } // eon (ROR shift) public static int testRorOrInt1Eon(int val) { return val ^ (-1 ^ ((val >>> 1) | (val << (32 - 1)))); } public static int testRorOrInt16Eon(int val) { return val ^ (-1 ^ ((val >>> 16) | (val << (32 - 16)))); } public static int testRorOrInt31Eon(int val) { return val ^ (-1 ^ ((val >>> 31) | (val << (32 - 31)))); } public static int testRorOrInt32Eon(int val) { return val ^ (-1 ^ ((val >>> 32) | (val << (32 - 32)))); } public static long testRorOrLong1Eon(long val) { return val ^ (-1 ^ ((val >>> 1) | (val << (64 - 1)))); } public static long testRorOrLong16Eon(long val) { return val ^ (-1 ^ ((val >>> 16) | (val << (64 - 16)))); } public static long testRorOrLong63Eon(long val) { return val ^ (-1 ^ ((val >>> 63) | (val << (64 - 63)))); } public static long testRorOrLong64Eon(long val) { return val ^ (-1 ^ ((val >>> 64) | (val << (64 - 64)))); } // and (ROR shift) public static int testRorOrInt1Bic(int val) { return val & (-1 ^ ((val >>> 1) | (val << (32 - 1)))); } public static int testRorOrInt16Bic(int val) { return val & (-1 ^ ((val >>> 16) | (val << (32 - 16)))); } public static int testRorOrInt31Bic(int val) { return val & (-1 ^ ((val >>> 31) | (val << (32 - 31)))); } public static int testRorOrInt32Bic(int val) { return val & (-1 ^ ((val >>> 32) | (val << (32 - 32)))); } public static long testRorOrLong1Bic(long val) { return val & (-1 ^ ((val >>> 1) | (val << (64 - 1)))); } public static long testRorOrLong16Bic(long val) { return val & (-1 ^ ((val >>> 16) | (val << (64 - 16)))); } public static long testRorOrLong63Bic(long val) { return val & (-1 ^ ((val >>> 63) | (val << (64 - 63)))); } public static long testRorOrLong64Bic(long val) { return val & (-1 ^ ((val >>> 64) | (val << (64 - 64)))); } // or (ROR shift) public static int testRorOrInt1Orn(int val) { return val | (-1 ^ ((val >>> 1) | (val << (32 - 1)))); } public static int testRorOrInt16Orn(int val) { return val | (-1 ^ ((val >>> 16) | (val << (32 - 16)))); } public static int testRorOrInt31Orn(int val) { return val | (-1 ^ ((val >>> 31) | (val << (32 - 31)))); } public static int testRorOrInt32Orn(int val) { return val | (-1 ^ ((val >>> 32) | (val << (32 - 32)))); } public static long testRorOrLong1Orn(long val) { return val | (-1 ^ ((val >>> 1) | (val << (64 - 1)))); } public static long testRorOrLong16Orn(long val) { return val | (-1 ^ ((val >>> 16) | (val << (64 - 16)))); } public static long testRorOrLong63Orn(long val) { return val | (-1 ^ ((val >>> 63) | (val << (64 - 63)))); } public static long testRorOrLong64Orn(long val) { return val | (-1 ^ ((val >>> 64) | (val << (64 - 64)))); } // test rotate API public static int testRorIntApi(int val, int distance) { return Integer.rotateRight(val, distance); } public static long testRorLongApi(long val, int distance) { return Long.rotateRight(val, distance); } public static int testRolIntApi(int val, int distance) { return Integer.rotateLeft(val, distance); } public static long testRolLongApi(long val, int distance) { return Long.rotateLeft(val, distance); } public static void testRolIntZero(int val) { // Count is known to be zero only after loop opts int count = 42; for (int i = 0; i < 4; i++) { if ((i % 2) == 0) { count = 0; } } int res = Integer.rotateLeft(val, count); if (res != val) { throw new RuntimeException("test_rol_int_zero failed: " + res + " != " + val); } } public static void testRolLongZero(long val) { // Count is known to be zero only after loop opts int count = 42; for (int i = 0; i < 4; i++) { if ((i % 2) == 0) { count = 0; } } long res = Long.rotateLeft(val, count); if (res != val) { throw new RuntimeException("test_rol_long_zero failed: " + res + " != " + val); } } public static void testRorIntZero(int val) { // Count is known to be zero only after loop opts int count = 42; for (int i = 0; i < 4; i++) { if ((i % 2) == 0) { count = 0; } } int res = Integer.rotateRight(val, count); if (res != val) { throw new RuntimeException("test_ror_int_zero failed: " + res + " != " + val); } } public static void testRorLongZero(long val) { // Count is known to be zero only after loop opts int count = 42; for (int i = 0; i < 4; i++) { if ((i % 2) == 0) { count = 0; } } long res = Long.rotateRight(val, count); if (res != val) { throw new RuntimeException("test_ror_long_zero failed: " + res + " != " + val); } } public static void testRorOrInts() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1(" + val + ")", testRorOrInt1(val), TEST_ROR_OR_INT_1_EXPECTED[i]); verify("testRorOrInt16(" + val + ")", testRorOrInt16(val), TEST_ROR_OR_INT_16_EXPECTED[i]); verify("testRorOrInt31(" + val + ")", testRorOrInt31(val), TEST_ROR_OR_INT_31_EXPECTED[i]); verify("testRorOrInt32(" + val + ")", testRorOrInt32(val), TEST_ROR_OR_INT_32_EXPECTED[i]); } } } public static void testRorAddInts() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorAddInt1(" + val + ")", testRorAddInt1(val), TEST_ROR_ADD_INT_1_EXPECTED[i]); verify("testRorAddInt16(" + val + ")", testRorAddInt16(val), TEST_ROR_ADD_INT_16_EXPECTED[i]); verify("testRorAddInt31(" + val + ")", testRorAddInt31(val), TEST_ROR_ADD_INT_31_EXPECTED[i]); verify("testRorAddInt32(" + val + ")", testRorAddInt32(val), TEST_ROR_ADD_INT_32_EXPECTED[i]); } } } public static void testRorOrIntEors() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1Eor(" + val + ")", testRorOrInt1Eor(val), TEST_EOR_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16Eor(" + val + ")", testRorOrInt16Eor(val), TEST_EOR_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31Eor(" + val + ")", testRorOrInt31Eor(val), TEST_EOR_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32Eor(" + val + ")", testRorOrInt32Eor(val), TEST_EOR_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorOrIntAnds() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1And(" + val + ")", testRorOrInt1And(val), TEST_AND_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16And(" + val + ")", testRorOrInt16And(val), TEST_AND_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31And(" + val + ")", testRorOrInt31And(val), TEST_AND_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32And(" + val + ")", testRorOrInt32And(val), TEST_AND_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorOrIntOrs() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1Or(" + val + ")", testRorOrInt1Or(val), TEST_OR_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16Or(" + val + ")", testRorOrInt16Or(val), TEST_OR_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31Or(" + val + ")", testRorOrInt31Or(val), TEST_OR_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32Or(" + val + ")", testRorOrInt32Or(val), TEST_OR_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorOrIntEons() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1Eon(" + val + ")", testRorOrInt1Eon(val), TEST_EON_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16Eon(" + val + ")", testRorOrInt16Eon(val), TEST_EON_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31Eon(" + val + ")", testRorOrInt31Eon(val), TEST_EON_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32Eon(" + val + ")", testRorOrInt32Eon(val), TEST_EON_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorOrIntBics() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1Bic(" + val + ")", testRorOrInt1Bic(val), TEST_BIC_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16Bic(" + val + ")", testRorOrInt16Bic(val), TEST_BIC_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31Bic(" + val + ")", testRorOrInt31Bic(val), TEST_BIC_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32Bic(" + val + ")", testRorOrInt32Bic(val), TEST_BIC_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorOrIntOrns() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorOrInt1Orn(" + val + ")", testRorOrInt1Orn(val), TEST_ORN_ROR_SHIFT_1_INT_EXPECTED[i]); verify("testRorOrInt16Orn(" + val + ")", testRorOrInt16Orn(val), TEST_ORN_ROR_SHIFT_16_INT_EXPECTED[i]); verify("testRorOrInt31Orn(" + val + ")", testRorOrInt31Orn(val), TEST_ORN_ROR_SHIFT_31_INT_EXPECTED[i]); verify("testRorOrInt32Orn(" + val + ")", testRorOrInt32Orn(val), TEST_ORN_ROR_SHIFT_32_INT_EXPECTED[i]); } } } public static void testRorIntApis() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRorIntApi(" + val + ", 1)", testRorIntApi(val, 1), TEST_ROR_INT_API_1_EXPECTED[i]); verify("testRorIntApi(" + val + ", 16)", testRorIntApi(val, 16), TEST_ROR_INT_API_16_EXPECTED[i]); verify("testRorIntApi(" + val + ", 31)", testRorIntApi(val, 31), TEST_ROR_INT_API_31_EXPECTED[i]); verify("testRorIntApi(" + val + ", 32)", testRorIntApi(val, 32), TEST_ROR_INT_API_32_EXPECTED[i]); } } } public static void testRolIntApis() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; verify("testRolIntApi(" + val + ", 1)", testRolIntApi(val, 1), TEST_ROL_INT_API_1_EXPECTED[i]); verify("testRolIntApi(" + val + ", 16)", testRolIntApi(val, 16), TEST_ROL_INT_API_16_EXPECTED[i]); verify("testRolIntApi(" + val + ", 31)", testRolIntApi(val, 31), TEST_ROL_INT_API_31_EXPECTED[i]); verify("testRolIntApi(" + val + ", 32)", testRolIntApi(val, 32), TEST_ROL_INT_API_32_EXPECTED[i]); } } } public static void testRolrIntZeros() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < INT_VALUES.length; i++) { int val = INT_VALUES[i]; testRolIntZero(val); testRorIntZero(val); } } } public static void testRorOrLongs() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1(" + val + ")", testRorOrLong1(val), TEST_ROR_OR_LONG_1_EXPECTED[i]); verify("testRorOrLong16(" + val + ")", testRorOrLong16(val), TEST_ROR_OR_LONG_16_EXPECTED[i]); verify("testRorOrLong63(" + val + ")", testRorOrLong63(val), TEST_ROR_OR_LONG_63_EXPECTED[i]); verify("testRorOrLong64(" + val + ")", testRorOrLong64(val), TEST_ROR_OR_LONG_64_EXPECTED[i]); } } } public static void testRorAddLongs() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorAddLong1(" + val + ")", testRorAddLong1(val), TEST_ROR_ADD_LONG_1_EXPECTED[i]); verify("testRorAddLong16(" + val + ")", testRorAddLong16(val), TEST_ROR_ADD_LONG_16_EXPECTED[i]); verify("testRorAddLong63(" + val + ")", testRorAddLong63(val), TEST_ROR_ADD_LONG_63_EXPECTED[i]); verify("testRorAddLong64(" + val + ")", testRorAddLong64(val), TEST_ROR_ADD_LONG_64_EXPECTED[i]); } } } public static void testRorOrLongEors() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1Eor(" + val + ")", testRorOrLong1Eor(val), TEST_EOR_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16Eor(" + val + ")", testRorOrLong16Eor(val), TEST_EOR_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63Eor(" + val + ")", testRorOrLong63Eor(val), TEST_EOR_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64Eor(" + val + ")", testRorOrLong64Eor(val), TEST_EOR_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorOrLongAnds() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1And(" + val + ")", testRorOrLong1And(val), TEST_AND_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16And(" + val + ")", testRorOrLong16And(val), TEST_AND_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63And(" + val + ")", testRorOrLong63And(val), TEST_AND_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64And(" + val + ")", testRorOrLong64And(val), TEST_AND_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorOrLongOrs() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1Or(" + val + ")", testRorOrLong1Or(val), TEST_OR_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16Or(" + val + ")", testRorOrLong16Or(val), TEST_OR_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63Or(" + val + ")", testRorOrLong63Or(val), TEST_OR_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64Or(" + val + ")", testRorOrLong64Or(val), TEST_OR_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorOrLongEons() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1Eon(" + val + ")", testRorOrLong1Eon(val), TEST_EON_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16Eon(" + val + ")", testRorOrLong16Eon(val), TEST_EON_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63Eon(" + val + ")", testRorOrLong63Eon(val), TEST_EON_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64Eon(" + val + ")", testRorOrLong64Eon(val), TEST_EON_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorOrLongBics() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1Bic(" + val + ")", testRorOrLong1Bic(val), TEST_BIC_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16Bic(" + val + ")", testRorOrLong16Bic(val), TEST_BIC_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63Bic(" + val + ")", testRorOrLong63Bic(val), TEST_BIC_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64Bic(" + val + ")", testRorOrLong64Bic(val), TEST_BIC_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorOrLongOrns() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorOrLong1Orn(" + val + ")", testRorOrLong1Orn(val), TEST_ORN_ROR_SHIFT_1_LONG_EXPECTED[i]); verify("testRorOrLong16Orn(" + val + ")", testRorOrLong16Orn(val), TEST_ORN_ROR_SHIFT_16_LONG_EXPECTED[i]); verify("testRorOrLong63Orn(" + val + ")", testRorOrLong63Orn(val), TEST_ORN_ROR_SHIFT_63_LONG_EXPECTED[i]); verify("testRorOrLong64Orn(" + val + ")", testRorOrLong64Orn(val), TEST_ORN_ROR_SHIFT_64_LONG_EXPECTED[i]); } } } public static void testRorLongApis() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRorLongApi(" + val + ", 1)", testRorLongApi(val, 1), TEST_ROR_LONG_API_1_EXPECTED[i]); verify("testRorLongApi(" + val + ", 16)", testRorLongApi(val, 16), TEST_ROR_LONG_API_16_EXPECTED[i]); verify("testRorLongApi(" + val + ", 63)", testRorLongApi(val, 63), TEST_ROR_LONG_API_63_EXPECTED[i]); verify("testRorLongApi(" + val + ", 64)", testRorLongApi(val, 64), TEST_ROR_LONG_API_64_EXPECTED[i]); } } } public static void testRolLongApis() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; verify("testRolLongApi(" + val + ", 1)", testRolLongApi(val, 1), TEST_ROL_LONG_API_1_EXPECTED[i]); verify("testRolLongApi(" + val + ", 16)", testRolLongApi(val, 16), TEST_ROL_LONG_API_16_EXPECTED[i]); verify("testRolLongApi(" + val + ", 63)", testRolLongApi(val, 63), TEST_ROL_LONG_API_63_EXPECTED[i]); verify("testRolLongApi(" + val + ", 64)", testRolLongApi(val, 64), TEST_ROL_LONG_API_64_EXPECTED[i]); } } } public static void testRolrLongZeros() { for (int count = 0; count < ITERS; count++) { for (int i = 0; i < LONG_VALUES.length; i++) { long val = LONG_VALUES[i]; testRolLongZero(i); testRorLongZero(i); } } } public static void main(String[] args) { testRorOrInts(); testRorAddInts(); testRorOrIntEors(); testRorOrIntAnds(); testRorOrIntOrs(); testRorOrIntEons(); testRorOrIntBics(); testRorOrIntOrns(); testRorIntApis(); testRolIntApis(); testRolrIntZeros(); testRorOrLongs(); testRorAddLongs(); testRorOrLongEors(); testRorOrLongAnds(); testRorOrLongOrs(); testRorOrLongEons(); testRorOrLongBics(); testRorOrLongOrns(); testRorLongApis(); testRolLongApis(); testRolrLongZeros(); } }