| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * Tests for ABS vectorization. |
| */ |
| public class Main { |
| |
| private final static boolean isDalvik = |
| System.getProperty("java.vm.name").equals("Dalvik"); |
| |
| private static final int SPQUIET = 1 << 22; |
| private static final long DPQUIET = 1L << 51; |
| |
| /// CHECK-START: void Main.doitByte(byte[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM: void Main.doitByte(byte[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-START-ARM64: void Main.doitByte(byte[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| // |
| private static void doitByte(byte[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = (byte) Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitChar(char[]) loop_optimization (before) |
| /// CHECK-NOT: Abs |
| // |
| /// CHECK-START: void Main.doitChar(char[]) loop_optimization (after) |
| /// CHECK-NOT: VecAbs |
| private static void doitChar(char[] x) { |
| // Basically a nop due to zero extension. |
| for (int i = 0; i < x.length; i++) { |
| x[i] = (char) Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitShort(short[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM: void Main.doitShort(short[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-START-ARM64: void Main.doitShort(short[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitShort(short[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = (short) Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitCastedChar(char[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM64: void Main.doitCastedChar(char[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitCastedChar(char[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = (char) Math.abs((short) x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitInt(int[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM: void Main.doitInt(int[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-START-ARM64: void Main.doitInt(int[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitInt(int[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitLong(long[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM64: void Main.doitLong(long[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitLong(long[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitFloat(float[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM64: void Main.doitFloat(float[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitFloat(float[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = Math.abs(x[i]); |
| } |
| } |
| |
| /// CHECK-START: void Main.doitDouble(double[]) loop_optimization (before) |
| /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none |
| /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none |
| // |
| /// CHECK-START-ARM64: void Main.doitDouble(double[]) loop_optimization (after) |
| /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none |
| /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none |
| /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none |
| /// CHECK-IF: hasIsaFeature("sve") |
| // |
| /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none |
| /// CHECK-NOT: ArrayGet |
| /// CHECK-NOT: Abs |
| /// CHECK-NOT: ArraySet |
| // |
| /// CHECK-ELSE: |
| // |
| /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none |
| /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none |
| /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none |
| // |
| /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" |
| // |
| /// CHECK-FI: |
| private static void doitDouble(double[] x) { |
| for (int i = 0; i < x.length; i++) { |
| x[i] = Math.abs(x[i]); |
| } |
| } |
| |
| public static void main(String[] args) { |
| // Bytes, chars, shorts. |
| byte[] xb = new byte[256]; |
| for (int i = 0; i < 256; i++) { |
| xb[i] = (byte) i; |
| } |
| doitByte(xb); |
| for (int i = 0; i < 256; i++) { |
| expectEquals32((byte) Math.abs((byte) i), xb[i]); |
| } |
| char[] xc = new char[1024 * 64]; |
| for (int i = 0; i < 1024 * 64; i++) { |
| xc[i] = (char) i; |
| } |
| doitChar(xc); |
| for (int i = 0; i < 1024 * 64; i++) { |
| expectEquals32((char) Math.abs((char) i), xc[i]); |
| } |
| short[] xs = new short[1024 * 64]; |
| for (int i = 0; i < 1024 * 64; i++) { |
| xs[i] = (short) i; |
| } |
| doitShort(xs); |
| for (int i = 0; i < 1024 * 64; i++) { |
| expectEquals32((short) Math.abs((short) i), xs[i]); |
| } |
| for (int i = 0; i < 1024 * 64; i++) { |
| xc[i] = (char) i; |
| } |
| doitCastedChar(xc); |
| for (int i = 0; i < 1024 * 64; i++) { |
| expectEquals32((char) Math.abs((short) i), xc[i]); |
| } |
| // Set up minint32, maxint32 and some others. |
| int[] xi = new int[8]; |
| xi[0] = 0x80000000; |
| xi[1] = 0x7fffffff; |
| xi[2] = 0x80000001; |
| xi[3] = -13; |
| xi[4] = -1; |
| xi[5] = 0; |
| xi[6] = 1; |
| xi[7] = 999; |
| doitInt(xi); |
| expectEquals32(0x80000000, xi[0]); |
| expectEquals32(0x7fffffff, xi[1]); |
| expectEquals32(0x7fffffff, xi[2]); |
| expectEquals32(13, xi[3]); |
| expectEquals32(1, xi[4]); |
| expectEquals32(0, xi[5]); |
| expectEquals32(1, xi[6]); |
| expectEquals32(999, xi[7]); |
| |
| // Set up minint64, maxint64 and some others. |
| long[] xl = new long[8]; |
| xl[0] = 0x8000000000000000L; |
| xl[1] = 0x7fffffffffffffffL; |
| xl[2] = 0x8000000000000001L; |
| xl[3] = -13; |
| xl[4] = -1; |
| xl[5] = 0; |
| xl[6] = 1; |
| xl[7] = 999; |
| doitLong(xl); |
| expectEquals64(0x8000000000000000L, xl[0]); |
| expectEquals64(0x7fffffffffffffffL, xl[1]); |
| expectEquals64(0x7fffffffffffffffL, xl[2]); |
| expectEquals64(13, xl[3]); |
| expectEquals64(1, xl[4]); |
| expectEquals64(0, xl[5]); |
| expectEquals64(1, xl[6]); |
| expectEquals64(999, xl[7]); |
| |
| // Set up float NaN and some others. |
| float[] xf = new float[16]; |
| xf[0] = Float.intBitsToFloat(0x7f800001); |
| xf[1] = Float.intBitsToFloat(0x7fa00000); |
| xf[2] = Float.intBitsToFloat(0x7fc00000); |
| xf[3] = Float.intBitsToFloat(0x7fffffff); |
| xf[4] = Float.intBitsToFloat(0xff800001); |
| xf[5] = Float.intBitsToFloat(0xffa00000); |
| xf[6] = Float.intBitsToFloat(0xffc00000); |
| xf[7] = Float.intBitsToFloat(0xffffffff); |
| xf[8] = Float.NEGATIVE_INFINITY; |
| xf[9] = -99.2f; |
| xf[10] = -1.0f; |
| xf[11] = -0.0f; |
| xf[12] = +0.0f; |
| xf[13] = +1.0f; |
| xf[14] = +99.2f; |
| xf[15] = Float.POSITIVE_INFINITY; |
| doitFloat(xf); |
| expectEqualsNaN32(0x7f800001, Float.floatToRawIntBits(xf[0])); |
| expectEqualsNaN32(0x7fa00000, Float.floatToRawIntBits(xf[1])); |
| expectEqualsNaN32(0x7fc00000, Float.floatToRawIntBits(xf[2])); |
| expectEqualsNaN32(0x7fffffff, Float.floatToRawIntBits(xf[3])); |
| expectEqualsNaN32(0x7f800001, Float.floatToRawIntBits(xf[4])); |
| expectEqualsNaN32(0x7fa00000, Float.floatToRawIntBits(xf[5])); |
| expectEqualsNaN32(0x7fc00000, Float.floatToRawIntBits(xf[6])); |
| expectEqualsNaN32(0x7fffffff, Float.floatToRawIntBits(xf[7])); |
| expectEquals32( |
| Float.floatToRawIntBits(Float.POSITIVE_INFINITY), |
| Float.floatToRawIntBits(xf[8])); |
| expectEquals32( |
| Float.floatToRawIntBits(99.2f), |
| Float.floatToRawIntBits(xf[9])); |
| expectEquals32( |
| Float.floatToRawIntBits(1.0f), |
| Float.floatToRawIntBits(xf[10])); |
| expectEquals32(0, Float.floatToRawIntBits(xf[11])); |
| expectEquals32(0, Float.floatToRawIntBits(xf[12])); |
| expectEquals32( |
| Float.floatToRawIntBits(1.0f), |
| Float.floatToRawIntBits(xf[13])); |
| expectEquals32( |
| Float.floatToRawIntBits(99.2f), |
| Float.floatToRawIntBits(xf[14])); |
| expectEquals32( |
| Float.floatToRawIntBits(Float.POSITIVE_INFINITY), |
| Float.floatToRawIntBits(xf[15])); |
| |
| // Set up double NaN and some others. |
| double[] xd = new double[16]; |
| xd[0] = Double.longBitsToDouble(0x7ff0000000000001L); |
| xd[1] = Double.longBitsToDouble(0x7ff4000000000000L); |
| xd[2] = Double.longBitsToDouble(0x7ff8000000000000L); |
| xd[3] = Double.longBitsToDouble(0x7fffffffffffffffL); |
| xd[4] = Double.longBitsToDouble(0xfff0000000000001L); |
| xd[5] = Double.longBitsToDouble(0xfff4000000000000L); |
| xd[6] = Double.longBitsToDouble(0xfff8000000000000L); |
| xd[7] = Double.longBitsToDouble(0xffffffffffffffffL); |
| xd[8] = Double.NEGATIVE_INFINITY; |
| xd[9] = -99.2f; |
| xd[10] = -1.0f; |
| xd[11] = -0.0f; |
| xd[12] = +0.0f; |
| xd[13] = +1.0f; |
| xd[14] = +99.2f; |
| xd[15] = Double.POSITIVE_INFINITY; |
| doitDouble(xd); |
| expectEqualsNaN64(0x7ff0000000000001L, Double.doubleToRawLongBits(xd[0])); |
| expectEqualsNaN64(0x7ff4000000000000L, Double.doubleToRawLongBits(xd[1])); |
| expectEqualsNaN64(0x7ff8000000000000L, Double.doubleToRawLongBits(xd[2])); |
| expectEqualsNaN64(0x7fffffffffffffffL, Double.doubleToRawLongBits(xd[3])); |
| expectEqualsNaN64(0x7ff0000000000001L, Double.doubleToRawLongBits(xd[4])); |
| expectEqualsNaN64(0x7ff4000000000000L, Double.doubleToRawLongBits(xd[5])); |
| expectEqualsNaN64(0x7ff8000000000000L, Double.doubleToRawLongBits(xd[6])); |
| expectEqualsNaN64(0x7fffffffffffffffL, Double.doubleToRawLongBits(xd[7])); |
| expectEquals64( |
| Double.doubleToRawLongBits(Double.POSITIVE_INFINITY), |
| Double.doubleToRawLongBits(xd[8])); |
| expectEquals64( |
| Double.doubleToRawLongBits(99.2f), |
| Double.doubleToRawLongBits(xd[9])); |
| expectEquals64( |
| Double.doubleToRawLongBits(1.0f), |
| Double.doubleToRawLongBits(xd[10])); |
| expectEquals64(0, Double.doubleToRawLongBits(xd[11])); |
| expectEquals64(0, Double.doubleToRawLongBits(xd[12])); |
| expectEquals64( |
| Double.doubleToRawLongBits(1.0f), |
| Double.doubleToRawLongBits(xd[13])); |
| expectEquals64( |
| Double.doubleToRawLongBits(99.2f), |
| Double.doubleToRawLongBits(xd[14])); |
| expectEquals64( |
| Double.doubleToRawLongBits(Double.POSITIVE_INFINITY), |
| Double.doubleToRawLongBits(xd[15])); |
| |
| System.out.println("passed"); |
| } |
| |
| private static void expectEquals32(int expected, int result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals64(long expected, long result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| // We allow that an expected NaN result has become quiet. |
| private static void expectEqualsNaN32(int expected, int result) { |
| if (expected != result && (expected | SPQUIET) != result) { |
| if (!isDalvik) { |
| // If not on ART, relax the expected value more towards just |
| // "spec compliance" and allow sign bit to remain set for NaN. |
| if (expected == (result & Integer.MAX_VALUE)) { |
| return; |
| } |
| } |
| throw new Error("Expected: 0x" + Integer.toHexString(expected) |
| + ", found: 0x" + Integer.toHexString(result)); |
| } |
| } |
| |
| // We allow that an expected NaN result has become quiet. |
| private static void expectEqualsNaN64(long expected, long result) { |
| if (expected != result && (expected | DPQUIET) != result) { |
| if (!isDalvik) { |
| // If not on ART, relax the expected value more towards just |
| // "spec compliance" and allow sign bit to remain set for NaN. |
| if (expected == (result & Long.MAX_VALUE)) { |
| return; |
| } |
| } |
| throw new Error("Expected: 0x" + Long.toHexString(expected) |
| + ", found: 0x" + Long.toHexString(result)); |
| } |
| } |
| } |