/* * Copyright (c) 2025, NVIDIA CORPORATION & 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. */ package compiler.vectorapi; import compiler.lib.generators.*; import compiler.lib.ir_framework.*; import jdk.incubator.vector.*; import jdk.test.lib.Asserts; /* * @test * @bug 8354242 * @key randomness * @library /test/lib / * @summary test combining vector not operation with compare * @modules jdk.incubator.vector * @requires vm.opt.final.MaxVectorSize == "null" | vm.opt.final.MaxVectorSize >= 16 * * @run driver compiler.vectorapi.VectorMaskCompareNotTest */ public class VectorMaskCompareNotTest { private static int LENGTH = 128; private static final VectorSpecies B_SPECIES = VectorSpecies.ofLargestShape(byte.class); private static final VectorSpecies S_SPECIES = VectorSpecies.ofLargestShape(short.class); private static final VectorSpecies I_SPECIES = VectorSpecies.ofLargestShape(int.class); private static final VectorSpecies L_SPECIES = VectorSpecies.ofLargestShape(long.class); private static final VectorSpecies F_SPECIES = VectorSpecies.ofLargestShape(float.class); private static final VectorSpecies D_SPECIES = VectorSpecies.ofLargestShape(double.class); // Vector species for vector mask cast operation between int and long types, // they must have the same number of elements. // For other types, use a vector species of the specified width. private static final VectorSpecies L_SPECIES_FOR_CAST = VectorSpecies.ofLargestShape(long.class); private static final VectorSpecies I_SPECIES_FOR_CAST = VectorSpecies.of(int.class, VectorShape.forBitSize(L_SPECIES_FOR_CAST.vectorBitSize() / 2)); private static final Generators RD = Generators.G; private static byte[] ba; private static byte[] bb; private static short[] sa; private static short[] sb; private static int[] ia; private static int[] ib; private static int[] ic; private static long[] la; private static long[] lb; private static float[] fa; private static float[] fb; private static float[] fnan; private static float[] fpinf; private static float[] fninf; private static double[] da; private static double[] db; private static double[] dnan; private static double[] dpinf; private static double[] dninf; private static boolean[] mr; static { ba = new byte[LENGTH]; bb = new byte[LENGTH]; sa = new short[LENGTH]; sb = new short[LENGTH]; ia = new int[LENGTH]; ib = new int[LENGTH]; ic = new int[LENGTH]; la = new long[LENGTH]; lb = new long[LENGTH]; fa = new float[LENGTH]; fb = new float[LENGTH]; fnan = new float[LENGTH]; fpinf = new float[LENGTH]; fninf = new float[LENGTH]; da = new double[LENGTH]; db = new double[LENGTH]; dnan = new double[LENGTH]; dpinf = new double[LENGTH]; dninf = new double[LENGTH]; mr = new boolean[LENGTH]; Generator iGen = RD.ints(); Generator lGen = RD.longs(); // Use uniform generators for floating point numbers not to generate NaN values. Generator fGen = RD.uniformFloats(Float.MIN_VALUE, Float.MAX_VALUE); Generator dGen = RD.uniformDoubles(Double.MIN_VALUE, Double.MAX_VALUE); for (int i = 0; i < LENGTH; i++) { ba[i] = iGen.next().byteValue(); bb[i] = iGen.next().byteValue(); sa[i] = iGen.next().shortValue(); sb[i] = iGen.next().shortValue(); ia[i] = iGen.next(); ib[i] = iGen.next(); la[i] = lGen.next(); lb[i] = lGen.next(); fa[i] = fGen.next(); fb[i] = fGen.next(); fnan[i] = Float.NaN; fpinf[i] = Float.POSITIVE_INFINITY; fninf[i] = Float.NEGATIVE_INFINITY; da[i] = dGen.next(); db[i] = dGen.next(); dnan[i] = Double.NaN; dpinf[i] = Double.POSITIVE_INFINITY; dninf[i] = Double.NEGATIVE_INFINITY; } } public static int compareUnsigned(Number a, Number b) { if (a instanceof Byte) { return Integer.compareUnsigned(Byte.toUnsignedInt(a.byteValue()), Byte.toUnsignedInt(b.byteValue())); } else if (a instanceof Short) { return Integer.compareUnsigned(Short.toUnsignedInt(a.shortValue()), Short.toUnsignedInt(b.shortValue())); } else if (a instanceof Integer) { return Integer.compareUnsigned(a.intValue(), b.intValue()); } else if (a instanceof Long) { return Long.compareUnsigned(a.longValue(), b.longValue()); } else { throw new IllegalArgumentException("Unsupported type for unsigned comparison: " + a.getClass() + ", " + b.getClass()); } } public static > void compareResults(T a, T b, boolean r, VectorOperators.Comparison op) { if (op == VectorOperators.EQ) { // For floating point numbers, a is not NaN, b may be NaN. If b is NaN, // a.compareTo(b) will return 1, 1 != 0 is true, r is expected to be true. Asserts.assertEquals(a.compareTo(b) != 0, r); } else if (op == VectorOperators.NE) { // For floating point numbers, a is not NaN, b may be NaN. If b is NaN, // a.compareTo(b) will return 1, 1 == 0 is false, r is expected to be false. Asserts.assertEquals(a.compareTo(b) == 0, r); } else if (op == VectorOperators.LE) { Asserts.assertEquals(a.compareTo(b) > 0, r); } else if (op == VectorOperators.GE) { Asserts.assertEquals(a.compareTo(b) < 0, r); } else if (op == VectorOperators.LT) { Asserts.assertEquals(a.compareTo(b) >= 0, r); } else if (op == VectorOperators.GT) { Asserts.assertEquals(a.compareTo(b) <= 0, r); } else if (op == VectorOperators.ULE) { Asserts.assertEquals(compareUnsigned(a, b) > 0, r); } else if (op == VectorOperators.UGE) { Asserts.assertEquals(compareUnsigned(a, b) < 0, r); } else if (op == VectorOperators.ULT) { Asserts.assertEquals(compareUnsigned(a, b) >= 0, r); } else if (op == VectorOperators.UGT) { Asserts.assertEquals(compareUnsigned(a, b) <= 0, r); } else { throw new IllegalArgumentException("Unknown comparison operator: " + op); } } @DontInline public static void verifyResultsByte(VectorSpecies vs, VectorOperators.Comparison op) { for (int i = 0; i < vs.length(); i++) { compareResults(ba[i], bb[i], mr[i], op); } } @DontInline public static void verifyResultsShort(VectorSpecies vs, VectorOperators.Comparison op) { for (int i = 0; i < vs.length(); i++) { compareResults(sa[i], sb[i], mr[i], op); } } @DontInline public static void verifyResultsInt(VectorSpecies vs, VectorOperators.Comparison op) { for (int i = 0; i < vs.length(); i++) { compareResults(ia[i], ib[i], mr[i], op); } } @DontInline public static void verifyResultsLong(VectorSpecies vs, VectorOperators.Comparison op) { for (int i = 0; i < vs.length(); i++) { compareResults(la[i], lb[i], mr[i], op); } } @DontInline public static void verifyResultsFloat(VectorSpecies vs, VectorOperators.Comparison op, float[] a, float[] b) { for (int i = 0; i < vs.length(); i++) { compareResults(a[i], b[i], mr[i], op); } } @DontInline public static void verifyResultsDouble(VectorSpecies vs, VectorOperators.Comparison op, double[] a, double[] b) { for (int i = 0; i < vs.length(); i++) { compareResults(a[i], b[i], mr[i], op); } } interface VectorMaskOperator { public VectorMask apply(VectorMask m); } @ForceInline public static void testCompareMaskNotByte(VectorSpecies vs, VectorOperators.Comparison op, VectorMaskOperator func) { ByteVector av = ByteVector.fromArray(vs, ba, 0); ByteVector bv = ByteVector.fromArray(vs, bb, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } @ForceInline public static void testCompareMaskNotShort(VectorSpecies vs, VectorOperators.Comparison op, VectorMaskOperator func) { ShortVector av = ShortVector.fromArray(vs, sa, 0); ShortVector bv = ShortVector.fromArray(vs, sb, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } @ForceInline public static void testCompareMaskNotInt(VectorSpecies vs, VectorOperators.Comparison op, VectorMaskOperator func) { IntVector av = IntVector.fromArray(vs, ia, 0); IntVector bv = IntVector.fromArray(vs, ib, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } @ForceInline public static void testCompareMaskNotLong(VectorSpecies vs, VectorOperators.Comparison op, VectorMaskOperator func) { LongVector av = LongVector.fromArray(vs, la, 0); LongVector bv = LongVector.fromArray(vs, lb, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } @ForceInline public static void testCompareMaskNotFloat(VectorSpecies vs, VectorOperators.Comparison op, float[] a, float[] b, VectorMaskOperator func) { FloatVector av = FloatVector.fromArray(vs, a, 0); FloatVector bv = FloatVector.fromArray(vs, b, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } @ForceInline public static void testCompareMaskNotDouble(VectorSpecies vs, VectorOperators.Comparison op, double[] a, double[] b, VectorMaskOperator func) { DoubleVector av = DoubleVector.fromArray(vs, a, 0); DoubleVector bv = DoubleVector.fromArray(vs, b, 0); VectorMask m = av.compare(op, bv); func.apply(m).intoArray(mr, 0); } // Byte tests @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.EQ, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.EQ); testCompareMaskNotByte(B_SPECIES, VectorOperators.EQ, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.EQ); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.EQ, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.EQ); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.NE, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.NE); testCompareMaskNotByte(B_SPECIES, VectorOperators.NE, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.NE); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.NE, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareLTMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.LT, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.LT); testCompareMaskNotByte(B_SPECIES, VectorOperators.LT, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.LT); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.LT, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.LT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareGTMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.GT, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.GT); testCompareMaskNotByte(B_SPECIES, VectorOperators.GT, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.GT); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.GT, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.GT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareLEMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.LE, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.LE); testCompareMaskNotByte(B_SPECIES, VectorOperators.LE, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.LE); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.LE, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.LE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareGEMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.GE, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.GE); testCompareMaskNotByte(B_SPECIES, VectorOperators.GE, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.GE); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.GE, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.GE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareULTMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.ULT, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.ULT); testCompareMaskNotByte(B_SPECIES, VectorOperators.ULT, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.ULT); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.ULT, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.ULT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareUGTMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.UGT, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.UGT); testCompareMaskNotByte(B_SPECIES, VectorOperators.UGT, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.UGT); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.UGT, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.UGT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareULEMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.ULE, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.ULE); testCompareMaskNotByte(B_SPECIES, VectorOperators.ULE, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.ULE); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.ULE, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.ULE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareUGEMaskNotByte() { testCompareMaskNotByte(B_SPECIES, VectorOperators.UGE, (m) -> { return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.UGE); testCompareMaskNotByte(B_SPECIES, VectorOperators.UGE, (m) -> { return B_SPECIES.maskAll(true).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.UGE); testCompareMaskNotByte(ByteVector.SPECIES_64, VectorOperators.UGE, (m) -> { return m.cast(ShortVector.SPECIES_128).not(); }); verifyResultsByte(ByteVector.SPECIES_64, VectorOperators.UGE); } // Short tests @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.EQ, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.EQ); testCompareMaskNotShort(S_SPECIES, VectorOperators.EQ, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.EQ); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.EQ, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.EQ); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.EQ, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.EQ); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.NE, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.NE); testCompareMaskNotShort(S_SPECIES, VectorOperators.NE, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.NE); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.NE, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.NE); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.NE, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareLTMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.LT, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.LT); testCompareMaskNotShort(S_SPECIES, VectorOperators.LT, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.LT); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.LT, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.LT); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.LT, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.LT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareGTMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.GT, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.GT); testCompareMaskNotShort(S_SPECIES, VectorOperators.GT, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.GT); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.GT, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.GT); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.GT, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.GT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareLEMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.LE, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.LE); testCompareMaskNotShort(S_SPECIES, VectorOperators.LE, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.LE); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.LE, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.LE); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.LE, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.LE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareGEMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.GE, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.GE); testCompareMaskNotShort(S_SPECIES, VectorOperators.GE, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.GE); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.GE, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.GE); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.GE, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.GE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareULTMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.ULT, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.ULT); testCompareMaskNotShort(S_SPECIES, VectorOperators.ULT, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.ULT); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.ULT, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.ULT); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.ULT, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.ULT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareUGTMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.UGT, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.UGT); testCompareMaskNotShort(S_SPECIES, VectorOperators.UGT, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.UGT); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.UGT, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.UGT); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.UGT, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.UGT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareULEMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.ULE, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.ULE); testCompareMaskNotShort(S_SPECIES, VectorOperators.ULE, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.ULE); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.ULE, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.ULE); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.ULE, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.ULE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareUGEMaskNotShort() { testCompareMaskNotShort(S_SPECIES, VectorOperators.UGE, (m) -> { return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.UGE); testCompareMaskNotShort(S_SPECIES, VectorOperators.UGE, (m) -> { return S_SPECIES.maskAll(true).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.UGE); testCompareMaskNotShort(ShortVector.SPECIES_64, VectorOperators.UGE, (m) -> { return IntVector.SPECIES_128.maskAll(true).xor(m.cast(IntVector.SPECIES_128)); }); verifyResultsShort(ShortVector.SPECIES_64, VectorOperators.UGE); testCompareMaskNotShort(ShortVector.SPECIES_128, VectorOperators.UGE, (m) -> { return m.cast(ByteVector.SPECIES_64).not(); }); verifyResultsShort(ShortVector.SPECIES_128, VectorOperators.UGE); } // Int tests @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.EQ, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.EQ); testCompareMaskNotInt(I_SPECIES, VectorOperators.EQ, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.EQ); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.EQ, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.EQ); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.EQ, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.EQ); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.NE, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.NE); testCompareMaskNotInt(I_SPECIES, VectorOperators.NE, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.NE); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.NE, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.NE); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.NE, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareLTMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.LT, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.LT); testCompareMaskNotInt(I_SPECIES, VectorOperators.LT, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.LT); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.LT, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.LT); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.LT, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.LT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareGTMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.GT, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.GT); testCompareMaskNotInt(I_SPECIES, VectorOperators.GT, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.GT); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.GT, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.GT); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.GT, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.GT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareLEMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.LE, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.LE); testCompareMaskNotInt(I_SPECIES, VectorOperators.LE, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.LE); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.LE, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.LE); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.LE, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.LE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareGEMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.GE, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.GE); testCompareMaskNotInt(I_SPECIES, VectorOperators.GE, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.GE); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.GE, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.GE); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.GE, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.GE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareULTMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.ULT, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.ULT); testCompareMaskNotInt(I_SPECIES, VectorOperators.ULT, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.ULT); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.ULT, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.ULT); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.ULT, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.ULT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareUGTMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.UGT, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.UGT); testCompareMaskNotInt(I_SPECIES, VectorOperators.UGT, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.UGT); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.UGT, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.UGT); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.UGT, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.UGT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareULEMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.ULE, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.ULE); testCompareMaskNotInt(I_SPECIES, VectorOperators.ULE, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.ULE); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.ULE, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.ULE); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.ULE, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.ULE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 2", IRNode.VECTOR_MASK_CMP, "= 4" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareUGEMaskNotInt() { testCompareMaskNotInt(I_SPECIES, VectorOperators.UGE, (m) -> { return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.UGE); testCompareMaskNotInt(I_SPECIES, VectorOperators.UGE, (m) -> { return I_SPECIES.maskAll(true).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.UGE); testCompareMaskNotInt(I_SPECIES_FOR_CAST, VectorOperators.UGE, (m) -> { return L_SPECIES_FOR_CAST.maskAll(true).xor(m.cast(L_SPECIES_FOR_CAST)); }); verifyResultsInt(I_SPECIES_FOR_CAST, VectorOperators.UGE); testCompareMaskNotInt(IntVector.SPECIES_128, VectorOperators.UGE, (m) -> { return m.cast(ShortVector.SPECIES_64).not(); }); verifyResultsInt(IntVector.SPECIES_128, VectorOperators.UGE); } // Long tests @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.EQ, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.EQ); testCompareMaskNotLong(L_SPECIES, VectorOperators.EQ, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.EQ); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.EQ, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.EQ); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.NE, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.NE); testCompareMaskNotLong(L_SPECIES, VectorOperators.NE, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.NE); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.NE, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareLTMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.LT, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.LT); testCompareMaskNotLong(L_SPECIES, VectorOperators.LT, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.LT); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.LT, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.LT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareGTMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.GT, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.GT); testCompareMaskNotLong(L_SPECIES, VectorOperators.GT, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.GT); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.GT, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.GT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareLEMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.LE, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.LE); testCompareMaskNotLong(L_SPECIES, VectorOperators.LE, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.LE); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.LE, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.LE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareGEMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.GE, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.GE); testCompareMaskNotLong(L_SPECIES, VectorOperators.GE, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.GE); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.GE, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.GE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareULTMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.ULT, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.ULT); testCompareMaskNotLong(L_SPECIES, VectorOperators.ULT, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.ULT); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.ULT, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.ULT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareUGTMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.UGT, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.UGT); testCompareMaskNotLong(L_SPECIES, VectorOperators.UGT, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.UGT); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.UGT, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.UGT); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareULEMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.ULE, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.ULE); testCompareMaskNotLong(L_SPECIES, VectorOperators.ULE, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.ULE); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.ULE, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.ULE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CAST, "= 1", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareUGEMaskNotLong() { testCompareMaskNotLong(L_SPECIES, VectorOperators.UGE, (m) -> { return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.UGE); testCompareMaskNotLong(L_SPECIES, VectorOperators.UGE, (m) -> { return L_SPECIES.maskAll(true).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.UGE); testCompareMaskNotLong(L_SPECIES_FOR_CAST, VectorOperators.UGE, (m) -> { return m.cast(I_SPECIES_FOR_CAST).not(); }); verifyResultsLong(L_SPECIES_FOR_CAST, VectorOperators.UGE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotFloat() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fb, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fb); testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fb, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fb); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotFloat() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fb, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fb); testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fb, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fb); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotFloatNaN() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fnan, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fnan); testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fnan, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fnan); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotFloatNaN() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fnan, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fnan); testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fnan, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fnan); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotFloatPositiveInfinity() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fpinf, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fpinf); testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fpinf, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fpinf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotFloatPositiveInfinity() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fpinf, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fpinf); testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fpinf, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fpinf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareEQMaskNotFloatNegativeInfinity() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fninf, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fninf); testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fninf, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fninf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx", "true", "rvv", "true" }) public static void testCompareNEMaskNotFloatNegativeInfinity() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fninf, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fninf); testCompareMaskNotFloat(F_SPECIES, VectorOperators.NE, fa, fninf, (m) -> { return F_SPECIES.maskAll(true).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fninf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotDouble() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, db, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, db); testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, db, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, db); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotDouble() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, db, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, db); testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, db, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, db); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotDoubleNaN() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dnan, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dnan); testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dnan, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dnan); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotDoubleNaN() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dnan, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dnan); testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dnan, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dnan); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotDoublePositiveInfinity() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dpinf, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dpinf); testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dpinf, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dpinf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotDoublePositiveInfinity() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dpinf, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dpinf); testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dpinf, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dpinf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareEQMaskNotDoubleNegativeInfinity() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dninf, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dninf); testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, dninf, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, dninf); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 0", IRNode.XOR_V, "= 0", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "asimd", "true", "avx2", "true", "rvv", "true" }) public static void testCompareNEMaskNotDoubleNegativeInfinity() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dninf, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dninf); testCompareMaskNotDouble(D_SPECIES, VectorOperators.NE, da, dninf, (m) -> { return D_SPECIES.maskAll(true).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, dninf); } // negative tests @Test @IR(counts = { IRNode.XOR_V_MASK, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotByteNegative() { testCompareMaskNotByte(B_SPECIES, VectorOperators.EQ, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsByte(B_SPECIES, VectorOperators.EQ); // One of the operands of XOR is not all ones vector. testCompareMaskNotByte(B_SPECIES, VectorOperators.EQ, (m) -> { return B_SPECIES.maskAll(false).xor(m); }); verifyResultsByte(B_SPECIES, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotShortNegative() { testCompareMaskNotShort(S_SPECIES, VectorOperators.EQ, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsShort(S_SPECIES, VectorOperators.EQ); // One of the operands of XOR is not all ones vector. testCompareMaskNotShort(S_SPECIES, VectorOperators.EQ, (m) -> { return S_SPECIES.maskAll(false).xor(m); }); verifyResultsShort(S_SPECIES, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotIntNegative() { testCompareMaskNotInt(I_SPECIES, VectorOperators.EQ, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsInt(I_SPECIES, VectorOperators.EQ); // One of the operands of XOR is not all ones vector. testCompareMaskNotInt(I_SPECIES, VectorOperators.EQ, (m) -> { return I_SPECIES.maskAll(false).xor(m); }); verifyResultsInt(I_SPECIES, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 2", IRNode.VECTOR_MASK_CMP, "= 2" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotLongNegative() { testCompareMaskNotLong(L_SPECIES, VectorOperators.EQ, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsLong(L_SPECIES, VectorOperators.EQ); // One of the operands of XOR is not all ones vector. testCompareMaskNotLong(L_SPECIES, VectorOperators.EQ, (m) -> { return L_SPECIES.maskAll(false).xor(m); }); verifyResultsLong(L_SPECIES, VectorOperators.NE); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotFloatNegative() { testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fb, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.EQ, fa, fb); // One of the operands of XOR is not all ones vector. testCompareMaskNotFloat(F_SPECIES, VectorOperators.EQ, fa, fb, (m) -> { return F_SPECIES.maskAll(false).xor(m); }); verifyResultsFloat(F_SPECIES, VectorOperators.NE, fa, fb); // Float vectors use the LT comparison. testCompareMaskNotFloat(F_SPECIES, VectorOperators.LT, fa, fb, (m) -> { return m.not(); }); verifyResultsFloat(F_SPECIES, VectorOperators.LT, fa, fb); } @Test @IR(counts = { IRNode.XOR_V_MASK, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureOr = { "sve", "true", "avx512", "true", "rvv", "true" }) @IR(counts = { IRNode.XOR_V, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureAnd = { "asimd", "true", "sve", "false" }) @IR(counts = { IRNode.XOR_V, "= 3", IRNode.VECTOR_MASK_CMP, "= 3" }, applyIfCPUFeatureAnd = { "avx2", "true" }) public static void testCompareMaskNotDoubleNegative() { testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, db, (m) -> { // The vector mask is used multiple times. ic[0] = m.trueCount(); return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.EQ, da, db); // One of the operands of XOR is not all ones vector. testCompareMaskNotDouble(D_SPECIES, VectorOperators.EQ, da, db, (m) -> { return D_SPECIES.maskAll(false).xor(m); }); verifyResultsDouble(D_SPECIES, VectorOperators.NE, da, db); // Double vectors use the LT comparison. testCompareMaskNotDouble(D_SPECIES, VectorOperators.LT, da, db, (m) -> { return m.not(); }); verifyResultsDouble(D_SPECIES, VectorOperators.LT, da, db); } public static void main(String[] args) { TestFramework testFramework = new TestFramework(); testFramework.setDefaultWarmup(5000) .addFlags("--add-modules=jdk.incubator.vector") .start(); } }