From ee0d6cd9aedc0d4c4232dccab310de188af4bebc Mon Sep 17 00:00:00 2001 From: Jatin Bhateja Date: Tue, 31 Mar 2026 05:52:16 +0000 Subject: [PATCH] 8378250: C2 VectorAPI : wrong result with MUL reduction at various AVX levels Reviewed-by: epeter --- src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp | 9 +- .../vectorapi/TestMultiplyReductionByte.java | 133 ++++++++++++++++++ .../incubator/vector/ByteVector128Tests.java | 4 + .../incubator/vector/ByteVector256Tests.java | 4 + .../incubator/vector/ByteVector512Tests.java | 4 + .../incubator/vector/ByteVector64Tests.java | 4 + .../incubator/vector/ByteVectorMaxTests.java | 4 + .../vector/DoubleVector128Tests.java | 4 + .../vector/DoubleVector256Tests.java | 4 + .../vector/DoubleVector512Tests.java | 4 + .../incubator/vector/DoubleVector64Tests.java | 4 + .../vector/DoubleVectorMaxTests.java | 4 + .../incubator/vector/FloatVector128Tests.java | 4 + .../incubator/vector/FloatVector256Tests.java | 4 + .../incubator/vector/FloatVector512Tests.java | 4 + .../incubator/vector/FloatVector64Tests.java | 4 + .../incubator/vector/FloatVectorMaxTests.java | 4 + .../incubator/vector/IntVector128Tests.java | 4 + .../incubator/vector/IntVector256Tests.java | 4 + .../incubator/vector/IntVector512Tests.java | 4 + .../incubator/vector/IntVector64Tests.java | 4 + .../incubator/vector/IntVectorMaxTests.java | 4 + .../incubator/vector/LongVector128Tests.java | 4 + .../incubator/vector/LongVector256Tests.java | 4 + .../incubator/vector/LongVector512Tests.java | 4 + .../incubator/vector/LongVector64Tests.java | 4 + .../incubator/vector/LongVectorMaxTests.java | 4 + .../incubator/vector/ShortVector128Tests.java | 4 + .../incubator/vector/ShortVector256Tests.java | 4 + .../incubator/vector/ShortVector512Tests.java | 4 + .../incubator/vector/ShortVector64Tests.java | 4 + .../incubator/vector/ShortVectorMaxTests.java | 4 + .../vector/templates/Unit-header.template | 4 + 33 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/vectorapi/TestMultiplyReductionByte.java diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp index 23b9a77844d..f36c816dd5e 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp @@ -2150,8 +2150,8 @@ void C2_MacroAssembler::mulreduce16B(int opcode, Register dst, Register src1, XM } else { pmovsxbw(vtmp2, src2); reduce8S(opcode, dst, src1, vtmp2, vtmp1, vtmp2); - pshufd(vtmp2, src2, 0x1); - pmovsxbw(vtmp2, src2); + pshufd(vtmp2, src2, 0xe); + pmovsxbw(vtmp2, vtmp2); reduce8S(opcode, dst, dst, vtmp2, vtmp1, vtmp2); } } @@ -2160,7 +2160,7 @@ void C2_MacroAssembler::mulreduce32B(int opcode, Register dst, Register src1, XM if (UseAVX > 2 && VM_Version::supports_avx512bw()) { int vector_len = Assembler::AVX_512bit; vpmovsxbw(vtmp1, src2, vector_len); - reduce32S(opcode, dst, src1, vtmp1, vtmp1, vtmp2); + reduce32S(opcode, dst, src1, vtmp1, vtmp2, vtmp1); } else { assert(UseAVX >= 2,"Should not reach here."); mulreduce16B(opcode, dst, src1, src2, vtmp1, vtmp2); @@ -2207,6 +2207,7 @@ void C2_MacroAssembler::reduce8S(int opcode, Register dst, Register src1, XMMReg } phaddw(vtmp1, src2); } else { + assert_different_registers(src2, vtmp1); pshufd(vtmp1, src2, 0xE); reduce_operation_128(T_SHORT, opcode, vtmp1, src2); } @@ -2219,6 +2220,7 @@ void C2_MacroAssembler::reduce16S(int opcode, Register dst, Register src1, XMMRe vphaddw(vtmp2, src2, src2, vector_len); vpermq(vtmp2, vtmp2, 0xD8, vector_len); } else { + assert_different_registers(src2, vtmp2); vextracti128_high(vtmp2, src2); reduce_operation_128(T_SHORT, opcode, vtmp2, src2); } @@ -2226,6 +2228,7 @@ void C2_MacroAssembler::reduce16S(int opcode, Register dst, Register src1, XMMRe } void C2_MacroAssembler::reduce32S(int opcode, Register dst, Register src1, XMMRegister src2, XMMRegister vtmp1, XMMRegister vtmp2) { + assert_different_registers(src2, vtmp1); int vector_len = Assembler::AVX_256bit; vextracti64x4_high(vtmp1, src2); reduce_operation_256(T_SHORT, opcode, vtmp1, vtmp1, src2); diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestMultiplyReductionByte.java b/test/hotspot/jtreg/compiler/vectorapi/TestMultiplyReductionByte.java new file mode 100644 index 00000000000..13eafd8dc26 --- /dev/null +++ b/test/hotspot/jtreg/compiler/vectorapi/TestMultiplyReductionByte.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.vectorapi; + +import compiler.lib.ir_framework.*; + +import java.util.Arrays; + +import jdk.incubator.vector.ByteVector; +import jdk.incubator.vector.VectorOperators; + +import jdk.test.lib.Asserts; +import jdk.test.lib.Utils; + +/** + * @test + * @bug 8378250 + * @summary Verify correctness of byte vector MUL reduction across all species. + * A register aliasing bug in mulreduce32B caused the upper half of + * sign-extended data to overwrite the source, producing wrong results + * when most lanes are 1 and a single lane differs. + * @library /test/lib / + * @modules jdk.incubator.vector + * @run driver ${test.main.class} + */ +public class TestMultiplyReductionByte { + + static byte[] input = new byte[64]; + + static int pos = Utils.getRandomInstance().nextInt(input.length); + + static { + Arrays.fill(input, (byte) 1); + input[pos] = -3; + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VI, ">=1"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}, + applyIf = {"MaxVectorSize", ">=8"}) + static byte testMulReduce64() { + return ByteVector.fromArray(ByteVector.SPECIES_64, input, 0) + .reduceLanes(VectorOperators.MUL); + } + + @Run(test = "testMulReduce64") + static void runMulReduce64() { + input[pos] = 1; + pos = (pos + 1) % ByteVector.SPECIES_64.length(); + input[pos] = -3; + byte result = testMulReduce64(); + Asserts.assertEquals((byte) -3, result, "MUL reduction (64-bit), pos=" + pos); + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VI, ">=1"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}, + applyIf = {"MaxVectorSize", ">=16"}) + static byte testMulReduce128() { + return ByteVector.fromArray(ByteVector.SPECIES_128, input, 0) + .reduceLanes(VectorOperators.MUL); + } + + @Run(test = "testMulReduce128") + static void runMulReduce128() { + input[pos] = 1; + pos = (pos + 1) % ByteVector.SPECIES_128.length(); + input[pos] = -3; + byte result = testMulReduce128(); + Asserts.assertEquals((byte) -3, result, "MUL reduction (128-bit), pos=" + pos); + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VI, ">=1"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}, + applyIf = {"MaxVectorSize", ">=32"}) + static byte testMulReduce256() { + return ByteVector.fromArray(ByteVector.SPECIES_256, input, 0) + .reduceLanes(VectorOperators.MUL); + } + + @Run(test = "testMulReduce256") + static void runMulReduce256() { + input[pos] = 1; + pos = (pos + 1) % ByteVector.SPECIES_256.length(); + input[pos] = -3; + byte result = testMulReduce256(); + Asserts.assertEquals((byte) -3, result, "MUL reduction (256-bit), pos=" + pos); + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VI, ">=1"}, + applyIfCPUFeatureOr = {"avx512f", "true", "asimd", "true"}, + applyIf = {"MaxVectorSize", ">=64"}) + static byte testMulReduce512() { + return ByteVector.fromArray(ByteVector.SPECIES_512, input, 0) + .reduceLanes(VectorOperators.MUL); + } + + @Run(test = "testMulReduce512") + static void runMulReduce512() { + input[pos] = 1; + pos = (pos + 1) % ByteVector.SPECIES_512.length(); + input[pos] = -3; + byte result = testMulReduce512(); + Asserts.assertEquals((byte) -3, result, "MUL reduction (512-bit), pos=" + pos); + } + + public static void main(String[] args) { + TestFramework.runWithFlags("--add-modules=jdk.incubator.vector"); + } +} diff --git a/test/jdk/jdk/incubator/vector/ByteVector128Tests.java b/test/jdk/jdk/incubator/vector/ByteVector128Tests.java index ca6fa537ac4..b605182e496 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector128Tests.java @@ -1114,6 +1114,10 @@ public class ByteVector128Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1))); }), + withToString("byte[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (byte)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("byte[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ByteVector256Tests.java b/test/jdk/jdk/incubator/vector/ByteVector256Tests.java index 5c32d4a7f74..bc05a0bd6ca 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector256Tests.java @@ -1114,6 +1114,10 @@ public class ByteVector256Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1))); }), + withToString("byte[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (byte)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("byte[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ByteVector512Tests.java b/test/jdk/jdk/incubator/vector/ByteVector512Tests.java index 094f3bbebdc..45038c53824 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector512Tests.java @@ -1114,6 +1114,10 @@ public class ByteVector512Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1))); }), + withToString("byte[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (byte)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("byte[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ByteVector64Tests.java b/test/jdk/jdk/incubator/vector/ByteVector64Tests.java index e8ff81678cd..b350d0a8ee0 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector64Tests.java @@ -1114,6 +1114,10 @@ public class ByteVector64Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1))); }), + withToString("byte[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (byte)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("byte[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java b/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java index c53710c3fdd..ba2307f15b1 100644 --- a/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java @@ -1120,6 +1120,10 @@ public class ByteVectorMaxTests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1))); }), + withToString("byte[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (byte)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("byte[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java index 1457e5a51ca..7bec91b698b 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java @@ -1239,6 +1239,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1))); }), + withToString("double[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (double)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("double[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (double)0.01 + ((double)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java index e417abe52e6..3da554e67e5 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java @@ -1239,6 +1239,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1))); }), + withToString("double[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (double)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("double[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (double)0.01 + ((double)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java index d23b2bf1511..6c060714da8 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java @@ -1239,6 +1239,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1))); }), + withToString("double[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (double)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("double[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (double)0.01 + ((double)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java index d2aff0b7ea5..9e34cbc3a31 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java @@ -1239,6 +1239,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1))); }), + withToString("double[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (double)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("double[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (double)0.01 + ((double)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java b/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java index 2684ae2d0c6..74be9b42a8b 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java @@ -1245,6 +1245,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((double)(i + 1) == 0) ? 1 : (double)(i + 1))); }), + withToString("double[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (double)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("double[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (double)0.01 + ((double)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/FloatVector128Tests.java b/test/jdk/jdk/incubator/vector/FloatVector128Tests.java index 151ea17a886..eb4b686d41f 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector128Tests.java @@ -1256,6 +1256,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((float)(i + 1) == 0) ? 1 : (float)(i + 1))); }), + withToString("float[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (float)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("float[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (float)0.01 + ((float)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/FloatVector256Tests.java b/test/jdk/jdk/incubator/vector/FloatVector256Tests.java index 5315b69a5b6..f00bf19d383 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector256Tests.java @@ -1256,6 +1256,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((float)(i + 1) == 0) ? 1 : (float)(i + 1))); }), + withToString("float[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (float)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("float[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (float)0.01 + ((float)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/FloatVector512Tests.java b/test/jdk/jdk/incubator/vector/FloatVector512Tests.java index 6a958511439..573bcc59c63 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector512Tests.java @@ -1256,6 +1256,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((float)(i + 1) == 0) ? 1 : (float)(i + 1))); }), + withToString("float[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (float)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("float[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (float)0.01 + ((float)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/FloatVector64Tests.java b/test/jdk/jdk/incubator/vector/FloatVector64Tests.java index b06dff18194..8244ffabb51 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector64Tests.java @@ -1256,6 +1256,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((float)(i + 1) == 0) ? 1 : (float)(i + 1))); }), + withToString("float[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (float)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("float[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (float)0.01 + ((float)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java b/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java index 9b84e852c1c..30c470e05f4 100644 --- a/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java @@ -1262,6 +1262,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> (((float)(i + 1) == 0) ? 1 : (float)(i + 1))); }), + withToString("float[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (float)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("float[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS, i -> (float)0.01 + ((float)i / (i + 1))); diff --git a/test/jdk/jdk/incubator/vector/IntVector128Tests.java b/test/jdk/jdk/incubator/vector/IntVector128Tests.java index d62f5d8df00..2b36a2802eb 100644 --- a/test/jdk/jdk/incubator/vector/IntVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector128Tests.java @@ -1104,6 +1104,10 @@ public class IntVector128Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((int)(i + 1) == 0) ? 1 : (int)(i + 1))); }), + withToString("int[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (int)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("int[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/IntVector256Tests.java b/test/jdk/jdk/incubator/vector/IntVector256Tests.java index bb2d1d717f4..9d4632b88dd 100644 --- a/test/jdk/jdk/incubator/vector/IntVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector256Tests.java @@ -1104,6 +1104,10 @@ public class IntVector256Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((int)(i + 1) == 0) ? 1 : (int)(i + 1))); }), + withToString("int[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (int)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("int[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/IntVector512Tests.java b/test/jdk/jdk/incubator/vector/IntVector512Tests.java index 5ceba4e88ec..aa3c3eccf5b 100644 --- a/test/jdk/jdk/incubator/vector/IntVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector512Tests.java @@ -1104,6 +1104,10 @@ public class IntVector512Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((int)(i + 1) == 0) ? 1 : (int)(i + 1))); }), + withToString("int[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (int)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("int[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/IntVector64Tests.java b/test/jdk/jdk/incubator/vector/IntVector64Tests.java index 9d3849a2c04..89247f9f932 100644 --- a/test/jdk/jdk/incubator/vector/IntVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector64Tests.java @@ -1104,6 +1104,10 @@ public class IntVector64Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((int)(i + 1) == 0) ? 1 : (int)(i + 1))); }), + withToString("int[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (int)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("int[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java b/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java index 6c671a81bf1..3272dbbb3de 100644 --- a/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java @@ -1110,6 +1110,10 @@ public class IntVectorMaxTests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((int)(i + 1) == 0) ? 1 : (int)(i + 1))); }), + withToString("int[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (int)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("int[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/LongVector128Tests.java b/test/jdk/jdk/incubator/vector/LongVector128Tests.java index 49e2e1a0078..30f1ecc2bf4 100644 --- a/test/jdk/jdk/incubator/vector/LongVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector128Tests.java @@ -1088,6 +1088,10 @@ public class LongVector128Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((long)(i + 1) == 0) ? 1 : (long)(i + 1))); }), + withToString("long[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (long)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("long[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/LongVector256Tests.java b/test/jdk/jdk/incubator/vector/LongVector256Tests.java index 84c8da4e800..6dd2f359742 100644 --- a/test/jdk/jdk/incubator/vector/LongVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector256Tests.java @@ -1088,6 +1088,10 @@ public class LongVector256Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((long)(i + 1) == 0) ? 1 : (long)(i + 1))); }), + withToString("long[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (long)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("long[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/LongVector512Tests.java b/test/jdk/jdk/incubator/vector/LongVector512Tests.java index 00d8c4b010a..6347a1b53a2 100644 --- a/test/jdk/jdk/incubator/vector/LongVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector512Tests.java @@ -1088,6 +1088,10 @@ public class LongVector512Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((long)(i + 1) == 0) ? 1 : (long)(i + 1))); }), + withToString("long[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (long)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("long[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/LongVector64Tests.java b/test/jdk/jdk/incubator/vector/LongVector64Tests.java index d4cdfe54ad2..0518c17b75f 100644 --- a/test/jdk/jdk/incubator/vector/LongVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector64Tests.java @@ -1088,6 +1088,10 @@ public class LongVector64Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((long)(i + 1) == 0) ? 1 : (long)(i + 1))); }), + withToString("long[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (long)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("long[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java b/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java index 597169b00f5..f5ab956b5a7 100644 --- a/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java @@ -1094,6 +1094,10 @@ public class LongVectorMaxTests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((long)(i + 1) == 0) ? 1 : (long)(i + 1))); }), + withToString("long[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (long)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("long[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ShortVector128Tests.java b/test/jdk/jdk/incubator/vector/ShortVector128Tests.java index 85e7d715182..40de51c90ab 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector128Tests.java @@ -1104,6 +1104,10 @@ public class ShortVector128Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((short)(i + 1) == 0) ? 1 : (short)(i + 1))); }), + withToString("short[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (short)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("short[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ShortVector256Tests.java b/test/jdk/jdk/incubator/vector/ShortVector256Tests.java index df379b64e3a..c28dd34c8ef 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector256Tests.java @@ -1104,6 +1104,10 @@ public class ShortVector256Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((short)(i + 1) == 0) ? 1 : (short)(i + 1))); }), + withToString("short[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (short)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("short[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ShortVector512Tests.java b/test/jdk/jdk/incubator/vector/ShortVector512Tests.java index ae5804c3688..703ef7d358b 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector512Tests.java @@ -1104,6 +1104,10 @@ public class ShortVector512Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((short)(i + 1) == 0) ? 1 : (short)(i + 1))); }), + withToString("short[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (short)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("short[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ShortVector64Tests.java b/test/jdk/jdk/incubator/vector/ShortVector64Tests.java index 5f84682f02f..ea6846498a3 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector64Tests.java @@ -1104,6 +1104,10 @@ public class ShortVector64Tests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((short)(i + 1) == 0) ? 1 : (short)(i + 1))); }), + withToString("short[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (short)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("short[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java b/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java index 5451ad6c50e..6a85da12054 100644 --- a/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java @@ -1110,6 +1110,10 @@ public class ShortVectorMaxTests extends AbstractVectorTest { return fill(s * BUFFER_REPS, i -> (((short)(i + 1) == 0) ? 1 : (short)(i + 1))); }), + withToString("short[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> (short)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), withToString("short[cornerCaseValue(i)]", (int s) -> { return fill(s * BUFFER_REPS, i -> cornerCaseValue(i)); diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-header.template b/test/jdk/jdk/incubator/vector/templates/Unit-header.template index e1434dccb2b..b87012a2181 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-header.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-header.template @@ -1375,6 +1375,10 @@ relativeError)); return fill(s * BUFFER_REPS, i -> ((($type$)(i + 1) == 0) ? 1 : ($type$)(i + 1))); }), + withToString("$type$[smallOddValue(i)]", (int s) -> { + return fill(s * BUFFER_REPS, + i -> ($type$)(i % 7 == 0 ? -3 : (i % 3 == 0 ? -1 : 1))); + }), #if[FP] withToString("$type$[0.01 + (i / (i + 1))]", (int s) -> { return fill(s * BUFFER_REPS,