/* * Copyright (c) 2021, 2023, Arm Limited. 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.ir_framework.*; import java.util.Random; import jdk.incubator.vector.ByteVector; import jdk.incubator.vector.DoubleVector; import jdk.incubator.vector.FloatVector; import jdk.incubator.vector.IntVector; import jdk.incubator.vector.LongVector; import jdk.incubator.vector.ShortVector; import jdk.incubator.vector.VectorMask; import jdk.test.lib.Asserts; import jdk.test.lib.Utils; /** * @test * @bug 8273264 8292898 * @key randomness * @library /test/lib / * @summary Unify vector mask cast and add missing rules for VectorMaskCast * @modules jdk.incubator.vector * * @run driver compiler.vectorapi.VectorMaskCastTest */ // Current vector mask cast test cases at test/jdk/jdk/incubator/vector/*ConversionTests.java // could not be intrinsfied, hence not able to verify compiler codegen, see [1]. As a // supplement, we add more tests for vector mask cast operations, which could be intrinsified // by c2 compiler to generate vector/mask instructions on supported targets. // // [1] https://bugs.openjdk.org/browse/JDK-8259610 public class VectorMaskCastTest { private static final Random rd = Utils.getRandomInstance(); private static final boolean[] mask_arr; static { mask_arr = new boolean[64]; // Making sure atleast one of the elements in the mask is "true" to ensure the result of trueCount() // before and after the cast can be accurately verified. mask_arr[0] = true; for (int i = 1; i < 64; i++) { mask_arr[i] = rd.nextBoolean(); } } // Byte @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testByte64ToShort128(VectorMask v) { return v.cast(ShortVector.SPECIES_128); } @Run(test = "testByte64ToShort128") public static void testByte64ToShort128_runner() { VectorMask mByte64 = VectorMask.fromArray(ByteVector.SPECIES_64, mask_arr, 0); VectorMask res = testByte64ToShort128(mByte64); Asserts.assertEquals(res.toString(), mByte64.toString()); Asserts.assertEquals(res.trueCount(), mByte64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testByte64ToInt256(VectorMask v) { return v.cast(IntVector.SPECIES_256); } @Run(test = "testByte64ToInt256") public static void testByte64ToInt256_runner() { VectorMask mByte64 = VectorMask.fromArray(ByteVector.SPECIES_64, mask_arr, 0); VectorMask res = testByte64ToInt256(mByte64); Asserts.assertEquals(res.toString(), mByte64.toString()); Asserts.assertEquals(res.trueCount(), mByte64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testByte64ToFloat256(VectorMask v) { return v.cast(FloatVector.SPECIES_256); } @Run(test = "testByte64ToFloat256") public static void testByte64ToFloat256_runner() { VectorMask mByte64 = VectorMask.fromArray(ByteVector.SPECIES_64, mask_arr, 0); VectorMask res = testByte64ToFloat256(mByte64); Asserts.assertEquals(res.toString(), mByte64.toString()); Asserts.assertEquals(res.trueCount(), mByte64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testByte64ToLong512(VectorMask v) { return v.cast(LongVector.SPECIES_512); } @Run(test = "testByte64ToLong512") public static void testByte64ToLong512_runner() { VectorMask mByte64 = VectorMask.fromArray(ByteVector.SPECIES_64, mask_arr, 0); VectorMask res = testByte64ToLong512(mByte64); Asserts.assertEquals(res.toString(), mByte64.toString()); Asserts.assertEquals(res.trueCount(), mByte64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testByte64ToDouble512(VectorMask v) { return v.cast(DoubleVector.SPECIES_512); } @Run(test = "testByte64ToDouble512") public static void testByte64ToDouble512_runner() { VectorMask mByte64 = VectorMask.fromArray(ByteVector.SPECIES_64, mask_arr, 0); VectorMask res = testByte64ToDouble512(mByte64); Asserts.assertEquals(res.toString(), mByte64.toString()); Asserts.assertEquals(res.trueCount(), mByte64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testByte128ToShort256(VectorMask v) { return v.cast(ShortVector.SPECIES_256); } @Run(test = "testByte128ToShort256") public static void testByte128ToShort256_runner() { VectorMask mByte128 = VectorMask.fromArray(ByteVector.SPECIES_128, mask_arr, 0); VectorMask res = testByte128ToShort256(mByte128); Asserts.assertEquals(res.toString(), mByte128.toString()); Asserts.assertEquals(res.trueCount(), mByte128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testByte128ToInt512(VectorMask v) { return v.cast(IntVector.SPECIES_512); } @Run(test = "testByte128ToInt512") public static void testByte128ToInt512_runner() { VectorMask mByte128 = VectorMask.fromArray(ByteVector.SPECIES_128, mask_arr, 0); VectorMask res = testByte128ToInt512(mByte128); Asserts.assertEquals(res.toString(), mByte128.toString()); Asserts.assertEquals(res.trueCount(), mByte128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testByte128ToFloat512(VectorMask v) { return v.cast(FloatVector.SPECIES_512); } @Run(test = "testByte128ToFloat512") public static void testByte128ToFloat512_runner() { VectorMask mByte128 = VectorMask.fromArray(ByteVector.SPECIES_128, mask_arr, 0); VectorMask res = testByte128ToFloat512(mByte128); Asserts.assertEquals(res.toString(), mByte128.toString()); Asserts.assertEquals(res.trueCount(), mByte128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testByte256ToShort512(VectorMask v) { return v.cast(ShortVector.SPECIES_512); } @Run(test = "testByte256ToShort512") public static void testByte256ToShort512_runner() { VectorMask mByte256 = VectorMask.fromArray(ByteVector.SPECIES_256, mask_arr, 0); VectorMask res = testByte256ToShort512(mByte256); Asserts.assertEquals(res.toString(), mByte256.toString()); Asserts.assertEquals(res.trueCount(), mByte256.trueCount()); } // Short @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testShort64ToInt128(VectorMask v) { return v.cast(IntVector.SPECIES_128); } @Run(test = "testShort64ToInt128") public static void testShort64ToInt128_runner() { VectorMask mShort64 = VectorMask.fromArray(ShortVector.SPECIES_64, mask_arr, 0); VectorMask res = testShort64ToInt128(mShort64); Asserts.assertEquals(res.toString(), mShort64.toString()); Asserts.assertEquals(res.trueCount(), mShort64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testShort64ToFloat128(VectorMask v) { return v.cast(FloatVector.SPECIES_128); } @Run(test = "testShort64ToFloat128") public static void testShort64ToFloat128_runner() { VectorMask mShort64 = VectorMask.fromArray(ShortVector.SPECIES_64, mask_arr, 0); VectorMask res = testShort64ToFloat128(mShort64); Asserts.assertEquals(res.toString(), mShort64.toString()); Asserts.assertEquals(res.trueCount(), mShort64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testShort64ToLong256(VectorMask v) { return v.cast(LongVector.SPECIES_256); } @Run(test = "testShort64ToLong256") public static void testShort64ToLong256_runner() { VectorMask mShort64 = VectorMask.fromArray(ShortVector.SPECIES_64, mask_arr, 0); VectorMask res = testShort64ToLong256(mShort64); Asserts.assertEquals(res.toString(), mShort64.toString()); Asserts.assertEquals(res.trueCount(), mShort64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testShort64ToDouble256(VectorMask v) { return v.cast(DoubleVector.SPECIES_256); } @Run(test = "testShort64ToDouble256") public static void testShort64ToDouble256_runner() { VectorMask mShort64 = VectorMask.fromArray(ShortVector.SPECIES_64, mask_arr, 0); VectorMask res = testShort64ToDouble256(mShort64); Asserts.assertEquals(res.toString(), mShort64.toString()); Asserts.assertEquals(res.trueCount(), mShort64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testShort128ToByte64(VectorMask v) { return v.cast(ByteVector.SPECIES_64); } @Run(test = "testShort128ToByte64") public static void testShort128ToByte64_runner() { VectorMask mShort128 = VectorMask.fromArray(ShortVector.SPECIES_128, mask_arr, 0); VectorMask res = testShort128ToByte64(mShort128); Asserts.assertEquals(res.toString(), mShort128.toString()); Asserts.assertEquals(res.trueCount(), mShort128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testShort128ToInt256(VectorMask v) { return v.cast(IntVector.SPECIES_256); } @Run(test = "testShort128ToInt256") public static void testShort128ToInt256_runner() { VectorMask mShort128 = VectorMask.fromArray(ShortVector.SPECIES_128, mask_arr, 0); VectorMask res = testShort128ToInt256(mShort128); Asserts.assertEquals(res.toString(), mShort128.toString()); Asserts.assertEquals(res.trueCount(), mShort128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testShort128ToFloat256(VectorMask v) { return v.cast(FloatVector.SPECIES_256); } @Run(test = "testShort128ToFloat256") public static void testShort128ToFloat256_runner() { VectorMask mShort128 = VectorMask.fromArray(ShortVector.SPECIES_128, mask_arr, 0); VectorMask res = testShort128ToFloat256(mShort128); Asserts.assertEquals(res.toString(), mShort128.toString()); Asserts.assertEquals(res.trueCount(), mShort128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testShort128ToLong512(VectorMask v) { return v.cast(LongVector.SPECIES_512); } @Run(test = "testShort128ToLong512") public static void testShort128ToLong512_runner() { VectorMask mShort128 = VectorMask.fromArray(ShortVector.SPECIES_128, mask_arr, 0); VectorMask res = testShort128ToLong512(mShort128); Asserts.assertEquals(res.toString(), mShort128.toString()); Asserts.assertEquals(res.trueCount(), mShort128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testShort128ToDouble512(VectorMask v) { return v.cast(DoubleVector.SPECIES_512); } @Run(test = "testShort128ToDouble512") public static void testShort128ToDouble512_runner() { VectorMask mShort128 = VectorMask.fromArray(ShortVector.SPECIES_128, mask_arr, 0); VectorMask res = testShort128ToDouble512(mShort128); Asserts.assertEquals(res.toString(), mShort128.toString()); Asserts.assertEquals(res.trueCount(), mShort128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testShort256ToByte128(VectorMask v) { return v.cast(ByteVector.SPECIES_128); } @Run(test = "testShort256ToByte128") public static void testShort256ToByte128_runner() { VectorMask mShort256 = VectorMask.fromArray(ShortVector.SPECIES_256, mask_arr, 0); VectorMask res = testShort256ToByte128(mShort256); Asserts.assertEquals(res.toString(), mShort256.toString()); Asserts.assertEquals(res.trueCount(), mShort256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testShort256ToInt512(VectorMask v) { return v.cast(IntVector.SPECIES_512); } @Run(test = "testShort256ToInt512") public static void testShort256ToInt512_runner() { VectorMask mShort256 = VectorMask.fromArray(ShortVector.SPECIES_256, mask_arr, 0); VectorMask res = testShort256ToInt512(mShort256); Asserts.assertEquals(res.toString(), mShort256.toString()); Asserts.assertEquals(res.trueCount(), mShort256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testShort256ToFloat512(VectorMask v) { return v.cast(FloatVector.SPECIES_512); } @Run(test = "testShort256ToFloat512") public static void testShort256ToFloat512_runner() { VectorMask mShort256 = VectorMask.fromArray(ShortVector.SPECIES_256, mask_arr, 0); VectorMask res = testShort256ToFloat512(mShort256); Asserts.assertEquals(res.toString(), mShort256.toString()); Asserts.assertEquals(res.trueCount(), mShort256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testShort512ToByte256(VectorMask v) { return v.cast(ByteVector.SPECIES_256); } @Run(test = "testShort512ToByte256") public static void testShort512ToByte256_runner() { VectorMask mShort512 = VectorMask.fromArray(ShortVector.SPECIES_512, mask_arr, 0); VectorMask res = testShort512ToByte256(mShort512); Asserts.assertEquals(res.toString(), mShort512.toString()); Asserts.assertEquals(res.trueCount(), mShort512.trueCount()); } // Int @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testInt64ToLong128(VectorMask v) { return v.cast(LongVector.SPECIES_128); } @Run(test = "testInt64ToLong128") public static void testInt64ToLong128_runner() { VectorMask mInt64 = VectorMask.fromArray(IntVector.SPECIES_64, mask_arr, 0); VectorMask res = testInt64ToLong128(mInt64); Asserts.assertEquals(res.toString(), mInt64.toString()); Asserts.assertEquals(res.trueCount(), mInt64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testInt64ToDouble128(VectorMask v) { return v.cast(DoubleVector.SPECIES_128); } @Run(test = "testInt64ToDouble128") public static void testInt64ToDouble128_runner() { VectorMask mInt64 = VectorMask.fromArray(IntVector.SPECIES_64, mask_arr, 0); VectorMask res = testInt64ToDouble128(mInt64); Asserts.assertEquals(res.toString(), mInt64.toString()); Asserts.assertEquals(res.trueCount(), mInt64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testInt128ToShort64(VectorMask v) { return v.cast(ShortVector.SPECIES_64); } @Run(test = "testInt128ToShort64") public static void testInt128ToShort64_runner() { VectorMask mInt128 = VectorMask.fromArray(IntVector.SPECIES_128, mask_arr, 0); VectorMask res = testInt128ToShort64(mInt128); Asserts.assertEquals(res.toString(), mInt128.toString()); Asserts.assertEquals(res.trueCount(), mInt128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testInt128ToLong256(VectorMask v) { return v.cast(LongVector.SPECIES_256); } @Run(test = "testInt128ToLong256") public static void testInt128ToLong256_runner() { VectorMask mInt128 = VectorMask.fromArray(IntVector.SPECIES_128, mask_arr, 0); VectorMask res = testInt128ToLong256(mInt128); Asserts.assertEquals(res.toString(), mInt128.toString()); Asserts.assertEquals(res.trueCount(), mInt128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testInt128ToDouble256(VectorMask v) { return v.cast(DoubleVector.SPECIES_256); } @Run(test = "testInt128ToDouble256") public static void testInt128ToDouble256_runner() { VectorMask mInt128 = VectorMask.fromArray(IntVector.SPECIES_128, mask_arr, 0); VectorMask res = testInt128ToDouble256(mInt128); Asserts.assertEquals(res.toString(), mInt128.toString()); Asserts.assertEquals(res.trueCount(), mInt128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testInt256ToShort128(VectorMask v) { return v.cast(ShortVector.SPECIES_128); } @Run(test = "testInt256ToShort128") public static void testInt256ToShort128_runner() { VectorMask mInt256 = VectorMask.fromArray(IntVector.SPECIES_256, mask_arr, 0); VectorMask res = testInt256ToShort128(mInt256); Asserts.assertEquals(res.toString(), mInt256.toString()); Asserts.assertEquals(res.trueCount(), mInt256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testInt256ToByte64(VectorMask v) { return v.cast(ByteVector.SPECIES_64); } @Run(test = "testInt256ToByte64") public static void testInt256ToByte64_runner() { VectorMask mInt256 = VectorMask.fromArray(IntVector.SPECIES_256, mask_arr, 0); VectorMask res = testInt256ToByte64(mInt256); Asserts.assertEquals(res.toString(), mInt256.toString()); Asserts.assertEquals(res.trueCount(), mInt256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testInt256ToLong512(VectorMask v) { return v.cast(LongVector.SPECIES_512); } @Run(test = "testInt256ToLong512") public static void testInt256ToLong512_runner() { VectorMask mInt256 = VectorMask.fromArray(IntVector.SPECIES_256, mask_arr, 0); VectorMask res = testInt256ToLong512(mInt256); Asserts.assertEquals(res.toString(), mInt256.toString()); Asserts.assertEquals(res.trueCount(), mInt256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testInt256ToDouble512(VectorMask v) { return v.cast(DoubleVector.SPECIES_512); } @Run(test = "testInt256ToDouble512") public static void testInt256ToDouble512_runner() { VectorMask mInt256 = VectorMask.fromArray(IntVector.SPECIES_256, mask_arr, 0); VectorMask res = testInt256ToDouble512(mInt256); Asserts.assertEquals(res.toString(), mInt256.toString()); Asserts.assertEquals(res.trueCount(), mInt256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testInt512ToShort256(VectorMask v) { return v.cast(ShortVector.SPECIES_256); } @Run(test = "testInt512ToShort256") public static void testInt512ToShort256_runner() { VectorMask mInt512 = VectorMask.fromArray(IntVector.SPECIES_512, mask_arr, 0); VectorMask res = testInt512ToShort256(mInt512); Asserts.assertEquals(res.toString(), mInt512.toString()); Asserts.assertEquals(res.trueCount(), mInt512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testInt512ToByte128(VectorMask v) { return v.cast(ByteVector.SPECIES_128); } @Run(test = "testInt512ToByte128") public static void testInt512ToByte128_runner() { VectorMask mInt512 = VectorMask.fromArray(IntVector.SPECIES_512, mask_arr, 0); VectorMask res = testInt512ToByte128(mInt512); Asserts.assertEquals(res.toString(), mInt512.toString()); Asserts.assertEquals(res.trueCount(), mInt512.trueCount()); } // Float @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testFloat64ToLong128(VectorMask v) { return v.cast(LongVector.SPECIES_128); } @Run(test = "testFloat64ToLong128") public static void testFloat64ToLong128_runner() { VectorMask mFloat64 = VectorMask.fromArray(FloatVector.SPECIES_64, mask_arr, 0); VectorMask res = testFloat64ToLong128(mFloat64); Asserts.assertEquals(res.toString(), mFloat64.toString()); Asserts.assertEquals(res.trueCount(), mFloat64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testFloat64ToDouble128(VectorMask v) { return v.cast(DoubleVector.SPECIES_128); } @Run(test = "testFloat64ToDouble128") public static void testFloat64ToDouble128_runner() { VectorMask mFloat64 = VectorMask.fromArray(FloatVector.SPECIES_64, mask_arr, 0); VectorMask res = testFloat64ToDouble128(mFloat64); Asserts.assertEquals(res.toString(), mFloat64.toString()); Asserts.assertEquals(res.trueCount(), mFloat64.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public static VectorMask testFloat128ToShort64(VectorMask v) { return v.cast(ShortVector.SPECIES_64); } @Run(test = "testFloat128ToShort64") public static void testFloat128ToShort64_runner() { VectorMask mFloat128 = VectorMask.fromArray(FloatVector.SPECIES_128, mask_arr, 0); VectorMask res = testFloat128ToShort64(mFloat128); Asserts.assertEquals(res.toString(), mFloat128.toString()); Asserts.assertEquals(res.trueCount(), mFloat128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testFloat128ToLong256(VectorMask v) { return v.cast(LongVector.SPECIES_256); } @Run(test = "testFloat128ToLong256") public static void testFloat128ToLong256_runner() { VectorMask mFloat128 = VectorMask.fromArray(FloatVector.SPECIES_128, mask_arr, 0); VectorMask res = testFloat128ToLong256(mFloat128); Asserts.assertEquals(res.toString(), mFloat128.toString()); Asserts.assertEquals(res.trueCount(), mFloat128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testFloat128ToDouble256(VectorMask v) { return v.cast(DoubleVector.SPECIES_256); } @Run(test = "testFloat128ToDouble256") public static void testFloat128ToDouble256_runner() { VectorMask mFloat128 = VectorMask.fromArray(FloatVector.SPECIES_128, mask_arr, 0); VectorMask res = testFloat128ToDouble256(mFloat128); Asserts.assertEquals(res.toString(), mFloat128.toString()); Asserts.assertEquals(res.trueCount(), mFloat128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testFloat256ToShort128(VectorMask v) { return v.cast(ShortVector.SPECIES_128); } @Run(test = "testFloat256ToShort128") public static void testFloat256ToShort128_runner() { VectorMask mFloat256 = VectorMask.fromArray(FloatVector.SPECIES_256, mask_arr, 0); VectorMask res = testFloat256ToShort128(mFloat256); Asserts.assertEquals(res.toString(), mFloat256.toString()); Asserts.assertEquals(res.trueCount(), mFloat256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testFloat256ToByte64(VectorMask v) { return v.cast(ByteVector.SPECIES_64); } @Run(test = "testFloat256ToByte64") public static void testFloat256ToByte64_runner() { VectorMask mFloat256 = VectorMask.fromArray(FloatVector.SPECIES_256, mask_arr, 0); VectorMask res = testFloat256ToByte64(mFloat256); Asserts.assertEquals(res.toString(), mFloat256.toString()); Asserts.assertEquals(res.trueCount(), mFloat256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testFloat256ToLong512(VectorMask v) { return v.cast(LongVector.SPECIES_512); } @Run(test = "testFloat256ToLong512") public static void testFloat256ToLong512_runner() { VectorMask mFloat256 = VectorMask.fromArray(FloatVector.SPECIES_256, mask_arr, 0); VectorMask res = testFloat256ToLong512(mFloat256); Asserts.assertEquals(res.toString(), mFloat256.toString()); Asserts.assertEquals(res.trueCount(), mFloat256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testFloat256ToDouble512(VectorMask v) { return v.cast(DoubleVector.SPECIES_512); } @Run(test = "testFloat256ToDouble512") public static void testFloat256ToDouble512_runner() { VectorMask mFloat256 = VectorMask.fromArray(FloatVector.SPECIES_256, mask_arr, 0); VectorMask res = testFloat256ToDouble512(mFloat256); Asserts.assertEquals(res.toString(), mFloat256.toString()); Asserts.assertEquals(res.trueCount(), mFloat256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testFloat512ToShort256(VectorMask v) { return v.cast(ShortVector.SPECIES_256); } @Run(test = "testFloat512ToShort256") public static void testFloat512ToShort256_runner() { VectorMask mFloat512 = VectorMask.fromArray(FloatVector.SPECIES_512, mask_arr, 0); VectorMask res = testFloat512ToShort256(mFloat512); Asserts.assertEquals(res.toString(), mFloat512.toString()); Asserts.assertEquals(res.trueCount(), mFloat512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testFloat512ToByte128(VectorMask v) { return v.cast(ByteVector.SPECIES_128); } @Run(test = "testFloat512ToByte128") public static void testFloat512ToByte128_runner() { VectorMask mFloat512 = VectorMask.fromArray(FloatVector.SPECIES_512, mask_arr, 0); VectorMask res = testFloat512ToByte128(mFloat512); Asserts.assertEquals(res.toString(), mFloat512.toString()); Asserts.assertEquals(res.trueCount(), mFloat512.trueCount()); } // Long @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testLong128ToInt64(VectorMask v) { return v.cast(IntVector.SPECIES_64); } @Run(test = "testLong128ToInt64") public static void testLong128ToInt64_runner() { VectorMask mLong128 = VectorMask.fromArray(LongVector.SPECIES_128, mask_arr, 0); VectorMask res = testLong128ToInt64(mLong128); Asserts.assertEquals(res.toString(), mLong128.toString()); Asserts.assertEquals(res.trueCount(), mLong128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testLong128ToFloat64(VectorMask v) { return v.cast(FloatVector.SPECIES_64); } @Run(test = "testLong128ToFloat64") public static void testLong128ToFloat64_runner() { VectorMask mLong128 = VectorMask.fromArray(LongVector.SPECIES_128, mask_arr, 0); VectorMask res = testLong128ToFloat64(mLong128); Asserts.assertEquals(res.toString(), mLong128.toString()); Asserts.assertEquals(res.trueCount(), mLong128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testLong256ToInt128(VectorMask v) { return v.cast(IntVector.SPECIES_128); } @Run(test = "testLong256ToInt128") public static void testLong256ToInt128_runner() { VectorMask mLong256 = VectorMask.fromArray(LongVector.SPECIES_256, mask_arr, 0); VectorMask res = testLong256ToInt128(mLong256); Asserts.assertEquals(res.toString(), mLong256.toString()); Asserts.assertEquals(res.trueCount(), mLong256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testLong256ToFloat128(VectorMask v) { return v.cast(FloatVector.SPECIES_128); } @Run(test = "testLong256ToFloat128") public static void testLong256ToFloat128_runner() { VectorMask mLong256 = VectorMask.fromArray(LongVector.SPECIES_256, mask_arr, 0); VectorMask res = testLong256ToFloat128(mLong256); Asserts.assertEquals(res.toString(), mLong256.toString()); Asserts.assertEquals(res.trueCount(), mLong256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testLong256ToShort64(VectorMask v) { return v.cast(ShortVector.SPECIES_64); } @Run(test = "testLong256ToShort64") public static void testLong256ToShort64_runner() { VectorMask mLong256 = VectorMask.fromArray(LongVector.SPECIES_256, mask_arr, 0); VectorMask res = testLong256ToShort64(mLong256); Asserts.assertEquals(res.toString(), mLong256.toString()); Asserts.assertEquals(res.trueCount(), mLong256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testLong512ToInt256(VectorMask v) { return v.cast(IntVector.SPECIES_256); } @Run(test = "testLong512ToInt256") public static void testLong512ToInt256_runner() { VectorMask mLong512 = VectorMask.fromArray(LongVector.SPECIES_512, mask_arr, 0); VectorMask res = testLong512ToInt256(mLong512); Asserts.assertEquals(res.toString(), mLong512.toString()); Asserts.assertEquals(res.trueCount(), mLong512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testLong512ToFloat256(VectorMask v) { return v.cast(FloatVector.SPECIES_256); } @Run(test = "testLong512ToFloat256") public static void testLong512ToFloat256_runner() { VectorMask mLong512 = VectorMask.fromArray(LongVector.SPECIES_512, mask_arr, 0); VectorMask res = testLong512ToFloat256(mLong512); Asserts.assertEquals(res.toString(), mLong512.toString()); Asserts.assertEquals(res.trueCount(), mLong512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testLong512ToShort128(VectorMask v) { return v.cast(ShortVector.SPECIES_128); } @Run(test = "testLong512ToShort128") public static void testLong512ToShort128_runner() { VectorMask mLong512 = VectorMask.fromArray(LongVector.SPECIES_512, mask_arr, 0); VectorMask res = testLong512ToShort128(mLong512); Asserts.assertEquals(res.toString(), mLong512.toString()); Asserts.assertEquals(res.trueCount(), mLong512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testLong512ToByte64(VectorMask v) { return v.cast(ByteVector.SPECIES_64); } @Run(test = "testLong512ToByte64") public static void testLong512ToByte64_runner() { VectorMask mLong512 = VectorMask.fromArray(LongVector.SPECIES_512, mask_arr, 0); VectorMask res = testLong512ToByte64(mLong512); Asserts.assertEquals(res.toString(), mLong512.toString()); Asserts.assertEquals(res.trueCount(), mLong512.trueCount()); } // Double @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testDouble128ToInt64(VectorMask v) { return v.cast(IntVector.SPECIES_64); } @Run(test = "testDouble128ToInt64") public static void testDouble128ToInt64_runner() { VectorMask mDouble128 = VectorMask.fromArray(DoubleVector.SPECIES_128, mask_arr, 0); VectorMask res = testDouble128ToInt64(mDouble128); Asserts.assertEquals(res.toString(), mDouble128.toString()); Asserts.assertEquals(res.trueCount(), mDouble128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"asimd", "true"}) public static VectorMask testDouble128ToFloat64(VectorMask v) { return v.cast(FloatVector.SPECIES_64); } @Run(test = "testDouble128ToFloat64") public static void testDouble128ToFloat64_runner() { VectorMask mDouble128 = VectorMask.fromArray(DoubleVector.SPECIES_128, mask_arr, 0); VectorMask res = testDouble128ToFloat64(mDouble128); Asserts.assertEquals(res.toString(), mDouble128.toString()); Asserts.assertEquals(res.trueCount(), mDouble128.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testDouble256ToInt128(VectorMask v) { return v.cast(IntVector.SPECIES_128); } @Run(test = "testDouble256ToInt128") public static void testDouble256ToInt128_runner() { VectorMask mDouble256 = VectorMask.fromArray(DoubleVector.SPECIES_256, mask_arr, 0); VectorMask res = testDouble256ToInt128(mDouble256); Asserts.assertEquals(res.toString(), mDouble256.toString()); Asserts.assertEquals(res.trueCount(), mDouble256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testDouble256ToFloat128(VectorMask v) { return v.cast(FloatVector.SPECIES_128); } @Run(test = "testDouble256ToFloat128") public static void testDouble256ToFloat128_runner() { VectorMask mDouble256 = VectorMask.fromArray(DoubleVector.SPECIES_256, mask_arr, 0); VectorMask res = testDouble256ToFloat128(mDouble256); Asserts.assertEquals(res.toString(), mDouble256.toString()); Asserts.assertEquals(res.trueCount(), mDouble256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx2", "true"}) public static VectorMask testDouble256ToShort64(VectorMask v) { return v.cast(ShortVector.SPECIES_64); } @Run(test = "testDouble256ToShort64") public static void testDouble256ToShort64_runner() { VectorMask mDouble256 = VectorMask.fromArray(DoubleVector.SPECIES_256, mask_arr, 0); VectorMask res = testDouble256ToShort64(mDouble256); Asserts.assertEquals(res.toString(), mDouble256.toString()); Asserts.assertEquals(res.trueCount(), mDouble256.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testDouble512ToInt256(VectorMask v) { return v.cast(IntVector.SPECIES_256); } @Run(test = "testDouble512ToInt256") public static void testDouble512ToInt256_runner() { VectorMask mDouble512 = VectorMask.fromArray(DoubleVector.SPECIES_512, mask_arr, 0); VectorMask res = testDouble512ToInt256(mDouble512); Asserts.assertEquals(res.toString(), mDouble512.toString()); Asserts.assertEquals(res.trueCount(), mDouble512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testDouble512ToFloat256(VectorMask v) { return v.cast(FloatVector.SPECIES_256); } @Run(test = "testDouble512ToFloat256") public static void testDouble512ToFloat256_runner() { VectorMask mDouble512 = VectorMask.fromArray(DoubleVector.SPECIES_512, mask_arr, 0); VectorMask res = testDouble512ToFloat256(mDouble512); Asserts.assertEquals(res.toString(), mDouble512.toString()); Asserts.assertEquals(res.trueCount(), mDouble512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testDouble512ToShort128(VectorMask v) { return v.cast(ShortVector.SPECIES_128); } @Run(test = "testDouble512ToShort128") public static void testDouble512ToShort128_runner() { VectorMask mDouble512 = VectorMask.fromArray(DoubleVector.SPECIES_512, mask_arr, 0); VectorMask res = testDouble512ToShort128(mDouble512); Asserts.assertEquals(res.toString(), mDouble512.toString()); Asserts.assertEquals(res.trueCount(), mDouble512.trueCount()); } @Test @IR(counts = { IRNode.VECTOR_MASK_CAST, "> 0" }, applyIfCPUFeature = {"avx512vl", "true"}) public static VectorMask testDouble512ToByte64(VectorMask v) { return v.cast(ByteVector.SPECIES_64); } @Run(test = "testDouble512ToByte64") public static void testDouble512ToByte64_runner() { VectorMask mDouble512 = VectorMask.fromArray(DoubleVector.SPECIES_512, mask_arr, 0); VectorMask res = testDouble512ToByte64(mDouble512); Asserts.assertEquals(res.toString(), mDouble512.toString()); Asserts.assertEquals(res.trueCount(), mDouble512.trueCount()); } public static void main(String[] args) { TestFramework testFramework = new TestFramework(); testFramework.setDefaultWarmup(5000) .addFlags("--add-modules=jdk.incubator.vector") .start(); } }