diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4 index 2d39d84f52e..ab9cd8be19b 100644 --- a/make/autoconf/flags-cflags.m4 +++ b/make/autoconf/flags-cflags.m4 @@ -578,6 +578,11 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER], TOOLCHAIN_CFLAGS_JDK_CONLY="-fno-strict-aliasing" # technically NOT for CXX fi + if test "x$ENABLE_LINKTIME_GC" = xtrue; then + TOOLCHAIN_CFLAGS_JDK="$TOOLCHAIN_CFLAGS_JDK -ffunction-sections -fdata-sections" + TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -ffunction-sections -fdata-sections" + fi + if test "x$OPENJDK_TARGET_OS" = xaix; then TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -ffunction-sections -ftls-model -fno-math-errno" TOOLCHAIN_CFLAGS_JDK="-ffunction-sections -fsigned-char" diff --git a/make/autoconf/flags-ldflags.m4 b/make/autoconf/flags-ldflags.m4 index 466ff1beaf4..7782735be25 100644 --- a/make/autoconf/flags-ldflags.m4 +++ b/make/autoconf/flags-ldflags.m4 @@ -80,6 +80,10 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER], if test "x$CXX_IS_USER_SUPPLIED" = xfalse && test "x$CC_IS_USER_SUPPLIED" = xfalse; then UTIL_REQUIRE_TOOLCHAIN_PROGS(LLD, lld) fi + + if test "x$ENABLE_LINKTIME_GC" = xtrue; then + BASIC_LDFLAGS_JDK_ONLY="$BASIC_LDFLAGS_JDK_ONLY -Wl,--gc-sections" + fi fi if test "x$OPENJDK_TARGET_OS" = xaix; then BASIC_LDFLAGS="-Wl,-b64 -Wl,-brtl -Wl,-bnorwexec -Wl,-blibpath:/usr/lib:lib -Wl,-bnoexpall \ diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 9734c6845ea..51bb15e0f59 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -1,5 +1,5 @@ // -// Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2014, 2024, Red Hat, Inc. All rights reserved. // Copyright 2025 Arm Limited and/or its affiliates. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -2467,11 +2467,8 @@ bool Matcher::is_generic_vector(MachOper* opnd) { return opnd->opcode() == VREG; } +#ifdef ASSERT // Return whether or not this register is ever used as an argument. -// This function is used on startup to build the trampoline stubs in -// generateOptoStub. Registers not mentioned will be killed by the VM -// call in the trampoline, and arguments in those registers not be -// available to the callee. bool Matcher::can_be_java_arg(int reg) { return @@ -2492,11 +2489,7 @@ bool Matcher::can_be_java_arg(int reg) reg == V6_num || reg == V6_H_num || reg == V7_num || reg == V7_H_num; } - -bool Matcher::is_spillable_arg(int reg) -{ - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { @@ -3814,11 +3807,6 @@ frame %{ // Compiled code's Frame Pointer frame_pointer(R31); - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. - // I2CAdaptors convert from interpreted java to compiled java. - interpreter_frame_pointer(R29); - // Stack alignment requirement stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes) diff --git a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp index 19b3bb1a65b..67cf77989d2 100644 --- a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp @@ -3814,8 +3814,8 @@ public: } private: - void sve_cpy(FloatRegister Zd, SIMD_RegVariant T, PRegister Pg, int imm8, - bool isMerge, bool isFloat) { + void _sve_cpy(FloatRegister Zd, SIMD_RegVariant T, PRegister Pg, int imm8, + bool isMerge, bool isFloat) { starti; assert(T != Q, "invalid size"); int sh = 0; @@ -3839,11 +3839,11 @@ private: public: // SVE copy signed integer immediate to vector elements (predicated) void sve_cpy(FloatRegister Zd, SIMD_RegVariant T, PRegister Pg, int imm8, bool isMerge) { - sve_cpy(Zd, T, Pg, imm8, isMerge, /*isFloat*/false); + _sve_cpy(Zd, T, Pg, imm8, isMerge, /*isFloat*/false); } // SVE copy floating-point immediate to vector elements (predicated) void sve_cpy(FloatRegister Zd, SIMD_RegVariant T, PRegister Pg, double d) { - sve_cpy(Zd, T, Pg, checked_cast(pack(d)), /*isMerge*/true, /*isFloat*/true); + _sve_cpy(Zd, T, Pg, checked_cast(pack(d)), /*isMerge*/true, /*isFloat*/true); } // SVE conditionally select elements from two vectors diff --git a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp index 938a64dd399..df013d9d1ee 100644 --- a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp @@ -42,7 +42,6 @@ define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, NewSizeThreadIncrease, 4*K ); define_pd_global(size_t, InitialCodeCacheSize, 160*K); define_pd_global(size_t, ReservedCodeCacheSize, 32*M ); define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp index dc0b9eb9546..7aab7d389e1 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp @@ -2875,3 +2875,24 @@ void C2_MacroAssembler::vector_expand_sve(FloatRegister dst, FloatRegister src, // dst = 00 87 00 65 00 43 00 21 sve_tbl(dst, size, src, dst); } + +// Optimized SVE cpy (imm, zeroing) instruction. +// +// `movi; cpy(imm, merging)` and `cpy(imm, zeroing)` have the same +// functionality, but test results show that `movi; cpy(imm, merging)` has +// higher throughput on some microarchitectures. This would depend on +// microarchitecture and so may vary between implementations. +void C2_MacroAssembler::sve_cpy(FloatRegister dst, SIMD_RegVariant T, + PRegister pg, int imm8, bool isMerge) { + if (VM_Version::prefer_sve_merging_mode_cpy() && !isMerge) { + // Generates a NEON instruction `movi V.2d, #0`. + // On AArch64, Z and V registers alias in the low 128 bits, so V is + // the low 128 bits of Z. A write to V also clears all bits of + // Z above 128, so this `movi` instruction effectively zeroes the + // entire Z register. According to the Arm Software Optimization + // Guide, `movi` is zero latency. + movi(dst, T2D, 0); + isMerge = true; + } + Assembler::sve_cpy(dst, T, pg, imm8, isMerge); +} diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp index 4f3a41da402..5c05832afbe 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp @@ -75,6 +75,8 @@ unsigned vector_length_in_bytes); public: + using Assembler::sve_cpy; + // jdk.internal.util.ArraysSupport.vectorizedHashCode address arrays_hashcode(Register ary, Register cnt, Register result, FloatRegister vdata0, FloatRegister vdata1, FloatRegister vdata2, FloatRegister vdata3, @@ -244,4 +246,7 @@ void vector_expand_sve(FloatRegister dst, FloatRegister src, PRegister pg, FloatRegister tmp1, FloatRegister tmp2, BasicType bt, int vector_length_in_bytes); + + void sve_cpy(FloatRegister dst, SIMD_RegVariant T, PRegister pg, int imm8, + bool isMerge); #endif // CPU_AARCH64_C2_MACROASSEMBLER_AARCH64_HPP diff --git a/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp b/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp index a0dea3643a1..87ad9caaa45 100644 --- a/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp @@ -47,7 +47,6 @@ define_pd_global(intx, ConditionalMoveLimit, 3); define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, MinJumpTableSize, 10); define_pd_global(intx, InteriorEntryAlignment, 16); -define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, LoopUnrollLimit, 60); define_pd_global(intx, LoopPercentProfileLimit, 10); // InitialCodeCacheSize derived from specjbb2000 run. diff --git a/src/hotspot/cpu/aarch64/globals_aarch64.hpp b/src/hotspot/cpu/aarch64/globals_aarch64.hpp index a59e83c4b69..e6de2c798b1 100644 --- a/src/hotspot/cpu/aarch64/globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/globals_aarch64.hpp @@ -95,7 +95,7 @@ define_pd_global(intx, InlineSmallCode, 1000); "Use simplest and shortest implementation for array equals") \ product(bool, UseSIMDForBigIntegerShiftIntrinsics, true, \ "Use SIMD instructions for left/right shift of BigInteger") \ - product(bool, UseSIMDForSHA3Intrinsic, true, \ + product(bool, UseSIMDForSHA3Intrinsic, false, \ "Use SIMD SHA3 instructions for SHA3 intrinsic") \ product(bool, AvoidUnalignedAccesses, false, \ "Avoid generating unaligned memory accesses") \ diff --git a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp index a459a28b09e..21a1124a8ec 100644 --- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp @@ -11876,16 +11876,13 @@ class StubGenerator: public StubCodeGenerator { StubRoutines::_sha512_implCompress = generate_sha512_implCompress(StubId::stubgen_sha512_implCompress_id); StubRoutines::_sha512_implCompressMB = generate_sha512_implCompress(StubId::stubgen_sha512_implCompressMB_id); } - if (UseSHA3Intrinsics) { - + if (UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { StubRoutines::_double_keccak = generate_double_keccak(); - if (UseSIMDForSHA3Intrinsic) { - StubRoutines::_sha3_implCompress = generate_sha3_implCompress(StubId::stubgen_sha3_implCompress_id); - StubRoutines::_sha3_implCompressMB = generate_sha3_implCompress(StubId::stubgen_sha3_implCompressMB_id); - } else { - StubRoutines::_sha3_implCompress = generate_sha3_implCompress_gpr(StubId::stubgen_sha3_implCompress_id); - StubRoutines::_sha3_implCompressMB = generate_sha3_implCompress_gpr(StubId::stubgen_sha3_implCompressMB_id); - } + StubRoutines::_sha3_implCompress = generate_sha3_implCompress(StubId::stubgen_sha3_implCompress_id); + StubRoutines::_sha3_implCompressMB = generate_sha3_implCompress(StubId::stubgen_sha3_implCompressMB_id); + } else if (UseSHA3Intrinsics) { + StubRoutines::_sha3_implCompress = generate_sha3_implCompress_gpr(StubId::stubgen_sha3_implCompress_id); + StubRoutines::_sha3_implCompressMB = generate_sha3_implCompress_gpr(StubId::stubgen_sha3_implCompressMB_id); } if (UsePoly1305Intrinsics) { diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp index 9b85733ed08..4423d9c5b58 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp @@ -365,16 +365,28 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); } - if (UseSHA && VM_Version::supports_sha3()) { - // Auto-enable UseSHA3Intrinsics on hardware with performance benefit. - // Note that the evaluation of UseSHA3Intrinsics shows better performance + if (UseSHA) { + // No need to check VM_Version::supports_sha3(), since a fallback GPR intrinsic implementation is provided. + if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); + } + } else if (UseSHA3Intrinsics) { + // Matches the documented and tested behavior: the -UseSHA option disables all SHA intrinsics. + warning("UseSHA3Intrinsics requires that UseSHA is enabled."); + FLAG_SET_DEFAULT(UseSHA3Intrinsics, false); + } + + if (UseSHA3Intrinsics && VM_Version::supports_sha3()) { + // Auto-enable UseSIMDForSHA3Intrinsic on hardware with performance benefit. + // Note that the evaluation of SHA3 extension Intrinsics shows better performance // on Apple and Qualcomm silicon but worse performance on Neoverse V1 and N2. if (_cpu == CPU_APPLE || _cpu == CPU_QUALCOMM) { // Apple or Qualcomm silicon - if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); + if (FLAG_IS_DEFAULT(UseSIMDForSHA3Intrinsic)) { + FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, true); } } - } else if (UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { + } + if (UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic && !VM_Version::supports_sha3()) { warning("Intrinsics for SHA3-224, SHA3-256, SHA3-384 and SHA3-512 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA3Intrinsics, false); } diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp index 0213872852b..e8681611234 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp @@ -55,6 +55,9 @@ protected: static int _max_supported_sve_vector_length; static bool _rop_protection; static uintptr_t _pac_mask; + // When _prefer_sve_merging_mode_cpy is true, `cpy (imm, zeroing)` is + // implemented as `movi; cpy(imm, merging)`. + static constexpr bool _prefer_sve_merging_mode_cpy = true; static SpinWait _spin_wait; @@ -242,6 +245,8 @@ public: static bool use_rop_protection() { return _rop_protection; } + static bool prefer_sve_merging_mode_cpy() { return _prefer_sve_merging_mode_cpy; } + // For common 64/128-bit unpredicated vector operations, we may prefer // emitting NEON instructions rather than the corresponding SVE instructions. static bool use_neon_for_vector(int vector_length_in_bytes) { diff --git a/src/hotspot/cpu/arm/arm.ad b/src/hotspot/cpu/arm/arm.ad index 606275d7666..87c609be5a7 100644 --- a/src/hotspot/cpu/arm/arm.ad +++ b/src/hotspot/cpu/arm/arm.ad @@ -1088,10 +1088,8 @@ bool Matcher::pd_clone_address_expressions(AddPNode* m, Matcher::MStack& mstack, return clone_base_plus_offset_address(m, mstack, address_visited); } -// Return whether or not this register is ever used as an argument. This -// function is used on startup to build the trampoline stubs in generateOptoStub. -// Registers not mentioned will be killed by the VM call in the trampoline, and -// arguments in those registers not be available to the callee. +#ifdef ASSERT +// Return whether or not this register is ever used as an argument. bool Matcher::can_be_java_arg( int reg ) { if (reg == R_R0_num || reg == R_R1_num || @@ -1102,10 +1100,7 @@ bool Matcher::can_be_java_arg( int reg ) { reg <= R_S13_num) return true; return false; } - -bool Matcher::is_spillable_arg( int reg ) { - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { diff --git a/src/hotspot/cpu/arm/c1_globals_arm.hpp b/src/hotspot/cpu/arm/c1_globals_arm.hpp index 1fe5f1a23ee..992cfd0e408 100644 --- a/src/hotspot/cpu/arm/c1_globals_arm.hpp +++ b/src/hotspot/cpu/arm/c1_globals_arm.hpp @@ -43,7 +43,6 @@ define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(size_t, NewSizeThreadIncrease, 4*K ); define_pd_global(size_t, InitialCodeCacheSize, 160*K); define_pd_global(size_t, ReservedCodeCacheSize, 32*M ); define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/arm/c2_globals_arm.hpp b/src/hotspot/cpu/arm/c2_globals_arm.hpp index 0849bd594f0..84abde5650b 100644 --- a/src/hotspot/cpu/arm/c2_globals_arm.hpp +++ b/src/hotspot/cpu/arm/c2_globals_arm.hpp @@ -47,7 +47,6 @@ define_pd_global(intx, ConditionalMoveLimit, 4); // C2 gets to use all the float/double registers define_pd_global(intx, FreqInlineSize, 175); define_pd_global(intx, InteriorEntryAlignment, 16); // = CodeEntryAlignment -define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); // The default setting 16/16 seems to work best. // (For _228_jack 16/16 is 2% better than 4/4, 16/4, 32/32, 32/16, or 16/32.) //define_pd_global(intx, OptoLoopAlignment, 16); // = 4*wordSize diff --git a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp index 77d9acd1cd1..7d2e44a88b6 100644 --- a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp +++ b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp @@ -52,7 +52,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K); define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true); -define_pd_global(size_t, NewSizeThreadIncrease, 16*K); define_pd_global(size_t, InitialCodeCacheSize, 160*K); #endif // !COMPILER2 diff --git a/src/hotspot/cpu/ppc/c2_globals_ppc.hpp b/src/hotspot/cpu/ppc/c2_globals_ppc.hpp index caef322d4a1..eeff8d93dd4 100644 --- a/src/hotspot/cpu/ppc/c2_globals_ppc.hpp +++ b/src/hotspot/cpu/ppc/c2_globals_ppc.hpp @@ -47,7 +47,6 @@ define_pd_global(intx, ConditionalMoveLimit, 3); define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, MinJumpTableSize, 10); define_pd_global(intx, InteriorEntryAlignment, 16); -define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, RegisterCostAreaRatio, 16000); define_pd_global(intx, LoopUnrollLimit, 60); define_pd_global(intx, LoopPercentProfileLimit, 10); diff --git a/src/hotspot/cpu/ppc/icache_ppc.cpp b/src/hotspot/cpu/ppc/icache_ppc.cpp index 05ad3c7a30d..f3d51bad18c 100644 --- a/src/hotspot/cpu/ppc/icache_ppc.cpp +++ b/src/hotspot/cpu/ppc/icache_ppc.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2018 SAP SE. All rights reserved. + * Copyright (c) 2000, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026 SAP SE. 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 @@ -24,6 +24,7 @@ */ #include "runtime/icache.hpp" +#include "runtime/vm_version.hpp" // Use inline assembler to implement icache flush. int ICache::ppc64_flush_icache(address start, int lines, int magic) { @@ -67,6 +68,9 @@ int ICache::ppc64_flush_icache(address start, int lines, int magic) { void ICacheStubGenerator::generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub) { + guarantee(VM_Version::get_icache_line_size() >= ICache::line_size, + "processors with smaller cache line size are no longer supported"); + *flush_icache_stub = (ICache::flush_icache_stub_t)ICache::ppc64_flush_icache; // First call to flush itself. diff --git a/src/hotspot/cpu/ppc/icache_ppc.hpp b/src/hotspot/cpu/ppc/icache_ppc.hpp index d348cad1c72..024f706182a 100644 --- a/src/hotspot/cpu/ppc/icache_ppc.hpp +++ b/src/hotspot/cpu/ppc/icache_ppc.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2013 SAP SE. All rights reserved. + * Copyright (c) 2002, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026 SAP SE. 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 @@ -35,9 +35,8 @@ class ICache : public AbstractICache { public: enum { - // Actually, cache line size is 64, but keeping it as it is to be - // on the safe side on ALL PPC64 implementations. - log2_line_size = 5, + // Cache line size is 128 on all supported PPC64 implementations. + log2_line_size = 7, line_size = 1 << log2_line_size }; diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 4cb9f8820a0..7e3cd04171d 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -2412,10 +2412,8 @@ bool Matcher::is_generic_vector(MachOper* opnd) { return false; } -// Return whether or not this register is ever used as an argument. This -// function is used on startup to build the trampoline stubs in generateOptoStub. -// Registers not mentioned will be killed by the VM call in the trampoline, and -// arguments in those registers not be available to the callee. +#ifdef ASSERT +// Return whether or not this register is ever used as an argument. bool Matcher::can_be_java_arg(int reg) { // We must include the virtual halves in order to get STDs and LDs // instead of STWs and LWs in the trampoline stubs. @@ -2447,10 +2445,7 @@ bool Matcher::can_be_java_arg(int reg) { return false; } - -bool Matcher::is_spillable_arg(int reg) { - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { @@ -3715,13 +3710,6 @@ frame %{ // Compiled code's Frame Pointer. frame_pointer(R1); // R1_SP - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. I2CAdaptors convert from - // interpreted java to compiled java. - // - // R14_state holds pointer to caller's cInterpreter. - interpreter_frame_pointer(R14); // R14_state - stack_alignment(frame::alignment_in_bytes); // Number of outgoing stack slots killed above the diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.cpp b/src/hotspot/cpu/ppc/vm_version_ppc.cpp index 75feb389298..e471f5a6e4f 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2025 SAP SE. All rights reserved. + * Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026 SAP SE. 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 @@ -475,19 +475,12 @@ void VM_Version::print_features() { void VM_Version::determine_features() { #if defined(ABI_ELFv2) - // 1 InstWord per call for the blr instruction. - const int code_size = (num_features+1+2*1)*BytesPerInstWord; + const int code_size = (num_features + 1 /*blr*/) * BytesPerInstWord; #else - // 7 InstWords for each call (function descriptor + blr instruction). - const int code_size = (num_features+1+2*7)*BytesPerInstWord; + const int code_size = (num_features + 1 /*blr*/ + 6 /* fd */) * BytesPerInstWord; #endif int features = 0; - // create test area - enum { BUFFER_SIZE = 2*4*K }; // Needs to be >=2* max cache line size (cache line size can't exceed min page size). - char test_area[BUFFER_SIZE]; - char *mid_of_test_area = &test_area[BUFFER_SIZE>>1]; - // Allocate space for the code. ResourceMark rm; CodeBuffer cb("detect_cpu_features", code_size, 0); @@ -497,20 +490,13 @@ void VM_Version::determine_features() { _features = VM_Version::all_features_m; // Emit code. - void (*test)(address addr, uint64_t offset)=(void(*)(address addr, uint64_t offset))(void *)a->function_entry(); + void (*test)() = (void(*)())(void *)a->function_entry(); uint32_t *code = (uint32_t *)a->pc(); - // Keep R3_ARG1 unmodified, it contains &field (see below). - // Keep R4_ARG2 unmodified, it contains offset = 0 (see below). a->mfdscr(R0); a->darn(R7); a->brw(R5, R6); a->blr(); - // Emit function to set one cache line to zero. Emit function descriptor and get pointer to it. - void (*zero_cacheline_func_ptr)(char*) = (void(*)(char*))(void *)a->function_entry(); - a->dcbz(R3_ARG1); // R3_ARG1 = addr - a->blr(); - uint32_t *code_end = (uint32_t *)a->pc(); a->flush(); _features = VM_Version::unknown_m; @@ -522,18 +508,9 @@ void VM_Version::determine_features() { Disassembler::decode((u_char*)code, (u_char*)code_end, tty); } - // Measure cache line size. - memset(test_area, 0xFF, BUFFER_SIZE); // Fill test area with 0xFF. - (*zero_cacheline_func_ptr)(mid_of_test_area); // Call function which executes dcbz to the middle. - int count = 0; // count zeroed bytes - for (int i = 0; i < BUFFER_SIZE; i++) if (test_area[i] == 0) count++; - guarantee(is_power_of_2(count), "cache line size needs to be a power of 2"); - _L1_data_cache_line_size = count; - // Execute code. Illegal instructions will be replaced by 0 in the signal handler. VM_Version::_is_determine_features_test_running = true; - // We must align the first argument to 16 bytes because of the lqarx check. - (*test)(align_up((address)mid_of_test_area, 16), 0); + (*test)(); VM_Version::_is_determine_features_test_running = false; // determine which instructions are legal. @@ -550,6 +527,10 @@ void VM_Version::determine_features() { } _features = features; + + _L1_data_cache_line_size = VM_Version::get_dcache_line_size(); + assert(_L1_data_cache_line_size >= DEFAULT_CACHE_LINE_SIZE, + "processors with smaller cache line size are no longer supported"); } // Power 8: Configure Data Stream Control Register. diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.hpp b/src/hotspot/cpu/ppc/vm_version_ppc.hpp index 11dce83bed0..0f4eb3593a3 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.hpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2025 SAP SE. All rights reserved. + * Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026 SAP SE. 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 @@ -81,6 +81,9 @@ public: static uint64_t _dscr_val; static void initialize_cpu_information(void); + + static int get_dcache_line_size(); + static int get_icache_line_size(); }; #endif // CPU_PPC_VM_VERSION_PPC_HPP diff --git a/src/hotspot/cpu/riscv/c1_globals_riscv.hpp b/src/hotspot/cpu/riscv/c1_globals_riscv.hpp index b15bb5c23c3..00b92a0dec3 100644 --- a/src/hotspot/cpu/riscv/c1_globals_riscv.hpp +++ b/src/hotspot/cpu/riscv/c1_globals_riscv.hpp @@ -42,7 +42,6 @@ define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, NewSizeThreadIncrease, 4*K ); define_pd_global(size_t, InitialCodeCacheSize, 160*K); define_pd_global(size_t, ReservedCodeCacheSize, 32*M ); define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/riscv/c2_globals_riscv.hpp b/src/hotspot/cpu/riscv/c2_globals_riscv.hpp index 648c24ee98b..afb4ae8fcdd 100644 --- a/src/hotspot/cpu/riscv/c2_globals_riscv.hpp +++ b/src/hotspot/cpu/riscv/c2_globals_riscv.hpp @@ -47,7 +47,6 @@ define_pd_global(intx, ConditionalMoveLimit, 3); define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, MinJumpTableSize, 10); define_pd_global(intx, InteriorEntryAlignment, 16); -define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, LoopUnrollLimit, 60); define_pd_global(intx, LoopPercentProfileLimit, 10); // InitialCodeCacheSize derived from specjbb2000 run. diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index ed6e8db0606..54ea81683fc 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1,5 +1,5 @@ // -// Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. // Copyright (c) 2020, 2024, Huawei Technologies Co., Ltd. All rights reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -2060,11 +2060,8 @@ bool Matcher::is_generic_vector(MachOper* opnd) { return false; } +#ifdef ASSERT // Return whether or not this register is ever used as an argument. -// This function is used on startup to build the trampoline stubs in -// generateOptoStub. Registers not mentioned will be killed by the VM -// call in the trampoline, and arguments in those registers not be -// available to the callee. bool Matcher::can_be_java_arg(int reg) { return @@ -2085,11 +2082,7 @@ bool Matcher::can_be_java_arg(int reg) reg == F16_num || reg == F16_H_num || reg == F17_num || reg == F17_H_num; } - -bool Matcher::is_spillable_arg(int reg) -{ - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { @@ -2559,11 +2552,6 @@ frame %{ // Compiled code's Frame Pointer frame_pointer(R2); - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. - // I2CAdaptors convert from interpreted java to compiled java. - interpreter_frame_pointer(R8); - // Stack alignment requirement stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes) diff --git a/src/hotspot/cpu/s390/c1_globals_s390.hpp b/src/hotspot/cpu/s390/c1_globals_s390.hpp index 25e46cd1509..bd07dd87066 100644 --- a/src/hotspot/cpu/s390/c1_globals_s390.hpp +++ b/src/hotspot/cpu/s390/c1_globals_s390.hpp @@ -52,7 +52,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K); define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true); -define_pd_global(size_t, NewSizeThreadIncrease, 16*K); define_pd_global(size_t, InitialCodeCacheSize, 160*K); #endif // !COMPILER2 diff --git a/src/hotspot/cpu/s390/c2_globals_s390.hpp b/src/hotspot/cpu/s390/c2_globals_s390.hpp index 125b317588d..068511be8f3 100644 --- a/src/hotspot/cpu/s390/c2_globals_s390.hpp +++ b/src/hotspot/cpu/s390/c2_globals_s390.hpp @@ -46,7 +46,6 @@ define_pd_global(intx, OnStackReplacePercentage, 140); define_pd_global(intx, ConditionalMoveLimit, 4); define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, InteriorEntryAlignment, 4); -define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, RegisterCostAreaRatio, 12000); define_pd_global(intx, LoopUnrollLimit, 60); define_pd_global(intx, LoopPercentProfileLimit, 10); diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 19bd3620228..1521edde40c 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -1,5 +1,5 @@ // -// Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2017, 2024 SAP SE. All rights reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // @@ -1890,10 +1890,8 @@ const int z_num_iarg_registers = sizeof(z_iarg_reg) / sizeof(z_iarg_reg[0]); const int z_num_farg_registers = sizeof(z_farg_reg) / sizeof(z_farg_reg[0]); -// Return whether or not this register is ever used as an argument. This -// function is used on startup to build the trampoline stubs in generateOptoStub. -// Registers not mentioned will be killed by the VM call in the trampoline, and -// arguments in those registers not be available to the callee. +#ifdef ASSERT +// Return whether or not this register is ever used as an argument. bool Matcher::can_be_java_arg(int reg) { // We return true for all registers contained in z_iarg_reg[] and // z_farg_reg[] and their virtual halves. @@ -1917,10 +1915,7 @@ bool Matcher::can_be_java_arg(int reg) { return false; } - -bool Matcher::is_spillable_arg(int reg) { - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { @@ -2606,13 +2601,6 @@ frame %{ // z/Architecture stack pointer frame_pointer(Z_R15); // Z_SP - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. I2CAdaptors convert from - // interpreted java to compiled java. - // - // Z_state holds pointer to caller's cInterpreter. - interpreter_frame_pointer(Z_R7); // Z_state - // Use alignment_in_bytes instead of log_2_of_alignment_in_bits. stack_alignment(frame::alignment_in_bytes); diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp b/src/hotspot/cpu/x86/assembler_x86.cpp index 3c8defe62d9..38a28a6ec49 100644 --- a/src/hotspot/cpu/x86/assembler_x86.cpp +++ b/src/hotspot/cpu/x86/assembler_x86.cpp @@ -5442,6 +5442,13 @@ void Assembler::pmovsxwd(XMMRegister dst, XMMRegister src) { emit_int16(0x23, (0xC0 | encode)); } +void Assembler::pmovzxwd(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_sse4_1(), ""); + InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true); + int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes); + emit_int16(0x33, (0xC0 | encode)); +} + void Assembler::vpmovzxbw(XMMRegister dst, Address src, int vector_len) { assert(VM_Version::supports_avx(), ""); InstructionMark im(this); diff --git a/src/hotspot/cpu/x86/assembler_x86.hpp b/src/hotspot/cpu/x86/assembler_x86.hpp index 97854f712cf..57a5e25d7a6 100644 --- a/src/hotspot/cpu/x86/assembler_x86.hpp +++ b/src/hotspot/cpu/x86/assembler_x86.hpp @@ -1965,6 +1965,7 @@ private: void pmovsxbq(XMMRegister dst, XMMRegister src); void pmovsxbw(XMMRegister dst, XMMRegister src); void pmovsxwd(XMMRegister dst, XMMRegister src); + void pmovzxwd(XMMRegister dst, XMMRegister src); void vpmovsxbd(XMMRegister dst, XMMRegister src, int vector_len); void vpmovsxbq(XMMRegister dst, XMMRegister src, int vector_len); void vpmovsxbw(XMMRegister dst, XMMRegister src, int vector_len); diff --git a/src/hotspot/cpu/x86/c1_globals_x86.hpp b/src/hotspot/cpu/x86/c1_globals_x86.hpp index 978b233bb63..063a9185d53 100644 --- a/src/hotspot/cpu/x86/c1_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c1_globals_x86.hpp @@ -41,7 +41,6 @@ define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 1500 ); define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(size_t, NewSizeThreadIncrease, 4*K ); define_pd_global(size_t, InitialCodeCacheSize, 160*K); define_pd_global(size_t, ReservedCodeCacheSize, 32*M ); define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M ); diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp index a3ccc081b6b..5b5fb02967c 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp @@ -1729,6 +1729,24 @@ void C2_MacroAssembler::reduce_operation_128(BasicType typ, int opcode, XMMRegis default: assert(false, "wrong type"); } break; + case Op_UMinReductionV: + switch (typ) { + case T_BYTE: vpminub(dst, dst, src, Assembler::AVX_128bit); break; + case T_SHORT: vpminuw(dst, dst, src, Assembler::AVX_128bit); break; + case T_INT: vpminud(dst, dst, src, Assembler::AVX_128bit); break; + case T_LONG: evpminuq(dst, k0, dst, src, true, Assembler::AVX_128bit); break; + default: assert(false, "wrong type"); + } + break; + case Op_UMaxReductionV: + switch (typ) { + case T_BYTE: vpmaxub(dst, dst, src, Assembler::AVX_128bit); break; + case T_SHORT: vpmaxuw(dst, dst, src, Assembler::AVX_128bit); break; + case T_INT: vpmaxud(dst, dst, src, Assembler::AVX_128bit); break; + case T_LONG: evpmaxuq(dst, k0, dst, src, true, Assembler::AVX_128bit); break; + default: assert(false, "wrong type"); + } + break; case Op_AddReductionVF: addss(dst, src); break; case Op_AddReductionVD: addsd(dst, src); break; case Op_AddReductionVI: @@ -1792,6 +1810,24 @@ void C2_MacroAssembler::reduce_operation_256(BasicType typ, int opcode, XMMRegis default: assert(false, "wrong type"); } break; + case Op_UMinReductionV: + switch (typ) { + case T_BYTE: vpminub(dst, src1, src2, vector_len); break; + case T_SHORT: vpminuw(dst, src1, src2, vector_len); break; + case T_INT: vpminud(dst, src1, src2, vector_len); break; + case T_LONG: evpminuq(dst, k0, src1, src2, true, vector_len); break; + default: assert(false, "wrong type"); + } + break; + case Op_UMaxReductionV: + switch (typ) { + case T_BYTE: vpmaxub(dst, src1, src2, vector_len); break; + case T_SHORT: vpmaxuw(dst, src1, src2, vector_len); break; + case T_INT: vpmaxud(dst, src1, src2, vector_len); break; + case T_LONG: evpmaxuq(dst, k0, src1, src2, true, vector_len); break; + default: assert(false, "wrong type"); + } + break; case Op_AddReductionVI: switch (typ) { case T_BYTE: vpaddb(dst, src1, src2, vector_len); break; @@ -2058,7 +2094,11 @@ void C2_MacroAssembler::reduce8B(int opcode, Register dst, Register src1, XMMReg psrldq(vtmp2, 1); reduce_operation_128(T_BYTE, opcode, vtmp1, vtmp2); movdl(vtmp2, src1); - pmovsxbd(vtmp1, vtmp1); + if (opcode == Op_UMinReductionV || opcode == Op_UMaxReductionV) { + pmovzxbd(vtmp1, vtmp1); + } else { + pmovsxbd(vtmp1, vtmp1); + } reduce_operation_128(T_INT, opcode, vtmp1, vtmp2); pextrb(dst, vtmp1, 0x0); movsbl(dst, dst); @@ -2135,7 +2175,11 @@ void C2_MacroAssembler::reduce4S(int opcode, Register dst, Register src1, XMMReg reduce_operation_128(T_SHORT, opcode, vtmp1, vtmp2); } movdl(vtmp2, src1); - pmovsxwd(vtmp1, vtmp1); + if (opcode == Op_UMinReductionV || opcode == Op_UMaxReductionV) { + pmovzxwd(vtmp1, vtmp1); + } else { + pmovsxwd(vtmp1, vtmp1); + } reduce_operation_128(T_INT, opcode, vtmp1, vtmp2); pextrw(dst, vtmp1, 0x0); movswl(dst, dst); diff --git a/src/hotspot/cpu/x86/c2_globals_x86.hpp b/src/hotspot/cpu/x86/c2_globals_x86.hpp index 3f616cb4578..bc119693d32 100644 --- a/src/hotspot/cpu/x86/c2_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c2_globals_x86.hpp @@ -46,7 +46,6 @@ define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, MinJumpTableSize, 10); define_pd_global(intx, LoopPercentProfileLimit, 10); define_pd_global(intx, InteriorEntryAlignment, 16); -define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, LoopUnrollLimit, 60); // InitialCodeCacheSize derived from specjbb2000 run. define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multiple of CodeCacheExpansionSize diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index b54f6adc263..2d46a50d426 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -961,7 +961,7 @@ void MacroAssembler::call(AddressLiteral entry, Register rscratch) { void MacroAssembler::ic_call(address entry, jint method_index) { RelocationHolder rh = virtual_call_Relocation::spec(pc(), method_index); // Needs full 64-bit immediate for later patching. - mov64(rax, (int64_t)Universe::non_oop_word()); + Assembler::mov64(rax, (int64_t)Universe::non_oop_word()); call(AddressLiteral(entry, rh)); } @@ -1961,6 +1961,20 @@ void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src, Register rscrat } } +void MacroAssembler::mov64(Register dst, int64_t imm64) { + if (is_uimm32(imm64)) { + movl(dst, checked_cast(imm64)); + } else if (is_simm32(imm64)) { + movq(dst, checked_cast(imm64)); + } else { + Assembler::mov64(dst, imm64); + } +} + +void MacroAssembler::mov64(Register dst, int64_t imm64, relocInfo::relocType rtype, int format) { + Assembler::mov64(dst, imm64, rtype, format); +} + void MacroAssembler::movptr(Register dst, Register src) { movq(dst, src); } @@ -1971,13 +1985,7 @@ void MacroAssembler::movptr(Register dst, Address src) { // src should NEVER be a real pointer. Use AddressLiteral for true pointers void MacroAssembler::movptr(Register dst, intptr_t src) { - if (is_uimm32(src)) { - movl(dst, checked_cast(src)); - } else if (is_simm32(src)) { - movq(dst, checked_cast(src)); - } else { - mov64(dst, src); - } + mov64(dst, src); } void MacroAssembler::movptr(Address dst, Register src) { diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.hpp b/src/hotspot/cpu/x86/macroAssembler_x86.hpp index 5c049f710e2..8469deaa8be 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp @@ -1869,6 +1869,9 @@ public: void mov_metadata(Register dst, Metadata* obj); void mov_metadata(Address dst, Metadata* obj, Register rscratch); + void mov64(Register dst, int64_t imm64); + void mov64(Register dst, int64_t imm64, relocInfo::relocType rtype, int format); + void movptr(Register dst, Register src); void movptr(Register dst, Address src); void movptr(Register dst, AddressLiteral src); diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index 0ffa4c2031c..ed380105565 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -2726,11 +2726,8 @@ bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) { return (-128 <= offset && offset <= 127); } +#ifdef ASSERT // Return whether or not this register is ever used as an argument. -// This function is used on startup to build the trampoline stubs in -// generateOptoStub. Registers not mentioned will be killed by the VM -// call in the trampoline, and arguments in those registers not be -// available to the callee. bool Matcher::can_be_java_arg(int reg) { return @@ -2750,11 +2747,7 @@ bool Matcher::can_be_java_arg(int reg) reg == XMM6_num || reg == XMM6b_num || reg == XMM7_num || reg == XMM7b_num; } - -bool Matcher::is_spillable_arg(int reg) -{ - return can_be_java_arg(reg); -} +#endif uint Matcher::int_pressure_limit() { @@ -3341,6 +3334,18 @@ bool Matcher::match_rule_supported_vector(int opcode, int vlen, BasicType bt) { return false; } break; + case Op_UMinReductionV: + case Op_UMaxReductionV: + if (UseAVX == 0) { + return false; + } + if (bt == T_LONG && !VM_Version::supports_avx512vl()) { + return false; + } + if (UseAVX > 2 && size_in_bits == 512 && !VM_Version::supports_avx512vl()) { + return false; + } + break; case Op_MaxV: case Op_MinV: if (UseSSE < 4 && is_integral_type(bt)) { @@ -4679,11 +4684,6 @@ frame // Compiled code's Frame Pointer frame_pointer(RSP); - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. - // I2CAdaptors convert from interpreted java to compiled java. - interpreter_frame_pointer(RBP); - // Stack alignment requirement stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes) @@ -19371,6 +19371,8 @@ instruct reductionI(rRegI dst, rRegI src1, legVec src2, legVec vtmp1, legVec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_int $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ @@ -19392,6 +19394,8 @@ instruct reductionL(rRegL dst, rRegL src1, legVec src2, legVec vtmp1, legVec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_long $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ @@ -19411,6 +19415,8 @@ instruct reductionL_avx512dq(rRegL dst, rRegL src1, vec src2, vec vtmp1, vec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_long $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ @@ -19639,6 +19645,8 @@ instruct reductionB(rRegI dst, rRegI src1, legVec src2, legVec vtmp1, legVec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_byte $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ @@ -19657,6 +19665,8 @@ instruct reductionB_avx512bw(rRegI dst, rRegI src1, vec src2, vec vtmp1, vec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_byte $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ @@ -19678,6 +19688,8 @@ instruct reductionS(rRegI dst, rRegI src1, legVec src2, legVec vtmp1, legVec vtm match(Set dst (XorReductionV src1 src2)); match(Set dst (MinReductionV src1 src2)); match(Set dst (MaxReductionV src1 src2)); + match(Set dst (UMinReductionV src1 src2)); + match(Set dst (UMaxReductionV src1 src2)); effect(TEMP vtmp1, TEMP vtmp2); format %{ "vector_reduction_short $dst,$src1,$src2 ; using $vtmp1, $vtmp2 as TEMP" %} ins_encode %{ diff --git a/src/hotspot/os/aix/globals_aix.hpp b/src/hotspot/os/aix/globals_aix.hpp index 473d7759063..adc189666ef 100644 --- a/src/hotspot/os/aix/globals_aix.hpp +++ b/src/hotspot/os/aix/globals_aix.hpp @@ -37,16 +37,6 @@ range, \ constraint) \ \ - /* Whether to allow the VM to run if EXTSHM=ON. EXTSHM is an environment */ \ - /* variable used on AIX to activate certain hacks which allow more shm segments */\ - /* for 32bit processes. For 64bit processes, it is pointless and may have */ \ - /* harmful side effects (e.g. for some reasonn prevents allocation of 64k pages */\ - /* via shmctl). */ \ - /* Per default we quit with an error if that variable is found; for certain */ \ - /* customer scenarios, we may want to be able to run despite that variable. */ \ - product(bool, AllowExtshm, false, DIAGNOSTIC, \ - "Allow VM to run with EXTSHM=ON.") \ - \ /* Maximum expected size of the data segment. That correlates with the */ \ /* maximum C Heap consumption we expect. */ \ /* We need to leave "breathing space" for the data segment when */ \ diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index af743dc7484..7c08d6de2db 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -126,7 +126,6 @@ int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t); // for multipage initialization error analysis (in 'g_multipage_error') #define ERROR_MP_OS_TOO_OLD 100 -#define ERROR_MP_EXTSHM_ACTIVE 101 #define ERROR_MP_VMGETINFO_FAILED 102 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103 @@ -178,9 +177,6 @@ uint32_t os::Aix::_os_version = 0; // -1 = uninitialized, 0 - no, 1 - yes int os::Aix::_xpg_sus_mode = -1; -// -1 = uninitialized, 0 - no, 1 - yes -int os::Aix::_extshm = -1; - //////////////////////////////////////////////////////////////////////////////// // local variables @@ -1195,13 +1191,6 @@ void os::print_memory_info(outputStream* st) { const char* const ldr_cntrl = ::getenv("LDR_CNTRL"); st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : ""); - // Print out EXTSHM because it is an unsupported setting. - const char* const extshm = ::getenv("EXTSHM"); - st->print_cr(" EXTSHM=%s.", extshm ? extshm : ""); - if ( (strcmp(extshm, "on") == 0) || (strcmp(extshm, "ON") == 0) ) { - st->print_cr(" *** Unsupported! Please remove EXTSHM from your environment! ***"); - } - // Print out AIXTHREAD_GUARDPAGES because it affects the size of pthread stacks. const char* const aixthread_guardpages = ::getenv("AIXTHREAD_GUARDPAGES"); st->print_cr(" AIXTHREAD_GUARDPAGES=%s.", @@ -2133,8 +2122,6 @@ void os::init(void) { // datapsize = 64k. Data segment, thread stacks are 64k paged. // This normally means that we can allocate 64k pages dynamically. - // (There is one special case where this may be false: EXTSHM=on. - // but we decided to not support that mode). assert0(g_multipage_support.can_use_64K_pages || g_multipage_support.can_use_64K_mmap_pages); set_page_size(64*K); @@ -2543,28 +2530,13 @@ void os::Aix::initialize_os_info() { void os::Aix::scan_environment() { char* p; - int rc; - // Warn explicitly if EXTSHM=ON is used. That switch changes how - // System V shared memory behaves. One effect is that page size of - // shared memory cannot be change dynamically, effectivly preventing - // large pages from working. - // This switch was needed on AIX 32bit, but on AIX 64bit the general - // recommendation is (in OSS notes) to switch it off. + // Reject EXTSHM=ON. That switch changes how System V shared memory behaves + // and prevents allocation of 64k pages for the heap. p = ::getenv("EXTSHM"); trcVerbose("EXTSHM=%s.", p ? p : ""); if (p && strcasecmp(p, "ON") == 0) { - _extshm = 1; - log_warning(os)("*** Unsupported mode! Please remove EXTSHM from your environment! ***"); - if (!AllowExtshm) { - // We allow under certain conditions the user to continue. However, we want this - // to be a fatal error by default. On certain AIX systems, leaving EXTSHM=ON means - // that the VM is not able to allocate 64k pages for the heap. - // We do not want to run with reduced performance. - vm_exit_during_initialization("EXTSHM is ON. Please remove EXTSHM from your environment."); - } - } else { - _extshm = 0; + vm_exit_during_initialization("EXTSHM is ON. Please remove EXTSHM from your environment."); } // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs. diff --git a/src/hotspot/os/aix/os_aix.hpp b/src/hotspot/os/aix/os_aix.hpp index a30e2077fc2..e21d2cf81bb 100644 --- a/src/hotspot/os/aix/os_aix.hpp +++ b/src/hotspot/os/aix/os_aix.hpp @@ -49,11 +49,6 @@ class os::Aix { // 1 - SPEC1170 requested (XPG_SUS_ENV is ON) static int _xpg_sus_mode; - // -1 = uninitialized, - // 0 - EXTSHM=OFF or not set - // 1 - EXTSHM=ON - static int _extshm; - static bool available_memory(physical_memory_size_type& value); static bool free_memory(physical_memory_size_type& value); static physical_memory_size_type physical_memory() { return _physical_memory; } @@ -111,12 +106,6 @@ class os::Aix { return _xpg_sus_mode; } - // Returns true if EXTSHM=ON. - static bool extshm() { - assert(_extshm != -1, "not initialized"); - return _extshm; - } - // result struct for get_meminfo() struct meminfo_t { diff --git a/src/hotspot/os_cpu/aix_ppc/vm_version_aix_ppc.cpp b/src/hotspot/os_cpu/aix_ppc/vm_version_aix_ppc.cpp new file mode 100644 index 00000000000..8cc8b715201 --- /dev/null +++ b/src/hotspot/os_cpu/aix_ppc/vm_version_aix_ppc.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2026 SAP SE. 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. + * + */ + +#include "runtime/vm_version.hpp" + +#include + +int VM_Version::get_dcache_line_size() { + return _system_configuration.dcache_line; +} + +int VM_Version::get_icache_line_size() { + return _system_configuration.icache_line; +} diff --git a/src/hotspot/os_cpu/linux_ppc/vm_version_linux_ppc.cpp b/src/hotspot/os_cpu/linux_ppc/vm_version_linux_ppc.cpp new file mode 100644 index 00000000000..d64340edf5c --- /dev/null +++ b/src/hotspot/os_cpu/linux_ppc/vm_version_linux_ppc.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2026 SAP SE. 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. + * + */ + +#include "runtime/vm_version.hpp" + +#include + +int VM_Version::get_dcache_line_size() { + // This should work on all modern linux versions: + int size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); + // It may fail with very old linux / glibc versions. We use DEFAULT_CACHE_LINE_SIZE in this case. + // That is the correct value for all currently supported processors. + return (size <= 0) ? DEFAULT_CACHE_LINE_SIZE : size; +} + +int VM_Version::get_icache_line_size() { + // This should work on all modern linux versions: + int size = sysconf(_SC_LEVEL1_ICACHE_LINESIZE); + // It may fail with very old linux / glibc versions. We use DEFAULT_CACHE_LINE_SIZE in this case. + // That is the correct value for all currently supported processors. + return (size <= 0) ? DEFAULT_CACHE_LINE_SIZE : size; +} diff --git a/src/hotspot/share/adlc/adlparse.cpp b/src/hotspot/share/adlc/adlparse.cpp index 356c24760e8..b49efa34be8 100644 --- a/src/hotspot/share/adlc/adlparse.cpp +++ b/src/hotspot/share/adlc/adlparse.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -993,9 +993,6 @@ void ADLParser::frame_parse(void) { if (strcmp(token,"frame_pointer")==0) { frame_pointer_parse(frame, false); } - if (strcmp(token,"interpreter_frame_pointer")==0) { - interpreter_frame_pointer_parse(frame, false); - } if (strcmp(token,"inline_cache_reg")==0) { inline_cache_parse(frame, false); } @@ -1119,11 +1116,6 @@ void ADLParser::frame_pointer_parse(FrameForm *frame, bool native) { else { frame->_frame_pointer = frame_pointer; } } -//------------------------------interpreter_frame_pointer_parse---------------------------- -void ADLParser::interpreter_frame_pointer_parse(FrameForm *frame, bool native) { - frame->_interpreter_frame_pointer_reg = parse_one_arg("interpreter frame pointer entry"); -} - //------------------------------inline_cache_parse----------------------------- void ADLParser::inline_cache_parse(FrameForm *frame, bool native) { frame->_inline_cache_reg = parse_one_arg("inline cache reg entry"); diff --git a/src/hotspot/share/adlc/adlparse.hpp b/src/hotspot/share/adlc/adlparse.hpp index 02baec53262..89296193612 100644 --- a/src/hotspot/share/adlc/adlparse.hpp +++ b/src/hotspot/share/adlc/adlparse.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -120,7 +120,6 @@ protected: // Parse the components of the frame section void sync_stack_slots_parse(FrameForm *frame); void frame_pointer_parse(FrameForm *frame, bool native); - void interpreter_frame_pointer_parse(FrameForm *frame, bool native); void inline_cache_parse(FrameForm *frame, bool native); void interpreter_arg_ptr_parse(FrameForm *frame, bool native); void interpreter_method_parse(FrameForm *frame, bool native); diff --git a/src/hotspot/share/adlc/formsopt.cpp b/src/hotspot/share/adlc/formsopt.cpp index fbd1043492e..091e34f40f4 100644 --- a/src/hotspot/share/adlc/formsopt.cpp +++ b/src/hotspot/share/adlc/formsopt.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -476,7 +476,6 @@ void AllocClass::forms_do(FormClosure* f) { FrameForm::FrameForm() { _sync_stack_slots = nullptr; _inline_cache_reg = nullptr; - _interpreter_frame_pointer_reg = nullptr; _cisc_spilling_operand_name = nullptr; _frame_pointer = nullptr; _c_frame_pointer = nullptr; diff --git a/src/hotspot/share/adlc/formsopt.hpp b/src/hotspot/share/adlc/formsopt.hpp index 9e0c9db854d..087ab1e2653 100644 --- a/src/hotspot/share/adlc/formsopt.hpp +++ b/src/hotspot/share/adlc/formsopt.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -347,7 +347,6 @@ public: // Public Data char *_sync_stack_slots; char *_inline_cache_reg; - char *_interpreter_frame_pointer_reg; char *_cisc_spilling_operand_name; char *_frame_pointer; char *_c_frame_pointer; diff --git a/src/hotspot/share/adlc/output_c.cpp b/src/hotspot/share/adlc/output_c.cpp index 9cbd6aaf66f..45b3d6bda63 100644 --- a/src/hotspot/share/adlc/output_c.cpp +++ b/src/hotspot/share/adlc/output_c.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -4212,14 +4212,6 @@ void ArchDesc::buildFrameMethods(FILE *fp_cpp) { fprintf(fp_cpp,"int Matcher::inline_cache_reg_encode() {"); fprintf(fp_cpp," return _regEncode[inline_cache_reg()]; }\n\n"); - // Interpreter's Frame Pointer Register - fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_frame_pointer_reg() {"); - if (_frame->_interpreter_frame_pointer_reg == nullptr) - fprintf(fp_cpp," return OptoReg::Bad; }\n\n"); - else - fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", - _frame->_interpreter_frame_pointer_reg); - // Frame Pointer definition /* CNC - I can not contemplate having a different frame pointer between Java and native code; makes my head hurt to think about it. diff --git a/src/hotspot/share/compiler/compilerDefinitions.cpp b/src/hotspot/share/compiler/compilerDefinitions.cpp index 9bd6e893bcd..b8244036835 100644 --- a/src/hotspot/share/compiler/compilerDefinitions.cpp +++ b/src/hotspot/share/compiler/compilerDefinitions.cpp @@ -447,9 +447,6 @@ void CompilerConfig::set_jvmci_specific_flags() { if (FLAG_IS_DEFAULT(InitialCodeCacheSize)) { FLAG_SET_DEFAULT(InitialCodeCacheSize, MAX2(16*M, InitialCodeCacheSize)); } - if (FLAG_IS_DEFAULT(NewSizeThreadIncrease)) { - FLAG_SET_DEFAULT(NewSizeThreadIncrease, MAX2(4*K, NewSizeThreadIncrease)); - } if (FLAG_IS_DEFAULT(Tier3DelayOn)) { // This effectively prevents the compile broker scheduling tier 2 // (i.e., limited C1 profiling) compilations instead of tier 3 diff --git a/src/hotspot/share/compiler/compiler_globals_pd.hpp b/src/hotspot/share/compiler/compiler_globals_pd.hpp index 6a87fdaaaf1..537a7f030fb 100644 --- a/src/hotspot/share/compiler/compiler_globals_pd.hpp +++ b/src/hotspot/share/compiler/compiler_globals_pd.hpp @@ -58,7 +58,6 @@ define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 0); define_pd_global(intx, OnStackReplacePercentage, 0); -define_pd_global(size_t, NewSizeThreadIncrease, 4*K); define_pd_global(bool, InlineClassNatives, true); define_pd_global(bool, InlineUnsafeOps, true); define_pd_global(size_t, InitialCodeCacheSize, 160*K); diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index 3f5d674c443..abc45254782 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -1652,21 +1652,13 @@ jint G1CollectedHeap::initialize() { return JNI_OK; } -bool G1CollectedHeap::concurrent_mark_is_terminating() const { - assert(_cm != nullptr, "_cm must have been created"); - assert(_cm->is_fully_initialized(), "thread must exist in order to check if mark is terminating"); - return _cm->cm_thread()->should_terminate(); -} - void G1CollectedHeap::stop() { // Stop all concurrent threads. We do this to make sure these threads // do not continue to execute and access resources (e.g. logging) // that are destroyed during shutdown. _cr->stop(); _service_thread->stop(); - if (_cm->is_fully_initialized()) { - _cm->cm_thread()->stop(); - } + _cm->stop(); } void G1CollectedHeap::safepoint_synchronize_begin() { @@ -1857,12 +1849,12 @@ void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent, record_whole_heap_examined_timestamp(); } - // We need to clear the "in_progress" flag in the CM thread before + // We need to tell G1ConcurrentMark to update the state before // we wake up any waiters (especially when ExplicitInvokesConcurrent // is set) so that if a waiter requests another System.gc() it doesn't // incorrectly see that a marking cycle is still in progress. if (concurrent) { - _cm->cm_thread()->set_idle(); + _cm->notify_concurrent_cycle_completed(); } // Notify threads waiting in System.gc() (with ExplicitGCInvokesConcurrent) @@ -2565,11 +2557,9 @@ void G1CollectedHeap::start_concurrent_cycle(bool concurrent_operation_is_full_m assert(!_cm->in_progress(), "Can not start concurrent operation while in progress"); MutexLocker x(G1CGC_lock, Mutex::_no_safepoint_check_flag); if (concurrent_operation_is_full_mark) { - _cm->post_concurrent_mark_start(); - _cm->cm_thread()->start_full_mark(); + _cm->start_full_concurrent_cycle(); } else { - _cm->post_concurrent_undo_start(); - _cm->cm_thread()->start_undo_mark(); + _cm->start_undo_concurrent_cycle(); } G1CGC_lock->notify(); } diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index 8ff9d481000..7a4cde9001e 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -915,9 +915,6 @@ public: // specified by the policy object. jint initialize() override; - // Returns whether concurrent mark threads (and the VM) are about to terminate. - bool concurrent_mark_is_terminating() const; - void safepoint_synchronize_begin() override; void safepoint_synchronize_end() override; diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp index 074231a02d4..b4a5d673fd2 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp @@ -581,6 +581,11 @@ PartialArrayStateManager* G1ConcurrentMark::partial_array_state_manager() const return _partial_array_state_manager; } +G1ConcurrentMarkThread* G1ConcurrentMark::cm_thread() const { + assert(is_fully_initialized(), "must be"); + return _cm_thread; +} + void G1ConcurrentMark::reset() { _has_aborted.store_relaxed(false); @@ -715,7 +720,6 @@ public: private: // Heap region closure used for clearing the _mark_bitmap. class G1ClearBitmapHRClosure : public G1HeapRegionClosure { - private: G1ConcurrentMark* _cm; G1CMBitMap* _bitmap; bool _suspendible; // If suspendible, do yield checks. @@ -959,7 +963,7 @@ void G1ConcurrentMark::pre_concurrent_start(GCCause::Cause cause) { _gc_tracer_cm->set_gc_cause(cause); } -void G1ConcurrentMark::post_concurrent_mark_start() { +void G1ConcurrentMark::start_full_concurrent_cycle() { // Start Concurrent Marking weak-reference discovery. ReferenceProcessor* rp = _g1h->ref_processor_cm(); rp->start_discovery(false /* always_clear */); @@ -976,10 +980,26 @@ void G1ConcurrentMark::post_concurrent_mark_start() { // when marking is on. So, it's also called at the end of the // concurrent start pause to update the heap end, if the heap expands // during it. No need to call it here. + + // Signal the thread to start work. + cm_thread()->start_full_mark(); } -void G1ConcurrentMark::post_concurrent_undo_start() { +void G1ConcurrentMark::start_undo_concurrent_cycle() { root_regions()->cancel_scan(); + + // Signal the thread to start work. + cm_thread()->start_undo_mark(); +} + +void G1ConcurrentMark::notify_concurrent_cycle_completed() { + cm_thread()->set_idle(); +} + +void G1ConcurrentMark::stop() { + if (is_fully_initialized()) { + cm_thread()->stop(); + } } /* @@ -1943,7 +1963,7 @@ bool G1ConcurrentMark::concurrent_cycle_abort() { // has been signalled is already rare), and this work should be negligible compared // to actual full gc work. - if (!is_fully_initialized() || (!cm_thread()->in_progress() && !_g1h->concurrent_mark_is_terminating())) { + if (!is_fully_initialized() || (!cm_thread()->in_progress() && !cm_thread()->should_terminate())) { return false; } diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp index 11da6dae5b3..8bd04437097 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp @@ -352,6 +352,7 @@ class G1ConcurrentMark : public CHeapObj { friend class G1CMRemarkTask; friend class G1CMRootRegionScanTask; friend class G1CMTask; + friend class G1ClearBitMapTask; friend class G1ConcurrentMarkThread; G1ConcurrentMarkThread* _cm_thread; // The thread doing the work @@ -524,6 +525,9 @@ class G1ConcurrentMark : public CHeapObj { Atomic* _top_at_rebuild_starts; // True when Remark pause selected regions for rebuilding. bool _needs_remembered_set_rebuild; + + G1ConcurrentMarkThread* cm_thread() const; + public: // To be called when an object is marked the first time, e.g. after a successful // mark_in_bitmap call. Updates various statistics data. @@ -602,8 +606,6 @@ public: G1RegionToSpaceMapper* bitmap_storage); ~G1ConcurrentMark(); - G1ConcurrentMarkThread* cm_thread() { return _cm_thread; } - G1CMBitMap* mark_bitmap() const { return (G1CMBitMap*)&_mark_bitmap; } // Calculates the number of concurrent GC threads to be used in the marking phase. @@ -632,8 +634,15 @@ public: // These two methods do the work that needs to be done at the start and end of the // concurrent start pause. void pre_concurrent_start(GCCause::Cause cause); - void post_concurrent_mark_start(); - void post_concurrent_undo_start(); + + // Start the particular type of concurrent cycle. After this call threads may be running. + void start_full_concurrent_cycle(); + void start_undo_concurrent_cycle(); + + void notify_concurrent_cycle_completed(); + + // Stop active components/the concurrent mark thread. + void stop(); // Scan all the root regions and mark everything reachable from // them. diff --git a/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp b/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp index 4dd0a509bcd..1b9704e8ad3 100644 --- a/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp +++ b/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -366,6 +366,12 @@ static size_t target_heap_capacity(size_t used_bytes, uintx free_ratio) { } size_t G1HeapSizingPolicy::full_collection_resize_amount(bool& expand, size_t allocation_word_size) { + // User-requested Full GCs introduce GC load unrelated to heap size; reset CPU + // usage tracking so heap resizing heuristics are driven only by GC pressure. + if (GCCause::is_user_requested_gc(_g1h->gc_cause())) { + reset_cpu_usage_tracking_data(); + } + const size_t capacity_after_gc = _g1h->capacity(); // Capacity, free and used after the GC counted as full regions to // include the waste in the following calculations. diff --git a/src/hotspot/share/gc/serial/cSpaceCounters.cpp b/src/hotspot/share/gc/serial/cSpaceCounters.cpp deleted file mode 100644 index f6bcee99423..00000000000 --- a/src/hotspot/share/gc/serial/cSpaceCounters.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2002, 2025, 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. - * - */ - -#include "gc/serial/cSpaceCounters.hpp" -#include "memory/allocation.inline.hpp" -#include "memory/resourceArea.hpp" - -CSpaceCounters::CSpaceCounters(const char* name, int ordinal, size_t max_size, - ContiguousSpace* s, GenerationCounters* gc) - : _space(s) { - if (UsePerfData) { - EXCEPTION_MARK; - ResourceMark rm; - - const char* cns = PerfDataManager::name_space(gc->name_space(), "space", - ordinal); - - _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC); - strcpy(_name_space, cns); - - const char* cname = PerfDataManager::counter_name(_name_space, "name"); - PerfDataManager::create_string_constant(SUN_GC, cname, name, CHECK); - - cname = PerfDataManager::counter_name(_name_space, "maxCapacity"); - _max_capacity = PerfDataManager::create_variable(SUN_GC, cname, - PerfData::U_Bytes, - (jlong)max_size, - CHECK); - - cname = PerfDataManager::counter_name(_name_space, "capacity"); - _capacity = PerfDataManager::create_variable(SUN_GC, cname, - PerfData::U_Bytes, - _space->capacity(), - CHECK); - - cname = PerfDataManager::counter_name(_name_space, "used"); - _used = PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes, - _space->used(), - CHECK); - - cname = PerfDataManager::counter_name(_name_space, "initCapacity"); - PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_Bytes, - _space->capacity(), CHECK); - } -} - -CSpaceCounters::~CSpaceCounters() { - FREE_C_HEAP_ARRAY(char, _name_space); -} - -void CSpaceCounters::update_capacity() { - _capacity->set_value(_space->capacity()); -} - -void CSpaceCounters::update_used() { - _used->set_value(_space->used()); -} - -void CSpaceCounters::update_all() { - update_used(); - update_capacity(); -} diff --git a/src/hotspot/share/gc/serial/cSpaceCounters.hpp b/src/hotspot/share/gc/serial/cSpaceCounters.hpp deleted file mode 100644 index 22a51cbbd20..00000000000 --- a/src/hotspot/share/gc/serial/cSpaceCounters.hpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2002, 2025, 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. - * - */ - -#ifndef SHARE_GC_SERIAL_CSPACECOUNTERS_HPP -#define SHARE_GC_SERIAL_CSPACECOUNTERS_HPP - -#include "gc/shared/generationCounters.hpp" -#include "gc/shared/space.hpp" -#include "runtime/perfData.hpp" - -// A CSpaceCounters is a holder class for performance counters -// that track a space; - -class CSpaceCounters: public CHeapObj { - private: - PerfVariable* _capacity; - PerfVariable* _used; - PerfVariable* _max_capacity; - - // Constant PerfData types don't need to retain a reference. - // However, it's a good idea to document them here. - // PerfConstant* _size; - - ContiguousSpace* _space; - char* _name_space; - - public: - - CSpaceCounters(const char* name, int ordinal, size_t max_size, - ContiguousSpace* s, GenerationCounters* gc); - - ~CSpaceCounters(); - - void update_capacity(); - void update_used(); - void update_all(); - - const char* name_space() const { return _name_space; } -}; - -#endif // SHARE_GC_SERIAL_CSPACECOUNTERS_HPP diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index 9ccc7b95529..ec3726d1dce 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -39,6 +39,7 @@ #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTrace.hpp" #include "gc/shared/gcTraceTime.inline.hpp" +#include "gc/shared/hSpaceCounters.hpp" #include "gc/shared/oopStorageSet.inline.hpp" #include "gc/shared/referencePolicy.hpp" #include "gc/shared/referenceProcessorPhaseTimes.hpp" @@ -248,12 +249,12 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs, min_size, max_size, _virtual_space.committed_size()); _gc_counters = new CollectorCounters(policy, 0); - _eden_counters = new CSpaceCounters("eden", 0, _max_eden_size, _eden_space, - _gen_counters); - _from_counters = new CSpaceCounters("s0", 1, _max_survivor_size, _from_space, - _gen_counters); - _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space, - _gen_counters); + _eden_counters = new HSpaceCounters(_gen_counters->name_space(), "eden", 0, + _max_eden_size, _eden_space->capacity()); + _from_counters = new HSpaceCounters(_gen_counters->name_space(), "s0", 1, + _max_survivor_size, _from_space->capacity()); + _to_counters = new HSpaceCounters(_gen_counters->name_space(), "s1", 2, + _max_survivor_size, _to_space->capacity()); update_counters(); _old_gen = nullptr; @@ -319,7 +320,7 @@ void DefNewGeneration::swap_spaces() { _to_space = s; if (UsePerfData) { - CSpaceCounters* c = _from_counters; + HSpaceCounters* c = _from_counters; _from_counters = _to_counters; _to_counters = c; } @@ -348,38 +349,6 @@ void DefNewGeneration::expand_eden_by(size_t delta_bytes) { post_resize(); } -size_t DefNewGeneration::calculate_thread_increase_size(int threads_count) const { - size_t thread_increase_size = 0; - // Check an overflow at 'threads_count * NewSizeThreadIncrease'. - if (threads_count > 0 && NewSizeThreadIncrease <= max_uintx / threads_count) { - thread_increase_size = threads_count * NewSizeThreadIncrease; - } - return thread_increase_size; -} - -size_t DefNewGeneration::adjust_for_thread_increase(size_t new_size_candidate, - size_t new_size_before, - size_t alignment, - size_t thread_increase_size) const { - size_t desired_new_size = new_size_before; - - if (NewSizeThreadIncrease > 0 && thread_increase_size > 0) { - - // 1. Check an overflow at 'new_size_candidate + thread_increase_size'. - if (new_size_candidate <= max_uintx - thread_increase_size) { - new_size_candidate += thread_increase_size; - - // 2. Check an overflow at 'align_up'. - size_t aligned_max = ((max_uintx - alignment) & ~(alignment-1)); - if (new_size_candidate <= aligned_max) { - desired_new_size = align_up(new_size_candidate, alignment); - } - } - } - - return desired_new_size; -} - size_t DefNewGeneration::calculate_desired_young_gen_bytes() const { size_t old_size = SerialHeap::heap()->old_gen()->capacity(); size_t new_size_before = _virtual_space.committed_size(); @@ -391,14 +360,8 @@ size_t DefNewGeneration::calculate_desired_young_gen_bytes() const { // All space sizes must be multiples of Generation::GenGrain. size_t alignment = Generation::GenGrain; - int threads_count = Threads::number_of_non_daemon_threads(); - size_t thread_increase_size = calculate_thread_increase_size(threads_count); - size_t new_size_candidate = old_size / NewRatio; - // Compute desired new generation size based on NewRatio and NewSizeThreadIncrease - // and reverts to previous value if any overflow happens - size_t desired_new_size = adjust_for_thread_increase(new_size_candidate, new_size_before, - alignment, thread_increase_size); + size_t desired_new_size = align_up(new_size_candidate, alignment); // Adjust new generation size desired_new_size = clamp(desired_new_size, min_new_size, max_new_size); @@ -821,9 +784,9 @@ void DefNewGeneration::gc_epilogue() { void DefNewGeneration::update_counters() { if (UsePerfData) { - _eden_counters->update_all(); - _from_counters->update_all(); - _to_counters->update_all(); + _eden_counters->update_all(_eden_space->capacity(), _eden_space->used()); + _from_counters->update_all(_from_space->capacity(), _from_space->used()); + _to_counters->update_all(_to_space->capacity(), _to_space->used()); _gen_counters->update_capacity(_virtual_space.committed_size()); } } diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index e0c7b6bba37..21241ec00ef 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -25,7 +25,6 @@ #ifndef SHARE_GC_SERIAL_DEFNEWGENERATION_HPP #define SHARE_GC_SERIAL_DEFNEWGENERATION_HPP -#include "gc/serial/cSpaceCounters.hpp" #include "gc/serial/generation.hpp" #include "gc/serial/tenuredGeneration.hpp" #include "gc/shared/ageTable.hpp" @@ -38,7 +37,7 @@ #include "utilities/stack.hpp" class ContiguousSpace; -class CSpaceCounters; +class HSpaceCounters; class OldGenScanClosure; class YoungGenScanClosure; class DefNewTracer; @@ -102,9 +101,9 @@ class DefNewGeneration: public Generation { // Performance Counters GenerationCounters* _gen_counters; - CSpaceCounters* _eden_counters; - CSpaceCounters* _from_counters; - CSpaceCounters* _to_counters; + HSpaceCounters* _eden_counters; + HSpaceCounters* _from_counters; + HSpaceCounters* _to_counters; // sizing information size_t _max_eden_size; @@ -230,15 +229,6 @@ class DefNewGeneration: public Generation { // Initialize eden/from/to spaces. void init_spaces(); - // Return adjusted new size for NewSizeThreadIncrease. - // If any overflow happens, revert to previous new size. - size_t adjust_for_thread_increase(size_t new_size_candidate, - size_t new_size_before, - size_t alignment, - size_t thread_increase_size) const; - - size_t calculate_thread_increase_size(int threads_count) const; - // Scavenge support void swap_spaces(); diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp index f68847ed1a6..95a996a98c1 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp @@ -32,6 +32,7 @@ #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTrace.hpp" #include "gc/shared/genArguments.hpp" +#include "gc/shared/hSpaceCounters.hpp" #include "gc/shared/space.hpp" #include "gc/shared/spaceDecorator.hpp" #include "logging/log.hpp" @@ -330,9 +331,9 @@ TenuredGeneration::TenuredGeneration(ReservedSpace rs, _gc_counters = new CollectorCounters("Serial full collection pauses", 1); - _space_counters = new CSpaceCounters(gen_name, 0, + _space_counters = new HSpaceCounters(_gen_counters->name_space(), gen_name, 0, _virtual_space.reserved_size(), - _the_space, _gen_counters); + _the_space->capacity()); } void TenuredGeneration::gc_prologue() { @@ -367,7 +368,7 @@ void TenuredGeneration::update_promote_stats() { void TenuredGeneration::update_counters() { if (UsePerfData) { - _space_counters->update_all(); + _space_counters->update_all(_the_space->capacity(), _the_space->used()); _gen_counters->update_capacity(_virtual_space.committed_size()); } } diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.hpp b/src/hotspot/share/gc/serial/tenuredGeneration.hpp index ff73ab72b2c..1e3576d5ae7 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.hpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.hpp @@ -25,7 +25,6 @@ #ifndef SHARE_GC_SERIAL_TENUREDGENERATION_HPP #define SHARE_GC_SERIAL_TENUREDGENERATION_HPP -#include "gc/serial/cSpaceCounters.hpp" #include "gc/serial/generation.hpp" #include "gc/serial/serialBlockOffsetTable.hpp" #include "gc/shared/generationCounters.hpp" @@ -34,6 +33,7 @@ class CardTableRS; class ContiguousSpace; +class HSpaceCounters; // TenuredGeneration models the heap containing old (promoted/tenured) objects // contained in a single contiguous space. This generation is covered by a card @@ -68,7 +68,7 @@ class TenuredGeneration: public Generation { ContiguousSpace* _the_space; // Actual space holding objects GenerationCounters* _gen_counters; - CSpaceCounters* _space_counters; + HSpaceCounters* _space_counters; // Avg amount promoted; used for avoiding promotion undo // This class does not update deviations if the sample is zero. diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp index f13c3ab7b6e..100866bb528 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -289,7 +289,7 @@ protected: DEBUG_ONLY(bool is_in_or_null(const void* p) const { return p == nullptr || is_in(p); }) void set_gc_cause(GCCause::Cause v); - GCCause::Cause gc_cause() { return _gc_cause; } + GCCause::Cause gc_cause() const { return _gc_cause; } oop obj_allocate(Klass* klass, size_t size, TRAPS); virtual oop array_allocate(Klass* klass, size_t size, int length, bool do_zero, TRAPS); diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 65c970435e5..2fd062de648 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -480,11 +480,6 @@ "Ratio of old/new generation sizes") \ range(0, max_uintx-1) \ \ - product_pd(size_t, NewSizeThreadIncrease, \ - "Additional size added to desired new generation size per " \ - "non-daemon thread (in bytes)") \ - range(0, max_uintx) \ - \ product(uintx, QueuedAllocationWarningCount, 0, \ "Number of times an allocation that queues behind a GC " \ "will retry before printing a warning") \ diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp index 0bd835d51f3..31b5a3ffb80 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp @@ -137,7 +137,7 @@ void ShenandoahCollectionSet::clear() { _live = 0; _region_count = 0; - _current_index = 0; + _current_index.store_relaxed(0); _young_bytes_to_evacuate = 0; _young_bytes_to_promote = 0; @@ -155,11 +155,11 @@ ShenandoahHeapRegion* ShenandoahCollectionSet::claim_next() { // before hitting the (potentially contended) atomic index. size_t max = _heap->num_regions(); - size_t old = AtomicAccess::load(&_current_index); + size_t old = _current_index.load_relaxed(); for (size_t index = old; index < max; index++) { if (is_in(index)) { - size_t cur = AtomicAccess::cmpxchg(&_current_index, old, index + 1, memory_order_relaxed); + size_t cur = _current_index.compare_exchange(old, index + 1, memory_order_relaxed); assert(cur >= old, "Always move forward"); if (cur == old) { // Successfully moved the claim index, this is our region. @@ -179,9 +179,9 @@ ShenandoahHeapRegion* ShenandoahCollectionSet::next() { assert(Thread::current()->is_VM_thread(), "Must be VMThread"); size_t max = _heap->num_regions(); - for (size_t index = _current_index; index < max; index++) { + for (size_t index = _current_index.load_relaxed(); index < max; index++) { if (is_in(index)) { - _current_index = index + 1; + _current_index.store_relaxed(index + 1); return _heap->get_region(index); } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp index c99271de1fb..87b4597c93f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp @@ -32,6 +32,7 @@ #include "memory/allocation.hpp" #include "memory/reservedSpace.hpp" #include "memory/virtualspace.hpp" +#include "runtime/atomic.hpp" class ShenandoahCollectionSet : public CHeapObj { friend class ShenandoahHeap; @@ -80,7 +81,7 @@ private: size_t _old_available_bytes_collected; shenandoah_padding(0); - volatile size_t _current_index; + Atomic _current_index; shenandoah_padding(1); public: @@ -99,7 +100,7 @@ public: bool is_empty() const { return _region_count == 0; } void clear_current_index() { - _current_index = 0; + _current_index.store_relaxed(0); } inline bool is_in(ShenandoahHeapRegion* r) const; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahController.cpp b/src/hotspot/share/gc/shenandoah/shenandoahController.cpp index 220f3df8d4f..50aabad7d42 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahController.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahController.cpp @@ -31,11 +31,11 @@ void ShenandoahController::update_gc_id() { - AtomicAccess::inc(&_gc_id); + _gc_id.add_then_fetch((size_t)1); } size_t ShenandoahController::get_gc_id() { - return AtomicAccess::load(&_gc_id); + return _gc_id.load_relaxed(); } void ShenandoahController::handle_alloc_failure(const ShenandoahAllocRequest& req, bool block) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahController.hpp b/src/hotspot/share/gc/shenandoah/shenandoahController.hpp index b8ff4df4771..60b41a5fe99 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahController.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahController.hpp @@ -29,6 +29,7 @@ #include "gc/shared/gcCause.hpp" #include "gc/shenandoah/shenandoahAllocRequest.hpp" #include "gc/shenandoah/shenandoahSharedVariables.hpp" +#include "runtime/atomic.hpp" /** * This interface exposes methods necessary for the heap to interact @@ -38,7 +39,7 @@ class ShenandoahController: public ConcurrentGCThread { private: shenandoah_padding(0); // A monotonically increasing GC count. - volatile size_t _gc_id; + Atomic _gc_id; shenandoah_padding(1); protected: diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp index aed3faef906..ff1e3368e87 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp @@ -32,7 +32,6 @@ #include "gc/shenandoah/shenandoahHeapRegionSet.hpp" #include "logging/logStream.hpp" #include "memory/resourceArea.hpp" -#include "runtime/atomicAccess.hpp" #include "runtime/perfData.inline.hpp" #include "utilities/defaultStream.hpp" @@ -106,8 +105,8 @@ void ShenandoahHeapRegionCounters::write_snapshot(PerfLongVariable** regions, void ShenandoahHeapRegionCounters::update() { if (ShenandoahRegionSampling) { jlong current = nanos_to_millis(os::javaTimeNanos()); - jlong last = _last_sample_millis; - if (current - last > ShenandoahRegionSamplingRate && AtomicAccess::cmpxchg(&_last_sample_millis, last, current) == last) { + jlong last = _last_sample_millis.load_relaxed(); + if (current - last > ShenandoahRegionSamplingRate && _last_sample_millis.compare_exchange(last, current) == last) { ShenandoahHeap* heap = ShenandoahHeap::heap(); _status->set_value(encode_heap_status(heap)); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp index 508b40e49a8..d50188bf70c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp @@ -28,6 +28,7 @@ #include "logging/logFileStreamOutput.hpp" #include "memory/allocation.hpp" +#include "runtime/atomic.hpp" /** * This provides the following in JVMStat: @@ -88,7 +89,7 @@ private: PerfLongVariable** _regions_data; PerfLongVariable* _timestamp; PerfLongVariable* _status; - volatile jlong _last_sample_millis; + Atomic _last_sample_millis; void write_snapshot(PerfLongVariable** regions, PerfLongVariable* ts, diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp index 32c63e9b186..1ddd8e1c032 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp @@ -198,11 +198,11 @@ void BinaryMagnitudeSeq::clear() { for (int c = 0; c < BitsPerSize_t; c++) { _mags[c] = 0; } - _sum = 0; + _sum.store_relaxed(0); } void BinaryMagnitudeSeq::add(size_t val) { - AtomicAccess::add(&_sum, val); + _sum.add_then_fetch(val); int mag = log2i_graceful(val) + 1; @@ -237,7 +237,7 @@ size_t BinaryMagnitudeSeq::num() const { } size_t BinaryMagnitudeSeq::sum() const { - return _sum; + return _sum.load_relaxed(); } int BinaryMagnitudeSeq::min_level() const { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp index 68f3cfba97a..1a14f930174 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHNUMBERSEQ_HPP #define SHARE_GC_SHENANDOAH_SHENANDOAHNUMBERSEQ_HPP +#include "runtime/atomic.hpp" #include "utilities/numberSeq.hpp" // HDR sequence stores the low-resolution high-dynamic-range values. @@ -59,7 +60,7 @@ public: // is not needed, it is preferred over HdrSeq. class BinaryMagnitudeSeq : public CHeapObj { private: - size_t _sum; + Atomic _sum; size_t* _mags; public: diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp index 9e6b1960708..7b68e6ac625 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp @@ -45,7 +45,7 @@ ShenandoahJavaThreadsIterator::ShenandoahJavaThreadsIterator(ShenandoahPhaseTimi } uint ShenandoahJavaThreadsIterator::claim() { - return AtomicAccess::fetch_then_add(&_claimed, _stride, memory_order_relaxed); + return _claimed.fetch_then_add(_stride, memory_order_relaxed); } void ShenandoahJavaThreadsIterator::threads_do(ThreadClosure* cl, uint worker_id) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp index 29d8c9fac2d..55367e706a2 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp @@ -33,6 +33,7 @@ #include "gc/shenandoah/shenandoahSharedVariables.hpp" #include "gc/shenandoah/shenandoahUtils.hpp" #include "memory/iterator.hpp" +#include "runtime/atomic.hpp" #include "runtime/threads.hpp" template @@ -73,7 +74,7 @@ private: ThreadsListHandle _threads; uint const _length; uint const _stride; - volatile uint _claimed; + Atomic _claimed; ShenandoahPhaseTimings::Phase _phase; uint claim(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp index 05af25f13ad..9e160d5b294 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp @@ -1024,7 +1024,7 @@ ShenandoahRegionChunkIterator::ShenandoahRegionChunkIterator(ShenandoahHeap* hea } void ShenandoahRegionChunkIterator::reset() { - _index = 0; + _index.store_relaxed(0); } ShenandoahReconstructRememberedSetTask::ShenandoahReconstructRememberedSetTask(ShenandoahRegionIterator* regions) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp index c758873a040..c2c117e86e6 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp @@ -973,7 +973,7 @@ private: const size_t _total_chunks; shenandoah_padding(0); - volatile size_t _index; + Atomic _index; shenandoah_padding(1); size_t _region_index[_maximum_groups]; // The region index for the first region spanned by this group diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp index e394daa68c0..3c82efee16c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp @@ -380,14 +380,14 @@ ShenandoahScanRemembered::process_region_slice(ShenandoahHeapRegion *region, siz } inline bool ShenandoahRegionChunkIterator::has_next() const { - return _index < _total_chunks; + return _index.load_relaxed() < _total_chunks; } inline bool ShenandoahRegionChunkIterator::next(struct ShenandoahRegionChunk *assignment) { - if (_index >= _total_chunks) { + if (_index.load_relaxed() >= _total_chunks) { return false; } - size_t new_index = AtomicAccess::add(&_index, (size_t) 1, memory_order_relaxed); + size_t new_index = _index.add_then_fetch((size_t) 1, memory_order_relaxed); if (new_index > _total_chunks) { // First worker that hits new_index == _total_chunks continues, other // contending workers return false. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp index 969edafbf75..42db0b2fd2c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp @@ -30,6 +30,7 @@ #include "gc/shared/taskTerminator.hpp" #include "gc/shenandoah/shenandoahPadding.hpp" #include "nmt/memTag.hpp" +#include "runtime/atomic.hpp" #include "runtime/atomicAccess.hpp" #include "runtime/javaThread.hpp" #include "runtime/mutex.hpp" @@ -306,7 +307,7 @@ template class ParallelClaimableQueueSet: public GenericTaskQueueSet { private: shenandoah_padding(0); - volatile jint _claimed_index; + Atomic _claimed_index; shenandoah_padding(1); DEBUG_ONLY(uint _reserved; ) @@ -325,7 +326,7 @@ public: // reserve queues that not for parallel claiming void reserve(uint n) { assert(n <= size(), "Sanity"); - _claimed_index = (jint)n; + _claimed_index.store_relaxed((jint)n); DEBUG_ONLY(_reserved = n;) } @@ -336,11 +337,11 @@ template T* ParallelClaimableQueueSet::claim_next() { jint size = (jint)GenericTaskQueueSet::size(); - if (_claimed_index >= size) { + if (_claimed_index.load_relaxed() >= size) { return nullptr; } - jint index = AtomicAccess::add(&_claimed_index, 1, memory_order_relaxed); + jint index = _claimed_index.add_then_fetch(1, memory_order_relaxed); if (index <= size) { return GenericTaskQueueSet::queue((uint)index - 1); diff --git a/src/hotspot/share/gc/z/zBitField.hpp b/src/hotspot/share/gc/z/zBitField.hpp index 9bec4e05594..b68f5b92ce1 100644 --- a/src/hotspot/share/gc/z/zBitField.hpp +++ b/src/hotspot/share/gc/z/zBitField.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -74,7 +74,7 @@ public: static ContainerType encode(ValueType value) { assert(((ContainerType)value & (FieldMask << ValueShift)) == (ContainerType)value, "Invalid value"); - return ((ContainerType)value >> ValueShift) << FieldShift; + return checked_cast(((ContainerType)value >> ValueShift) << FieldShift); } }; diff --git a/src/hotspot/share/interpreter/oopMapCache.cpp b/src/hotspot/share/interpreter/oopMapCache.cpp index 29d6825d3e5..d7c02296f33 100644 --- a/src/hotspot/share/interpreter/oopMapCache.cpp +++ b/src/hotspot/share/interpreter/oopMapCache.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -78,14 +78,10 @@ class OopMapForCacheEntry: public GenerateOopMap { int _stack_top; virtual bool report_results() const { return false; } - virtual bool possible_gc_point (BytecodeStream *bcs); - virtual void fill_stackmap_prolog (int nof_gc_points); - virtual void fill_stackmap_epilog (); virtual void fill_stackmap_for_opcodes (BytecodeStream *bcs, CellTypeState* vars, CellTypeState* stack, int stack_top); - virtual void fill_init_vars (GrowableArray *init_vars); public: OopMapForCacheEntry(const methodHandle& method, int bci, OopMapCacheEntry *entry); @@ -120,26 +116,6 @@ bool OopMapForCacheEntry::compute_map(Thread* current) { } -bool OopMapForCacheEntry::possible_gc_point(BytecodeStream *bcs) { - return false; // We are not reporting any result. We call result_for_basicblock directly -} - - -void OopMapForCacheEntry::fill_stackmap_prolog(int nof_gc_points) { - // Do nothing -} - - -void OopMapForCacheEntry::fill_stackmap_epilog() { - // Do nothing -} - - -void OopMapForCacheEntry::fill_init_vars(GrowableArray *init_vars) { - // Do nothing -} - - void OopMapForCacheEntry::fill_stackmap_for_opcodes(BytecodeStream *bcs, CellTypeState* vars, CellTypeState* stack, diff --git a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp index 9aef92c4182..2c341f2385e 100644 --- a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp +++ b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 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 @@ -26,8 +26,10 @@ #include "jfr/leakprofiler/chains/edgeUtils.hpp" #include "jfr/leakprofiler/sampling/objectSample.hpp" #include "jfr/leakprofiler/utilities/unifiedOopRef.inline.hpp" +#include "jfr/recorder/service/jfrOptionSet.hpp" #include "oops/oop.inline.hpp" #include "runtime/safepoint.hpp" +#include "utilities/resizableHashTable.hpp" StoredEdge::StoredEdge(const Edge* parent, UnifiedOopRef reference) : Edge(parent, reference), _gc_root_id(0), _skip_length(0) {} @@ -216,84 +218,62 @@ bool EdgeStore::put_edges(StoredEdge** previous, const Edge** current, size_t li return nullptr == *current; } -static GrowableArray* _leak_context_edges = nullptr; +typedef ResizeableHashTable SampleToLeakContextEdgeMap; +static SampleToLeakContextEdgeMap* _sample_to_leak_context_edge_map = nullptr; EdgeStore::EdgeStore() : _edges(new EdgeHashTable(this)) {} EdgeStore::~EdgeStore() { assert(_edges != nullptr, "invariant"); delete _edges; - delete _leak_context_edges; - _leak_context_edges = nullptr; + delete _sample_to_leak_context_edge_map; + _sample_to_leak_context_edge_map = nullptr; } -static int leak_context_edge_idx(const ObjectSample* sample) { +static const StoredEdge* leak_context_edge(const ObjectSample* sample) { assert(sample != nullptr, "invariant"); - return static_cast(sample->object()->mark().value()) >> markWord::lock_bits; + assert(_sample_to_leak_context_edge_map != nullptr, "invariant"); + const StoredEdge** edge = _sample_to_leak_context_edge_map->get(p2u(sample->object())); + return edge != nullptr ? *edge : nullptr; } bool EdgeStore::has_leak_context(const ObjectSample* sample) const { - const int idx = leak_context_edge_idx(sample); - if (idx == 0) { - return false; - } - assert(idx > 0, "invariant"); - assert(_leak_context_edges != nullptr, "invariant"); - assert(idx < _leak_context_edges->length(), "invariant"); - assert(_leak_context_edges->at(idx) != nullptr, "invariant"); - return true; + return _sample_to_leak_context_edge_map != nullptr && leak_context_edge(sample) != nullptr; } const StoredEdge* EdgeStore::get(const ObjectSample* sample) const { assert(sample != nullptr, "invariant"); - if (_leak_context_edges != nullptr) { + if (_sample_to_leak_context_edge_map != nullptr) { assert(SafepointSynchronize::is_at_safepoint(), "invariant"); - const int idx = leak_context_edge_idx(sample); - if (idx > 0) { - assert(idx < _leak_context_edges->length(), "invariant"); - const StoredEdge* const edge =_leak_context_edges->at(idx); - assert(edge != nullptr, "invariant"); + const StoredEdge* const edge = leak_context_edge(sample); + if (edge != nullptr) { return edge; } } return get(UnifiedOopRef::encode_in_native(sample->object_addr())); } -#ifdef ASSERT -// max_idx to ensure idx fit in lower 32-bits of markword together with lock bits. -static constexpr const int max_idx = right_n_bits(32 - markWord::lock_bits); +static constexpr const unsigned max_map_size = max_jint >> 1; -static void store_idx_precondition(oop sample_object, int idx) { - assert(sample_object != nullptr, "invariant"); - assert(sample_object->mark().is_marked(), "invariant"); - assert(idx > 0, "invariant"); - assert(idx <= max_idx, "invariant"); -} -#endif - -static void store_idx_in_markword(oop sample_object, int idx) { - DEBUG_ONLY(store_idx_precondition(sample_object, idx);) - const markWord idx_mark_word(sample_object->mark().value() | idx << markWord::lock_bits); - sample_object->set_mark(idx_mark_word); - assert(sample_object->mark().is_marked(), "must still be marked"); -} - -static const int initial_size = 64; - -static int save(const StoredEdge* edge) { - assert(edge != nullptr, "invariant"); - if (_leak_context_edges == nullptr) { - _leak_context_edges = new (mtTracing) GrowableArray(initial_size, mtTracing); - _leak_context_edges->append(nullptr); // next idx now at 1, for disambiguation in markword. +static inline unsigned map_size() { + assert(JfrOptionSet::old_object_queue_size() > 0, "invariant"); + unsigned size = JfrOptionSet::old_object_queue_size(); + size = round_up_power_of_2(size); + if (size < 1024) { + return 1024; } - return _leak_context_edges->append(edge); + size <<= 1; + return size >= max_map_size ? max_map_size : size; } -// We associate the leak context edge with the leak candidate object by saving the -// edge in an array and storing the array idx (shifted) into the markword of the candidate object. static void associate_with_candidate(const StoredEdge* leak_context_edge) { assert(leak_context_edge != nullptr, "invariant"); - store_idx_in_markword(leak_context_edge->pointee(), save(leak_context_edge)); + if (_sample_to_leak_context_edge_map == nullptr) { + const unsigned size = map_size(); + _sample_to_leak_context_edge_map = new (mtTracing) SampleToLeakContextEdgeMap(size, size); + } + assert(_sample_to_leak_context_edge_map != nullptr, "invariant"); + _sample_to_leak_context_edge_map->put(p2u(leak_context_edge->pointee()), leak_context_edge); } StoredEdge* EdgeStore::associate_leak_context_with_candidate(const Edge* edge) { diff --git a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.hpp b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.hpp index e920fd64ea9..460314854b7 100644 --- a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.hpp +++ b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 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 @@ -39,7 +39,6 @@ class StoredEdge : public Edge { size_t _skip_length; public: - StoredEdge(); StoredEdge(const Edge* parent, UnifiedOopRef reference); StoredEdge(const Edge& edge); StoredEdge(const StoredEdge& edge); diff --git a/src/hotspot/share/oops/arrayKlass.cpp b/src/hotspot/share/oops/arrayKlass.cpp index 30a2bc5102a..8a73f58b46a 100644 --- a/src/hotspot/share/oops/arrayKlass.cpp +++ b/src/hotspot/share/oops/arrayKlass.cpp @@ -41,7 +41,7 @@ #include "oops/oop.inline.hpp" #include "runtime/handles.inline.hpp" -ArrayKlass::ArrayKlass() { +ArrayKlass::ArrayKlass() : _dimension() { assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for CDS"); } @@ -88,9 +88,9 @@ Method* ArrayKlass::uncached_lookup_method(const Symbol* name, return super()->uncached_lookup_method(name, signature, OverpassLookupMode::skip, private_mode); } -ArrayKlass::ArrayKlass(Symbol* name, KlassKind kind) : +ArrayKlass::ArrayKlass(int n, Symbol* name, KlassKind kind) : Klass(kind), - _dimension(1), + _dimension(n), _higher_dimension(nullptr), _lower_dimension(nullptr) { // Arrays don't add any new methods, so their vtable is the same size as diff --git a/src/hotspot/share/oops/arrayKlass.hpp b/src/hotspot/share/oops/arrayKlass.hpp index b9b100f18a8..738387c57b4 100644 --- a/src/hotspot/share/oops/arrayKlass.hpp +++ b/src/hotspot/share/oops/arrayKlass.hpp @@ -38,7 +38,7 @@ class ArrayKlass: public Klass { private: // If you add a new field that points to any metaspace object, you // must add this field to ArrayKlass::metaspace_pointers_do(). - int _dimension; // This is n'th-dimensional array. + const int _dimension; // This is n'th-dimensional array. ObjArrayKlass* volatile _higher_dimension; // Refers the (n+1)'th-dimensional array (if present). ArrayKlass* volatile _lower_dimension; // Refers the (n-1)'th-dimensional array (if present). @@ -46,7 +46,7 @@ class ArrayKlass: public Klass { // Constructors // The constructor with the Symbol argument does the real array // initialization, the other is a dummy - ArrayKlass(Symbol* name, KlassKind kind); + ArrayKlass(int n, Symbol* name, KlassKind kind); ArrayKlass(); public: @@ -63,7 +63,6 @@ class ArrayKlass: public Klass { // Instance variables int dimension() const { return _dimension; } - void set_dimension(int dimension) { _dimension = dimension; } ObjArrayKlass* higher_dimension() const { return _higher_dimension; } inline ObjArrayKlass* higher_dimension_acquire() const; // load with acquire semantics diff --git a/src/hotspot/share/oops/generateOopMap.cpp b/src/hotspot/share/oops/generateOopMap.cpp index 97d8bf3d526..5e12c57676d 100644 --- a/src/hotspot/share/oops/generateOopMap.cpp +++ b/src/hotspot/share/oops/generateOopMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -391,7 +391,6 @@ void CellTypeState::print(outputStream *os) { // void GenerateOopMap::initialize_bb() { - _gc_points = 0; _bb_count = 0; _bb_hdr_bits.reinitialize(method()->code_size()); } @@ -409,7 +408,7 @@ void GenerateOopMap::bb_mark_fct(GenerateOopMap *c, int bci, int *data) { } -void GenerateOopMap::mark_bbheaders_and_count_gc_points() { +void GenerateOopMap::mark_bbheaders() { initialize_bb(); bool fellThrough = false; // False to get first BB marked. @@ -445,9 +444,6 @@ void GenerateOopMap::mark_bbheaders_and_count_gc_points() { default: break; } - - if (possible_gc_point(&bcs)) - _gc_points++; } } @@ -2119,8 +2115,6 @@ bool GenerateOopMap::compute_map(Thread* current) { // if no code - do nothing // compiler needs info if (method()->code_size() == 0 || _max_locals + method()->max_stack() == 0) { - fill_stackmap_prolog(0); - fill_stackmap_epilog(); return true; } // Step 1: Compute all jump targets and their return value @@ -2129,7 +2123,7 @@ bool GenerateOopMap::compute_map(Thread* current) { // Step 2: Find all basic blocks and count GC points if (!_got_error) - mark_bbheaders_and_count_gc_points(); + mark_bbheaders(); // Step 3: Calculate stack maps if (!_got_error) @@ -2186,9 +2180,6 @@ void GenerateOopMap::report_result() { // We now want to report the result of the parse _report_result = true; - // Prolog code - fill_stackmap_prolog(_gc_points); - // Mark everything changed, then do one interpretation pass. for (int i = 0; i<_bb_count; i++) { if (_basic_blocks[i].is_reachable()) { @@ -2197,14 +2188,6 @@ void GenerateOopMap::report_result() { } } - // Note: Since we are skipping dead-code when we are reporting results, then - // the no. of encountered gc-points might be fewer than the previously number - // we have counted. (dead-code is a pain - it should be removed before we get here) - fill_stackmap_epilog(); - - // Report initvars - fill_init_vars(_init_vars); - _report_result = false; } diff --git a/src/hotspot/share/oops/generateOopMap.hpp b/src/hotspot/share/oops/generateOopMap.hpp index 0da3779d463..783e295f08a 100644 --- a/src/hotspot/share/oops/generateOopMap.hpp +++ b/src/hotspot/share/oops/generateOopMap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -348,17 +348,15 @@ class GenerateOopMap { // Basicblock info BasicBlock * _basic_blocks; // Array of basicblock info - int _gc_points; int _bb_count; ResourceBitMap _bb_hdr_bits; // Basicblocks methods void initialize_bb (); - void mark_bbheaders_and_count_gc_points(); + void mark_bbheaders(); bool is_bb_header (int bci) const { return _bb_hdr_bits.at(bci); } - int gc_points () const { return _gc_points; } int bb_count () const { return _bb_count; } void set_bbmark_bit (int bci); BasicBlock * get_basic_block_at (int bci) const; @@ -450,7 +448,7 @@ class GenerateOopMap { int binsToHold (int no) { return ((no+(BitsPerWord-1))/BitsPerWord); } char *state_vec_to_string (CellTypeState* vec, int len); - // Helper method. Can be used in subclasses to fx. calculate gc_points. If the current instruction + // Helper method. If the current instruction // is a control transfer, then calls the jmpFct all possible destinations. void ret_jump_targets_do (BytecodeStream *bcs, jmpFct_t jmpFct, int varNo,int *data); bool jump_targets_do (BytecodeStream *bcs, jmpFct_t jmpFct, int *data); @@ -480,14 +478,7 @@ class GenerateOopMap { bool monitor_safe() { return _monitor_safe; } // Specialization methods. Intended use: - // - possible_gc_point must return true for every bci for which the stackmaps must be returned - // - fill_stackmap_prolog is called just before the result is reported. The arguments tells the estimated - // number of gc points // - fill_stackmap_for_opcodes is called once for each bytecode index in order (0...code_length-1) - // - fill_stackmap_epilog is called after all results has been reported. Note: Since the algorithm does not report - // stackmaps for deadcode, fewer gc_points might have been encountered than assumed during the epilog. It is the - // responsibility of the subclass to count the correct number. - // - fill_init_vars are called once with the result of the init_vars computation // // All these methods are used during a call to: compute_map. Note: Non of the return results are valid // after compute_map returns, since all values are allocated as resource objects. @@ -496,14 +487,10 @@ class GenerateOopMap { virtual bool allow_rewrites () const { return false; } virtual bool report_results () const { return true; } virtual bool report_init_vars () const { return true; } - virtual bool possible_gc_point (BytecodeStream *bcs) { ShouldNotReachHere(); return false; } - virtual void fill_stackmap_prolog (int nof_gc_points) { ShouldNotReachHere(); } - virtual void fill_stackmap_epilog () { ShouldNotReachHere(); } virtual void fill_stackmap_for_opcodes (BytecodeStream *bcs, CellTypeState* vars, CellTypeState* stack, int stackTop) { ShouldNotReachHere(); } - virtual void fill_init_vars (GrowableArray *init_vars) { ShouldNotReachHere();; } }; // @@ -513,19 +500,13 @@ class GenerateOopMap { class ResolveOopMapConflicts: public GenerateOopMap { private: - bool _must_clear_locals; - virtual bool report_results() const { return false; } virtual bool report_init_vars() const { return true; } virtual bool allow_rewrites() const { return true; } - virtual bool possible_gc_point (BytecodeStream *bcs) { return false; } - virtual void fill_stackmap_prolog (int nof_gc_points) {} - virtual void fill_stackmap_epilog () {} virtual void fill_stackmap_for_opcodes (BytecodeStream *bcs, CellTypeState* vars, CellTypeState* stack, int stack_top) {} - virtual void fill_init_vars (GrowableArray *init_vars) { _must_clear_locals = init_vars->length() > 0; } #ifndef PRODUCT // Statistics @@ -535,10 +516,8 @@ class ResolveOopMapConflicts: public GenerateOopMap { #endif public: - ResolveOopMapConflicts(const methodHandle& method) : GenerateOopMap(method) { _must_clear_locals = false; }; - + ResolveOopMapConflicts(const methodHandle& method) : GenerateOopMap(method) { } methodHandle do_potential_rewrite(TRAPS); - bool must_clear_locals() const { return _must_clear_locals; } }; @@ -551,14 +530,10 @@ class GeneratePairingInfo: public GenerateOopMap { virtual bool report_results() const { return false; } virtual bool report_init_vars() const { return false; } virtual bool allow_rewrites() const { return false; } - virtual bool possible_gc_point (BytecodeStream *bcs) { return false; } - virtual void fill_stackmap_prolog (int nof_gc_points) {} - virtual void fill_stackmap_epilog () {} virtual void fill_stackmap_for_opcodes (BytecodeStream *bcs, CellTypeState* vars, CellTypeState* stack, int stack_top) {} - virtual void fill_init_vars (GrowableArray *init_vars) {} public: GeneratePairingInfo(const methodHandle& method) : GenerateOopMap(method) {}; diff --git a/src/hotspot/share/oops/objArrayKlass.cpp b/src/hotspot/share/oops/objArrayKlass.cpp index 2bbe898adbd..fccd02f14e6 100644 --- a/src/hotspot/share/oops/objArrayKlass.cpp +++ b/src/hotspot/share/oops/objArrayKlass.cpp @@ -120,8 +120,7 @@ ObjArrayKlass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_da return oak; } -ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name, Kind) { - set_dimension(n); +ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(n, name, Kind) { set_element_klass(element_klass); Klass* bk; diff --git a/src/hotspot/share/oops/typeArrayKlass.cpp b/src/hotspot/share/oops/typeArrayKlass.cpp index bdf37c7db49..7dbea9ce475 100644 --- a/src/hotspot/share/oops/typeArrayKlass.cpp +++ b/src/hotspot/share/oops/typeArrayKlass.cpp @@ -78,7 +78,7 @@ u2 TypeArrayKlass::compute_modifier_flags() const { return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; } -TypeArrayKlass::TypeArrayKlass(BasicType type, Symbol* name) : ArrayKlass(name, Kind) { +TypeArrayKlass::TypeArrayKlass(BasicType type, Symbol* name) : ArrayKlass(1, name, Kind) { set_layout_helper(array_layout_helper(type)); assert(is_array_klass(), "sanity"); assert(is_typeArray_klass(), "sanity"); diff --git a/src/hotspot/share/opto/cfgnode.cpp b/src/hotspot/share/opto/cfgnode.cpp index c65bc391792..04061a60bad 100644 --- a/src/hotspot/share/opto/cfgnode.cpp +++ b/src/hotspot/share/opto/cfgnode.cpp @@ -2675,6 +2675,10 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { for( uint i=1; iadr_type(); + Compile* C = _printer->C; + if (adr_type != nullptr && C->have_alias_type(adr_type)) { + Compile::AliasType* at = C->alias_type(adr_type); + if (at != nullptr) { + print_property(true, "alias_index", at->index()); + // The value of at->field(), if present, is already dumped in the + // "source"/"destination" properties. + const Type* element = at->element(); + if (element != nullptr) { + stringStream element_stream; + element->dump_on(&element_stream); + print_property(true, "alias_element", element_stream.freeze()); + } + print_property(at->is_rewritable(), "alias_is_rewritable"); + print_property(at->is_volatile(), "alias_is_volatile"); + print_property(at->general_index() != at->index(), "alias_general_index", at->general_index()); + } + } +} + +void PrintProperties::print_escape_properties(Node* node) { + // Dump escape analysis state for relevant nodes. + if (node->is_Allocate()) { + AllocateNode* alloc = node->as_Allocate(); + print_property(alloc->_is_scalar_replaceable, "is_scalar_replaceable"); + print_property(alloc->_is_non_escaping, "is_non_escaping"); + print_property(alloc->does_not_escape_thread(), "does_not_escape_thread"); + } + if (node->is_SafePoint() && node->as_SafePoint()->has_ea_local_in_scope()) { + print_property(true, "has_ea_local_in_scope"); + } + if (node->is_CallJava() && node->as_CallJava()->arg_escape()) { + print_property(true, "arg_escape"); + } + if (node->is_Initialize() && node->as_Initialize()->does_not_escape()) { + print_property(true, "does_not_escape"); + } +} + void PrintProperties::print_node_properties(Node* node) { const jushort flags = node->flags(); print_property((flags & Node::Flag_is_Copy), "is_copy"); @@ -75,6 +119,15 @@ void PrintProperties::print_node_properties(Node* node) { } } +void PrintProperties::print_node_details(Node* node) { + print_alias_properties(node); + + print_escape_properties(node); + + print_property(node->is_block_proj() != nullptr, "is_block_proj"); + print_property(node->is_block_start(), "is_block_start"); +} + void PrintProperties::print_lrg_properties(const LRG &lrg, const char *buffer) { print_property(true, "mask", buffer); print_property(true, "mask_size", lrg.mask_size()); @@ -651,61 +704,7 @@ void IdealGraphPrinter::visit_node(Node* n, bool edges) { assert(s2.size() < sizeof(buffer), "size in range"); print_prop("dump_spec", buffer); - const TypePtr* adr_type = node->adr_type(); - if (adr_type != nullptr && C->have_alias_type(adr_type)) { - Compile::AliasType* at = C->alias_type(adr_type); - if (at != nullptr) { - print_prop("alias_index", at->index()); - // The value of at->field(), if present, is already dumped in the - // "source"/"destination" properties. - const Type* element = at->element(); - if (element != nullptr) { - stringStream element_stream; - element->dump_on(&element_stream); - print_prop("alias_element", element_stream.freeze()); - } - if (at->is_rewritable()) { - print_prop("alias_is_rewritable", "true"); - } - if (at->is_volatile()) { - print_prop("alias_is_volatile", "true"); - } - if (at->general_index() != at->index()) { - print_prop("alias_general_index", at->general_index()); - } - } - } - - if (node->is_block_proj()) { - print_prop("is_block_proj", "true"); - } - - if (node->is_block_start()) { - print_prop("is_block_start", "true"); - } - - // Dump escape analysis state for relevant nodes. - if (node->is_Allocate()) { - AllocateNode* alloc = node->as_Allocate(); - if (alloc->_is_scalar_replaceable) { - print_prop("is_scalar_replaceable", "true"); - } - if (alloc->_is_non_escaping) { - print_prop("is_non_escaping", "true"); - } - if (alloc->does_not_escape_thread()) { - print_prop("does_not_escape_thread", "true"); - } - } - if (node->is_SafePoint() && node->as_SafePoint()->has_ea_local_in_scope()) { - print_prop("has_ea_local_in_scope", "true"); - } - if (node->is_CallJava() && node->as_CallJava()->arg_escape()) { - print_prop("arg_escape", "true"); - } - if (node->is_Initialize() && node->as_Initialize()->does_not_escape()) { - print_prop("does_not_escape", "true"); - } + print_node.print_node_details(node); const char *short_name = "short_name"; if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) { diff --git a/src/hotspot/share/opto/matcher.hpp b/src/hotspot/share/opto/matcher.hpp index 9579af84f24..69e5ab354f1 100644 --- a/src/hotspot/share/opto/matcher.hpp +++ b/src/hotspot/share/opto/matcher.hpp @@ -221,12 +221,12 @@ public: // Convert a machine register to a machine register type, so-as to // properly match spill code. const int *_register_save_type; + #ifdef ASSERT // Maps from machine register to boolean; true if machine register can // be holding a call argument in some signature. static bool can_be_java_arg( int reg ); - // Maps from machine register to boolean; true if machine register holds - // a spillable argument. - static bool is_spillable_arg( int reg ); + #endif + // Number of integer live ranges that constitute high register pressure static uint int_pressure_limit(); // Number of float live ranges that constitute high register pressure @@ -443,9 +443,6 @@ public: // The Method-klass-holder may be passed in the inline_cache_reg // and then expanded into the inline_cache_reg and a method_ptr register - // Interpreter's Frame Pointer Register - static OptoReg::Name interpreter_frame_pointer_reg(); - // Java-Native calling convention // (what you use when intercalling between Java and C++ code) diff --git a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp index 21ed15f9ec7..f7da9a96d34 100644 --- a/src/hotspot/share/opto/memnode.cpp +++ b/src/hotspot/share/opto/memnode.cpp @@ -582,7 +582,6 @@ bool MemNode::detect_ptr_independence(Node* p1, AllocateNode* a1, return false; } - // Find an arraycopy ac that produces the memory state represented by parameter mem. // Return ac if // (a) can_see_stored_value=true and ac must have set the value for this load or if @@ -697,178 +696,32 @@ ArrayCopyNode* MemNode::find_array_copy_clone(Node* ld_alloc, Node* mem) const { // (Currently, only LoadNode::Ideal has steps (c), (d). More later.) // Node* MemNode::find_previous_store(PhaseValues* phase) { - Node* ctrl = in(MemNode::Control); - Node* adr = in(MemNode::Address); - intptr_t offset = 0; - Node* base = AddPNode::Ideal_base_and_offset(adr, phase, offset); - AllocateNode* alloc = AllocateNode::Ideal_allocation(base); + AccessAnalyzer analyzer(phase, this); - const TypePtr* adr_type = this->adr_type(); - if (adr_type == nullptr) { - // This means the access is dead - return phase->C->top(); - } else if (adr_type->base() == TypePtr::AnyPtr) { - assert(adr_type->ptr() == TypePtr::Null, "MemNode should never access a wide memory"); - // Give up, this will upset Compile::get_alias_index - return nullptr; - } - - int alias_idx = phase->C->get_alias_index(adr_type); - assert(alias_idx != Compile::AliasIdxTop, "must not be a dead node"); - assert(alias_idx != Compile::AliasIdxBot || !phase->C->do_aliasing(), "must not be a very wide access"); - - if (offset == Type::OffsetBot) - return nullptr; // cannot unalias unless there are precise offsets - - const bool adr_maybe_raw = check_if_adr_maybe_raw(adr); - const TypeOopPtr *addr_t = adr->bottom_type()->isa_oopptr(); - - intptr_t size_in_bytes = memory_size(); - - Node* mem = in(MemNode::Memory); // start searching here... - - int cnt = 50; // Cycle limiter - for (;;) { // While we can dance past unrelated stores... - if (--cnt < 0) break; // Caught in cycle or a complicated dance? - - Node* prev = mem; - if (mem->is_Store()) { - Node* st_adr = mem->in(MemNode::Address); - intptr_t st_offset = 0; - Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, phase, st_offset); - if (st_base == nullptr) { - // inscrutable pointer - break; - } - - // If the bases are the same and the offsets are the same, it seems that this is the exact - // store we are looking for, the caller will check if the type of the store matches using - // MemNode::can_see_stored_value - if (st_base == base && st_offset == offset) { - return mem; // (b) found the store that this access observes - } - - // If it is provable that the memory accessed by mem does not overlap the memory accessed by - // this, we may walk past mem. - // For raw accesses, 2 accesses are independent if they have the same base and the offsets - // say that they do not overlap. - // For heap accesses, 2 accesses are independent if either the bases are provably different - // at runtime or the offsets say that the accesses do not overlap. - if ((adr_maybe_raw || check_if_adr_maybe_raw(st_adr)) && st_base != base) { - // Raw accesses can only be provably independent if they have the same base - break; - } - - // If the offsets say that the accesses do not overlap, then it is provable that mem and this - // do not overlap. For example, a LoadI from Object+8 is independent from a StoreL into - // Object+12, no matter what the bases are. - if (st_offset != offset && st_offset != Type::OffsetBot) { - const int MAX_STORE = MAX2(BytesPerLong, (int)MaxVectorSize); - assert(mem->as_Store()->memory_size() <= MAX_STORE, ""); - if (st_offset >= offset + size_in_bytes || - st_offset <= offset - MAX_STORE || - st_offset <= offset - mem->as_Store()->memory_size()) { - // Success: The offsets are provably independent. - // (You may ask, why not just test st_offset != offset and be done? - // The answer is that stores of different sizes can co-exist - // in the same sequence of RawMem effects. We sometimes initialize - // a whole 'tile' of array elements with a single jint or jlong.) - mem = mem->in(MemNode::Memory); - continue; // (a) advance through the independent store - } - } - - // Same base and overlapping offsets, it seems provable that the accesses overlap, give up - if (st_base == base) { - break; - } - - // Try to prove that 2 different base nodes at compile time are different values at runtime - bool known_independent = false; - if (detect_ptr_independence(base, alloc, st_base, AllocateNode::Ideal_allocation(st_base), phase)) { - known_independent = true; - } - - if (known_independent) { - mem = mem->in(MemNode::Memory); - continue; // (a) advance through the independent store - } - } else if (mem->is_Proj() && mem->in(0)->is_Initialize()) { - InitializeNode* st_init = mem->in(0)->as_Initialize(); - AllocateNode* st_alloc = st_init->allocation(); - if (st_alloc == nullptr) { - break; // something degenerated - } - bool known_identical = false; - bool known_independent = false; - if (alloc == st_alloc) { - known_identical = true; - } else if (alloc != nullptr) { - known_independent = true; - } else if (all_controls_dominate(this, st_alloc)) { - known_independent = true; - } - - if (known_independent) { - // The bases are provably independent: Either they are - // manifestly distinct allocations, or else the control - // of this load dominates the store's allocation. - if (alias_idx == Compile::AliasIdxRaw) { - mem = st_alloc->in(TypeFunc::Memory); - } else { - mem = st_init->memory(alias_idx); - } - continue; // (a) advance through independent store memory - } - - // (b) at this point, if we are not looking at a store initializing - // the same allocation we are loading from, we lose. - if (known_identical) { - // From caller, can_see_stored_value will consult find_captured_store. - return mem; // let caller handle steps (c), (d) - } - - } else if (find_previous_arraycopy(phase, alloc, mem, false) != nullptr) { - if (prev != mem) { - // Found an arraycopy but it doesn't affect that load - continue; - } - // Found an arraycopy that may affect that load - return mem; - } else if (mem->is_MergeMem()) { - mem = mem->as_MergeMem()->memory_at(alias_idx); - continue; - } else if (addr_t != nullptr && addr_t->is_known_instance_field()) { - // Can't use optimize_simple_memory_chain() since it needs PhaseGVN. - if (mem->is_Proj() && mem->in(0)->is_Call()) { - // ArrayCopyNodes processed here as well. - CallNode *call = mem->in(0)->as_Call(); - if (!call->may_modify(addr_t, phase)) { - mem = call->in(TypeFunc::Memory); - continue; // (a) advance through independent call memory - } - } else if (mem->is_Proj() && mem->in(0)->is_MemBar()) { - ArrayCopyNode* ac = nullptr; - if (ArrayCopyNode::may_modify(addr_t, mem->in(0)->as_MemBar(), phase, ac)) { - break; - } - mem = mem->in(0)->in(TypeFunc::Memory); - continue; // (a) advance through independent MemBar memory - } else if (mem->is_ClearArray()) { - if (ClearArrayNode::step_through(&mem, (uint)addr_t->instance_id(), phase)) { - // (the call updated 'mem' value) - continue; // (a) advance through independent allocation memory - } else { - // Can not bypass initialization of the instance - // we are looking for. - return mem; - } - } + Node* mem = in(MemNode::Memory); // start searching here... + int cnt = 50; // Cycle limiter + for (;; cnt--) { + // While we can dance past unrelated stores... + if (phase->type(mem) == Type::TOP) { + // Encounter a dead node + return phase->C->top(); + } else if (cnt <= 0) { + // Caught in cycle or a complicated dance? + return nullptr; + } else if (mem->is_Phi()) { + return nullptr; } - // Unless there is an explicit 'continue', we must bail out here, - // because 'mem' is an inscrutable memory state (e.g., a call). - break; + AccessAnalyzer::AccessIndependence independence = analyzer.detect_access_independence(mem); + if (independence.independent) { + // (a) advance through the independent store + mem = independence.mem; + assert(mem != nullptr, "must not be nullptr"); + } else { + // (b) found the store that this access observes if this is not null + // Otherwise, give up if it is null + return independence.mem; + } } return nullptr; // bail out @@ -918,6 +771,174 @@ uint8_t MemNode::barrier_data(const Node* n) { return 0; } +AccessAnalyzer::AccessAnalyzer(PhaseValues* phase, MemNode* n) + : _phase(phase), _n(n), _memory_size(n->memory_size()), _alias_idx(-1) { + Node* adr = _n->in(MemNode::Address); + _offset = 0; + _base = AddPNode::Ideal_base_and_offset(adr, _phase, _offset); + _maybe_raw = MemNode::check_if_adr_maybe_raw(adr); + _alloc = AllocateNode::Ideal_allocation(_base); + _adr_type = _n->adr_type(); + + if (_adr_type != nullptr && _adr_type->base() != TypePtr::AnyPtr) { + // Avoid the cases that will upset Compile::get_alias_index + _alias_idx = _phase->C->get_alias_index(_adr_type); + assert(_alias_idx != Compile::AliasIdxTop, "must not be a dead node"); + assert(_alias_idx != Compile::AliasIdxBot || !phase->C->do_aliasing(), "must not be a very wide access"); + } +} + +// Decide whether the memory accessed by '_n' and 'other' may overlap. This function may be used +// when we want to walk the memory graph to fold a load, or when we want to hoist a load above a +// loop when there are no stores that may overlap with the load inside the loop. +AccessAnalyzer::AccessIndependence AccessAnalyzer::detect_access_independence(Node* other) const { + assert(_phase->type(other) == Type::MEMORY, "must be a memory node %s", other->Name()); + assert(!other->is_Phi(), "caller must handle Phi"); + + if (_adr_type == nullptr) { + // This means the access is dead + return {false, _phase->C->top()}; + } else if (_adr_type->base() == TypePtr::AnyPtr) { + // An example for this case is an access into the memory address 0 performed using Unsafe + assert(_adr_type->ptr() == TypePtr::Null, "MemNode should never access a wide memory"); + return {false, nullptr}; + } + + if (_offset == Type::OffsetBot) { + // cannot unalias unless there are precise offsets + return {false, nullptr}; + } + + const TypeOopPtr* adr_oop_type = _adr_type->isa_oopptr(); + Node* prev = other; + if (other->is_Store()) { + Node* st_adr = other->in(MemNode::Address); + intptr_t st_offset = 0; + Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, _phase, st_offset); + if (st_base == nullptr) { + // inscrutable pointer + return {false, nullptr}; + } + + // If the bases are the same and the offsets are the same, it seems that this is the exact + // store we are looking for, the caller will check if the type of the store matches using + // MemNode::can_see_stored_value + if (st_base == _base && st_offset == _offset) { + return {false, other}; + } + + // If it is provable that the memory accessed by 'other' does not overlap the memory accessed + // by '_n', we may walk past 'other'. + // For raw accesses, 2 accesses are independent if they have the same base and the offsets + // say that they do not overlap. + // For heap accesses, 2 accesses are independent if either the bases are provably different + // at runtime or the offsets say that the accesses do not overlap. + if ((_maybe_raw || MemNode::check_if_adr_maybe_raw(st_adr)) && st_base != _base) { + // Raw accesses can only be provably independent if they have the same base + return {false, nullptr}; + } + + // If the offsets say that the accesses do not overlap, then it is provable that 'other' and + // '_n' do not overlap. For example, a LoadI from Object+8 is independent from a StoreL into + // Object+12, no matter what the bases are. + if (st_offset != _offset && st_offset != Type::OffsetBot) { + const int MAX_STORE = MAX2(BytesPerLong, (int)MaxVectorSize); + assert(other->as_Store()->memory_size() <= MAX_STORE, ""); + if (st_offset >= _offset + _memory_size || + st_offset <= _offset - MAX_STORE || + st_offset <= _offset - other->as_Store()->memory_size()) { + // Success: The offsets are provably independent. + // (You may ask, why not just test st_offset != offset and be done? + // The answer is that stores of different sizes can co-exist + // in the same sequence of RawMem effects. We sometimes initialize + // a whole 'tile' of array elements with a single jint or jlong.) + return {true, other->in(MemNode::Memory)}; + } + } + + // Same base and overlapping offsets, it seems provable that the accesses overlap, give up + if (st_base == _base) { + return {false, nullptr}; + } + + // Try to prove that 2 different base nodes at compile time are different values at runtime + bool known_independent = false; + if (MemNode::detect_ptr_independence(_base, _alloc, st_base, AllocateNode::Ideal_allocation(st_base), _phase)) { + known_independent = true; + } + + if (known_independent) { + return {true, other->in(MemNode::Memory)}; + } + } else if (other->is_Proj() && other->in(0)->is_Initialize()) { + InitializeNode* st_init = other->in(0)->as_Initialize(); + AllocateNode* st_alloc = st_init->allocation(); + if (st_alloc == nullptr) { + // Something degenerated + return {false, nullptr}; + } + bool known_identical = false; + bool known_independent = false; + if (_alloc == st_alloc) { + known_identical = true; + } else if (_alloc != nullptr) { + known_independent = true; + } else if (MemNode::all_controls_dominate(_n, st_alloc)) { + known_independent = true; + } + + if (known_independent) { + // The bases are provably independent: Either they are + // manifestly distinct allocations, or else the control + // of _n dominates the store's allocation. + if (_alias_idx == Compile::AliasIdxRaw) { + other = st_alloc->in(TypeFunc::Memory); + } else { + other = st_init->memory(_alias_idx); + } + return {true, other}; + } + + // If we are not looking at a store initializing the same + // allocation we are loading from, we lose. + if (known_identical) { + // From caller, can_see_stored_value will consult find_captured_store. + return {false, other}; + } + + } else if (_n->find_previous_arraycopy(_phase, _alloc, other, false) != nullptr) { + // Find an arraycopy that may or may not affect the MemNode + return {prev != other, other}; + } else if (other->is_MergeMem()) { + return {true, other->as_MergeMem()->memory_at(_alias_idx)}; + } else if (adr_oop_type != nullptr && adr_oop_type->is_known_instance_field()) { + // Can't use optimize_simple_memory_chain() since it needs PhaseGVN. + if (other->is_Proj() && other->in(0)->is_Call()) { + // ArrayCopyNodes processed here as well. + CallNode* call = other->in(0)->as_Call(); + if (!call->may_modify(adr_oop_type, _phase)) { + return {true, call->in(TypeFunc::Memory)}; + } + } else if (other->is_Proj() && other->in(0)->is_MemBar()) { + ArrayCopyNode* ac = nullptr; + if (!ArrayCopyNode::may_modify(adr_oop_type, other->in(0)->as_MemBar(), _phase, ac)) { + return {true, other->in(0)->in(TypeFunc::Memory)}; + } + } else if (other->is_ClearArray()) { + if (ClearArrayNode::step_through(&other, (uint)adr_oop_type->instance_id(), _phase)) { + // (the call updated 'other' value) + return {true, other}; + } else { + // Can not bypass initialization of the instance + // we are looking for. + return {false, other}; + } + } + } + + return {false, nullptr}; +} + //============================================================================= // Should LoadNode::Ideal() attempt to remove control edges? bool LoadNode::can_remove_control() const { diff --git a/src/hotspot/share/opto/memnode.hpp b/src/hotspot/share/opto/memnode.hpp index 39b1ee88333..2f26c67f0a8 100644 --- a/src/hotspot/share/opto/memnode.hpp +++ b/src/hotspot/share/opto/memnode.hpp @@ -26,6 +26,7 @@ #ifndef SHARE_OPTO_MEMNODE_HPP #define SHARE_OPTO_MEMNODE_HPP +#include "memory/allocation.hpp" #include "opto/multnode.hpp" #include "opto/node.hpp" #include "opto/opcodes.hpp" @@ -46,6 +47,8 @@ private: bool _unsafe_access; // Access of unsafe origin. uint8_t _barrier_data; // Bit field with barrier information + friend class AccessAnalyzer; + protected: #ifdef ASSERT const TypePtr* _adr_type; // What kind of memory is being addressed? @@ -172,6 +175,45 @@ public: #endif }; +// Analyze a MemNode to try to prove that it is independent from other memory accesses +class AccessAnalyzer : StackObj { +private: + PhaseValues* const _phase; + MemNode* const _n; + Node* _base; + intptr_t _offset; + const int _memory_size; + bool _maybe_raw; + AllocateNode* _alloc; + const TypePtr* _adr_type; + int _alias_idx; + +public: + AccessAnalyzer(PhaseValues* phase, MemNode* n); + + // The result of deciding whether a memory node 'other' writes into the memory which '_n' + // observes. + class AccessIndependence { + public: + // Whether 'other' writes into the memory which '_n' observes. This value is conservative, that + // is, it is only true when it is provable that the memory accessed by the nodes is + // non-overlapping. + bool independent; + + // If 'independent' is true, this is the memory input of 'other' that corresponds to the memory + // location that '_n' observes. For example, if 'other' is a StoreNode, then 'mem' is its + // memory input, if 'other' is a MergeMemNode, then 'mem' is the memory input corresponding to + // the alias class of '_n'. + // If 'independent' is false, + // - 'mem' is non-nullptr if it seems that 'other' writes to the exact memory location '_n' + // observes. + // - 'mem' is nullptr otherwise. + Node* mem; + }; + + AccessIndependence detect_access_independence(Node* other) const; +}; + //------------------------------LoadNode--------------------------------------- // Load value; requires Memory and Address class LoadNode : public MemNode { diff --git a/src/hotspot/share/opto/mulnode.cpp b/src/hotspot/share/opto/mulnode.cpp index 9bdaa3b9f34..cac9f1dcc37 100644 --- a/src/hotspot/share/opto/mulnode.cpp +++ b/src/hotspot/share/opto/mulnode.cpp @@ -1539,15 +1539,20 @@ Node* URShiftINode::Ideal(PhaseGVN* phase, bool can_reshape) { Node *add = in(1); if (in1_op == Op_AddI) { Node *lshl = add->in(1); + Node *y = add->in(2); + if (lshl->Opcode() != Op_LShiftI) { + lshl = add->in(2); + y = add->in(1); + } // Compare shift counts by value, not by node pointer, to also match a not-yet-normalized // negative constant (e.g. -1 vs 31) int lshl_con = 0; if (lshl->Opcode() == Op_LShiftI && const_shift_count(phase, lshl, &lshl_con) && (lshl_con & (BitsPerJavaInteger - 1)) == con) { - Node *y_z = phase->transform( new URShiftINode(add->in(2),in(2)) ); - Node *sum = phase->transform( new AddINode( lshl->in(1), y_z ) ); - return new AndINode( sum, phase->intcon(mask) ); + Node *y_z = phase->transform(new URShiftINode(y, in(2))); + Node *sum = phase->transform(new AddINode(lshl->in(1), y_z)); + return new AndINode(sum, phase->intcon(mask)); } } @@ -1699,13 +1704,18 @@ Node* URShiftLNode::Ideal(PhaseGVN* phase, bool can_reshape) { const TypeInt *t2 = phase->type(in(2))->isa_int(); if (add->Opcode() == Op_AddL) { Node *lshl = add->in(1); + Node *y = add->in(2); + if (lshl->Opcode() != Op_LShiftL) { + lshl = add->in(2); + y = add->in(1); + } // Compare shift counts by value, not by node pointer, to also match a not-yet-normalized // negative constant (e.g. -1 vs 63) int lshl_con = 0; if (lshl->Opcode() == Op_LShiftL && const_shift_count(phase, lshl, &lshl_con) && (lshl_con & (BitsPerJavaLong - 1)) == con) { - Node* y_z = phase->transform(new URShiftLNode(add->in(2), in(2))); + Node* y_z = phase->transform(new URShiftLNode(y, in(2))); Node* sum = phase->transform(new AddLNode(lshl->in(1), y_z)); return new AndLNode(sum, phase->longcon(mask)); } diff --git a/src/hotspot/share/opto/phasetype.hpp b/src/hotspot/share/opto/phasetype.hpp index f388dc6cdc6..ce432fbfc01 100644 --- a/src/hotspot/share/opto/phasetype.hpp +++ b/src/hotspot/share/opto/phasetype.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -25,6 +25,7 @@ #ifndef SHARE_OPTO_PHASETYPE_HPP #define SHARE_OPTO_PHASETYPE_HPP +#include "memory/allocation.hpp" #include "utilities/bitMap.inline.hpp" #include "utilities/stringUtils.hpp" diff --git a/src/hotspot/share/prims/jvmtiEnvBase.cpp b/src/hotspot/share/prims/jvmtiEnvBase.cpp index 401bb4dfdb8..886c2da1dee 100644 --- a/src/hotspot/share/prims/jvmtiEnvBase.cpp +++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp @@ -1529,7 +1529,7 @@ JvmtiEnvBase::get_object_monitor_usage(JavaThread* calling_thread, jobject objec GrowableArray* wantList = nullptr; ObjectMonitor* mon = mark.has_monitor() - ? ObjectSynchronizer::read_monitor(current_thread, hobj(), mark) + ? ObjectSynchronizer::read_monitor(hobj(), mark) : nullptr; if (mon != nullptr) { diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index a1dae76f680..11c4853c388 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -553,6 +553,7 @@ static SpecialFlag const special_jvm_flags[] = { { "ParallelRefProcEnabled", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "ParallelRefProcBalancingEnabled", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "MaxRAM", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, + { "NewSizeThreadIncrease", JDK_Version::undefined(), JDK_Version::jdk(27), JDK_Version::jdk(28) }, #ifdef ASSERT { "DummyObsoleteTestFlag", JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() }, diff --git a/src/hotspot/share/runtime/atomicAccess.hpp b/src/hotspot/share/runtime/atomicAccess.hpp index c9a2dfb9383..46330cffdb2 100644 --- a/src/hotspot/share/runtime/atomicAccess.hpp +++ b/src/hotspot/share/runtime/atomicAccess.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -26,7 +26,7 @@ #define SHARE_RUNTIME_ATOMICACCESS_HPP #include "cppstdlib/type_traits.hpp" -#include "memory/allocation.hpp" +#include "memory/allStatic.hpp" #include "metaprogramming/enableIf.hpp" #include "metaprogramming/primitiveConversions.hpp" #include "runtime/orderAccess.hpp" @@ -829,7 +829,7 @@ class AtomicAccess::PlatformBitops {}; template -class ScopedFenceGeneral: public StackObj { +class ScopedFenceGeneral { public: void prefix() {} void postfix() {} diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 54a65358693..5fbe2842a2b 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -1686,7 +1686,7 @@ bool Deoptimization::relock_objects(JavaThread* thread, GrowableArrayowner()->is_locked(), "object must be locked now"); assert(obj->mark().has_monitor(), "must be"); assert(!deoptee_thread->lock_stack().contains(obj()), "must be"); - assert(ObjectSynchronizer::read_monitor(thread, obj(), obj->mark())->has_owner(deoptee_thread), "must be"); + assert(ObjectSynchronizer::read_monitor(obj(), obj->mark())->has_owner(deoptee_thread), "must be"); } } } diff --git a/src/hotspot/share/runtime/lockStack.inline.hpp b/src/hotspot/share/runtime/lockStack.inline.hpp index 27eb07fcec8..a9ad3553db8 100644 --- a/src/hotspot/share/runtime/lockStack.inline.hpp +++ b/src/hotspot/share/runtime/lockStack.inline.hpp @@ -1,7 +1,7 @@ /* * Copyright (c) 2022, Red Hat, Inc. All rights reserved. * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -254,7 +254,7 @@ inline void OMCache::set_monitor(ObjectMonitor *monitor) { oop obj = monitor->object_peek(); assert(obj != nullptr, "must be alive"); - assert(monitor == ObjectSynchronizer::get_monitor_from_table(JavaThread::current(), obj), "must exist in table"); + assert(monitor == ObjectSynchronizer::get_monitor_from_table(obj), "must exist in table"); OMCacheEntry to_insert = {obj, monitor}; diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index 8c6994c2152..cb69b82d767 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -854,7 +854,7 @@ bool ObjectMonitor::deflate_monitor(Thread* current) { } if (UseObjectMonitorTable) { - ObjectSynchronizer::deflate_monitor(current, obj, this); + ObjectSynchronizer::deflate_monitor(obj, this); } else if (obj != nullptr) { // Install the old mark word if nobody else has already done it. install_displaced_markword_in_object(obj); @@ -2541,19 +2541,19 @@ bool ObjectMonitor::try_spin(JavaThread* current) { // ----------------------------------------------------------------------------- // wait_set management ... -ObjectWaiter::ObjectWaiter(JavaThread* current) { - _next = nullptr; - _prev = nullptr; - _thread = current; - _monitor = nullptr; - _notifier_tid = 0; - _recursions = 0; - TState = TS_RUN; - _is_wait = false; - _at_reenter = false; - _interrupted = false; - _do_timed_park = false; - _active = false; +ObjectWaiter::ObjectWaiter(JavaThread* current) + : _next(nullptr), + _prev(nullptr), + _thread(current), + _monitor(nullptr), + _notifier_tid(0), + _recursions(0), + TState(TS_RUN), + _is_wait(false), + _at_reenter(false), + _interrupted(false), + _do_timed_park(false), + _active(false) { } const char* ObjectWaiter::getTStateName(ObjectWaiter::TStates state) { diff --git a/src/hotspot/share/runtime/objectMonitorTable.cpp b/src/hotspot/share/runtime/objectMonitorTable.cpp index 767f5de6897..8431b6dd0d4 100644 --- a/src/hotspot/share/runtime/objectMonitorTable.cpp +++ b/src/hotspot/share/runtime/objectMonitorTable.cpp @@ -46,7 +46,7 @@ // // When you want to find a monitor associated with an object, you extract the // hash value of the object. Then calculate an index by taking the hash value -// and bit-wise AND it with the capacity mask (e.g. size-1) of the OMT. Now +// and bit-wise AND it with the capacity mask (i.e., size-1) of the OMT. Now // use that index into the OMT's array of pointers. If the pointer is non // null, check if it's a monitor pointer that is associated with the object. // If so you're done. If the pointer is non null, but associated with another @@ -55,7 +55,7 @@ // means that the monitor is simply not in the OMT. // // If the size of the pointer array is significantly larger than the number of -// pointers in it, the chance of finding the monitor in the hash index +// pointers in it, the chance of finding the monitor at the hash index // (without any further linear searching) is quite high. It is also straight // forward to generate C2 code for this, which for the fast path doesn't // contain any branching at all. See: C2_MacroAssembler::fast_lock(). @@ -69,10 +69,10 @@ // old monitor pointers from the old table to the new. // // But since the OMT is a concurrent hash table and things needs to work for -// other clients of the OMT while we grow it, it's gets a bit more +// other clients of the OMT while we grow it, it gets a bit more // complicated. // -// Both the new and (potentially several) old table(s) may exist at the same +// The new and (potentially several) old table(s) may exist at the same // time. The newest is always called the "current", and the older ones are // singly linked using a "prev" pointer. // @@ -82,7 +82,8 @@ // // After that we start to go through all the indexes in the old table. If the // index is empty (the pointer is null) we put a "tombstone" into that index, -// which will prevent any future concurrent insert ending up in that index. +// which will prevent any future concurrent insert from ending up in that +// index. // // If the index contains a monitor pointer, we insert that monitor pointer // into the OMT which can be considered as one generation newer. If the index @@ -92,11 +93,11 @@ // that is not null, not a tombstone and not removed, is considered to be a // pointer to a monitor. // -// When all the monitor pointers from an old OMT has been transferred to the +// When all the monitor pointers from an old OMT have been transferred to the // new OMT, the old table is unlinked. // // This copying from an old OMT to one generation newer OMT, will continue -// until all the monitor pointers from old OMTs has been transferred to the +// until all the monitor pointers from old OMTs have been transferred to the // newest "current" OMT. // // The memory for old, unlinked OMTs will be freed after a thread-local @@ -255,7 +256,7 @@ public: } ObjectMonitor* prepare_insert(oop obj, intptr_t hash) { - // Acquire any tomb stones and relocations if prev transitioned to null. + // Acquire any tombstones and relocations if prev transitioned to null. Table* prev = AtomicAccess::load_acquire(&_prev); if (prev != nullptr) { ObjectMonitor* result = prev->prepare_insert(obj, hash); @@ -273,7 +274,7 @@ public: if (entry == empty()) { // Found an empty slot to install the new monitor in. - // To avoid concurrent inserts succeeding, place a tomb stone here. + // To avoid concurrent inserts succeeding, place a tombstone here. Entry result = AtomicAccess::cmpxchg(bucket, entry, tombstone(), memory_order_relaxed); if (result == entry) { // Success! Nobody will try to insert here again, except reinsert from rehashing. @@ -515,7 +516,7 @@ void ObjectMonitorTable::create() { _curr = new Table(128, nullptr); } -ObjectMonitor* ObjectMonitorTable::monitor_get(Thread* current, oop obj) { +ObjectMonitor* ObjectMonitorTable::monitor_get(oop obj) { const intptr_t hash = obj->mark().hash(); Table* curr = AtomicAccess::load_acquire(&_curr); ObjectMonitor* monitor = curr->get(obj, hash); @@ -562,7 +563,7 @@ ObjectMonitorTable::Table* ObjectMonitorTable::grow_table(Table* curr) { return result; } -ObjectMonitor* ObjectMonitorTable::monitor_put_get(Thread* current, ObjectMonitor* monitor, oop obj) { +ObjectMonitor* ObjectMonitorTable::monitor_put_get(ObjectMonitor* monitor, oop obj) { const intptr_t hash = obj->mark().hash(); Table* curr = AtomicAccess::load_acquire(&_curr); @@ -577,7 +578,7 @@ ObjectMonitor* ObjectMonitorTable::monitor_put_get(Thread* current, ObjectMonito } } -void ObjectMonitorTable::remove_monitor_entry(Thread* current, ObjectMonitor* monitor) { +void ObjectMonitorTable::remove_monitor_entry(ObjectMonitor* monitor) { oop obj = monitor->object_peek(); if (obj == nullptr) { // Defer removal until subsequent rebuilding. @@ -586,7 +587,7 @@ void ObjectMonitorTable::remove_monitor_entry(Thread* current, ObjectMonitor* mo const intptr_t hash = obj->mark().hash(); Table* curr = AtomicAccess::load_acquire(&_curr); curr->remove(obj, curr->as_entry(monitor), hash); - assert(monitor_get(current, obj) != monitor, "should have been removed"); + assert(monitor_get(obj) != monitor, "should have been removed"); } // Before handshake; rehash and unlink tables. diff --git a/src/hotspot/share/runtime/objectMonitorTable.hpp b/src/hotspot/share/runtime/objectMonitorTable.hpp index e8e7c61c6fa..0a56b696069 100644 --- a/src/hotspot/share/runtime/objectMonitorTable.hpp +++ b/src/hotspot/share/runtime/objectMonitorTable.hpp @@ -61,11 +61,11 @@ public: } SpecialPointerValues; static void create(); - static ObjectMonitor* monitor_get(Thread* current, oop obj); - static ObjectMonitor* monitor_put_get(Thread* current, ObjectMonitor* monitor, oop obj); + static ObjectMonitor* monitor_get(oop obj); + static ObjectMonitor* monitor_put_get(ObjectMonitor* monitor, oop obj); static void rebuild(GrowableArray* delete_list); static void destroy(GrowableArray* delete_list); - static void remove_monitor_entry(Thread* current, ObjectMonitor* monitor); + static void remove_monitor_entry(ObjectMonitor* monitor); // Compiler support static address current_table_address(); diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp index c93e1a65512..8ea5fe31145 100644 --- a/src/hotspot/share/runtime/synchronizer.cpp +++ b/src/hotspot/share/runtime/synchronizer.cpp @@ -350,7 +350,7 @@ bool ObjectSynchronizer::quick_notify(oopDesc* obj, JavaThread* current, bool al } if (mark.has_monitor()) { - ObjectMonitor* const mon = read_monitor(current, obj, mark); + ObjectMonitor* const mon = read_monitor(obj, mark); if (mon == nullptr) { // Racing with inflation/deflation go slow path return false; @@ -485,7 +485,7 @@ ObjectLocker::ObjectLocker(Handle obj, TRAPS) : _thread(THREAD), _obj(obj), // otherwise just force other vthreads to preempt in case they try // to acquire this monitor. _skip_exit = !_thread->preemption_cancelled(); - ObjectSynchronizer::read_monitor(_thread, _obj())->set_object_strong(); + ObjectSynchronizer::read_monitor(_obj())->set_object_strong(); _thread->set_pending_preempted_exception(); } @@ -502,7 +502,7 @@ void ObjectLocker::wait_uninterruptibly(TRAPS) { ObjectSynchronizer::waitUninterruptibly(_obj, 0, _thread); if (_thread->preempting()) { _skip_exit = true; - ObjectSynchronizer::read_monitor(_thread, _obj())->set_object_strong(); + ObjectSynchronizer::read_monitor(_obj())->set_object_strong(); _thread->set_pending_preempted_exception(); } } @@ -749,7 +749,7 @@ bool ObjectSynchronizer::current_thread_holds_lock(JavaThread* current, } while (mark.has_monitor()) { - ObjectMonitor* monitor = read_monitor(current, obj, mark); + ObjectMonitor* monitor = read_monitor(obj, mark); if (monitor != nullptr) { return monitor->is_entered(current) != 0; } @@ -778,7 +778,7 @@ JavaThread* ObjectSynchronizer::get_lock_owner(ThreadsList * t_list, Handle h_ob } while (mark.has_monitor()) { - ObjectMonitor* monitor = read_monitor(Thread::current(), obj, mark); + ObjectMonitor* monitor = read_monitor(obj, mark); if (monitor != nullptr) { return Threads::owning_thread_from_monitor(t_list, monitor); } @@ -1425,7 +1425,7 @@ void ObjectSynchronizer::chk_in_use_entry(ObjectMonitor* n, outputStream* out, return; } - ObjectMonitor* const obj_mon = read_monitor(Thread::current(), obj, mark); + ObjectMonitor* const obj_mon = read_monitor(obj, mark); if (n != obj_mon) { out->print_cr("ERROR: monitor=" INTPTR_FORMAT ": in-use monitor's " "object does not refer to the same monitor: obj=" @@ -1471,8 +1471,8 @@ void ObjectSynchronizer::log_in_use_monitor_details(outputStream* out, bool log_ out->flush(); } -ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted) { - ObjectMonitor* monitor = get_monitor_from_table(current, object); +ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor_from_table(oop object, bool* inserted) { + ObjectMonitor* monitor = get_monitor_from_table(object); if (monitor != nullptr) { *inserted = false; return monitor; @@ -1482,7 +1482,7 @@ ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor_from_table(oop object, alloced_monitor->set_anonymous_owner(); // Try insert monitor - monitor = add_monitor(current, alloced_monitor, object); + monitor = add_monitor(alloced_monitor, object); *inserted = alloced_monitor == monitor; if (!*inserted) { @@ -1522,7 +1522,7 @@ ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor(oop object, JavaThread* EventJavaMonitorInflate event; bool inserted; - ObjectMonitor* monitor = get_or_insert_monitor_from_table(object, current, &inserted); + ObjectMonitor* monitor = get_or_insert_monitor_from_table(object, &inserted); if (inserted) { log_inflate(current, object, cause); @@ -1538,7 +1538,7 @@ ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor(oop object, JavaThread* } // Add the hashcode to the monitor to match the object and put it in the hashtable. -ObjectMonitor* ObjectSynchronizer::add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj) { +ObjectMonitor* ObjectSynchronizer::add_monitor(ObjectMonitor* monitor, oop obj) { assert(UseObjectMonitorTable, "must be"); assert(obj == monitor->object(), "must be"); @@ -1546,14 +1546,14 @@ ObjectMonitor* ObjectSynchronizer::add_monitor(JavaThread* current, ObjectMonito assert(hash != 0, "must be set when claiming the object monitor"); monitor->set_hash(hash); - return ObjectMonitorTable::monitor_put_get(current, monitor, obj); + return ObjectMonitorTable::monitor_put_get(monitor, obj); } -void ObjectSynchronizer::remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj) { +void ObjectSynchronizer::remove_monitor(ObjectMonitor* monitor, oop obj) { assert(UseObjectMonitorTable, "must be"); assert(monitor->object_peek() == obj, "must be, cleared objects are removed by is_dead"); - ObjectMonitorTable::remove_monitor_entry(current, monitor); + ObjectMonitorTable::remove_monitor_entry(monitor); } void ObjectSynchronizer::deflate_mark_word(oop obj) { @@ -1721,7 +1721,7 @@ bool ObjectSynchronizer::fast_lock_spin_enter(oop obj, LockStack& lock_stack, Ja return true; } else if (observed_deflation) { // Spin while monitor is being deflated. - ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); + ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(obj, mark); return monitor == nullptr || monitor->is_being_async_deflated(); } // Else stop spinning. @@ -1881,7 +1881,7 @@ void ObjectSynchronizer::exit(oop object, BasicLock* lock, JavaThread* current) if (UseObjectMonitorTable) { monitor = read_caches(current, lock, object); if (monitor == nullptr) { - monitor = get_monitor_from_table(current, object); + monitor = get_monitor_from_table(object); } } else { monitor = ObjectSynchronizer::read_monitor(mark); @@ -1925,7 +1925,7 @@ ObjectMonitor* ObjectSynchronizer::inflate_locked_or_imse(oop obj, ObjectSynchro } assert(mark.has_monitor(), "must be"); - ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); + ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(obj, mark); if (monitor != nullptr) { if (monitor->has_anonymous_owner()) { LockStack& lock_stack = current->lock_stack(); @@ -2087,7 +2087,7 @@ ObjectMonitor* ObjectSynchronizer::inflate_fast_locked_object(oop object, Object // contains a deflating monitor it must be anonymously owned. if (monitor->has_anonymous_owner()) { // The monitor must be anonymously owned if it was added - assert(monitor == get_monitor_from_table(current, object), "The monitor must be found"); + assert(monitor == get_monitor_from_table(object), "The monitor must be found"); // New fresh monitor break; } @@ -2279,31 +2279,31 @@ ObjectMonitor* ObjectSynchronizer::inflate_and_enter(oop object, BasicLock* lock return monitor; } -void ObjectSynchronizer::deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor) { +void ObjectSynchronizer::deflate_monitor(oop obj, ObjectMonitor* monitor) { if (obj != nullptr) { deflate_mark_word(obj); - remove_monitor(current, monitor, obj); + remove_monitor(monitor, obj); } } -ObjectMonitor* ObjectSynchronizer::get_monitor_from_table(Thread* current, oop obj) { +ObjectMonitor* ObjectSynchronizer::get_monitor_from_table(oop obj) { assert(UseObjectMonitorTable, "must be"); - return ObjectMonitorTable::monitor_get(current, obj); + return ObjectMonitorTable::monitor_get(obj); } ObjectMonitor* ObjectSynchronizer::read_monitor(markWord mark) { return mark.monitor(); } -ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj) { - return ObjectSynchronizer::read_monitor(current, obj, obj->mark()); +ObjectMonitor* ObjectSynchronizer::read_monitor(oop obj) { + return ObjectSynchronizer::read_monitor(obj, obj->mark()); } -ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj, markWord mark) { +ObjectMonitor* ObjectSynchronizer::read_monitor(oop obj, markWord mark) { if (!UseObjectMonitorTable) { return read_monitor(mark); } else { - return ObjectSynchronizer::get_monitor_from_table(current, obj); + return ObjectSynchronizer::get_monitor_from_table(obj); } } diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp index 97690b9c886..58d0e88a026 100644 --- a/src/hotspot/share/runtime/synchronizer.hpp +++ b/src/hotspot/share/runtime/synchronizer.hpp @@ -126,8 +126,8 @@ public: static const char* inflate_cause_name(const InflateCause cause); static ObjectMonitor* read_monitor(markWord mark); - static ObjectMonitor* read_monitor(Thread* current, oop obj); - static ObjectMonitor* read_monitor(Thread* current, oop obj, markWord mark); + static ObjectMonitor* read_monitor(oop obj); + static ObjectMonitor* read_monitor(oop obj, markWord mark); // Returns the identity hash value for an oop // NOTE: It may cause monitor inflation @@ -209,11 +209,11 @@ public: static void handle_sync_on_value_based_class(Handle obj, JavaThread* locking_thread); - static ObjectMonitor* get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted); + static ObjectMonitor* get_or_insert_monitor_from_table(oop object, bool* inserted); static ObjectMonitor* get_or_insert_monitor(oop object, JavaThread* current, ObjectSynchronizer::InflateCause cause); - static ObjectMonitor* add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj); - static void remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj); + static ObjectMonitor* add_monitor(ObjectMonitor* monitor, oop obj); + static void remove_monitor(ObjectMonitor* monitor, oop obj); static void deflate_mark_word(oop object); @@ -239,9 +239,9 @@ public: static ObjectMonitor* inflate_fast_locked_object(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); static ObjectMonitor* inflate_and_enter(oop object, BasicLock* lock, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); - static void deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor); + static void deflate_monitor(oop obj, ObjectMonitor* monitor); - static ObjectMonitor* get_monitor_from_table(Thread* current, oop obj); + static ObjectMonitor* get_monitor_from_table(oop obj); static bool contains_monitor(Thread* current, ObjectMonitor* monitor); diff --git a/src/hotspot/share/runtime/vframe.cpp b/src/hotspot/share/runtime/vframe.cpp index 604ff1f751a..c9628255e45 100644 --- a/src/hotspot/share/runtime/vframe.cpp +++ b/src/hotspot/share/runtime/vframe.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -248,7 +248,7 @@ void javaVFrame::print_lock_info_on(outputStream* st, bool is_virtual, int frame // The first stage of async deflation does not affect any field // used by this comparison so the ObjectMonitor* is usable here. if (mark.has_monitor()) { - ObjectMonitor* mon = ObjectSynchronizer::read_monitor(current, monitor->owner(), mark); + ObjectMonitor* mon = ObjectSynchronizer::read_monitor(monitor->owner(), mark); if (// if the monitor is null we must be in the process of locking mon == nullptr || // we have marked ourself as pending on this monitor diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index a54fbc7e8ab..9796b990b2a 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -166,7 +166,7 @@ volatile_nonstatic_field(oopDesc, _metadata._klass, Klass*) \ volatile_nonstatic_field(oopDesc, _metadata._compressed_klass, narrowKlass) \ static_field(BarrierSet, _barrier_set, BarrierSet*) \ - nonstatic_field(ArrayKlass, _dimension, int) \ + nonstatic_field(ArrayKlass, _dimension, const int) \ volatile_nonstatic_field(ArrayKlass, _higher_dimension, ObjArrayKlass*) \ volatile_nonstatic_field(ArrayKlass, _lower_dimension, ArrayKlass*) \ nonstatic_field(BSMAttributeEntries, _offsets, Array*) \ diff --git a/src/hotspot/share/services/threadService.cpp b/src/hotspot/share/services/threadService.cpp index 4f511075967..35c7de48d2e 100644 --- a/src/hotspot/share/services/threadService.cpp +++ b/src/hotspot/share/services/threadService.cpp @@ -1252,7 +1252,7 @@ private: // The first stage of async deflation does not affect any field // used by this comparison so the ObjectMonitor* is usable here. if (mark.has_monitor()) { - ObjectMonitor* mon = ObjectSynchronizer::read_monitor(current, monitor->owner(), mark); + ObjectMonitor* mon = ObjectSynchronizer::read_monitor(monitor->owner(), mark); if (// if the monitor is null we must be in the process of locking mon == nullptr || // we have marked ourself as pending on this monitor diff --git a/src/hotspot/share/utilities/bitMap.hpp b/src/hotspot/share/utilities/bitMap.hpp index 5ee462bbe47..17bf437ecae 100644 --- a/src/hotspot/share/utilities/bitMap.hpp +++ b/src/hotspot/share/utilities/bitMap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -30,6 +30,7 @@ #include "utilities/globalDefinitions.hpp" // Forward decl; +class Arena; class BitMapClosure; // Operations for bitmaps represented as arrays of unsigned integers. diff --git a/src/java.base/share/classes/java/io/ObjectInputStream.java b/src/java.base/share/classes/java/io/ObjectInputStream.java index daed5f3cce5..cd6bd7683f7 100644 --- a/src/java.base/share/classes/java/io/ObjectInputStream.java +++ b/src/java.base/share/classes/java/io/ObjectInputStream.java @@ -2219,7 +2219,7 @@ public class ObjectInputStream * mechanism marks the record as having an exception. * Null is returned from readRecord and later the exception is thrown at * the exit of {@link #readObject(Class)}. - **/ + */ private Object readRecord(ObjectStreamClass desc) throws IOException { ObjectStreamClass.ClassDataSlot[] slots = desc.getClassDataLayout(); if (slots.length != 1) { diff --git a/src/java.base/share/classes/java/lang/Boolean.java b/src/java.base/share/classes/java/lang/Boolean.java index 4c24e98a549..49ab80edfea 100644 --- a/src/java.base/share/classes/java/lang/Boolean.java +++ b/src/java.base/share/classes/java/lang/Boolean.java @@ -28,14 +28,10 @@ package java.lang; import jdk.internal.vm.annotation.IntrinsicCandidate; import java.lang.constant.Constable; -import java.lang.constant.ConstantDesc; import java.lang.constant.ConstantDescs; import java.lang.constant.DynamicConstantDesc; import java.util.Optional; -import static java.lang.constant.ConstantDescs.BSM_GET_STATIC_FINAL; -import static java.lang.constant.ConstantDescs.CD_Boolean; - /** * The {@code Boolean} class is the {@linkplain * java.lang##wrapperClass wrapper class} for values of the primitive diff --git a/src/java.base/share/classes/java/lang/Byte.java b/src/java.base/share/classes/java/lang/Byte.java index 0f3f7f40d05..c2c03e7a3c2 100644 --- a/src/java.base/share/classes/java/lang/Byte.java +++ b/src/java.base/share/classes/java/lang/Byte.java @@ -36,7 +36,6 @@ import java.util.Optional; import static java.lang.constant.ConstantDescs.BSM_EXPLICIT_CAST; import static java.lang.constant.ConstantDescs.CD_byte; -import static java.lang.constant.ConstantDescs.CD_int; import static java.lang.constant.ConstantDescs.DEFAULT_NAME; /** diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index eab1993a2b4..8a2f722f3dd 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -224,9 +224,9 @@ public final class Class implements java.io.Serializable, AnnotatedElement, TypeDescriptor.OfField>, Constable { - private static final int ANNOTATION= 0x00002000; - private static final int ENUM = 0x00004000; - private static final int SYNTHETIC = 0x00001000; + private static final int ANNOTATION = 0x00002000; + private static final int ENUM = 0x00004000; + private static final int SYNTHETIC = 0x00001000; private static native void registerNatives(); static { @@ -1390,6 +1390,7 @@ public final class Class implements java.io.Serializable, // INNER_CLASS forbids. INNER_CLASS allows PRIVATE, PROTECTED, // and STATIC, which are not allowed on Location.CLASS. // Use getClassFileAccessFlags to expose SUPER status. + // Arrays need to use PRIVATE/PROTECTED from its component modifiers. var location = (isMemberClass() || isLocalClass() || isAnonymousClass() || isArray()) ? AccessFlag.Location.INNER_CLASS : @@ -3779,7 +3780,7 @@ public final class Class implements java.io.Serializable, * @since 1.8 */ public AnnotatedType[] getAnnotatedInterfaces() { - return TypeAnnotationParser.buildAnnotatedInterfaces(getRawTypeAnnotations(), getConstantPool(), this); + return TypeAnnotationParser.buildAnnotatedInterfaces(getRawTypeAnnotations(), getConstantPool(), this); } private native Class getNestHost0(); diff --git a/src/java.base/share/classes/java/lang/Short.java b/src/java.base/share/classes/java/lang/Short.java index 920500a7fa3..14f7a267165 100644 --- a/src/java.base/share/classes/java/lang/Short.java +++ b/src/java.base/share/classes/java/lang/Short.java @@ -35,7 +35,6 @@ import java.lang.constant.DynamicConstantDesc; import java.util.Optional; import static java.lang.constant.ConstantDescs.BSM_EXPLICIT_CAST; -import static java.lang.constant.ConstantDescs.CD_int; import static java.lang.constant.ConstantDescs.CD_short; import static java.lang.constant.ConstantDescs.DEFAULT_NAME; diff --git a/src/java.base/share/classes/java/lang/doc-files/ValueBased.html b/src/java.base/share/classes/java/lang/doc-files/ValueBased.html index 6a935afe04b..3b860ce0534 100644 --- a/src/java.base/share/classes/java/lang/doc-files/ValueBased.html +++ b/src/java.base/share/classes/java/lang/doc-files/ValueBased.html @@ -30,35 +30,35 @@

{@index "Value-based Classes"}

-Some classes, such as java.lang.Integer and -java.time.LocalDate, are value-based. +Some classes, such as {@code java.lang.Integer} and +{@code java.time.LocalDate}, are value-based. A value-based class has the following properties:
  • the class declares only final instance fields (though these may contain references to mutable objects);
  • -
  • the class's implementations of equals, hashCode, - and toString compute their results solely from the values +
  • the class's implementations of {@code equals}, {@code hashCode}, + and {@code toString} compute their results solely from the values of the class's instance fields (and the members of the objects they reference), not from the instance's identity;
  • the class's methods treat instances as freely substitutable - when equal, meaning that interchanging any two instances x and - y that are equal according to equals() produces no + when equal, meaning that interchanging any two instances {@code x} and + {@code y} that are equal according to {@code equals()} produces no visible change in the behavior of the class's methods;
  • the class performs no synchronization using an instance's monitor;
  • -
  • the class does not declare (or has deprecated any) accessible constructors;
  • +
  • the class does not declare (or discourages use of) accessible constructors;
  • the class does not provide any instance creation mechanism that promises a unique identity on each method call—in particular, any factory method's contract must allow for the possibility that if two independently-produced - instances are equal according to equals(), they may also be - equal according to ==;
  • -
  • the class is final, and extends either Object or a hierarchy of + instances are equal according to {@code equals()}, they may also be + equal according to {@code ==};
  • +
  • the class is final, and extends either {@code Object} or a hierarchy of abstract classes that declare no instance fields or instance initializers and whose constructors are empty.

When two instances of a value-based class are equal (according to `equals`), a program should not attempt to distinguish between their identities, whether directly via reference - equality or indirectly via an appeal to synchronization, identity hashing, + equality {@code ==} or indirectly via an appeal to synchronization, identity hashing, serialization, or any other identity-sensitive mechanism.

Synchronization on instances of value-based classes is strongly discouraged, diff --git a/src/java.base/share/classes/java/lang/invoke/MemberName.java b/src/java.base/share/classes/java/lang/invoke/MemberName.java index 918d1b10791..d320ad11ade 100644 --- a/src/java.base/share/classes/java/lang/invoke/MemberName.java +++ b/src/java.base/share/classes/java/lang/invoke/MemberName.java @@ -408,11 +408,12 @@ final class MemberName implements Member, Cloneable { // let the rest (native, volatile, transient, etc.) be tested via Modifier.isFoo // unofficial modifier flags, used by HotSpot: - static final int BRIDGE = 0x00000040; - static final int VARARGS = 0x00000080; - static final int SYNTHETIC = 0x00001000; - static final int ANNOTATION= 0x00002000; - static final int ENUM = 0x00004000; + static final int BRIDGE = 0x00000040; + static final int VARARGS = 0x00000080; + static final int SYNTHETIC = 0x00001000; + static final int ANNOTATION = 0x00002000; + static final int ENUM = 0x00004000; + /** Utility method to query the modifier flags of this member; returns false if the member is not a method. */ public boolean isBridge() { return allFlagsSet(IS_METHOD | BRIDGE); @@ -426,19 +427,19 @@ final class MemberName implements Member, Cloneable { return allFlagsSet(SYNTHETIC); } - static final String CONSTRUCTOR_NAME = ""; // the ever-popular + static final String CONSTRUCTOR_NAME = ""; // modifiers exported by the JVM: static final int RECOGNIZED_MODIFIERS = 0xFFFF; // private flags, not part of RECOGNIZED_MODIFIERS: static final int - IS_METHOD = MN_IS_METHOD, // method (not constructor) - IS_CONSTRUCTOR = MN_IS_CONSTRUCTOR, // constructor - IS_FIELD = MN_IS_FIELD, // field - IS_TYPE = MN_IS_TYPE, // nested type - CALLER_SENSITIVE = MN_CALLER_SENSITIVE, // @CallerSensitive annotation detected - TRUSTED_FINAL = MN_TRUSTED_FINAL; // trusted final field + IS_METHOD = MN_IS_METHOD, // method (not constructor) + IS_CONSTRUCTOR = MN_IS_CONSTRUCTOR, // constructor + IS_FIELD = MN_IS_FIELD, // field + IS_TYPE = MN_IS_TYPE, // nested type + CALLER_SENSITIVE = MN_CALLER_SENSITIVE, // @CallerSensitive annotation detected + TRUSTED_FINAL = MN_TRUSTED_FINAL; // trusted final field static final int ALL_ACCESS = Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED; static final int ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE; diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java index 16f5c7e59b8..8dac21c8968 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java @@ -344,7 +344,7 @@ public final class MethodHandleProxies { ClassLoaders.platformClassLoader() : loader))) .build(proxyDesc, clb -> { clb.withSuperclass(CD_Object) - .withFlags(ACC_FINAL | ACC_SYNTHETIC) + .withFlags(ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC) .withInterfaceSymbols(ifaceDesc) // static and instance fields .withField(TYPE_NAME, CD_Class, ACC_PRIVATE | ACC_STATIC | ACC_FINAL) diff --git a/src/java.base/share/classes/java/lang/reflect/Proxy.java b/src/java.base/share/classes/java/lang/reflect/Proxy.java index b811deb863d..6ce8e80cdca 100644 --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -25,6 +25,7 @@ package java.lang.reflect; +import java.lang.classfile.ClassFile; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -467,7 +468,7 @@ public class Proxy implements java.io.Serializable { * Generate the specified proxy class. */ byte[] proxyClassFile = ProxyGenerator.generateProxyClass(loader, proxyName, interfaces, - context.accessFlags() | Modifier.FINAL); + context.accessFlags() | Modifier.FINAL | ClassFile.ACC_SUPER); try { Class pc = JLA.defineClass(loader, proxyName, proxyClassFile, null, "__dynamic_proxy__"); diff --git a/src/java.base/share/classes/java/util/Base64.java b/src/java.base/share/classes/java/util/Base64.java index ed1a4a8d638..fd714050149 100644 --- a/src/java.base/share/classes/java/util/Base64.java +++ b/src/java.base/share/classes/java/util/Base64.java @@ -32,6 +32,8 @@ import java.io.OutputStream; import java.nio.ByteBuffer; import sun.nio.cs.ISO_8859_1; +import jdk.internal.access.JavaLangAccess; +import jdk.internal.access.SharedSecrets; import jdk.internal.util.Preconditions; import jdk.internal.vm.annotation.IntrinsicCandidate; @@ -201,6 +203,7 @@ public final class Base64 { * @since 1.8 */ public static class Encoder { + private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess(); private final byte[] newline; private final int linemax; @@ -344,10 +347,9 @@ public final class Base64 { * the byte array to encode * @return A String containing the resulting Base64 encoded characters */ - @SuppressWarnings("deprecation") public String encodeToString(byte[] src) { byte[] encoded = encode(src); - return new String(encoded, 0, 0, encoded.length); + return JLA.uncheckedNewStringWithLatin1Bytes(encoded); } /** diff --git a/src/java.base/share/classes/java/util/WeakHashMap.java b/src/java.base/share/classes/java/util/WeakHashMap.java index b5a27593840..1412d8f6ff9 100644 --- a/src/java.base/share/classes/java/util/WeakHashMap.java +++ b/src/java.base/share/classes/java/util/WeakHashMap.java @@ -25,8 +25,8 @@ package java.util; -import java.lang.ref.WeakReference; import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java index f289186e0ad..e83a92e5e6f 100644 --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java @@ -560,70 +560,89 @@ public class ForkJoinPool extends AbstractExecutorService * access (which is usually needed anyway). * * Signalling. Signals (in signalWork) cause new or reactivated - * workers to scan for tasks. SignalWork is invoked in two cases: - * (1) When a task is pushed onto an empty queue, and (2) When a - * worker takes a top-level task from a queue that has additional - * tasks. Together, these suffice in O(log(#threads)) steps to - * fully activate with at least enough workers, and ideally no - * more than required. This ideal is unobtainable: Callers do not - * know whether another worker will finish its current task and - * poll for others without need of a signal (which is otherwise an - * advantage of work-stealing vs other schemes), and also must - * conservatively estimate the triggering conditions of emptiness - * or non-emptiness; all of which usually cause more activations - * than necessary (see below). (Method signalWork is also used as - * failsafe in case of Thread failures in deregisterWorker, to - * activate or create a new worker to replace them). + * workers to scan for tasks. Method signalWork and its callers + * try to approximate the unattainable goal of having the right + * number of workers activated for the tasks at hand, but must err + * on the side of too many workers vs too few to avoid stalls: * - * Top-Level scheduling - * ==================== + * * If computations are purely tree structured, it suffices for + * every worker to activate another when it pushes a task into + * an empty queue, resulting in O(log(#threads)) steps to full + * activation. Emptiness must be conservatively approximated, + * which may result in unnecessary signals. Also, to reduce + * resource usages in some cases, at the expense of slower + * startup in others, activation of an idle thread is preferred + * over creating a new one, here and elsewhere. + * + * * At the other extreme, if "flat" tasks (those that do not in + * turn generate others) come in serially from only a single + * producer, each worker taking a task from a queue should + * propagate a signal if there are more tasks in that + * queue. This is equivalent to, but generally faster than, + * arranging the stealer take multiple tasks, re-pushing one or + * more on its own queue, and signalling (because its queue is + * empty), also resulting in logarithmic full activation + * time. If tasks do not not engage in unbounded loops based on + * the actions of other workers with unknown dependencies loop, + * this form of proagation can be limited to one signal per + * activation (phase change). We distinguish the cases by + * further signalling only if the task is an InterruptibleTask + * (see below), which are the only supported forms of task that + * may do so. + * + * * Because we don't know about usage patterns (or most commonly, + * mixtures), we use both approaches, which present even more + * opportunities to over-signal. (Failure to distinguish these + * cases in terms of submission methods was arguably an early + * design mistake.) Note that in either of these contexts, + * signals may be (and often are) unnecessary because active + * workers continue scanning after running tasks without the + * need to be signalled (which is one reason work stealing is + * often faster than alternatives), so additional workers + * aren't needed. + * + * * For rapidly branching tasks that require full pool resources, + * oversignalling is OK, because signalWork will soon have no + * more workers to create or reactivate. But for others (mainly + * externally submitted tasks), overprovisioning may cause very + * noticeable slowdowns due to contention and resource + * wastage. We reduce impact by deactivating workers when + * queues don't have accessible tasks, but reactivating and + * rescanning if other tasks remain. + * + * * Despite these, signal contention and overhead effects still + * occur during ramp-up and ramp-down of small computations. * * Scanning. Method runWorker performs top-level scanning for (and * execution of) tasks by polling a pseudo-random permutation of * the array (by starting at a given index, and using a constant * cyclically exhaustive stride.) It uses the same basic polling * method as WorkQueue.poll(), but restarts with a different - * permutation on each rescan. The pseudorandom generator need - * not have high-quality statistical properties in the long + * permutation on each invocation. The pseudorandom generator + * need not have high-quality statistical properties in the long * term. We use Marsaglia XorShifts, seeded with the Weyl sequence - * from ThreadLocalRandom probes, which are cheap and suffice. + * from ThreadLocalRandom probes, which are cheap and + * suffice. Each queue's polling attempts to avoid becoming stuck + * when other scanners/pollers stall. Scans do not otherwise + * explicitly take into account core affinities, loads, cache + * localities, etc, However, they do exploit temporal locality + * (which usually approximates these) by preferring to re-poll + * from the same queue after a successful poll before trying + * others, which also reduces bookkeeping, cache traffic, and + * scanning overhead. But it also reduces fairness, which is + * partially counteracted by giving up on detected interference + * (which also reduces contention when too many workers try to + * take small tasks from the same queue). * * Deactivation. When no tasks are found by a worker in runWorker, - * it invokes deactivate, that first deactivates (to an IDLE - * phase). Avoiding missed signals during deactivation requires a - * (conservative) rescan, reactivating if there may be tasks to - * poll. Because idle workers are often not yet blocked (parked), - * we use a WorkQueue field to advertise that a waiter actually - * needs unparking upon signal. - * - * When tasks are constructed as (recursive) DAGs, top-level - * scanning is usually infrequent, and doesn't encounter most - * of the following problems addressed by runWorker and awaitWork: - * - * Locality. Polls are organized into "runs", continuing until - * empty or contended, while also minimizing interference by - * postponing bookeeping to ends of runs. This may reduce - * fairness. - * - * Contention. When many workers try to poll few queues, they - * often collide, generating CAS failures and disrupting locality - * of workers already running their tasks. This also leads to - * stalls when tasks cannot be taken because other workers have - * not finished poll operations, which is detected by reading - * ahead in queue arrays. In both cases, workers restart scans in a - * way that approximates randomized backoff. - * - * Oversignalling. When many short top-level tasks are present in - * a small number of queues, the above signalling strategy may - * activate many more workers than needed, worsening locality and - * contention problems, while also generating more global - * contention (field ctl is CASed on every activation and - * deactivation). We filter out (both in runWorker and - * signalWork) attempted signals that are surely not needed - * because the signalled tasks are already taken. - * - * Shutdown and Quiescence - * ======================= + * it tries to deactivate()), giving up (and rescanning) on "ctl" + * contention. To avoid missed signals during deactivation, the + * method rescans and reactivates if there may have been a missed + * signal during deactivation. To reduce false-alarm reactivations + * while doing so, we scan multiple times (analogously to method + * quiescent()) before trying to reactivate. Because idle workers + * are often not yet blocked (parked), we use a WorkQueue field to + * advertise that a waiter actually needs unparking upon signal. * * Quiescence. Workers scan looking for work, giving up when they * don't find any, without being sure that none are available. @@ -873,7 +892,9 @@ public class ForkJoinPool extends AbstractExecutorService * shutdown, runners are interrupted so they can cancel. Since * external joining callers never run these tasks, they must await * cancellation by others, which can occur along several different - * paths. + * paths. The inability to rely on caller-runs may also require + * extra signalling (resulting in scanning and contention) so is + * done only conditionally in methods push and runworker. * * Across these APIs, rules for reporting exceptions for tasks * with results accessed via join() differ from those via get(), @@ -940,13 +961,9 @@ public class ForkJoinPool extends AbstractExecutorService * less-contended applications. To help arrange this, some * non-reference fields are declared as "long" even when ints or * shorts would suffice. For class WorkQueue, an - * embedded @Contended isolates the very busy top index, along - * with status and bookkeeping fields written (mostly) by owners, - * that otherwise interfere with reading array and base - * fields. There are other variables commonly contributing to - * false-sharing-related performance issues (including fields of - * class Thread), but we can't do much about this except try to - * minimize access. + * embedded @Contended region segregates fields most heavily + * updated by owners from those most commonly read by stealers or + * other management. * * Initial sizing and resizing of WorkQueue arrays is an even more * delicate tradeoff because the best strategy systematically @@ -955,11 +972,13 @@ public class ForkJoinPool extends AbstractExecutorService * direct false-sharing and indirect cases due to GC bookkeeping * (cardmarks etc), and reduce the number of resizes, which are * not especially fast because they require atomic transfers. - * Currently, arrays are initialized to be just large enough to - * avoid resizing in most tree-structured tasks, but grow rapidly - * until large. (Maintenance note: any changes in fields, queues, - * or their uses, or JVM layout policies, must be accompanied by - * re-evaluation of these placement and sizing decisions.) + * Currently, arrays for workers are initialized to be just large + * enough to avoid resizing in most tree-structured tasks, but + * larger for external queues where both false-sharing problems + * and the need for resizing are more common. (Maintenance note: + * any changes in fields, queues, or their uses, or JVM layout + * policies, must be accompanied by re-evaluation of these + * placement and sizing decisions.) * * Style notes * =========== @@ -1042,11 +1061,17 @@ public class ForkJoinPool extends AbstractExecutorService static final int DEFAULT_COMMON_MAX_SPARES = 256; /** - * Initial capacity of work-stealing queue array. + * Initial capacity of work-stealing queue array for workers. * Must be a power of two, at least 2. See above. */ static final int INITIAL_QUEUE_CAPACITY = 1 << 6; + /** + * Initial capacity of work-stealing queue array for external queues. + * Must be a power of two, at least 2. See above. + */ + static final int INITIAL_EXTERNAL_QUEUE_CAPACITY = 1 << 9; + // conversions among short, int, long static final int SMASK = 0xffff; // (unsigned) short bits static final long LMASK = 0xffffffffL; // lower 32 bits of long @@ -1186,11 +1211,11 @@ public class ForkJoinPool extends AbstractExecutorService @jdk.internal.vm.annotation.Contended("w") int stackPred; // pool stack (ctl) predecessor link @jdk.internal.vm.annotation.Contended("w") - volatile int parking; // nonzero if parked in awaitWork - @jdk.internal.vm.annotation.Contended("w") volatile int source; // source queue id (or DROPPED) @jdk.internal.vm.annotation.Contended("w") int nsteals; // number of steals from other queues + @jdk.internal.vm.annotation.Contended("w") + volatile int parking; // nonzero if parked in awaitWork // Support for atomic operations private static final Unsafe U; @@ -1223,11 +1248,11 @@ public class ForkJoinPool extends AbstractExecutorService */ WorkQueue(ForkJoinWorkerThread owner, int id, int cfg, boolean clearThreadLocals) { + array = new ForkJoinTask[owner == null ? + INITIAL_EXTERNAL_QUEUE_CAPACITY : + INITIAL_QUEUE_CAPACITY]; + this.owner = owner; this.config = (clearThreadLocals) ? cfg | CLEAR_TLS : cfg; - if ((this.owner = owner) == null) { - array = new ForkJoinTask[INITIAL_QUEUE_CAPACITY]; - phase = id | IDLE; - } } /** @@ -1254,27 +1279,27 @@ public class ForkJoinPool extends AbstractExecutorService * @throws RejectedExecutionException if array could not be resized */ final void push(ForkJoinTask task, ForkJoinPool pool, boolean internal) { - int s = top, b = base, m, cap, room; ForkJoinTask[] a, na; - if ((a = array) != null && (cap = a.length) > 0) { // else disabled - int k = (m = cap - 1) & s; - if ((room = m - (s - b)) >= 0) { + int s = top, b = base, m, cap, room; ForkJoinTask[] a; + if ((a = array) != null && (cap = a.length) > 0 && // else disabled + task != null) { + int pk = task.noUserHelp() + 1; // prev slot offset + if ((room = (m = cap - 1) - (s - b)) >= 0) { top = s + 1; - long pos = slotOffset(k); + long pos = slotOffset(m & s); if (!internal) U.putReference(a, pos, task); // inside lock else U.getAndSetReference(a, pos, task); // fully fenced - if (room == 0 && (na = growArray(a, cap, s)) != null) - k = ((a = na).length - 1) & s; // resize + if (room == 0) // resize + growArray(a, cap, s); } if (!internal) unlockPhase(); if (room < 0) throw new RejectedExecutionException("Queue capacity exceeded"); - if (pool != null && - (room == 0 || - U.getReferenceAcquire(a, slotOffset(m & (s - 1))) == null)) - pool.signalWork(a, k); // may have appeared empty + if ((room == 0 || U.getReferenceAcquire(a, slotOffset(m & (s - pk))) == null) && + pool != null) + pool.signalWork(); // may have appeared empty } } @@ -1283,12 +1308,11 @@ public class ForkJoinPool extends AbstractExecutorService * @param a old array * @param cap old array capacity * @param s current top - * @return new array, or null on failure */ - private ForkJoinTask[] growArray(ForkJoinTask[] a, int cap, int s) { - int newCap = (cap >= 1 << 16) ? cap << 1 : cap << 2; - ForkJoinTask[] newArray = null; + private void growArray(ForkJoinTask[] a, int cap, int s) { + int newCap = cap << 1; if (a != null && a.length == cap && cap > 0 && newCap > 0) { + ForkJoinTask[] newArray = null; try { newArray = new ForkJoinTask[newCap]; } catch (OutOfMemoryError ex) { @@ -1305,45 +1329,34 @@ public class ForkJoinPool extends AbstractExecutorService updateArray(newArray); // fully fenced } } - return newArray; } /** - * Takes next task, if one exists, in lifo order. + * Takes next task, if one exists, in order specified by mode, + * so acts as either local-pop or local-poll. Called only by owner. + * @param fifo nonzero if FIFO mode */ - private ForkJoinTask localPop() { + private ForkJoinTask nextLocalTask(int fifo) { ForkJoinTask t = null; - int s = top - 1, cap; long k; ForkJoinTask[] a; - if ((a = array) != null && (cap = a.length) > 0 && - U.getReference(a, k = slotOffset((cap - 1) & s)) != null && - (t = (ForkJoinTask)U.getAndSetReference(a, k, null)) != null) - updateTop(s); - return t; - } - - /** - * Takes next task, if one exists, in fifo order. - */ - private ForkJoinTask localPoll() { - ForkJoinTask t = null; - int p = top, cap; ForkJoinTask[] a; - if ((a = array) != null && (cap = a.length) > 0) { - for (int b = base; p - b > 0; ) { - int nb = b + 1; - long k = slotOffset((cap - 1) & b); - if (U.getReference(a, k) == null) { - if (nb == p) - break; // else base is lagging - while (b == (b = U.getIntAcquire(this, BASE))) - Thread.onSpinWait(); // spin to reduce memory traffic + ForkJoinTask[] a = array; + int b = base, p = top, cap; + if (p - b > 0 && a != null && (cap = a.length) > 0) { + for (int m = cap - 1, s, nb;;) { + if (fifo == 0 || (nb = b + 1) == p) { + if ((t = (ForkJoinTask)U.getAndSetReference( + a, slotOffset(m & (s = p - 1)), null)) != null) + updateTop(s); // else lost race for only task + break; } - else if ((t = (ForkJoinTask) - U.getAndSetReference(a, k, null)) != null) { + if ((t = (ForkJoinTask)U.getAndSetReference( + a, slotOffset(m & b), null)) != null) { updateBase(nb); break; } - else - b = base; + while (b == (b = U.getIntAcquire(this, BASE))) + Thread.onSpinWait(); // spin to reduce memory traffic + if (p - b <= 0) + break; } } return t; @@ -1351,9 +1364,10 @@ public class ForkJoinPool extends AbstractExecutorService /** * Takes next task, if one exists, using configured mode. + * (Always internal, never called for Common pool.) */ final ForkJoinTask nextLocalTask() { - return (config & FIFO) == 0 ? localPop() : localPoll(); + return nextLocalTask(config & FIFO); } /** @@ -1429,12 +1443,12 @@ public class ForkJoinPool extends AbstractExecutorService // specialized execution methods /** - * Runs the given task, as well as remaining local tasks + * Runs the given task, as well as remaining local tasks. */ final void topLevelExec(ForkJoinTask task, int fifo) { while (task != null) { task.doExec(); - task = (fifo != 0) ? localPoll() : localPop(); + task = nextLocalTask(fifo); } } @@ -1564,7 +1578,7 @@ public class ForkJoinPool extends AbstractExecutorService * Cancels all local tasks. Called only by owner. */ final void cancelTasks() { - for (ForkJoinTask t; (t = localPop()) != null; ) { + for (ForkJoinTask t; (t = nextLocalTask(0)) != null; ) { try { t.cancel(false); } catch (Throwable ignore) { @@ -1766,8 +1780,7 @@ public class ForkJoinPool extends AbstractExecutorService * @param w caller's WorkQueue */ final void registerWorker(WorkQueue w) { - if (w != null) { - w.array = new ForkJoinTask[INITIAL_QUEUE_CAPACITY]; + if (w != null && (runState & STOP) == 0L) { ThreadLocalRandom.localInit(); int seed = w.stackPred = ThreadLocalRandom.getProbe(); int phaseSeq = seed & ~((IDLE << 1) - 1); // initial phase tag @@ -1845,18 +1858,17 @@ public class ForkJoinPool extends AbstractExecutorService } if ((tryTerminate(false, false) & STOP) == 0L && phase != 0 && w != null && w.source != DROPPED) { + signalWork(); // possibly replace w.cancelTasks(); // clean queue - signalWork(null, 0); // possibly replace } if (ex != null) ForkJoinTask.rethrow(ex); } /** - * Releases an idle worker, or creates one if not enough exist, - * giving up if array a is nonnull and task at a[k] already taken. + * Releases an idle worker, or creates one if not enough exist. */ - final void signalWork(ForkJoinTask[] a, int k) { + final void signalWork() { int pc = parallelism; for (long c = ctl;;) { WorkQueue[] qs = queues; @@ -1872,15 +1884,13 @@ public class ForkJoinPool extends AbstractExecutorService if (sp == 0) { if ((short)(c >>> TC_SHIFT) >= pc) break; - nc = ((c + TC_UNIT) & TC_MASK) | ac; + nc = ((c + TC_UNIT) & TC_MASK); } else if ((v = w) == null) break; else - nc = (v.stackPred & LMASK) | (c & TC_MASK) | ac; - if (a != null && k < a.length && k >= 0 && a[k] == null) - break; - if (c == (c = ctl) && c == (c = compareAndExchangeCtl(c, nc))) { + nc = (v.stackPred & LMASK) | (c & TC_MASK); + if (c == (c = compareAndExchangeCtl(c, nc | ac))) { if (v == null) createWorker(); else { @@ -1963,196 +1973,178 @@ public class ForkJoinPool extends AbstractExecutorService * @param w caller's WorkQueue (may be null on failed initialization) */ final void runWorker(WorkQueue w) { - if (w != null && w.phase != 0) { // else unregistered - WorkQueue[] qs; - int r = w.stackPred; // seed from registerWorker - int fifo = (int)config & FIFO, rescans = 0, inactive = 0, taken = 0, n; - while ((runState & STOP) == 0L && (qs = queues) != null && - (n = qs.length) > 0) { - int i = r, step = (r >>> 16) | 1; + if (w != null) { + int phase = w.phase, r = w.stackPred; // seed from registerWorker + int fifo = w.config & FIFO, nsteals = 0, src = -1; + for (;;) { + WorkQueue[] qs; r ^= r << 13; r ^= r >>> 17; r ^= r << 5; // xorshift - scan: for (int j = n; j != 0; --j, i += step) { - WorkQueue q; int qid; - if ((q = qs[qid = i & (n - 1)]) != null) { - ForkJoinTask[] a; int cap; // poll queue - while ((a = q.array) != null && (cap = a.length) > 0) { - int b, nb, nk; long bp; ForkJoinTask t; + if ((runState & STOP) != 0L || (qs = queues) == null) + break; + int n = qs.length, i = r, step = (r >>> 16) | 1; + boolean rescan = false; + scan: for (int l = n; l > 0; --l, i += step) { // scan queues + int j, cap; WorkQueue q; ForkJoinTask[] a; + if ((q = qs[j = i & (n - 1)]) != null && + (a = q.array) != null && (cap = a.length) > 0) { + for (int m = cap - 1, pb = -1, b = q.base;;) { + ForkJoinTask t; long k; t = (ForkJoinTask)U.getReferenceAcquire( - a, bp = slotOffset((cap - 1) & (b = q.base))); - long np = slotOffset(nk = (nb = b + 1) & (cap - 1)); - if (q.base == b) { // else inconsistent - if (t == null) { - if (q.array == a) { // else resized - if (rescans > 0) // ran or stalled - break scan; - if (U.getReference(a, np) == null && - (rescans >= 0 || - (U.getReferenceAcquire(a, bp) == null && - q.top == q.base))) - break; - rescans = 1; // may be stalled + a, k = slotOffset(m & b)); + if (b != (b = q.base) || t == null || + !U.compareAndSetReference(a, k, t, null)) { + if (a[b & m] == null) { + if (rescan) // end of run + break scan; + if (a[(b + 1) & m] == null && + a[(b + 2) & m] == null) { + break; // probably empty } - } - else if (inactive != 0) { - if ((inactive = tryReactivate(w)) != 0) { - rescans = 1; // can't take yet + if (pb == (pb = b)) { // track progress + rescan = true; // stalled; reorder scan break scan; } } - else if (U.compareAndSetReference(a, bp, t, null)) { - q.base = nb; - Object nt = U.getReferenceAcquire(a, np); - w.source = qid; - rescans = 1; - ++taken; - if (nt != null && // confirm a[nk] - U.getReferenceAcquire(a, np) == nt) - signalWork(a, nk); // propagate - w.topLevelExec(t, fifo); - } + } + else { + boolean propagate; + int nb = q.base = b + 1, prevSrc = src; + w.nsteals = ++nsteals; + w.source = src = j; // volatile + rescan = true; + int nh = t.noUserHelp(); + if (propagate = + (prevSrc != src || nh != 0) && a[nb & m] != null) + signalWork(); + w.topLevelExec(t, fifo); + if ((b = q.base) != nb && !propagate) + break scan; // reduce interference } } } } - if (rescans >= 0) - --rescans; - else if (inactive == 0) { - if ((inactive = deactivate(w, taken)) != 0) - taken = 0; + if (!rescan) { + if (((phase = deactivate(w, phase)) & IDLE) != 0) + break; + src = -1; // re-enable propagation } - else if (awaitWork(w) == 0) - inactive = rescans = 0; - else - break; } } } /** - * Tries to deactivate worker, keeping active on contention + * Deactivates and if necessary awaits signal or termination. * - * @param w the work queue - * @param taken number of stolen tasks since last deactivation - * @return nonzero if inactive + * @param w the worker + * @param phase current phase + * @return current phase, with IDLE set if worker should exit */ - private int deactivate(WorkQueue w, int taken) { - int inactive = 0, phase; - if (w != null && (inactive = (phase = w.phase) & IDLE) == 0) { - long sp = (phase + (IDLE << 1)) & LMASK, pc, c; - w.phase = phase | IDLE; - w.stackPred = (int)(pc = ctl); // set ctl stack link - if (!compareAndSetCtl( // try to enqueue - pc, c = ((pc - RC_UNIT) & UMASK) | sp)) - w.phase = phase; // back out on contention - else { - if (taken != 0) { - w.nsteals += taken; - if ((w.config & CLEAR_TLS) != 0 && - (Thread.currentThread() instanceof ForkJoinWorkerThread f)) - f.resetThreadLocals(); // (instanceof check always true) - } - if (((c & RC_MASK) == 0L && quiescent() > 0) || taken == 0) - inactive = w.phase & IDLE; // check quiescent termination - else { // spin for approx 1 scan cost - int tc = (short)(c >>> TC_SHIFT); - int spins = Math.max((tc << 1) + tc, SPIN_WAITS); - while ((inactive = w.phase & IDLE) != 0 && --spins != 0) - Thread.onSpinWait(); - } - } - } - return inactive; - } + private int deactivate(WorkQueue w, int phase) { + if (w == null) // currently impossible + return IDLE; + int p = phase | IDLE, activePhase = phase + (IDLE << 1); + long pc = ctl, qc = (activePhase & LMASK) | ((pc - RC_UNIT) & UMASK); + int sp = w.stackPred = (int)pc; // set ctl stack link + w.phase = p; + if (!compareAndSetCtl(pc, qc)) // try to enqueue + return w.phase = phase; // back out on possible signal + int ac = (short)(qc >>> RC_SHIFT), n; long e; WorkQueue[] qs; + if (((e = runState) & STOP) != 0L || + ((e & SHUTDOWN) != 0L && ac == 0 && quiescent() > 0) || + (qs = queues) == null || (n = qs.length) <= 0) + return IDLE; // terminating - /** - * Reactivates worker w if it is currently top of ctl stack - * - * @param w the work queue - * @return 0 if now active - */ - private int tryReactivate(WorkQueue w) { - int inactive = 0; - if (w != null) { // always true; hoist checks - int sp = w.stackPred, phase, activePhase; long c; - if ((inactive = (phase = w.phase) & IDLE) != 0 && - (int)(c = ctl) == (activePhase = phase + IDLE) && - compareAndSetCtl(c, (sp & LMASK) | ((c + RC_UNIT) & UMASK))) { - w.phase = activePhase; - inactive = 0; - } + for (int prechecks = Math.min(ac, 2), // reactivation threshold + k = Math.max(n + (n << 1), SPIN_WAITS << 1);;) { + WorkQueue q; int cap; ForkJoinTask[] a; long c; + if (w.phase == activePhase) + return activePhase; + if (--k < 0) + return awaitWork(w, p); // block, drop, or exit + if ((q = qs[k & (n - 1)]) == null) + Thread.onSpinWait(); + else if ((a = q.array) != null && (cap = a.length) > 0 && + a[q.base & (cap - 1)] != null && --prechecks < 0 && + (int)(c = ctl) == activePhase && + compareAndSetCtl(c, (sp & LMASK) | ((c + RC_UNIT) & UMASK))) + return w.phase = activePhase; // reactivate } - return inactive; } /** * Awaits signal or termination. * * @param w the work queue - * @return 0 if now active + * @param p current phase (known to be idle) + * @return current phase, with IDLE set if worker should exit */ - private int awaitWork(WorkQueue w) { - int inactive = 0, phase; - if (w != null) { // always true; hoist checks - long waitTime = (w.source == INVALID_ID) ? 0L : keepAlive; - if ((inactive = (phase = w.phase) & IDLE) != 0) { + private int awaitWork(WorkQueue w, int p) { + if (w != null) { + ForkJoinWorkerThread t; long deadline; + if ((w.config & CLEAR_TLS) != 0 && (t = w.owner) != null) + t.resetThreadLocals(); // clear before reactivate + if ((ctl & RC_MASK) > 0L) + deadline = 0L; + else if ((deadline = + (((w.source != INVALID_ID) ? keepAlive : TIMEOUT_SLOP)) + + System.currentTimeMillis()) == 0L) + deadline = 1L; // avoid zero + int activePhase = p + IDLE; + if ((p = w.phase) != activePhase && (runState & STOP) == 0L) { LockSupport.setCurrentBlocker(this); - int activePhase = phase + IDLE; - for (long deadline = 0L;;) { - Thread.interrupted(); // clear status + w.parking = 1; // enable unpark + while ((p = w.phase) != activePhase) { + boolean trimmable = false; int trim; + Thread.interrupted(); // clear status if ((runState & STOP) != 0L) break; - boolean trimmable = false; // use timed wait if trimmable - long d = 0L, c; - if (((c = ctl) & RC_MASK) == 0L && (int)c == activePhase) { - long now = System.currentTimeMillis(); - if (deadline == 0L) - deadline = waitTime + now; - if (deadline - now <= TIMEOUT_SLOP) { - if (tryTrim(w, c, activePhase)) - break; - continue; // lost race to trim - } - d = deadline; - trimmable = true; + if (deadline != 0L) { + if ((trim = tryTrim(w, p, deadline)) > 0) + break; + else if (trim < 0) + deadline = 0L; + else + trimmable = true; } - w.parking = 1; // enable unpark and recheck - if ((inactive = w.phase & IDLE) != 0) - U.park(trimmable, d); - w.parking = 0; // close unpark window - if (inactive == 0 || (inactive = w.phase & IDLE) == 0) - break; + U.park(trimmable, deadline); } + w.parking = 0; LockSupport.setCurrentBlocker(null); } } - return inactive; + return p; } /** * Tries to remove and deregister worker after timeout, and release - * another to do the same unless new tasks are found. + * another to do the same. + * @return > 0: trimmed, < 0 : not trimmable, else 0 */ - private boolean tryTrim(WorkQueue w, long c, int activePhase) { - if (w != null) { - int vp, i; WorkQueue[] vs; WorkQueue v; - long nc = ((w.stackPred & LMASK) | - ((RC_MASK & c) | (TC_MASK & (c - TC_UNIT)))); - if (compareAndSetCtl(c, nc)) { - w.source = DROPPED; - w.phase = activePhase; - if ((vp = (int)nc) != 0 && (vs = queues) != null && - vs.length > (i = vp & SMASK) && (v = vs[i]) != null && - compareAndSetCtl( // try to wake up next waiter - nc, ((v.stackPred & LMASK) | - ((UMASK & (nc + RC_UNIT)) | (nc & TC_MASK))))) { - v.source = INVALID_ID; // enable cascaded timeouts - v.phase = vp; - U.unpark(v.owner); - } - return true; + private int tryTrim(WorkQueue w, int phase, long deadline) { + long c, nc; int stat, activePhase, vp, i; WorkQueue[] vs; WorkQueue v; + if ((activePhase = phase + IDLE) != (int)(c = ctl) || w == null) + stat = -1; // no longer ctl top + else if (deadline - System.currentTimeMillis() >= TIMEOUT_SLOP) + stat = 0; // spurious wakeup + else if (!compareAndSetCtl( + c, nc = ((w.stackPred & LMASK) | (RC_MASK & c) | + (TC_MASK & (c - TC_UNIT))))) + stat = -1; // lost race to signaller + else { + stat = 1; + w.source = DROPPED; + w.phase = activePhase; + if ((vp = (int)nc) != 0 && (vs = queues) != null && + vs.length > (i = vp & SMASK) && (v = vs[i]) != null && + compareAndSetCtl( // try to wake up next waiter + nc, ((UMASK & (nc + RC_UNIT)) | + (nc & TC_MASK) | (v.stackPred & LMASK)))) { + v.source = INVALID_ID; // enable cascaded timeouts + v.phase = vp; + U.unpark(v.owner); } } - return false; + return stat; } /** @@ -2569,35 +2561,52 @@ public class ForkJoinPool extends AbstractExecutorService /** * Finds and locks a WorkQueue for an external submitter, or - * throws RejectedExecutionException if shutdown + * throws RejectedExecutionException if shutdown or terminating. + * @param r current ThreadLocalRandom.getProbe() value * @param rejectOnShutdown true if RejectedExecutionException - * should be thrown when shutdown + * should be thrown when shutdown (else only if terminating) */ - final WorkQueue externalSubmissionQueue(boolean rejectOnShutdown) { - int r; - if ((r = ThreadLocalRandom.getProbe()) == 0) { - ThreadLocalRandom.localInit(); // initialize caller's probe + private WorkQueue submissionQueue(int r, boolean rejectOnShutdown) { + int reuse; // nonzero if prefer create + if ((reuse = r) == 0) { + ThreadLocalRandom.localInit(); // initialize caller's probe r = ThreadLocalRandom.getProbe(); } - for (;;) { - WorkQueue q; WorkQueue[] qs; int n, id, i; - if ((qs = queues) == null || (n = qs.length) <= 0) + for (int probes = 0; ; ++probes) { + int n, i, id; WorkQueue[] qs; WorkQueue q; + if ((qs = queues) == null) + break; + if ((n = qs.length) <= 0) break; if ((q = qs[i = (id = r & EXTERNAL_ID_MASK) & (n - 1)]) == null) { - WorkQueue newq = new WorkQueue(null, id, 0, false); - lockRunState(); - if (qs[i] == null && queues == qs) - q = qs[i] = newq; // else lost race to install + WorkQueue w = new WorkQueue(null, id, 0, false); + w.phase = id; + boolean reject = ((lockRunState() & SHUTDOWN) != 0 && + rejectOnShutdown); + if (!reject && queues == qs && qs[i] == null) + q = qs[i] = w; // else lost race to install unlockRunState(); - } - if (q != null && q.tryLockPhase()) { - if (rejectOnShutdown && (runState & SHUTDOWN) != 0L) { - q.unlockPhase(); // check while q lock held + if (q != null) + return q; + if (reject) break; - } - return q; + reuse = 0; } - r = ThreadLocalRandom.advanceProbe(r); // move + if (reuse == 0 || !q.tryLockPhase()) { // move index + if (reuse == 0) { + if (probes >= n >> 1) + reuse = r; // stop prefering free slot + } + else if (q != null) + reuse = 0; // probe on collision + r = ThreadLocalRandom.advanceProbe(r); + } + else if (rejectOnShutdown && (runState & SHUTDOWN) != 0L) { + q.unlockPhase(); // check while q lock held + break; + } + else + return q; } throw new RejectedExecutionException(); } @@ -2611,12 +2620,24 @@ public class ForkJoinPool extends AbstractExecutorService } else { // find and lock queue internal = false; - q = externalSubmissionQueue(true); + q = submissionQueue(ThreadLocalRandom.getProbe(), true); } q.push(task, signalIfEmpty ? this : null, internal); return task; } + /** + * Returns queue for an external submission, bypassing call to + * submissionQueue if already established and unlocked. + */ + final WorkQueue externalSubmissionQueue(boolean rejectOnShutdown) { + WorkQueue[] qs; WorkQueue q; int n; + int r = ThreadLocalRandom.getProbe(); + return (((qs = queues) != null && (n = qs.length) > 0 && + (q = qs[r & EXTERNAL_ID_MASK & (n - 1)]) != null && r != 0 && + q.tryLockPhase()) ? q : submissionQueue(r, rejectOnShutdown)); + } + /** * Returns queue for an external thread, if one exists that has * possibly ever submitted to the given pool (nonzero probe), or @@ -3295,7 +3316,7 @@ public class ForkJoinPool extends AbstractExecutorService if ((config & PRESET_SIZE) != 0) throw new UnsupportedOperationException("Cannot override System property"); if ((prevSize = getAndSetParallelism(size)) < size) - signalWork(null, 0); // trigger worker activation + signalWork(); // trigger worker activation return prevSize; } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java index 0e82c545359..79c623bc31d 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java @@ -168,7 +168,6 @@ public final class DirectClassBuilder this.sizeHint = sizeHint; } - public byte[] build() { // The logic of this is very carefully ordered. We want to avoid diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/verifier/VerificationTable.java b/src/java.base/share/classes/jdk/internal/classfile/impl/verifier/VerificationTable.java index 04276b8eeb8..eb3f5ee913d 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/verifier/VerificationTable.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/verifier/VerificationTable.java @@ -321,7 +321,7 @@ class VerificationTable { return frame; } int offset_delta = _stream.get_u2(); - if (frame_type < SAME_LOCALS_1_STACK_ITEM_EXTENDED) { + if (frame_type <= RESERVED_END) { _verifier.classError("reserved frame type"); } if (frame_type == SAME_LOCALS_1_STACK_ITEM_EXTENDED) { diff --git a/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java b/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java index c36e265ee2f..4c358820166 100644 --- a/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java +++ b/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java @@ -821,6 +821,7 @@ public final class ImageReader implements AutoCloseable { this.children = Collections.unmodifiableList(children); } } + /** * Resource node (e.g. a ".class" entry, or any other data resource). * diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index d20f6311bca..665b3a3b98d 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -135,7 +135,6 @@ module java.base { exports javax.security.auth.x500; exports javax.security.cert; - // additional qualified exports may be inserted at build time // see make/gensrc/GenModuleInfo.gmk @@ -147,11 +146,11 @@ module java.base { java.security.sasl; exports jdk.internal to jdk.incubator.vector; - // Note: all modules in the exported list participate in preview features - // and therefore if they use preview features they do not need to be - // compiled with "--enable-preview". + // Note: all modules in the exported list participate in preview features, + // normal or reflective. They do not need to be compiled with "--enable-preview" + // to use preview features and do not need to suppress "preview" warnings. // It is recommended for any modules that do participate that their - // module declaration be annotated with jdk.internal.javac.ParticipatesInPreview + // module declaration be annotated with jdk.internal.javac.ParticipatesInPreview. exports jdk.internal.javac to java.compiler, jdk.compiler; diff --git a/src/java.base/share/classes/sun/security/ssl/X509KeyManagerCertChecking.java b/src/java.base/share/classes/sun/security/ssl/X509KeyManagerCertChecking.java index 6d26558847c..e0203128962 100644 --- a/src/java.base/share/classes/sun/security/ssl/X509KeyManagerCertChecking.java +++ b/src/java.base/share/classes/sun/security/ssl/X509KeyManagerCertChecking.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -512,13 +512,13 @@ abstract class X509KeyManagerCertChecking extends X509ExtendedKeyManager { chain[1].getPublicKey().getAlgorithm()); } else { // Check the signature algorithm of the certificate itself. - // Look for the "withRSA" in "SHA1withRSA", etc. + // Look for the "withEC" in "SHA256withECDSA", etc. X509Certificate issuer = (X509Certificate) chain[0]; String sigAlgName = issuer.getSigAlgName().toUpperCase(Locale.ENGLISH); String pattern = "WITH" + sigKeyAlgorithm.toUpperCase(Locale.ENGLISH); - return sigAlgName.endsWith(pattern); + return sigAlgName.contains(pattern); } } } diff --git a/src/java.base/share/classes/sun/security/util/KeyChoices.java b/src/java.base/share/classes/sun/security/util/KeyChoices.java index da3c611750e..00c4463d098 100644 --- a/src/java.base/share/classes/sun/security/util/KeyChoices.java +++ b/src/java.base/share/classes/sun/security/util/KeyChoices.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, 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 @@ -45,7 +45,7 @@ import java.util.function.BiFunction; * * This class supports reading, writing, and converting between them. *

- * Current code follows draft-ietf-lamps-kyber-certificates-11 and RFC 9881. + * Current code follows RFC 9935 and RFC 9881. */ public final class KeyChoices { diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security index ef4d7285f51..d5d0488a004 100644 --- a/src/java.base/share/conf/security/java.security +++ b/src/java.base/share/conf/security/java.security @@ -1704,7 +1704,7 @@ com.sun.security.allowedAIALocations= # # PKCS #8 encoding format for newly created ML-KEM and ML-DSA private keys # -# draft-ietf-lamps-kyber-certificates-11 and RFC 9881 define three possible formats for a private key: +# RFC 9935 and RFC 9881 define three possible formats for a private key: # a seed (64 bytes for ML-KEM, 32 bytes for ML-DSA), an expanded private key, # or a sequence containing both. # diff --git a/src/java.base/share/data/tzdata/VERSION b/src/java.base/share/data/tzdata/VERSION index ce25e7653b0..a2974d757c8 100644 --- a/src/java.base/share/data/tzdata/VERSION +++ b/src/java.base/share/data/tzdata/VERSION @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2025c +tzdata2026a diff --git a/src/java.base/share/data/tzdata/etcetera b/src/java.base/share/data/tzdata/etcetera index 41660b05dba..9b030fdb8d4 100644 --- a/src/java.base/share/data/tzdata/etcetera +++ b/src/java.base/share/data/tzdata/etcetera @@ -43,7 +43,8 @@ # which load the "UTC" file to handle seconds properly. Zone Etc/UTC 0 - UTC -# Functions like gmtime load the "GMT" file to handle leap seconds properly. +# If leap second support is enabled, functions like gmtime +# load the "GMT" file to handle leap seconds properly. # Vanguard section, which works with most .zi parsers. #Zone GMT 0 - GMT # Rearguard section, for TZUpdater 2.3.2 and earlier. diff --git a/src/java.base/share/data/tzdata/europe b/src/java.base/share/data/tzdata/europe index b82ca6f67bb..a66d40834cd 100644 --- a/src/java.base/share/data/tzdata/europe +++ b/src/java.base/share/data/tzdata/europe @@ -1064,9 +1064,19 @@ Zone Atlantic/Faroe -0:27:04 - LMT 1908 Jan 11 # Tórshavn # Greenland # -# From Paul Eggert (2004-10-31): +# From Paul Eggert (2026-01-22): +# During World War II, Greenland was effectively independent of Denmark and +# observed daylight saving time. TIME, volume 37, page 23 (1941-04-21) +# says, +# "Penfield and West made their way to the U.S.'s most northerly consulate. +# They were astonished to find that Greenlanders, with almost 24 hours of +# sunlight a day during the summer, have daylight saving time." +# As the details are unknown they are omitted from the data for now. +# # During World War II, Germany maintained secret manned weather stations in # East Greenland and Franz Josef Land, but we don't know their time zones. +# Also, they're likely out of scope for the database +# as we lack resources to track every bit of military activity. # My source for this is Wilhelm Dege's book mentioned under Svalbard. # # From Paul Eggert (2017-12-10): @@ -1980,7 +1990,6 @@ Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 # Valletta # From Stepan Golosunov (2016-03-07): # the act of the government of the Republic of Moldova Nr. 132 from 1990-05-04 -# http://lex.justice.md/viewdoc.php?action=view&view=doc&id=298782&lang=2 # ... says that since 1990-05-06 on the territory of the Moldavian SSR # time would be calculated as the standard time of the second time belt # plus one hour of the "summer" time. To implement that clocks would be @@ -2035,9 +2044,61 @@ Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 # Valletta # says the 2014-03-30 spring-forward transition was at 02:00 local time. # Guess that since 1997 Moldova has switched one hour before the EU. +# From Heitor David Pinto (2026-02-22): +# Soviet Moldovan resolution 132 of 1990 defined the summer time period from +# the last Sunday in March at 2:00 to the last Sunday in September at 3:00, +# matching the dates used in most of Europe at the time: +# https://web.archive.org/web/20211107050832/http://lex.justice.md/viewdoc.php?action=view&view=doc&id=298782&lang=1 +# +# It seems that in 1996 Moldova changed the end date to October like most of +# Europe, but kept the transitions at 2:00 and 3:00 rather than 1:00 UTC, +# which would have been locally 3:00 and 4:00.... +# +# The notices in the Moldovan government website and broadcaster showed the +# transitions at 2:00 and 3:00 until 2021: +# 2015 https://old.gov.md/en/node/7304 +# 2016 https://old.gov.md/en/node/12587 +# 2017 https://old.gov.md/en/node/20654 +# 2017 https://old.gov.md/en/content/moldova-upholds-winter-time-night-28-29-october +# 2018 https://old.gov.md/en/content/moldova-switch-summer-time +# 2018 https://old.gov.md/en/content/cabinet-ministers-informs-about-switch-winter-time-28-october +# 2019 https://old.gov.md/en/content/moldova-switch-summer-time-31-march +# 2019 https://old.gov.md/en/node/31122 +# 2020 https://old.gov.md/en/node/32771 +# 2020 https://old.gov.md/en/node/34497 +# 2021 https://trm.md/ro/social/moldova-trece-in-aceasta-noapte-la-ora-de-vara +# 2021 https://trm.md/en/social/republica-moldova-trece-la-ora-de-iarna1 +# +# However, since 2022, the notices showed the transitions at 3:00 and 4:00, +# matching the EU rule at 1:00 UTC: +# 2022 https://trm.md/en/social/in-acest-weekend-republica-moldova-trece-la-ora-de-vara +# 2022 https://old.gov.md/en/content/moldova-switch-winter-time +# 2023 https://moldova1.md/p/6587/ora-de-vara-2023-cum-schimbam-acele-ceasornicelor-si-cand-trecem-la-ora-de-vara +# 2023 https://old.gov.md/en/node/46662 +# 2024 https://moldova1.md/p/26535/republica-moldova-trece-la-ora-de-vara-in-acest-weekend +# 2024 https://moldova1.md/p/37768/republica-moldova-trece-in-aceasta-noapte-la-ora-de-iarna +# 2025 https://moldova1.md/p/46349/republica-moldova-trece-la-ora-de-vara-pe-30-martie-cum-ne-afecteaza-si-ce-recomanda-medicii +# 2025 https://moldova1.md/p/60469/republica-moldova-trece-la-ora-de-iarna-ceasurile-se-dau-inapoi-cu-o-ora +# +# It seems that the changes to the end date and transition times were just +# done in practice without formally changing the resolution. In late 2025, the +# government said that the Soviet resolution was still in force, and proposed +# a new resolution to replace it and formally establish the EU rule: +# ... based on the notices, it seems that in practice Moldova already +# uses the EU rule since 2022. This was also the year when Moldova applied to +# join the EU. +# +# From Robert Bastian (2026-02-26): +# This has been approved and published in the government gazette: +# https://monitorul.gov.md/ro/monitorul/view/pdf/3234/part/2#page=27 +# +# From Paul Eggert (2026-02-24): +# Also see Svetlana Rudenko, "Moldova abandons the 'Soviet era'", Logos Press, +# 2026-02-21 . + # Rule NAME FROM TO - IN ON AT SAVE LETTER/S -Rule Moldova 1997 max - Mar lastSun 2:00 1:00 S -Rule Moldova 1997 max - Oct lastSun 3:00 0 - +Rule Moldova 1997 2021 - Mar lastSun 2:00 1:00 S +Rule Moldova 1997 2021 - Oct lastSun 3:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] Zone Europe/Chisinau 1:55:20 - LMT 1880 @@ -2050,7 +2111,8 @@ Zone Europe/Chisinau 1:55:20 - LMT 1880 2:00 Russia EE%sT 1992 2:00 E-Eur EE%sT 1997 # See Romania commentary for the guessed 1997 transition to EU rules. - 2:00 Moldova EE%sT + 2:00 Moldova EE%sT 2022 + 2:00 EU EE%sT # Poland @@ -2436,7 +2498,7 @@ Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal # Nine O'clock # (1998-10-23) reports that the switch occurred at # 04:00 local time in fall 1998. For lack of better info, -# assume that Romania and Moldova switched to EU rules in 1997, +# assume that Romania switched to EU rules in 1997, # the same year as Bulgaria. # # Rule NAME FROM TO - IN ON AT SAVE LETTER/S diff --git a/src/java.base/share/data/tzdata/leapseconds b/src/java.base/share/data/tzdata/leapseconds index 9426b40f07e..d431a7d3607 100644 --- a/src/java.base/share/data/tzdata/leapseconds +++ b/src/java.base/share/data/tzdata/leapseconds @@ -93,7 +93,7 @@ Leap 2016 Dec 31 23:59:60 + S # Any additional leap seconds will come after this. # This Expires line is commented out for now, # so that pre-2020a zic implementations do not reject this file. -#Expires 2026 Jun 28 00:00:00 +#Expires 2026 Dec 28 00:00:00 # Here are POSIX timestamps for the data in this file. # "#updated" gives the last time the leap seconds data changed @@ -102,8 +102,8 @@ Leap 2016 Dec 31 23:59:60 + S # "#expires" gives the first time this file might be wrong; # if this file was derived from the IERS leap-seconds.list, # this is typically a bit less than one year after "updated". -#updated 1751846400 (2025-07-07 00:00:00 UTC) -#expires 1782604800 (2026-06-28 00:00:00 UTC) +#updated 1767698058 (2026-01-06 11:14:18 UTC) +#expires 1798416000 (2026-12-28 00:00:00 UTC) # Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat) -# File expires on 28 June 2026 +# File expires on 28 December 2026 diff --git a/src/java.base/share/native/include/classfile_constants.h.template b/src/java.base/share/native/include/classfile_constants.h.template index fb022ec1fd4..4f96a0673ef 100644 --- a/src/java.base/share/native/include/classfile_constants.h.template +++ b/src/java.base/share/native/include/classfile_constants.h.template @@ -111,7 +111,7 @@ enum { JVM_CONSTANT_InvokeDynamic = 18, JVM_CONSTANT_Module = 19, JVM_CONSTANT_Package = 20, - JVM_CONSTANT_ExternalMax = 20 + JVM_CONSTANT_ExternalMax = 20 }; /* JVM_CONSTANT_MethodHandle subtypes */ diff --git a/src/java.base/unix/native/libjava/TimeZone_md.c b/src/java.base/unix/native/libjava/TimeZone_md.c index cd253edde60..39e7b726220 100644 --- a/src/java.base/unix/native/libjava/TimeZone_md.c +++ b/src/java.base/unix/native/libjava/TimeZone_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -352,33 +352,15 @@ getPlatformTimeZoneID() } static char * -mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { +getJavaTimezoneFromPlatform(const char *tz_buf, size_t tz_len, const char *mapfilename) { FILE *tzmapf; - char mapfilename[PATH_MAX + 1]; char line[256]; int linecount = 0; - char *tz_buf = NULL; - char *temp_tz = NULL; char *javatz = NULL; - size_t tz_len = 0; - /* On AIX, the TZ environment variable may end with a comma - * followed by modifier fields until early AIX6.1. - * This restriction has been removed from AIX7. */ - - tz_buf = strdup(tz); - tz_len = strlen(tz_buf); - - /* Open tzmappings file, with buffer overrun check */ - if ((strlen(java_home_dir) + 15) > PATH_MAX) { - jio_fprintf(stderr, "Path %s/lib/tzmappings exceeds maximum path length\n", java_home_dir); - goto tzerr; - } - strcpy(mapfilename, java_home_dir); - strcat(mapfilename, "/lib/tzmappings"); if ((tzmapf = fopen(mapfilename, "r")) == NULL) { jio_fprintf(stderr, "can't open %s\n", mapfilename); - goto tzerr; + return NULL; } while (fgets(line, sizeof(line), tzmapf) != NULL) { @@ -431,10 +413,50 @@ mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { break; } } + (void) fclose(tzmapf); + return javatz; +} + +static char * +mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { + char mapfilename[PATH_MAX + 1]; + char *tz_buf = NULL; + char *javatz = NULL; + char *temp_tz = NULL; + size_t tz_len = 0; + + /* On AIX, the TZ environment variable may end with a comma + * followed by modifier fields until early AIX6.1. + * This restriction has been removed from AIX7. */ + + tz_buf = strdup(tz); + tz_len = strlen(tz_buf); + + /* Open tzmappings file, with buffer overrun check */ + if ((strlen(java_home_dir) + 15) > PATH_MAX) { + jio_fprintf(stderr, "Path %s/lib/tzmappings exceeds maximum path length\n", java_home_dir); + goto tzerr; + } + strcpy(mapfilename, java_home_dir); + strcat(mapfilename, "/lib/tzmappings"); + + // First attempt to find the Java timezone for the full tz string + javatz = getJavaTimezoneFromPlatform(tz_buf, tz_len, mapfilename); + + // If no match was found, check for timezone with truncated value + if (javatz == NULL) { + temp_tz = strchr(tz, ','); + tz_len = (temp_tz == NULL) ? strlen(tz) : temp_tz - tz; + free((void *) tz_buf); + tz_buf = (char *)malloc(tz_len + 1); + memcpy(tz_buf, tz, tz_len); + tz_buf[tz_len] = '\0'; + javatz = getJavaTimezoneFromPlatform(tz_buf, tz_len, mapfilename); + } tzerr: - if (tz_buf != NULL ) { + if (tz_buf != NULL) { free((void *) tz_buf); } diff --git a/src/java.compiler/share/classes/javax/annotation/processing/Processor.java b/src/java.compiler/share/classes/javax/annotation/processing/Processor.java index 4be159868fa..2f2a9b285f6 100644 --- a/src/java.compiler/share/classes/javax/annotation/processing/Processor.java +++ b/src/java.compiler/share/classes/javax/annotation/processing/Processor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -101,28 +101,29 @@ import javax.lang.model.SourceVersion; * supports, possibly an empty set. * * For a given round, the tool computes the set of annotation - * interfaces that are present on the elements enclosed within the - * root elements. If there is at least one annotation interface - * present, then as processors claim annotation interfaces, they are - * removed from the set of unmatched annotation interfaces. When the - * set is empty or no more processors are available, the round has run - * to completion. If there are no annotation interfaces present, - * annotation processing still occurs but only universal + * interfaces that are present on the elements {@linkplain + * RoundEnvironment#getElementsAnnotatedWith(TypeElement) included} + * within the root elements. If there is at least one annotation + * interface present, then as processors claim annotation interfaces, + * they are removed from the set of unmatched annotation interfaces. + * When the set is empty or no more processors are available, the + * round has run to completion. If there are no annotation interfaces + * present, annotation processing still occurs but only universal * processors which support processing all annotation interfaces, * {@code "*"}, can claim the (empty) set of annotation interfaces. * *

An annotation interface is considered present if there is at least - * one annotation of that interface present on an element enclosed within + * one annotation of that interface present on an element included within * the root elements of a round. For this purpose, a type parameter is - * considered to be enclosed by its {@linkplain + * considered to be included by its {@linkplain * TypeParameterElement#getGenericElement generic * element}. * For this purpose, a package element is not considered to - * enclose the top-level classes and interfaces within that + * include the top-level classes and interfaces within that * package. (A root element representing a package is created when a * {@code package-info} file is processed.) Likewise, for this - * purpose, a module element is not considered to enclose the + * purpose, a module element is not considered to include the * packages within that module. (A root element representing a module * is created when a {@code module-info} file is processed.) * diff --git a/src/java.compiler/share/classes/javax/lang/model/util/Types.java b/src/java.compiler/share/classes/javax/lang/model/util/Types.java index e7212a7e0be..f632135a899 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/Types.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/Types.java @@ -74,6 +74,7 @@ public interface Types { * Types without corresponding elements include: *

    *
  • {@linkplain TypeKind#isPrimitive() primitive types} + *
  • {@linkplain TypeKind#ARRAY array types} *
  • {@linkplain TypeKind#EXECUTABLE executable types} *
  • {@linkplain TypeKind#NONE "none"} pseudo-types *
  • {@linkplain TypeKind#NULL null types} diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java index 494995735e6..636d8240a55 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java @@ -116,7 +116,9 @@ final class CAccessibility implements PropertyChangeListener { if (newValue instanceof Accessible) { AccessibleContext nvAC = ((Accessible) newValue).getAccessibleContext(); AccessibleRole nvRole = nvAC.getAccessibleRole(); - if (!ignoredRoles.contains(roleKey(nvRole))) { + String roleStr = nvRole == null ? null : + AWTAccessor.getAccessibleBundleAccessor().getKey(nvRole); + if (!ignoredRoles.contains(roleStr)) { focusChanged(); } } @@ -1034,8 +1036,10 @@ final class CAccessibility implements PropertyChangeListener { // "ignored", and we should skip it and its descendants if (isShowing(context)) { final AccessibleRole role = context.getAccessibleRole(); - if (role != null && ignoredRoles != null && - ignoredRoles.contains(roleKey(role))) { + String roleStr = role == null ? null : + AWTAccessor.getAccessibleBundleAccessor().getKey(role); + if (roleStr != null && ignoredRoles != null && + ignoredRoles.contains(roleStr)) { // Get the child's unignored children. _addChildren(child, whichChildren, false, childrenAndRoles, ChildrenOperations.COMMON); @@ -1096,8 +1100,6 @@ final class CAccessibility implements PropertyChangeListener { return isShowing(parentContext); } - private static native String roleKey(AccessibleRole aRole); - public static Object[] getChildren(final Accessible a, final Component c) { if (a == null) return null; return invokeAndWait(new Callable() { diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m b/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m index bf66df162d1..fcd330940cc 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m @@ -325,20 +325,6 @@ static BOOL JavaAccessibilityIsSupportedAttribute(id element, NSString *attribut return [[element accessibilityAttributeNames] indexOfObject:attribute] != NSNotFound; } -/* - * Class: sun_lwawt_macosx_CAccessibility - * Method: roleKey - * Signature: (Ljavax/accessibility/AccessibleRole;)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_sun_lwawt_macosx_CAccessibility_roleKey -(JNIEnv *env, jclass clz, jobject axRole) -{ - DECLARE_CLASS_RETURN(sjc_AccessibleRole, "javax/accessibility/AccessibleRole", NULL); - DECLARE_FIELD_RETURN(sjf_key, sjc_AccessibleRole, "key", "Ljava/lang/String;", NULL); - return (*env)->GetObjectField(env, axRole, sjf_key); -} - - // errors from NSAccessibilityErrors void JavaAccessibilityRaiseSetAttributeToIllegalTypeException(const char *functionName, id element, NSString *attribute, id value) { diff --git a/src/java.desktop/share/classes/java/awt/AWTEvent.java b/src/java.desktop/share/classes/java/awt/AWTEvent.java index d48fae68cbe..f365393ffb1 100644 --- a/src/java.desktop/share/classes/java/awt/AWTEvent.java +++ b/src/java.desktop/share/classes/java/awt/AWTEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -554,22 +554,9 @@ public abstract class AWTEvent extends EventObject { */ void copyPrivateDataInto(AWTEvent that) { that.bdata = this.bdata; - // Copy canAccessSystemClipboard value from this into that. - if (this instanceof InputEvent && that instanceof InputEvent) { - - AWTAccessor.InputEventAccessor accessor - = AWTAccessor.getInputEventAccessor(); - - boolean b = accessor.canAccessSystemClipboard((InputEvent) this); - accessor.setCanAccessSystemClipboard((InputEvent) that, b); - } that.isSystemGenerated = this.isSystemGenerated; } void dispatched() { - if (this instanceof InputEvent) { - AWTAccessor.getInputEventAccessor(). - setCanAccessSystemClipboard((InputEvent) this, false); - } } } // class AWTEvent diff --git a/src/java.desktop/share/classes/java/awt/event/InputEvent.java b/src/java.desktop/share/classes/java/awt/event/InputEvent.java index 9f1172916df..7517ea810e3 100644 --- a/src/java.desktop/share/classes/java/awt/event/InputEvent.java +++ b/src/java.desktop/share/classes/java/awt/event/InputEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -309,13 +309,6 @@ public abstract sealed class InputEvent extends ComponentEvent */ int modifiers; - /* - * A flag that indicates that this instance can be used to access - * the system clipboard. - * This should be false in a headless environment, true in a headful one. - */ - private transient boolean canAccessSystemClipboard; - static { /* ensure that the necessary native libraries are loaded */ NativeLibLoader.loadLibraries(); @@ -328,15 +321,6 @@ public abstract sealed class InputEvent extends ComponentEvent return InputEvent.getButtonDownMasks(); } - public boolean canAccessSystemClipboard(InputEvent event) { - return event.canAccessSystemClipboard; - } - - @Override - public void setCanAccessSystemClipboard(InputEvent event, - boolean canAccessSystemClipboard) { - event.canAccessSystemClipboard = canAccessSystemClipboard; - } }); } @@ -381,11 +365,6 @@ public abstract sealed class InputEvent extends ComponentEvent super(source, id); this.when = when; this.modifiers = modifiers; - canAccessSystemClipboard = canAccessSystemClipboard(); - } - - private boolean canAccessSystemClipboard() { - return !GraphicsEnvironment.isHeadless(); } /** diff --git a/src/java.desktop/share/classes/java/beans/beancontext/BeanContextSupport.java b/src/java.desktop/share/classes/java/beans/beancontext/BeanContextSupport.java index 3aa77048f8f..884b36d4b12 100644 --- a/src/java.desktop/share/classes/java/beans/beancontext/BeanContextSupport.java +++ b/src/java.desktop/share/classes/java/beans/beancontext/BeanContextSupport.java @@ -422,42 +422,54 @@ public class BeanContextSupport extends BeanContextChildSupport BeanContextChild cbcc = getChildBeanContextChild(targetChild); BeanContextChild bccp = null; - synchronized(targetChild) { + if (targetChild instanceof BeanContextProxy) { + bccp = ((BeanContextProxy)targetChild).getBeanContextProxy(); - if (targetChild instanceof BeanContextProxy) { - bccp = ((BeanContextProxy)targetChild).getBeanContextProxy(); + if (bccp == null) throw new NullPointerException("BeanContextPeer.getBeanContextProxy()"); + } - if (bccp == null) throw new NullPointerException("BeanContextPeer.getBeanContextProxy()"); - } + BCSChild bcsc = createBCSChild(targetChild, bccp); + BCSChild pbcsc = null; - BCSChild bcsc = createBCSChild(targetChild, bccp); - BCSChild pbcsc = null; + synchronized (children) { + children.put(targetChild, bcsc); - synchronized (children) { - children.put(targetChild, bcsc); + if (bccp != null) children.put(bccp, pbcsc = createBCSChild(bccp, targetChild)); + } - if (bccp != null) children.put(bccp, pbcsc = createBCSChild(bccp, targetChild)); - } + if (cbcc != null) synchronized(cbcc) { + try { + cbcc.setBeanContext(getBeanContextPeer()); + } catch (PropertyVetoException pve) { - if (cbcc != null) synchronized(cbcc) { - try { - cbcc.setBeanContext(getBeanContextPeer()); - } catch (PropertyVetoException pve) { + synchronized (children) { + children.remove(targetChild); - synchronized (children) { - children.remove(targetChild); - - if (bccp != null) children.remove(bccp); - } - - throw new IllegalStateException(); + if (bccp != null) children.remove(bccp); } - cbcc.addPropertyChangeListener("beanContext", childPCL); - cbcc.addVetoableChangeListener("beanContext", childVCL); + throw new IllegalStateException(); } - Visibility v = getChildVisibility(targetChild); + cbcc.addPropertyChangeListener("beanContext", childPCL); + cbcc.addVetoableChangeListener("beanContext", childVCL); + } + + Visibility v = getChildVisibility(targetChild); + + if (v != null) { + if (okToUseGui) + v.okToUseGui(); + else + v.dontUseGui(); + } + + if (getChildSerializable(targetChild) != null) serializable++; + + childJustAddedHook(targetChild, bcsc); + + if (bccp != null) { + v = getChildVisibility(bccp); if (v != null) { if (okToUseGui) @@ -466,26 +478,9 @@ public class BeanContextSupport extends BeanContextChildSupport v.dontUseGui(); } - if (getChildSerializable(targetChild) != null) serializable++; - - childJustAddedHook(targetChild, bcsc); - - if (bccp != null) { - v = getChildVisibility(bccp); - - if (v != null) { - if (okToUseGui) - v.okToUseGui(); - else - v.dontUseGui(); - } - - if (getChildSerializable(bccp) != null) serializable++; - - childJustAddedHook(bccp, pbcsc); - } - + if (getChildSerializable(bccp) != null) serializable++; + childJustAddedHook(bccp, pbcsc); } // The specification requires that we fire a notification of the change @@ -536,42 +531,40 @@ public class BeanContextSupport extends BeanContextChildSupport // we are required to notify the child that it is no longer nested here if // it implements java.beans.beancontext.BeanContextChild - synchronized(targetChild) { - if (callChildSetBC) { - BeanContextChild cbcc = getChildBeanContextChild(targetChild); - if (cbcc != null) synchronized(cbcc) { - cbcc.removePropertyChangeListener("beanContext", childPCL); - cbcc.removeVetoableChangeListener("beanContext", childVCL); - - try { - cbcc.setBeanContext(null); - } catch (PropertyVetoException pve1) { - cbcc.addPropertyChangeListener("beanContext", childPCL); - cbcc.addVetoableChangeListener("beanContext", childVCL); - throw new IllegalStateException(); - } + if (callChildSetBC) { + BeanContextChild cbcc = getChildBeanContextChild(targetChild); + if (cbcc != null) synchronized(cbcc) { + cbcc.removePropertyChangeListener("beanContext", childPCL); + cbcc.removeVetoableChangeListener("beanContext", childVCL); + try { + cbcc.setBeanContext(null); + } catch (PropertyVetoException pve1) { + cbcc.addPropertyChangeListener("beanContext", childPCL); + cbcc.addVetoableChangeListener("beanContext", childVCL); + throw new IllegalStateException(); } + } + } - synchronized (children) { - children.remove(targetChild); + synchronized (children) { + children.remove(targetChild); - if (bcsc.isProxyPeer()) { - pbcsc = children.get(peer = bcsc.getProxyPeer()); - children.remove(peer); - } + if (bcsc.isProxyPeer()) { + pbcsc = children.get(peer = bcsc.getProxyPeer()); + children.remove(peer); } + } - if (getChildSerializable(targetChild) != null) serializable--; + if (getChildSerializable(targetChild) != null) serializable--; - childJustRemovedHook(targetChild, bcsc); + childJustRemovedHook(targetChild, bcsc); - if (peer != null) { - if (getChildSerializable(peer) != null) serializable--; + if (peer != null) { + if (getChildSerializable(peer) != null) serializable--; - childJustRemovedHook(peer, pbcsc); - } + childJustRemovedHook(peer, pbcsc); } fireChildrenRemoved(new BeanContextMembershipEvent(getBeanContextPeer(), peer == null ? new Object[] { targetChild } : new Object[] { targetChild, peer } )); diff --git a/src/java.desktop/share/classes/sun/awt/AWTAccessor.java b/src/java.desktop/share/classes/sun/awt/AWTAccessor.java index c74219f7efa..f98118171b4 100644 --- a/src/java.desktop/share/classes/sun/awt/AWTAccessor.java +++ b/src/java.desktop/share/classes/sun/awt/AWTAccessor.java @@ -361,13 +361,6 @@ public final class AWTAccessor { * Accessor for InputEvent.getButtonDownMasks() */ int[] getButtonDownMasks(); - - /* - * Accessor for InputEvent.canAccessSystemClipboard field - */ - boolean canAccessSystemClipboard(InputEvent event); - void setCanAccessSystemClipboard(InputEvent event, - boolean canAccessSystemClipboard); } /** diff --git a/src/java.desktop/share/classes/sun/java2d/loops/FontInfo.java b/src/java.desktop/share/classes/sun/java2d/loops/FontInfo.java index 09aa05b785e..10e10a4adde 100644 --- a/src/java.desktop/share/classes/sun/java2d/loops/FontInfo.java +++ b/src/java.desktop/share/classes/sun/java2d/loops/FontInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -26,6 +26,7 @@ package sun.java2d.loops; import java.awt.Font; +import java.util.Arrays; import sun.font.Font2D; import sun.font.FontStrike; @@ -41,7 +42,7 @@ import sun.font.FontStrike; * time. I am reluctant to add the overhead of that machinery here without * a proven benefit. */ -public class FontInfo implements Cloneable { +public final class FontInfo implements Cloneable { public Font font; public Font2D font2D; public FontStrike fontStrike; @@ -56,15 +57,7 @@ public class FontInfo implements Cloneable { /* lcdSubPixPos is used if FM is ON for HRGB/HBGR LCD text mode */ public boolean lcdSubPixPos; - public String mtx(double[] matrix) { - return ("["+ - matrix[0]+", "+ - matrix[1]+", "+ - matrix[2]+", "+ - matrix[3]+ - "]"); - } - + @Override public Object clone() { try { return super.clone(); @@ -73,15 +66,16 @@ public class FontInfo implements Cloneable { } } + @Override public String toString() { return ("FontInfo["+ "font="+font+", "+ - "devTx="+mtx(devTx)+", "+ - "glyphTx="+mtx(glyphTx)+", "+ + "devTx="+Arrays.toString(devTx)+", "+ + "glyphTx="+Arrays.toString(glyphTx)+", "+ "pixelHeight="+pixelHeight+", "+ "origin=("+originX+","+originY+"), "+ "aaHint="+aaHint+", "+ - "lcdRGBOrder="+(lcdRGBOrder ? "RGB" : "BGR")+ + "lcdRGBOrder="+(lcdRGBOrder ? "RGB" : "BGR")+", "+ "lcdSubPixPos="+lcdSubPixPos+ "]"); } diff --git a/src/java.desktop/share/classes/sun/print/PrintJobDelegate.java b/src/java.desktop/share/classes/sun/print/PrintJobDelegate.java index 5a88d4b9d45..bca3301b5c9 100644 --- a/src/java.desktop/share/classes/sun/print/PrintJobDelegate.java +++ b/src/java.desktop/share/classes/sun/print/PrintJobDelegate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -526,8 +526,10 @@ public class PrintJobDelegate implements Printable, Runnable { } PageRanges range = (PageRanges)attributes.get(PageRanges.class); - int[][] members = range.getMembers(); - jobAttributes.setPageRanges(members); + if (range != null) { + int[][] members = range.getMembers(); + jobAttributes.setPageRanges(members); + } SheetCollate collation = (SheetCollate)attributes.get(SheetCollate.class); diff --git a/src/java.desktop/share/legal/freetype.md b/src/java.desktop/share/legal/freetype.md index cf2518df594..7259c27183f 100644 --- a/src/java.desktop/share/legal/freetype.md +++ b/src/java.desktop/share/legal/freetype.md @@ -1,4 +1,4 @@ -## The FreeType Project: Freetype v2.14.1 +## The FreeType Project: Freetype v2.14.2 ### FreeType Notice diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h index be7a4c50dc3..a0a1a410b68 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h @@ -759,7 +759,13 @@ FT_BEGIN_HEADER /************************************************************************** * * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an - * embedded 'BDF~' table within SFNT-based bitmap formats. + * embedded 'BDF~' table within an SFNT-based `.otb` font file. This table + * is an extension used by X11 to preserve BDF properties after conversion + * to SFNT containers. See + * + * https://fontforge.org/docs/techref/non-standard.html#non-standard-bdf + * + * for more details. */ /* #define TT_CONFIG_OPTION_BDF */ diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h index d1b6a9898fd..bd350851d56 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h @@ -24,6 +24,7 @@ * This is the only necessary change, so it is defined here instead * providing a new configuration file. */ +#ifdef FT_MACINTOSH #if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) /* No Carbon frameworks for 64bit 10.4.x. */ /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ @@ -36,6 +37,7 @@ ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) #undef FT_MACINTOSH #endif +#endif /* __APPLE__ ... */ #elif defined( __SC__ ) || defined( __MRC__ ) /* Classic MacOS compilers */ diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h b/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h index 1e249235882..e8a1b1e2f3e 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h @@ -4318,14 +4318,13 @@ FT_BEGIN_HEADER * property `no-stem-darkening` provided by the 'autofit', 'cff', * 'type1', and 't1cid' modules; see @no-stem-darkening). * - * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding - * to function @FT_Library_SetLcdFilterWeights). - * * * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID * 'random' operator, corresponding to the `random-seed` property * provided by the 'cff', 'type1', and 't1cid' modules; see * @random-seed). * + * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (no longer supported). + * * Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the * option and use the library or module default again. * @@ -4352,25 +4351,17 @@ FT_BEGIN_HEADER * FT_Bool darken_stems = 1; * * FT_Parameter property2; - * FT_LcdFiveTapFilter custom_weight = - * { 0x11, 0x44, 0x56, 0x44, 0x11 }; - * - * FT_Parameter property3; * FT_Int32 random_seed = 314159265; * - * FT_Parameter properties[3] = { property1, - * property2, - * property3 }; + * FT_Parameter properties[2] = { property1, + * property2 }; * * * property1.tag = FT_PARAM_TAG_STEM_DARKENING; * property1.data = &darken_stems; * - * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; - * property2.data = custom_weight; - * - * property3.tag = FT_PARAM_TAG_RANDOM_SEED; - * property3.data = &random_seed; + * property2.tag = FT_PARAM_TAG_RANDOM_SEED; + * property2.data = &random_seed; * * FT_Face_Properties( face, 3, properties ); * ``` @@ -4381,7 +4372,7 @@ FT_BEGIN_HEADER * FT_Parameter property; * * - * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.tag = FT_PARAM_TAG_STEM_DARKENING; * property.data = NULL; * * FT_Face_Properties( face, 1, &property ); @@ -5178,7 +5169,7 @@ FT_BEGIN_HEADER */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 14 -#define FREETYPE_PATCH 1 +#define FREETYPE_PATCH 2 /************************************************************************** diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h index faad25689c9..ab142249217 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h @@ -44,7 +44,8 @@ FT_BEGIN_HEADER * * @description: * This section contains the declaration of functions specific to BDF and - * PCF fonts. + * PCF fonts. They also work for SFNT bitmap fonts that contain a 'BDF~' + * table like X11's `.otb` fonts. * */ @@ -151,7 +152,9 @@ FT_BEGIN_HEADER * FreeType error code. 0~means success. * * @note: - * This function only works with BDF faces, returning an error otherwise. + * This function only works with BDF faces and SFNT fonts that have a + * 'BDF~' table, returning an error otherwise. For the latter, a bitmap + * strike size must be selected first. */ FT_EXPORT( FT_Error ) FT_Get_BDF_Charset_ID( FT_Face face, @@ -165,7 +168,7 @@ FT_BEGIN_HEADER * FT_Get_BDF_Property * * @description: - * Retrieve a BDF property from a BDF or PCF font file. + * Retrieve a BDF property from a BDF or PCF font. * * @input: * face :: @@ -196,6 +199,9 @@ FT_BEGIN_HEADER * * In case of error, `aproperty->type` is always set to * @BDF_PROPERTY_TYPE_NONE. + * + * This also works with SFNT fonts that have a 'BDF~' table, after a + * bitmap strike size has been selected. */ FT_EXPORT( FT_Error ) FT_Get_BDF_Property( FT_Face face, diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h index b0a0172ef4f..a4dc724f349 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h @@ -875,7 +875,7 @@ FT_BEGIN_HEADER */ typedef struct FT_Span_ { - short x; + unsigned short x; unsigned short len; unsigned char coverage; diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h index a0a8e9da929..37bb5e1b8fb 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h @@ -145,16 +145,10 @@ FT_BEGIN_HEADER * * FT_LCD_FILTER_LEGACY :: * FT_LCD_FILTER_LEGACY1 :: - * This filter corresponds to the original libXft color filter. It - * provides high contrast output but can exhibit really bad color - * fringes if glyphs are not extremely well hinted to the pixel grid. - * This filter is only provided for comparison purposes, and might be - * disabled or stay unsupported in the future. The second value is - * provided for compatibility with FontConfig, which historically used - * different enumeration, sometimes incorrectly forwarded to FreeType. + * The legacy libXft color filter is no longer supported and ignored. * * @since: - * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2) + * 2.3.0 */ typedef enum FT_LcdFilter_ { diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h index 2c09db1683e..94dcd6399a6 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h @@ -133,11 +133,8 @@ FT_BEGIN_HEADER * FT_PARAM_TAG_LCD_FILTER_WEIGHTS * * @description: - * An @FT_Parameter tag to be used with @FT_Face_Properties. The - * corresponding argument specifies the five LCD filter weights for a - * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the - * global default values or the values set up with - * @FT_Library_SetLcdFilterWeights. + * Overriding global LCD filter weights with custom values for a given + * face is no longer supported and ignored. * * @since: * 2.8 diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h index 62335db4834..754122fa646 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h @@ -191,8 +191,8 @@ FT_BEGIN_HEADER FT_UInt weight; FT_Bool is_fixed_pitch; FT_Fixed italic_angle; - FT_Fixed underline_position; - FT_Fixed underline_thickness; + FT_Short underline_position; + FT_UShort underline_thickness; FT_Int paint_type; FT_Int charstring_type; FT_Matrix font_matrix; diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h index 3db2fe28ffd..d4d7bc00fe9 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h @@ -365,11 +365,6 @@ FT_BEGIN_HEADER * Value~0 means to use the font's value. Value~-1 means to use the * CFF driver's default. * - * lcd_weights :: - * lcd_filter_func :: - * These fields specify the LCD filtering weights and callback function - * for ClearType-style subpixel rendering. - * * refcount :: * A counter initialized to~1 at the time an @FT_Face structure is * created. @FT_Reference_Face increments this counter, and @@ -391,11 +386,6 @@ FT_BEGIN_HEADER FT_Char no_stem_darkening; FT_Int32 random_seed; -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ - FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ -#endif - FT_Int refcount; } FT_Face_InternalRec; @@ -724,9 +714,9 @@ FT_BEGIN_HEADER const FT_Vector* origin ); /* Allocate a new bitmap buffer in a glyph slot. */ + /* Dimensions must be preset in advance. */ FT_BASE( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ); + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot ); /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ @@ -889,10 +879,6 @@ FT_BEGIN_HEADER * lcd_weights :: * The LCD filter weights for ClearType-style subpixel rendering. * - * lcd_filter_func :: - * The LCD filtering callback function for for ClearType-style subpixel - * rendering. - * * lcd_geometry :: * This array specifies LCD subpixel geometry and controls Harmony LCD * rendering technique, alternative to ClearType. @@ -926,7 +912,6 @@ FT_BEGIN_HEADER #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ - FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ #else FT_Vector lcd_geometry[3]; /* RGB subpixel positions */ #endif @@ -995,17 +980,6 @@ FT_BEGIN_HEADER #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ - /* Define default raster's interface. The default raster is located in */ - /* `src/base/ftraster.c'. */ - /* */ - /* Client applications can register new rasters through the */ - /* FT_Set_Raster() API. */ - -#ifndef FT_NO_DEFAULT_RASTER - FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; -#endif - - /************************************************************************** * * @macro: diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h b/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h index fc3c1706de5..fe769f607fa 100644 --- a/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h +++ b/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h @@ -92,7 +92,7 @@ FT_BEGIN_HEADER FT_String* full_name; FT_String* family_name; FT_String* weight; - FT_Long italic_angle; + FT_Fixed italic_angle; FT_Bool is_fixed_pitch; FT_Short underline_position; FT_UShort underline_thickness; @@ -645,7 +645,7 @@ FT_BEGIN_HEADER PS_DICT_UNDERLINE_POSITION, /* FT_Short */ PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ PS_DICT_FS_TYPE, /* FT_UShort */ - PS_DICT_ITALIC_ANGLE, /* FT_Long */ + PS_DICT_ITALIC_ANGLE, /* FT_Fixed */ PS_DICT_MAX = PS_DICT_ITALIC_ANGLE diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c index 6637cacfccf..a1aa45914d0 100644 --- a/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c +++ b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c @@ -1405,7 +1405,8 @@ FT_TRACE4(( " " )); idx = HB_SET_VALUE_INVALID; while ( hb( set_next )( gsub_lookups, &idx ) ) - if ( globals->gsub_lookups_single_alternate[idx] ) + if ( idx < globals->gsub_lookup_count && + globals->gsub_lookups_single_alternate[idx] ) { have_idx = TRUE; FT_TRACE4(( " %u", idx )); @@ -1428,9 +1429,17 @@ idx = HB_SET_VALUE_INVALID; while ( hb( set_next )( gsub_lookups, &idx ) ) { - FT_UInt32 offset = globals->gsub_lookups_single_alternate[idx]; + FT_UInt32 offset; + /* HarfBuzz only validates lookup indices while */ + /* processing lookups, not while collecting them, */ + /* so we have to do that by ourselves. */ + if ( idx < globals->gsub_lookup_count ) + offset = globals->gsub_lookups_single_alternate[idx]; + else + offset = 0; + /* Put all substitutions into a single hash table. Note that */ /* the hash values usually contain more than a single character */ /* code; this can happen if different 'SingleSubst' subtables */ diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h index 362f56e290b..dc061159492 100644 --- a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h +++ b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h @@ -116,7 +116,9 @@ FT_BEGIN_HEADER /* The GSUB table. */ FT_Byte* gsub; - /* Lookup offsets, with only SingleSubst and AlternateSubst non-NULL. */ + /* An array of lookup offsets (of `gsub_lookup_count` elements), */ + /* with only SingleSubst and AlternateSubst lookups non-NULL. */ + FT_UShort gsub_lookup_count; FT_UInt32* gsub_lookups_single_alternate; #endif diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c index cb5667ff793..4a42d919474 100644 --- a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c +++ b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c @@ -3269,9 +3269,9 @@ next_on = next_on->next; if ( next_on->y > p->y && prev_on->y > p->y ) - measurement = p->y - min_y; + measurement = SUB_LONG( p->y, min_y ); else if ( next_on->y < p->y && prev_on->y < p->y ) - measurement = max_y - p->y; + measurement = SUB_LONG( max_y, p->y ); else continue; @@ -3309,11 +3309,14 @@ p = first_point; do { - p = p->next; - /* We adjust the height of the diacritic only, which means */ - /* we are never dealing with large numbers and can thus avoid */ - /* `FT_MulFix`. */ - p->y = ( ( p->y - min_y ) * target_height / height ) + min_y; + p = p->next; + /* We adjust the height of the diacritic only, which means */ + /* we are never dealing with (valid) large numbers and can */ + /* thus avoid `FT_MulFix`. */ + p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y, + min_y ), + target_height ) / height, + min_y ); } while ( p != first_point ); @@ -3370,9 +3373,9 @@ next_on = next_on->next; if ( next_on->y > p->y && prev_on->y > p->y ) - measurement = p->y - min_y; + measurement = SUB_LONG( p->y, min_y ); else if ( next_on->y < p->y && prev_on->y < p->y ) - measurement = max_y - p->y; + measurement = SUB_LONG( max_y, p->y ); else continue; @@ -3403,8 +3406,11 @@ p = first_point; do { - p = p->next; - p->y = ( ( p->y - max_y ) * target_height / height ) + max_y; + p = p->next; + p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y, + max_y ), + target_height ) / height, + max_y ); } while ( p != first_point ); @@ -3462,9 +3468,9 @@ } while ( p != first_point ); /* Align bottom of the tilde to the grid. */ - min_y_rounded = FT_PIX_ROUND( min_y ); - delta = min_y_rounded - min_y; - height = max_y - min_y; + min_y_rounded = FT_PIX_ROUND_LONG( min_y ); + delta = SUB_LONG( min_y_rounded, min_y ); + height = SUB_LONG( max_y, min_y ); /* If the tilde is less than 3 pixels tall, snap the center of it */ /* to the grid instead of the bottom to improve readability. */ @@ -3502,9 +3508,9 @@ } while ( p != first_point ); - max_y_rounded = FT_PIX_ROUND( max_y ); - delta = max_y_rounded - max_y; - height = max_y - min_y; + max_y_rounded = FT_PIX_ROUND_LONG( max_y ); + delta = SUB_LONG( max_y_rounded, max_y ); + height = SUB_LONG( max_y, min_y ); if ( height < 64 * 3 ) delta -= ( FT_PIX_ROUND( height ) - height ) / 2; @@ -3673,7 +3679,7 @@ high_min_y = hints->contour_y_minima[high_contour]; high_max_y = hints->contour_y_maxima[high_contour]; - high_height = high_max_y - high_min_y; + high_height = SUB_LONG( high_max_y, high_min_y ); if ( high_height > accent_height_limit ) { @@ -3705,7 +3711,7 @@ /* We also check that the y minimum of the 'other' contour */ /* is below the high contour to avoid potential false hits */ /* with contours enclosed in the high one. */ - distance = high_min_y - max_y; + distance = SUB_LONG( high_min_y, max_y ); if ( distance < 64 && distance < min_distance && min_y < high_min_y ) @@ -3724,14 +3730,14 @@ tilde_min_y = hints->contour_y_minima[tilde_contour]; tilde_max_y = hints->contour_y_maxima[tilde_contour]; - tilde_height = tilde_max_y - tilde_min_y; + tilde_height = SUB_LONG( tilde_max_y, tilde_min_y); /* The vertical separation adjustment potentially undoes a */ /* tilde center alignment. If it would grid-align a tilde */ /* less than 3 pixels in height, shift additionally to */ /* re-center the tilde. */ - pos = high_min_y + adjustment_amount; + pos = ADD_LONG( high_min_y, adjustment_amount ); if ( adjust_below_top && is_top_tilde ) pos += high_height; @@ -3764,7 +3770,7 @@ { /* Value 8 is heuristic. */ FT_Pos height_delta = high_height / 8; - FT_Pos min_y_limit = high_min_y - height_delta; + FT_Pos min_y_limit = SUB_LONG( high_min_y, height_delta ); FT_TRACE4(( " Pushing high contour %ld units up\n", @@ -3784,7 +3790,7 @@ centering_adjustment )); af_move_contours_up( hints, - min_y_limit + high_height, + ADD_LONG( min_y_limit, high_height ), centering_adjustment ); } } @@ -3838,7 +3844,7 @@ low_min_y = hints->contour_y_minima[low_contour]; low_max_y = hints->contour_y_maxima[low_contour]; - low_height = low_max_y - low_min_y; + low_height = SUB_LONG( low_max_y, low_min_y ); if ( low_height > accent_height_limit ) { @@ -3863,7 +3869,7 @@ min_y = hints->contour_y_minima[contour]; max_y = hints->contour_y_maxima[contour]; - distance = min_y - low_max_y; + distance = SUB_LONG( min_y, low_max_y ); if ( distance < 64 && distance < min_distance && max_y > low_max_y ) @@ -3882,9 +3888,9 @@ tilde_min_y = hints->contour_y_minima[tilde_contour]; tilde_max_y = hints->contour_y_maxima[tilde_contour]; - tilde_height = tilde_max_y - tilde_min_y; + tilde_height = SUB_LONG( tilde_max_y, tilde_min_y ); - pos = low_max_y - adjustment_amount; + pos = SUB_LONG( low_max_y, adjustment_amount ); if ( adjust_above_bottom && is_bottom_tilde ) pos -= low_height; @@ -3915,7 +3921,7 @@ ( calculated_amount <= 66 || adjustment_amount <= 66 ) ) { FT_Pos height_delta = low_height / 8; - FT_Pos max_y_limit = low_max_y + height_delta; + FT_Pos max_y_limit = ADD_LONG( low_max_y, height_delta ); FT_TRACE4(( " Pushing low contour %ld units down\n", @@ -3929,7 +3935,7 @@ centering_adjustment )); af_move_contours_down( hints, - max_y_limit - low_height, + SUB_LONG( max_y_limit, low_height ), centering_adjustment ); } } diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c index d84adc09679..4e2ac1f1ce3 100644 --- a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c +++ b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c @@ -524,16 +524,18 @@ bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + bbox.xMax = FT_PIX_CEIL_LONG( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL_LONG( bbox.yMax ); - slot->metrics.width = bbox.xMax - bbox.xMin; - slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin ); + slot->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin ); slot->metrics.horiBearingX = bbox.xMin; slot->metrics.horiBearingY = bbox.yMax; - slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); - slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + slot->metrics.vertBearingX = FT_PIX_FLOOR( ADD_LONG( bbox.xMin, + vvector.x ) ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( ADD_LONG( bbox.yMax, + vvector.y ) ); /* for mono-width fonts (like Andale, Courier, etc.) we need */ /* to keep the original rounded advance width; ditto for */ diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c b/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c index ff0fc510503..7b965c62d58 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c @@ -20,6 +20,7 @@ #include #include +#include static FT_Error @@ -47,11 +48,43 @@ /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ for ( nn = 0; nn < count; nn++ ) - advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + advances[nn] = FT_MulFix( 1024 * advances[nn], scale ); return FT_Err_Ok; } + /* loading (and hinting) to calculate the advances is slow */ + /* unless TrueType hdmx table is provided as an accelerator */ + static FT_Error + ft_load_advances( FT_Face face, + FT_UInt gindex, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_UInt nn; + FT_Error error = FT_Err_Ok; + FT_Pos factor = flags & FT_LOAD_NO_SCALE ? 1 : 1024; + FT_Pos* advance = flags & FT_LOAD_VERTICAL_LAYOUT + ? &face->glyph->advance.y + : &face->glyph->advance.x; + + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, gindex + nn, flags ); + if ( error ) + break; + + /* scale from 26.6 to 16.16, unless NO_SCALE was requested */ + padvances[nn] = *advance * factor; + } + + return error; + } + /* at the moment, we can perform fast advance retrieval only in */ /* the following cases: */ @@ -102,7 +135,10 @@ return error; } - return FT_Get_Advances( face, gindex, 1, flags, padvance ); + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_THROW( Unimplemented_Feature ); + + return ft_load_advances( face, gindex, 1, flags, padvance ); } @@ -115,12 +151,9 @@ FT_Int32 flags, FT_Fixed *padvances ) { - FT_Error error = FT_Err_Ok; - FT_Face_GetAdvancesFunc func; - FT_UInt num, end, nn; - FT_Int factor; + FT_UInt num, end; if ( !face ) @@ -140,6 +173,9 @@ func = face->driver->clazz->get_advances; if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) ) { + FT_Error error; + + error = func( face, start, count, flags, padvances ); if ( !error ) return ft_face_scale_advances_( face, padvances, count, flags ); @@ -148,26 +184,10 @@ return error; } - error = FT_Err_Ok; - if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) return FT_THROW( Unimplemented_Feature ); - flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; - factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024; - for ( nn = 0; nn < count; nn++ ) - { - error = FT_Load_Glyph( face, start + nn, flags ); - if ( error ) - break; - - /* scale from 26.6 to 16.16, unless NO_SCALE was requested */ - padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) - ? face->glyph->advance.y * factor - : face->glyph->advance.x * factor; - } - - return error; + return ft_load_advances( face, start, count, flags, padvances ); } diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c b/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c index 2c8e44b905d..364f881e435 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c @@ -922,14 +922,7 @@ target->pitch = (int)final_width * 4; target->num_grays = 256; - if ( FT_LONG_MAX / target->pitch < (int)target->rows ) - { - FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%u x %u)\n", - final_width, final_rows )); - return FT_THROW( Invalid_Argument ); - } - - if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) ) + if ( FT_ALLOC_MULT( target->buffer, target->rows, target->pitch ) ) return error; free_target_bitmap_on_error = 1; @@ -950,16 +943,9 @@ new_pitch = (int)final_width * 4; - if ( FT_LONG_MAX / new_pitch < (int)final_rows ) - { - FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%u x %u)\n", - final_width, final_rows )); - return FT_THROW( Invalid_Argument ); - } - /* TODO: provide an in-buffer solution for large bitmaps */ /* to avoid allocation of a new buffer */ - if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) ) + if ( FT_ALLOC_MULT( buffer, final_rows, new_pitch ) ) goto Error; /* copy data to new buffer */ diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c b/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c index 75babb1aa56..6138cfeec2c 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c @@ -62,7 +62,7 @@ FT_GlyphSlot slot ) { FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - FT_Error error = FT_Err_Ok; + FT_Error error; FT_Library library = FT_GLYPH( glyph )->library; @@ -75,17 +75,8 @@ glyph->left = slot->bitmap_left; glyph->top = slot->bitmap_top; - /* do lazy copying whenever possible */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - glyph->bitmap = slot->bitmap; - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - else - { - FT_Bitmap_Init( &glyph->bitmap ); - error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); - } + FT_Bitmap_Init( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); Exit: return error; diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c b/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c index d026da8b012..51c6fd48a1b 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c @@ -25,265 +25,28 @@ #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING -/* define USE_LEGACY to implement the legacy filter */ -#define USE_LEGACY - -#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) ) - - - /* add padding according to filter weights */ + /* add padding sufficient for a 5-tap filter, */ + /* which is 2/3 of a pixel */ FT_BASE_DEF( void ) ft_lcd_padding( FT_BBox* cbox, FT_GlyphSlot slot, FT_Render_Mode mode ) { - FT_Byte* lcd_weights; - FT_Bitmap_LcdFilterFunc lcd_filter_func; + FT_UNUSED( slot ); - - /* Per-face LCD filtering takes priority if set up. */ - if ( slot->face && slot->face->internal->lcd_filter_func ) + if ( mode == FT_RENDER_MODE_LCD ) { - lcd_weights = slot->face->internal->lcd_weights; - lcd_filter_func = slot->face->internal->lcd_filter_func; + cbox->xMin -= 43; + cbox->xMax += 43; } - else + else if ( mode == FT_RENDER_MODE_LCD_V ) { - lcd_weights = slot->library->lcd_weights; - lcd_filter_func = slot->library->lcd_filter_func; - } - - if ( lcd_filter_func == ft_lcd_filter_fir ) - { - if ( mode == FT_RENDER_MODE_LCD ) - { - cbox->xMin -= lcd_weights[0] ? 43 : - lcd_weights[1] ? 22 : 0; - cbox->xMax += lcd_weights[4] ? 43 : - lcd_weights[3] ? 22 : 0; - } - else if ( mode == FT_RENDER_MODE_LCD_V ) - { - cbox->yMin -= lcd_weights[0] ? 43 : - lcd_weights[1] ? 22 : 0; - cbox->yMax += lcd_weights[4] ? 43 : - lcd_weights[3] ? 22 : 0; - } + cbox->yMin -= 43; + cbox->yMax += 43; } } - /* FIR filter used by the default and light filters */ - FT_BASE_DEF( void ) - ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_LcdFiveTapFilter weights ) - { - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - FT_Int pitch = bitmap->pitch; - FT_Byte* origin = bitmap->buffer; - FT_Byte mode = bitmap->pixel_mode; - - - /* take care of bitmap flow */ - if ( pitch > 0 && height > 0 ) - origin += pitch * (FT_Int)( height - 1 ); - - /* horizontal in-place FIR filter */ - if ( mode == FT_PIXEL_MODE_LCD && width >= 2 ) - { - FT_Byte* line = origin; - - - /* `fir' must be at least 32 bit wide, since the sum of */ - /* the values in `weights' can exceed 0xFF */ - - for ( ; height > 0; height--, line -= pitch ) - { - FT_UInt fir[5]; - FT_UInt val, xx; - - - val = line[0]; - fir[2] = weights[2] * val; - fir[3] = weights[3] * val; - fir[4] = weights[4] * val; - - val = line[1]; - fir[1] = fir[2] + weights[1] * val; - fir[2] = fir[3] + weights[2] * val; - fir[3] = fir[4] + weights[3] * val; - fir[4] = weights[4] * val; - - for ( xx = 2; xx < width; xx++ ) - { - val = line[xx]; - fir[0] = fir[1] + weights[0] * val; - fir[1] = fir[2] + weights[1] * val; - fir[2] = fir[3] + weights[2] * val; - fir[3] = fir[4] + weights[3] * val; - fir[4] = weights[4] * val; - - line[xx - 2] = FT_SHIFTCLAMP( fir[0] ); - } - - line[xx - 2] = FT_SHIFTCLAMP( fir[1] ); - line[xx - 1] = FT_SHIFTCLAMP( fir[2] ); - } - } - - /* vertical in-place FIR filter */ - else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 2 ) - { - FT_Byte* column = origin; - - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column; - FT_UInt fir[5]; - FT_UInt val, yy; - - - val = col[0]; - fir[2] = weights[2] * val; - fir[3] = weights[3] * val; - fir[4] = weights[4] * val; - col -= pitch; - - val = col[0]; - fir[1] = fir[2] + weights[1] * val; - fir[2] = fir[3] + weights[2] * val; - fir[3] = fir[4] + weights[3] * val; - fir[4] = weights[4] * val; - col -= pitch; - - for ( yy = 2; yy < height; yy++, col -= pitch ) - { - val = col[0]; - fir[0] = fir[1] + weights[0] * val; - fir[1] = fir[2] + weights[1] * val; - fir[2] = fir[3] + weights[2] * val; - fir[3] = fir[4] + weights[3] * val; - fir[4] = weights[4] * val; - - col[pitch * 2] = FT_SHIFTCLAMP( fir[0] ); - } - - col[pitch * 2] = FT_SHIFTCLAMP( fir[1] ); - col[pitch] = FT_SHIFTCLAMP( fir[2] ); - } - } - } - - -#ifdef USE_LEGACY - - /* intra-pixel filter used by the legacy filter */ - static void - _ft_lcd_filter_legacy( FT_Bitmap* bitmap, - FT_Byte* weights ) - { - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - FT_Int pitch = bitmap->pitch; - FT_Byte* origin = bitmap->buffer; - FT_Byte mode = bitmap->pixel_mode; - - static const unsigned int filters[3][3] = - { - { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, - { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, - { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } - }; - - FT_UNUSED( weights ); - - - /* take care of bitmap flow */ - if ( pitch > 0 && height > 0 ) - origin += pitch * (FT_Int)( height - 1 ); - - /* horizontal in-place intra-pixel filter */ - if ( mode == FT_PIXEL_MODE_LCD && width >= 3 ) - { - FT_Byte* line = origin; - - - for ( ; height > 0; height--, line -= pitch ) - { - FT_UInt xx; - - - for ( xx = 0; xx < width; xx += 3 ) - { - FT_UInt r, g, b; - FT_UInt p; - - - p = line[xx]; - r = filters[0][0] * p; - g = filters[0][1] * p; - b = filters[0][2] * p; - - p = line[xx + 1]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = line[xx + 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - line[xx] = (FT_Byte)( r / 65536 ); - line[xx + 1] = (FT_Byte)( g / 65536 ); - line[xx + 2] = (FT_Byte)( b / 65536 ); - } - } - } - else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 3 ) - { - FT_Byte* column = origin; - - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column - 2 * pitch; - - - for ( ; height > 0; height -= 3, col -= 3 * pitch ) - { - FT_UInt r, g, b; - FT_UInt p; - - - p = col[0]; - r = filters[0][0] * p; - g = filters[0][1] * p; - b = filters[0][2] * p; - - p = col[pitch]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = col[pitch * 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - col[0] = (FT_Byte)( r / 65536 ); - col[pitch] = (FT_Byte)( g / 65536 ); - col[pitch * 2] = (FT_Byte)( b / 65536 ); - } - } - } - } - -#endif /* USE_LEGACY */ - - /* documentation in ftlcdfil.h */ FT_EXPORT_DEF( FT_Error ) @@ -297,7 +60,6 @@ return FT_THROW( Invalid_Argument ); ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS ); - library->lcd_filter_func = ft_lcd_filter_fir; return FT_Err_Ok; } @@ -321,32 +83,23 @@ switch ( filter ) { case FT_LCD_FILTER_NONE: - library->lcd_filter_func = NULL; + ft_memset( library->lcd_weights, + 0, + FT_LCD_FILTER_FIVE_TAPS ); break; case FT_LCD_FILTER_DEFAULT: ft_memcpy( library->lcd_weights, default_weights, FT_LCD_FILTER_FIVE_TAPS ); - library->lcd_filter_func = ft_lcd_filter_fir; break; case FT_LCD_FILTER_LIGHT: ft_memcpy( library->lcd_weights, light_weights, FT_LCD_FILTER_FIVE_TAPS ); - library->lcd_filter_func = ft_lcd_filter_fir; break; -#ifdef USE_LEGACY - - case FT_LCD_FILTER_LEGACY: - case FT_LCD_FILTER_LEGACY1: - library->lcd_filter_func = _ft_lcd_filter_legacy; - break; - -#endif - default: return FT_THROW( Invalid_Argument ); } diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c b/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c index cced4fed06b..323dd5efac2 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c @@ -524,12 +524,28 @@ bitmap->rows = (unsigned int)height; bitmap->pitch = pitch; - if ( pbox.xMin < -0x8000 || pbox.xMax > 0x7FFF || - pbox.yMin < -0x8000 || pbox.yMax > 0x7FFF ) + /* Flag the bounding box size unsuitable for rendering. */ + /* FT_Renderer modules should check the return value. */ + /* The limit is based on the ppem value when available. */ { - FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n", - pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax )); - return 1; + FT_Face face = slot->face; + FT_Pos xlim = 0x8000; + FT_Pos ylim = 0x8000; + + + if ( face ) + { + xlim = FT_MIN( xlim, 10 * face->size->metrics.x_ppem ); + ylim = FT_MIN( ylim, 10 * face->size->metrics.y_ppem ); + } + + if ( pbox.xMin < -xlim || pbox.xMax >= xlim || + pbox.yMin < -ylim || pbox.yMax >= ylim ) + { + FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n", + pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax )); + return 1; + } } return 0; @@ -549,8 +565,7 @@ FT_BASE_DEF( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot ) { FT_Memory memory = FT_FACE_MEMORY( slot->face ); FT_Error error; @@ -561,7 +576,10 @@ else slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - FT_MEM_ALLOC( slot->bitmap.buffer, size ); + /* dimensions must be preset */ + FT_MEM_ALLOC_MULT( slot->bitmap.buffer, + slot->bitmap.rows, + slot->bitmap.pitch ); return error; } @@ -1413,7 +1431,10 @@ if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_FULL_UNICODE && + FT_Get_CMap_Format( cur[0] ) == 13 ) ) { face->charmap = cur[0]; return FT_Err_Ok; @@ -2798,11 +2819,6 @@ internal->refcount = 1; internal->no_stem_darkening = -1; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - /* Per-face filtering can only be set up by FT_Face_Properties */ - internal->lcd_filter_func = NULL; -#endif } if ( aface ) @@ -4032,18 +4048,8 @@ } else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS ) { -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - if ( properties->data ) - { - ft_memcpy( face->internal->lcd_weights, - properties->data, - FT_LCD_FILTER_FIVE_TAPS ); - face->internal->lcd_filter_func = ft_lcd_filter_fir; - } -#else error = FT_THROW( Unimplemented_Feature ); goto Exit; -#endif } else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED ) { diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftutil.c b/src/java.desktop/share/native/libfreetype/src/base/ftutil.c index 0b7382627c5..f83c4394893 100644 --- a/src/java.desktop/share/native/libfreetype/src/base/ftutil.c +++ b/src/java.desktop/share/native/libfreetype/src/base/ftutil.c @@ -424,11 +424,10 @@ while ( cur ) { FT_ListNode next = cur->next; - void* data = cur->data; if ( destroy ) - destroy( memory, data, user ); + destroy( memory, cur->data, user ); FT_FREE( cur ); cur = next; diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c index 0079ddd1950..44ff44aecbd 100644 --- a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c +++ b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c @@ -456,8 +456,8 @@ dict->weight ); font_info->italic_angle = dict->italic_angle; font_info->is_fixed_pitch = dict->is_fixed_pitch; - font_info->underline_position = (FT_Short)dict->underline_position; - font_info->underline_thickness = (FT_UShort)dict->underline_thickness; + font_info->underline_position = dict->underline_position; + font_info->underline_thickness = dict->underline_thickness; cff->font_info = font_info; } diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffload.c b/src/java.desktop/share/native/libfreetype/src/cff/cffload.c index 326f885056f..39d662eb434 100644 --- a/src/java.desktop/share/native/libfreetype/src/cff/cffload.c +++ b/src/java.desktop/share/native/libfreetype/src/cff/cffload.c @@ -2014,8 +2014,8 @@ /* set defaults */ FT_ZERO( top ); - top->underline_position = -( 100L << 16 ); - top->underline_thickness = 50L << 16; + top->underline_position = -100; + top->underline_thickness = 50; top->charstring_type = 2; top->font_matrix.xx = 0x10000L; top->font_matrix.yy = 0x10000L; diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c index 1aeb908f4a1..9e00943a95d 100644 --- a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c +++ b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c @@ -846,10 +846,8 @@ cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); - cffface->underline_position = - (FT_Short)( dict->underline_position >> 16 ); - cffface->underline_thickness = - (FT_Short)( dict->underline_thickness >> 16 ); + cffface->underline_position = (FT_Short)dict->underline_position; + cffface->underline_thickness = (FT_Short)dict->underline_thickness; /* retrieve font family & style name */ if ( dict->family_name ) diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h b/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h index cc5aaa2867a..a7ee1cb3fe7 100644 --- a/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h +++ b/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h @@ -30,8 +30,8 @@ CFF_FIELD_STRING ( 4, weight, "Weight" ) CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" ) CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" ) - CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" ) - CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" ) + CFF_FIELD_NUM ( 0x103, underline_position, "UnderlinePosition" ) + CFF_FIELD_NUM ( 0x104, underline_thickness, "UnderlineThickness" ) CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" ) CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" ) CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h b/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h index 25ba74fed94..d40ebfab86d 100644 --- a/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h +++ b/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h @@ -47,7 +47,7 @@ T1_FIELD_STRING( "FullName", full_name, 0 ) T1_FIELD_STRING( "FamilyName", family_name, 0 ) T1_FIELD_STRING( "Weight", weight, 0 ) - T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_FIXED ( "ItalicAngle", italic_angle, 0 ) T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c index ca30702321d..e053dba17b2 100644 --- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c +++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c @@ -35,10 +35,6 @@ #endif -#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ - /* and similar glyphs */ - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -920,117 +916,6 @@ #define psh_corner_orientation ft_corner_orientation -#ifdef COMPUTE_INFLEXS - - /* compute all inflex points in a given glyph */ - static void - psh_glyph_compute_inflections( PSH_Glyph glyph ) - { - FT_UInt n; - - - for ( n = 0; n < glyph->num_contours; n++ ) - { - PSH_Point first, start, end, before, after; - FT_Pos in_x, in_y, out_x, out_y; - FT_Int orient_prev, orient_cur; - FT_Int finished = 0; - - - /* we need at least 4 points to create an inflection point */ - if ( glyph->contours[n].count < 4 ) - continue; - - /* compute first segment in contour */ - first = glyph->contours[n].start; - - start = end = first; - do - { - end = end->next; - if ( end == first ) - goto Skip; - - in_x = end->org_u - start->org_u; - in_y = end->org_v - start->org_v; - - } while ( in_x == 0 && in_y == 0 ); - - /* extend the segment start whenever possible */ - before = start; - do - { - do - { - start = before; - before = before->prev; - if ( before == first ) - goto Skip; - - out_x = start->org_u - before->org_u; - out_y = start->org_v - before->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_prev == 0 ); - - first = start; - in_x = out_x; - in_y = out_y; - - /* now, process all segments in the contour */ - do - { - /* first, extend current segment's end whenever possible */ - after = end; - do - { - do - { - end = after; - after = after->next; - if ( after == first ) - finished = 1; - - out_x = after->org_u - end->org_u; - out_y = after->org_v - end->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_cur == 0 ); - - if ( ( orient_cur ^ orient_prev ) < 0 ) - { - do - { - psh_point_set_inflex( start ); - start = start->next; - } - while ( start != end ); - - psh_point_set_inflex( start ); - } - - start = end; - end = after; - orient_prev = orient_cur; - in_x = out_x; - in_y = out_y; - - } while ( !finished ); - - Skip: - ; - } - } - -#endif /* COMPUTE_INFLEXS */ - - static void psh_glyph_done( PSH_Glyph glyph ) { @@ -1258,11 +1143,6 @@ glyph->outline = outline; glyph->globals = globals; -#ifdef COMPUTE_INFLEXS - psh_glyph_load_points( glyph, 0 ); - psh_glyph_compute_inflections( glyph ); -#endif /* COMPUTE_INFLEXS */ - /* now deal with hints tables */ error = psh_hint_table_init( &glyph->hint_tables [0], &ps_hints->dimension[0].hints, @@ -1285,122 +1165,47 @@ } - /* compute all extrema in a glyph for a given dimension */ + /* compute all extreme and inflection points */ + /* in a glyph for a given dimension */ static void psh_glyph_compute_extrema( PSH_Glyph glyph ) { FT_UInt n; - /* first of all, compute all local extrema */ for ( n = 0; n < glyph->num_contours; n++ ) { - PSH_Point first = glyph->contours[n].start; - PSH_Point point, before, after; + PSH_Point first, point, before, after; - if ( glyph->contours[n].count == 0 ) + /* we need at least 3 points to create an extremum */ + if ( glyph->contours[n].count < 3 ) continue; - point = first; - before = point; + first = glyph->contours[n].start; + point = first->prev; + after = first; do { - before = before->prev; - if ( before == first ) - goto Skip; - - } while ( before->org_u == point->org_u ); - - first = point = before->next; - - for (;;) - { - after = point; - do - { - after = after->next; - if ( after == first ) - goto Next; - - } while ( after->org_u == point->org_u ); - - if ( before->org_u < point->org_u ) - { - if ( after->org_u < point->org_u ) - { - /* local maximum */ - goto Extremum; - } - } - else /* before->org_u > point->org_u */ - { - if ( after->org_u > point->org_u ) - { - /* local minimum */ - Extremum: - do - { - psh_point_set_extremum( point ); - point = point->next; - - } while ( point != after ); - } - } - - before = after->prev; + before = point; point = after; + after = point->next; - } /* for */ + if ( ( before->org_u < point->org_u && point->org_u < after->org_u ) || + ( before->org_u > point->org_u && point->org_u > after->org_u ) ) + continue; - Next: - ; - } + /* otherwise this is either extremum or inflection point */ + psh_point_set_extremum( point ); - /* for each extremum, determine its direction along the */ - /* orthogonal axis */ - for ( n = 0; n < glyph->num_points; n++ ) - { - PSH_Point point, before, after; + /* also note its direction */ + if ( before->org_v < after->org_v ) + psh_point_set_positive( point ); + else if ( before->org_v > after->org_v ) + psh_point_set_negative( point ); - - point = &glyph->points[n]; - before = point; - after = point; - - if ( psh_point_is_extremum( point ) ) - { - do - { - before = before->prev; - if ( before == point ) - goto Skip; - - } while ( before->org_v == point->org_v ); - - do - { - after = after->next; - if ( after == point ) - goto Skip; - - } while ( after->org_v == point->org_v ); - } - - if ( before->org_v < point->org_v && - after->org_v > point->org_v ) - { - psh_point_set_positive( point ); - } - else if ( before->org_v > point->org_v && - after->org_v < point->org_v ) - { - psh_point_set_negative( point ); - } - - Skip: - ; + } while ( after != first ); } } @@ -1836,8 +1641,7 @@ point->dir_in != point->dir_out ) continue; - if ( !psh_point_is_extremum( point ) && - !psh_point_is_inflex( point ) ) + if ( !psh_point_is_extremum( point ) ) continue; point->flags &= ~PSH_POINT_SMOOTH; diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c index 521a5ff6c5c..a772b66f309 100644 --- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c +++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c @@ -376,36 +376,24 @@ /* not. We simply need to compare the vertical scale */ /* parameter to the raw bluescale value. Here is why: */ /* */ - /* We need to suppress overshoots for all pointsizes. */ - /* At 300dpi that satisfies: */ + /* The specs explain how the bluescale is calculated */ + /* from the desired maximum rounded pointsize at 300 dpi */ + /* and assuming upem of 1000. */ /* */ - /* pointsize < 240*bluescale + 0.49 */ + /* bluescale = ( pointsize - 0.49 ) / 240 */ /* */ - /* This corresponds to: */ + /* For unrounded pointsize in general terms */ /* */ - /* pixelsize < 1000*bluescale + 49/24 */ + /* bluescale = ( pointsize * dpi / 72 ) / upem */ /* */ - /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* which is */ /* */ - /* However, for normal Type 1 fonts, EM_Size is 1000! */ - /* We thus only check: */ + /* bluescale = pixelsize / upem */ /* */ - /* scale < bluescale + 49/24000 */ + /* Therefore, the bluescale value can be used directly */ + /* as a scale limit, now that it is in comparable units */ /* */ - /* which we shorten to */ - /* */ - /* "scale < bluescale" */ - /* */ - /* Note that `blue_scale' is stored 1000 times its real */ - /* value, and that `scale' converts from font units to */ - /* fractional pixels. */ - /* */ - - /* 1000 / 64 = 125 / 8 */ - if ( scale >= 0x20C49BAL ) - blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); - else - blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale ); /* */ /* The blue threshold is the font units distance under */ @@ -420,8 +408,8 @@ FT_Int threshold = blues->blue_shift; - while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) - threshold--; + if ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold = 32 * 0x10000L / scale; blues->blue_threshold = threshold; } @@ -708,7 +696,6 @@ /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */ { - FT_Fixed max_scale; FT_Short max_height = 1; @@ -725,11 +712,12 @@ priv->family_other_blues, max_height ); - /* BlueScale is scaled 1000 times */ - max_scale = FT_DivFix( 1000, max_height ); - globals->blues.blue_scale = priv->blue_scale < max_scale - ? priv->blue_scale - : max_scale; + /* restrict BlueScale value that is amplified 1000-fold and */ + /* rescale it to be comparable to the metrics scale */ + if ( FT_MulFix( max_height, priv->blue_scale ) < 1000 ) + globals->blues.blue_scale = priv->blue_scale * 8 / 125; + else + globals->blues.blue_scale = 64 * 0x10000L / max_height; } globals->blues.blue_shift = priv->blue_shift; diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c index 9df75dc3acc..24fb3455598 100644 --- a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c +++ b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c @@ -420,10 +420,7 @@ if ( populate_map_and_metrics ) { /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ - FT_ULong size = map->rows * (FT_ULong)map->pitch; - - - error = ft_glyphslot_alloc_bitmap( slot, size ); + error = ft_glyphslot_alloc_bitmap( slot ); if ( error ) goto DestroyExit; } diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c index ec78247aa56..32291e23e36 100644 --- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c +++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c @@ -1142,12 +1142,7 @@ FT_Error error; - /* XXX: I don't know whether this is correct, since - * tt_face_find_bdf_prop only returns something correct if we have - * previously selected a size that is listed in the BDF table. - * Should we change the BDF table format to include single offsets - * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? - */ + /* We expect that a bitmap strike has been selected. */ error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); if ( !error ) { diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c index 5acbbaa2a77..41c233597b8 100644 --- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c +++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c @@ -1043,7 +1043,6 @@ FT_ULong total_n_points = 0; FT_UShort n_points_contour; FT_UInt j; - FT_ULong flag_size; FT_ULong triplet_size; FT_ULong triplet_bytes_used; FT_Bool have_overlap = FALSE; @@ -1088,8 +1087,8 @@ } substreams[N_POINTS_STREAM].offset = FT_STREAM_POS(); - flag_size = total_n_points; - if ( flag_size > substreams[FLAG_STREAM].size ) + points_size += total_n_points; + if ( points_size > substreams[FLAG_STREAM].size ) goto Fail; flags_buf = stream->base + substreams[FLAG_STREAM].offset; @@ -1106,8 +1105,7 @@ triplet_bytes_used = 0; /* Create array to store point information. */ - points_size = total_n_points; - if ( FT_QNEW_ARRAY( points, points_size ) ) + if ( FT_QNEW_ARRAY( points, total_n_points ) ) goto Fail; if ( triplet_decode( flags_buf, @@ -1118,7 +1116,7 @@ &triplet_bytes_used ) ) goto Fail; - substreams[FLAG_STREAM].offset += flag_size; + substreams[FLAG_STREAM].offset += total_n_points; substreams[GLYPH_STREAM].offset += triplet_bytes_used; if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) || diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c index ad9ad6f2710..7929b7aaf4c 100644 --- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c +++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c @@ -1749,7 +1749,6 @@ FT_UInt x, y; FT_Byte b, g, r, alpha; - FT_ULong size; FT_Byte* src; FT_Byte* dst; @@ -1767,13 +1766,9 @@ dstSlot->bitmap.pitch = (int)dstSlot->bitmap.width * 4; dstSlot->bitmap.num_grays = 256; - size = dstSlot->bitmap.rows * (unsigned int)dstSlot->bitmap.pitch; - - error = ft_glyphslot_alloc_bitmap( dstSlot, size ); + error = ft_glyphslot_alloc_bitmap( dstSlot ); if ( error ) return error; - - FT_MEM_ZERO( dstSlot->bitmap.buffer, size ); } else { @@ -1805,8 +1800,7 @@ FT_Byte* q; - size = rows * pitch; - if ( FT_ALLOC( buf, size ) ) + if ( FT_ALLOC_MULT( buf, rows, pitch ) ) return error; p = dstSlot->bitmap.buffer; diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c index 9f9013bf39b..34e45619817 100644 --- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c +++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c @@ -547,7 +547,6 @@ FT_Error error = FT_Err_Ok; FT_UInt width, height; FT_Bitmap* map = decoder->bitmap; - FT_ULong size; if ( !decoder->metrics_loaded ) @@ -599,17 +598,11 @@ goto Exit; } - size = map->rows * (FT_ULong)map->pitch; - - /* check that there is no empty image */ - if ( size == 0 ) - goto Exit; /* exit successfully! */ - if ( metrics_only ) goto Exit; /* only metrics are requested */ - error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); - if ( error ) + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph ); + if ( error || !map->buffer ) goto Exit; decoder->bitmap_allocated = 1; diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c index 365fbad42ad..3c387aea0ac 100644 --- a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c +++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c @@ -1804,7 +1804,7 @@ typedef ptrdiff_t FT_PtrDist; FT_FILL_RULE( coverage, cover, fill ); span[n].coverage = (unsigned char)coverage; - span[n].x = (short)x; + span[n].x = (unsigned short)x; span[n].len = (unsigned short)( cell->x - x ); if ( ++n == FT_MAX_GRAY_SPANS ) @@ -1823,7 +1823,7 @@ typedef ptrdiff_t FT_PtrDist; FT_FILL_RULE( coverage, area, fill ); span[n].coverage = (unsigned char)coverage; - span[n].x = (short)cell->x; + span[n].x = (unsigned short)cell->x; span[n].len = 1; if ( ++n == FT_MAX_GRAY_SPANS ) diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c index 21a6eca00ba..5a7a852a619 100644 --- a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c +++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c @@ -80,6 +80,7 @@ { unsigned char* origin; /* pixmap origin at the bottom-left */ int pitch; /* pitch to go down one row */ + unsigned char wght[5]; /* filtering weights */ } TOrigin; @@ -274,6 +275,32 @@ } + /* This function applies a horizontal filter in direct rendering mode */ + static void + ft_smooth_lcd_spans( int y, + int count, + const FT_Span* spans, + void* target_ ) /* TOrigin* */ + { + TOrigin* target = (TOrigin*)target_; + + unsigned char* dst_line = target->origin - y * target->pitch - 2; + unsigned char* dst; + unsigned short w; + + + for ( ; count--; spans++ ) + for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ ) + { + dst[0] += ( spans->coverage * target->wght[0] + 85 ) >> 8; + dst[1] += ( spans->coverage * target->wght[1] + 85 ) >> 8; + dst[2] += ( spans->coverage * target->wght[2] + 85 ) >> 8; + dst[3] += ( spans->coverage * target->wght[3] + 85 ) >> 8; + dst[4] += ( spans->coverage * target->wght[4] + 85 ) >> 8; + } + } + + static FT_Error ft_smooth_raster_lcd( FT_Renderer render, FT_Outline* outline, @@ -285,11 +312,47 @@ FT_Vector* vec; FT_Raster_Params params; + TOrigin target; - params.target = bitmap; - params.source = outline; - params.flags = FT_RASTER_FLAG_AA; + if ( render->root.library->lcd_weights[2] ) + { + /* Reject outlines that are too wide for 16-bit FT_Span. */ + /* Other limits are applied upstream with the same error code. */ + if ( bitmap->width > 0x7FFF ) + return FT_THROW( Raster_Overflow ); + + /* Set up direct rendering for instant filtering. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = ft_smooth_lcd_spans; + params.user = ⌖ + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width; + params.clip_box.yMax = bitmap->rows; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + target.wght[0] = render->root.library->lcd_weights[0]; + target.wght[1] = render->root.library->lcd_weights[1]; + target.wght[2] = render->root.library->lcd_weights[2]; + target.wght[3] = render->root.library->lcd_weights[3]; + target.wght[4] = render->root.library->lcd_weights[4]; + } + else + { + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + } /* implode outline */ for ( vec = points; vec < points_end; vec++ ) @@ -306,6 +369,32 @@ } + /* This function applies a vertical filter in direct rendering mode */ + static void + ft_smooth_lcdv_spans( int y, + int count, + const FT_Span* spans, + void* target_ ) /* TOrigin* */ + { + TOrigin* target = (TOrigin*)target_; + + int pitch = target->pitch; + unsigned char* dst_line = target->origin - ( y + 2 ) * pitch; + unsigned char* dst; + unsigned short w; + + + for ( ; count--; spans++ ) + for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ ) + { + dst[ 0] += ( spans->coverage * target->wght[0] + 85 ) >> 8; + dst[ pitch] += ( spans->coverage * target->wght[1] + 85 ) >> 8; + dst[2 * pitch] += ( spans->coverage * target->wght[2] + 85 ) >> 8; + dst[3 * pitch] += ( spans->coverage * target->wght[3] + 85 ) >> 8; + dst[4 * pitch] += ( spans->coverage * target->wght[4] + 85 ) >> 8; + } + } + static FT_Error ft_smooth_raster_lcdv( FT_Renderer render, FT_Outline* outline, @@ -317,11 +406,42 @@ FT_Vector* vec; FT_Raster_Params params; + TOrigin target; - params.target = bitmap; - params.source = outline; - params.flags = FT_RASTER_FLAG_AA; + if ( render->root.library->lcd_weights[2] ) + { + /* Set up direct rendering for instant filtering. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = ft_smooth_lcdv_spans; + params.user = ⌖ + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width; + params.clip_box.yMax = bitmap->rows; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + target.wght[0] = render->root.library->lcd_weights[0]; + target.wght[1] = render->root.library->lcd_weights[1]; + target.wght[2] = render->root.library->lcd_weights[2]; + target.wght[3] = render->root.library->lcd_weights[3]; + target.wght[4] = render->root.library->lcd_weights[4]; + } + else + { + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + } /* implode outline */ for ( vec = points; vec < points_end; vec++ ) @@ -494,12 +614,6 @@ else y_shift += 64 * (FT_Int)bitmap->rows; - if ( origin ) - { - x_shift += origin->x; - y_shift += origin->y; - } - /* translate outline to render it into the bitmap */ if ( x_shift || y_shift ) FT_Outline_Translate( outline, x_shift, y_shift ); @@ -527,33 +641,6 @@ error = ft_smooth_raster_lcd ( render, outline, bitmap ); else if ( mode == FT_RENDER_MODE_LCD_V ) error = ft_smooth_raster_lcdv( render, outline, bitmap ); - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - /* finally apply filtering */ - { - FT_Byte* lcd_weights; - FT_Bitmap_LcdFilterFunc lcd_filter_func; - - - /* Per-face LCD filtering takes priority if set up. */ - if ( slot->face && slot->face->internal->lcd_filter_func ) - { - lcd_weights = slot->face->internal->lcd_weights; - lcd_filter_func = slot->face->internal->lcd_filter_func; - } - else - { - lcd_weights = slot->library->lcd_weights; - lcd_filter_func = slot->library->lcd_filter_func; - } - - if ( lcd_filter_func ) - lcd_filter_func( bitmap, lcd_weights ); - } - -#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - } Exit: diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c index e810ebfd550..4dd68ab1019 100644 --- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c +++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c @@ -2217,6 +2217,10 @@ exec = size->context; #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* reset backward compatibility; note that */ + /* the CVT program always runs without it */ + exec->backward_compatibility = 0; + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { grayscale = FALSE; @@ -2253,9 +2257,7 @@ return error; } - error = TT_Load_Context( exec, face, size ); - if ( error ) - return error; + TT_Load_Context( exec, face, size ); /* check whether the cvt program has disabled hinting */ if ( size->GS.instruct_control & 1 ) @@ -2283,8 +2285,7 @@ mode != FT_RENDER_MODE_MONO && !FT_IS_TRICKY( glyph->face ) ) exec->backward_compatibility = ( size->GS.instruct_control & 4 ) ^ 4; - else - exec->backward_compatibility = 0; + #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ loader->exec = exec; diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c index 0732fcbae36..f8842795f14 100644 --- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c +++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c @@ -697,11 +697,9 @@ if ( long_words ) per_region_size *= 2; - if ( FT_NEW_ARRAY( varData->deltaSet, per_region_size * item_count ) ) + if ( FT_QALLOC_MULT( varData->deltaSet, item_count, per_region_size ) ) goto Exit; - if ( FT_Stream_Read( stream, - varData->deltaSet, - per_region_size * item_count ) ) + if ( FT_STREAM_READ( varData->deltaSet, item_count * per_region_size ) ) { FT_TRACE2(( "deltaSet read failed." )); error = FT_THROW( Invalid_Table ); diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c index 7b26c9a9df2..f46cc77fe5f 100644 --- a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c +++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c @@ -272,7 +272,7 @@ * * Note that not all members of `TT_ExecContext` get initialized. */ - FT_LOCAL_DEF( FT_Error ) + FT_LOCAL_DEF( void ) TT_Load_Context( TT_ExecContext exec, TT_Face face, TT_Size size ) @@ -284,7 +284,7 @@ exec->size = size; /* CVT and storage are not persistent in FreeType */ - /* reset them after they might have been modifief */ + /* reset them after they might have been modified */ exec->storage = exec->stack + exec->stackSize; exec->cvt = exec->storage + exec->storeSize; @@ -297,8 +297,6 @@ exec->metrics = *size->metrics; exec->twilight = size->twilight; - - return FT_Err_Ok; } @@ -5457,11 +5455,11 @@ /* single width cut-in test */ /* |org_dist - single_width_value| < single_width_cutin */ - if ( exc->GS.single_width_cutin > 0 && - org_dist < exc->GS.single_width_value + - exc->GS.single_width_cutin && - org_dist > exc->GS.single_width_value - - exc->GS.single_width_cutin ) + if ( exc->GS.single_width_cutin > 0 && + org_dist < ADD_LONG( exc->GS.single_width_value, + exc->GS.single_width_cutin ) && + org_dist > SUB_LONG( exc->GS.single_width_value, + exc->GS.single_width_cutin ) ) { if ( org_dist >= 0 ) org_dist = exc->GS.single_width_value; diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h index 2e69d191890..5cdc8f59f1a 100644 --- a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h +++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h @@ -439,7 +439,7 @@ FT_BEGIN_HEADER FT_LOCAL( void ) TT_Done_Context( TT_ExecContext exec ); - FT_LOCAL( FT_Error ) + FT_LOCAL( void ) TT_Load_Context( TT_ExecContext exec, TT_Face face, TT_Size size ); diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c index fd0c0ad14f6..2aedbd842c1 100644 --- a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c +++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c @@ -884,9 +884,7 @@ FT_Error error; - error = TT_Load_Context( exec, face, size ); - if ( error ) - return error; + TT_Load_Context( exec, face, size ); /* disable CVT and glyph programs coderange */ TT_Clear_CodeRange( exec, tt_coderange_cvt ); @@ -952,9 +950,7 @@ FT_ARRAY_ZERO( size->twilight.org, size->twilight.n_points ); FT_ARRAY_ZERO( size->twilight.cur, size->twilight.n_points ); - error = TT_Load_Context( exec, face, size ); - if ( error ) - return error; + TT_Load_Context( exec, face, size ); /* clear storage area */ FT_ARRAY_ZERO( exec->storage, exec->storeSize ); @@ -1043,13 +1039,15 @@ if ( !exec ) return FT_THROW( Could_Not_Find_Context ); + size->context = exec; + exec->pedantic_hinting = pedantic; exec->maxFDefs = maxp->maxFunctionDefs; exec->maxIDefs = maxp->maxInstructionDefs; if ( FT_NEW_ARRAY( exec->FDefs, exec->maxFDefs + exec->maxIDefs ) ) - goto Exit; + goto Fail; exec->IDefs = exec->FDefs + exec->maxFDefs; @@ -1068,7 +1066,7 @@ if ( FT_NEW_ARRAY( exec->stack, exec->stackSize + (FT_Long)( exec->storeSize + exec->cvtSize ) ) ) - goto Exit; + goto Fail; /* reserve twilight zone and set GS before fpgm is executed, */ /* just in case, even though fpgm should not touch them */ @@ -1079,11 +1077,10 @@ error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); if ( error ) - goto Exit; + goto Fail; size->GS = tt_default_graphics_state; size->cvt_ready = -1; - size->context = exec; size->ttmetrics.rotated = FALSE; size->ttmetrics.stretched = FALSE; @@ -1099,10 +1096,8 @@ error = tt_size_run_fpgm( size ); return error; - Exit: - if ( error ) - tt_size_done_bytecode( size ); - + Fail: + tt_size_done_bytecode( size ); return error; } diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h b/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h index c3736cd42c0..a526406a411 100644 --- a/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h +++ b/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h @@ -33,7 +33,7 @@ T1_FIELD_DICT_FONTDICT ) /* we use pointers to detect modifications made by synthetic fonts */ - T1_FIELD_NUM ( "ItalicAngle", italic_angle, + T1_FIELD_FIXED ( "ItalicAngle", italic_angle, T1_FIELD_DICT_FONTDICT ) T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, T1_FIELD_DICT_FONTDICT ) diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c index 2e035d12453..26686e59b0b 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -286,13 +286,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -325,6 +326,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -357,6 +362,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -389,6 +398,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -536,15 +548,14 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, sp = sl; dp = dl; - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - if (kw == 7) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -583,6 +594,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -618,6 +635,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -653,6 +676,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -688,6 +715,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = buff[0]; p3 = buff[1]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -723,6 +754,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else /*if (kw == 2)*/ { + p2 = buff[0]; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -756,6 +791,8 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } } + + pk += kw; } } @@ -882,17 +919,16 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, if (kw > MAX_KER) kw = kw/2; off += kw; - p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; - p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - - sp += (kw - 1)*chan1; - if (kw == 7) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -927,6 +963,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -961,6 +1005,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -995,6 +1047,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -1029,6 +1087,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = sp[0]; p3 = sp[chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -1063,6 +1127,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 2) { + p2 = sp[0]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -1097,6 +1167,10 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else /*if (kw == 1)*/ { + k0 = pk[0]; + + sp += (kw - 1)*chan1; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = sp[0]; @@ -1127,6 +1201,8 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } } } + + pk += kw; } } diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c index bb264d9dcd2..b2ee9742213 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -158,13 +158,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -195,6 +196,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -225,6 +230,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -255,6 +264,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -400,15 +412,14 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, sp = sl; dp = dl; - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - if (kw == 7) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -444,6 +455,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -479,6 +496,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -514,6 +537,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -549,6 +576,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = buff[0]; p3 = buff[1]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -584,6 +615,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else { /* kw == 2 */ + p2 = buff[0]; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -617,6 +652,8 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } } + + pk += kw; } } diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c index c144404b0f4..ce7cac00f72 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -287,13 +287,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -326,6 +327,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -358,6 +363,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -390,6 +399,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -537,15 +549,14 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, sp = sl; dp = dl; - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - if (kw == 7) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -584,6 +595,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -619,6 +636,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -654,6 +677,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -689,6 +716,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = buff[0]; p3 = buff[1]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -724,6 +755,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else /*if (kw == 2)*/ { + p2 = buff[0]; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -757,6 +792,8 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } } + + pk += kw; } } @@ -883,17 +920,16 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, if (kw > MAX_KER) kw = kw/2; off += kw; - p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; - p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - - sp += (kw - 1)*chan1; - if (kw == 7) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -928,6 +964,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -962,6 +1006,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -996,6 +1048,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -1030,6 +1088,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = sp[0]; p3 = sp[chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -1064,6 +1128,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 2) { + p2 = sp[0]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -1098,6 +1168,10 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else /*if (kw == 1)*/ { + k0 = pk[0]; + + sp += (kw - 1)*chan1; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = sp[0]; @@ -1128,6 +1202,8 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } } } + + pk += kw; } } diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c index 54e11c64a49..389c1b52c1e 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -150,13 +150,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -184,6 +185,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -211,6 +216,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -238,6 +247,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -322,17 +334,16 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, if (kw > 2*MAX_KER) kw = MAX_KER; else if (kw > MAX_KER) kw = kw/2; - p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; - sp0 += chan3; - p5 = sp0[0]; p6 = sp0[chan1]; p7 = sp0[chan2]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - dp = dl; if (kw == 7) { + + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; p6 = sp0[chan1]; p7 = sp0[chan2]; sp = sp0 += chan3; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -362,7 +373,13 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 6) { + + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; p6 = sp0[chan1]; sp = sp0 += chan2; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -392,7 +409,13 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 5) { + + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; sp = sp0 += chan1; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -423,7 +446,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; sp = sp0; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -453,7 +479,11 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 3) { + + p2 = sp0[0]; p3 = sp0[chan1]; + sp0 += chan3; sp = sp0 -= chan1; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -483,7 +513,11 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else { /* kw == 2 */ + + p2 = sp0[0]; + sp0 += chan3; sp = sp0 -= chan2; + k0 = pk[0]; k1 = pk[1]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c index e87607ddf12..e6c68de5054 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -150,13 +150,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -184,6 +185,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -211,6 +216,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -238,6 +247,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -322,17 +334,15 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, if (kw > 2*MAX_KER) kw = MAX_KER; else if (kw > MAX_KER) kw = kw/2; - p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; - sp0 += chan3; - p5 = sp0[0]; p6 = sp0[chan1]; p7 = sp0[chan2]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - dp = dl; if (kw == 7) { + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; p6 = sp0[chan1]; p7 = sp0[chan2]; sp = sp0 += chan3; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -362,7 +372,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 6) { + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; p6 = sp0[chan1]; sp = sp0 += chan2; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -392,7 +407,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 5) { + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; + p5 = sp0[0]; sp = sp0 += chan1; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -423,7 +443,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = sp0[0]; p3 = sp0[chan1]; p4 = sp0[chan2]; + sp0 += chan3; sp = sp0; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -453,7 +476,11 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else if (kw == 3) { + + p2 = sp0[0]; p3 = sp0[chan1]; + sp0 += chan3; sp = sp0 -= chan1; + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { @@ -483,7 +510,11 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } else { /* kw == 2 */ + + p2 = sp0[0]; + sp0 += chan3; sp = sp0 -= chan2; + k0 = pk[0]; k1 = pk[1]; if (pk == k) { for (i = 0; i <= (wid - 2); i += 2) { diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c index 49412c7d7ef..438531e2c07 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -286,13 +286,14 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, pk = k + off; sp = sl0; - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; - dp = dl; kh = n - off; if (kh == 4) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + p2 = sp[0]; p3 = sp[sll]; p4 = sp[2*sll]; + sp += 3*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -325,6 +326,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 3) { + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + p2 = sp[0]; p3 = sp[sll]; + sp += 2*sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -357,6 +362,10 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else if (kh == 2) { + + k0 = pk[0]; k1 = pk[1]; + p2 = sp[0]; + sp += sll; for (j = 0; j <= (hsize - 2); j += 2) { @@ -389,6 +398,9 @@ static mlib_status mlib_ImageConv1xN(mlib_image *dst, } } else /* if (kh == 1) */ { + + k0 = pk[0]; + for (j = 0; j < hsize; j++) { p0 = sp[0]; @@ -536,15 +548,14 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, sp = sl; dp = dl; - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - if (kw == 7) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -583,6 +594,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; p6 = buff[4]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -618,6 +635,12 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + p5 = buff[3]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -653,6 +676,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -688,6 +715,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = buff[0]; p3 = buff[1]; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -723,6 +754,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } else /*if (kw == 2)*/ { + p2 = buff[0]; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -756,6 +791,8 @@ mlib_status CONV_FUNC(MxN)(mlib_image *dst, } } } + + pk += kw; } } @@ -882,17 +919,16 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, if (kw > MAX_KER) kw = kw/2; off += kw; - p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; - p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; - - k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; - k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; - pk += kw; - - sp += (kw - 1)*chan1; - if (kw == 7) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; p7 = sp[5*chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; k6 = pk[6]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; @@ -927,6 +963,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 6) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; p6 = sp[chan2 + chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; k5 = pk[5]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; @@ -961,6 +1005,14 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 5) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + p5 = sp[chan2 + chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + k4 = pk[4]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; p3 = p5; @@ -995,6 +1047,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 4) { + p2 = sp[0]; p3 = sp[chan1]; p4 = sp[chan2]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; k3 = pk[3]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; p2 = p4; @@ -1029,6 +1087,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 3) { + p2 = sp[0]; p3 = sp[chan1]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; k2 = pk[2]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; p1 = p3; @@ -1063,6 +1127,12 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else if (kw == 2) { + p2 = sp[0]; + + sp += (kw - 1)*chan1; + + k0 = pk[0]; k1 = pk[1]; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = p2; @@ -1097,6 +1167,10 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } else /*if (kw == 1)*/ { + k0 = pk[0]; + + sp += (kw - 1)*chan1; + if (l < (n - 1) || off < m) { for (i = 0; i <= (wid - 2); i += 2) { p0 = sp[0]; @@ -1127,6 +1201,8 @@ mlib_status CONV_FUNC_I(MxN)(mlib_image *dst, } } } + + pk += kw; } } diff --git a/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConvVersion.c b/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConvVersion.c index 5f8768fb180..b7e685609c9 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConvVersion.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConvVersion.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -51,7 +51,7 @@ mlib_s32 mlib_ImageConvVersion(mlib_s32 m, mlib_s32 scale, mlib_type type) { - mlib_d64 dscale = 1.0 / (1 << scale); /* 16 < scale <= 31 */ + mlib_d64 dscale = 1.0 / (((mlib_s64)1) << scale); /* 16 < scale <= 31 */ if (type == MLIB_BYTE) { if ((m * n * dscale * 32768.0) > MAX_U8) diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java b/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java index 1da9db3a35b..b238921cb77 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java @@ -1734,7 +1734,9 @@ public final class WPrinterJob extends RasterPrinterJob attributes.add(new PageRanges(from, to)); setPageRange(from, to); } else { - attributes.remove(PageRanges.class); + // Sets default values for PageRange attribute and setPageRange + attributes.add(new PageRanges(1, + Integer.MAX_VALUE)); setPageRange(Pageable.UNKNOWN_NUMBER_OF_PAGES, Pageable.UNKNOWN_NUMBER_OF_PAGES); } diff --git a/src/jdk.compiler/share/classes/com/sun/source/util/DocTrees.java b/src/jdk.compiler/share/classes/com/sun/source/util/DocTrees.java index 45a452bd0dd..44d9bd89917 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/util/DocTrees.java +++ b/src/jdk.compiler/share/classes/com/sun/source/util/DocTrees.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -195,23 +195,30 @@ public abstract class DocTrees extends Trees { /** * Returns the language model element referred to by the leaf node of the given - * {@link DocTreePath}, or {@code null} if unknown. + * {@link DocTreePath}, or {@code null} if the leaf node of {@code path} does + * not refer to an element. + * * @param path the path for the tree node - * @return the element + * @return the referenced element, or null + * @see #getType(DocTreePath) */ public abstract Element getElement(DocTreePath path); /** * Returns the language model type referred to by the leaf node of the given - * {@link DocTreePath}, or {@code null} if unknown. This method usually - * returns the same value as {@code getElement(path).asType()} for a - * {@code path} argument for which {@link #getElement(DocTreePath)} returns - * a non-null value, but may return a type that includes additional - * information, such as a parameterized generic type instead of a raw type. + * {@link DocTreePath}, or {@code null} if the leaf node of {@code path} does + * not refer to a type. + * + *

    If {@link #getElement(DocTreePath)} returns a non-null value for a given {@code path} + * argument, this method usally returns the same value as {@code getElement(path).asType()}. + * However, there are cases where the returned type includes additional information, + * such as a parameterized generic type instead of a raw type. In other cases, such as with + * primitive or array types, the returned type may not have a corresponding element returned + * by {@code getElement(DocTreePath)}.

    * * @param path the path for the tree node * @return the referenced type, or null - * + * @see #getElement(DocTreePath) * @since 15 */ public abstract TypeMirror getType(DocTreePath path); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java index 6bc5d358b6f..ecd7f5b101a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -354,22 +354,28 @@ public class JavacTrees extends DocTrees { DocTree tree = path.getLeaf(); if (tree instanceof DCReference dcReference) { JCTree qexpr = dcReference.qualifierExpression; - if (qexpr != null) { + + // Forward references with explicit module name to getElement + if (qexpr != null && dcReference.moduleName == null) { + + Env env = getAttrContext(path.getTreePath()); Log.DeferredDiagnosticHandler deferredDiagnosticHandler = log.new DeferredDiagnosticHandler(); + JavaFileObject prevSource = log.useSource(env.toplevel.sourcefile); + try { - Env env = getAttrContext(path.getTreePath()); - JavaFileObject prevSource = log.useSource(env.toplevel.sourcefile); - try { - Type t = attr.attribType(dcReference.qualifierExpression, env); - if (t != null && !t.isErroneous()) { + Type t = attr.attribType(dcReference.qualifierExpression, env); + if (t != null && !t.isErroneous()) { + if (dcReference.memberName != null) { + Symbol sym = resolveMember(t, (Name) dcReference.memberName, dcReference, env); + return sym == null ? null : sym.type; + } else { return t; } - } finally { - log.useSource(prevSource); } } catch (Abort e) { // may be thrown by Check.completionError in case of bad class file return null; } finally { + log.useSource(prevSource); log.popDiagnosticHandler(deferredDiagnosticHandler); } } @@ -426,14 +432,12 @@ public class JavacTrees extends DocTrees { memberName = (Name) ref.memberName; } else { // Check if qualifierExpression is a type or package, using the methods javac provides. - // If no module name is given we check if qualifierExpression identifies a type. - // If that fails or we have a module name, use that to resolve qualifierExpression to - // a package or type. - Type t = ref.moduleName == null ? attr.attribType(ref.qualifierExpression, env) : null; + Type t = attr.attribType(ref.qualifierExpression, env); - if (t == null || t.isErroneous()) { - JCCompilationUnit toplevel = - treeMaker.TopLevel(List.nil()); + if (t == null || t.isErroneous() || + (ref.moduleName != null && !mdlsym.equals(elements.getModuleOf(t.asElement())))) { + + JCCompilationUnit toplevel = treeMaker.TopLevel(List.nil()); toplevel.modle = mdlsym; toplevel.packge = mdlsym.unnamedPackage; Symbol sym = attr.attribIdent(ref.qualifierExpression, toplevel); @@ -447,10 +451,6 @@ public class JavacTrees extends DocTrees { if ((sym.kind == PCK || sym.kind == TYP) && sym.exists()) { tsym = (TypeSymbol) sym; memberName = (Name) ref.memberName; - if (sym.kind == PCK && memberName != null) { - //cannot refer to a package "member" - return null; - } } else { if (modules.modulesInitialized() && ref.moduleName == null && ref.memberName == null) { // package/type does not exist, check if there is a matching module @@ -470,64 +470,22 @@ public class JavacTrees extends DocTrees { } } } else { - Type e = t; - // If this is an array type convert to element type - while (e instanceof ArrayType arrayType) - e = arrayType.elemtype; - tsym = e.tsym; + tsym = switch (t.getKind()) { + case DECLARED, TYPEVAR, PACKAGE, MODULE -> t.tsym; + default -> null; + }; memberName = (Name) ref.memberName; } } if (memberName == null) { return tsym; - } else if (tsym == null || tsym.getKind() == ElementKind.PACKAGE || tsym.getKind() == ElementKind.MODULE) { - return null; // Non-null member name in non-class context - } - - if (tsym.type.isPrimitive()) { + } else if (tsym == null) { return null; } - final List paramTypes; - if (ref.paramTypes == null) - paramTypes = null; - else { - ListBuffer lb = new ListBuffer<>(); - for (List l = (List) ref.paramTypes; l.nonEmpty(); l = l.tail) { - JCTree tree = l.head; - Type t = attr.attribType(tree, env); - lb.add(t); - } - paramTypes = lb.toList(); - } + return resolveMember(tsym.type, memberName, ref, env); - ClassSymbol sym = (ClassSymbol) types.skipTypeVars(tsym.type, false).tsym; - boolean explicitType = ref.qualifierExpression != null; - Symbol msym = (memberName == sym.name) - ? findConstructor(sym, paramTypes, true) - : findMethod(sym, memberName, paramTypes, true, explicitType); - - if (msym == null) { - msym = (memberName == sym.name) - ? findConstructor(sym, paramTypes, false) - : findMethod(sym, memberName, paramTypes, false, explicitType); - } - - if (paramTypes != null) { - // explicit (possibly empty) arg list given, so cannot be a field - return msym; - } - - VarSymbol vsym = (ref.paramTypes != null) ? null : findField(sym, memberName, explicitType); - // prefer a field over a method with no parameters - if (vsym != null && - (msym == null || - types.isSubtypeUnchecked(vsym.enclClass().asType(), msym.enclClass().asType()))) { - return vsym; - } else { - return msym; - } } catch (Abort e) { // may be thrown by Check.completionError in case of bad class file return null; } finally { @@ -536,6 +494,54 @@ public class JavacTrees extends DocTrees { } } + private Symbol resolveMember(Type type, Name memberName, DCReference ref, Env env) { + + if (type.isPrimitive() || type.getKind() == TypeKind.PACKAGE || type.getKind() == TypeKind.MODULE) { + return null; + } + + final List paramTypes; + if (ref.paramTypes == null) + paramTypes = null; + else { + ListBuffer lb = new ListBuffer<>(); + for (List l = (List) ref.paramTypes; l.nonEmpty(); l = l.tail) { + JCTree tree = l.head; + Type t = attr.attribType(tree, env); + lb.add(t); + } + paramTypes = lb.toList(); + } + + // skipTypeVars conversion below is needed if type is itself a type variable + ClassSymbol sym = (ClassSymbol) types.skipTypeVars(type, false).tsym; + boolean explicitType = ref.qualifierExpression != null; + Symbol msym = (memberName == sym.name) + ? findConstructor(sym, paramTypes, true) + : findMethod(sym, memberName, paramTypes, true, explicitType); + + if (msym == null) { + msym = (memberName == sym.name) + ? findConstructor(sym, paramTypes, false) + : findMethod(sym, memberName, paramTypes, false, explicitType); + } + + if (paramTypes != null) { + // explicit (possibly empty) arg list given, so cannot be a field + return msym; + } + + VarSymbol vsym = (ref.paramTypes != null) ? null : findField(sym, memberName, explicitType); + // prefer a field over a method with no parameters + if (vsym != null && + (msym == null || + types.isSubtypeUnchecked(vsym.enclClass().asType(), msym.enclClass().asType()))) { + return vsym; + } else { + return msym; + } + } + private Symbol attributeParamIdentifier(TreePath path, DCParam paramTag) { Symbol javadocSymbol = getElement(path); if (javadocSymbol == null) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java index 862c02ea5f0..1229939c0bf 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -29,7 +29,6 @@ package com.sun.tools.javac.comp; import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Attribute.TypeCompound; -import com.sun.tools.javac.code.Source.Feature; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.TypeVar; import com.sun.tools.javac.jvm.Target; @@ -49,8 +48,6 @@ import static com.sun.tools.javac.code.TypeTag.VOID; import static com.sun.tools.javac.comp.CompileStates.CompileState; import com.sun.tools.javac.tree.JCTree.JCBreak; -import javax.lang.model.type.TypeKind; - /** This pass translates Generic Java to conventional Java. * *

    This is NOT part of any supported API. @@ -109,7 +106,9 @@ public class TransTypes extends TreeTranslator { if (!types.isSameType(tree.type, target)) { if (!resolve.isAccessible(env, target.tsym)) resolve.logAccessErrorInternal(env, tree, target); - tree = make.TypeCast(make.Type(target), tree).setType(target); + tree = explicitCastTP != null && types.isSameType(target, explicitCastTP) ? + tree : + make.TypeCast(make.Type(target), tree).setType(target); } make.pos = oldpos; return tree; @@ -440,16 +439,29 @@ public class TransTypes extends TreeTranslator { /** Visitor argument: proto-type. */ private Type pt; + /** we use this type to indicate that "upstream" there is an explicit cast to this type, + * this way we can avoid generating redundant type casts. Redundant casts are not + * innocuous as they can trump user provided ones and affect the offset + * calculation of type annotations applied to the user provided type cast. + */ + private Type explicitCastTP; /** Visitor method: perform a type translation on tree. */ public T translate(T tree, Type pt) { + return translate(tree, pt, pt == explicitCastTP ? explicitCastTP : null); + } + + public T translate(T tree, Type pt, Type castTP) { Type prevPt = this.pt; + Type prevCastPT = this.explicitCastTP; try { this.pt = pt; + this.explicitCastTP = castTP; return translate(tree); } finally { this.pt = prevPt; + this.explicitCastTP = prevCastPT; } } @@ -1037,7 +1049,9 @@ public class TransTypes extends TreeTranslator { tree.clazz = translate(tree.clazz, null); Type originalTarget = tree.type; tree.type = erasure(tree.type); - JCExpression newExpression = translate(tree.expr, tree.type); + JCExpression newExpression = tree.clazz.hasTag(Tag.ANNOTATED_TYPE) ? + translate(tree.expr, tree.type, tree.type) : + translate(tree.expr, tree.type); if (newExpression != tree.expr) { JCTypeCast typeCast = newExpression.hasTag(Tag.TYPECAST) ? (JCTypeCast) newExpression diff --git a/src/jdk.httpserver/share/classes/sun/net/httpserver/ContextList.java b/src/jdk.httpserver/share/classes/sun/net/httpserver/ContextList.java index 6393ca34798..14a07b3a677 100644 --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ContextList.java +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ContextList.java @@ -186,38 +186,31 @@ class ContextList { */ PATH_PREFIX((contextPath, requestPath) -> { - // Fast-path for `/` - if ("/".equals(contextPath)) { + // Does the request path prefix match? + if (!requestPath.startsWith(contextPath)) { + return false; + } + + // Is it an exact match? + int contextPathLength = contextPath.length(); + if (requestPath.length() == contextPathLength) { return true; } - // Does the request path prefix match? - if (requestPath.startsWith(contextPath)) { - - // Is it an exact match? - int contextPathLength = contextPath.length(); - if (requestPath.length() == contextPathLength) { - return true; - } - - // Is it a path-prefix match? - assert contextPathLength > 0; - return - // Case 1: The request path starts with the context - // path, but the context path has an extra path - // separator suffix. For instance, the context path is - // `/foo/` and the request path is `/foo/bar`. - contextPath.charAt(contextPathLength - 1) == '/' || - // Case 2: The request path starts with the - // context path, but the request path has an - // extra path separator suffix. For instance, - // context path is `/foo` and the request path - // is `/foo/` or `/foo/bar`. - requestPath.charAt(contextPathLength) == '/'; - - } - - return false; + // Is it a path-prefix match? + assert contextPathLength > 0; + return + // Case 1: The request path starts with the context + // path, but the context path has an extra path + // separator suffix. For instance, the context path is + // `/foo/` and the request path is `/foo/bar`. + contextPath.charAt(contextPathLength - 1) == '/' || + // Case 2: The request path starts with the + // context path, but the request path has an + // extra path separator suffix. For instance, + // context path is `/foo` and the request path + // is `/foo/` or `/foo/bar`. + requestPath.charAt(contextPathLength) == '/'; }); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/CommentHelper.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/CommentHelper.java index 30aa86aea71..3d300b77073 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/CommentHelper.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/CommentHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -136,10 +136,7 @@ public class CommentHelper { return null; } DocTrees doctrees = configuration.docEnv.getDocTrees(); - // Workaround for JDK-8284193 - // DocTrees.getElement(DocTreePath) returns javac-internal Symbols - var e = doctrees.getElement(docTreePath); - return e == null || e.getKind() == ElementKind.CLASS && e.asType().getKind() != TypeKind.DECLARED ? null : e; + return doctrees.getElement(docTreePath); } public TypeMirror getType(ReferenceTree rtree) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java index b5399d0fef9..90b371a8a15 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -1006,11 +1006,11 @@ public class Checker extends DocTreePathScanner { public Void visitReference(ReferenceTree tree, Void ignore) { // Exclude same-file anchor links from reference checks if (!tree.getSignature().startsWith("##")) { - Element e = env.trees.getElement(getCurrentPath()); - if (e == null) { - reportBadReference(tree); - } else if ((inLink || inSee) - && e.getKind() == ElementKind.CLASS && e.asType().getKind() != TypeKind.DECLARED) { + if (inLink || inSee) { + if (env.trees.getElement(getCurrentPath()) == null) { + reportBadReference(tree); + } + } else if (env.trees.getType(getCurrentPath()) == null) { reportBadReference(tree); } } diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxBundlingEnvironment.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxBundlingEnvironment.java index d6d9def9407..724aeabb4b3 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxBundlingEnvironment.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxBundlingEnvironment.java @@ -33,6 +33,7 @@ import static jdk.jpackage.internal.cli.StandardBundlingOperation.CREATE_LINUX_R import static jdk.jpackage.internal.util.MemoizingSupplier.runOnce; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Stream; @@ -41,6 +42,7 @@ import jdk.jpackage.internal.cli.StandardBundlingOperation; import jdk.jpackage.internal.model.BundlingOperationDescriptor; import jdk.jpackage.internal.model.LinuxPackage; import jdk.jpackage.internal.model.PackageType; +import jdk.jpackage.internal.model.StandardPackageType; import jdk.jpackage.internal.util.Result; public class LinuxBundlingEnvironment extends DefaultBundlingEnvironment { @@ -55,11 +57,15 @@ public class LinuxBundlingEnvironment extends DefaultBundlingEnvironment { }); Supplier> debSysEnv = () -> { - return LinuxDebSystemEnvironment.create(sysEnv.get()); + return LinuxDebSystemEnvironment.create(sysEnv.get().flatMap(v -> { + return adjustPackageArch(v, StandardPackageType.LINUX_DEB); + })); }; Supplier> rpmSysEnv = () -> { - return LinuxRpmSystemEnvironment.create(sysEnv.get()); + return LinuxRpmSystemEnvironment.create(sysEnv.get().flatMap(v -> { + return adjustPackageArch(v, StandardPackageType.LINUX_RPM); + })); }; builder.defaultOperation(() -> { @@ -107,6 +113,20 @@ public class LinuxBundlingEnvironment extends DefaultBundlingEnvironment { return new BuildEnvFromOptions().predefinedAppImageLayout(APPLICATION_LAYOUT); } + private static Result adjustPackageArch(LinuxSystemEnvironment sysEnv, StandardPackageType type) { + Objects.requireNonNull(sysEnv); + Objects.requireNonNull(type); + if (sysEnv.nativePackageType().equals(type)) { + return Result.of(() -> { + return sysEnv; + }); + } else { + return LinuxPackageArch.create(type).map(arch -> { + return new LinuxSystemEnvironment.Stub(sysEnv.soLookupAvailable(), sysEnv.nativePackageType(), arch); + }); + } + } + private static final Map DESCRIPTORS = Stream.of( CREATE_LINUX_DEB, CREATE_LINUX_RPM diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebPackager.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebPackager.java index 7c1f06f54a3..d46ec8865c8 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebPackager.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebPackager.java @@ -104,7 +104,7 @@ final class LinuxDebPackager extends LinuxPackager { List cmdline = new ArrayList<>(List.of( sysEnv.dpkgdeb().toString(), "-f", outputPackageFile().toString())); - properties.forEach(property -> cmdline.add(property.name)); + properties.forEach(property -> cmdline.add(property.name())); Map actualValues = Executor.of(cmdline) .saveOutput(true) @@ -116,7 +116,7 @@ final class LinuxDebPackager extends LinuxPackager { components -> components[1])); for (var property : properties) { - Optional.ofNullable(property.verifyValue(actualValues.get(property.name))).ifPresent(errors::add); + Optional.ofNullable(property.verifyValue(actualValues.get(property.name()))).ifPresent(errors::add); } return errors; diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmPackager.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmPackager.java index e22b9c24fdd..8c3e8125e9b 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmPackager.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmPackager.java @@ -112,12 +112,12 @@ final class LinuxRpmPackager extends LinuxPackager { "APPLICATION_VERSION", specFileName), new PackageProperty("Release", pkg.release().orElseThrow(), "APPLICATION_RELEASE", specFileName), - new PackageProperty("Arch", pkg.arch(), null, specFileName)); + new PackageProperty("Arch", pkg.arch(), specFileName)); var actualValues = Executor.of( sysEnv.rpm().toString(), "-qp", - "--queryformat", properties.stream().map(e -> String.format("%%{%s}", e.name)).collect(joining("\\n")), + "--queryformat", properties.stream().map(e -> String.format("%%{%s}", e.name())).collect(joining("\\n")), outputPackageFile().toString() ).saveOutput(true).executeExpectSuccess().getOutput(); diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/PackageProperty.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/PackageProperty.java index 6b06190f891..e19e45cb5d4 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/PackageProperty.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/PackageProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -25,52 +25,61 @@ package jdk.jpackage.internal; -import java.text.MessageFormat; +import java.util.Objects; +import java.util.Optional; import jdk.jpackage.internal.model.ConfigException; -final class PackageProperty { - /** - * Constructor - * - * @param name property name - * @param expectedValue expected property value - * @param substString substitution string to be placed in resource file to - * be replaced with the expected property value by jpackage at package build - * time - * @param customResource name of custom resource from resource directory in - * which this package property can be set - */ - PackageProperty(String name, String expectedValue, String substString, - String customResource) { - this.name = name; - this.expectedValue = expectedValue; - this.substString = substString; - this.customResource = customResource; +/** + * Linux package property. + * + * @param name the property name (e.g.: "Architecture", "Version") + * @param expectedValue the expected value of the property + * @param subtrituteString the substitute string in the jpackage resource if + * applicable (e.g.: "APPLICATION_PACKAGE", + * "APPLICATION_VERSION") + * @param resourceName the name of the custom resource file from the + * resource directory in which this package property can + * be set + */ +record PackageProperty(String name, String expectedValue, Optional subtrituteString, String customResource) { + + PackageProperty { + Objects.requireNonNull(name); + Objects.requireNonNull(expectedValue); + Objects.requireNonNull(subtrituteString); + Objects.requireNonNull(customResource); + } + + PackageProperty(String name, String expectedValue, String subtrituteString, String resourceName) { + this(name, expectedValue, Optional.of(subtrituteString), resourceName); + } + + PackageProperty(String name, String expectedValue, String resourceName) { + this(name, expectedValue, Optional.empty(), resourceName); + } + + private String formatErrorMessage(String actualValue) { + Objects.requireNonNull(actualValue); + return I18N.format("error.unexpected-package-property", + name, expectedValue, actualValue, customResource); + } + + private String formatAdvice(String actualValue) { + Objects.requireNonNull(actualValue); + return subtrituteString.map(ss -> { + return I18N.format("error.unexpected-package-property.advice", ss, actualValue, name, customResource); + }).orElseGet(() -> { + return I18N.format("error.unexpected-default-package-property.advice", name, customResource); + }); } ConfigException verifyValue(String actualValue) { + Objects.requireNonNull(actualValue); + if (expectedValue.equals(actualValue)) { return null; } - final String advice; - if (substString != null) { - advice = MessageFormat.format(I18N.getString( - "error.unexpected-package-property.advice"), substString, - actualValue, name, customResource); - } else { - advice = MessageFormat.format(I18N.getString( - "error.unexpected-default-package-property.advice"), name, - customResource); - } - - return new ConfigException(MessageFormat.format(I18N.getString( - "error.unexpected-package-property"), name, - expectedValue, actualValue, customResource, substString), advice); + return new ConfigException(formatErrorMessage(actualValue), formatAdvice(actualValue)); } - - final String name; - private final String expectedValue; - private final String substString; - private final String customResource; } diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties index 3aa0e0e92a0..1ab45d26a4c 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties @@ -58,6 +58,6 @@ message.rpm-ldd-not-available.advice=Install "glibc-common" RPM package to get l warning.foreign-app-image=Warning: app-image dir not generated by jpackage. message.not-default-bundler-no-dependencies-lookup={0} is not the default package type. Package dependencies will not be generated. -error.unexpected-package-property=Expected value of "{0}" property is [{1}]. Actual value in output package is [{2}]. Looks like custom "{3}" file from resource directory contained hard coded value of "{0}" property +error.unexpected-package-property=Expected value of "{0}" property is [{1}]. Actual value in output package is [{2}]. Looks like the value of "{0}" property is hardcoded in "{3}" file in the resource directory error.unexpected-package-property.advice=Use [{0}] pattern string instead of hard coded value [{1}] of {2} property in custom "{3}" file -error.unexpected-default-package-property.advice=Don't explicitly set value of {0} property in custom "{1}" file +error.unexpected-default-package-property.advice=Don''t explicitly set value of "{0}" property in custom "{1}" file diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java index b49cbb025e9..8071f182801 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -37,12 +37,11 @@ import java.util.stream.Stream; public final class DottedVersion { private DottedVersion(String version, boolean greedy) { - this.value = version; if (version.isEmpty()) { if (greedy) { throw new IllegalArgumentException(I18N.getString("error.version-string-empty")); } else { - this.components = new BigInteger[0]; + this.components = new Component[0]; this.suffix = ""; } } else { @@ -53,12 +52,12 @@ public final class DottedVersion { if (!greedy) { return null; } else { - ds.throwException(); + throw ds.createException(); } } try { - return new BigInteger(digits); + return new Component(digits); } catch (NumberFormatException ex) { if (!greedy) { return null; @@ -68,17 +67,25 @@ public final class DottedVersion { digits)); } } - }).takeWhile(Objects::nonNull).toArray(BigInteger[]::new); + }).takeWhile(Objects::nonNull).toArray(Component[]::new); suffix = ds.getUnprocessedString(); if (!suffix.isEmpty() && greedy) { - ds.throwException(); + throw ds.createException(); } } } + private DottedVersion(Component[] components, String suffix) { + this.components = components; + this.suffix = suffix; + } + private static class DigitsSupplier { DigitsSupplier(String input) { + if (input.isEmpty()) { + throw new IllegalArgumentException(); + } this.input = input; } @@ -95,7 +102,7 @@ public final class DottedVersion { } else { var curStopAtDot = (chr == '.'); if (!curStopAtDot) { - if (lastDotPos >= 0) { + if (sb.isEmpty() && lastDotPos >= 0) { cursor = lastDotPos; } else { cursor--; @@ -112,11 +119,7 @@ public final class DottedVersion { } if (sb.isEmpty()) { - if (lastDotPos >= 0) { - cursor = lastDotPos; - } else { - cursor--; - } + cursor = lastDotPos; } stoped = true; @@ -127,7 +130,7 @@ public final class DottedVersion { return input.substring(cursor); } - void throwException() { + IllegalArgumentException createException() { final String tail; if (lastDotPos >= 0) { tail = input.substring(lastDotPos + 1); @@ -143,7 +146,7 @@ public final class DottedVersion { errMessage = MessageFormat.format(I18N.getString( "error.version-string-invalid-component"), input, tail); } - throw new IllegalArgumentException(errMessage); + return new IllegalArgumentException(errMessage); } private int cursor; @@ -211,9 +214,31 @@ public final class DottedVersion { return Arrays.deepEquals(this.components, other.components); } + public DottedVersion trim(int limit) { + if (limit < 0) { + throw new IllegalArgumentException(); + } else if (limit >= components.length) { + return this; + } else { + return new DottedVersion(Arrays.copyOf(components, limit), suffix); + } + } + + public DottedVersion pad(int limit) { + if (limit < 0) { + throw new IllegalArgumentException(); + } else if (limit <= components.length) { + return this; + } else { + var newComponents = Arrays.copyOf(components, limit); + Arrays.fill(newComponents, components.length, newComponents.length, Component.ZERO); + return new DottedVersion(newComponents, suffix); + } + } + @Override public String toString() { - return value; + return Stream.of(components).map(Component::toString).collect(Collectors.joining(".")) + suffix; } public String getUnprocessedSuffix() { @@ -221,14 +246,35 @@ public final class DottedVersion { } public String toComponentsString() { - return Stream.of(components).map(BigInteger::toString).collect(Collectors.joining(".")); + return Stream.of(components).map(Component::parsedValue).map(BigInteger::toString).collect(Collectors.joining(".")); + } + + public int getComponentsCount() { + return components.length; } public BigInteger[] getComponents() { - return components; + return Stream.of(components).map(Component::parsedValue).toArray(BigInteger[]::new); } - private final BigInteger[] components; - private final String value; + private record Component(BigInteger parsedValue, String strValue) { + Component { + Objects.requireNonNull(parsedValue); + Objects.requireNonNull(strValue); + } + + Component(String strValue) { + this(new BigInteger(strValue), strValue); + } + + @Override + public String toString() { + return strValue; + } + + static final Component ZERO = new Component(BigInteger.ZERO, "0"); + } + + private final Component[] components; private final String suffix; } diff --git a/test/docs/TEST.ROOT b/test/docs/TEST.ROOT index 9a7e66b631c..11cba9c1c88 100644 --- a/test/docs/TEST.ROOT +++ b/test/docs/TEST.ROOT @@ -40,11 +40,6 @@ groups=TEST.groups # Minimum jtreg version requiredVersion=8.2.1+1 -# Use new module options -useNewOptions=true - -# Use --patch-module instead of -Xmodule: -useNewPatchModule=true # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt index 3e52b7169df..8514ffce11c 100644 --- a/test/hotspot/jtreg/ProblemList-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-zgc.txt @@ -27,82 +27,6 @@ # ############################################################################# -# Quiet the majority of SA tests -# We run serviceability/sa/TestUniverse.java as a sanity check for minimal functionality - -resourcehogs/serviceability/sa/TestHeapDumpForLargeArray.java 8307393 generic-all -serviceability/sa/CDSJMapClstats.java 8307393 generic-all -serviceability/sa/ClhsdbAttach.java 8307393 generic-all -serviceability/sa/ClhsdbAttachDifferentJVMs.java 8307393 generic-all -serviceability/sa/ClhsdbCDSCore.java 8307393 generic-all -serviceability/sa/ClhsdbCDSJstackPrintAll.java 8307393 generic-all -serviceability/sa/ClhsdbClasses.java 8307393 generic-all -serviceability/sa/ClhsdbDumpclass.java 8307393 generic-all -serviceability/sa/ClhsdbDumpheap.java 8307393 generic-all -serviceability/sa/ClhsdbField.java 8307393 generic-all -serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8307393 generic-all -serviceability/sa/ClhsdbFindPC.java#no-xcomp-process 8307393 generic-all -serviceability/sa/ClhsdbFindPC.java#xcomp-core 8307393 generic-all -serviceability/sa/ClhsdbFindPC.java#xcomp-process 8307393 generic-all -serviceability/sa/ClhsdbFlags.java 8307393 generic-all -serviceability/sa/ClhsdbHistory.java 8307393 generic-all -serviceability/sa/ClhsdbInspect.java 8307393 generic-all -serviceability/sa/ClhsdbJdis.java 8307393 generic-all -serviceability/sa/ClhsdbJhisto.java 8307393 generic-all -serviceability/sa/ClhsdbJstack.java#id0 8307393 generic-all -serviceability/sa/ClhsdbJstack.java#id1 8307393 generic-all -serviceability/sa/ClhsdbJstackWithConcurrentLock.java 8307393 generic-all -serviceability/sa/ClhsdbJstackXcompStress.java 8307393 generic-all -serviceability/sa/ClhsdbLongConstant.java 8307393 generic-all -serviceability/sa/ClhsdbPmap.java#core 8307393 generic-all -serviceability/sa/ClhsdbPmap.java#process 8307393 generic-all -serviceability/sa/ClhsdbPrintAll.java 8307393 generic-all -serviceability/sa/ClhsdbPrintAs.java 8307393 generic-all -serviceability/sa/ClhsdbPrintStatics.java 8307393 generic-all -serviceability/sa/ClhsdbPstack.java#core 8307393 generic-all -serviceability/sa/ClhsdbPstack.java#process 8307393 generic-all -serviceability/sa/ClhsdbScanOops.java#parallel 8307393 generic-all -serviceability/sa/ClhsdbScanOops.java#serial 8307393 generic-all -serviceability/sa/ClhsdbSource.java 8307393 generic-all -serviceability/sa/ClhsdbSymbol.java 8307393 generic-all -serviceability/sa/ClhsdbThread.java 8307393 generic-all -serviceability/sa/ClhsdbThreadContext.java 8307393 generic-all -serviceability/sa/ClhsdbVmStructsDump.java 8307393 generic-all -serviceability/sa/ClhsdbWhere.java 8307393 generic-all -serviceability/sa/DeadlockDetectionTest.java 8307393 generic-all -serviceability/sa/JhsdbThreadInfoTest.java 8307393 generic-all -serviceability/sa/TestClassDump.java 8307393 generic-all -serviceability/sa/TestClhsdbJstackLock.java 8307393 generic-all -serviceability/sa/TestCpoolForInvokeDynamic.java 8307393 generic-all -serviceability/sa/TestDefaultMethods.java 8307393 generic-all -serviceability/sa/TestG1HeapRegion.java 8307393 generic-all -serviceability/sa/TestHeapDumpForInvokeDynamic.java 8307393 generic-all -serviceability/sa/TestInstanceKlassSize.java 8307393 generic-all -serviceability/sa/TestInstanceKlassSizeForInterface.java 8307393 generic-all -serviceability/sa/TestIntConstant.java 8307393 generic-all -serviceability/sa/TestJhsdbJstackLineNumbers.java 8307393 generic-all -serviceability/sa/TestJhsdbJstackLock.java 8307393 generic-all -serviceability/sa/TestJhsdbJstackMixed.java 8307393 generic-all -serviceability/sa/TestJhsdbJstackPrintVMLocks.java 8307393 generic-all -serviceability/sa/TestJhsdbJstackUpcall.java 8307393 generic-all -serviceability/sa/TestJmapCore.java 8307393 generic-all -serviceability/sa/TestJmapCoreMetaspace.java 8307393 generic-all -serviceability/sa/TestObjectAlignment.java 8307393 generic-all -serviceability/sa/TestObjectMonitorIterate.java 8307393 generic-all -serviceability/sa/TestPrintMdo.java 8307393 generic-all -serviceability/sa/TestRevPtrsForInvokeDynamic.java 8307393 generic-all -serviceability/sa/TestSysProps.java 8307393 generic-all -serviceability/sa/TestType.java 8307393 generic-all -serviceability/sa/UniqueVtableTest.java 8307393 generic-all -serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java 8307393 generic-all -serviceability/sa/sadebugd/ClhsdbAttachToDebugServer.java 8307393 generic-all -serviceability/sa/sadebugd/ClhsdbTestConnectArgument.java 8307393 generic-all -serviceability/sa/ClhsdbTestAllocationMerge.java 8307393 generic-all -serviceability/sa/sadebugd/DebugdConnectTest.java 8307393 generic-all -serviceability/sa/sadebugd/DisableRegistryTest.java 8307393 generic-all -serviceability/sa/sadebugd/PmapOnDebugdTest.java 8307393 generic-all -serviceability/sa/sadebugd/RunCommandOnServerTest.java 8307393 generic-all -serviceability/sa/sadebugd/SADebugDTest.java 8307393 generic-all vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index d1c72b9768c..2a3d3eebbbd 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -113,8 +113,3 @@ requiredVersion=8.2.1+1 # does not need ../../../ notation to reach them external.lib.roots = ../../../ -# Use new module options -useNewOptions=true - -# Use --patch-module instead of -Xmodule: -useNewPatchModule=true diff --git a/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU.java b/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU.java index cf8000b7a21..10be61e98ec 100644 --- a/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU.java +++ b/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU.java @@ -52,7 +52,7 @@ public class TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU { private static final String UNLOCK_DIAGNOSTIC = "-XX:+UnlockDiagnosticVMOptions"; public static void main(String[] args) throws Throwable { - if (!IntrinsicPredicates.SHA3_INSTRUCTION_AVAILABLE.getAsBoolean()) { + if (!IntrinsicPredicates.SHA3_INTRINSIC_AVAILABLE.getAsBoolean()) { throw new SkippedException("Skipping... SHA3 intrinsics are not available on this platform."); } @@ -111,7 +111,7 @@ public class TestUseSHA3IntrinsicsWithUseSHADisabledOnSupportedCPU { private static void testWarningWhenEnablingWithUseSHADisabled() throws Throwable { // A warning should be printed when trying to enable UseSHA3Intrinsics with -UseSHA CommandLineOptionTest.verifySameJVMStartup( - new String[] { WARNING_MESSAGE }, // Warning should appear + new String[] { "warning" }, // Warning should appear null, // No unexpected output "JVM should start successfully", String.format("A warning should be printed when trying to enable %s while %s is disabled", diff --git a/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnUnsupportedCPU.java b/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnUnsupportedCPU.java index 1e0df1874b6..ebada79c877 100644 --- a/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnUnsupportedCPU.java +++ b/test/hotspot/jtreg/compiler/arguments/TestUseSHA3IntrinsicsWithUseSHADisabledOnUnsupportedCPU.java @@ -51,7 +51,7 @@ public class TestUseSHA3IntrinsicsWithUseSHADisabledOnUnsupportedCPU { private static final String UNLOCK_DIAGNOSTIC = "-XX:+UnlockDiagnosticVMOptions"; public static void main(String[] args) throws Throwable { - if (IntrinsicPredicates.SHA3_INSTRUCTION_AVAILABLE.getAsBoolean()) { + if (IntrinsicPredicates.SHA3_INTRINSIC_AVAILABLE.getAsBoolean()) { throw new SkippedException("Skipping... SHA3 intrinsics are available on this platform."); } diff --git a/test/hotspot/jtreg/compiler/c2/gvn/MissedURShiftIAddILShiftIdeal.java b/test/hotspot/jtreg/compiler/c2/gvn/MissedURShiftIAddILShiftIdeal.java new file mode 100644 index 00000000000..dd446d8bb25 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/gvn/MissedURShiftIAddILShiftIdeal.java @@ -0,0 +1,138 @@ +/* + * 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.c2.gvn; + +import compiler.lib.ir_framework.*; +import jdk.test.lib.Asserts; +import jdk.test.lib.Platform; +import jdk.test.lib.Utils; +import java.util.Random; + +/* + * @test + * @bug 8378413 + * @key randomness + * @summary Verify that URShift{I,L}Node::Ideal optimizes ((x << C) + y) >>> C + * regardless of Add input order, i.e. it is commutative w.r.t. the addition. + * @library /test/lib / + * @run driver ${test.main.class} + */ +public class MissedURShiftIAddILShiftIdeal { + + private static final Random RANDOM = Utils.getRandomInstance(); + + public static void main(String[] args) { + var framework = new TestFramework(); + framework.addScenarios(new Scenario(0)); + if (Platform.isDebugBuild()) { + framework.addScenarios(new Scenario(1, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:VerifyIterativeGVN=1110")); + } + framework.start(); + } + + @Run(test = {"testI", "testICommuted", "testIComputedY", + "testL", "testLCommuted", "testLComputedY"}) + public void runMethod() { + int xi = RANDOM.nextInt(); + int yi = RANDOM.nextInt(); + int ai = RANDOM.nextInt(); + int bi = RANDOM.nextInt(); + long xl = RANDOM.nextLong(); + long yl = RANDOM.nextLong(); + long al = RANDOM.nextLong(); + long bl = RANDOM.nextLong(); + + assertResultI(xi, yi, ai, bi); + assertResultL(xl, yl, al, bl); + } + + @DontCompile + public void assertResultI(int x, int y, int a, int b) { + Asserts.assertEQ(((x << 3) + y) >>> 3, testI(x, y)); + Asserts.assertEQ((y + (x << 5)) >>> 5, testICommuted(x, y)); + Asserts.assertEQ(((x << 7) + (a ^ b)) >>> 7, testIComputedY(x, a, b)); + } + + @DontCompile + public void assertResultL(long x, long y, long a, long b) { + Asserts.assertEQ(((x << 9) + y) >>> 9, testL(x, y)); + Asserts.assertEQ((y + (x << 11)) >>> 11, testLCommuted(x, y)); + Asserts.assertEQ(((x << 13) + (a ^ b)) >>> 13, testLComputedY(x, a, b)); + } + + @Test + // ((x << 3) + y) >>> 3 => (x + (y >>> 3)) & mask + @IR(counts = {IRNode.LSHIFT_I, "0", + IRNode.URSHIFT_I, "1", + IRNode.AND_I, "1"}) + static int testI(int x, int y) { + return ((x << 3) + y) >>> 3; + } + + @Test + // (y + (x << 5)) >>> 5 => (x + (y >>> 5)) & mask (commuted Add) + @IR(counts = {IRNode.LSHIFT_I, "0", + IRNode.URSHIFT_I, "1", + IRNode.AND_I, "1"}) + static int testICommuted(int x, int y) { + return (y + (x << 5)) >>> 5; + } + + @Test + // ((x << 7) + (a ^ b)) >>> 7 => (x + ((a ^ b) >>> 7)) & mask + // Computed y (a ^ b) has higher _idx than LShift, so LShift stays in Add's in(1). + @IR(counts = {IRNode.LSHIFT_I, "0", + IRNode.URSHIFT_I, "1", + IRNode.AND_I, "1"}) + static int testIComputedY(int x, int a, int b) { + return ((x << 7) + (a ^ b)) >>> 7; + } + + @Test + // ((x << 9) + y) >>> 9 => (x + (y >>> 9)) & mask + @IR(counts = {IRNode.LSHIFT_L, "0", + IRNode.URSHIFT_L, "1", + IRNode.AND_L, "1"}) + static long testL(long x, long y) { + return ((x << 9) + y) >>> 9; + } + + @Test + // (y + (x << 11)) >>> 11 => (x + (y >>> 11)) & mask (commuted Add) + @IR(counts = {IRNode.LSHIFT_L, "0", + IRNode.URSHIFT_L, "1", + IRNode.AND_L, "1"}) + static long testLCommuted(long x, long y) { + return (y + (x << 11)) >>> 11; + } + + @Test + // ((x << 13) + (a ^ b)) >>> 13 => (x + ((a ^ b) >>> 13)) & mask + // Computed y (a ^ b) has higher _idx than LShift, so LShift stays in Add's in(1). + @IR(counts = {IRNode.LSHIFT_L, "0", + IRNode.URSHIFT_L, "1", + IRNode.AND_L, "1"}) + static long testLComputedY(long x, long a, long b) { + return ((x << 13) + (a ^ b)) >>> 13; + } +} diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/DigestOptionsBase.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/DigestOptionsBase.java index 22b3bba854c..b8a3896294b 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/DigestOptionsBase.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/DigestOptionsBase.java @@ -122,7 +122,7 @@ public class DigestOptionsBase extends CommandLineOptionTest { case DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION: return IntrinsicPredicates.isSHA512IntrinsicAvailable(); case DigestOptionsBase.USE_SHA3_INTRINSICS_OPTION: - return IntrinsicPredicates.SHA3_INSTRUCTION_AVAILABLE; + return IntrinsicPredicates.SHA3_INTRINSIC_AVAILABLE; default: throw new Error("Unexpected option " + optionName); } diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java index d3c0a4a8da7..c47591d75da 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java @@ -28,10 +28,7 @@ * @summary Verify UseSHA3Intrinsics option processing on supported CPU. * @library /test/lib / * @requires vm.flagless - * @requires os.arch == "aarch64" & os.family == "mac" - * @comment sha3 is only implemented on AArch64 for now. - * UseSHA3Intrinsics is only auto-enabled on Apple silicon, because it - * may introduce performance regression on others. See JDK-8297092. + * @requires (os.arch == "aarch64" | os.arch == "amd64" | os.arch == "x86_64") * * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java index 4b3914e75fd..f1c7069c317 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java @@ -80,7 +80,8 @@ public class GenericTestCaseForSupportedCPU extends // Verify that if -XX:-UseSHA is passed to the JVM, it is not possible // to enable the tested option and a warning is printed. CommandLineOptionTest.verifySameJVMStartup( - new String[] { DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, + new String[] { "warning: " }, // Accept any warning message, e.g. "requires that UseSHA is enabled" + // or the common "not available on this CPU" message. null, shouldPassMessage, String.format("Enabling option '%s' should not be possible and should result in a warning if %s was passed to JVM", diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedCPU.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedCPU.java index 85f6f280ccb..b2a0720e6e8 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedCPU.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedCPU.java @@ -71,7 +71,8 @@ public class GenericTestCaseForUnsupportedCPU extends // a warning will occur in VM output if UseSHA is disabled. if (!optionName.equals(DigestOptionsBase.USE_SHA_OPTION)) { CommandLineOptionTest.verifySameJVMStartup( - new String[] { DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, + new String[] { "warning: " }, // Accept any warning message, e.g. "requires that UseSHA is enabled" + // or the common "not available on this CPU" message. null, shouldPassMessage, shouldPassMessage, diff --git a/test/hotspot/jtreg/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java b/test/hotspot/jtreg/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java index 0c53c36af1d..b088f58bb5b 100644 --- a/test/hotspot/jtreg/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java +++ b/test/hotspot/jtreg/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java @@ -109,6 +109,12 @@ public class IntrinsicPredicates { new OrPredicate(new CPUSpecificPredicate("amd64.*", new String[] {"avx512f", "avx512bw"}, null), new CPUSpecificPredicate("x86_64", new String[] {"avx512f", "avx512bw"}, null))); + public static final BooleanSupplier SHA3_INTRINSIC_AVAILABLE + // AArch64 has both SHA3-based and GPR-based implementations of the SHA3 intrinsic. No need for the SHA3 capability. + = new OrPredicate(new CPUSpecificPredicate("aarch64.*", null, null), + new OrPredicate(new CPUSpecificPredicate("amd64.*", new String[] {"avx512f", "avx512bw"}, null), + new CPUSpecificPredicate("x86_64", new String[] {"avx512f", "avx512bw"}, null))); + public static final BooleanSupplier ANY_SHA_INSTRUCTION_AVAILABLE = new OrPredicate(IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE, new OrPredicate(IntrinsicPredicates.SHA256_INSTRUCTION_AVAILABLE, diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorUMinMaxReductionTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorUMinMaxReductionTest.java index 1c8cc34170e..4c753d91afd 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/VectorUMinMaxReductionTest.java +++ b/test/hotspot/jtreg/compiler/vectorapi/VectorUMinMaxReductionTest.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -140,7 +141,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testByteUMin() { byte got = ByteVector.fromArray(B_SPECIES, ba, 0).reduceLanes(VectorOperators.UMIN); verifyByte(B_SPECIES, got, BYTE_UMIN_IDENTITY, VectorMath::minUnsigned, false); @@ -148,7 +149,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testByteUMax() { byte got = ByteVector.fromArray(B_SPECIES, ba, 0).reduceLanes(VectorOperators.UMAX); verifyByte(B_SPECIES, got, BYTE_UMAX_IDENTITY, VectorMath::maxUnsigned, false); @@ -156,7 +157,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testByteUMinMasked() { byte got = ByteVector.fromArray(B_SPECIES, ba, 0) .reduceLanes(VectorOperators.UMIN, @@ -166,7 +167,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testByteUMaxMasked() { byte got = ByteVector.fromArray(B_SPECIES, ba, 0) .reduceLanes(VectorOperators.UMAX, @@ -178,7 +179,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testShortUMin() { short got = ShortVector.fromArray(S_SPECIES, sa, 0).reduceLanes(VectorOperators.UMIN); verifyShort(S_SPECIES, got, SHORT_UMIN_IDENTITY, VectorMath::minUnsigned, false); @@ -186,7 +187,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testShortUMax() { short got = ShortVector.fromArray(S_SPECIES, sa, 0).reduceLanes(VectorOperators.UMAX); verifyShort(S_SPECIES, got, SHORT_UMAX_IDENTITY, VectorMath::maxUnsigned, false); @@ -194,7 +195,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testShortUMinMasked() { short got = ShortVector.fromArray(S_SPECIES, sa, 0) .reduceLanes(VectorOperators.UMIN, @@ -204,7 +205,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testShortUMaxMasked() { short got = ShortVector.fromArray(S_SPECIES, sa, 0) .reduceLanes(VectorOperators.UMAX, @@ -216,7 +217,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testIntUMin() { int got = IntVector.fromArray(I_SPECIES, ia, 0).reduceLanes(VectorOperators.UMIN); verifyInt(I_SPECIES, got, INT_UMIN_IDENTITY, VectorMath::minUnsigned, false); @@ -224,7 +225,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testIntUMax() { int got = IntVector.fromArray(I_SPECIES, ia, 0).reduceLanes(VectorOperators.UMAX); verifyInt(I_SPECIES, got, INT_UMAX_IDENTITY, VectorMath::maxUnsigned, false); @@ -232,7 +233,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testIntUMinMasked() { int got = IntVector.fromArray(I_SPECIES, ia, 0) .reduceLanes(VectorOperators.UMIN, @@ -242,7 +243,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"}) public static void testIntUMaxMasked() { int got = IntVector.fromArray(I_SPECIES, ia, 0) .reduceLanes(VectorOperators.UMAX, @@ -254,7 +255,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx512vl", "true"}) public static void testLongUMin() { long got = LongVector.fromArray(L_SPECIES, la, 0).reduceLanes(VectorOperators.UMIN); verifyLong(L_SPECIES, got, LONG_UMIN_IDENTITY, VectorMath::minUnsigned, false); @@ -262,7 +263,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx512vl", "true"}) public static void testLongUMax() { long got = LongVector.fromArray(L_SPECIES, la, 0).reduceLanes(VectorOperators.UMAX); verifyLong(L_SPECIES, got, LONG_UMAX_IDENTITY, VectorMath::maxUnsigned, false); @@ -270,7 +271,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMIN_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx512vl", "true"}) public static void testLongUMinMasked() { long got = LongVector.fromArray(L_SPECIES, la, 0) .reduceLanes(VectorOperators.UMIN, @@ -280,7 +281,7 @@ public class VectorUMinMaxReductionTest { @Test @IR(counts = {IRNode.UMAX_REDUCTION_V, "= 1"}, - applyIfCPUFeature = {"asimd", "true"}) + applyIfCPUFeatureOr = {"asimd", "true", "avx512vl", "true"}) public static void testLongUMaxMasked() { long got = LongVector.fromArray(L_SPECIES, la, 0) .reduceLanes(VectorOperators.UMAX, diff --git a/test/hotspot/jtreg/compiler/vectorization/TestVectorAlgorithms.java b/test/hotspot/jtreg/compiler/vectorization/TestVectorAlgorithms.java index e02563c2fc2..ed04950eb07 100644 --- a/test/hotspot/jtreg/compiler/vectorization/TestVectorAlgorithms.java +++ b/test/hotspot/jtreg/compiler/vectorization/TestVectorAlgorithms.java @@ -79,6 +79,12 @@ public class TestVectorAlgorithms { VectorAlgorithmsImpl.Data d; + // We should test with a wide range of probabilities, to ensure correctness, + // and also to ensure we get all branches compiled, so IR matching compiles + // also for branches that require a very extreme probability. + private static final float[] BRANCH_PROBABILITIES = new float[] {0f, 0.1f, 0.3f, 0.5f, 0.7f, 0.9f, 1f}; + private static int branch_probabilities_idx = 0; + public static void main(String[] args) { TestFramework framework = new TestFramework(); framework.addFlags("--add-modules=jdk.incubator.vector", @@ -133,16 +139,19 @@ public class TestVectorAlgorithms { testGroups.get("findMinIndexI").put("findMinIndexI_VectorAPI", i -> { return findMinIndexI_VectorAPI(d.aI); }); testGroups.put("findI", new HashMap()); - testGroups.get("findI").put("findI_loop", i -> { return findI_loop(d.aI, d.eI[i]); }); - testGroups.get("findI").put("findI_VectorAPI", i -> { return findI_VectorAPI(d.aI, d.eI[i]); }); + testGroups.get("findI").put("findI_loop", i -> { return findI_loop(d.aI, d.eI_findI[i]); }); + testGroups.get("findI").put("findI_VectorAPI", i -> { return findI_VectorAPI(d.aI, d.eI_findI[i]); }); testGroups.put("reverseI", new HashMap()); testGroups.get("reverseI").put("reverseI_loop", i -> { return reverseI_loop(d.aI, d.rI1); }); testGroups.get("reverseI").put("reverseI_VectorAPI", i -> { return reverseI_VectorAPI(d.aI, d.rI2); }); testGroups.put("filterI", new HashMap()); - testGroups.get("filterI").put("filterI_loop", i -> { return filterI_loop(d.aI, d.rI1, d.eI[i]); }); - testGroups.get("filterI").put("filterI_VectorAPI", i -> { return filterI_VectorAPI(d.aI, d.rI2, d.eI[i]); }); + testGroups.get("filterI").put("filterI_loop", i -> { return filterI_loop(d.aI_filterI, d.rI1, d.eI_filterI); }); + testGroups.get("filterI").put("filterI_VectorAPI_v1", i -> { return filterI_VectorAPI_v1(d.aI_filterI, d.rI2, d.eI_filterI); }); + testGroups.get("filterI").put("filterI_VectorAPI_v2_l2", i -> { return filterI_VectorAPI_v2_l2(d.aI_filterI, d.rI3, d.eI_filterI); }); + testGroups.get("filterI").put("filterI_VectorAPI_v2_l4", i -> { return filterI_VectorAPI_v2_l4(d.aI_filterI, d.rI4, d.eI_filterI); }); + testGroups.get("filterI").put("filterI_VectorAPI_v2_l8", i -> { return filterI_VectorAPI_v2_l8(d.aI_filterI, d.rI5, d.eI_filterI); }); testGroups.put("reduceAddIFieldsX4", new HashMap()); testGroups.get("reduceAddIFieldsX4").put("reduceAddIFieldsX4_loop", i -> { return reduceAddIFieldsX4_loop(d.oopsX4, d.memX4); }); @@ -152,6 +161,17 @@ public class TestVectorAlgorithms { testGroups.get("lowerCaseB").put("lowerCaseB_loop", i -> { return lowerCaseB_loop(d.strB, d.rB1); }); testGroups.get("lowerCaseB").put("lowerCaseB_VectorAPI_v1", i -> { return lowerCaseB_VectorAPI_v1(d.strB, d.rB2); }); testGroups.get("lowerCaseB").put("lowerCaseB_VectorAPI_v2", i -> { return lowerCaseB_VectorAPI_v2(d.strB, d.rB3); }); + + testGroups.put("conditionalSumB", new HashMap()); + testGroups.get("conditionalSumB").put("conditionalSumB_loop", i -> { return conditionalSumB_loop(d.strB); }); + testGroups.get("conditionalSumB").put("conditionalSumB_VectorAPI_v1", i -> { return conditionalSumB_VectorAPI_v1(d.strB); }); + testGroups.get("conditionalSumB").put("conditionalSumB_VectorAPI_v2", i -> { return conditionalSumB_VectorAPI_v2(d.strB); }); + + + testGroups.put("pieceWise2FunctionF", new HashMap()); + testGroups.get("pieceWise2FunctionF").put("pieceWise2FunctionF_loop", _ -> { return pieceWise2FunctionF_loop(d.xF, d.rF1); }); + testGroups.get("pieceWise2FunctionF").put("pieceWise2FunctionF_VectorAPI_v1", _ -> { return pieceWise2FunctionF_VectorAPI_v1(d.xF, d.rF2); }); + testGroups.get("pieceWise2FunctionF").put("pieceWise2FunctionF_VectorAPI_v2", _ -> { return pieceWise2FunctionF_VectorAPI_v2(d.xF, d.rF3); }); } @Warmup(100) @@ -186,12 +206,21 @@ public class TestVectorAlgorithms { "reverseI_loop", "reverseI_VectorAPI", "filterI_loop", - "filterI_VectorAPI", + "filterI_VectorAPI_v1", + "filterI_VectorAPI_v2_l2", + "filterI_VectorAPI_v2_l4", + "filterI_VectorAPI_v2_l8", "reduceAddIFieldsX4_loop", "reduceAddIFieldsX4_VectorAPI", "lowerCaseB_loop", "lowerCaseB_VectorAPI_v1", - "lowerCaseB_VectorAPI_v2"}) + "lowerCaseB_VectorAPI_v2", + "conditionalSumB_loop", + "conditionalSumB_VectorAPI_v1", + "conditionalSumB_VectorAPI_v2", + "pieceWise2FunctionF_loop", + "pieceWise2FunctionF_VectorAPI_v1", + "pieceWise2FunctionF_VectorAPI_v2"}) public void runTests(RunInfo info) { // Repeat many times, so that we also have multiple iterations for post-warmup to potentially recompile int iters = info.isWarmUp() ? 1 : 20; @@ -200,7 +229,9 @@ public class TestVectorAlgorithms { int size = 100_000 + RANDOM.nextInt(10_000); int seed = RANDOM.nextInt(); int numXObjects = 10_000; - d = new VectorAlgorithmsImpl.Data(size, seed, numXObjects); + branch_probabilities_idx = (branch_probabilities_idx + 1) % BRANCH_PROBABILITIES.length; + float branchProbability = BRANCH_PROBABILITIES[branch_probabilities_idx]; + d = new VectorAlgorithmsImpl.Data(size, seed, numXObjects, branchProbability); // Run all tests for (Map.Entry> group_entry : testGroups.entrySet()) { @@ -272,8 +303,10 @@ public class TestVectorAlgorithms { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.STORE_VECTOR, "> 0"}, - applyIfCPUFeature = {"sse4.1", "true"}) - // Note: also works with NEON/asimd, but only with TieredCompilation. + applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}, + applyIf = {"TieredCompilation", "true"}) + // IR check only works with TieredCompilation. Needs to make it + // work with -XX:-TieredCompilation in future (see JDK-8378640). public Object iotaI_VectorAPI(int[] r) { return VectorAlgorithmsImpl.iotaI_VectorAPI(r); } @@ -360,7 +393,7 @@ public class TestVectorAlgorithms { @IR(counts = {IRNode.LOAD_VECTOR_F, "> 0", IRNode.ADD_REDUCTION_V, "> 0", IRNode.MUL_VF, "> 0"}, - applyIfCPUFeature = {"sse4.1", "true"}, + applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}, applyIf = {"UseSuperWord", "true"}) public float dotProductF_VectorAPI_naive(float[] a, float[] b) { return VectorAlgorithmsImpl.dotProductF_VectorAPI_naive(a, b); @@ -370,7 +403,7 @@ public class TestVectorAlgorithms { @IR(counts = {IRNode.LOAD_VECTOR_F, "> 0", IRNode.ADD_REDUCTION_V, "> 0", IRNode.MUL_VF, "> 0"}, - applyIfCPUFeature = {"sse4.1", "true"}, + applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}, applyIf = {"UseSuperWord", "true"}) public float dotProductF_VectorAPI_reduction_after_loop(float[] a, float[] b) { return VectorAlgorithmsImpl.dotProductF_VectorAPI_reduction_after_loop(a, b); @@ -392,7 +425,8 @@ public class TestVectorAlgorithms { IRNode.MUL_VI, IRNode.VECTOR_SIZE_8, "> 0", IRNode.ADD_VI, IRNode.VECTOR_SIZE_8, "> 0", IRNode.ADD_REDUCTION_VI, "> 0"}, - applyIfCPUFeature = {"avx2", "true"}) + applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"}, + applyIf = {"MaxVectorSize", ">=32"}) public int hashCodeB_VectorAPI_v1(byte[] a) { return VectorAlgorithmsImpl.hashCodeB_VectorAPI_v1(a); } @@ -402,7 +436,7 @@ public class TestVectorAlgorithms { IRNode.MUL_VI, "> 0", IRNode.ADD_VI, "> 0", IRNode.ADD_REDUCTION_VI, "> 0"}, - applyIfCPUFeature = {"avx2", "true"}) + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) public int hashCodeB_VectorAPI_v2(byte[] a) { return VectorAlgorithmsImpl.hashCodeB_VectorAPI_v2(a); } @@ -506,9 +540,46 @@ public class TestVectorAlgorithms { IRNode.VECTOR_TEST, "> 0", IRNode.COMPRESS_VI, "> 0", IRNode.STORE_VECTOR_MASKED, "> 0"}, - applyIfCPUFeature = {"avx2", "true"}) - public Object filterI_VectorAPI(int[] a, int[] r, int threshold) { - return VectorAlgorithmsImpl.filterI_VectorAPI(a, r, threshold); + applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"}) + public Object filterI_VectorAPI_v1(int[] a, int[] r, int threshold) { + return VectorAlgorithmsImpl.filterI_VectorAPI_v1(a, r, threshold); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0", + IRNode.VECTOR_MASK_CMP, "= 0", // not implemented + IRNode.VECTOR_TEST, "= 0", // not implemented + IRNode.STORE_VECTOR, "> 0"}, + applyIfCPUFeature = {"sse4.1", "true"}) + // x86 seems to have a limitation with 2-element VectorStoreMask, this blocks intrinsification + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0", + IRNode.VECTOR_MASK_CMP, "> 0", + IRNode.VECTOR_TEST, "> 0", + IRNode.STORE_VECTOR, "> 0"}, + applyIfCPUFeatureOr = {"asimd", "true"}) + public Object filterI_VectorAPI_v2_l2(int[] a, int[] r, int threshold) { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l2(a, r, threshold); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "> 0", + IRNode.VECTOR_MASK_CMP, "> 0", + IRNode.VECTOR_TEST, "> 0", + IRNode.STORE_VECTOR, "> 0"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + public Object filterI_VectorAPI_v2_l4(int[] a, int[] r, int threshold) { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l4(a, r, threshold); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_8, "> 0", + IRNode.VECTOR_MASK_CMP, "> 0", + IRNode.VECTOR_TEST, "> 0", + IRNode.STORE_VECTOR, "> 0"}, + applyIfCPUFeatureOr = {"avx2", "true"}) + // Note: need 8int = 256bit vector. NEON only has 128bit. + public Object filterI_VectorAPI_v2_l8(int[] a, int[] r, int threshold) { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l8(a, r, threshold); } @Test @@ -526,7 +597,10 @@ public class TestVectorAlgorithms { IRNode.OR_V_MASK, "> 0", IRNode.ADD_VI, "> 0", IRNode.ADD_REDUCTION_VI, "> 0"}, - applyIfCPUFeatureOr = {"avx512", "true", "sve", "true"}) + applyIfCPUFeatureOr = {"avx512", "true", "sve", "true"}, + applyIf = {"TieredCompilation", "true"}) + // IR check only works with TieredCompilation. Needs to make it + // work with -XX:-TieredCompilation in future (see JDK-8378640). public int reduceAddIFieldsX4_VectorAPI(int[] oops, int[] mem) { return VectorAlgorithmsImpl.reduceAddIFieldsX4_VectorAPI(oops, mem); } @@ -553,4 +627,53 @@ public class TestVectorAlgorithms { public Object lowerCaseB_VectorAPI_v2(byte[] a, byte[] r) { return VectorAlgorithmsImpl.lowerCaseB_VectorAPI_v2(a, r); } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_B, "= 0"}) + // Currently does not vectorize, but might in the future. + public Object conditionalSumB_loop(byte[] a) { + return VectorAlgorithmsImpl.conditionalSumB_loop(a); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_B, IRNode.VECTOR_SIZE + "min(max_int, max_byte)", "> 0", + IRNode.ADD_VI, IRNode.VECTOR_SIZE + "min(max_int, max_byte)", "> 0"}, + applyIfCPUFeature = {"avx2", "true"}) + // Note: we need at least a 256bit int vector. NEON only has 128bit. + public Object conditionalSumB_VectorAPI_v1(byte[] a) { + return VectorAlgorithmsImpl.conditionalSumB_VectorAPI_v1(a); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_B, "> 0", + IRNode.ADD_VI, "> 0"}, + applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) + public Object conditionalSumB_VectorAPI_v2(byte[] a) { + return VectorAlgorithmsImpl.conditionalSumB_VectorAPI_v2(a); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_F, "= 0"}) + // Currently does not vectorize, but might in the future. + public Object pieceWise2FunctionF_loop(float[] a, float[] r) { + return VectorAlgorithmsImpl.pieceWise2FunctionF_loop(a, r); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_F, "> 0", + IRNode.MUL_VF, "> 0", + IRNode.SQRT_VF, "> 0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + public Object pieceWise2FunctionF_VectorAPI_v1(float[] a, float[] r) { + return VectorAlgorithmsImpl.pieceWise2FunctionF_VectorAPI_v1(a, r); + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_F, "> 0", + IRNode.MUL_VF, "> 0", + IRNode.SQRT_VF, "> 0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + public Object pieceWise2FunctionF_VectorAPI_v2(float[] a, float[] r) { + return VectorAlgorithmsImpl.pieceWise2FunctionF_VectorAPI_v2(a, r); + } } diff --git a/test/hotspot/jtreg/compiler/vectorization/VectorAlgorithmsImpl.java b/test/hotspot/jtreg/compiler/vectorization/VectorAlgorithmsImpl.java index 2dfac704069..8276d90509f 100644 --- a/test/hotspot/jtreg/compiler/vectorization/VectorAlgorithmsImpl.java +++ b/test/hotspot/jtreg/compiler/vectorization/VectorAlgorithmsImpl.java @@ -36,6 +36,8 @@ public class VectorAlgorithmsImpl { private static final VectorSpecies SPECIES_I = IntVector.SPECIES_PREFERRED; private static final VectorSpecies SPECIES_I512 = IntVector.SPECIES_512; private static final VectorSpecies SPECIES_I256 = IntVector.SPECIES_256; + private static final VectorSpecies SPECIES_I128 = IntVector.SPECIES_128; + private static final VectorSpecies SPECIES_I64 = IntVector.SPECIES_64; private static final VectorSpecies SPECIES_B = ByteVector.SPECIES_PREFERRED; private static final VectorSpecies SPECIES_B64 = ByteVector.SPECIES_64; private static final VectorSpecies SPECIES_F = FloatVector.SPECIES_PREFERRED; @@ -58,15 +60,31 @@ public class VectorAlgorithmsImpl { public int[] rI2; public int[] rI3; public int[] rI4; - public int[] eI; + public int[] rI5; + + // Search element for "findI" + public int[] eI_findI; // The test has to use the same index into eI for all implementations. But in the // benchmark, we'd like to use random indices, so we use the index to advance through // the array. - public int eI_idx = 0; + public int eI_findI_idx = 0; + + // Data and threshold eI value for "filterI". + // We create the data in a range, and then pick a threshold scaled to that range, + // so that the branch in the filter is branchProbability. + public int[] aI_filterI; + public int eI_filterI; public float[] aF; public float[] bF; + // Input for piece-wise functions. + // Uniform [0..1[ with probability p and Uniform [1..2[ with probability (1-p) + public float[] xF; + public float[] rF1; + public float[] rF2; + public float[] rF3; + public byte[] aB; public byte[] strB; public byte[] rB1; @@ -76,7 +94,7 @@ public class VectorAlgorithmsImpl { public int[] oopsX4; public int[] memX4; - public Data(int size, int seed, int numX4Objects) { + public Data(int size, int seed, int numX4Objects, float branchProbability) { Random random = new Random(seed); // int: one input array and multiple output arrays so different implementations can @@ -86,14 +104,20 @@ public class VectorAlgorithmsImpl { rI2 = new int[size]; rI3 = new int[size]; rI4 = new int[size]; + rI5 = new int[size]; Arrays.setAll(aI, i -> random.nextInt()); // Populate with some random values from aI, and some totally random values. - eI = new int[0x10000]; - for (int i = 0; i < eI.length; i++) { - eI[i] = (random.nextInt(10) == 0) ? random.nextInt() : aI[random.nextInt(size)]; + eI_findI = new int[0x10000]; + for (int i = 0; i < eI_findI.length; i++) { + eI_findI[i] = (random.nextInt(10) == 0) ? random.nextInt() : aI[random.nextInt(size)]; } + int filterI_range = 1000_000; + aI_filterI = new int[size]; + Arrays.setAll(aI_filterI, i -> random.nextInt(filterI_range)); + eI_filterI = (int)(filterI_range * (1.0f - branchProbability)); + // X4 oop setup. // oopsX4 holds "addresses" (i.e. indices), that point to the 16-byte objects in memX4. oopsX4 = new int[size]; @@ -117,14 +141,30 @@ public class VectorAlgorithmsImpl { bF[i] = random.nextInt(32) - 16; } + xF = new float[size]; + rF1 = new float[size]; + rF2 = new float[size]; + rF3 = new float[size]; + for (int i = 0; i < size; i++) { + xF[i] = (random.nextFloat() < branchProbability) + ? 0f + random.nextFloat() + : 1f + random.nextFloat(); + } + // byte: just random data. aB = new byte[size]; - strB = new byte[size]; rB1 = new byte[size]; rB2 = new byte[size]; rB3 = new byte[size]; random.nextBytes(aB); - random.nextBytes(strB); // TODO: special data! + + // byte string: for lowerCase benchmark. + strB = new byte[size]; + for (int i = 0; i < size; i++) { + strB[i] = (random.nextFloat() < branchProbability) + ? (byte)(random.nextInt(16) + 'A') + : (byte)(random.nextInt(16) + 'a'); + } } } @@ -651,13 +691,12 @@ public class VectorAlgorithmsImpl { return r; } - public static Object filterI_VectorAPI(int[] a, int[] r, int threshold) { - var thresholds = IntVector.broadcast(SPECIES_I, threshold); + public static Object filterI_VectorAPI_v1(int[] a, int[] r, int threshold) { int j = 0; int i = 0; for (; i < SPECIES_I.loopBound(a.length); i += SPECIES_I.length()) { IntVector v = IntVector.fromArray(SPECIES_I, a, i); - var mask = v.compare(VectorOperators.GE, thresholds); + var mask = v.compare(VectorOperators.GE, threshold); v = v.compress(mask); int trueCount = mask.trueCount(); var prefixMask = mask.compress(); @@ -676,6 +715,98 @@ public class VectorAlgorithmsImpl { return r; } + // Idea: on platforms that do not support the "v1" solution with "compress" and + // masked stores, we struggle to deal with the loop-carried dependency of j. + // But we can still use dynamic uniformity to enable some vectorized performance. + public static Object filterI_VectorAPI_v2_l2(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I64.loopBound(a.length); i += SPECIES_I64.length()) { + IntVector v = IntVector.fromArray(SPECIES_I64, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 2; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + + public static Object filterI_VectorAPI_v2_l4(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I128.loopBound(a.length); i += SPECIES_I128.length()) { + IntVector v = IntVector.fromArray(SPECIES_I128, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 4; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + if (mask.laneIsSet(2)) { r[j++] = v.lane(2); } + if (mask.laneIsSet(3)) { r[j++] = v.lane(3); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + + public static Object filterI_VectorAPI_v2_l8(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I256.loopBound(a.length); i += SPECIES_I256.length()) { + IntVector v = IntVector.fromArray(SPECIES_I256, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 8; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + if (mask.laneIsSet(2)) { r[j++] = v.lane(2); } + if (mask.laneIsSet(3)) { r[j++] = v.lane(3); } + if (mask.laneIsSet(4)) { r[j++] = v.lane(4); } + if (mask.laneIsSet(5)) { r[j++] = v.lane(5); } + if (mask.laneIsSet(6)) { r[j++] = v.lane(6); } + if (mask.laneIsSet(7)) { r[j++] = v.lane(7); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + // X4: ints simulate 4-byte oops. // oops: if non-zero (= non-null), every entry simulates a 4-byte oop, pointing into mem. // mem: an int array that simulates the memory. @@ -771,4 +902,176 @@ public class VectorAlgorithmsImpl { } return r; } + + public static int conditionalSumB_loop(byte[] a) { + int sum = 0; + for (int i = 0; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + + public static int conditionalSumB_VectorAPI_v1(byte[] a) { + return ConditionalSumB_VectorAPI_V1.compute(a); + } + + private static class ConditionalSumB_VectorAPI_V1 { + // Pick I species to be a full vector, and the B vector a quarter its bit length. + // However, we have to get at least 64bits for the B vector, so at least 256bits + // for the int vector - a sad restriction by the currently very narrow range of + // supported shapes. + private static final int BITS_I = Math.max(256, IntVector.SPECIES_PREFERRED.vectorBitSize()); + private static final int BITS_B = BITS_I / 4; + private static final VectorShape SHAPE_I = VectorShape.forBitSize(BITS_I); + private static final VectorShape SHAPE_B = VectorShape.forBitSize(BITS_B); + private static final VectorSpecies SPECIES_I = SHAPE_I.withLanes(int.class); + private static final VectorSpecies SPECIES_B = SHAPE_B.withLanes(byte.class); + + public static int compute(byte[] a) { + var zeroB = ByteVector.zero(SPECIES_B); + var accI = IntVector.zero(SPECIES_I); + int i; + for (i = 0; i < SPECIES_B.loopBound(a.length); i += SPECIES_B.length()) { + var vB = ByteVector.fromArray(SPECIES_B, a, i); + var maskA = vB.compare(VectorOperators.GE, (byte)'A'); + var maskZ = vB.compare(VectorOperators.LE, (byte)'Z'); + var mask = maskA.and(maskZ); + vB = zeroB.blend(vB, mask); + var vI = vB.castShape(SPECIES_I, 0); + accI = accI.add(vI); + } + int sum = accI.reduceLanes(VectorOperators.ADD); + for (; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + } + + public static int conditionalSumB_VectorAPI_v2(byte[] a) { + return ConditionalSumB_VectorAPI_V2.compute(a); + } + + private static class ConditionalSumB_VectorAPI_V2 { + // Pick B species to be a full vector, and use 4 I vectors of the same bit size. + private static final VectorSpecies SPECIES_B = ByteVector.SPECIES_PREFERRED; + private static final VectorSpecies SPECIES_I = SPECIES_B.vectorShape().withLanes(int.class); + + public static int compute(byte[] a) { + var zeroB = ByteVector.zero(SPECIES_B); + var accI = IntVector.zero(SPECIES_I); + int i; + for (i = 0; i < SPECIES_B.loopBound(a.length); i += SPECIES_B.length()) { + var vB = ByteVector.fromArray(SPECIES_B, a, i); + var maskA = vB.compare(VectorOperators.GE, (byte)'A'); + var maskZ = vB.compare(VectorOperators.LE, (byte)'Z'); + var mask = maskA.and(maskZ); + vB = zeroB.blend(vB, mask); + // When casting byte->int, we get 4x the bits, and split them into 4 parts. + var vI0 = vB.castShape(SPECIES_I, 0); + var vI1 = vB.castShape(SPECIES_I, 1); + var vI2 = vB.castShape(SPECIES_I, 2); + var vI3 = vB.castShape(SPECIES_I, 3); + accI = accI.add(vI0.add(vI1).add(vI2).add(vI3)); + } + int sum = accI.reduceLanes(VectorOperators.ADD); + for (; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + } + + public static float[] pieceWise2FunctionF_loop(float[] a, float[] r) { + for (int i = 0; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } + + public static float[] pieceWise2FunctionF_VectorAPI_v1(float[] a, float[] r) { + int i; + for (i = 0; i < SPECIES_F.loopBound(a.length); i += SPECIES_F.length()) { + var ai = FloatVector.fromArray(SPECIES_F, a, i); + var mask = ai.compare(VectorOperators.LT, 1f); + var a2 = ai.lanewise(VectorOperators.MUL, ai); + var a4 = a2.lanewise(VectorOperators.MUL, a2); + var a8 = a4.lanewise(VectorOperators.MUL, a4); + var s2 = ai.lanewise(VectorOperators.SQRT); + var s4 = s2.lanewise(VectorOperators.SQRT); + var s8 = s4.lanewise(VectorOperators.SQRT); + var v = s8.blend(a8, mask); + v.intoArray(r, i); + } + for (; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } + + public static float[] pieceWise2FunctionF_VectorAPI_v2(float[] a, float[] r) { + int i; + for (i = 0; i < SPECIES_F.loopBound(a.length); i += SPECIES_F.length()) { + var ai = FloatVector.fromArray(SPECIES_F, a, i); + var mask = ai.compare(VectorOperators.LT, 1f); + var a2 = ai.lanewise(VectorOperators.MUL, ai); + var a4 = a2.lanewise(VectorOperators.MUL, a2); + var a8 = a4.lanewise(VectorOperators.MUL, a4); + var v = a8; + // SQRT is expensive, so only call if it necessary + if (!mask.allTrue()) { + var s2 = ai.lanewise(VectorOperators.SQRT); + var s4 = s2.lanewise(VectorOperators.SQRT); + var s8 = s4.lanewise(VectorOperators.SQRT); + v = s8.blend(a8, mask); + } + v.intoArray(r, i); + } + for (; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } } diff --git a/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java b/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java deleted file mode 100644 index f885ef7e462..00000000000 --- a/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2015, 2025, 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 gc.arguments; - -/* - * @test TestNewSizeThreadIncrease - * @bug 8144527 - * @summary Tests argument processing for NewSizeThreadIncrease - * @library /test/lib - * @library / - * @requires vm.gc.Serial - * @requires test.thread.factory == null - * @modules java.base/jdk.internal.misc - * java.management - * @run driver gc.arguments.TestNewSizeThreadIncrease - */ - - -import jdk.test.lib.Platform; -import jdk.test.lib.process.OutputAnalyzer; - -// Range of NewSizeThreadIncrease is 0 ~ max_uintx. -// Total of 5 threads will be created (1 GCTest thread and 4 TestThread). -public class TestNewSizeThreadIncrease { - static final String VALID_VALUE = "2097152"; // 2MB - - // This value will make an overflow of 'thread count * NewSizeThreadIncrease' at DefNewGeneration::compute_new_size(). - // = (max_uintx / 5) + 1, = (18446744073709551615 / 5) + 1 - static String INVALID_VALUE_1 = "3689348814741910324"; - - // This string is contained when compute_new_size() expands or shrinks. - static final String LOG_NEWSIZE_CHANGED = "New generation size "; - - public static void main(String[] args) throws Exception { - if (Platform.is32bit()) { - // (max_uintx / 5) + 1, 4294967295/5 + 1 - INVALID_VALUE_1 = "858993460"; - } - - // New size will be applied as NewSizeThreadIncrease is small enough to expand. - runNewSizeThreadIncreaseTest(VALID_VALUE, true); - - // New size will be ignored as 'thread count * NewSizeThreadIncrease' overflows. - runNewSizeThreadIncreaseTest(INVALID_VALUE_1, false); - } - - static void runNewSizeThreadIncreaseTest(String expectedValue, boolean isNewsizeChanged) throws Exception { - OutputAnalyzer output = GCArguments.executeLimitedTestJava("-XX:+UseSerialGC", - "-Xms96M", - "-Xmx128M", - "-XX:NewRatio=2", - "-Xlog:gc+heap+ergo=debug", - "-XX:NewSizeThreadIncrease="+expectedValue, - GCTest.class.getName()); - - output.shouldHaveExitValue(0); - - if (isNewsizeChanged) { - output.shouldContain(LOG_NEWSIZE_CHANGED); - } else { - output.shouldNotContain(LOG_NEWSIZE_CHANGED); - } - } - - static class GCTest { - - static final int MAX_THREADS_COUNT = 4; - static TestThread threads[] = new TestThread[MAX_THREADS_COUNT]; - - public static void main(String[] args) { - - System.out.println("Creating garbage"); - - for (int i=0; i 8g) + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.bits == "64" & os.maxMemory > 8g * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot * jdk.hotspot.agent/sun.jvm.hotspot.utilities diff --git a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java index ef74dc41846..617bf910108 100644 --- a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java +++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java @@ -218,9 +218,6 @@ public class JVMOptionsUtils { option.addPrepend("-XX:+VerifyBeforeGC"); option.addPrepend("-XX:+VerifyAfterGC"); break; - case "NewSizeThreadIncrease": - option.addPrepend("-XX:+UseSerialGC"); - break; case "SharedBaseAddress": case "SharedSymbolTableBucketSize": option.addPrepend("-XX:+UnlockDiagnosticVMOptions"); diff --git a/test/hotspot/jtreg/serviceability/sa/CDSJMapClstats.java b/test/hotspot/jtreg/serviceability/sa/CDSJMapClstats.java index 4fd202a18da..8a9f148b3be 100644 --- a/test/hotspot/jtreg/serviceability/sa/CDSJMapClstats.java +++ b/test/hotspot/jtreg/serviceability/sa/CDSJMapClstats.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,9 @@ * @test * @bug 8204308 * @summary Test the jhsdb jmap -clstats command with CDS enabled - * @requires vm.hasSA & vm.cds + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.cds * @library /test/lib * @run driver/timeout=2400 CDSJMapClstats */ diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbAttach.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbAttach.java index 57cd535a430..6493a803e90 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbAttach.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbAttach.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8191658 * @summary Test clhsdb attach, detach, reattach commands * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbAttach diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbAttachDifferentJVMs.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbAttachDifferentJVMs.java index 09f90355e67..f6833d5379a 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbAttachDifferentJVMs.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbAttachDifferentJVMs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8314679 * @summary Test clhsdb attach, detach, and then attach to different JVM * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbAttachDifferentJVMs diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSCore.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSCore.java index aa3b19c4fcf..ab5b73bf720 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSCore.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSCore.java @@ -25,8 +25,9 @@ * @test * @bug 8174994 8200613 * @summary Test the clhsdb commands 'printall', 'jstack' on a CDS enabled corefile. - * @requires vm.cds * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.cds * @requires vm.flavor == "server" * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSJstackPrintAll.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSJstackPrintAll.java index 4d01f9a26c8..c1e632782e2 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSJstackPrintAll.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbCDSJstackPrintAll.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,9 @@ * @test * @bug 8174994 * @summary Test the clhsdb commands 'jstack', 'printall', 'where' with CDS enabled - * @requires vm.hasSA & vm.cds + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.cds * @library /test/lib * @run main/othervm/timeout=2400 -Xmx1g ClhsdbCDSJstackPrintAll */ diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbClasses.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbClasses.java index 3193f03bbc7..c4d11d29ec1 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbClasses.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbClasses.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8242142 * @summary Test clhsdb class and classes commands * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbClasses diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpclass.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpclass.java index e45318e201d..49a3eb5615c 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpclass.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpclass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -39,6 +39,7 @@ import jtreg.SkippedException; * @bug 8240990 * @summary Test clhsdb dumpclass command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver ClhsdbDumpclass diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java index d9f856ab0a3..92ec1c5d160 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java @@ -43,6 +43,7 @@ import jtreg.SkippedException; * @bug 8240989 * @summary Test clhsdb dumpheap command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires vm.compMode != "Xcomp" * @comment Running this test with -Xcomp is slow and therefore tends to cause diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbField.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbField.java index 7dc676f1f3a..1df35dccce3 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbField.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbField.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -32,6 +32,7 @@ import jtreg.SkippedException; * @bug 8191538 * @summary Test clhsdb 'field' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbField diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbFindPC.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbFindPC.java index 7ced4c9515b..1997e497af8 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbFindPC.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbFindPC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -35,8 +35,9 @@ import jtreg.SkippedException; * @test id=xcomp-process * @bug 8193124 * @summary Test the clhsdb 'findpc' command with Xcomp on live process - * @requires vm.compMode != "Xcomp" * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.compMode != "Xcomp" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires vm.compiler1.enabled * @requires vm.opt.DeoptimizeALot != true @@ -48,8 +49,9 @@ import jtreg.SkippedException; * @test id=xcomp-core * @bug 8193124 * @summary Test the clhsdb 'findpc' command with Xcomp on core file - * @requires vm.compMode != "Xcomp" * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.compMode != "Xcomp" * @requires vm.compiler1.enabled * @requires vm.opt.DeoptimizeALot != true * @library /test/lib @@ -61,6 +63,7 @@ import jtreg.SkippedException; * @bug 8193124 * @summary Test the clhsdb 'findpc' command w/o Xcomp on live process * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires vm.compiler1.enabled * @library /test/lib @@ -72,6 +75,7 @@ import jtreg.SkippedException; * @bug 8193124 * @summary Test the clhsdb 'findpc' command w/o Xcomp on core file * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires vm.compiler1.enabled * @library /test/lib * @run main/othervm/timeout=1920 ClhsdbFindPC false true diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbFlags.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbFlags.java index a19f3e1ca16..1c8cf7191dd 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbFlags.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbFlags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -36,6 +36,7 @@ import jtreg.SkippedException; * @bug 8217845 * @summary Test clhsdb flags command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver ClhsdbFlags diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbHistory.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbHistory.java index e8416cbadd8..5dabb898936 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbHistory.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbHistory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -36,6 +36,7 @@ import jtreg.SkippedException; * @bug 8217845 * @summary Test clhsdb command line history support * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbHistory diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbInspect.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbInspect.java index 553706e502d..c0c062223d4 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbInspect.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbInspect.java @@ -26,6 +26,7 @@ * @bug 8192985 * @summary Test the clhsdb 'inspect' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=480 ClhsdbInspect diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJdis.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJdis.java index 756e45f68aa..6c0ff0e3dbe 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJdis.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJdis.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,6 +26,7 @@ * @bug 8193124 * @summary Test the clhsdb 'jdis' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbJdis diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java index ef30a97a026..a582b01e832 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -35,6 +35,7 @@ import jtreg.SkippedException; * @bug 8191658 * @summary Test clhsdb jhisto command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbJhisto diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstack.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstack.java index 411664f195d..f066950cfc3 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstack.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb Jstack command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=480 ClhsdbJstack true @@ -44,6 +45,7 @@ import jtreg.SkippedException; * @requires vm.compMode != "Xcomp" * @summary Test clhsdb Jstack command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=480 ClhsdbJstack false diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java index 64080b252c5..e3d586c9d8a 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -26,6 +26,7 @@ * @bug 8324066 * @summary Test the clhsdb 'jstack -l' command for printing concurrent lock information * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbJstackWithConcurrentLock diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java index 4b02c01119d..a24b401dc47 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2019, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,6 +36,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test * @bug 8196969 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires vm.opt.DeoptimizeALot != true * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java index fceb2097e46..7fd3eb23d02 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,6 +26,7 @@ * @bug 8190198 * @summary Test clhsdb longConstant command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbLongConstant diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPmap.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPmap.java index 5c0aa9457ae..885694f7abb 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPmap.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPmap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -35,6 +35,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb pmap command on a live process * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbPmap false @@ -45,6 +46,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb pmap command on a core file * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @run main/othervm/timeout=480 ClhsdbPmap true */ diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java index ac5ddf774e1..a62142c2c5c 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -32,6 +32,7 @@ import jtreg.SkippedException; * @bug 8175384 * @summary Test clhsdb 'printall' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=2400 -Xmx2g ClhsdbPrintAll diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAs.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAs.java index 03ce8cd3048..c7e7e979b6d 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAs.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,6 +26,7 @@ * @bug 8192985 * @summary Test the clhsdb 'printas' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbPrintAs diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java index c6f83c06845..e68e3ca4c47 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb printstatics command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbPrintStatics diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPstack.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPstack.java index 15d88400917..51738be3554 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPstack.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPstack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -35,6 +35,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb pstack command on a live process * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbPstack false @@ -45,6 +46,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb pstack command on a core file * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @run main/othervm/timeout=480 ClhsdbPstack true */ diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbScanOops.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbScanOops.java index 3b2aefec664..89c033f333a 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbScanOops.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbScanOops.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -25,8 +25,8 @@ * @test id=parallel * @bug 8192985 * @summary Test the clhsdb 'scanoops' command - * @requires vm.gc.Parallel * @requires vm.hasSA + * @requires vm.gc.Parallel * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=1200 ClhsdbScanOops UseParallelGC @@ -36,8 +36,8 @@ * @test id=serial * @bug 8192985 * @summary Test the clhsdb 'scanoops' command - * @requires vm.gc.Serial * @requires vm.hasSA + * @requires vm.gc.Serial * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=1200 ClhsdbScanOops UseSerialGC diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java index c66e44aa213..8ec946e3ea1 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -36,6 +36,7 @@ import jtreg.SkippedException; * @bug 8192823 * @summary Test clhsdb source command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbSource diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbSymbol.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbSymbol.java index fe26427d6ce..ca05ba1d33e 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbSymbol.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -33,6 +33,7 @@ import java.util.Map; * @bug 8261095 * @summary Test the clhsdb 'symbol' command on live process * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbSymbol diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbTestAllocationMerge.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbTestAllocationMerge.java index d076e648d90..05054f31c51 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbTestAllocationMerge.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbTestAllocationMerge.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -30,6 +30,7 @@ import jtreg.SkippedException; * @bug 8318682 * @summary Test clhsdb that decoding of AllocationMerge objects in debug info works correctly * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbTestAllocationMerge diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java index f72b51585f5..e9a0b611134 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8193352 * @summary Test clhsdb 'thread' and 'threads' commands * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbThread diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbThreadContext.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbThreadContext.java index 5c3092a139d..c452575b782 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbThreadContext.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbThreadContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @test * @summary Test clhsdb where command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm/timeout=480 ClhsdbThreadContext diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbVmStructsDump.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbVmStructsDump.java index 21db0e867a4..b00138e0c39 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbVmStructsDump.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbVmStructsDump.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -32,6 +32,7 @@ import jtreg.SkippedException; * @bug 8191538 * @summary Test clhsdb 'vmstructsdump' command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbVmStructsDump diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbWhere.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbWhere.java index 4536d568212..971f30fd94f 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbWhere.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbWhere.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @bug 8190198 * @summary Test clhsdb where command * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm ClhsdbWhere diff --git a/test/hotspot/jtreg/serviceability/sa/DeadlockDetectionTest.java b/test/hotspot/jtreg/serviceability/sa/DeadlockDetectionTest.java index cf9c4dfc5a1..ada0003fba5 100644 --- a/test/hotspot/jtreg/serviceability/sa/DeadlockDetectionTest.java +++ b/test/hotspot/jtreg/serviceability/sa/DeadlockDetectionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -25,6 +25,7 @@ * @test * @summary Test deadlock detection * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java b/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java index 75942f7113a..a13106b1401 100644 --- a/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java +++ b/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -30,6 +30,7 @@ import jdk.test.lib.Utils; /** * @test * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver JhsdbThreadInfoTest diff --git a/test/hotspot/jtreg/serviceability/sa/TestClassDump.java b/test/hotspot/jtreg/serviceability/sa/TestClassDump.java index c163d45e0ba..c415332291e 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestClassDump.java +++ b/test/hotspot/jtreg/serviceability/sa/TestClassDump.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -37,6 +37,7 @@ import jtreg.SkippedException; * @bug 8184982 * @summary Test ClassDump tool * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver TestClassDump diff --git a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java index a0a1051beca..8524b4cd489 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,6 +33,7 @@ import jtreg.SkippedException; * @test * @bug 8185796 8335743 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm TestClhsdbJstackLock diff --git a/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java b/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java index b1f2148954c..2d6c208164a 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java +++ b/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -46,6 +46,7 @@ import jdk.test.lib.Utils; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestDebugInfoDecode.java b/test/hotspot/jtreg/serviceability/sa/TestDebugInfoDecode.java index eb59f6f9487..3d808da683d 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestDebugInfoDecode.java +++ b/test/hotspot/jtreg/serviceability/sa/TestDebugInfoDecode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -38,6 +38,7 @@ import jdk.test.lib.SA.SATestUtils; * @bug 8318682 * @summary Test decoding debug info for all nmethods in the code cache * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @modules jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java b/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java index 3bbb6fcdf35..c8efec888ca 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java +++ b/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -45,6 +45,7 @@ import jdk.test.lib.Utils; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java b/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java index 418dc5ec5a0..8ed476a0a1f 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java +++ b/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -37,6 +37,7 @@ import jdk.test.lib.hprof.HprofParser; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSize.java b/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSize.java index 3dbfbecda73..d1ed4729d39 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSize.java +++ b/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -46,6 +46,7 @@ import java.util.*; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java b/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java index a462ee30fb2..fd192212bc4 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java +++ b/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -42,6 +42,7 @@ import jdk.test.lib.Utils; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/sa/TestIntConstant.java b/test/hotspot/jtreg/serviceability/sa/TestIntConstant.java index 2b41394b7a5..23e64452652 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestIntConstant.java +++ b/test/hotspot/jtreg/serviceability/sa/TestIntConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -34,6 +34,7 @@ import jtreg.SkippedException; * @summary Test the 'intConstant' command of jhsdb clhsdb. * @bug 8190307 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm TestIntConstant diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLineNumbers.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLineNumbers.java index 15b9aa9ccae..936532527d4 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLineNumbers.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLineNumbers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -37,6 +37,7 @@ import jdk.test.lib.SA.SATestUtils; * @test * @bug 8214226 8243500 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires os.arch=="amd64" | os.arch=="x86_64" * @requires os.family=="windows" | os.family == "linux" | os.family == "mac" * @requires vm.flagless diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java index ac536523815..c9c85b3d25f 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -31,6 +31,7 @@ import jdk.test.lib.Utils; * @test * @bug 8185796 8335743 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver TestJhsdbJstackLock diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java index e90418b1030..e3808aa6706 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java @@ -37,7 +37,9 @@ import jdk.test.lib.process.OutputAnalyzer; * @test * @key randomness * @bug 8208091 8374469 8377710 - * @requires (os.family == "linux" | os.family == "windows") & (vm.hasSA) + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires (os.family == "linux" | os.family == "windows") * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver TestJhsdbJstackMixed diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedCore.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedCore.java index 84a62eb65e5..99232ed9813 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedCore.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedCore.java @@ -38,7 +38,9 @@ import jtreg.SkippedException; /** * @test * @bug 8374482 8376264 8376284 8377395 - * @requires (os.family == "linux") & (vm.hasSA) + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires os.family == "linux" * @requires os.arch == "amd64" * @library /test/lib * @run driver TestJhsdbJstackMixedCore diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithVDSOCallCore.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithVDSOCallCore.java index 84da46e272f..de512b93121 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithVDSOCallCore.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithVDSOCallCore.java @@ -38,7 +38,9 @@ import jdk.test.lib.util.CoreUtils; /** * @test * @bug 8376269 - * @requires (os.family == "linux") & (vm.hasSA) + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires os.family == "linux" * @requires os.arch == "amd64" * @library /test/lib * @run driver TestJhsdbJstackMixedWithVDSOCallCore diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithXComp.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithXComp.java index a26fc4532df..1ebf6c21a70 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithXComp.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixedWithXComp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2025, NTT DATA * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,6 +36,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test id=xcomp * @bug 8370176 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires os.family == "linux" * @requires os.arch == "amd64" * @library /test/lib @@ -46,6 +47,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test id=xcomp-preserve-frame-pointer * @bug 8370176 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires os.family == "linux" * @requires os.arch == "amd64" * @library /test/lib @@ -56,6 +58,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test id=xcomp-disable-tiered-compilation * @bug 8370176 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires os.family == "linux" * @requires os.arch == "amd64" * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackPrintVMLocks.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackPrintVMLocks.java index b7b3c956441..f6580d71e05 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackPrintVMLocks.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackPrintVMLocks.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -31,6 +31,7 @@ import jtreg.SkippedException; * @test * @summary Test verifies that jstack --mixed prints information about VM locks * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @build jdk.test.whitebox.WhiteBox diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackUpcall.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackUpcall.java index 1873672d2ce..e91910c3411 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackUpcall.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackUpcall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -31,6 +31,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test * @bug 8339307 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver TestJhsdbJstackUpcall diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java index 39b6e1ed609..55751c330b5 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2025, NTT DATA * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -37,6 +37,7 @@ import jdk.test.lib.process.OutputAnalyzer; * @test * @bug 8369505 * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @run driver TestJhsdbJstackWithVirtualThread */ diff --git a/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java b/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java index 77258bd45b7..024b5e03c98 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,6 +25,7 @@ * @test TestJmapCore * @summary Test verifies that jhsdb jmap could generate heap dump from core when heap is full * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires !vm.asan * @library /test/lib * @run driver/timeout=480 TestJmapCore run heap diff --git a/test/hotspot/jtreg/serviceability/sa/TestJmapCoreMetaspace.java b/test/hotspot/jtreg/serviceability/sa/TestJmapCoreMetaspace.java index ec3c66476a6..372cd0246ac 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJmapCoreMetaspace.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJmapCoreMetaspace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,6 +25,7 @@ * @test TestJmapCoreMetaspace * @summary Test verifies that jhsdb jmap could generate heap dump from core when metaspace is full * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires !vm.asan * @library /test/lib * @run driver/timeout=480 TestJmapCore run metaspace diff --git a/test/hotspot/jtreg/serviceability/sa/TestObjectAlignment.java b/test/hotspot/jtreg/serviceability/sa/TestObjectAlignment.java index 62fe2f5d7aa..081dbe1206c 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestObjectAlignment.java +++ b/test/hotspot/jtreg/serviceability/sa/TestObjectAlignment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -38,7 +38,9 @@ import jdk.test.lib.Utils; /** * @test * @library /test/lib - * @requires vm.hasSA & vm.bits == "64" + * @requires vm.hasSA + * @requires vm.gc != "Z" + * @requires vm.bits == "64" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules jdk.hotspot.agent/sun.jvm.hotspot * jdk.hotspot.agent/sun.jvm.hotspot.runtime diff --git a/test/hotspot/jtreg/serviceability/sa/TestObjectMonitorIterate.java b/test/hotspot/jtreg/serviceability/sa/TestObjectMonitorIterate.java index 86a00285ee4..0448cc0788a 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestObjectMonitorIterate.java +++ b/test/hotspot/jtreg/serviceability/sa/TestObjectMonitorIterate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -38,6 +38,7 @@ import jdk.test.lib.SA.SATestUtils; * @bug 8259008 * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules jdk.hotspot.agent/sun.jvm.hotspot * jdk.hotspot.agent/sun.jvm.hotspot.oops diff --git a/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java b/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java index 315c931d49e..8c5ce3ae3cd 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java +++ b/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -41,6 +41,7 @@ import jdk.test.lib.Utils; * @test * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot * jdk.hotspot.agent/sun.jvm.hotspot.utilities diff --git a/test/hotspot/jtreg/serviceability/sa/TestSysProps.java b/test/hotspot/jtreg/serviceability/sa/TestSysProps.java index a591d009ecf..a2617f7f268 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestSysProps.java +++ b/test/hotspot/jtreg/serviceability/sa/TestSysProps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -37,6 +37,7 @@ import jdk.test.lib.SA.SATestUtils; * @bug 8242165 8242162 * @summary Test "jhsdb jinfo --sysprops", "jinfo -sysprops", and clhsdb "sysprops" commands * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run driver TestSysProps diff --git a/test/hotspot/jtreg/serviceability/sa/TestType.java b/test/hotspot/jtreg/serviceability/sa/TestType.java index c3326032b90..e5b90a3c2a9 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestType.java +++ b/test/hotspot/jtreg/serviceability/sa/TestType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -34,6 +34,7 @@ import jtreg.SkippedException; * @summary Test the 'type' command of jhsdb clhsdb. * @bug 8190307 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib * @run main/othervm TestType diff --git a/test/hotspot/jtreg/serviceability/sa/UniqueVtableTest.java b/test/hotspot/jtreg/serviceability/sa/UniqueVtableTest.java index 774fcee50ed..7792ec1a003 100644 --- a/test/hotspot/jtreg/serviceability/sa/UniqueVtableTest.java +++ b/test/hotspot/jtreg/serviceability/sa/UniqueVtableTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -26,6 +26,7 @@ * * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @modules jdk.hotspot.agent/sun.jvm.hotspot * jdk.hotspot.agent/sun.jvm.hotspot.debugger diff --git a/test/hotspot/jtreg/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java b/test/hotspot/jtreg/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java index a41ab71f4fa..6a7c519fedf 100644 --- a/test/hotspot/jtreg/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java +++ b/test/hotspot/jtreg/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -42,6 +42,7 @@ import jdk.test.lib.SA.SATestUtils; * @test * @bug 6313383 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @summary Regression test for hprof export issue due to large heaps (>2G) * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbAttachToDebugServer.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbAttachToDebugServer.java index 57962e72c5c..ab211b70691 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbAttachToDebugServer.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbAttachToDebugServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,6 +36,7 @@ import jtreg.SkippedException; * @bug 8262520 * @summary Test clhsdb connect, detach, reattach commands * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbTestConnectArgument.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbTestConnectArgument.java index 109afa21841..2e07dfa63f0 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbTestConnectArgument.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/ClhsdbTestConnectArgument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -35,6 +35,7 @@ import jtreg.SkippedException; * @test * @bug 8263342 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdConnectTest.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdConnectTest.java index 285f57f8115..7576aa54bf0 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdConnectTest.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdConnectTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -26,6 +26,7 @@ * @bug 8209790 * @summary Checks ability for connecting to debug server (jstack, jmap, jinfo, jsnap) * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/DisableRegistryTest.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/DisableRegistryTest.java index ae0774988a8..312e99c172c 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/DisableRegistryTest.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/DisableRegistryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,6 +36,7 @@ import jtreg.SkippedException; * @bug 8263636 8263635 * @summary Test to use already started RMI registry * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/PmapOnDebugdTest.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/PmapOnDebugdTest.java index b1665634fb0..c27989e20ca 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/PmapOnDebugdTest.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/PmapOnDebugdTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -34,6 +34,7 @@ import jtreg.SkippedException; * @test * @bug 8263670 * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires (os.family != "windows") & (os.family != "mac") * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/RunCommandOnServerTest.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/RunCommandOnServerTest.java index 9e725561341..5905d558c55 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/RunCommandOnServerTest.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/RunCommandOnServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 NTT DATA. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -37,6 +37,7 @@ import jtreg.SkippedException; * @bug 8265505 * @summary Test clhsdb command which should be run on debugd server * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @library /test/lib diff --git a/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java b/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java index 69f4c9eb454..166e45cc3b7 100644 --- a/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java +++ b/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -27,6 +27,7 @@ * @summary Checks that the jshdb debugd utility successfully starts * and tries to attach to a running process * @requires vm.hasSA + * @requires vm.gc != "Z" * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires os.family != "windows" * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java index 11694f72837..d9facb13078 100644 --- a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java +++ b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -319,6 +319,7 @@ public class CtwRunner { "-XX:+StressGCM", "-XX:+StressIGVN", "-XX:+StressCCP", + "-XX:+StressLoopPeeling", "-XX:+StressMacroExpansion", "-XX:+StressMacroElimination", "-XX:+StressIncrementalInlining", diff --git a/test/jaxp/TEST.ROOT b/test/jaxp/TEST.ROOT index aff3b769830..ddf29839e20 100644 --- a/test/jaxp/TEST.ROOT +++ b/test/jaxp/TEST.ROOT @@ -29,8 +29,3 @@ requiredVersion=8.2.1+1 # does not need ../../ notation to reach them external.lib.roots = ../../ -# Use new module options -useNewOptions=true - -# Use --patch-module instead of -Xmodule: -useNewPatchModule=true diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java index 0447270d99a..c88827c1a39 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java @@ -23,18 +23,20 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.CatalogReferCircularityTest + * @run junit/othervm catalog.CatalogReferCircularityTest * @summary Via nextCatalog entry, the catalog reference chain may be * a (partial) closed circuit. For instance, a catalog may use itself * as an additional catalog specified in its own nextCatalog entry. @@ -42,22 +44,19 @@ import org.testng.annotations.Test; */ public class CatalogReferCircularityTest { - @Test(dataProvider = "catalogName", - expectedExceptions = CatalogException.class) + @ParameterizedTest + @ValueSource(strings={ + // This catalog defines itself as next catalog. + "catalogReferCircle-itself.xml", + + // This catalog defines catalogReferCircle-right.xml as its next + // catalog. And catalogReferCircle-right.xml also defines + // catalogReferCircle-left.xml as its next catalog, too. + "catalogReferCircle-left.xml" }) public void testReferCircularity(String catalogFile) { - catalogResolver(catalogFile).resolveEntity(null, - "http://remote/dtd/ghost/docGhost.dtd"); - } - - @DataProvider(name = "catalogName") - public Object[][] catalogName() { - return new Object[][] { - // This catalog defines itself as next catalog. - { "catalogReferCircle-itself.xml" }, - - // This catalog defines catalogReferCircle-right.xml as its next - // catalog. And catalogReferCircle-right.xml also defines - // catalogReferCircle-left.xml as its next catalog, too. - { "catalogReferCircle-left.xml" } }; + CatalogResolver resolver = catalogResolver(catalogFile); + Assertions.assertThrows( + CatalogException.class, + () -> resolver.resolveEntity(null, "http://remote/dtd/ghost/docGhost.dtd")); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java index d76b56d7510..f17aa04ac76 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java @@ -23,42 +23,30 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogFeatures.Feature; -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.DefaultFeaturesTest + * @run junit/othervm catalog.DefaultFeaturesTest * @summary This case tests if the default feature values are expected. */ public class DefaultFeaturesTest { - - private CatalogFeatures defaultFeature; - - @BeforeClass - public void init() { - defaultFeature = CatalogFeatures.defaults(); - } - - @Test(dataProvider="feature-value") + @ParameterizedTest + @MethodSource("defaultFeaturesData") public void testDefaultFeatures(Feature feature, String expected) { - String featureValue = defaultFeature.get(feature); - if (expected != null) { - Assert.assertEquals(featureValue, expected); - } else { - Assert.assertNull(featureValue); - } + CatalogFeatures defaultFeature = CatalogFeatures.defaults(); + assertEquals(expected, defaultFeature.get(feature)); } - @DataProvider(name = "feature-value") - public Object[][] data() { + public static Object[][] defaultFeaturesData() { return new Object[][] { { Feature.FILES, null }, { Feature.PREFER, CatalogTestUtils.PREFER_PUBLIC }, diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java index 2d5771557ad..36335cb586d 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java @@ -23,42 +23,43 @@ package catalog; -import static catalog.CatalogTestUtils.DEFER_FALSE; -import static catalog.CatalogTestUtils.DEFER_TRUE; -import static catalog.CatalogTestUtils.getCatalogPath; -import static javax.xml.catalog.CatalogFeatures.Feature.DEFER; - -import java.lang.reflect.Method; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.Catalog; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogManager; import javax.xml.catalog.CatalogResolver; +import java.lang.reflect.Method; -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.DEFER_FALSE; +import static catalog.CatalogTestUtils.DEFER_TRUE; +import static catalog.CatalogTestUtils.getCatalogPath; +import static javax.xml.catalog.CatalogFeatures.Feature.DEFER; +import static org.junit.jupiter.api.Assertions.assertEquals; /* * @test * @bug 8077931 8176405 * @library /javax/xml/jaxp/libs * @modules java.xml/javax.xml.catalog:open - * @run testng/othervm catalog.DeferFeatureTest + * @run junit/othervm catalog.DeferFeatureTest * @summary This case tests whether the catalogs specified in delegateSystem, * delegatePublic, delegateURI and nextCatalog entries are used lazily * in resolution via defer feature. */ public class DeferFeatureTest { - @Test(dataProvider = "catalog-countOfLoadedCatalogFile") + @ParameterizedTest + @MethodSource("deferData") public void testDeferFeature(Catalog catalog, int catalogCount) throws Exception { - Assert.assertEquals(loadedCatalogCount(catalog), catalogCount); + assertEquals(catalogCount, loadedCatalogCount(catalog)); } - @Test(dataProvider = "testDeferFeatureByResolve") + @ParameterizedTest + @MethodSource("deferByResolveData") public void testDeferFeatureByResolve(Catalog catalog, int catalogCount) throws Exception { CatalogResolver cr = createResolver(catalog); @@ -67,41 +68,39 @@ public class DeferFeatureTest { cr.resolveEntity("-//REMOTE//DTD ALICE DOCALICE", "http://remote/dtd/alice/"); } catch (CatalogException ce) {} - Assert.assertEquals(loadedCatalogCount(catalog), catalogCount); + assertEquals(catalogCount, loadedCatalogCount(catalog)); } - @DataProvider(name = "catalog-countOfLoadedCatalogFile") - public Object[][] data() { - return new Object[][]{ - // By default, alternative catalogs are not loaded. - {createCatalog(CatalogFeatures.defaults()), 1}, - // Alternative catalogs are not loaded when DEFER is set to true. - {createCatalog(createDeferFeature(DEFER_TRUE)), 1}, - // The 3 alternative catalogs are pre-loaded along with the parent - //when DEFER is set to false. - {createCatalog(createDeferFeature(DEFER_FALSE)), 4}}; + public static Object[][] deferData() { + return new Object[][] { + // By default, alternative catalogs are not loaded. + { createCatalog(CatalogFeatures.defaults()), 1 }, + // Alternative catalogs are not loaded when DEFER is set to true. + { createCatalog(createDeferFeature(DEFER_TRUE)), 1 }, + // The 3 alternative catalogs are pre-loaded along with the parent + //when DEFER is set to false. + { createCatalog(createDeferFeature(DEFER_FALSE)), 4 } }; } - @DataProvider(name = "testDeferFeatureByResolve") - public Object[][] getData() { - return new Object[][]{ - {createCatalog(createDeferFeature(DEFER_TRUE)), 4} + public static Object[][] deferByResolveData() { + return new Object[][] { + { createCatalog(createDeferFeature(DEFER_TRUE)), 4 } }; } - private CatalogFeatures createDeferFeature(String defer) { + private static CatalogFeatures createDeferFeature(String defer) { return CatalogFeatures.builder().with(DEFER, defer).build(); } - private Catalog createCatalog(CatalogFeatures feature) { + private static Catalog createCatalog(CatalogFeatures feature) { return CatalogManager.catalog(feature, getCatalogPath("deferFeature.xml")); } - private CatalogResolver createResolver(Catalog catalog) { + private static CatalogResolver createResolver(Catalog catalog) { return CatalogManager.catalogResolver(catalog); } - private int loadedCatalogCount(Catalog catalog) throws Exception { + private static int loadedCatalogCount(Catalog catalog) throws Exception { Method method = catalog.getClass().getDeclaredMethod("loadedCatalogCount"); method.setAccessible(true); return (int) method.invoke(catalog); diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java index 43c6bf42f44..579140825c2 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java @@ -23,32 +23,32 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkPubIdResolution; -import static catalog.ResolutionChecker.expectExceptionOnPubId; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkPubIdResolution; +import static catalog.ResolutionChecker.expectExceptionOnPubId; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.DelegatePublicTest + * @run junit/othervm catalog.DelegatePublicTest * @summary Get matched URIs from DelegatePublic entries. */ public class DelegatePublicTest { - @Test(dataProvider = "publicId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String publicId, String matchedUri) { checkPubIdResolution(createResolver(), publicId, matchedUri); } - @DataProvider(name = "publicId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified public id is defined in // a delegate catalog file of the current catalog file. @@ -71,15 +71,15 @@ public class DelegatePublicTest { "http://local/base/dtd/carl/docCarlPub.dtd" } }; } - @Test(dataProvider = "publicId-expectedExceptionClass") + @ParameterizedTest + @MethodSource("dataOnException") public void testException(String publicId, Class expectedExceptionClass) { expectExceptionOnPubId(createResolver(), publicId, expectedExceptionClass); } - @DataProvider(name = "publicId-expectedExceptionClass") - public Object[][] dataOnException() { + public static Object[][] dataOnException() { return new Object[][] { // The matched delegatePublic entry of the specified public id // defines a non-existing delegate catalog file. That should @@ -93,7 +93,7 @@ public class DelegatePublicTest { CatalogException.class } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("delegatePublic.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java index 554d23776f9..27da1105b2c 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java @@ -23,32 +23,32 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkSysIdResolution; -import static catalog.ResolutionChecker.expectExceptionOnSysId; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkSysIdResolution; +import static catalog.ResolutionChecker.expectExceptionOnSysId; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.DelegateSystemTest + * @run junit/othervm catalog.DelegateSystemTest * @summary Get matched URIs from delegateSystem entries. */ public class DelegateSystemTest { - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkSysIdResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified system id is defined in // a delegate catalog file of the current catalog file. @@ -71,15 +71,15 @@ public class DelegateSystemTest { "http://local/base/dtd/carl/docCarlDS.dtd"} }; } - @Test(dataProvider = "systemId-expectedExceptionClass") + @ParameterizedTest + @MethodSource("dataOnException") public void testException(String systemId, Class expectedExceptionClass) { expectExceptionOnSysId(createResolver(), systemId, expectedExceptionClass); } - @DataProvider(name = "systemId-expectedExceptionClass") - public Object[][] dataOnException() { + public static Object[][] dataOnException() { return new Object[][] { // The matched delegateSystem entry of the specified system id // defines a non-existing delegate catalog file. That should @@ -93,7 +93,7 @@ public class DelegateSystemTest { CatalogException.class } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("delegateSystem.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateUriTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateUriTest.java index 2a92149a730..0175a99f938 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateUriTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/DelegateUriTest.java @@ -23,32 +23,32 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkUriResolution; import static catalog.ResolutionChecker.expectExceptionOnUri; -import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogException; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.DelegateUriTest + * @run junit/othervm catalog.DelegateUriTest * @summary Get matched URIs from delegateURI entries. */ public class DelegateUriTest { - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String uri, String matchedUri) { checkUriResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] data() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified URI reference is defined in // a delegate catalog file of the current catalog file. @@ -71,14 +71,14 @@ public class DelegateUriTest { "http://local/base/dtd/carl/docCarlDU.dtd"} }; } - @Test(dataProvider = "uri-expectedExceptionClass") + @ParameterizedTest + @MethodSource("dataOnException") public void testException(String uri, Class expectedExceptionClass) { expectExceptionOnUri(createResolver(), uri, expectedExceptionClass); } - @DataProvider(name = "uri-expectedExceptionClass") - public Object[][] dataOnException() { + public static Object[][] dataOnException() { return new Object[][] { // The matched delegateURI entry of the specified URI reference // defines a non-existing delegate catalog file. That should @@ -92,7 +92,7 @@ public class DelegateUriTest { CatalogException.class } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogUriResolver("delegateUri.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/GroupTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/GroupTest.java index 7516be7d560..37910c2b1f5 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/GroupTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/GroupTest.java @@ -23,22 +23,22 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogResolver; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkPubIdResolution; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.GroupTest + * @run junit/othervm catalog.GroupTest * @summary Get matched URIs from system, public and uri entries respectively, * and some of the entries are enclosed by group entries. */ @@ -46,13 +46,13 @@ public class GroupTest { private static final String CATALOG_GROUP = "group.xml"; - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataMatchSysId") public void testMatchOnSysId(String uri, String matchedUri) { checkSysIdResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnSysId() { + public static Object[][] dataMatchSysId() { return new Object[][] { // The matched URI of the specified system id is enclosed by a // group entry. @@ -72,13 +72,13 @@ public class GroupTest { "http://local/base/dtd/docCarlSys1.dtd" } }; } - @Test(dataProvider = "publicId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatchPubId") public void testMatchOnPubId(String uri, String matchedUri) { checkPubIdResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "publicId-matchedUri") - public Object[][] dataOnPubId() { + public static Object[][] dataOnMatchPubId() { return new Object[][] { // The matched URI of the specified public id is enclosed by a // group entry. @@ -98,13 +98,13 @@ public class GroupTest { "http://local/base/dtd/docCarlPub1.dtd" } }; } - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatchUri") public void testMatchOnUri(String uri, String matchedUri) { checkUriResolution(catalogUriResolver(CATALOG_GROUP), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnUri() { + public static Object[][] dataOnMatchUri() { return new Object[][] { // The matched URI of the specified URI reference is enclosed by // a group entry. @@ -124,7 +124,7 @@ public class GroupTest { "http://local/base/dtd/docAliceURI.dtd" } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver(CATALOG_GROUP); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java index 6a5248b8f9f..481c2fa1f83 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java @@ -23,6 +23,12 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.CATALOG_PUBLIC; import static catalog.CatalogTestUtils.CATALOG_SYSTEM; import static catalog.CatalogTestUtils.CATALOG_URI; @@ -30,18 +36,13 @@ import static catalog.CatalogTestUtils.catalogResolver; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.LoadCatalogTest + * @run junit/othervm catalog.LoadCatalogTest * @summary When catalog resolver loads catalog files, the current catalog file * and the catalog files specified by the nextCatalog entries may not * accessible. This case tests how does the resolver handle this issue. @@ -55,14 +56,14 @@ public class LoadCatalogTest { private static final String ID_ALICE_URI = "http://remote/dtd/uri/alice/docAlice.dtd"; private static final String ID_DUMMY = "http://remote/dtd/doc.dtd"; - @Test(dataProvider = "entityResolver") + @ParameterizedTest + @MethodSource("entityResolver") public void testMatchOnEntityResolver(CatalogResolver resolver) { checkSysIdResolution(resolver, ID_ALICE, "http://local/dtd/docAliceSys.dtd"); } - @DataProvider(name = "entityResolver") - public Object[][] entityResolver() { + public static Object[][] entityResolver() { return new Object[][] { // This EntityResolver loads multiple catalog files one by one. // All of the files are available. @@ -75,14 +76,14 @@ public class LoadCatalogTest { CATALOG_SYSTEM) } }; } - @Test(dataProvider = "uriResolver") + @ParameterizedTest + @MethodSource("uriResolver") public void testMatchOnUriResolver(CatalogResolver resolver) { checkUriResolution(resolver, ID_ALICE_URI, "http://local/dtd/docAliceURI.dtd"); } - @DataProvider(name = "uriResolver") - public Object[][] uriResolver() { + public static Object[][] uriResolver() { return new Object[][] { // This URIResolver loads multiple catalog files one by one. // All of the files are available. @@ -95,20 +96,21 @@ public class LoadCatalogTest { CATALOG_URI) } }; } - @Test(dataProvider = "catalogName", - expectedExceptions = CatalogException.class) - public void testExceptionOnEntityResolver(String[] catalogName) { - catalogResolver(catalogName).resolveEntity(null, ID_DUMMY); + @ParameterizedTest + @MethodSource("catalogName") + public void testException(String[] catalogName) { + CatalogResolver resolver = catalogResolver(catalogName); + assertThrows(CatalogException.class, () -> resolver.resolveEntity(null, ID_DUMMY)); } - @Test(dataProvider = "catalogName", - expectedExceptions = CatalogException.class) + @ParameterizedTest + @MethodSource("catalogName") public void testExceptionOnUriResolver(String[] catalogName) { - catalogUriResolver(catalogName).resolve(ID_DUMMY, null); + CatalogResolver resolver = catalogUriResolver(catalogName); + assertThrows(CatalogException.class, () -> resolver.resolve(ID_DUMMY, null)); } - @DataProvider(name = "catalogName") - public Object[][] catalogName() { + public static Object[][] catalogName() { return new Object[][] { // This catalog file set includes null catalog files. { (String[]) null }, diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/NextCatalogTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/NextCatalogTest.java index d7e0711636d..ff56b86a500 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/NextCatalogTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/NextCatalogTest.java @@ -23,22 +23,22 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogResolver; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkPubIdResolution; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.NextCatalogTest + * @run junit/othervm catalog.NextCatalogTest * @summary Get matched URIs from system, public and uri entries respectively, * but some of the entries are defined in none-current catalog files. */ @@ -49,13 +49,13 @@ public class NextCatalogTest { private static final String CATALOG_NEXTCATALOGRIGHT = "nextCatalog-right.xml"; - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnSysId") public void testNextCatalogOnSysId(String sytemId, String matchedUri) { checkSysIdResolution(createEntityResolver(), sytemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnSysId() { + public static Object[][] dataOnSysId() { return new Object[][] { // This matched URI of the specified system id is defined in a // next catalog file. @@ -81,13 +81,13 @@ public class NextCatalogTest { "http://local/base/dtd/docDuplicateLeftSys.dtd" } }; } - @Test(dataProvider = "publicId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnPubId") public void testNextCatalogOnPubId(String publicId, String matchedUri) { checkPubIdResolution(createEntityResolver(), publicId, matchedUri); } - @DataProvider(name = "publicId-matchedUri") - public Object[][] dataOnPubId() { + public static Object[][] dataOnPubId() { return new Object[][] { // This matched URI of the specified public id is defined in a // next catalog file. @@ -113,13 +113,13 @@ public class NextCatalogTest { "http://local/base/dtd/docDuplicateLeftPub.dtd" } }; } - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnUri") public void testNextCatalogOnUri(String uri, String matchedUri) { checkUriResolution(createUriResolver(), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnUri() { + public static Object[][] dataOnUri() { return new Object[][] { // This matched URI of the specified URI reference is defined in // a next catalog file. @@ -145,12 +145,12 @@ public class NextCatalogTest { "http://local/base/dtd/docDuplicateLeftURI.dtd" } }; } - private CatalogResolver createEntityResolver() { + private static CatalogResolver createEntityResolver() { return catalogResolver(CATALOG_NEXTCATALOGLEFT, CATALOG_NEXTCATALOGRIGHT); } - private CatalogResolver createUriResolver() { + private static CatalogResolver createUriResolver() { return catalogUriResolver(CATALOG_NEXTCATALOGLEFT, CATALOG_NEXTCATALOGRIGHT); } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/NormalizationTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/NormalizationTest.java index 74fc25e90c1..0a112fd7426 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/NormalizationTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/NormalizationTest.java @@ -23,22 +23,22 @@ package catalog; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogResolver; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkPubIdResolution; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.NormalizationTest + * @run junit/othervm catalog.NormalizationTest * @summary Before matching identifiers and URI references, it has to normalize * the passed identifiers and URI references. And then the catalog * resolver uses the normalized stuff to search the counterparts in @@ -48,23 +48,25 @@ public class NormalizationTest { private static final String CATALOG_NORMALIZATION = "normalization.xml"; - @Test(dataProvider = "systemId_uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnSysIdAndUri") public void testNormalizationOnSysId(String sytemId, String matchedUri) { checkSysIdResolution(createEntityResolver(), sytemId, matchedUri); } - @Test(dataProvider = "publicId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnPubId") public void testNormalizationOnPubId(String publicId, String matchedUri) { checkPubIdResolution(createEntityResolver(), publicId, matchedUri); } - @Test(dataProvider = "systemId_uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnSysIdAndUri") public void testNormalizationOnUri(String uri, String matchedUri) { checkUriResolution(createUriResolver(), uri, matchedUri); } - @DataProvider(name = "systemId_uri-matchedUri") - public Object[][] dataOnSysIdAndUri() { + public static Object[][] dataOnSysIdAndUri() { return new Object[][] { // The specified system id/URI reference contains spaces. And // the counterparts in system/uri entries also contain spaces. @@ -85,8 +87,7 @@ public class NormalizationTest { "http://local/base/dtd/docBobSys.dtd" } }; } - @DataProvider(name = "publicId-matchedUri") - public Object[][] dataOnPubId() { + public static Object[][] dataOnPubId() { return new Object[][] { // The specified public id contains spaces. And the counterparts // in public entry also contains spaces. @@ -103,11 +104,11 @@ public class NormalizationTest { "http://local/base/dtd/docBobPub.dtd" } }; } - private CatalogResolver createEntityResolver() { + private static CatalogResolver createEntityResolver() { return catalogResolver(CATALOG_NORMALIZATION); } - private CatalogResolver createUriResolver() { + private static CatalogResolver createUriResolver() { return catalogUriResolver(CATALOG_NORMALIZATION); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java index 85cb2505244..4f9cfcd1f82 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java @@ -23,38 +23,38 @@ package catalog; -import static catalog.CatalogTestUtils.PREFER_PUBLIC; -import static catalog.CatalogTestUtils.PREFER_SYSTEM; -import static catalog.CatalogTestUtils.catalogResolver; -import static javax.xml.catalog.CatalogFeatures.Feature.PREFER; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.PREFER_PUBLIC; +import static catalog.CatalogTestUtils.PREFER_SYSTEM; +import static catalog.CatalogTestUtils.catalogResolver; +import static javax.xml.catalog.CatalogFeatures.Feature.PREFER; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.PreferFeatureTest + * @run junit/othervm catalog.PreferFeatureTest * @summary This case tests how does the feature affect the catalog resolution, * and tests the priority between this feature and attribute prefer * in catalog file. */ public class PreferFeatureTest { - @Test(dataProvider = "prefer-publicId-systemId", - expectedExceptions = CatalogException.class) - public void testPreferFeature(String prefer, String systemId, - String publicId) { - createResolver(prefer).resolveEntity(systemId, publicId); + @ParameterizedTest + @MethodSource("data") + public void testPreferFeature(String prefer, String systemId, String publicId) { + CatalogResolver resolver = createResolver(prefer); + assertThrows(CatalogException.class, () -> resolver.resolveEntity(systemId, publicId)); } - @DataProvider(name = "prefer-publicId-systemId") - public Object[][] data() { + public static Object[][] data() { return new Object[][] { // The feature prefer is system. There's a match for the // specified public id, and no match for the specified system id. @@ -72,7 +72,7 @@ public class PreferFeatureTest { "http://remote/dtd/bob/docBobDummy.dtd"} }; } - private CatalogResolver createResolver(String prefer) { + private static CatalogResolver createResolver(String prefer) { return catalogResolver( CatalogFeatures.builder().with(PREFER, prefer).build(), "preferFeature.xml"); diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/PreferTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/PreferTest.java index 6bcbd140466..c358ff85c62 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/PreferTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/PreferTest.java @@ -23,19 +23,19 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkExtIdResolution; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkExtIdResolution; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.PreferTest + * @run junit/othervm catalog.PreferTest * @summary Get matched URIs from system and public family entries, which * specify the prefer attribute. It tests how does the prefer attribute * affect the resolution procedure. The test rule is based on OASIS @@ -43,14 +43,14 @@ import org.testng.annotations.Test; */ public class PreferTest { - @Test(dataProvider = "publicId-systemId-matchedUri") + @ParameterizedTest + @MethodSource("data") public void testPrefer(String publicId, String systemId, String expected) { checkExtIdResolution(createResolver(), publicId, systemId, expected); } - @DataProvider(name = "publicId-systemId-matchedUri") - public Object[][] data() { + public static Object[][] data() { return new Object[][] { // The prefer attribute is public. Both of the specified public // id and system id have matches in the catalog file. But @@ -85,7 +85,7 @@ public class PreferTest { "http://local/base/dtd/docBobSys.dtd" } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("prefer.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java index 42dc6bbe215..44a0d46537f 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java @@ -23,20 +23,21 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkPubIdResolution; +import org.junit.jupiter.api.Test; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkPubIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.PublicFamilyTest + * @run junit/othervm catalog.PublicFamilyTest * @summary Get matched URIs from public and delegatePublic entries. * It tests the resolution priorities among the public family entries. * The test rule is based on OASIS Standard V1.1 section 7.1.2. @@ -58,12 +59,12 @@ public class PublicFamilyTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) - public void testNoMatched() { - checkNoMatch(createResolver()); + @Test + public void testNoMatch() { + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("publicFamily.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/PublicTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/PublicTest.java index d44dca87732..fe137eac6e9 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/PublicTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/PublicTest.java @@ -23,33 +23,35 @@ package catalog; -import static catalog.CatalogTestUtils.CATALOG_PUBLIC; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkPubIdResolution; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.CATALOG_PUBLIC; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkPubIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.PublicTest + * @run junit/othervm catalog.PublicTest * @summary Get matched URIs from public entries. */ public class PublicTest { - @Test(dataProvider = "publicId-matchedUri") + @ParameterizedTest + @MethodSource("data") public void testPublic(String publicId, String matchedUri) { checkPubIdResolution(createResolver(), publicId, matchedUri); } - @DataProvider(name = "publicId-matchedUri") - public Object[][] data() { + public static Object[][] data() { return new Object[][] { // The matched URI of the specified public id is defined in a // public entry. The match is an absolute path. @@ -80,12 +82,12 @@ public class PublicTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver(CATALOG_PUBLIC); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java index 0626e83bed9..a642f751a7f 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java @@ -23,6 +23,13 @@ package catalog; +import org.junit.jupiter.api.Test; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogFeatures.Feature; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.CATALOG_SYSTEM; import static catalog.CatalogTestUtils.CATALOG_URI; import static catalog.CatalogTestUtils.RESOLVE_CONTINUE; @@ -33,19 +40,13 @@ import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; import static javax.xml.catalog.CatalogFeatures.builder; - -import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogFeatures; -import javax.xml.catalog.CatalogFeatures.Feature; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.ResolveFeatureTest + * @run junit/othervm catalog.ResolveFeatureTest * @summary This case tests how does resolve feature affect the catalog * resolution. */ @@ -55,20 +56,24 @@ public class ResolveFeatureTest { * For strict external identifier resolution, if no match is found, * it should throw CatalogException. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testStrictResolutionOnEntityResolver() { - createEntityResolver(RESOLVE_STRICT).resolveEntity(null, - "http://remote/dtd/alice/docAliceDummy.dtd"); + CatalogResolver resolver = createEntityResolver(RESOLVE_STRICT); + assertThrows( + CatalogException.class, + () -> resolver.resolveEntity(null, "http://remote/dtd/alice/docAliceDummy.dtd")); } /* * For strict URI reference resolution, if no match is found, * it should throw CatalogException. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testStrictResolutionOnUriResolver() { - createUriResolver(RESOLVE_STRICT).resolve( - "http://remote/dtd/alice/docAliceDummy.dtd", null); + CatalogResolver resolver = createUriResolver(RESOLVE_STRICT); + assertThrows( + CatalogException.class, + () -> resolver.resolve("http://remote/dtd/alice/docAliceDummy.dtd", null)); } /* @@ -115,15 +120,15 @@ public class ResolveFeatureTest { "http://remote/dtd/carl/docCarlDummy.dtd", null); } - private CatalogResolver createEntityResolver(String resolve) { + private static CatalogResolver createEntityResolver(String resolve) { return catalogResolver(createFeature(resolve), CATALOG_SYSTEM); } - private CatalogResolver createUriResolver(String resolve) { + private static CatalogResolver createUriResolver(String resolve) { return catalogUriResolver(createFeature(resolve), CATALOG_URI); } - private CatalogFeatures createFeature(String resolve) { + private static CatalogFeatures createFeature(String resolve) { return builder().with(Feature.RESOLVE, resolve).build(); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java index 647fccd49fb..6c6cc752b98 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java @@ -23,32 +23,34 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkSysIdResolution; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkSysIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.RewriteSystemTest + * @run junit/othervm catalog.RewriteSystemTest * @summary Get matched URIs from rewriteSystem entries. */ public class RewriteSystemTest { - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkSysIdResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified system id is defined in a // rewriteSystem entry. The match is an absolute path. @@ -83,12 +85,12 @@ public class RewriteSystemTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("rewriteSystem.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteUriTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteUriTest.java index d7b98b96f11..1498f866c11 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteUriTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/RewriteUriTest.java @@ -23,32 +23,34 @@ package catalog; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogException; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.RewriteUriTest + * @run junit/othervm catalog.RewriteUriTest * @summary Get matched URIs from rewriteURI entries. */ public class RewriteUriTest { - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String uri, String matchedUri) { checkUriResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified URI reference is defined in // a rewriteURI entry. The match is an absolute path. @@ -83,12 +85,12 @@ public class RewriteUriTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoUriMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoUriMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogUriResolver("rewriteUri.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java index 61c59d4049c..d1795f6a45d 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java @@ -23,7 +23,10 @@ package catalog; -import static jaxp.library.JAXPTestUtilities.setSystemProperty; +import org.junit.jupiter.api.Test; + +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogResolver; import static catalog.CatalogTestUtils.FEATURE_FILES; import static catalog.CatalogTestUtils.catalogResolver; @@ -31,19 +34,14 @@ import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.CatalogTestUtils.getCatalogPath; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; -import static javax.xml.catalog.CatalogFeatures.builder; import static javax.xml.catalog.CatalogFeatures.Feature.FILES; - -import javax.xml.catalog.CatalogFeatures; -import javax.xml.catalog.CatalogResolver; - -import org.testng.annotations.Test; +import static javax.xml.catalog.CatalogFeatures.builder; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.SpecifyCatalogTest + * @run junit/othervm catalog.SpecifyCatalogTest * @summary This case tests how to specify the catalog files. */ public class SpecifyCatalogTest { @@ -77,7 +75,7 @@ public class SpecifyCatalogTest { */ @Test public void specifyCatalogViaSysProps() { - setSystemProperty(FEATURE_FILES, + System.setProperty(FEATURE_FILES, getCatalogPath("specifyCatalog-sysProps.xml").toASCIIString()); checkResolutionOnEntityResolver(catalogResolver((String[]) null), @@ -93,13 +91,13 @@ public class SpecifyCatalogTest { "http://local/base/dtd/docAPIURI.dtd"); } - private void checkResolutionOnEntityResolver(CatalogResolver resolver, - String matchedUri) { + private static void checkResolutionOnEntityResolver(CatalogResolver resolver, + String matchedUri) { checkSysIdResolution(resolver, ID_SYS, matchedUri); } - private void checkResolutionOnUriResolver(CatalogResolver resolver, - String matchedUri) { + private static void checkResolutionOnUriResolver(CatalogResolver resolver, + String matchedUri) { checkUriResolution(resolver, ID_URI, matchedUri); } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java index ec614332207..927aa65db66 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java @@ -23,21 +23,23 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkSysIdResolution; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkSysIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.SystemFamilyTest + * @run junit/othervm catalog.SystemFamilyTest * @summary Get matched URIs from system, rewriteSystem, systemSuffix and * delegateSystem entries. It tests the resolution priorities among * the system family entries. The test rule is based on OASIS @@ -45,13 +47,13 @@ import org.testng.annotations.Test; */ public class SystemFamilyTest { - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkSysIdResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified system id is defined in a // system entry. @@ -72,12 +74,12 @@ public class SystemFamilyTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("systemFamily.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java index 2a40b581654..6890cc2a4c8 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java @@ -23,32 +23,34 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkSysIdResolution; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkSysIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.SystemSuffixTest + * @run junit/othervm catalog.SystemSuffixTest * @summary Get matched URIs from systemSuffix entries. */ public class SystemSuffixTest { - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkSysIdResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified system id is defined in a // systemIdSuffix entry. The match is an absolute path. @@ -83,12 +85,12 @@ public class SystemSuffixTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("systemSuffix.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemTest.java index 73c11340b29..53909c4bd5a 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/SystemTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/SystemTest.java @@ -23,33 +23,35 @@ package catalog; -import static catalog.CatalogTestUtils.CATALOG_SYSTEM; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkNoMatch; -import static catalog.ResolutionChecker.checkSysIdResolution; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.CATALOG_SYSTEM; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkSysIdResolution; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.SystemTest + * @run junit/othervm catalog.SystemTest * @summary Get matched URIs from system entries. */ public class SystemTest { - @Test(dataProvider = "systemId-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkSysIdResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "systemId-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified system id is defined in a // system entry. The match is an absolute path. @@ -80,12 +82,12 @@ public class SystemTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver(CATALOG_SYSTEM); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/UriFamilyTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/UriFamilyTest.java index 44c9afcfa13..36b8d98ee1f 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/UriFamilyTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/UriFamilyTest.java @@ -23,21 +23,23 @@ package catalog; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogException; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.UriFamilyTest + * @run junit/othervm catalog.UriFamilyTest * @summary Get matched URIs from uri, rewriteURI, uriSuffix and delegateURI * entries. It tests the resolution priorities among the uri family * entries. The test rule is based on OASIS Standard V1.1 section @@ -45,13 +47,13 @@ import org.testng.annotations.Test; */ public class UriFamilyTest { - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String systemId, String matchedUri) { checkUriResolution(createResolver(), systemId, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified URI reference is defined in // a uri entry. @@ -72,12 +74,12 @@ public class UriFamilyTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoUriMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoUriMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogUriResolver("uriFamily.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/UriSuffixTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/UriSuffixTest.java index 8feadb03fa2..2bbe63a374a 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/UriSuffixTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/UriSuffixTest.java @@ -23,32 +23,34 @@ package catalog; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogException; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.UriSuffixTest + * @run junit/othervm catalog.UriSuffixTest * @summary Get matched URIs from rewriteURI entries. */ public class UriSuffixTest { - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String uri, String matchedUri) { checkUriResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified URI reference is defined in // a uriSuffix entry. The match is an absolute path. @@ -83,12 +85,12 @@ public class UriSuffixTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoUriMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoUriMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogUriResolver("uriSuffix.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/UriTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/UriTest.java index cf76eada5e7..651b2753713 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/UriTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/UriTest.java @@ -23,35 +23,37 @@ package catalog; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogResolver; + import static catalog.CatalogTestUtils.CATALOG_URI; import static catalog.CatalogTestUtils.RESOLVE_CONTINUE; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogFeatures; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.UriTest + * @run junit/othervm catalog.UriTest * @summary Get matched URIs from uri entries. */ public class UriTest { - @Test(dataProvider = "uri-matchedUri") + @ParameterizedTest + @MethodSource("dataOnMatch") public void testMatch(String uri, String matchedUri) { checkUriResolution(createResolver(), uri, matchedUri); } - @DataProvider(name = "uri-matchedUri") - public Object[][] dataOnMatch() { + public static Object[][] dataOnMatch() { return new Object[][] { // The matched URI of the specified URI reference is defined in // a uri entry. The match is an absolute path. @@ -92,12 +94,12 @@ public class UriTest { /* * If no match is found, a CatalogException should be thrown. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void testNoMatch() { - checkNoUriMatch(createResolver()); + assertThrows(CatalogException.class, () -> checkNoUriMatch(createResolver())); } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogUriResolver(CATALOG_URI); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java index f3b99074e98..765e315bd6e 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java @@ -23,32 +23,32 @@ package catalog; -import static catalog.CatalogTestUtils.catalogResolver; -import static catalog.ResolutionChecker.checkPubIdResolution; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.xml.catalog.CatalogResolver; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import static catalog.CatalogTestUtils.catalogResolver; +import static catalog.ResolutionChecker.checkPubIdResolution; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.UrnUnwrappingTest + * @run junit/othervm catalog.UrnUnwrappingTest * @summary If the passed public identifier is started with "urn:publicid:", * it has to be regarded as URN and normalized. And then the catalog * resolver uses the normalized stuff to do matching. */ public class UrnUnwrappingTest { - @Test(dataProvider = "urn-matchedUri") + @ParameterizedTest + @MethodSource("data") public void testUnwrapping(String urn, String matchedUri) { checkPubIdResolution(createResolver(), urn, matchedUri); } - @DataProvider(name = "urn-matchedUri") - public Object[][] data() { + public static Object[][] data() { return new Object[][] { // The specified public id is URN format. { "urn:publicid:-:REMOTE:DTD+ALICE+DOCALICE+XML:EN", @@ -60,7 +60,7 @@ public class UrnUnwrappingTest { "http://local/base/dtd/docBobPub.dtd" } }; } - private CatalogResolver createResolver() { + private static CatalogResolver createResolver() { return catalogResolver("urnUnwrapping.xml"); } } diff --git a/test/jaxp/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java b/test/jaxp/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java index 04676557ea4..c8316c085a2 100644 --- a/test/jaxp/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java +++ b/test/jaxp/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java @@ -23,22 +23,23 @@ package catalog; +import org.junit.jupiter.api.Test; + +import javax.xml.catalog.CatalogException; + import static catalog.CatalogTestUtils.CATALOG_SYSTEM; import static catalog.CatalogTestUtils.CATALOG_URI; import static catalog.CatalogTestUtils.catalogResolver; import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; - -import javax.xml.catalog.CatalogException; - -import org.testng.annotations.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @bug 8077931 * @library /javax/xml/jaxp/libs - * @run testng/othervm catalog.ValidateCatalogTest + * @run junit/othervm catalog.ValidateCatalogTest * @summary A legal catalog file must be well-formed XML, the root element * must be catalog, and the naming space of the root element must be * urn:oasis:names:tc:entity:xmlns:xml:catalog. @@ -52,36 +53,36 @@ public class ValidateCatalogTest { * EntityResolver tries to load catalog with wrong root, * it should throw CatalogException. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void validateWrongRootCatalogOnEntityResolver() { - catalogResolver(CATALOG_WRONGROOT); + assertThrows(CatalogException.class, () -> catalogResolver(CATALOG_WRONGROOT)); } /* * URIResolver tries to load catalog with wrong root, * it should throw CatalogException. */ - @Test(expectedExceptions = CatalogException.class) + @Test public void validateWrongRootCatalogOnUriResolver() { - catalogUriResolver(CATALOG_WRONGROOT); + assertThrows(CatalogException.class, () -> catalogUriResolver(CATALOG_WRONGROOT)); } /* * EntityResolver tries to load malformed catalog, * it should throw RuntimeException. */ - @Test(expectedExceptions = RuntimeException.class) + @Test public void validateMalformedCatalogOnEntityResolver() { - catalogResolver(CATALOG_MALFORMED); + assertThrows(RuntimeException.class, () -> catalogResolver(CATALOG_MALFORMED)); } /* * UriResolver tries to load malformed catalog, * it should throw RuntimeException. */ - @Test(expectedExceptions = RuntimeException.class) + @Test public void validateMalformedCatalogOnUriResolver() { - catalogUriResolver(CATALOG_MALFORMED); + assertThrows(RuntimeException.class, () -> catalogUriResolver(CATALOG_MALFORMED)); } /* diff --git a/test/jaxp/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java b/test/jaxp/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java index 6253e26d6e4..a6ab94b9d7e 100644 --- a/test/jaxp/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java +++ b/test/jaxp/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java @@ -30,12 +30,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogManager; import javax.xml.catalog.CatalogResolver; -import jaxp.library.JAXPTestUtilities; /* * Utilities for testing XML Catalog API. @@ -69,6 +67,9 @@ final class CatalogTestUtils { private static final String JAXP_PROPS = "jaxp.properties"; private static final String JAXP_PROPS_BAK = JAXP_PROPS + ".bak"; + private static final Path CATALOG_DIR = + Path.of(System.getProperty("test.src")).resolve("catalogFiles").normalize().toAbsolutePath(); + private CatalogTestUtils() { } /* ********** create resolver ********** */ @@ -109,19 +110,12 @@ final class CatalogTestUtils { // Gets the paths of the specified catalogs. private static URI[] getCatalogPaths(String... catalogNames) { - return catalogNames == null - ? null - : Stream.of(catalogNames).map( - catalogName -> getCatalogPath(catalogName)).collect( - Collectors.toList()).toArray(new URI[0]); + return Stream.of(catalogNames).map(CatalogTestUtils::getCatalogPath).toList().toArray(new URI[0]); } // Gets the paths of the specified catalogs. static URI getCatalogPath(String catalogName) { - return catalogName == null - ? null - : Paths.get(JAXPTestUtilities.getPathByClassName(CatalogTestUtils.class, "catalogFiles") - + catalogName).toUri(); + return CATALOG_DIR.resolve(catalogName).toUri(); } /* ********** jaxp.properties ********** */ diff --git a/test/jaxp/javax/xml/jaxp/libs/catalog/ResolutionChecker.java b/test/jaxp/javax/xml/jaxp/libs/catalog/ResolutionChecker.java index 81013a5a7bd..1e06a353c24 100644 --- a/test/jaxp/javax/xml/jaxp/libs/catalog/ResolutionChecker.java +++ b/test/jaxp/javax/xml/jaxp/libs/catalog/ResolutionChecker.java @@ -25,12 +25,13 @@ package catalog; import javax.xml.catalog.CatalogResolver; -import org.testng.Assert; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * Utilities for checking catalog resolution. */ -class ResolutionChecker { +final class ResolutionChecker { /* ********** Checks normal resolution ********** */ @@ -38,8 +39,8 @@ class ResolutionChecker { * Checks the resolution result for specified external identifier. */ static void checkExtIdResolution(CatalogResolver resolver, - String publicId, String systemId, String matchedUri) { - Assert.assertEquals( + String publicId, String systemId, String matchedUri) { + assertEquals( resolver.resolveEntity(publicId, getNotSpecified(systemId)).getSystemId(), matchedUri); } @@ -65,8 +66,8 @@ class ResolutionChecker { * with the specified base location. */ static void checkUriResolution(CatalogResolver resolver, - String href, String base, String matchedUri) { - Assert.assertEquals(resolver.resolve(href, base).getSystemId(), + String href, String base, String matchedUri) { + assertEquals(resolver.resolve(href, base).getSystemId(), matchedUri); } @@ -106,9 +107,9 @@ class ResolutionChecker { static void expectExceptionOnExtId( CatalogResolver resolver, String publicId, String systemId, Class expectedExceptionClass) { - expectThrows(expectedExceptionClass, () -> { - resolver.resolveEntity(publicId, getNotSpecified(systemId)); - }); + assertThrows( + expectedExceptionClass, + () -> resolver.resolveEntity(publicId, getNotSpecified(systemId))); } /* @@ -140,9 +141,7 @@ class ResolutionChecker { static void expectExceptionOnUri( CatalogResolver resolver, String href, String base, Class expectedExceptionClass) { - expectThrows(expectedExceptionClass, () -> { - resolver.resolve(href, base); - }); + assertThrows(expectedExceptionClass, () -> resolver.resolve(href, base)); } /* @@ -155,31 +154,6 @@ class ResolutionChecker { expectExceptionOnUri(resolver, href, null, expectedExceptionClass); } - // The TestNG distribution in current JTREG build doesn't support - // method Assert.expectThrows(). - private static T expectThrows(Class throwableClass, - ThrowingRunnable runnable) { - try { - runnable.run(); - } catch (Throwable t) { - if (throwableClass.isInstance(t)) { - return throwableClass.cast(t); - } else { - String mismatchMessage = String.format( - "Expected %s to be thrown, but %s was thrown", - throwableClass.getSimpleName(), - t.getClass().getSimpleName()); - - throw new AssertionError(mismatchMessage, t); - } - } - - String message = String.format( - "Expected %s to be thrown, but nothing was thrown", - throwableClass.getSimpleName()); - throw new AssertionError(message); - } - /* * SystemId can never be null in XML. For publicId tests, if systemId is null, * it will be considered as not-specified instead. A non-existent systemId @@ -191,8 +165,4 @@ class ResolutionChecker { } return systemId; } - - private interface ThrowingRunnable { - void run() throws Throwable; - } } diff --git a/test/jdk/ProblemList-zgc.txt b/test/jdk/ProblemList-zgc.txt index 065a52f9a83..a669f3e3abf 100644 --- a/test/jdk/ProblemList-zgc.txt +++ b/test/jdk/ProblemList-zgc.txt @@ -27,16 +27,6 @@ # ############################################################################# -# Quiet all SA tests - -sun/tools/jhsdb/HeapDumpTest.java 8307393 generic-all -sun/tools/jhsdb/BasicLauncherTest.java 8307393 generic-all -sun/tools/jhsdb/JStackStressTest.java 8307393 generic-all -sun/tools/jhsdb/JShellHeapDumpTest.java 8307393 generic-all -sun/tools/jhsdb/SAGetoptTest.java 8307393 generic-all -sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java 8307393 generic-all -sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java 8307393 generic-all - com/sun/jdi/ThreadMemoryLeakTest.java 8307402 generic-all ############################################################################# diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index cc571deab20..0e339d29cea 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -129,8 +129,3 @@ requiredVersion=8.2.1+1 # does not need ../../ notation to reach them external.lib.roots = ../../ -# Use new module options -useNewOptions=true - -# Use --patch-module instead of -Xmodule: -useNewPatchModule=true diff --git a/test/jdk/com/sun/net/httpserver/ContextPathMatcherPathPrefixTest.java b/test/jdk/com/sun/net/httpserver/ContextPathMatcherPathPrefixTest.java index e1cff62a45f..6b260636585 100644 --- a/test/jdk/com/sun/net/httpserver/ContextPathMatcherPathPrefixTest.java +++ b/test/jdk/com/sun/net/httpserver/ContextPathMatcherPathPrefixTest.java @@ -23,21 +23,30 @@ import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; + +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.net.URI; +import java.net.Socket; import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static java.net.http.HttpClient.Builder.NO_PROXY; import org.junit.jupiter.api.AfterAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; @@ -89,29 +98,88 @@ public class ContextPathMatcherPathPrefixTest { @Test void testContextPathAtRoot() throws Exception { + // Repeating all cases with both known (GET) and unknown (DOH) request methods to stress both paths try (var infra = new Infra("/")) { - infra.expect(200, "/foo", "/foo/", "/foo/bar", "/foobar"); + // 200 + infra.expect(200, "GET /foo"); + infra.expect(200, "GET /foo/"); + infra.expect(200, "GET /foo/bar"); + infra.expect(200, "GET /foobar"); + infra.expect(200, "DOH /foo"); + infra.expect(200, "DOH /foo/"); + infra.expect(200, "DOH /foo/bar"); + infra.expect(200, "DOH /foobar"); + // 404 + infra.expect(404, "GET foo"); + infra.expect(404, "GET *"); + infra.expect(404, "GET "); + infra.expect(404, "DOH foo"); + infra.expect(404, "DOH *"); + infra.expect(404, "DOH "); + // 400 + infra.expect(400, "GET"); + infra.expect(400, "DOH"); } } @Test void testContextPathAtSubDir() throws Exception { + // Repeating all cases with both known (GET) and unknown (DOH) request methods to stress both paths try (var infra = new Infra("/foo")) { - infra.expect(200, "/foo", "/foo/", "/foo/bar"); - infra.expect(404, "/foobar"); + // 200 + infra.expect(200, "GET /foo"); + infra.expect(200, "GET /foo/"); + infra.expect(200, "GET /foo/bar"); + infra.expect(200, "DOH /foo"); + infra.expect(200, "DOH /foo/"); + infra.expect(200, "DOH /foo/bar"); + // 404 + infra.expect(404, "GET /foobar"); // Differs from string prefix matching! + infra.expect(404, "GET foo"); + infra.expect(404, "GET *"); + infra.expect(404, "GET "); + infra.expect(404, "DOH /foobar"); // Differs from string prefix matching! + infra.expect(404, "DOH foo"); + infra.expect(404, "DOH *"); + infra.expect(404, "DOH "); + // 400 + infra.expect(400, "GET"); + infra.expect(400, "DOH"); } } @Test void testContextPathAtSubDirWithTrailingSlash() throws Exception { + // Repeating all cases with both known (GET) and unknown (DOH) request methods to stress both paths try (var infra = new Infra("/foo/")) { - infra.expect(200, "/foo/", "/foo/bar"); - infra.expect(404, "/foo", "/foobar"); + // 200 + infra.expect(200, "GET /foo/"); + infra.expect(200, "GET /foo/bar"); + infra.expect(200, "DOH /foo/"); + infra.expect(200, "DOH /foo/bar"); + // 404 + infra.expect(404, "GET /foo"); + infra.expect(404, "GET /foobar"); + infra.expect(404, "GET foo"); + infra.expect(404, "GET *"); + infra.expect(404, "GET "); + infra.expect(404, "DOH /foo"); + infra.expect(404, "DOH /foobar"); + infra.expect(404, "DOH foo"); + infra.expect(404, "DOH *"); + infra.expect(404, "DOH "); + // 400 + infra.expect(400, "GET"); + infra.expect(400, "DOH"); } } protected static final class Infra implements AutoCloseable { + /** Charset used for network and file I/O. */ + private static final Charset CHARSET = StandardCharsets.US_ASCII; + + /** Socket address the server will bind to. */ private static final InetSocketAddress LO_SA_0 = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0); @@ -128,22 +196,51 @@ public class ContextPathMatcherPathPrefixTest { this.contextPath = contextPath; } - protected void expect(int statusCode, String... requestPaths) throws Exception { - for (String requestPath : requestPaths) { - var requestURI = URI.create("http://%s:%s%s".formatted( - server.getAddress().getHostString(), - server.getAddress().getPort(), - requestPath)); - var request = HttpRequest.newBuilder(requestURI).build(); - var response = CLIENT.send(request, HttpResponse.BodyHandlers.discarding()); - assertEquals( - statusCode, response.statusCode(), - "unexpected status code " + Map.of( - "contextPath", contextPath, - "requestPath", requestPath)); + protected void expect(int statusCode, String requestLinePrefix) { + try { + expect0(statusCode, requestLinePrefix); + } catch (Throwable exception) { + var extendedMessage = exception.getMessage() + " " + Map.of( + "contextPath", contextPath, + "requestLinePrefix", requestLinePrefix); + var extendedException = new RuntimeException(extendedMessage); + extendedException.setStackTrace(exception.getStackTrace()); + throw extendedException; } } + private void expect0(int statusCode, String requestLinePrefix) throws IOException { + + // Connect to the server + try (Socket socket = new Socket()) { + socket.connect(server.getAddress()); + + // Obtain the I/O streams + try (OutputStream outputStream = socket.getOutputStream(); + InputStream inputStream = socket.getInputStream(); + BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream, CHARSET))) { + + // Write the request + byte[] requestBytes = String + // `Connection: close` is required for `BufferedReader::readLine` to work. + .format("%s HTTP/1.1\r\nConnection: close\r\n\r\n", requestLinePrefix) + .getBytes(CHARSET); + outputStream.write(requestBytes); + outputStream.flush(); + + // Read the response status code + String statusLine = inputReader.readLine(); + assertNotNull(statusLine, "Unexpected EOF while reading status line"); + Matcher statusLineMatcher = Pattern.compile("^HTTP/1\\.1 (\\d+) .+$").matcher(statusLine); + assertTrue(statusLineMatcher.matches(), "Couldn't match status line: \"" + statusLine + "\""); + assertEquals(statusCode, Integer.parseInt(statusLineMatcher.group(1))); + + } + + } + + } + @Override public void close() { server.stop(0); diff --git a/test/jdk/com/sun/net/httpserver/ContextPathMatcherStringPrefixTest.java b/test/jdk/com/sun/net/httpserver/ContextPathMatcherStringPrefixTest.java index 3f3008a8531..4faa1463e1b 100644 --- a/test/jdk/com/sun/net/httpserver/ContextPathMatcherStringPrefixTest.java +++ b/test/jdk/com/sun/net/httpserver/ContextPathMatcherStringPrefixTest.java @@ -36,28 +36,32 @@ import org.junit.jupiter.api.Test; class ContextPathMatcherStringPrefixTest extends ContextPathMatcherPathPrefixTest { - @Test - @Override - void testContextPathAtRoot() throws Exception { - try (var infra = new Infra("/")) { - infra.expect(200, "/foo", "/foo/", "/foo/bar", "/foobar"); - } - } - @Test @Override void testContextPathAtSubDir() throws Exception { + // Repeating all cases with both known (GET) and unknown (DOH) request methods to stress both paths try (var infra = new Infra("/foo")) { - infra.expect(200, "/foo", "/foo/", "/foo/bar", "/foobar"); - } - } - - @Test - @Override - void testContextPathAtSubDirWithTrailingSlash() throws Exception { - try (var infra = new Infra("/foo/")) { - infra.expect(200, "/foo/", "/foo/bar"); - infra.expect(404, "/foo", "/foobar"); + // 200 + infra.expect(200, "GET /foo"); + infra.expect(200, "GET /foo/"); + infra.expect(200, "GET /foo/bar"); + infra.expect(200, "GET /foobar"); // Differs from path prefix matching! + infra.expect(200, "DOH /foo"); + infra.expect(200, "DOH /foo/"); + infra.expect(200, "DOH /foo/bar"); + infra.expect(200, "DOH /foobar"); // Differs from path prefix matching! + // 404 + infra.expect(404, "GET /"); + infra.expect(404, "GET foo"); + infra.expect(404, "GET *"); + infra.expect(404, "GET "); + infra.expect(404, "DOH /"); + infra.expect(404, "DOH foo"); + infra.expect(404, "DOH *"); + infra.expect(404, "DOH "); + // 400 + infra.expect(400, "GET"); + infra.expect(400, "DOH"); } } diff --git a/test/jdk/java/awt/PrintJob/TestPrintNoException.java b/test/jdk/java/awt/PrintJob/TestPrintNoException.java new file mode 100644 index 00000000000..b54ac8de56b --- /dev/null +++ b/test/jdk/java/awt/PrintJob/TestPrintNoException.java @@ -0,0 +1,61 @@ +/* + * 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. + */ + +import java.awt.Frame; +import java.awt.JobAttributes; +import java.awt.PrintJob; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; + +/* + * @test + * @bug 8378417 + * @key headful printer + * @summary Verifies No Exception is thrown when Printing "All" pages + * @run main TestPrintNoException + */ + +public class TestPrintNoException { + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + Thread t = new Thread (() -> { + robot.delay(5000); + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + }); + + Frame testFrame = new Frame("print"); + try { + t.start(); + PrintJob pj = Toolkit.getDefaultToolkit().getPrintJob(testFrame, null, null); + if (pj != null) { + pj.end(); + } + } finally { + testFrame.dispose(); + } + } +} diff --git a/test/jdk/java/awt/print/PrinterJob/PageRanges.java b/test/jdk/java/awt/print/PrinterJob/PageRanges.java index 691357d5a3c..3a84725910c 100644 --- a/test/jdk/java/awt/print/PrinterJob/PageRanges.java +++ b/test/jdk/java/awt/print/PrinterJob/PageRanges.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6575331 8297191 8373239 + * @bug 6575331 8297191 8373239 8378417 * @key printer * @summary The specified pages should be printed. * @library /java/awt/regtesthelpers diff --git a/test/jdk/java/lang/Math/HypotTests.java b/test/jdk/java/lang/Math/HypotTests.java index e09799e34a4..eee40ea6469 100644 --- a/test/jdk/java/lang/Math/HypotTests.java +++ b/test/jdk/java/lang/Math/HypotTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,6 +25,7 @@ * @test * @library /test/lib * @build jdk.test.lib.RandomFactory + * @build Tests * @run main HypotTests * @bug 4851638 4939441 8078672 8240632 * @summary Tests for {Math, StrictMath}.hypot (use -Dseed=X to set PRNG seed) diff --git a/test/jdk/java/lang/Math/IeeeRecommendedTests.java b/test/jdk/java/lang/Math/IeeeRecommendedTests.java index 8570508ff44..3dfb70ab9af 100644 --- a/test/jdk/java/lang/Math/IeeeRecommendedTests.java +++ b/test/jdk/java/lang/Math/IeeeRecommendedTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,6 +25,7 @@ * @test * @library /test/lib * @build jdk.test.lib.RandomFactory + * @build Tests * @run main IeeeRecommendedTests * @bug 4860891 4826732 4780454 4939441 4826652 8078672 * @summary Tests for IEEE 754[R] recommended functions and similar methods (use -Dseed=X to set PRNG seed) diff --git a/test/jdk/java/lang/Math/IeeeRemainderTests.java b/test/jdk/java/lang/Math/IeeeRemainderTests.java index 596310d8e42..8716be870c9 100644 --- a/test/jdk/java/lang/Math/IeeeRemainderTests.java +++ b/test/jdk/java/lang/Math/IeeeRemainderTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -24,6 +24,8 @@ /* * @test * @bug 8304028 + * @build Tests + * @run main IeeeRemainderTests * @summary Tests for {Math, StrictMath}.IEEEremainder */ diff --git a/test/jdk/java/net/httpclient/AggregateRequestBodyTest.java b/test/jdk/java/net/httpclient/AggregateRequestBodyTest.java index 175e860c229..fb67cf02566 100644 --- a/test/jdk/java/net/httpclient/AggregateRequestBodyTest.java +++ b/test/jdk/java/net/httpclient/AggregateRequestBodyTest.java @@ -74,6 +74,7 @@ import static java.lang.System.out; import static java.net.http.HttpClient.Version.HTTP_1_1; import static java.net.http.HttpClient.Version.HTTP_2; import static java.net.http.HttpClient.Version.HTTP_3; +import static java.net.http.HttpOption.H3_DISCOVERY; import static java.net.http.HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY; import org.junit.jupiter.api.AfterAll; @@ -81,7 +82,6 @@ import org.junit.jupiter.api.Assertions; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeAll; @@ -219,7 +219,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { int i = 0; for (boolean sameClient : List.of(false, true)) { for (URI uri : uris()) { - HttpClient.Version version = null; + final HttpClient.Version version; if (uri.equals(http1URI) || uri.equals(https1URI)) version = HttpClient.Version.HTTP_1_1; else if (uri.equals(http2URI) || uri.equals(https2URI)) version = HttpClient.Version.HTTP_2; else if (uri.equals(http3URI)) version = HTTP_3; @@ -295,7 +295,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { static List lengths(long... lengths) { return LongStream.of(lengths) - .mapToObj(Long::valueOf) + .boxed() .collect(Collectors.toList()); } @@ -446,7 +446,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { @Override public void onComplete() { - resultCF.complete(items.stream().collect(Collectors.toUnmodifiableList())); + resultCF.complete(items.stream().toList()); } public ByteBuffer take() { @@ -552,7 +552,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { subscriber.subscriptionCF.thenAccept(s -> s.request(Long.MAX_VALUE)); if (errorPublisher.hasErrors()) { CompletionException ce = Assertions.assertThrows(CompletionException.class, - () -> subscriber.resultCF.join()); + subscriber.resultCF::join); out.println(description + ": got expected " + ce); assertEquals(Exception.class, ce.getCause().getClass()); assertEquals(result, stringFromBytes(subscriber.items.stream()) + ""); @@ -600,7 +600,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { description.replace("null", "length(-1)")); } - private static final Throwable completionCause(CompletionException x) { + private static Throwable completionCause(CompletionException x) { while (x.getCause() instanceof CompletionException) { x = (CompletionException)x.getCause(); } @@ -618,7 +618,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { publisher.subscribe(subscriber); Subscription subscription = subscriber.subscriptionCF.join(); subscription.request(n); - CompletionException expected = Assertions.assertThrows(CE, () -> subscriber.resultCF.join()); + CompletionException expected = Assertions.assertThrows(CE, subscriber.resultCF::join); Throwable cause = completionCause(expected); if (cause instanceof IllegalArgumentException) { System.out.printf("Got expected IAE for %d: %s%n", n, cause); @@ -655,7 +655,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { assertTrue(requestSubscriber1.resultCF().isDone()); String result1 = stringFromBytes(list1.stream()); assertEquals("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", result1); - System.out.println("Got expected sentence with one request: \"%s\"".formatted(result1)); + System.out.printf("Got expected sentence with one request: \"%s\"%n", result1); // Test that we can split our requests call any which way we want // (whether in the 'middle of a publisher' or at the boundaries. @@ -824,7 +824,7 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { .toArray(HttpRequest.BodyPublisher[]::new) ); - HttpRequest request = HttpRequest.newBuilder(uri) + HttpRequest request = newRequestBuilder(uri) .version(version) .POST(publisher) .build(); @@ -835,13 +835,21 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { HttpResponse response = client.send(request, BodyHandlers.ofString()); int expectedResponse = RESPONSE_CODE; if (response.statusCode() != expectedResponse) - throw new RuntimeException("wrong response code " + Integer.toString(response.statusCode())); + throw new RuntimeException("wrong response code " + response.statusCode()); assertEquals(BODIES.stream().collect(Collectors.joining()), response.body()); } if (!sameClient) client.close(); System.out.println("test: DONE"); } + private static HttpRequest.Builder newRequestBuilder(URI uri) { + var builder = HttpRequest.newBuilder(uri); + if (uri.getPath().contains("/http3/")) { + builder.setOption(H3_DISCOVERY, HTTP_3_URI_ONLY); + } + return builder; + } + private static URI buildURI(String scheme, String path, int port) { return URIBuilder.newBuilder() .scheme(scheme) @@ -882,11 +890,17 @@ public class AggregateRequestBodyTest implements HttpServerAdapters { http3TestServer.start(); } + private static void close(AutoCloseable closeable) throws Exception { + if (closeable == null) return; + out.println("Closing shared client " + closeable); + closeable.close(); + } + @AfterAll public static void teardown() throws Exception { String sharedClientName = sharedClient == null ? null : sharedClient.toString(); - sharedClient.close(); + close(sharedClient); sharedClient = null; Thread.sleep(100); AssertionError fail = TRACKER.check(500); diff --git a/test/jdk/java/net/httpclient/TEST.properties b/test/jdk/java/net/httpclient/TEST.properties index b79f7113952..77705d2f4f1 100644 --- a/test/jdk/java/net/httpclient/TEST.properties +++ b/test/jdk/java/net/httpclient/TEST.properties @@ -20,3 +20,7 @@ modules=java.base/jdk.internal.util \ java.security.jgss \ java.logging \ jdk.httpserver + +# Prevent TestNG-based tests +disallowedActions=testng + diff --git a/test/jdk/java/net/httpclient/http2/ErrorTest.java b/test/jdk/java/net/httpclient/http2/ErrorTest.java index 6b36529b38f..0f3bafa571d 100644 --- a/test/jdk/java/net/httpclient/http2/ErrorTest.java +++ b/test/jdk/java/net/httpclient/http2/ErrorTest.java @@ -45,7 +45,7 @@ * java.net.http/jdk.internal.net.http.qpack.writers * java.security.jgss * @modules java.base/jdk.internal.util - * @run testng/othervm/timeout=60 -Djavax.net.debug=ssl -Djdk.httpclient.HttpClient.log=all ErrorTest + * @run junit/othervm/timeout=60 -Djavax.net.debug=ssl -Djdk.httpclient.HttpClient.log=all ErrorTest * @summary check exception thrown when bad TLS parameters selected */ @@ -67,7 +67,7 @@ import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.test.lib.net.SimpleSSLContext; import static java.net.http.HttpClient.Version.HTTP_2; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; /** * When selecting an unacceptable cipher suite the TLS handshake will fail. diff --git a/test/jdk/java/net/httpclient/http2/FixedThreadPoolTest.java b/test/jdk/java/net/httpclient/http2/FixedThreadPoolTest.java index 2378b0b6982..d788d39b441 100644 --- a/test/jdk/java/net/httpclient/http2/FixedThreadPoolTest.java +++ b/test/jdk/java/net/httpclient/http2/FixedThreadPoolTest.java @@ -30,7 +30,7 @@ * jdk.test.lib.Asserts * jdk.test.lib.Utils * jdk.test.lib.net.SimpleSSLContext - * @run testng/othervm -Djdk.httpclient.HttpClient.log=ssl,requests,responses,errors FixedThreadPoolTest + * @run junit/othervm -Djdk.httpclient.HttpClient.log=ssl,requests,responses,errors FixedThreadPoolTest */ import java.net.*; @@ -51,7 +51,7 @@ import static jdk.test.lib.Asserts.assertFileContentsEqual; import static jdk.test.lib.Utils.createTempFile; import static jdk.test.lib.Utils.createTempFileOfSize; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; public class FixedThreadPoolTest implements HttpServerAdapters { @@ -92,7 +92,7 @@ public class FixedThreadPoolTest implements HttpServerAdapters { } @Test - public static void test() throws Exception { + public void test() throws Exception { try { initialize(); simpleTest(false); diff --git a/test/jdk/java/net/httpclient/http2/H2SelectorVTTest.java b/test/jdk/java/net/httpclient/http2/H2SelectorVTTest.java index 85d4012494a..7adfd57319c 100644 --- a/test/jdk/java/net/httpclient/http2/H2SelectorVTTest.java +++ b/test/jdk/java/net/httpclient/http2/H2SelectorVTTest.java @@ -38,7 +38,7 @@ import jdk.test.lib.net.SimpleSSLContext; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.assertEquals; import static java.net.http.HttpClient.Builder.NO_PROXY; import static java.net.http.HttpClient.Version.HTTP_2; @@ -166,21 +166,21 @@ class H2SelectorVTTest implements HttpServerAdapters { final HttpRequest req1 = reqBuilder.copy().GET().build(); System.out.println("\nIssuing request: " + req1); final HttpResponse resp1 = client.send(req1, BodyHandlers.ofString()); - Assertions.assertEquals(200, resp1.statusCode(), "unexpected response code for GET request"); + assertEquals(200, resp1.statusCode(), "unexpected response code for GET request"); assertSelectorThread(client); // POST final HttpRequest req2 = reqBuilder.copy().POST(BodyPublishers.ofString("foo")).build(); System.out.println("\nIssuing request: " + req2); final HttpResponse resp2 = client.send(req2, BodyHandlers.ofString()); - Assertions.assertEquals(200, resp2.statusCode(), "unexpected response code for POST request"); + assertEquals(200, resp2.statusCode(), "unexpected response code for POST request"); assertSelectorThread(client); // HEAD final HttpRequest req3 = reqBuilder.copy().HEAD().build(); System.out.println("\nIssuing request: " + req3); final HttpResponse resp3 = client.send(req3, BodyHandlers.ofString()); - Assertions.assertEquals(200, resp3.statusCode(), "unexpected response code for HEAD request"); + assertEquals(200, resp3.statusCode(), "unexpected response code for HEAD request"); assertSelectorThread(client); } } @@ -219,6 +219,6 @@ class H2SelectorVTTest implements HttpServerAdapters { msg = "%s not found in %s".formatted(name, threads); System.out.printf("%s: %s%n", status, msg); } - Assertions.assertEquals(!isTCPSelectorThreadVirtual(), found, msg); + assertEquals(!isTCPSelectorThreadVirtual(), found, msg); } } diff --git a/test/jdk/java/net/httpclient/http2/ImplicitPushCancel.java b/test/jdk/java/net/httpclient/http2/ImplicitPushCancel.java index c75a62d0f42..5bcaf95c6fc 100644 --- a/test/jdk/java/net/httpclient/http2/ImplicitPushCancel.java +++ b/test/jdk/java/net/httpclient/http2/ImplicitPushCancel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,7 @@ * @test * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.httpclient.HttpClient.log=errors,requests,responses,trace * ImplicitPushCancel @@ -51,15 +51,16 @@ import java.util.concurrent.ConcurrentMap; import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.httpclient.test.lib.http2.Http2TestExchange; import jdk.httpclient.test.lib.http2.Http2Handler; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class ImplicitPushCancel { - static Map PUSH_PROMISES = Map.of( + static final Map PUSH_PROMISES = Map.of( "/x/y/z/1", "the first push promise body", "/x/y/z/2", "the second push promise body", "/x/y/z/3", "the third push promise body", @@ -72,11 +73,11 @@ public class ImplicitPushCancel { ); static final String MAIN_RESPONSE_BODY = "the main response body"; - Http2TestServer server; - URI uri; + private static Http2TestServer server; + private static URI uri; - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { server = new Http2TestServer(false, 0); Http2Handler handler = new ServerPushHandler(MAIN_RESPONSE_BODY, PUSH_PROMISES); @@ -87,13 +88,13 @@ public class ImplicitPushCancel { uri = new URI("http://localhost:" + port + "/foo/a/b/c"); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { server.stop(); } static final HttpResponse assert200ResponseCode(HttpResponse response) { - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); return response; } @@ -128,11 +129,11 @@ public class ImplicitPushCancel { promises.entrySet().stream().forEach(entry -> { HttpRequest request = entry.getKey(); HttpResponse response = entry.getValue().join(); - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); if (PUSH_PROMISES.containsKey(request.uri().getPath())) { - assertEquals(response.body(), PUSH_PROMISES.get(request.uri().getPath())); + assertEquals(PUSH_PROMISES.get(request.uri().getPath()), response.body()); } else { - assertEquals(response.body(), MAIN_RESPONSE_BODY); + assertEquals(MAIN_RESPONSE_BODY, response.body()); } } ); diff --git a/test/jdk/java/net/httpclient/http2/NoBodyTest.java b/test/jdk/java/net/httpclient/http2/NoBodyTest.java index 3d30c54654a..2459c8eba4b 100644 --- a/test/jdk/java/net/httpclient/http2/NoBodyTest.java +++ b/test/jdk/java/net/httpclient/http2/NoBodyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -26,7 +26,7 @@ * @bug 8087112 * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm -Djdk.httpclient.HttpClient.log=ssl,requests,responses,errors + * @run junit/othervm -Djdk.httpclient.HttpClient.log=ssl,requests,responses,errors * -Djdk.internal.httpclient.debug=true * NoBodyTest */ @@ -47,10 +47,10 @@ import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.httpclient.test.lib.http2.Http2TestExchange; import jdk.httpclient.test.lib.http2.Http2Handler; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.Test; import static java.net.http.HttpClient.Version.HTTP_2; -@Test +import org.junit.jupiter.api.Test; + public class NoBodyTest { static int httpPort, httpsPort; static Http2TestServer httpServer, httpsServer; @@ -86,7 +86,7 @@ public class NoBodyTest { } @Test - public static void runtest() throws Exception { + public void runtest() throws Exception { try { initialize(); warmup(false); diff --git a/test/jdk/java/net/httpclient/http2/PostPutTest.java b/test/jdk/java/net/httpclient/http2/PostPutTest.java index 89b192f6171..84e86b556ca 100644 --- a/test/jdk/java/net/httpclient/http2/PostPutTest.java +++ b/test/jdk/java/net/httpclient/http2/PostPutTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -28,7 +28,7 @@ * does not process any data. The client should read all data from the server and close the connection. * @library /test/jdk/java/net/httpclient/lib * @build jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm/timeout=50 -Djdk.httpclient.HttpClient.log=all + * @run junit/othervm/timeout=50 -Djdk.httpclient.HttpClient.log=all * PostPutTest */ @@ -36,11 +36,6 @@ import jdk.httpclient.test.lib.http2.Http2Handler; import jdk.httpclient.test.lib.http2.Http2TestExchange; import jdk.httpclient.test.lib.http2.Http2TestServer; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - import java.io.IOException; import java.io.PrintStream; import java.net.URI; @@ -51,19 +46,24 @@ import java.net.http.HttpResponse; import static java.net.http.HttpClient.Version.HTTP_2; import static java.net.http.HttpRequest.BodyPublishers.ofByteArray; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PostPutTest { - Http2TestServer http2TestServer; - URI warmupURI, testHandlerBasicURI, testHandlerCloseBosURI, testHandleNegativeContentLengthURI; + private static Http2TestServer http2TestServer; + private static URI warmupURI, testHandlerBasicURI, testHandlerCloseBosURI, testHandleNegativeContentLengthURI; static PrintStream testLog = System.err; // As per jdk.internal.net.http.WindowController.DEFAULT_INITIAL_WINDOW_SIZE - final int DEFAULT_INITIAL_WINDOW_SIZE = (64 * 1024) - 1; + private static final int DEFAULT_INITIAL_WINDOW_SIZE = (64 * 1024) - 1; // Add on a small amount of arbitrary bytes to see if client hangs when receiving RST_STREAM - byte[] data = new byte[DEFAULT_INITIAL_WINDOW_SIZE + 10]; + private static byte[] data = new byte[DEFAULT_INITIAL_WINDOW_SIZE + 10]; - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { http2TestServer = new Http2TestServer(false, 0); http2TestServer.addHandler(new WarmupHandler(), "/Warmup"); http2TestServer.addHandler(new TestHandlerBasic(), "/TestHandlerBasic"); @@ -81,15 +81,14 @@ public class PostPutTest { testLog.println("PostPutTest.setup(): testHandleNegativeContentLengthURI: " + testHandleNegativeContentLengthURI); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { testLog.println("PostPutTest.teardown(): Stopping server"); http2TestServer.stop(); data = null; } - @DataProvider(name = "variants") - public Object[][] variants() { + public static Object[][] variants() { HttpRequest over64kPost, over64kPut, over64kPostCloseBos, over64kPutCloseBos, over64kPostNegativeContentLength, over64kPutNegativeContentLength; over64kPost = HttpRequest.newBuilder().version(HTTP_2).POST(ofByteArray(data)).uri(testHandlerBasicURI).build(); over64kPut = HttpRequest.newBuilder().version(HTTP_2).PUT(ofByteArray(data)).uri(testHandlerBasicURI).build(); @@ -117,7 +116,8 @@ public class PostPutTest { .build(); } - @Test(dataProvider = "variants") + @ParameterizedTest + @MethodSource("variants") public void testOver64kPUT(HttpRequest req, String testMessage) { testLog.println("PostPutTest: Performing test: " + testMessage); HttpClient hc = HttpClient.newBuilder().version(HTTP_2).build(); diff --git a/test/jdk/java/net/httpclient/http2/PushPromiseContinuation.java b/test/jdk/java/net/httpclient/http2/PushPromiseContinuation.java index e9c6447e600..2d5b5dd4f4e 100644 --- a/test/jdk/java/net/httpclient/http2/PushPromiseContinuation.java +++ b/test/jdk/java/net/httpclient/http2/PushPromiseContinuation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -31,10 +31,9 @@ * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.http2.Http2TestServer * jdk.httpclient.test.lib.http2.BodyOutputStream * jdk.httpclient.test.lib.http2.OutgoingPushPromise - * @run testng/othervm PushPromiseContinuation + * @run junit/othervm PushPromiseContinuation */ - import javax.net.ssl.SSLSession; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -68,14 +67,13 @@ import jdk.internal.net.http.common.HttpHeadersBuilder; import jdk.internal.net.http.frame.ContinuationFrame; import jdk.internal.net.http.frame.HeaderFrame; -import org.testng.TestException; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; public class PushPromiseContinuation { @@ -85,8 +83,8 @@ public class PushPromiseContinuation { static volatile int continuationCount; static final String mainPromiseBody = "Main Promise Body"; static final String mainResponseBody = "Main Response Body"; - Http2TestServer server; - URI uri; + private static Http2TestServer server; + private static URI uri; // Set up simple client-side push promise handler ConcurrentMap>> pushPromiseMap = new ConcurrentHashMap<>(); @@ -95,13 +93,13 @@ public class PushPromiseContinuation { pushPromiseMap.put(pushRequest, acceptor.apply(s)); }; - @BeforeMethod + @BeforeEach public void beforeMethod() { pushPromiseMap = new ConcurrentHashMap<>(); } - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { server = new Http2TestServer(false, 0); server.addHandler(new ServerPushHandler(), "/"); @@ -115,9 +113,8 @@ public class PushPromiseContinuation { uri = new URI("http://localhost:" + port + "/"); } - @AfterTest - public void teardown() { - pushPromiseMap = null; + @AfterAll + public static void teardown() { server.stop(); } @@ -195,29 +192,29 @@ public class PushPromiseContinuation { CompletableFuture> cf = client.sendAsync(hreq, HttpResponse.BodyHandlers.ofString(UTF_8), pph); - CompletionException t = expectThrows(CompletionException.class, () -> cf.join()); - assertEquals(t.getCause().getClass(), ProtocolException.class, + CompletionException t = assertThrows(CompletionException.class, () -> cf.join()); + assertEquals(ProtocolException.class, t.getCause().getClass(), "Expected a ProtocolException but got " + t.getCause()); System.err.println("Client received the following expected exception: " + t.getCause()); faultyServer.stop(); } private void verify(HttpResponse resp) { - assertEquals(resp.statusCode(), 200); - assertEquals(resp.body(), mainResponseBody); + assertEquals(200, resp.statusCode()); + assertEquals(mainResponseBody, resp.body()); if (pushPromiseMap.size() > 1) { System.err.println(pushPromiseMap.entrySet()); - throw new TestException("Results map size is greater than 1"); + fail("Results map size is greater than 1"); } else { // This will only iterate once for (HttpRequest r : pushPromiseMap.keySet()) { HttpResponse serverPushResp = pushPromiseMap.get(r).join(); // Received headers should be the same as the combined PushPromise // frame headers combined with the Continuation frame headers - assertEquals(testHeaders, r.headers()); + assertEquals(r.headers(), testHeaders); // Check status code and push promise body are as expected - assertEquals(serverPushResp.statusCode(), 200); - assertEquals(serverPushResp.body(), mainPromiseBody); + assertEquals(200, serverPushResp.statusCode()); + assertEquals(mainPromiseBody, serverPushResp.body()); } } } diff --git a/test/jdk/java/net/httpclient/http2/RedirectTest.java b/test/jdk/java/net/httpclient/http2/RedirectTest.java index e2acd807bd5..201b56513f6 100644 --- a/test/jdk/java/net/httpclient/http2/RedirectTest.java +++ b/test/jdk/java/net/httpclient/http2/RedirectTest.java @@ -30,7 +30,7 @@ * jdk.httpclient.test.lib.http2.Http2RedirectHandler * jdk.test.lib.Asserts * jdk.test.lib.net.SimpleSSLContext - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.HttpClient.log=frames,ssl,requests,responses,errors * -Djdk.internal.httpclient.debug=true * RedirectTest @@ -52,9 +52,10 @@ import jdk.httpclient.test.lib.common.HttpServerAdapters; import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.httpclient.test.lib.http2.Http2TestExchange; import jdk.httpclient.test.lib.http2.Http2RedirectHandler; -import org.testng.annotations.Test; import static java.net.http.HttpClient.Version.HTTP_2; +import org.junit.jupiter.api.Test; + public class RedirectTest implements HttpServerAdapters { static int httpPort; static HttpTestServer httpServer; @@ -135,7 +136,7 @@ public class RedirectTest implements HttpServerAdapters { } @Test - public static void test() throws Exception { + public void test() throws Exception { try { initialize(); simpleTest(); diff --git a/test/jdk/java/net/httpclient/http2/ServerPush.java b/test/jdk/java/net/httpclient/http2/ServerPush.java index 7f9c82fb28b..d38b867132b 100644 --- a/test/jdk/java/net/httpclient/http2/ServerPush.java +++ b/test/jdk/java/net/httpclient/http2/ServerPush.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -29,7 +29,7 @@ * @build jdk.httpclient.test.lib.http2.Http2TestServer * jdk.httpclient.test.lib.http2.PushHandler * jdk.test.lib.Utils - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.HttpClient.log=errors,requests,responses * ServerPush */ @@ -48,13 +48,14 @@ import java.util.concurrent.*; import java.util.function.Consumer; import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.httpclient.test.lib.http2.PushHandler; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; import static java.nio.charset.StandardCharsets.UTF_8; import static jdk.test.lib.Utils.createTempFileOfSize; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; public class ServerPush { @@ -66,11 +67,11 @@ public class ServerPush { static Path tempFile; - Http2TestServer server; - URI uri; + private static Http2TestServer server; + private static URI uri; - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { tempFile = createTempFileOfSize(TEMP_FILE_PREFIX, null, FILE_SIZE); server = new Http2TestServer(false, 0); server.addHandler(new PushHandler(tempFile, LOOPS), "/"); @@ -82,8 +83,8 @@ public class ServerPush { uri = new URI("http://localhost:" + port + "/foo/a/b/c"); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { server.stop(); } @@ -109,10 +110,10 @@ public class ServerPush { System.err.println("results.size: " + resultMap.size()); for (HttpRequest r : resultMap.keySet()) { HttpResponse response = resultMap.get(r).join(); - assertEquals(response.statusCode(), 200); - assertEquals(response.body(), tempFileAsString); + assertEquals(200, response.statusCode()); + assertEquals(tempFileAsString, response.body()); } - assertEquals(resultMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultMap.size()); } // Test 2 - of(...) populating the given Map, everything as a String @@ -135,10 +136,10 @@ public class ServerPush { System.err.println("results.size: " + resultMap.size()); for (HttpRequest r : resultMap.keySet()) { HttpResponse response = resultMap.get(r).join(); - assertEquals(response.statusCode(), 200); - assertEquals(response.body(), tempFileAsString); + assertEquals(200, response.statusCode()); + assertEquals(tempFileAsString, response.body()); } - assertEquals(resultMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultMap.size()); } // --- Path --- @@ -177,11 +178,11 @@ public class ServerPush { for (HttpRequest r : resultsMap.keySet()) { HttpResponse response = resultsMap.get(r).join(); - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); String fileAsString = new String(Files.readAllBytes(response.body()), UTF_8); - assertEquals(fileAsString, tempFileAsString); + assertEquals(tempFileAsString, fileAsString); } - assertEquals(resultsMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultsMap.size()); } // Test 4 - of(...) populating the given Map, everything as a Path @@ -204,11 +205,11 @@ public class ServerPush { for (HttpRequest r : resultsMap.keySet()) { HttpResponse response = resultsMap.get(r).join(); - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); String fileAsString = new String(Files.readAllBytes(response.body()), UTF_8); - assertEquals(fileAsString, tempFileAsString); + assertEquals(tempFileAsString, fileAsString); } - assertEquals(resultsMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultsMap.size()); } // --- Consumer --- @@ -263,12 +264,12 @@ public class ServerPush { for (HttpRequest r : resultsMap.keySet()) { HttpResponse response = resultsMap.get(r).join(); - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); byte[] ba = byteArrayConsumerMap.get(r).getAccumulatedBytes(); String result = new String(ba, UTF_8); - assertEquals(result, tempFileAsString); + assertEquals(tempFileAsString, result); } - assertEquals(resultsMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultsMap.size()); } // Test 6 - of(...) populating the given Map, everything as a consumer of optional byte[] @@ -301,11 +302,11 @@ public class ServerPush { for (HttpRequest r : resultsMap.keySet()) { HttpResponse response = resultsMap.get(r).join(); - assertEquals(response.statusCode(), 200); + assertEquals(200, response.statusCode()); byte[] ba = byteArrayConsumerMap.get(r).getAccumulatedBytes(); String result = new String(ba, UTF_8); - assertEquals(result, tempFileAsString); + assertEquals(tempFileAsString, result); } - assertEquals(resultsMap.size(), LOOPS + 1); + assertEquals(LOOPS + 1, resultsMap.size()); } } diff --git a/test/jdk/java/net/httpclient/http2/ServerPushWithDiffTypes.java b/test/jdk/java/net/httpclient/http2/ServerPushWithDiffTypes.java index 3e12a20c15e..9cf2a3f7ae2 100644 --- a/test/jdk/java/net/httpclient/http2/ServerPushWithDiffTypes.java +++ b/test/jdk/java/net/httpclient/http2/ServerPushWithDiffTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,7 @@ * @test * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.httpclient.HttpClient.log=errors,requests,responses * ServerPushWithDiffTypes @@ -47,9 +47,10 @@ import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.httpclient.test.lib.http2.Http2TestExchange; import jdk.httpclient.test.lib.http2.Http2Handler; -import org.testng.annotations.Test; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class ServerPushWithDiffTypes { @@ -66,7 +67,7 @@ public class ServerPushWithDiffTypes { ); @Test - public static void test() throws Exception { + public void test() throws Exception { Http2TestServer server = null; try { server = new Http2TestServer(false, 0); @@ -93,7 +94,7 @@ public class ServerPushWithDiffTypes { results.put(request, cf); cf.join(); - assertEquals(results.size(), PUSH_PROMISES.size() + 1); + assertEquals(PUSH_PROMISES.size() + 1, results.size()); for (HttpRequest r : results.keySet()) { URI u = r.uri(); @@ -116,7 +117,7 @@ public class ServerPushWithDiffTypes { String expected = PUSH_PROMISES.get(r.uri().getPath()); if (expected == null) expected = "the main response body"; - assertEquals(result, expected); + assertEquals(expected, result); } } finally { server.stop(); diff --git a/test/jdk/java/net/httpclient/http2/SimpleGet.java b/test/jdk/java/net/httpclient/http2/SimpleGet.java index 692a6583b63..5df3174f820 100644 --- a/test/jdk/java/net/httpclient/http2/SimpleGet.java +++ b/test/jdk/java/net/httpclient/http2/SimpleGet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -27,11 +27,11 @@ * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestUtil * jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm -XX:+CrashOnOutOfMemoryError SimpleGet - * @run testng/othervm -XX:+CrashOnOutOfMemoryError + * @run junit/othervm -XX:+CrashOnOutOfMemoryError SimpleGet + * @run junit/othervm -XX:+CrashOnOutOfMemoryError * -Dsimpleget.repeat=1 -Dsimpleget.chunks=1 -Dsimpleget.requests=1000 * SimpleGet - * @run testng/othervm -Dsimpleget.requests=150 + * @run junit/othervm -Dsimpleget.requests=150 * -Dsimpleget.chunks=16384 * -Djdk.httpclient.redirects.retrylimit=5 * -Djdk.httpclient.HttpClient.log=errors @@ -62,11 +62,12 @@ import javax.net.ssl.SSLContext; import jdk.httpclient.test.lib.common.HttpServerAdapters; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.Assert; -import org.testng.annotations.Test; import static java.net.http.HttpClient.Version.HTTP_2; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class SimpleGet implements HttpServerAdapters { static HttpTestServer httpsServer; static HttpClient client = null; @@ -117,11 +118,11 @@ public class SimpleGet implements HttpServerAdapters { } public static void main(String[] args) throws Exception { - test(); + new SimpleGet().test(); } @Test - public static void test() throws Exception { + public void test() throws Exception { try { long prestart = System.nanoTime(); initialize(); @@ -132,7 +133,7 @@ public class SimpleGet implements HttpServerAdapters { .GET().build(); long start = System.nanoTime(); var resp = client.send(request, BodyHandlers.ofByteArrayConsumer(b -> {})); - Assert.assertEquals(resp.statusCode(), 200); + assertEquals(200, resp.statusCode()); long elapsed = System.nanoTime() - start; System.out.println("Stat: First request took: " + elapsed + " nanos (" + TimeUnit.NANOSECONDS.toMillis(elapsed) + " ms)"); final int max = property("simpleget.requests", 50); @@ -163,7 +164,7 @@ public class SimpleGet implements HttpServerAdapters { + connections.size() + " connections"); } } - list.forEach((cf) -> Assert.assertEquals(cf.join().statusCode(), 200)); + list.forEach((cf) -> assertEquals(200, cf.join().statusCode())); } catch (Throwable tt) { System.err.println("tt caught"); tt.printStackTrace(); diff --git a/test/jdk/java/net/httpclient/http2/StreamFlowControlTest.java b/test/jdk/java/net/httpclient/http2/StreamFlowControlTest.java index 3edf0b71305..a36fe29813c 100644 --- a/test/jdk/java/net/httpclient/http2/StreamFlowControlTest.java +++ b/test/jdk/java/net/httpclient/http2/StreamFlowControlTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -26,7 +26,7 @@ * @bug 8342075 8343855 * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.httpclient.test.lib.http2.Http2TestServer jdk.test.lib.net.SimpleSSLContext - * @run testng/othervm -Djdk.internal.httpclient.debug=true + * @run junit/othervm -Djdk.internal.httpclient.debug=true * -Djdk.httpclient.connectionWindowSize=65535 * -Djdk.httpclient.windowsize=16384 * StreamFlowControlTest @@ -65,30 +65,30 @@ import jdk.internal.net.http.common.HttpHeadersBuilder; import jdk.internal.net.http.frame.SettingsFrame; import jdk.test.lib.Utils; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class StreamFlowControlTest { private static final SSLContext sslContext = SimpleSSLContext.findSSLContext(); - HttpTestServer http2TestServer; // HTTP/2 ( h2c ) - HttpTestServer https2TestServer; // HTTP/2 ( h2 ) - String http2URI; - String https2URI; - final AtomicInteger reqid = new AtomicInteger(); + private static HttpTestServer http2TestServer; // HTTP/2 ( h2c ) + private static HttpTestServer https2TestServer; // HTTP/2 ( h2 ) + private static String http2URI; + private static String https2URI; + private static final AtomicInteger reqid = new AtomicInteger(); final static int WINDOW = Integer.getInteger("jdk.httpclient.windowsize", 2 * 16 * 1024); - @DataProvider(name = "variants") - public Object[][] variants() { + public static Object[][] variants() { return new Object[][] { { http2URI, false }, { https2URI, false }, @@ -111,7 +111,8 @@ public class StreamFlowControlTest { } - @Test(dataProvider = "variants") + @ParameterizedTest + @MethodSource("variants") void test(String uri, boolean sameClient) throws Exception @@ -142,7 +143,7 @@ public class StreamFlowControlTest { if (sameClient) { String key = response.headers().firstValue("X-Connection-Key").get(); if (label == null) label = key; - assertEquals(key, label, "Unexpected key for " + query); + assertEquals(label, key, "Unexpected key for " + query); } sent.join(); // we have to pull to get the exception, but slow enough @@ -175,7 +176,8 @@ public class StreamFlowControlTest { } - @Test(dataProvider = "variants") + @ParameterizedTest + @MethodSource("variants") void testAsync(String uri, boolean sameClient) { @@ -207,7 +209,7 @@ public class StreamFlowControlTest { if (sameClient) { String key = response.headers().firstValue("X-Connection-Key").get(); if (label == null) label = key; - assertEquals(key, label, "Unexpected key for " + query); + assertEquals(label, key, "Unexpected key for " + query); } sent.join(); long wait = uri.startsWith("https://") ? 800 : 350; @@ -264,38 +266,38 @@ public class StreamFlowControlTest { } } - @BeforeTest - public void setup() throws Exception { - var http2TestServer = new Http2TestServer("localhost", false, 0); - http2TestServer.addHandler(new Http2TestHandler(), "/http2/"); - this.http2TestServer = HttpTestServer.of(http2TestServer); - http2URI = "http://" + this.http2TestServer.serverAuthority() + "/http2/x"; + @BeforeAll + public static void setup() throws Exception { + var http2TestServerImpl = new Http2TestServer("localhost", false, 0); + http2TestServerImpl.addHandler(new Http2TestHandler(), "/http2/"); + http2TestServer = HttpTestServer.of(http2TestServerImpl); + http2URI = "http://" + http2TestServer.serverAuthority() + "/http2/x"; - var https2TestServer = new Http2TestServer("localhost", true, sslContext); - https2TestServer.addHandler(new Http2TestHandler(), "/https2/"); - this.https2TestServer = HttpTestServer.of(https2TestServer); - this.https2TestServer.addHandler(new HttpHeadOrGetHandler(), "/https2/head/"); - https2URI = "https://" + this.https2TestServer.serverAuthority() + "/https2/x"; - String h2Head = "https://" + this.https2TestServer.serverAuthority() + "/https2/head/z"; + var https2TestServerImpl = new Http2TestServer("localhost", true, sslContext); + https2TestServerImpl.addHandler(new Http2TestHandler(), "/https2/"); + https2TestServer = HttpTestServer.of(https2TestServerImpl); + https2TestServer.addHandler(new HttpHeadOrGetHandler(), "/https2/head/"); + https2URI = "https://" + https2TestServer.serverAuthority() + "/https2/x"; + String h2Head = "https://" + https2TestServer.serverAuthority() + "/https2/head/z"; // Override the default exchange supplier with a custom one to enable // particular test scenarios - http2TestServer.setExchangeSupplier(FCHttp2TestExchange::new); - https2TestServer.setExchangeSupplier(FCHttp2TestExchange::new); + http2TestServerImpl.setExchangeSupplier(FCHttp2TestExchange::new); + https2TestServerImpl.setExchangeSupplier(FCHttp2TestExchange::new); - this.http2TestServer.start(); - this.https2TestServer.start(); + http2TestServer.start(); + https2TestServer.start(); // warmup to eliminate delay due to SSL class loading and initialization. try (var client = HttpClient.newBuilder().sslContext(sslContext).build()) { var request = HttpRequest.newBuilder(URI.create(h2Head)).HEAD().build(); var resp = client.send(request, BodyHandlers.discarding()); - assertEquals(resp.statusCode(), 200); + assertEquals(200, resp.statusCode()); } } - @AfterTest - public void teardown() throws Exception { + @AfterAll + public static void teardown() throws Exception { http2TestServer.stop(); https2TestServer.stop(); } diff --git a/test/jdk/java/net/httpclient/http2/TrailingHeadersTest.java b/test/jdk/java/net/httpclient/http2/TrailingHeadersTest.java index 9fa6f8b728e..9ea331d2d84 100644 --- a/test/jdk/java/net/httpclient/http2/TrailingHeadersTest.java +++ b/test/jdk/java/net/httpclient/http2/TrailingHeadersTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -28,7 +28,7 @@ * @bug 8296410 * @library /test/jdk/java/net/httpclient/lib * @build jdk.httpclient.test.lib.http2.Http2TestServer - * @run testng/othervm -Djdk.httpclient.HttpClient.log=all TrailingHeadersTest + * @run junit/othervm -Djdk.httpclient.HttpClient.log=all TrailingHeadersTest */ import jdk.httpclient.test.lib.http2.OutgoingPushPromise; @@ -36,11 +36,6 @@ import jdk.internal.net.http.common.HttpHeadersBuilder; import jdk.internal.net.http.frame.DataFrame; import jdk.internal.net.http.frame.HeaderFrame; import jdk.internal.net.http.frame.HeadersFrame; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import javax.net.ssl.SSLSession; import java.io.ByteArrayInputStream; @@ -74,24 +69,30 @@ import jdk.httpclient.test.lib.http2.BodyOutputStream; import static java.net.http.HttpClient.Version.HTTP_2; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TrailingHeadersTest { - Http2TestServer http2TestServer; - URI trailingURI, trailng1xxURI, trailingPushPromiseURI, warmupURI; + private static Http2TestServer http2TestServer; + private static URI trailingURI, trailng1xxURI, trailingPushPromiseURI, warmupURI; static PrintStream testLog = System.err; // Set up simple client-side push promise handler - ConcurrentMap>> pushPromiseMap = new ConcurrentHashMap<>(); + private static ConcurrentMap>> pushPromiseMap = new ConcurrentHashMap<>(); - @BeforeMethod + @BeforeEach public void beforeMethod() { pushPromiseMap = new ConcurrentHashMap<>(); } - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { Properties props = new Properties(); // For triggering trailing headers to send after Push Promise Response headers are sent props.setProperty("sendTrailingHeadersAfterPushPromise", "1"); @@ -119,12 +120,13 @@ public class TrailingHeadersTest { warmupURI = URI.create("http://" + http2TestServer.serverAuthority() + "/WarmupHandler"); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { http2TestServer.stop(); } - @Test(dataProvider = "httpRequests") + @ParameterizedTest + @MethodSource("uris") public void testTrailingHeaders(String description, HttpRequest hRequest, HttpResponse.PushPromiseHandler pph) { testLog.println("testTrailingHeaders(): " + description); HttpClient httpClient = HttpClient.newBuilder().build(); @@ -134,7 +136,7 @@ public class TrailingHeadersTest { testLog.println("testTrailingHeaders(): Performing request: " + hRequest); HttpResponse resp = cf.join(); - assertEquals(resp.statusCode(), 200, "Status code of response should be 200"); + assertEquals(200, resp.statusCode(), "Status code of response should be 200"); // Verify Push Promise was successful if necessary if (pph != null) @@ -144,14 +146,14 @@ public class TrailingHeadersTest { } private void verifyPushPromise() { - assertEquals(pushPromiseMap.size(), 1, "Push Promise should not be greater than 1"); + assertEquals(1, pushPromiseMap.size(), "Push Promise should not be greater than 1"); // This will only iterate once for (HttpRequest r : pushPromiseMap.keySet()) { CompletableFuture> serverPushResp = pushPromiseMap.get(r); // Get the push promise HttpResponse result if present HttpResponse resp = serverPushResp.join(); - assertEquals(resp.body(), "Sample_Push_Data", "Unexpected Push Promise response body"); - assertEquals(resp.statusCode(), 200, "Status code of Push Promise response should be 200"); + assertEquals("Sample_Push_Data", resp.body(), "Unexpected Push Promise response body"); + assertEquals(200, resp.statusCode(), "Status code of Push Promise response should be 200"); } } @@ -162,11 +164,10 @@ public class TrailingHeadersTest { httpClient.sendAsync(warmupReq, BodyHandlers.discarding()).join(); } - @DataProvider(name = "httpRequests") - public Object[][] uris() { + public static Object[][] uris() { HttpResponse.PushPromiseHandler pph = (initial, pushRequest, acceptor) -> { HttpResponse.BodyHandler s = HttpResponse.BodyHandlers.ofString(UTF_8); - pushPromiseMap.put(pushRequest, acceptor.apply(s)); + TrailingHeadersTest.pushPromiseMap.put(pushRequest, acceptor.apply(s)); }; HttpRequest httpGetTrailing = HttpRequest.newBuilder(trailingURI).version(HTTP_2) diff --git a/test/jdk/java/net/httpclient/http2/java.net.http/jdk/internal/net/http/hpack/HeaderTableTest.java b/test/jdk/java/net/httpclient/http2/java.net.http/jdk/internal/net/http/hpack/HeaderTableTest.java index 0eb1714da35..07e27a7f2fa 100644 --- a/test/jdk/java/net/httpclient/http2/java.net.http/jdk/internal/net/http/hpack/HeaderTableTest.java +++ b/test/jdk/java/net/httpclient/http2/java.net.http/jdk/internal/net/http/hpack/HeaderTableTest.java @@ -29,9 +29,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.junit.jupiter.api.Assertions; -import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; public class HeaderTableTest extends SimpleHeaderTableTest { @@ -76,7 +76,7 @@ public class HeaderTableTest extends SimpleHeaderTableTest { Set expectedIndexes = indexes.get(hName); int actualMinimalIndex = table.indexOf(hName, "blah-blah"); - Assertions.assertTrue(expectedIndexes.contains(-actualMinimalIndex)); + assertTrue(expectedIndexes.contains(-actualMinimalIndex)); }); } diff --git a/test/jdk/java/net/httpclient/http3/H3ErrorHandlingTest.java b/test/jdk/java/net/httpclient/http3/H3ErrorHandlingTest.java index 44071ea566d..8dfef7417e3 100644 --- a/test/jdk/java/net/httpclient/http3/H3ErrorHandlingTest.java +++ b/test/jdk/java/net/httpclient/http3/H3ErrorHandlingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -35,13 +35,6 @@ import jdk.internal.net.quic.QuicVersion; import jdk.test.lib.net.SimpleSSLContext; import jdk.test.lib.net.URIBuilder; import jdk.test.lib.Utils; -import org.testng.IRetryAnalyzer; -import org.testng.ITestResult; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Ignore; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import java.io.IOException; @@ -67,7 +60,14 @@ import java.util.concurrent.TimeUnit; import static java.net.http.HttpClient.Version.HTTP_3; import static java.net.http.HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY; import static java.net.http.HttpOption.H3_DISCOVERY; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; /* * @test @@ -82,17 +82,16 @@ import static org.testng.Assert.*; * @build jdk.test.lib.net.SimpleSSLContext * jdk.httpclient.test.lib.common.HttpServerAdapters * @build java.net.http/jdk.internal.net.http.Http3ConnectionAccess - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.httpclient.HttpClient.log=requests,responses,errors H3ErrorHandlingTest */ public class H3ErrorHandlingTest implements HttpServerAdapters { private static final SSLContext sslContext = SimpleSSLContext.findSSLContext(); - private QuicStandaloneServer server; - private String requestURIBase; + private static QuicStandaloneServer server; + private static String requestURIBase; - @DataProvider public static Object[][] controlStreams() { // control / encoder / decoder return new Object[][] {{(byte)0}, {(byte)2}, {(byte)3}}; @@ -148,26 +147,22 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { return result; } - @DataProvider public static Object[][] malformedSettingsFrames() { // 2-byte ID, 2-byte value byte[] settingsFrame = new byte[]{(byte)4,(byte)4,(byte)0x40, (byte)6, (byte)0x40, (byte)6}; return chopFrame(settingsFrame, 1, 2, 3); } - @DataProvider public static Object[][] malformedCancelPushFrames() { byte[] cancelPush = new byte[]{(byte)3,(byte)2, (byte)0x40, (byte)0}; return chopFrame(cancelPush, 0, 1, 3, 9); } - @DataProvider public static Object[][] malformedGoawayFrames() { byte[] goaway = new byte[]{(byte)7,(byte)2, (byte)0x40, (byte)0}; return chopFrame(goaway, 0, 1, 3, 9); } - @DataProvider public static Object[][] malformedResponseHeadersFrames() { byte[] responseHeaders = HexFormat.of().parseHex( "011a0000"+ // headers, length 26, section prefix @@ -176,7 +171,6 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { return chopFrame(responseHeaders, 0, 1, 4, 5, 6, 7); } - @DataProvider public static Object[][] truncatedResponseFrames() { byte[] response = HexFormat.of().parseHex( "01030000"+ // headers, length 3, section prefix @@ -187,7 +181,6 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { return chopBytes(response, 1, 2, 3, 4, 6, 7, 9, 10); } - @DataProvider public static Object[][] truncatedControlFrames() { byte[] response = HexFormat.of().parseHex( "00"+ // stream type: control @@ -198,12 +191,10 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { return chopBytes(response, 2, 3, 4, 6, 7, 9, 10); } - @DataProvider public static Object[][] malformedPushPromiseFrames() { return chopFrame(valid_push_promise, 0, 1, 2, 4, 5, 6); } - @DataProvider public static Object[][] invalidControlFrames() { // frames not valid on the server control stream (after settings) // all except cancel_push / goaway (max_push_id is client-only) @@ -211,7 +202,6 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { {reserved1}, {reserved2}, {reserved3}, {reserved4}}; } - @DataProvider public static Object[][] invalidResponseFrames() { // frames not valid on the response stream // all except headers / push_promise @@ -220,7 +210,6 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { {reserved1}, {reserved2}, {reserved3}, {reserved4}}; } - @DataProvider public static Object[][] invalidPushFrames() { // frames not valid on the push promise stream // all except headers @@ -229,8 +218,8 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { {reserved1}, {reserved2}, {reserved3}, {reserved4}}; } - @BeforeClass - public void beforeClass() throws Exception { + @BeforeAll + public static void beforeClass() throws Exception { server = QuicStandaloneServer.newBuilder() .availableVersions(new QuicVersion[]{QuicVersion.QUIC_V1}) .sslContext(sslContext) @@ -242,8 +231,8 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { .port(server.getAddress().getPort()).build().toString(); } - @AfterClass - public void afterClass() throws Exception { + @AfterAll + public static void afterClass() throws Exception { if (server != null) { System.out.println("Stopping server " + server.getAddress()); server.close(); @@ -256,7 +245,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testNonSettingsFrame() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -274,10 +263,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server opens 2 control streams */ - @Test(dataProvider = "controlStreams") + @ParameterizedTest + @MethodSource("controlStreams") public void testTwoControlStreams(byte type) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream, controlStream2; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); @@ -299,10 +289,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server closes control stream */ - @Test(dataProvider = "controlStreams") + @ParameterizedTest + @MethodSource("controlStreams") public void testCloseControlStream(byte type) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var controlscheduler = SequentialScheduler.lockingScheduler(() -> {}); @@ -315,26 +306,34 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { triggerError(errorCF, Http3Error.H3_CLOSED_CRITICAL_STREAM); } - public static class RetryOnce implements IRetryAnalyzer { - boolean retried; - - @Override - public boolean retry(ITestResult iTestResult) { - if (!retried) { - retried = true; - return true; - } - return false; - } - } - /** * Server resets control stream */ - @Test(dataProvider = "controlStreams", retryAnalyzer = RetryOnce.class) + @ParameterizedTest + @MethodSource("controlStreams") public void testResetControlStream(byte type) throws Exception { + try { + System.out.printf("testResetControlStream(%s) - first attempt%n", type); + System.err.printf("%ntestResetControlStream(%s) - first attempt%n", type); + testResetControlStreamImpl(type); + System.out.printf("testResetControlStream(%s) - first attempt succeeded!%n", type); + System.err.printf("%ntestResetControlStream(%s) - first attempt succeeded!%n", type); + } catch (Throwable t) { + System.out.printf("testResetControlStream(%s) - first attempt failed: %s%n", + type, t); + System.err.printf("%ntestResetControlStream(%s) - first attempt failed: %s%n", + type); + System.out.printf("testResetControlStream(%s) - retrying...%n", type); + System.err.printf("%ntestResetControlStream(%s) - retrying...%n", type); + testResetControlStreamImpl(type); + System.out.printf("testResetControlStream(%s) - retry succeeded!%n", type); + System.err.printf("%ntestResetControlStream(%s) - retry succeeded!%n", type); + } + } + + private void testResetControlStreamImpl(byte type) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var controlscheduler = SequentialScheduler.lockingScheduler(() -> {}); @@ -362,10 +361,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends unexpected frame on control stream */ - @Test(dataProvider = "invalidControlFrames") + @ParameterizedTest + @MethodSource("invalidControlFrames") public void testUnexpectedControlFrame(byte[] frame) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -387,10 +387,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed settings frame */ - @Test(dataProvider = "malformedSettingsFrames") + @ParameterizedTest + @MethodSource("malformedSettingsFrames") public void testMalformedSettingsFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -412,10 +413,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed goaway frame */ - @Test(dataProvider = "malformedGoawayFrames") + @ParameterizedTest + @MethodSource("malformedGoawayFrames") public void testMalformedGoawayFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -437,10 +439,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed cancel push frame */ - @Test(dataProvider = "malformedCancelPushFrames") + @ParameterizedTest + @MethodSource("malformedCancelPushFrames") public void testMalformedCancelPushFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -465,7 +468,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testInvalidGoAwaySequence() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -487,7 +490,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testInvalidGoAwayId() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -509,7 +512,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testInvalidCancelPushId() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -529,10 +532,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends unexpected frame on push stream */ - @Test(dataProvider = "invalidPushFrames") + @ParameterizedTest + @MethodSource("invalidPushFrames") public void testUnexpectedPushFrame(byte[] frame) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream pushStream; pushStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -556,10 +560,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed frame on push stream */ - @Test(dataProvider = "malformedResponseHeadersFrames") + @ParameterizedTest + @MethodSource("malformedResponseHeadersFrames") public void testMalformedPushStreamFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream pushStream; pushStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -585,10 +590,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed frame on push stream */ - @Test(dataProvider = "malformedPushPromiseFrames") + @ParameterizedTest + @MethodSource("malformedPushPromiseFrames") public void testMalformedPushPromiseFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { // write PUSH_PROMISE frame s.outputStream().write(frame); // ignore the request stream; we're expecting the client to close the connection @@ -605,7 +611,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testDuplicatePushStream() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream pushStream, pushStream2; pushStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); pushStream2 = c.openNewLocalUniStream(Duration.ZERO).resultNow(); @@ -634,7 +640,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testInvalidPushPromiseId() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { // write PUSH_PROMISE frame s.outputStream().write(huge_id_push_promise); // ignore the request stream; we're expecting the client to close the connection @@ -649,7 +655,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testInvalidPushStreamId() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream pushStream; pushStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -669,10 +675,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends unexpected frame on response stream */ - @Test(dataProvider = "invalidResponseFrames") + @ParameterizedTest + @MethodSource("invalidResponseFrames") public void testUnexpectedResponseFrame(byte[] frame) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { s.outputStream().write(frame); // ignore the request stream; we're expecting the client to close the connection completeUponTermination(c, errorCF); @@ -683,10 +690,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server sends malformed headers frame on response stream */ - @Test(dataProvider = "malformedResponseHeadersFrames") + @ParameterizedTest + @MethodSource("malformedResponseHeadersFrames") public void testMalformedResponseFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { s.outputStream().write(frame); // ignore the request stream; we're expecting the client to close the connection completeUponTermination(c, errorCF); @@ -699,10 +707,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server truncates a frame on the response stream */ - @Test(dataProvider = "truncatedResponseFrames") + @ParameterizedTest + @MethodSource("truncatedResponseFrames") public void testTruncatedResponseFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { try (OutputStream outputStream = s.outputStream()) { outputStream.write(frame); } @@ -715,10 +724,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server truncates a frame on the control stream */ - @Test(dataProvider = "truncatedControlFrames") + @ParameterizedTest + @MethodSource("truncatedControlFrames") public void testTruncatedControlFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var controlscheduler = SequentialScheduler.lockingScheduler(() -> {}); @@ -735,10 +745,11 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { /** * Server truncates a frame on the push stream */ - @Test(dataProvider = "truncatedResponseFrames") + @ParameterizedTest + @MethodSource("truncatedResponseFrames") public void testTruncatedPushStreamFrame(byte[] frame, int bytes) throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream pushStream; pushStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -765,7 +776,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { @Test public void testReservedSettingsFrames() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream controlStream; controlStream = c.openNewLocalUniStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -785,7 +796,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testStatelessReset() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { // stateless reset QuicConnectionId localConnId = c.localConnectionId(); ByteBuffer resetDatagram = c.endpoint().idFactory().statelessReset(localConnId.asReadOnlyBuffer(), 43); @@ -819,10 +830,10 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { * Server opens a bidi stream */ @Test - @Ignore("BiDi streams are rejected by H3 client at QUIC level") + @Disabled("BiDi streams are rejected by H3 client at QUIC level") public void testBidiStream() throws Exception { CompletableFuture errorCF = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { QuicSenderStream bidiStream; bidiStream = c.openNewLocalBidiStream(Duration.ZERO).resultNow(); var scheduler = SequentialScheduler.lockingScheduler(() -> { @@ -842,7 +853,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseQUIC() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.forException( new QuicTransportException("ignored", null, 0, QuicTransportErrors.INTERNAL_ERROR) @@ -859,7 +870,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseCryptoQUIC() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.forException( new QuicTransportException("ignored", null, 0, QuicTransportErrors.CRYPTO_ERROR.from() + 80 /*Alert.INTERNAL_ERROR.id*/, null) @@ -876,7 +887,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseUnknownCryptoQUIC() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.forException( new QuicTransportException("ignored", null, 0, QuicTransportErrors.CRYPTO_ERROR.from() + 5, null) @@ -893,7 +904,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseUnknownQUIC() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.forException( new QuicTransportException("ignored", null, 0, QuicTransportErrors.CRYPTO_ERROR.to() + 1 /*0x200*/, null) @@ -910,7 +921,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseH3() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.appLayerClose(Http3Error.H3_EXCESSIVE_LOAD.code()); tc.peerVisibleReason("testtest"); c.connectionTerminator().terminate(tc); @@ -924,7 +935,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { */ @Test public void testConnectionCloseH3Unknown() throws Exception { - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { TerminationCause tc = TerminationCause.appLayerClose(0x1f21); tc.peerVisibleReason("testtest"); c.connectionTerminator().terminate(tc); @@ -974,7 +985,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { System.out.println("Server reason: \"" + terminationCause.getPeerVisibleReason()+'"'); final long actual = terminationCause.getCloseCode(); // expected - assertEquals(actual, expected.code(), "Expected " + toHexString(expected) + " got 0x" + Long.toHexString(actual)); + assertEquals(expected.code(), actual, "Expected " + toHexString(expected) + " got 0x" + Long.toHexString(actual)); } finally { client.shutdownNow(); } @@ -1027,7 +1038,7 @@ public class H3ErrorHandlingTest implements HttpServerAdapters { System.out.println("Server reason: \"" + terminationCause.getPeerVisibleReason()+'"'); final long actual = terminationCause.getCloseCode(); // expected - assertEquals(actual, http3Error.code(), "Expected " + toHexString(http3Error) + " got 0x" + Long.toHexString(actual)); + assertEquals(http3Error.code(), actual, "Expected " + toHexString(http3Error) + " got 0x" + Long.toHexString(actual)); } finally { client.shutdownNow(); } diff --git a/test/jdk/java/net/httpclient/http3/H3MalformedResponseTest.java b/test/jdk/java/net/httpclient/http3/H3MalformedResponseTest.java index 5ef45f8b230..eaab2711479 100644 --- a/test/jdk/java/net/httpclient/http3/H3MalformedResponseTest.java +++ b/test/jdk/java/net/httpclient/http3/H3MalformedResponseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -458,7 +458,7 @@ class H3MalformedResponseTest { private static BooleanSupplier configureServerResponse(byte[] serverResponseBytes) { var connectionTerminated = new AtomicBoolean(); - SERVER.addHandler((c, s)-> { + SERVER.setHandler((c, s)-> { try (OutputStream outputStream = s.outputStream()) { outputStream.write(serverResponseBytes); } diff --git a/test/jdk/java/net/httpclient/http3/H3MemoryHandlingTest.java b/test/jdk/java/net/httpclient/http3/H3MemoryHandlingTest.java index 2fcb7388f7b..0d107486fcd 100644 --- a/test/jdk/java/net/httpclient/http3/H3MemoryHandlingTest.java +++ b/test/jdk/java/net/httpclient/http3/H3MemoryHandlingTest.java @@ -109,7 +109,7 @@ public class H3MemoryHandlingTest implements HttpServerAdapters { "00ffffffffffffffff"); // data, 2^62 - 1 bytes byte[] kilo = new byte[1024]; final CompletableFuture serverAllWritesDone = new CompletableFuture<>(); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { // verify that the connection stays open completeUponTermination(c, errorCF); try (OutputStream outputStream = s.outputStream()) { @@ -154,7 +154,7 @@ public class H3MemoryHandlingTest implements HttpServerAdapters { byte[] kilo = new byte[1024]; CountDownLatch writerBlocked = new CountDownLatch(1); - server.addHandler((c,s)-> { + server.setHandler((c, s)-> { // verify that the connection stays open completeUponTermination(c, errorCF); QuicBidiStream qs = s.underlyingBidiStream(); diff --git a/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicServerHandler.java b/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicServerHandler.java index 886f15821a6..bef2e40137b 100644 --- a/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicServerHandler.java +++ b/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicServerHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -31,7 +31,7 @@ import jdk.internal.net.http.quic.streams.QuicBidiStream; * Used by server side application code to handle incoming Quic connections and streams associated * with those connections * - * @see QuicStandaloneServer#addHandler(QuicServerHandler) + * @see QuicStandaloneServer#setHandler(QuicServerHandler) */ // TODO: should we make this an abstract class instead of interface? public interface QuicServerHandler { diff --git a/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicStandaloneServer.java b/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicStandaloneServer.java index b1697064556..a7b5bb42ac2 100644 --- a/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicStandaloneServer.java +++ b/test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/quic/QuicStandaloneServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -64,7 +64,7 @@ public final class QuicStandaloneServer extends QuicServer { setConnectionAcceptor(QuicStandaloneServer::acceptIncoming); } - public void addHandler(final QuicServerHandler handler) { + public void setHandler(final QuicServerHandler handler) { this.handler = handler; } diff --git a/test/jdk/java/net/httpclient/quic/KeyUpdateTest.java b/test/jdk/java/net/httpclient/quic/KeyUpdateTest.java index d13b8d9b865..eaec0bc8b95 100644 --- a/test/jdk/java/net/httpclient/quic/KeyUpdateTest.java +++ b/test/jdk/java/net/httpclient/quic/KeyUpdateTest.java @@ -102,7 +102,7 @@ public class KeyUpdateTest { .sslContext(sslContext) .build(); // add a handler which deals with incoming connections - server.addHandler(handler); + server.setHandler(handler); server.start(); System.out.println("Server started at " + server.getAddress()); } diff --git a/test/jdk/java/net/httpclient/quic/PacketLossTest.java b/test/jdk/java/net/httpclient/quic/PacketLossTest.java index 1f75e1feb95..a597c826e73 100644 --- a/test/jdk/java/net/httpclient/quic/PacketLossTest.java +++ b/test/jdk/java/net/httpclient/quic/PacketLossTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -158,7 +158,7 @@ public class PacketLossTest { private static void startServer(final QuicStandaloneServer server) throws IOException { // add a handler which deals with incoming connections - server.addHandler(new EchoHandler(HELLO_MSG.length)); + server.setHandler(new EchoHandler(HELLO_MSG.length)); server.start(); System.out.println("Server " + server.name() + " started at " + server.getAddress()); } diff --git a/test/jdk/java/net/httpclient/quic/QuicRequestResponseTest.java b/test/jdk/java/net/httpclient/quic/QuicRequestResponseTest.java index 208e284cefd..2393ac7df12 100644 --- a/test/jdk/java/net/httpclient/quic/QuicRequestResponseTest.java +++ b/test/jdk/java/net/httpclient/quic/QuicRequestResponseTest.java @@ -73,7 +73,7 @@ public class QuicRequestResponseTest { .sslContext(sslContext) .build(); // add a handler which deals with incoming connections - server.addHandler(new EchoHandler(HELLO_MSG.length)); + server.setHandler(new EchoHandler(HELLO_MSG.length)); server.start(); System.out.println("Server started at " + server.getAddress()); } diff --git a/test/jdk/java/net/httpclient/quic/StatelessResetReceiptTest.java b/test/jdk/java/net/httpclient/quic/StatelessResetReceiptTest.java index a20494095bd..9f7852740b4 100644 --- a/test/jdk/java/net/httpclient/quic/StatelessResetReceiptTest.java +++ b/test/jdk/java/net/httpclient/quic/StatelessResetReceiptTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -128,7 +128,7 @@ public class StatelessResetReceiptTest { public void testActiveConnection() throws Exception { final CompletableFuture serverConnCF = new MinimalFuture<>(); final NotifyingHandler handler = new NotifyingHandler(serverConnCF); - server.addHandler(handler); + server.setHandler(handler); try (final QuicClient client = createClient()) { // create a QUIC connection to the server final ClientConnection conn = ClientConnection.establishConnection(client, @@ -162,7 +162,7 @@ public class StatelessResetReceiptTest { public void testClosingConnection() throws Exception { final CompletableFuture serverConnCF = new MinimalFuture<>(); final NotifyingHandler handler = new NotifyingHandler(serverConnCF); - server.addHandler(handler); + server.setHandler(handler); try (final QuicClient client = createClient()) { // create a QUIC connection to the server final ClientConnection conn = ClientConnection.establishConnection(client, @@ -215,7 +215,7 @@ public class StatelessResetReceiptTest { public void testDrainingConnection() throws Exception { final CompletableFuture serverConnCF = new MinimalFuture<>(); final NotifyingHandler handler = new NotifyingHandler(serverConnCF); - server.addHandler(handler); + server.setHandler(handler); try (final QuicClient client = createClient()) { // create a QUIC connection to the server final ClientConnection conn = ClientConnection.establishConnection(client, diff --git a/test/jdk/java/net/httpclient/quic/VersionNegotiationTest.java b/test/jdk/java/net/httpclient/quic/VersionNegotiationTest.java index bd5bbae0170..6b40bf84a8e 100644 --- a/test/jdk/java/net/httpclient/quic/VersionNegotiationTest.java +++ b/test/jdk/java/net/httpclient/quic/VersionNegotiationTest.java @@ -126,7 +126,7 @@ public class VersionNegotiationTest { .availableVersions(new QuicVersion[]{version}) .sslContext(sslContext) .build(); - server.addHandler(new ExceptionThrowingHandler()); + server.setHandler(new ExceptionThrowingHandler()); server.start(); System.out.println("Quic server with version " + version + " started at " + server.getAddress()); return server; diff --git a/test/jdk/java/net/httpclient/websocket/Abort.java b/test/jdk/java/net/httpclient/websocket/Abort.java index 99c94de83f0..a6088f8cce2 100644 --- a/test/jdk/java/net/httpclient/websocket/Abort.java +++ b/test/jdk/java/net/httpclient/websocket/Abort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,12 +24,11 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.websocket.debug=true * Abort */ -import org.testng.annotations.Test; import java.io.IOException; import java.net.ProtocolException; @@ -44,10 +43,12 @@ import java.util.concurrent.TimeoutException; import static java.net.http.HttpClient.newHttpClient; import static java.net.http.WebSocket.NORMAL_CLOSURE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; public class Abort { @@ -79,7 +80,7 @@ public class Abort { TimeUnit.SECONDS.sleep(5); List inv = listener.invocationsSoFar(); // no more invocations after onOpen as WebSocket was aborted - assertEquals(inv, List.of(MockListener.Invocation.onOpen(webSocket))); + assertEquals(List.of(MockListener.Invocation.onOpen(webSocket)), inv); } finally { webSocket.abort(); } @@ -119,7 +120,7 @@ public class Abort { List expected = List.of( MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onText(webSocket, "", true)); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -159,7 +160,7 @@ public class Abort { List expected = List.of( MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onBinary(webSocket, ByteBuffer.allocate(0), true)); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -198,7 +199,7 @@ public class Abort { List expected = List.of( MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onPing(webSocket, ByteBuffer.allocate(0))); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -237,7 +238,7 @@ public class Abort { List expected = List.of( MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onPong(webSocket, ByteBuffer.allocate(0))); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -277,7 +278,7 @@ public class Abort { List expected = List.of( MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onClose(webSocket, 1005, "")); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -318,7 +319,7 @@ public class Abort { MockListener.Invocation.onOpen(webSocket), MockListener.Invocation.onError(webSocket, ProtocolException.class)); System.out.println("actual invocations:" + Arrays.toString(inv.toArray())); - assertEquals(inv, expected); + assertEquals(expected, inv); } finally { webSocket.abort(); } @@ -396,7 +397,7 @@ public class Abort { ws.abort(); assertTrue(ws.isInputClosed()); assertTrue(ws.isOutputClosed()); - assertEquals(ws.getSubprotocol(), ""); + assertEquals("", ws.getSubprotocol()); } // at this point valid requests MUST be a no-op: for (int j = 0; j < 3; j++) { diff --git a/test/jdk/java/net/httpclient/websocket/AutomaticPong.java b/test/jdk/java/net/httpclient/websocket/AutomaticPong.java index 1999781b82f..b438cb8e728 100644 --- a/test/jdk/java/net/httpclient/websocket/AutomaticPong.java +++ b/test/jdk/java/net/httpclient/websocket/AutomaticPong.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,13 +24,11 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.websocket.debug=true * AutomaticPong */ import jdk.internal.net.http.websocket.Frame; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.io.IOException; import java.net.http.WebSocket; @@ -39,10 +37,14 @@ import java.nio.charset.StandardCharsets; import java.util.List; import static java.net.http.HttpClient.newHttpClient; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public class AutomaticPong { /* @@ -86,7 +88,7 @@ public class AutomaticPong { MockListener.Invocation.onPing(webSocket, hello), MockListener.Invocation.onClose(webSocket, 1005, "") ); - assertEquals(actual, expected); + assertEquals(expected, actual); } finally { webSocket.abort(); } @@ -104,7 +106,8 @@ public class AutomaticPong { * b) the last Pong corresponds to the last Ping * c) there are no unrelated Pongs */ - @Test(dataProvider = "nPings") + @ParameterizedTest + @MethodSource("nPings") public void automaticPongs(int nPings) throws Exception { // big enough to not bother with resize ByteBuffer buffer = ByteBuffer.allocate(65536); @@ -133,7 +136,7 @@ public class AutomaticPong { .join(); try { List inv = listener.invocations(); - assertEquals(inv.size(), nPings + 2); // n * onPing + onOpen + onClose + assertEquals(nPings + 2, inv.size()); // n * onPing + onOpen + onClose ByteBuffer data = server.read(); Frame.Reader reader = new Frame.Reader(); @@ -171,7 +174,7 @@ public class AutomaticPong { closed = true; return; } - assertEquals(value, Frame.Opcode.PONG); + assertEquals(Frame.Opcode.PONG, value); } @Override @@ -182,7 +185,7 @@ public class AutomaticPong { @Override public void payloadLen(long value) { if (!closed) - assertEquals(value, 4); + assertEquals(4, value); } @Override @@ -222,8 +225,7 @@ public class AutomaticPong { } - @DataProvider(name = "nPings") - public Object[][] nPings() { + public static Object[][] nPings() { return new Object[][]{{1}, {2}, {4}, {8}, {9}, {256}}; } } diff --git a/test/jdk/java/net/httpclient/websocket/BlowupOutputQueue.java b/test/jdk/java/net/httpclient/websocket/BlowupOutputQueue.java index 7bf2564a04f..1865ca05e4f 100644 --- a/test/jdk/java/net/httpclient/websocket/BlowupOutputQueue.java +++ b/test/jdk/java/net/httpclient/websocket/BlowupOutputQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,14 +24,12 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * BlowupOutputQueue */ -import org.testng.annotations.Test; - import java.io.IOException; import java.net.http.WebSocket; import java.nio.ByteBuffer; @@ -43,7 +41,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import static org.testng.Assert.assertFalse; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; public class BlowupOutputQueue extends PendingOperations { diff --git a/test/jdk/java/net/httpclient/websocket/HandshakeUrlEncodingTest.java b/test/jdk/java/net/httpclient/websocket/HandshakeUrlEncodingTest.java index 25a6893ff13..6854cacbcc2 100644 --- a/test/jdk/java/net/httpclient/websocket/HandshakeUrlEncodingTest.java +++ b/test/jdk/java/net/httpclient/websocket/HandshakeUrlEncodingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -29,7 +29,7 @@ * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestServerConfigurator * @modules java.net.http/jdk.internal.net.http.common * jdk.httpserver - * @run testng/othervm -Djdk.internal.httpclient.debug=true HandshakeUrlEncodingTest + * @run junit/othervm -Djdk.internal.httpclient.debug=true HandshakeUrlEncodingTest */ import com.sun.net.httpserver.HttpHandler; @@ -39,10 +39,6 @@ import com.sun.net.httpserver.HttpExchange; import jdk.httpclient.test.lib.common.TestServerConfigurator; import jdk.test.lib.net.SimpleSSLContext; import jdk.test.lib.net.URIBuilder; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import java.io.IOException; @@ -58,20 +54,25 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; - import static java.net.http.HttpClient.Builder.NO_PROXY; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.fail; import static java.lang.System.out; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + + public class HandshakeUrlEncodingTest { private static final SSLContext sslContext = SimpleSSLContext.findSSLContext(); - HttpServer httpTestServer; - HttpsServer httpsTestServer; - String httpURI; - String httpsURI; + private static HttpServer httpTestServer; + private static HttpsServer httpsTestServer; + private static String httpURI; + private static String httpsURI; static String queryPart; @@ -79,8 +80,7 @@ public class HandshakeUrlEncodingTest { // a shared executor helps reduce the amount of threads created by the test static final ExecutorService executor = Executors.newCachedThreadPool(); - @DataProvider(name = "variants") - public Object[][] variants() { + public static Object[][] variants() { return new Object[][]{ { httpURI, false }, { httpsURI, false }, @@ -97,7 +97,8 @@ public class HandshakeUrlEncodingTest { .build(); } - @Test(dataProvider = "variants") + @ParameterizedTest + @MethodSource("variants") public void test(String uri, boolean sameClient) { HttpClient client = null; out.println("The url is " + uri); @@ -119,22 +120,21 @@ public class HandshakeUrlEncodingTest { final WebSocketHandshakeException wse = (WebSocketHandshakeException) t; assertNotNull(wse.getResponse()); assertNotNull(wse.getResponse().uri()); - assertNotNull(wse.getResponse().statusCode()); final String rawQuery = wse.getResponse().uri().getRawQuery(); final String expectedRawQuery = "&raw=abc+def/ghi=xyz&encoded=abc%2Bdef%2Fghi%3Dxyz"; - assertEquals(rawQuery, expectedRawQuery); + assertEquals(expectedRawQuery, rawQuery); final String body = (String) wse.getResponse().body(); final String expectedBody = "/?" + expectedRawQuery; - assertEquals(body, expectedBody); + assertEquals(expectedBody, body); out.println("Status code is " + wse.getResponse().statusCode()); out.println("Response is " + wse.getResponse()); - assertEquals(wse.getResponse().statusCode(), 400); + assertEquals(400, wse.getResponse().statusCode()); } } } - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0); queryPart = "?&raw=abc+def/ghi=xyz&encoded=abc%2Bdef%2Fghi%3Dxyz"; httpTestServer = HttpServer.create(sa, 10); @@ -164,8 +164,8 @@ public class HandshakeUrlEncodingTest { httpsTestServer.start(); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { httpTestServer.stop(0); httpsTestServer.stop(0); executor.shutdownNow(); diff --git a/test/jdk/java/net/httpclient/websocket/HeaderWriterDriver.java b/test/jdk/java/net/httpclient/websocket/HeaderWriterDriver.java index 6293b1b6c71..75ae5423f00 100644 --- a/test/jdk/java/net/httpclient/websocket/HeaderWriterDriver.java +++ b/test/jdk/java/net/httpclient/websocket/HeaderWriterDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,7 +25,7 @@ * @test * @bug 8159053 * @modules java.net.http/jdk.internal.net.http.websocket:open - * @run testng/othervm + * @run junit/othervm * --add-reads java.net.http=ALL-UNNAMED * java.net.http/jdk.internal.net.http.websocket.HeaderWriterTest */ diff --git a/test/jdk/java/net/httpclient/websocket/MaskerDriver.java b/test/jdk/java/net/httpclient/websocket/MaskerDriver.java index b84ea1fff5c..e81417c25ef 100644 --- a/test/jdk/java/net/httpclient/websocket/MaskerDriver.java +++ b/test/jdk/java/net/httpclient/websocket/MaskerDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,7 +25,7 @@ * @test * @bug 8159053 * @modules java.net.http/jdk.internal.net.http.websocket:open - * @run testng/othervm + * @run junit/othervm * --add-reads java.net.http=ALL-UNNAMED * java.net.http/jdk.internal.net.http.websocket.MaskerTest */ diff --git a/test/jdk/java/net/httpclient/websocket/MessageQueueDriver.java b/test/jdk/java/net/httpclient/websocket/MessageQueueDriver.java index 9831bb59297..68a23d0be88 100644 --- a/test/jdk/java/net/httpclient/websocket/MessageQueueDriver.java +++ b/test/jdk/java/net/httpclient/websocket/MessageQueueDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,7 @@ * @test * @bug 8159053 * @modules java.net.http/jdk.internal.net.http.websocket:open - * @run testng/othervm + * @run junit/othervm * --add-reads java.net.http=ALL-UNNAMED * java.net.http/jdk.internal.net.http.websocket.MessageQueueTest */ diff --git a/test/jdk/java/net/httpclient/websocket/PendingBinaryPingClose.java b/test/jdk/java/net/httpclient/websocket/PendingBinaryPingClose.java index 5a410251593..4a5ae315e91 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingBinaryPingClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingBinaryPingClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,28 +24,30 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * PendingBinaryPingClose */ -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingBinaryPingClose extends PendingOperations { CompletableFuture cfBinary; CompletableFuture cfPing; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingBinaryPingClose(boolean last) throws Exception { repeatable(() -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingBinaryPongClose.java b/test/jdk/java/net/httpclient/websocket/PendingBinaryPongClose.java index bef3d258850..a8330faeb3f 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingBinaryPongClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingBinaryPongClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,28 +24,30 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * PendingBinaryPongClose */ -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingBinaryPongClose extends PendingOperations { CompletableFuture cfBinary; CompletableFuture cfPong; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingBinaryPongClose(boolean last) throws Exception { repeatable(() -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingOperations.java b/test/jdk/java/net/httpclient/websocket/PendingOperations.java index b4d7d7e2222..32350a1ab41 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingOperations.java +++ b/test/jdk/java/net/httpclient/websocket/PendingOperations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -21,9 +21,6 @@ * questions. */ -import org.testng.annotations.AfterMethod; -import org.testng.annotations.DataProvider; - import java.io.IOException; import java.net.http.HttpClient; import java.net.http.WebSocket; @@ -35,6 +32,8 @@ import java.util.function.BooleanSupplier; import static java.net.http.HttpClient.Builder.NO_PROXY; import static java.net.http.HttpClient.newBuilder; +import org.junit.jupiter.api.AfterEach; + /* Common infrastructure for tests that check pending operations */ public class PendingOperations { @@ -54,7 +53,7 @@ public class PendingOperations { return newBuilder().proxy(NO_PROXY).build(); } - @AfterMethod + @AfterEach public void cleanup() { // make sure we have a trace both on System.out and System.err // to help with diagnosis. @@ -85,8 +84,7 @@ public class PendingOperations { Support.assertNotDone(future); } - @DataProvider(name = "booleans") - public Object[][] booleans() { + public static Object[][] booleans() { return new Object[][]{{Boolean.TRUE}, {Boolean.FALSE}}; } diff --git a/test/jdk/java/net/httpclient/websocket/PendingPingBinaryClose.java b/test/jdk/java/net/httpclient/websocket/PendingPingBinaryClose.java index c1c314395e8..e07ebe0d03a 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingPingBinaryClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingPingBinaryClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,7 +24,7 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * PendingPingBinaryClose */ @@ -33,21 +33,23 @@ // * -Djdk.internal.httpclient.debug=true // * -Djdk.internal.httpclient.websocket.debug=true -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingPingBinaryClose extends PendingOperations { CompletableFuture cfBinary; CompletableFuture cfPing; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingPingBinaryClose(boolean last) throws Exception { repeatable( () -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingPingTextClose.java b/test/jdk/java/net/httpclient/websocket/PendingPingTextClose.java index 82666fafe67..eae01f804a4 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingPingTextClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingPingTextClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,7 +24,7 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * PendingPingTextClose */ @@ -33,14 +33,15 @@ // * -Djdk.internal.httpclient.debug=true // * -Djdk.internal.httpclient.websocket.debug=true -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingPingTextClose extends PendingOperations { static boolean debug = false; // avoid too verbose output @@ -48,7 +49,8 @@ public class PendingPingTextClose extends PendingOperations { CompletableFuture cfPing; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingPingTextClose(boolean last) throws Exception { try { repeatable(() -> { diff --git a/test/jdk/java/net/httpclient/websocket/PendingPongBinaryClose.java b/test/jdk/java/net/httpclient/websocket/PendingPongBinaryClose.java index 0aa2f24c660..32640853b00 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingPongBinaryClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingPongBinaryClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,7 +24,7 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * PendingPongBinaryClose */ @@ -33,21 +33,23 @@ // * -Djdk.internal.httpclient.debug=true // * -Djdk.internal.httpclient.websocket.debug=true -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingPongBinaryClose extends PendingOperations { CompletableFuture cfBinary; CompletableFuture cfPong; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingPongBinaryClose(boolean last) throws Exception { repeatable( () -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingPongTextClose.java b/test/jdk/java/net/httpclient/websocket/PendingPongTextClose.java index f919a6706ad..f4d6c84c2f5 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingPongTextClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingPongTextClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,7 +24,7 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.httpclient.sendBufferSize=8192 * PendingPongTextClose */ @@ -33,21 +33,23 @@ // * -Djdk.internal.httpclient.debug=true // * -Djdk.internal.httpclient.websocket.debug=true -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingPongTextClose extends PendingOperations { CompletableFuture cfText; CompletableFuture cfPong; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingPongTextClose(boolean last) throws Exception { repeatable( () -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingTextPingClose.java b/test/jdk/java/net/httpclient/websocket/PendingTextPingClose.java index 39c8bbdc444..76f12430804 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingTextPingClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingTextPingClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,15 +24,13 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * -Djdk.httpclient.sendBufferSize=8192 * PendingTextPingClose */ -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.nio.CharBuffer; @@ -40,13 +38,17 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingTextPingClose extends PendingOperations { CompletableFuture cfText; CompletableFuture cfPing; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingTextPingClose(boolean last) throws Exception { repeatable(() -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/PendingTextPongClose.java b/test/jdk/java/net/httpclient/websocket/PendingTextPongClose.java index 8fa90400760..a2a41a73d7b 100644 --- a/test/jdk/java/net/httpclient/websocket/PendingTextPongClose.java +++ b/test/jdk/java/net/httpclient/websocket/PendingTextPongClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,15 +24,13 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * -Djdk.httpclient.sendBufferSize=8192 * PendingTextPongClose */ -import org.testng.annotations.Test; - import java.net.http.WebSocket; import java.nio.ByteBuffer; import java.nio.CharBuffer; @@ -40,13 +38,17 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class PendingTextPongClose extends PendingOperations { CompletableFuture cfText; CompletableFuture cfPong; CompletableFuture cfClose; - @Test(dataProvider = "booleans") + @ParameterizedTest + @MethodSource("booleans") public void pendingTextPongClose(boolean last) throws Exception { repeatable(() -> { server = Support.notReadingServer(); diff --git a/test/jdk/java/net/httpclient/websocket/ReaderDriver.java b/test/jdk/java/net/httpclient/websocket/ReaderDriver.java index 0b874792b4f..3e195be046d 100644 --- a/test/jdk/java/net/httpclient/websocket/ReaderDriver.java +++ b/test/jdk/java/net/httpclient/websocket/ReaderDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,6 +25,8 @@ * @test * @bug 8159053 * @modules java.net.http/jdk.internal.net.http.websocket:open - * @run testng/othervm/timeout=240 --add-reads java.net.http=ALL-UNNAMED java.net.http/jdk.internal.net.http.websocket.ReaderTest + * @run junit/othervm/timeout=240 + * --add-reads java.net.http=ALL-UNNAMED + * java.net.http/jdk.internal.net.http.websocket.ReaderTest */ public final class ReaderDriver { } diff --git a/test/jdk/java/net/httpclient/websocket/SecureSupport.java b/test/jdk/java/net/httpclient/websocket/SecureSupport.java index 8b565768c29..41709d2fedb 100644 --- a/test/jdk/java/net/httpclient/websocket/SecureSupport.java +++ b/test/jdk/java/net/httpclient/websocket/SecureSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -22,18 +22,9 @@ */ import java.io.IOException; -import java.net.Socket; import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionException; -import java.util.concurrent.CompletionStage; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import static org.testng.Assert.assertThrows; /** * Helper class to create instances of DummySecureWebSocketServer which diff --git a/test/jdk/java/net/httpclient/websocket/SendTest.java b/test/jdk/java/net/httpclient/websocket/SendTest.java index 39021131156..b3a433b5c29 100644 --- a/test/jdk/java/net/httpclient/websocket/SendTest.java +++ b/test/jdk/java/net/httpclient/websocket/SendTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,22 +24,22 @@ /* * @test * @build DummyWebSocketServer - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.websocket.debug=true * SendTest */ -import org.testng.annotations.Test; - import java.io.IOException; import java.net.http.WebSocket; import static java.net.http.HttpClient.Builder.NO_PROXY; import static java.net.http.HttpClient.newBuilder; import static java.net.http.WebSocket.NORMAL_CLOSURE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertTrue; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class SendTest { @@ -90,7 +90,7 @@ public class SendTest { try { webSocket.sendClose(NORMAL_CLOSURE, "").join(); assertTrue(webSocket.isOutputClosed()); - assertEquals(webSocket.getSubprotocol(), ""); + assertEquals("", webSocket.getSubprotocol()); webSocket.request(1); // No exceptions must be thrown } finally { webSocket.abort(); diff --git a/test/jdk/java/net/httpclient/websocket/Support.java b/test/jdk/java/net/httpclient/websocket/Support.java index 1323ae35105..73f840ff7eb 100644 --- a/test/jdk/java/net/httpclient/websocket/Support.java +++ b/test/jdk/java/net/httpclient/websocket/Support.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -32,8 +32,8 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertFalse; public class Support { diff --git a/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java b/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java index 90db79dc8ef..f28d84b2f20 100644 --- a/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java +++ b/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -29,7 +29,7 @@ * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestServerConfigurator * @modules java.net.http/jdk.internal.net.http.common * jdk.httpserver - * @run testng/othervm -Djdk.internal.httpclient.debug=true WSHandshakeExceptionTest + * @run junit/othervm -Djdk.internal.httpclient.debug=true WSHandshakeExceptionTest */ import com.sun.net.httpserver.HttpHandler; @@ -37,8 +37,6 @@ import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsServer; import com.sun.net.httpserver.HttpExchange; - - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -49,10 +47,6 @@ import java.net.http.WebSocketHandshakeException; import jdk.httpclient.test.lib.common.TestServerConfigurator; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import java.net.InetSocketAddress; import java.net.URI; @@ -62,29 +56,33 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static java.net.http.HttpClient.Builder.NO_PROXY; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; import static java.lang.System.out; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + public class WSHandshakeExceptionTest { private static final SSLContext sslContext = SimpleSSLContext.findSSLContext(); - HttpServer httpTestServer; // HTTP/1.1 [ 2 servers ] - HttpsServer httpsTestServer; // HTTPS/1.1 - String httpURI; - String httpsURI; - String httpNonUtf8URI; - String httpsNonUtf8URI; - HttpClient sharedClient; + private static HttpServer httpTestServer; // HTTP/1.1 [ 2 servers ] + private static HttpsServer httpsTestServer; // HTTPS/1.1 + private static String httpURI; + private static String httpsURI; + private static String httpNonUtf8URI; + private static String httpsNonUtf8URI; + private static HttpClient sharedClient; static final int ITERATION_COUNT = 4; // a shared executor helps reduce the amount of threads created by the test static final ExecutorService executor = Executors.newCachedThreadPool(); - @DataProvider(name = "variants") - public Object[][] variants() { + public static Object[][] variants() { return new Object[][]{ { httpURI, false }, { httpsURI, false }, @@ -106,7 +104,8 @@ public class WSHandshakeExceptionTest { .build(); } - @Test(dataProvider = "variants") + @ParameterizedTest + @MethodSource("variants") public void test(String uri, boolean sameClient) { HttpClient client = sharedClient; boolean pause; @@ -132,7 +131,7 @@ public class WSHandshakeExceptionTest { WebSocketHandshakeException wse = (WebSocketHandshakeException) t; assertNotNull(wse.getResponse()); assertNotNull(wse.getResponse().body()); - assertEquals(wse.getResponse().body().getClass(), String.class); + assertEquals(String.class, wse.getResponse().body().getClass()); String body = (String)wse.getResponse().body(); out.println("Status code is " + wse.getResponse().statusCode()); out.println("Response is " + body); @@ -145,7 +144,7 @@ public class WSHandshakeExceptionTest { // default HttpServer 404 body expected assertTrue(body.contains("404")); } - assertEquals(wse.getResponse().statusCode(), 404); + assertEquals(404, wse.getResponse().statusCode()); } } } @@ -159,8 +158,8 @@ public class WSHandshakeExceptionTest { } } - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { // HTTP/1.1 InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0); httpTestServer = HttpServer.create(sa, 0); @@ -178,8 +177,8 @@ public class WSHandshakeExceptionTest { httpsTestServer.start(); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { sharedClient = null; gc(100); httpTestServer.stop(0); diff --git a/test/jdk/java/net/httpclient/websocket/WebSocketBuilderTest.java b/test/jdk/java/net/httpclient/websocket/WebSocketBuilderTest.java index b28b8f59875..beef8cb42a4 100644 --- a/test/jdk/java/net/httpclient/websocket/WebSocketBuilderTest.java +++ b/test/jdk/java/net/httpclient/websocket/WebSocketBuilderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -26,12 +26,9 @@ * @bug 8159053 * @build DummyWebSocketServer * Support - * @run testng/othervm WebSocketBuilderTest + * @run junit/othervm WebSocketBuilderTest */ -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - import java.net.URI; import java.net.http.HttpClient; import java.net.http.WebSocket; @@ -42,7 +39,10 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.testng.Assert.assertThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * In some places in this test a new String is created out of a string literal. @@ -98,7 +98,8 @@ public final class WebSocketBuilderTest { .connectTimeout(null)); } - @Test(dataProvider = "badURIs") + @ParameterizedTest + @MethodSource("badURIs") void illegalURI(URI uri) { WebSocket.Builder b = HttpClient.newHttpClient().newWebSocketBuilder(); assertFails(IllegalArgumentException.class, @@ -129,7 +130,8 @@ public final class WebSocketBuilderTest { // TODO: test for bad syntax headers // TODO: test for overwrites (subprotocols) and additions (headers) - @Test(dataProvider = "badSubprotocols") + @ParameterizedTest + @MethodSource("badSubprotocols") public void illegalSubprotocolsSyntax(String s) { WebSocket.Builder b = HttpClient.newHttpClient() .newWebSocketBuilder() @@ -138,7 +140,8 @@ public final class WebSocketBuilderTest { b.buildAsync(VALID_URI, listener())); } - @Test(dataProvider = "duplicatingSubprotocols") + @ParameterizedTest + @MethodSource("duplicatingSubprotocols") public void illegalSubprotocolsDuplicates(String mostPreferred, String[] lesserPreferred) { WebSocket.Builder b = HttpClient.newHttpClient() @@ -148,7 +151,8 @@ public final class WebSocketBuilderTest { b.buildAsync(VALID_URI, listener())); } - @Test(dataProvider = "badConnectTimeouts") + @ParameterizedTest + @MethodSource("badConnectTimeouts") public void illegalConnectTimeout(Duration d) { WebSocket.Builder b = HttpClient.newHttpClient() .newWebSocketBuilder() @@ -157,8 +161,7 @@ public final class WebSocketBuilderTest { b.buildAsync(VALID_URI, listener())); } - @DataProvider - public Object[][] badURIs() { + public static Object[][] badURIs() { return new Object[][]{ {URI.create("http://example.com")}, {URI.create("ftp://example.com")}, @@ -167,8 +170,7 @@ public final class WebSocketBuilderTest { }; } - @DataProvider - public Object[][] badConnectTimeouts() { + public static Object[][] badConnectTimeouts() { return new Object[][]{ {Duration.ofDays(0)}, {Duration.ofDays(-1)}, @@ -188,7 +190,6 @@ public final class WebSocketBuilderTest { // https://tools.ietf.org/html/rfc7230#section-3.2.6 // https://tools.ietf.org/html/rfc20 - @DataProvider public static Object[][] badSubprotocols() { return new Object[][]{ {""}, @@ -215,7 +216,6 @@ public final class WebSocketBuilderTest { }; } - @DataProvider public static Object[][] duplicatingSubprotocols() { return new Object[][]{ {"a.b.c", new String[]{"a.b.c"}}, diff --git a/test/jdk/java/net/httpclient/websocket/WebSocketExtendedTest.java b/test/jdk/java/net/httpclient/websocket/WebSocketExtendedTest.java index 0099104e872..56474555235 100644 --- a/test/jdk/java/net/httpclient/websocket/WebSocketExtendedTest.java +++ b/test/jdk/java/net/httpclient/websocket/WebSocketExtendedTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,7 +24,7 @@ /* * @test * @bug 8159053 - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.websocket.debug=true * -Djdk.internal.httpclient.debug=true * -Djdk.httpclient.websocket.writeBufferSize=1024 @@ -32,8 +32,6 @@ */ import jdk.internal.net.http.websocket.Frame; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.io.IOException; import java.net.http.WebSocket; @@ -43,8 +41,11 @@ import java.util.List; import java.util.Random; import static java.net.http.HttpClient.Builder.NO_PROXY; import static java.net.http.HttpClient.newBuilder; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /* @@ -52,7 +53,7 @@ import static org.testng.Assert.assertTrue; * possible fragmentation. */ public class WebSocketExtendedTest { -// * run testng/othervm +// * run junit/othervm // * -Djdk.httpclient.websocket.writeBufferSize=16 // * -Djdk.httpclient.sendBufferSize=32 WebSocketTextTest @@ -65,7 +66,8 @@ public class WebSocketExtendedTest { // FIXME ensure subsequent (sendText/Binary, false) only CONTINUATIONs - @Test(dataProvider = "binary") + @ParameterizedTest + @MethodSource("binary") public void binary(ByteBuffer expected) throws IOException, InterruptedException { try (DummyWebSocketServer server = new DummyWebSocketServer()) { server.open(); @@ -76,15 +78,16 @@ public class WebSocketExtendedTest { ws.sendBinary(expected.duplicate(), true).join(); ws.abort(); List frames = server.readFrames(); - assertEquals(frames.size(), 1); + assertEquals(1, frames.size()); DummyWebSocketServer.DecodedFrame f = frames.get(0); assertTrue(f.last()); - assertEquals(f.opcode(), Frame.Opcode.BINARY); - assertEquals(f.data(), expected); + assertEquals(Frame.Opcode.BINARY, f.opcode()); + assertEquals(expected, f.data()); } } - @Test(dataProvider = "pingPong") + @ParameterizedTest + @MethodSource("pingPongSizes") public void ping(ByteBuffer expected) throws Exception { try (DummyWebSocketServer server = new DummyWebSocketServer()) { server.open(); @@ -95,17 +98,18 @@ public class WebSocketExtendedTest { ws.sendPing(expected.duplicate()).join(); ws.abort(); List frames = server.readFrames(); - assertEquals(frames.size(), 1); + assertEquals(1, frames.size()); DummyWebSocketServer.DecodedFrame f = frames.get(0); - assertEquals(f.opcode(), Frame.Opcode.PING); + assertEquals(Frame.Opcode.PING, f.opcode()); ByteBuffer actual = ByteBuffer.allocate(expected.remaining()); actual.put(f.data()); actual.flip(); - assertEquals(actual, expected); + assertEquals(expected, actual); } } - @Test(dataProvider = "pingPong") + @ParameterizedTest + @MethodSource("pingPongSizes") public void pong(ByteBuffer expected) throws Exception { try (DummyWebSocketServer server = new DummyWebSocketServer()) { server.open(); @@ -116,17 +120,18 @@ public class WebSocketExtendedTest { ws.sendPong(expected.duplicate()).join(); ws.abort(); List frames = server.readFrames(); - assertEquals(frames.size(), 1); + assertEquals(1, frames.size()); DummyWebSocketServer.DecodedFrame f = frames.get(0); - assertEquals(f.opcode(), Frame.Opcode.PONG); + assertEquals(Frame.Opcode.PONG, f.opcode()); ByteBuffer actual = ByteBuffer.allocate(expected.remaining()); actual.put(f.data()); actual.flip(); - assertEquals(actual, expected); + assertEquals(expected, actual); } } - @Test(dataProvider = "close") + @ParameterizedTest + @MethodSource("closeArguments") public void close(int statusCode, String reason) throws Exception { try (DummyWebSocketServer server = new DummyWebSocketServer()) { server.open(); @@ -137,18 +142,19 @@ public class WebSocketExtendedTest { ws.sendClose(statusCode, reason).join(); ws.abort(); List frames = server.readFrames(); - assertEquals(frames.size(), 1); + assertEquals(1, frames.size()); DummyWebSocketServer.DecodedFrame f = frames.get(0); - assertEquals(f.opcode(), Frame.Opcode.CLOSE); + assertEquals(Frame.Opcode.CLOSE, f.opcode()); ByteBuffer actual = ByteBuffer.allocate(Frame.MAX_CONTROL_FRAME_PAYLOAD_LENGTH); actual.put(f.data()); actual.flip(); - assertEquals(actual.getChar(), statusCode); - assertEquals(StandardCharsets.UTF_8.decode(actual).toString(), reason); + assertEquals(statusCode, actual.getChar()); + assertEquals(reason, StandardCharsets.UTF_8.decode(actual).toString()); } } - @Test(dataProvider = "text") + @ParameterizedTest + @MethodSource("texts") public void text(String expected) throws Exception { try (DummyWebSocketServer server = new DummyWebSocketServer()) { server.open(); @@ -163,12 +169,11 @@ public class WebSocketExtendedTest { ByteBuffer actual = ByteBuffer.allocate(maxBytes); frames.stream().forEachOrdered(f -> actual.put(f.data())); actual.flip(); - assertEquals(StandardCharsets.UTF_8.decode(actual).toString(), expected); + assertEquals(expected, StandardCharsets.UTF_8.decode(actual).toString()); } } - @DataProvider(name = "pingPong") - public Object[][] pingPongSizes() { + public static Object[][] pingPongSizes() { return new Object[][]{ {bytes( 0)}, {bytes( 1)}, @@ -177,8 +182,7 @@ public class WebSocketExtendedTest { }; } - @DataProvider(name = "close") - public Object[][] closeArguments() { + public static Object[][] closeArguments() { return new Object[][]{ {WebSocket.NORMAL_CLOSURE, utf8String( 0)}, {WebSocket.NORMAL_CLOSURE, utf8String( 1)}, @@ -216,16 +220,14 @@ public class WebSocketExtendedTest { return str.toString(); } - @DataProvider(name = "text") - public Object[][] texts() { + public static Object[][] texts() { return new Object[][]{ {utf8String( 0)}, {utf8String(1024)}, }; } - @DataProvider(name = "binary") - public Object[][] binary() { + public static Object[][] binary() { return new Object[][]{ {bytes( 0)}, {bytes(1024)}, diff --git a/test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java b/test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java index 46758b2fe6e..a410aa9fe75 100644 --- a/test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java +++ b/test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -28,7 +28,7 @@ * @library /test/lib * @compile SecureSupport.java DummySecureWebSocketServer.java ../ProxyServer.java * @build jdk.test.lib.net.SimpleSSLContext WebSocketProxyTest - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * -Djdk.internal.httpclient.websocket.debug=true * -Djdk.httpclient.HttpClient.log=errors,requests,headers @@ -61,16 +61,18 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import static java.net.http.HttpClient.newBuilder; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.assertEquals; -import static org.testng.FileAssert.fail; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class WebSocketProxyTest { @@ -132,8 +134,7 @@ public class WebSocketProxyTest { @Override public String toString() { return "AUTH_TUNNELING_PROXY_SERVER"; } }; - @DataProvider(name = "servers") - public Object[][] servers() { + public static Object[][] servers() { return new Object[][] { { SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, { SERVER_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, @@ -175,7 +176,8 @@ public class WebSocketProxyTest { return "%s and %s %s".formatted(actual, expected, message); } - @Test(dataProvider = "servers") + @ParameterizedTest + @MethodSource("servers") public void simpleAggregatingBinaryMessages (Function serverSupplier, Supplier proxyServerSupplier) @@ -263,7 +265,7 @@ public class WebSocketProxyTest { .join(); List a = actual.join(); - assertEquals(ofBytes(a), ofBytes(expected), diagnose(a, expected)); + assertEquals(ofBytes(expected), ofBytes(a), diagnose(a, expected)); } } @@ -359,7 +361,7 @@ public class WebSocketProxyTest { } catch (CompletionException expected) { WebSocketHandshakeException e = (WebSocketHandshakeException)expected.getCause(); HttpResponse response = e.getResponse(); - assertEquals(response.statusCode(), 407); + assertEquals(407, response.statusCode()); } } } @@ -398,7 +400,7 @@ public class WebSocketProxyTest { } } - @BeforeMethod + @BeforeEach public void breakBetweenTests() { System.gc(); try {Thread.sleep(100); } catch (InterruptedException x) { /* OK */ } diff --git a/test/jdk/java/net/httpclient/websocket/WebSocketTest.java b/test/jdk/java/net/httpclient/websocket/WebSocketTest.java index 43bcb054b7d..2b1df3d7e87 100644 --- a/test/jdk/java/net/httpclient/websocket/WebSocketTest.java +++ b/test/jdk/java/net/httpclient/websocket/WebSocketTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -27,12 +27,10 @@ * @library ../access * @build DummyWebSocketServer * java.net.http/jdk.internal.net.http.HttpClientTimerAccess - * @run testng/othervm + * @run junit/othervm * WebSocketTest */ -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.io.IOException; import java.net.Authenticator; @@ -63,9 +61,13 @@ import static java.net.http.HttpClient.newBuilder; import static java.net.http.WebSocket.NORMAL_CLOSURE; import static java.nio.charset.StandardCharsets.UTF_8; import static jdk.internal.net.http.HttpClientTimerAccess.assertNoResponseTimerEventRegistrations; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.fail; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; public class WebSocketTest { @@ -264,8 +266,7 @@ public class WebSocketTest { } } - @DataProvider(name = "sequence") - public Object[][] data1() { + public static Object[][] data1() { int[] CLOSE = { 0x81, 0x00, // "" 0x82, 0x00, // [] @@ -292,7 +293,8 @@ public class WebSocketTest { }; } - @Test(dataProvider = "sequence") + @ParameterizedTest + @MethodSource("data1") public void listenerSequentialOrder(int[] binary, long requestSize) throws IOException { @@ -470,8 +472,7 @@ public class WebSocketTest { @Override public String toString() { return "AUTH_SERVER_WITH_CANNED_DATA"; } }; - @DataProvider(name = "servers") - public Object[][] servers() { + public static Object[][] servers() { return new Object[][] { { SERVER_WITH_CANNED_DATA }, { AUTH_SERVER_WITH_CANNED_DATA }, @@ -507,7 +508,8 @@ public class WebSocketTest { return "%s and %s %s".formatted(actual, expected, message); } - @Test(dataProvider = "servers") + @ParameterizedTest + @MethodSource("servers") public void simpleAggregatingBinaryMessages (Function serverSupplier) throws IOException @@ -600,14 +602,15 @@ public class WebSocketTest { .join(); try { List a = actual.join(); - assertEquals(ofBytes(a), ofBytes(expected), diagnose(a, expected)); + assertEquals(ofBytes(expected), ofBytes(a), diagnose(a, expected)); } finally { webSocket.abort(); } } } - @Test(dataProvider = "servers") + @ParameterizedTest + @MethodSource("servers") public void simpleAggregatingTextMessages (Function serverSupplier) throws IOException @@ -683,7 +686,7 @@ public class WebSocketTest { .join(); try { List a = actual.join(); - assertEquals(a, expected); + assertEquals(expected, a); } finally { webSocket.abort(); } @@ -694,7 +697,8 @@ public class WebSocketTest { * Exercises the scenario where requests for more messages are made prior to * completing the returned CompletionStage instances. */ - @Test(dataProvider = "servers") + @ParameterizedTest + @MethodSource("servers") public void aggregatingTextMessages (Function serverSupplier) throws IOException @@ -784,7 +788,7 @@ public class WebSocketTest { .join(); try { List a = actual.join(); - assertEquals(a, expected); + assertEquals(expected, a); } finally { webSocket.abort(); } @@ -853,7 +857,7 @@ public class WebSocketTest { } catch (CompletionException expected) { WebSocketHandshakeException e = (WebSocketHandshakeException)expected.getCause(); HttpResponse response = e.getResponse(); - assertEquals(response.statusCode(), 401); + assertEquals(401, response.statusCode()); } } } diff --git a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/HeaderWriterTest.java b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/HeaderWriterTest.java index 0e55eaf521f..59a66591c93 100644 --- a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/HeaderWriterTest.java +++ b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/HeaderWriterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -23,7 +23,6 @@ package jdk.internal.net.http.websocket; -import org.testng.annotations.Test; import jdk.internal.net.http.websocket.Frame.HeaderWriter; import jdk.internal.net.http.websocket.Frame.Opcode; @@ -32,10 +31,12 @@ import java.util.OptionalInt; import static java.util.OptionalInt.empty; import static java.util.OptionalInt.of; -import static org.testng.Assert.assertEquals; import static jdk.internal.net.http.websocket.TestSupport.assertThrows; import static jdk.internal.net.http.websocket.TestSupport.forEachPermutation; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class HeaderWriterTest { private long cases, frames; @@ -109,7 +110,7 @@ public class HeaderWriterTest { ByteBuffer actual = ByteBuffer.allocate(Frame.MAX_HEADER_SIZE_BYTES + 2); writer.write(actual); actual.flip(); - assertEquals(actual, expected); + assertEquals(expected, actual); }); } } diff --git a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MaskerTest.java b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MaskerTest.java index 7eb892f12ea..cb59b9f7213 100644 --- a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MaskerTest.java +++ b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MaskerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -23,17 +23,17 @@ package jdk.internal.net.http.websocket; -import org.testng.annotations.Test; - import java.nio.ByteBuffer; import java.security.SecureRandom; import java.util.stream.IntStream; -import static org.testng.Assert.assertEquals; import static jdk.internal.net.http.websocket.Frame.Masker.applyMask; import static jdk.internal.net.http.websocket.TestSupport.forEachBufferPartition; import static jdk.internal.net.http.websocket.TestSupport.fullCopy; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class MaskerTest { private static final SecureRandom random = new SecureRandom(); @@ -98,14 +98,14 @@ public class MaskerTest { int dstRemaining = dstCopy.remaining(); int masked = Math.min(srcRemaining, dstRemaining); // 1. position check - assertEquals(src.position(), srcCopy.position() + masked); - assertEquals(dst.position(), dstCopy.position() + masked); + assertEquals(srcCopy.position() + masked, src.position()); + assertEquals(dstCopy.position() + masked, dst.position()); // 2. masking check src.position(srcCopy.position()); dst.position(dstCopy.position()); for (; src.hasRemaining() && dst.hasRemaining(); offset = (offset + 1) & 3) { - assertEquals(dst.get(), src.get() ^ maskBytes[offset]); + assertEquals(src.get() ^ maskBytes[offset], dst.get()); } // 3. corruption check // 3.1 src contents haven't changed @@ -113,7 +113,7 @@ public class MaskerTest { int srcLimit = src.limit(); src.clear(); srcCopy.clear(); - assertEquals(src, srcCopy); + assertEquals(srcCopy, src); src.limit(srcLimit).position(srcPosition); // restore src // 3.2 dst leading and trailing regions' contents haven't changed int dstPosition = dst.position(); @@ -122,11 +122,11 @@ public class MaskerTest { // leading dst.position(0).limit(dstInitialPosition); dstCopy.position(0).limit(dstInitialPosition); - assertEquals(dst, dstCopy); + assertEquals(dstCopy, dst); // trailing dst.limit(dst.capacity()).position(dstLimit); dstCopy.limit(dst.capacity()).position(dstLimit); - assertEquals(dst, dstCopy); + assertEquals(dstCopy, dst); // restore dst dst.position(dstPosition).limit(dstLimit); return offset; diff --git a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MessageQueueTest.java b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MessageQueueTest.java index 61503f0e235..73cab76df28 100644 --- a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MessageQueueTest.java +++ b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/MessageQueueTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -23,9 +23,6 @@ package jdk.internal.net.http.websocket; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; @@ -46,10 +43,14 @@ import java.util.function.BiConsumer; import java.util.function.Supplier; import static jdk.internal.net.http.websocket.MessageQueue.effectiveCapacityOf; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertTrue; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /* * A unit test for MessageQueue. The test is aware of the details of the queue @@ -59,7 +60,6 @@ public class MessageQueueTest { private static final Random r = new SecureRandom(); - @DataProvider(name = "illegalCapacities") public static Object[][] illegalCapacities() { return new Object[][]{ new Object[]{Integer.MIN_VALUE}, @@ -69,17 +69,20 @@ public class MessageQueueTest { }; } - @Test(dataProvider = "illegalCapacities") + @ParameterizedTest + @MethodSource("illegalCapacities") public void illegalCapacity(int n) { assertThrows(IllegalArgumentException.class, () -> new MessageQueue(n)); } - @Test(dataProvider = "capacities") + @ParameterizedTest + @MethodSource("capacities") public void emptiness(int n) { assertTrue(new MessageQueue(n).isEmpty()); } - @Test(dataProvider = "capacities") + @ParameterizedTest + @MethodSource("capacities") public void fullness(int n) throws IOException { MessageQueue q = new MessageQueue(n); int cap = effectiveCapacityOf(n); @@ -97,7 +100,7 @@ public class MessageQueueTest { for (int i = 0; i < cap; i++) { Message expected = referenceQueue.remove(); Message actual = new Remover().removeFrom(q); - assertEquals(actual, expected); + assertEquals(expected, actual); } } @@ -144,7 +147,8 @@ public class MessageQueueTest { action, future); } - @Test(dataProvider = "capacities") + @ParameterizedTest + @MethodSource("capacities") public void caterpillarWalk(int n) throws IOException { // System.out.println("n: " + n); int cap = effectiveCapacityOf(n); @@ -164,7 +168,7 @@ public class MessageQueueTest { for (int i = 0; i < p; i++) { Message expected = referenceQueue.remove(); Message actual = remover.removeFrom(q); - assertEquals(actual, expected); + assertEquals(expected, actual); } assertTrue(q.isEmpty()); } @@ -243,7 +247,7 @@ public class MessageQueueTest { f.get(); // Just to check for exceptions } consumer.get(); // Waiting for consumer to collect all the messages - assertEquals(actualList.size(), expectedList.size()); + assertEquals(expectedList.size(), actualList.size()); for (Message m : expectedList) { assertTrue(actualList.remove(m)); } @@ -257,7 +261,8 @@ public class MessageQueueTest { } } - @Test(dataProvider = "capacities") + @ParameterizedTest + @MethodSource("capacities") public void testSingleThreaded(int n) throws IOException { Queue referenceQueue = new LinkedList<>(); MessageQueue q = new MessageQueue(n); @@ -271,13 +276,12 @@ public class MessageQueueTest { for (int i = 0; i < cap; i++) { Message expected = referenceQueue.remove(); Message actual = new Remover().removeFrom(q); - assertEquals(actual, expected); + assertEquals(expected, actual); } assertTrue(q.isEmpty()); } - @DataProvider(name = "capacities") - public Object[][] capacities() { + public static Object[][] capacities() { return new Object[][]{ new Object[]{ 1}, new Object[]{ 2}, diff --git a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/ReaderTest.java b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/ReaderTest.java index c53ac88f69c..c7b1ab80fbd 100644 --- a/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/ReaderTest.java +++ b/test/jdk/java/net/httpclient/websocket/java.net.http/jdk/internal/net/http/websocket/ReaderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -23,7 +23,6 @@ package jdk.internal.net.http.websocket; -import org.testng.annotations.Test; import jdk.internal.net.http.websocket.Frame.Opcode; import java.nio.ByteBuffer; @@ -35,10 +34,12 @@ import java.util.function.IntUnaryOperator; import static java.util.OptionalInt.empty; import static java.util.OptionalInt.of; -import static org.testng.Assert.assertEquals; import static jdk.internal.net.http.websocket.TestSupport.assertThrows; import static jdk.internal.net.http.websocket.TestSupport.forEachBufferPartition; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class ReaderTest { private long cases, frames; @@ -128,15 +129,15 @@ public class ReaderTest { for (ByteBuffer b : buffers) { r.readFrame(b, c); } - assertEquals(fin, c.fin()); - assertEquals(rsv1, c.rsv1()); - assertEquals(rsv2, c.rsv2()); - assertEquals(rsv3, c.rsv3()); - assertEquals(opcode, c.opcode()); - assertEquals(mask.isPresent(), c.mask()); - assertEquals(payloadLen, c.payloadLen()); - assertEquals(mask, c.maskingKey()); - assertEquals(payloadLen == 0, c.isEndFrame()); + assertEquals(c.fin(), fin); + assertEquals(c.rsv1(), rsv1); + assertEquals(c.rsv2(), rsv2); + assertEquals(c.rsv3(), rsv3); + assertEquals(c.opcode(), opcode); + assertEquals(c.mask(), mask.isPresent()); + assertEquals(c.payloadLen(), payloadLen); + assertEquals(c.maskingKey(), mask); + assertEquals(c.isEndFrame(), payloadLen == 0); }); } diff --git a/test/jdk/java/net/httpclient/websocket/security/WSSanityTest.java b/test/jdk/java/net/httpclient/websocket/security/WSSanityTest.java index 787486dbd84..c8e4faa1ad3 100644 --- a/test/jdk/java/net/httpclient/websocket/security/WSSanityTest.java +++ b/test/jdk/java/net/httpclient/websocket/security/WSSanityTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -25,7 +25,7 @@ * @test * @summary Basic sanity checks for WebSocket URI from the Builder * @compile ../DummyWebSocketServer.java ../../ProxyServer.java - * @run testng/othervm WSSanityTest + * @run junit/othervm WSSanityTest */ import java.io.IOException; @@ -38,20 +38,21 @@ import java.net.URI; import java.util.List; import java.net.http.HttpClient; import java.net.http.WebSocket; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; public class WSSanityTest { - URI wsURI; - DummyWebSocketServer webSocketServer; - InetSocketAddress proxyAddress; + private static URI wsURI; + private static DummyWebSocketServer webSocketServer; + private static InetSocketAddress proxyAddress; - @BeforeTest - public void setup() throws Exception { + @BeforeAll + public static void setup() throws Exception { ProxyServer proxyServer = new ProxyServer(0, true); proxyAddress = new InetSocketAddress(InetAddress.getLoopbackAddress(), proxyServer.getPort()); @@ -63,8 +64,8 @@ public class WSSanityTest { System.out.println("DummyWebSocketServer: " + wsURI); } - @AfterTest - public void teardown() { + @AfterAll + public static void teardown() { webSocketServer.close(); } @@ -75,8 +76,7 @@ public class WSSanityTest { T run() throws Exception; } - @DataProvider(name = "passingScenarios") - public Object[][] passingScenarios() { + public static Object[][] passingScenarios() { HttpClient noProxyClient = HttpClient.newHttpClient(); return new Object[][]{ { (ExceptionAction)() -> { @@ -146,14 +146,15 @@ public class WSSanityTest { HttpClient client = HttpClient.newBuilder().proxy(ps).build(); client.newWebSocketBuilder() .buildAsync(wsURI, noOpListener).get().abort(); - assertEquals(ps.count(), 1); // ps.select only invoked once + assertEquals(1, ps.count()); // ps.select only invoked once return null; }, "7" }, }; } - @Test(dataProvider = "passingScenarios") + @ParameterizedTest + @MethodSource("passingScenarios") public void testScenarios(ExceptionAction action, String dataProviderId) throws Exception { diff --git a/test/jdk/java/net/httpclient/whitebox/AltSvcFrameTest.java b/test/jdk/java/net/httpclient/whitebox/AltSvcFrameTest.java index 589e5409044..b9e5f2d58fe 100644 --- a/test/jdk/java/net/httpclient/whitebox/AltSvcFrameTest.java +++ b/test/jdk/java/net/httpclient/whitebox/AltSvcFrameTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -48,17 +48,19 @@ import jdk.internal.net.http.HttpClientAccess; import jdk.internal.net.http.common.HttpHeadersBuilder; import jdk.internal.net.http.frame.AltSvcFrame; import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; import static java.net.http.HttpResponse.BodyHandlers.ofString; import static jdk.internal.net.http.AltServicesRegistry.AltService; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /* * @test - * @summary This test verifies alt-svc registry updation for frames + * @summary This test verifies alt-svc registry updating for frames * @library /test/lib /test/jdk/java/net/httpclient/lib * @build java.net.http/jdk.internal.net.http.HttpClientAccess * jdk.httpclient.test.lib.http2.Http2TestServer @@ -82,7 +84,7 @@ import static org.testng.Assert.assertTrue; * java.base/sun.net.www.http * java.base/sun.net.www * java.base/sun.net - * @run testng/othervm + * @run junit/othervm * -Dtest.requiresHost=true * -Djdk.httpclient.HttpClient.log=headers * -Djdk.internal.httpclient.disableHostnameVerification @@ -90,7 +92,6 @@ import static org.testng.Assert.assertTrue; * AltSvcFrameTest */ - public class AltSvcFrameTest { private static final String IGNORED_HOST = "www.should-be-ignored.com"; @@ -109,18 +110,23 @@ public class AltSvcFrameTest { static HttpClient client; private static final SSLContext server = SimpleSSLContext.findSSLContext(); - @BeforeTest - public void setUp() throws Exception { + @BeforeAll + public static void setUp() throws Exception { getRegistry(); https2Server = new Http2TestServer("localhost", true, server); https2Server.addHandler(new AltSvcFrameTestHandler(), "/"); https2Server.setExchangeSupplier(AltSvcFrameTest.CFTHttp2TestExchange::new); https2Server.start(); https2URI = "https://" + https2Server.serverAuthority() + "/"; - - } + @AfterAll + public static void tearDown() { + if (client != null) client.close(); + if (https2Server != null) https2Server.stop(); + } + + static AltServicesRegistry getRegistry() { client = HttpClient.newBuilder() .sslContext(server) @@ -139,7 +145,7 @@ public class AltSvcFrameTest { .GET() .build(); HttpResponse response = client.send(request, ofString()); - assertEquals(response.statusCode(), 200, "unexpected response code"); + assertEquals(200, response.statusCode(), "unexpected response code"); final List services = registry.lookup(URI.create(https2URI), "h3").toList(); System.out.println("Alt services in registry for " + https2URI + " = " + services); final boolean hasExpectedAltSvc = services.stream().anyMatch( @@ -158,7 +164,7 @@ public class AltSvcFrameTest { .GET() .build(); HttpResponse response = client.send(request, ofString()); - assertEquals(response.statusCode(), 200, "unexpected response code"); + assertEquals(200, response.statusCode(), "unexpected response code"); final List services = registry.lookup( URI.create(FOO_BAR_ORIGIN), "h3").toList(); System.out.println("Alt services in registry for " + FOO_BAR_ORIGIN + " = " + services); diff --git a/test/jdk/java/net/httpclient/whitebox/AltSvcRegistryTest.java b/test/jdk/java/net/httpclient/whitebox/AltSvcRegistryTest.java index b853f715415..682082ba9f8 100644 --- a/test/jdk/java/net/httpclient/whitebox/AltSvcRegistryTest.java +++ b/test/jdk/java/net/httpclient/whitebox/AltSvcRegistryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -26,8 +26,6 @@ import jdk.internal.net.http.AltServicesRegistry; import jdk.test.lib.net.SimpleSSLContext; import jdk.httpclient.test.lib.common.HttpServerAdapters; import jdk.httpclient.test.lib.http2.Http2TestServer; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import java.io.IOException; @@ -46,6 +44,10 @@ import java.util.concurrent.Executors; import static jdk.internal.net.http.AltServicesRegistry.AltService; import static java.net.http.HttpResponse.BodyHandlers.ofString; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; + /* * @test * @summary This test verifies alt-svc registry updates @@ -73,7 +75,7 @@ import static java.net.http.HttpResponse.BodyHandlers.ofString; * java.base/sun.net.www * java.base/sun.net * java.base/jdk.internal.util - * @run testng/othervm + * @run junit/othervm * -Dtest.requiresHost=true * -Djdk.httpclient.HttpClient.log=headers * -Djdk.internal.httpclient.disableHostnameVerification @@ -81,7 +83,6 @@ import static java.net.http.HttpResponse.BodyHandlers.ofString; * AltSvcRegistryTest */ - public class AltSvcRegistryTest implements HttpServerAdapters { static HttpTestServer https2Server; @@ -89,8 +90,8 @@ public class AltSvcRegistryTest implements HttpServerAdapters { static HttpClient client; private static final SSLContext server = SimpleSSLContext.findSSLContext(); - @BeforeTest - public void setUp() throws Exception { + @BeforeAll + public static void setUp() throws Exception { getRegistry(); final ExecutorService executor = Executors.newCachedThreadPool(); https2Server = HttpServerAdapters.HttpTestServer.of( @@ -98,8 +99,12 @@ public class AltSvcRegistryTest implements HttpServerAdapters { https2Server.addHandler(new AltSvcRegistryTestHandler("https", https2Server), "/"); https2Server.start(); https2URI = "https://" + https2Server.serverAuthority() + "/"; + } - + @AfterAll + public static void tearDown() { + if (client != null) client.close(); + if (https2Server != null) https2Server.stop(); } static AltServicesRegistry getRegistry() { diff --git a/test/jdk/java/net/httpclient/whitebox/AuthenticationFilterTestDriver.java b/test/jdk/java/net/httpclient/whitebox/AuthenticationFilterTestDriver.java index e932455e409..5808c380593 100644 --- a/test/jdk/java/net/httpclient/whitebox/AuthenticationFilterTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/AuthenticationFilterTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,5 +24,5 @@ /* * @test * @modules java.net.http/jdk.internal.net.http - * @run testng java.net.http/jdk.internal.net.http.AuthenticationFilterTest + * @run junit java.net.http/jdk.internal.net.http.AuthenticationFilterTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/DefaultProxyDriver.java b/test/jdk/java/net/httpclient/whitebox/DefaultProxyDriver.java index 5c18fd84a0f..54127855386 100644 --- a/test/jdk/java/net/httpclient/whitebox/DefaultProxyDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/DefaultProxyDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -27,7 +27,7 @@ * @summary Verifies that the HTTP Client, by default, uses the system-wide * proxy selector, and that that selector supports the standard HTTP proxy * system properties. - * @run testng/othervm + * @run junit/othervm * -Dhttp.proxyHost=foo.proxy.com * -Dhttp.proxyPort=9876 * -Dhttp.nonProxyHosts=*.direct.com diff --git a/test/jdk/java/net/httpclient/whitebox/DemandTestDriver.java b/test/jdk/java/net/httpclient/whitebox/DemandTestDriver.java index ea442878261..c8b793a289c 100644 --- a/test/jdk/java/net/httpclient/whitebox/DemandTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/DemandTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -24,5 +24,5 @@ /* * @test * @modules java.net.http/jdk.internal.net.http.common - * @run testng java.net.http/jdk.internal.net.http.common.DemandTest + * @run junit java.net.http/jdk.internal.net.http.common.DemandTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/FlowTestDriver.java b/test/jdk/java/net/httpclient/whitebox/FlowTestDriver.java index c24a733db3b..4468b5d6eb6 100644 --- a/test/jdk/java/net/httpclient/whitebox/FlowTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/FlowTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,5 +25,5 @@ * @test * @compile/module=java.net.http ../../../../../../lib/jdk/test/lib/net/SimpleSSLContext.java * @modules java.net.http/jdk.internal.net.http - * @run testng/timeout=480 java.net.http/jdk.internal.net.http.FlowTest + * @run junit/timeout=480 java.net.http/jdk.internal.net.http.FlowTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java b/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java index 9b3c8878669..7edc555d8a6 100644 --- a/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,7 @@ * @test * @bug 8195823 * @modules java.net.http/jdk.internal.net.http.frame - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * java.net.http/jdk.internal.net.http.frame.FramesDecoderTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/Http1HeaderParserTestDriver.java b/test/jdk/java/net/httpclient/whitebox/Http1HeaderParserTestDriver.java index b18142601a5..f3b9d410b51 100644 --- a/test/jdk/java/net/httpclient/whitebox/Http1HeaderParserTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/Http1HeaderParserTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -25,5 +25,5 @@ * @test * @bug 8195138 * @modules java.net.http/jdk.internal.net.http - * @run testng java.net.http/jdk.internal.net.http.Http1HeaderParserTest + * @run junit java.net.http/jdk.internal.net.http.Http1HeaderParserTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/MinimalFutureTestDriver.java b/test/jdk/java/net/httpclient/whitebox/MinimalFutureTestDriver.java index 316ca29e2a6..90fe6816adc 100644 --- a/test/jdk/java/net/httpclient/whitebox/MinimalFutureTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/MinimalFutureTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,5 +24,5 @@ /* * @test * @modules java.net.http/jdk.internal.net.http.common - * @run testng java.net.http/jdk.internal.net.http.common.MinimalFutureTest + * @run junit java.net.http/jdk.internal.net.http.common.MinimalFutureTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/RawChannelTestDriver.java b/test/jdk/java/net/httpclient/whitebox/RawChannelTestDriver.java index ab44fba5ecd..7ca448b7892 100644 --- a/test/jdk/java/net/httpclient/whitebox/RawChannelTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/RawChannelTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,10 +25,10 @@ * @test * @bug 8151299 8164704 * @modules java.net.http/jdk.internal.net.http - * @run testng/othervm java.net.http/jdk.internal.net.http.RawChannelTest + * @run junit/othervm java.net.http/jdk.internal.net.http.RawChannelTest */ // use -// @run testng/othervm -Dseed=6434511950803022575 +// @run junit/othervm -Dseed=6434511950803022575 // java.net.http/jdk.internal.net.http.RawChannelTest // to reproduce a failure with a particular seed (e.g. 6434511950803022575) // if this test is observed failing with that seed diff --git a/test/jdk/java/net/httpclient/whitebox/SSLEchoTubeTestDriver.java b/test/jdk/java/net/httpclient/whitebox/SSLEchoTubeTestDriver.java index d641513b298..b4b3e59326d 100644 --- a/test/jdk/java/net/httpclient/whitebox/SSLEchoTubeTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/SSLEchoTubeTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -25,7 +25,7 @@ * @test * @compile/module=java.net.http ../../../../../../lib/jdk/test/lib/net/SimpleSSLContext.java * @modules java.net.http/jdk.internal.net.http - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * java.net.http/jdk.internal.net.http.SSLEchoTubeTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/SSLFlowDelegateTestDriver.java b/test/jdk/java/net/httpclient/whitebox/SSLFlowDelegateTestDriver.java index a49f53a844a..cb8e9801ca8 100644 --- a/test/jdk/java/net/httpclient/whitebox/SSLFlowDelegateTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/SSLFlowDelegateTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -28,7 +28,7 @@ * downReader doesn't request any * @compile/module=java.net.http ../../../../../../lib/jdk/test/lib/net/SimpleSSLContext.java * @modules java.net.http/jdk.internal.net.http - * @run testng/othervm -Djdk.internal.httpclient.debug=true + * @run junit/othervm -Djdk.internal.httpclient.debug=true * -Djavax.net.debug=ssl:handshake * java.net.http/jdk.internal.net.http.SSLFlowDelegateTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/SSLTubeTestDriver.java b/test/jdk/java/net/httpclient/whitebox/SSLTubeTestDriver.java index b1994777b14..2c73de26648 100644 --- a/test/jdk/java/net/httpclient/whitebox/SSLTubeTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/SSLTubeTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -25,7 +25,7 @@ * @test * @compile/module=java.net.http ../../../../../../lib/jdk/test/lib/net/SimpleSSLContext.java * @modules java.net.http/jdk.internal.net.http - * @run testng/othervm + * @run junit/othervm * -Djdk.internal.httpclient.debug=true * java.net.http/jdk.internal.net.http.SSLTubeTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/SelectorTestDriver.java b/test/jdk/java/net/httpclient/whitebox/SelectorTestDriver.java index 226e644e903..54d66d04cff 100644 --- a/test/jdk/java/net/httpclient/whitebox/SelectorTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/SelectorTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,5 +25,5 @@ * @test * @bug 8151299 8164704 * @modules java.net.http/jdk.internal.net.http - * @run testng java.net.http/jdk.internal.net.http.SelectorTest + * @run junit java.net.http/jdk.internal.net.http.SelectorTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/WindowControllerTestDriver.java b/test/jdk/java/net/httpclient/whitebox/WindowControllerTestDriver.java index 7943bfceaa0..16ac4aaefb8 100644 --- a/test/jdk/java/net/httpclient/whitebox/WindowControllerTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/WindowControllerTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -26,5 +26,5 @@ * @bug 8207960 * @modules java.net.http/jdk.internal.net.http * @summary Non-negative WINDOW_UPDATE increments may leave the stream window size negative - * @run testng/othervm java.net.http/jdk.internal.net.http.WindowControllerTest + * @run junit/othervm java.net.http/jdk.internal.net.http.WindowControllerTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/WrapperTestDriver.java b/test/jdk/java/net/httpclient/whitebox/WrapperTestDriver.java index 7ea2b07e3a7..dfc808ff68b 100644 --- a/test/jdk/java/net/httpclient/whitebox/WrapperTestDriver.java +++ b/test/jdk/java/net/httpclient/whitebox/WrapperTestDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,5 +24,5 @@ /* * @test * @modules java.net.http/jdk.internal.net.http - * @run testng java.net.http/jdk.internal.net.http.WrapperTest + * @run junit java.net.http/jdk.internal.net.http.WrapperTest */ diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AbstractSSLTubeTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AbstractSSLTubeTest.java index 944f8ae0872..699b537c980 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AbstractSSLTubeTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AbstractSSLTubeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,17 +26,13 @@ package jdk.internal.net.http; import jdk.internal.net.http.common.FlowTube; import jdk.internal.net.http.common.SSLTube; import jdk.internal.net.http.common.Utils; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.nio.ByteBuffer; import java.util.List; -import java.util.StringTokenizer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AuthenticationFilterTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AuthenticationFilterTest.java index 415caeb1196..2e9672e4725 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AuthenticationFilterTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/AuthenticationFilterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,9 +24,6 @@ package jdk.internal.net.http; import jdk.internal.net.http.common.HttpHeadersBuilder; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; -import org.testng.annotations.AfterClass; import java.lang.ref.Reference; import java.net.Authenticator; @@ -55,12 +52,15 @@ import static java.util.stream.Collectors.joining; import static java.net.http.HttpClient.Version.HTTP_1_1; import static java.net.http.HttpClient.Version.HTTP_2; import static java.net.http.HttpClient.Builder.NO_PROXY; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; public class AuthenticationFilterTest { - @DataProvider(name = "uris") - public Object[][] responses() { + public static Object[][] responses() { return new Object[][] { { "http://foo.com", HTTP_1_1, null }, { "http://foo.com", HTTP_2, null }, @@ -135,7 +135,8 @@ public class AuthenticationFilterTest { return s == null || s.isEmpty(); } - @Test(dataProvider = "uris") + @ParameterizedTest + @MethodSource("responses") public void testAuthentication(String uri, Version v, String proxy) throws Exception { String test = format("testAuthentication: {\"%s\", %s, \"%s\"}", uri, v, proxy); try { @@ -146,8 +147,8 @@ public class AuthenticationFilterTest { } } - @AfterClass - public void printDiagnostic() { + @AfterAll + public static void printDiagnostic() { if (FAILED.isEmpty()) { out.println("All tests passed"); return; @@ -183,7 +184,7 @@ public class AuthenticationFilterTest { HttpClientImpl client = facade.impl; AuthenticationFilter filter = new AuthenticationFilter(); - assertEquals(authenticator.COUNTER.get(), 0); + assertEquals(0, authenticator.COUNTER.get()); // Creates the first HttpRequestImpl, and call filter.request() with // it. The expectation is that the filter will not add any credentials, @@ -202,7 +203,7 @@ public class AuthenticationFilterTest { HttpHeaders hdrs = req.getSystemHeadersBuilder().build(); assertFalse(hdrs.firstValue(authorization(true)).isPresent()); assertFalse(hdrs.firstValue(authorization(false)).isPresent()); - assertEquals(authenticator.COUNTER.get(), 0); + assertEquals(0, authenticator.COUNTER.get()); // Creates the Response to the first request, and call filter.response // with it. That response has a 401 or 407 status code. @@ -221,9 +222,9 @@ public class AuthenticationFilterTest { out.println("Checking filter's response to " + unauthorized + " from " + uri); - assertTrue(next != null, "next should not be null"); + assertNotNull(next, "next should not be null"); String[] up = check(reqURI, next.getSystemHeadersBuilder().build(), proxy); - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); // Now simulate a new successful exchange to get the credentials in the cache // We first call filter.request with the request that was previously @@ -241,8 +242,8 @@ public class AuthenticationFilterTest { HttpHeaders h = HttpHeaders.of(Collections.emptyMap(), ACCEPT_ALL); response = new Response(next, exchange,h, null, 200, v); next = filter.response(response); - assertTrue(next == null, "next should be null"); - assertEquals(authenticator.COUNTER.get(), 1); + assertNull(next, "next should be null"); + assertEquals(1, authenticator.COUNTER.get()); // Now verify that the cache is used for the next request to the same server. // We're going to create a request to the same server by appending "/bar" to @@ -270,7 +271,7 @@ public class AuthenticationFilterTest { + " with proxy " + req2.proxy()); String[] up2 = check(reqURI, req2.getSystemHeadersBuilder().build(), proxy); assertTrue(Arrays.deepEquals(up, up2), format("%s:%s != %s:%s", up2[0], up2[1], up[0], up[1])); - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); // Now verify that the cache is not used if we send a request to a different server. // We're going to append ".bar" to the original request host name, and feed that @@ -316,7 +317,7 @@ public class AuthenticationFilterTest { java.util.stream.Stream.of(getAuthorization(h3, false)) .collect(joining(":"))); assertFalse(h3.firstValue(authorization(false)).isPresent()); - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); // Now we will verify that credentials for proxies are not used for servers and // conversely. @@ -365,7 +366,7 @@ public class AuthenticationFilterTest { String[] up4 = check(reqURI, h4, proxy); assertTrue(Arrays.deepEquals(up, up4), format("%s:%s != %s:%s", up4[0], up4[1], up[0], up[1])); } - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); if (proxy != null) { // Now if we were using a proxy, we're going to send the same request than @@ -380,7 +381,7 @@ public class AuthenticationFilterTest { MultiExchange multi5 = new MultiExchange(origReq5, req5, client, HttpResponse.BodyHandlers.replacing(null), null); out.println("Simulating new request to " + reqURI + " with a proxy " + req5.proxy()); - assertTrue(req5.proxy() == null, "req5.proxy() should be null"); + assertNull(req5.proxy(), "req5.proxy() should be null"); Exchange exchange5 = new Exchange<>(req5, multi5); filter.request(req5, multi5); out.println("Check that filter has not added server credentials from cache for " @@ -398,7 +399,7 @@ public class AuthenticationFilterTest { java.util.stream.Stream.of(getAuthorization(h5, true)) .collect(joining(":"))); assertFalse(h5.firstValue(authorization(true)).isPresent()); - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); // Now simulate a 401 response from the server HttpHeadersBuilder headers5Builder = new HttpHeadersBuilder(); @@ -410,11 +411,11 @@ public class AuthenticationFilterTest { out.println("Simulating " + unauthorized + " response from " + uri); HttpRequestImpl next5 = filter.response(response5); - assertEquals(authenticator.COUNTER.get(), 2); + assertEquals(2, authenticator.COUNTER.get()); out.println("Checking filter's response to " + unauthorized + " from " + uri); - assertTrue(next5 != null, "next5 should not be null"); + assertNotNull(next5, "next5 should not be null"); String[] up5 = check(reqURI, next5.getSystemHeadersBuilder().build(), null); // now simulate a 200 response from the server @@ -423,7 +424,7 @@ public class AuthenticationFilterTest { h = HttpHeaders.of(Map.of(), ACCEPT_ALL); response5 = new Response(next5, exchange5, h, null, 200, v); filter.response(response5); - assertEquals(authenticator.COUNTER.get(), 2); + assertEquals(2, authenticator.COUNTER.get()); // now send the request again, with proxy this time, and it should have both // server auth and proxy auth @@ -433,7 +434,7 @@ public class AuthenticationFilterTest { MultiExchange multi6 = new MultiExchange(origReq6, req6, client, HttpResponse.BodyHandlers.replacing(null), null); out.println("Simulating new request to " + reqURI + " with a proxy " + req6.proxy()); - assertTrue(req6.proxy() != null, "req6.proxy() should not be null"); + assertNotNull(req6.proxy(), "req6.proxy() should not be null"); Exchange exchange6 = new Exchange<>(req6, multi6); filter.request(req6, multi6); out.println("Check that filter has added server credentials from cache for " @@ -444,7 +445,7 @@ public class AuthenticationFilterTest { + reqURI + " (proxy: " + req6.proxy() + ")"); String[] up6 = check(reqURI, h6, proxy); assertTrue(Arrays.deepEquals(up, up6), format("%s:%s != %s:%s", up6[0], up6[1], up[0], up[1])); - assertEquals(authenticator.COUNTER.get(), 2); + assertEquals(2, authenticator.COUNTER.get()); } if (proxy == null && uri.contains("x/y/z")) { @@ -456,7 +457,7 @@ public class AuthenticationFilterTest { MultiExchange multi7 = new MultiExchange(origReq7, req7, client, HttpResponse.BodyHandlers.replacing(null), null); out.println("Simulating new request to " + reqURI7 + " with a proxy " + req7.proxy()); - assertTrue(req7.proxy() == null, "req7.proxy() should be null"); + assertNull(req7.proxy(), "req7.proxy() should be null"); Exchange exchange7 = new Exchange<>(req7, multi7); filter.request(req7, multi7); out.println("Check that filter has not added server credentials from cache for " @@ -475,7 +476,7 @@ public class AuthenticationFilterTest { java.util.stream.Stream.of(getAuthorization(h7, true)) .collect(joining(":"))); assertFalse(h7.firstValue(authorization(true)).isPresent()); - assertEquals(authenticator.COUNTER.get(), 1); + assertEquals(1, authenticator.COUNTER.get()); } @@ -516,7 +517,7 @@ public class AuthenticationFilterTest { out.println("user:password: " + u + ":" + p); String protocol = proxy != null ? "http" : reqURI.getScheme(); String expectedUser = "u." + protocol; - assertEquals(u, expectedUser); + assertEquals(expectedUser, u); String host = proxy == null ? reqURI.getHost() : proxy.substring(0, proxy.lastIndexOf(':')); int port = proxy == null ? reqURI.getPort() @@ -524,7 +525,7 @@ public class AuthenticationFilterTest { String expectedPw = concat(requestorType(proxy!=null), "basic", protocol, host, port, "earth", reqURI.toURL()); - assertEquals(p, expectedPw); + assertEquals(expectedPw, p); return new String[] {u, p}; } diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/DefaultProxy.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/DefaultProxy.java index 96d08ae2c34..819b02e7fc7 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/DefaultProxy.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/DefaultProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -29,8 +29,9 @@ import java.net.ProxySelector; import java.net.URI; import java.net.http.HttpClient; import java.util.List; -import org.testng.annotations.Test; -import static org.testng.Assert.assertEquals; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class DefaultProxy { @@ -42,7 +43,7 @@ public class DefaultProxy { public void testDefault() { ProxySelector ps = getProxySelector(); System.out.println("HttpClientImpl proxySelector:" + ps); - assertEquals(ps, ProxySelector.getDefault()); + assertEquals(ProxySelector.getDefault(), ps); } // From the test driver @@ -56,21 +57,21 @@ public class DefaultProxy { URI uri = URI.create("http://foo.com/example.html"); List plist = ps.select(uri); System.out.println("proxy list for " + uri + " : " + plist); - assertEquals(plist.size(), 1); + assertEquals(1, plist.size()); Proxy proxy = plist.get(0); - assertEquals(proxy.type(), Proxy.Type.HTTP); + assertEquals(Proxy.Type.HTTP, proxy.type()); InetSocketAddress expectedAddr = InetSocketAddress.createUnresolved("foo.proxy.com", 9876); - assertEquals(proxy.address(), expectedAddr); + assertEquals(expectedAddr, proxy.address()); // nonProxyHosts uri = URI.create("http://foo.direct.com/example.html"); plist = ps.select(uri); System.out.println("proxy list for " + uri + " : " + plist); - assertEquals(plist.size(), 1); + assertEquals(1, plist.size()); proxy = plist.get(0); - assertEquals(proxy.type(), Proxy.Type.DIRECT); - assertEquals(proxy.address(), null); + assertEquals(Proxy.Type.DIRECT, proxy.type()); + assertEquals(null, proxy.address()); } // From the test driver @@ -83,21 +84,21 @@ public class DefaultProxy { URI uri = URI.create("https://foo.com/example.html"); List plist = ps.select(uri); System.out.println("proxy list for " + uri + " : " + plist); - assertEquals(plist.size(), 1); + assertEquals(1, plist.size()); Proxy proxy = plist.get(0); - assertEquals(proxy.type(), Proxy.Type.HTTP); + assertEquals(Proxy.Type.HTTP, proxy.type()); InetSocketAddress expectedAddr = InetSocketAddress.createUnresolved("secure.proxy.com", 5443); - assertEquals(proxy.address(), expectedAddr); + assertEquals(expectedAddr, proxy.address()); // nonProxyHosts uri = URI.create("https://foo.direct.com/example.html"); plist = ps.select(uri); System.out.println("proxy list for " + uri + " : " + plist); - assertEquals(plist.size(), 1); + assertEquals(1, plist.size()); proxy = plist.get(0); - assertEquals(proxy.type(), Proxy.Type.DIRECT); - assertEquals(proxy.address(), null); + assertEquals(Proxy.Type.DIRECT, proxy.type()); + assertEquals(null, proxy.address()); } } diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/FlowTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/FlowTest.java index 3e9e967c061..cd05196b653 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/FlowTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/FlowTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -32,8 +32,6 @@ import java.net.InetSocketAddress; import java.net.Socket; import java.nio.ByteBuffer; import java.util.List; -import java.util.Random; -import java.util.StringTokenizer; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; @@ -47,10 +45,10 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import javax.net.ssl.*; import jdk.internal.net.http.common.Utils; -import org.testng.annotations.Test; import jdk.internal.net.http.common.SSLFlowDelegate; -@Test +import org.junit.jupiter.api.Test; + public class FlowTest extends AbstractRandomTest { private final SubmissionPublisher> srcPublisher; @@ -241,7 +239,7 @@ public class FlowTest extends AbstractRandomTest { private void clientReader() { try { InputStream is = clientSock.getInputStream(); - final int bufsize = FlowTest.randomRange(512, 16 * 1024); + final int bufsize = AbstractRandomTest.randomRange(512, 16 * 1024); println("clientReader: bufsize = " + bufsize); while (true) { byte[] buf = new byte[bufsize]; @@ -315,8 +313,8 @@ public class FlowTest extends AbstractRandomTest { private final AtomicInteger loopCount = new AtomicInteger(); public String monitor() { - return "serverLoopback: loopcount = " + loopCount.toString() - + " clientRead: count = " + readCount.toString(); + return "serverLoopback: loopcount = " + loopCount.get() + + " clientRead: count = " + readCount.get(); } // thread2 @@ -324,7 +322,7 @@ public class FlowTest extends AbstractRandomTest { try { InputStream is = serverSock.getInputStream(); OutputStream os = serverSock.getOutputStream(); - final int bufsize = FlowTest.randomRange(512, 16 * 1024); + final int bufsize = AbstractRandomTest.randomRange(512, 16 * 1024); println("serverLoopback: bufsize = " + bufsize); byte[] bb = new byte[bufsize]; while (true) { diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/Http1HeaderParserTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/Http1HeaderParserTest.java index 9bde9109095..a4c7b76aba8 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/Http1HeaderParserTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/Http1HeaderParserTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -36,22 +36,22 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; import sun.net.www.MessageHeader; -import org.testng.annotations.Test; -import org.testng.annotations.DataProvider; import static java.lang.System.out; import static java.lang.String.format; import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.nio.charset.StandardCharsets.US_ASCII; import static java.util.stream.Collectors.toList; -import static org.testng.Assert.*; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; // Mostly verifies the "new" Http1HeaderParser returns the same results as the // tried and tested sun.net.www.MessageHeader. public class Http1HeaderParserTest { - @DataProvider(name = "responses") - public Object[][] responses() { + public static Object[][] responses() { List responses = new ArrayList<>(); String[] basic = @@ -316,7 +316,8 @@ public class Http1HeaderParserTest { } - @Test(dataProvider = "responses") + @ParameterizedTest + @MethodSource("responses") public void verifyHeaders(String respString) throws Exception { System.out.println("\ntesting:\n\t" + respString .replace("\r\n", "") @@ -339,7 +340,7 @@ public class Http1HeaderParserTest { String statusLine1 = messageHeaderMap.get(null).get(0); String statusLine2 = decoder.statusLine(); if (statusLine1.startsWith("HTTP")) {// skip the case where MH's messes up the status-line - assertEquals(statusLine2, statusLine1, "Status-line not equal"); + assertEquals(statusLine1, statusLine2, "Status-line not equal"); } else { assertTrue(statusLine2.startsWith("HTTP/1."), "Status-line not HTTP/1."); } @@ -356,7 +357,7 @@ public class Http1HeaderParserTest { assertHeadersEqual(messageHeaderMap, decoderMap1, "messageHeaderMap not equal to decoderMap1"); - assertEquals(availableBytes, b.remaining(), + assertEquals(b.remaining(), availableBytes, String.format("stream available (%d) not equal to remaining (%d)", availableBytes, b.remaining())); // byte at a time @@ -366,14 +367,13 @@ public class Http1HeaderParserTest { .collect(toList()); while (decoder.parse(buffers.remove(0)) != true); Map> decoderMap2 = decoder.headers().map(); - assertEquals(availableBytes, buffers.size(), + assertEquals(buffers.size(), availableBytes, "stream available not equals to remaining buffers"); - assertEquals(decoderMap1, decoderMap2, "decoder maps not equal"); + assertEquals(decoderMap2, decoderMap1, "decoder maps not equal"); } - @DataProvider(name = "errors") - public Object[][] errors() { + public static Object[][] errors() { List responses = new ArrayList<>(); // These responses are parsed, somewhat, by MessageHeaders but give @@ -451,12 +451,15 @@ public class Http1HeaderParserTest { return responses.stream().map(p -> new Object[] { p }).toArray(Object[][]::new); } - @Test(dataProvider = "errors", expectedExceptions = ProtocolException.class) + @ParameterizedTest + @MethodSource("errors") public void errors(String respString) throws ProtocolException { - byte[] bytes = respString.getBytes(US_ASCII); - Http1HeaderParser decoder = new Http1HeaderParser(); - ByteBuffer b = ByteBuffer.wrap(bytes); - decoder.parse(b); + assertThrows(ProtocolException.class, () -> { + byte[] bytes = respString.getBytes(US_ASCII); + Http1HeaderParser decoder = new Http1HeaderParser(); + ByteBuffer b = ByteBuffer.wrap(bytes); + decoder.parse(b); + }); } void assertHeadersEqual(Map> expected, @@ -466,7 +469,7 @@ public class Http1HeaderParserTest { if (expected.equals(actual)) return; - assertEquals(expected.size(), actual.size(), + assertEquals(actual.size(), expected.size(), format("%s. Expected size %d, actual size %s. %nexpected= %s,%n actual=%s.", msg, expected.size(), actual.size(), mapToString(expected), mapToString(actual))); @@ -479,7 +482,7 @@ public class Http1HeaderParserTest { if (key.equalsIgnoreCase(other.getKey())) { found = true; List otherValues = other.getValue(); - assertEquals(values.size(), otherValues.size(), + assertEquals(otherValues.size(), values.size(), format("%s. Expected list size %d, actual size %s", msg, values.size(), otherValues.size())); if (!(values.containsAll(otherValues) && otherValues.containsAll(values))) @@ -508,11 +511,11 @@ public class Http1HeaderParserTest { public static void main(String... args) throws Exception { Http1HeaderParserTest test = new Http1HeaderParserTest(); int count = 0; - for (Object[] objs : test.responses()) { + for (Object[] objs : Http1HeaderParserTest.responses()) { out.println("Testing " + count++ + ", " + objs[0]); test.verifyHeaders((String) objs[0]); } - for (Object[] objs : test.errors()) { + for (Object[] objs : Http1HeaderParserTest.errors()) { out.println("Testing " + count++ + ", " + objs[0]); try { test.errors((String) objs[0]); diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/RawChannelTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/RawChannelTest.java index f6bcdcb4d33..62ca237d2f1 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/RawChannelTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/RawChannelTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -47,10 +47,11 @@ import java.net.http.HttpResponse; import java.util.concurrent.atomic.AtomicReference; import jdk.internal.net.http.websocket.RawChannel; -import org.testng.annotations.Test; import static java.net.http.HttpResponse.BodyHandlers.discarding; import static java.util.concurrent.TimeUnit.SECONDS; -import static org.testng.Assert.assertEquals; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /* * This test exercises mechanics of _independent_ reads and writes on the @@ -222,8 +223,8 @@ public class RawChannelTest { closeChannel(chan); }); exit.await(); // All done, we need to compare results: - assertEquals(clientRead.get(), serverWritten.get()); - assertEquals(serverRead.get(), clientWritten.get()); + assertEquals(serverWritten.get(), clientRead.get()); + assertEquals(clientWritten.get(), serverRead.get()); Throwable serverError = testServer.failed.get(); if (serverError != null) { throw new AssertionError("TestServer failed: " diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java index 2884b74eee5..4316a46a25c 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -28,7 +28,6 @@ import jdk.internal.net.http.common.FlowTube; import jdk.internal.net.http.common.SSLTube; import jdk.internal.net.http.common.SequentialScheduler; import jdk.internal.net.http.common.Utils; -import org.testng.annotations.Test; import java.io.IOException; import java.nio.ByteBuffer; @@ -44,7 +43,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; -@Test +import org.junit.jupiter.api.Test; + public class SSLEchoTubeTest extends AbstractSSLTubeTest { @Test diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLFlowDelegateTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLFlowDelegateTest.java index 6b031bdfa58..32511de173b 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLFlowDelegateTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLFlowDelegateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -58,10 +58,11 @@ import jdk.internal.net.http.common.Logger; import jdk.internal.net.http.common.SSLFlowDelegate; import jdk.internal.net.http.common.SubscriberWrapper; import jdk.internal.net.http.common.Utils; -import org.testng.Assert; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; // jtreg test definition for this test resides in SSLFlowDelegateTestDriver.java public class SSLFlowDelegateTest { @@ -70,38 +71,38 @@ public class SSLFlowDelegateTest { private static final Random random = new Random(); private static final byte DATA_BYTE = (byte) random.nextInt(); - private ExecutorService executor; - private SSLParameters sslParams; - private SSLServerSocket sslServerSocket; - private SSLEngine clientEngine; - private CompletableFuture testCompletion; + private static ExecutorService executor; + private static SSLParameters sslParams; + private static SSLServerSocket sslServerSocket; + private static SSLEngine clientEngine; + private static CompletableFuture testCompletion; - @BeforeTest - public void beforeTest() throws Exception { - this.executor = Executors.newCachedThreadPool(); - this.testCompletion = new CompletableFuture<>(); + @BeforeAll + public static void beforeTest() throws Exception { + executor = Executors.newCachedThreadPool(); + testCompletion = new CompletableFuture<>(); final SSLParameters sp = new SSLParameters(); sp.setApplicationProtocols(new String[]{ALPN}); - this.sslParams = sp; + sslParams = sp; var sslContext = SimpleSSLContextWhiteboxAdapter.findSSLContext(); - this.sslServerSocket = startServer(sslContext); - println(debugTag, "Server started at " + this.sslServerSocket.getInetAddress() + ":" - + this.sslServerSocket.getLocalPort()); + sslServerSocket = startServer(sslContext); + println(debugTag, "Server started at " + sslServerSocket.getInetAddress() + ":" + + sslServerSocket.getLocalPort()); - this.clientEngine = createClientEngine(sslContext); + clientEngine = createClientEngine(sslContext); } - @AfterTest - public void afterTest() throws Exception { - if (this.sslServerSocket != null) { - println(debugTag, "Closing server socket " + this.sslServerSocket); - this.sslServerSocket.close(); + @AfterAll + public static void afterTest() throws Exception { + if (sslServerSocket != null) { + println(debugTag, "Closing server socket " + sslServerSocket); + sslServerSocket.close(); } - if (this.executor != null) { - println(debugTag, "Shutting down the executor " + this.executor); - this.executor.shutdownNow(); + if (executor != null) { + println(debugTag, "Shutting down the executor " + executor); + executor.shutdownNow(); } } @@ -117,30 +118,30 @@ public class SSLFlowDelegateTest { } } - private SSLServerSocket createSSLServerSocket( + private static SSLServerSocket createSSLServerSocket( final SSLContext ctx, final InetSocketAddress bindAddr) throws IOException { final SSLServerSocketFactory fac = ctx.getServerSocketFactory(); final SSLServerSocket sslServerSocket = (SSLServerSocket) fac.createServerSocket(); sslServerSocket.setReuseAddress(false); - sslServerSocket.setSSLParameters(this.sslParams); + sslServerSocket.setSSLParameters(sslParams); sslServerSocket.bind(bindAddr); return sslServerSocket; } - private SSLServerSocket startServer(final SSLContext ctx) throws Exception { + private static SSLServerSocket startServer(final SSLContext ctx) throws Exception { final SSLServerSocket sslServerSocket = createSSLServerSocket(ctx, new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); final Runnable serverResponsePusher = new ServerResponsePusher(sslServerSocket, - this.testCompletion); + testCompletion); final Thread serverThread = new Thread(serverResponsePusher, "serverResponsePusher"); // start the thread which will accept() a socket connection and send data over it serverThread.start(); return sslServerSocket; } - private SSLEngine createClientEngine(final SSLContext ctx) { + private static SSLEngine createClientEngine(final SSLContext ctx) { final SSLEngine clientEngine = ctx.createSSLEngine(); - clientEngine.setSSLParameters(this.sslParams); + clientEngine.setSSLParameters(sslParams); clientEngine.setUseClientMode(true); return clientEngine; } @@ -170,7 +171,7 @@ public class SSLFlowDelegateTest { // in various places in this test. If the "testCompletion" completes before // the "soleExpectedAppData" completes (typically due to some exception), // then we complete the "soleExpectedAppData" too. - this.testCompletion.whenComplete((r, t) -> { + testCompletion.whenComplete((r, t) -> { if (soleExpectedAppData.isDone()) { return; } @@ -221,7 +222,7 @@ public class SSLFlowDelegateTest { println(debugTag, "Waiting for handshake to complete"); final String negotiatedALPN = sslFlowDelegate.alpn().join(); println(debugTag, "handshake completed, with negotiated ALPN: " + negotiatedALPN); - Assert.assertEquals(negotiatedALPN, ALPN, "unexpected ALPN negotiated"); + assertEquals(ALPN, negotiatedALPN, "unexpected ALPN negotiated"); try { // now wait for the initial (and the only) chunk of application data to be // received by the AppResponseReceiver @@ -254,7 +255,7 @@ public class SSLFlowDelegateTest { private void failTest(final CompletionException ce) { final Throwable cause = ce.getCause(); - Assert.fail(cause.getMessage() == null ? "test failed" : cause.getMessage(), cause); + fail(cause.getMessage() == null ? "test failed" : cause.getMessage(), cause); } // uses reflection to get hold of the SSLFlowDelegate.reader.outputQ member field, @@ -288,7 +289,7 @@ public class SSLFlowDelegateTest { } println(debugTag, "num unsolicited bytes so far = " + numUnsolicitated); } - Assert.assertEquals(numUnsolicitated, 0, + assertEquals(0, numUnsolicitated, "SSLFlowDelegate has accumulated " + numUnsolicitated + " unsolicited bytes"); } diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java index ac6a235b8e2..bb8d583e07b 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,7 +26,6 @@ package jdk.internal.net.http; import jdk.internal.net.http.common.FlowTube; import jdk.internal.net.http.common.SSLFlowDelegate; import jdk.internal.net.http.common.Utils; -import org.testng.annotations.Test; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLParameters; @@ -51,7 +50,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SubmissionPublisher; import java.util.concurrent.atomic.AtomicInteger; -@Test +import org.junit.jupiter.api.Test; + public class SSLTubeTest extends AbstractSSLTubeTest { @Test @@ -125,7 +125,7 @@ public class SSLTubeTest extends AbstractSSLTubeTest { private void clientReader() { try { InputStream is = clientSock.getInputStream(); - final int bufsize = randomRange(512, 16 * 1024); + final int bufsize = AbstractRandomTest.randomRange(512, 16 * 1024); System.out.println("clientReader: bufsize = " + bufsize); while (true) { byte[] buf = new byte[bufsize]; @@ -137,7 +137,7 @@ public class SSLTubeTest extends AbstractSSLTubeTest { allBytesReceived.await(); System.out.println("clientReader: closing publisher"); publisher.close(); - sleep(2000); + AbstractSSLTubeTest.sleep(2000); Utils.close(is, clientSock); return; } @@ -206,13 +206,13 @@ public class SSLTubeTest extends AbstractSSLTubeTest { try { InputStream is = serverSock.getInputStream(); OutputStream os = serverSock.getOutputStream(); - final int bufsize = randomRange(512, 16 * 1024); + final int bufsize = AbstractRandomTest.randomRange(512, 16 * 1024); System.out.println("serverLoopback: bufsize = " + bufsize); byte[] bb = new byte[bufsize]; while (true) { int n = is.read(bb); if (n == -1) { - sleep(2000); + AbstractSSLTubeTest.sleep(2000); is.close(); os.close(); serverSock.close(); diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SelectorTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SelectorTest.java index 5b8da3b9979..3027df0436e 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SelectorTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SelectorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -31,20 +31,20 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import java.net.http.HttpClient; import java.net.http.HttpResponse; -import org.testng.annotations.Test; import jdk.internal.net.http.websocket.RawChannel; import static java.lang.System.out; import static java.nio.charset.StandardCharsets.US_ASCII; import static java.util.concurrent.TimeUnit.SECONDS; import static java.net.http.HttpResponse.BodyHandlers.discarding; +import org.junit.jupiter.api.Test; + /** * Whitebox test of selector mechanics. Currently only a simple test * setting one read and one write event is done. It checks that the * write event occurs first, followed by the read event and then no * further events occur despite the conditions actually still existing. */ -@Test public class SelectorTest { AtomicInteger counter = new AtomicInteger(); diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WindowControllerTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WindowControllerTest.java index 0a94f471575..5df3b4227e6 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WindowControllerTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WindowControllerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -23,92 +23,93 @@ package jdk.internal.net.http; -import org.testng.annotations.Test; import static jdk.internal.net.http.frame.SettingsFrame.DEFAULT_INITIAL_WINDOW_SIZE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertThrows; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class WindowControllerTest { @Test public void testConnectionWindowOverflow() { WindowController wc = new WindowController(); - assertEquals(wc.connectionWindowSize(), DEFAULT_INITIAL_WINDOW_SIZE); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.connectionWindowSize(), DEFAULT_INITIAL_WINDOW_SIZE); + assertEquals(DEFAULT_INITIAL_WINDOW_SIZE, wc.connectionWindowSize()); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(DEFAULT_INITIAL_WINDOW_SIZE, wc.connectionWindowSize()); wc.registerStream(1, DEFAULT_INITIAL_WINDOW_SIZE); wc.tryAcquire(DEFAULT_INITIAL_WINDOW_SIZE - 1, 1, null); - assertEquals(wc.connectionWindowSize(), 1); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.connectionWindowSize(), 1); + assertEquals(1, wc.connectionWindowSize()); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(1, wc.connectionWindowSize()); wc.increaseConnectionWindow(Integer.MAX_VALUE - 1 -1); - assertEquals(wc.connectionWindowSize(), Integer.MAX_VALUE - 1); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.connectionWindowSize(), Integer.MAX_VALUE - 1); + assertEquals(Integer.MAX_VALUE - 1, wc.connectionWindowSize()); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(Integer.MAX_VALUE - 1, wc.connectionWindowSize()); wc.increaseConnectionWindow(1); - assertEquals(wc.connectionWindowSize(), Integer.MAX_VALUE); - assertEquals(wc.increaseConnectionWindow(1), false); - assertEquals(wc.increaseConnectionWindow(100), false); - assertEquals(wc.increaseConnectionWindow(Integer.MAX_VALUE), false); - assertEquals(wc.connectionWindowSize(), Integer.MAX_VALUE); + assertEquals(Integer.MAX_VALUE, wc.connectionWindowSize()); + assertEquals(false, wc.increaseConnectionWindow(1)); + assertEquals(false, wc.increaseConnectionWindow(100)); + assertEquals(false, wc.increaseConnectionWindow(Integer.MAX_VALUE)); + assertEquals(Integer.MAX_VALUE, wc.connectionWindowSize()); } @Test public void testStreamWindowOverflow() { WindowController wc = new WindowController(); wc.registerStream(1, DEFAULT_INITIAL_WINDOW_SIZE); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 1), false); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 1), false); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 1), false); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 1)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 1)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 1)); wc.registerStream(3, DEFAULT_INITIAL_WINDOW_SIZE); - assertEquals(wc.increaseStreamWindow(100, 3), true); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 3), false); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 3), false); + assertEquals(true, wc.increaseStreamWindow(100, 3)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 3)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 3)); wc.registerStream(5, 0); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 5), true); - assertEquals(wc.increaseStreamWindow(1, 5), false); - assertEquals(wc.increaseStreamWindow(1, 5), false); - assertEquals(wc.increaseStreamWindow(10, 5), false); + assertEquals(true, wc.increaseStreamWindow(Integer.MAX_VALUE, 5)); + assertEquals(false, wc.increaseStreamWindow(1, 5)); + assertEquals(false, wc.increaseStreamWindow(1, 5)); + assertEquals(false, wc.increaseStreamWindow(10, 5)); wc.registerStream(7, -1); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 7), true); - assertEquals(wc.increaseStreamWindow(1, 7), true); - assertEquals(wc.increaseStreamWindow(1, 7), false); - assertEquals(wc.increaseStreamWindow(10, 7), false); + assertEquals(true, wc.increaseStreamWindow(Integer.MAX_VALUE, 7)); + assertEquals(true, wc.increaseStreamWindow(1, 7)); + assertEquals(false, wc.increaseStreamWindow(1, 7)); + assertEquals(false, wc.increaseStreamWindow(10, 7)); wc.registerStream(9, -1); - assertEquals(wc.increaseStreamWindow(1, 9), true); - assertEquals(wc.increaseStreamWindow(1, 9), true); - assertEquals(wc.increaseStreamWindow(1, 9), true); - assertEquals(wc.increaseStreamWindow(10, 9), true); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 9), false); + assertEquals(true, wc.increaseStreamWindow(1, 9)); + assertEquals(true, wc.increaseStreamWindow(1, 9)); + assertEquals(true, wc.increaseStreamWindow(1, 9)); + assertEquals(true, wc.increaseStreamWindow(10, 9)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 9)); wc.registerStream(11, -10); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.increaseStreamWindow(1, 11), true); - assertEquals(wc.streamWindowSize(11), 1); - assertEquals(wc.increaseStreamWindow(Integer.MAX_VALUE, 11), false); - assertEquals(wc.streamWindowSize(11), 1); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(true, wc.increaseStreamWindow(1, 11)); + assertEquals(1, wc.streamWindowSize(11)); + assertEquals(false, wc.increaseStreamWindow(Integer.MAX_VALUE, 11)); + assertEquals(1, wc.streamWindowSize(11)); } @Test @@ -125,9 +126,9 @@ public class WindowControllerTest { wc.tryAcquire(51, 5 , null); wc.adjustActiveStreams(-200); - assertEquals(wc.streamWindowSize(1), -149); - assertEquals(wc.streamWindowSize(3), -150); - assertEquals(wc.streamWindowSize(5), -151); + assertEquals(-149, wc.streamWindowSize(1)); + assertEquals(-150, wc.streamWindowSize(3)); + assertEquals(-151, wc.streamWindowSize(5)); } static final Class IE = InternalError.class; diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WrapperTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WrapperTest.java index 6dad2cc75b5..bc69c425678 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WrapperTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/WrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -27,11 +27,10 @@ import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.List; import java.util.concurrent.*; -import java.util.concurrent.atomic.*; -import org.testng.annotations.Test; import jdk.internal.net.http.common.SubscriberWrapper; -@Test +import org.junit.jupiter.api.Test; + public class WrapperTest { static final int LO_PRI = 1; static final int HI_PRI = 2; diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DemandTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DemandTest.java index 4ea604fd488..1ea72f472e9 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DemandTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DemandTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -23,15 +23,16 @@ package jdk.internal.net.http.common; -import org.testng.annotations.Test; - import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicReference; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; public class DemandTest { @@ -59,53 +60,61 @@ public class DemandTest { public void test03() { Demand d = new Demand(); d.increase(3); - assertEquals(d.decreaseAndGet(3), 3); + assertEquals(3, d.decreaseAndGet(3)); } @Test public void test04() { Demand d = new Demand(); d.increase(3); - assertEquals(d.decreaseAndGet(5), 3); + assertEquals(3, d.decreaseAndGet(5)); } @Test public void test05() { Demand d = new Demand(); d.increase(7); - assertEquals(d.decreaseAndGet(4), 4); + assertEquals(4, d.decreaseAndGet(4)); } @Test public void test06() { Demand d = new Demand(); - assertEquals(d.decreaseAndGet(3), 0); + assertEquals(0, d.decreaseAndGet(3)); } - @Test(expectedExceptions = IllegalArgumentException.class) + @Test public void test07() { - Demand d = new Demand(); - d.increase(0); + assertThrows(IllegalArgumentException.class, () -> { + Demand d = new Demand(); + d.increase(0); + }); } - @Test(expectedExceptions = IllegalArgumentException.class) + @Test public void test08() { - Demand d = new Demand(); - d.increase(-1); + assertThrows(IllegalArgumentException.class, () -> { + Demand d = new Demand(); + d.increase(-1); + }); } - @Test(expectedExceptions = IllegalArgumentException.class) + @Test public void test09() { - Demand d = new Demand(); - d.increase(10); - d.decreaseAndGet(0); + assertThrows(IllegalArgumentException.class, () -> { + Demand d = new Demand(); + d.increase(10); + d.decreaseAndGet(0); + }); } - @Test(expectedExceptions = IllegalArgumentException.class) + @Test public void test10() { - Demand d = new Demand(); - d.increase(13); - d.decreaseAndGet(-3); + assertThrows(IllegalArgumentException.class, () -> { + Demand d = new Demand(); + d.increase(13); + d.decreaseAndGet(-3); + }); } @Test @@ -169,7 +178,7 @@ public class DemandTest { assertTrue(d.isFulfilled()); } - @Test(invocationCount = 32) + @Test public void test15() throws InterruptedException { int N = Math.max(2, Runtime.getRuntime().availableProcessors() + 1); int M = ((N + 1) * N) / 2; // 1 + 2 + 3 + ... N @@ -187,7 +196,7 @@ public class DemandTest { error.compareAndSet(null, e); } try { - assertEquals(d.decreaseAndGet(j), j); + assertEquals(j, d.decreaseAndGet(j)); } catch (Throwable t) { error.compareAndSet(null, t); } finally { @@ -197,6 +206,6 @@ public class DemandTest { } stop.await(); assertTrue(d.isFulfilled()); - assertEquals(error.get(), null); + assertNull(error.get()); } } diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/MinimalFutureTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/MinimalFutureTest.java index 01798a645a2..2c33f6f0018 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/MinimalFutureTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/MinimalFutureTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -23,19 +23,19 @@ package jdk.internal.net.http.common; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static org.testng.Assert.assertThrows; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertThrows; public class MinimalFutureTest { - @Test(dataProvider = "futures") + @ParameterizedTest + @MethodSource("futures") public void test(CompletableFuture mf) { ExecutorService executor = Executors.newSingleThreadExecutor(); try { @@ -134,8 +134,7 @@ public class MinimalFutureTest { } - @DataProvider(name = "futures") - public Object[][] futures() { + public static Object[][] futures() { MinimalFuture mf = new MinimalFuture<>(); mf.completeExceptionally(new Throwable()); diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/frame/FramesDecoderTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/frame/FramesDecoderTest.java index 3db439d1c00..e8acc95c1d2 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/frame/FramesDecoderTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/frame/FramesDecoderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -27,15 +27,15 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import org.testng.Assert; -import org.testng.annotations.Test; import static java.lang.System.out; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.testng.Assert.*; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; public class FramesDecoderTest { - abstract class TestFrameProcessor implements FramesDecoder.FrameProcessor { + abstract static class TestFrameProcessor implements FramesDecoder.FrameProcessor { protected volatile int count; public int numberOfFramesDecoded() { return count; } } @@ -69,17 +69,17 @@ public class FramesDecoderTest { assertTrue(frame instanceof DataFrame); DataFrame dataFrame = (DataFrame) frame; List list = dataFrame.getData(); - assertEquals(list.size(), 1); + assertEquals(1, list.size()); ByteBuffer data = list.get(0); byte[] bytes = new byte[data.remaining()]; data.get(bytes); if (count == 0) { - assertEquals(new String(bytes, UTF_8), "XXXX"); + assertEquals("XXXX", new String(bytes, UTF_8)); out.println("First data received:" + data); - assertEquals(data.position(), data.limit()); // since bytes read - assertEquals(data.limit(), data.capacity()); + assertEquals(data.limit(), data.position()); // since bytes read + assertEquals(data.capacity(), data.limit()); } else { - assertEquals(new String(bytes, UTF_8), "YYYY"); + assertEquals("YYYY", new String(bytes, UTF_8)); out.println("Second data received:" + data); } count++; @@ -89,7 +89,7 @@ public class FramesDecoderTest { out.println("Sending " + combined + " to decoder: "); decoder.decode(combined); - Assert.assertEquals(testFrameProcessor.numberOfFramesDecoded(), 2); + assertEquals(2, testFrameProcessor.numberOfFramesDecoded()); } @@ -119,15 +119,15 @@ public class FramesDecoderTest { assertTrue(frame instanceof DataFrame); DataFrame dataFrame = (DataFrame) frame; List list = dataFrame.getData(); - assertEquals(list.size(), 1); + assertEquals(1, list.size()); ByteBuffer data = list.get(0); byte[] bytes = new byte[data.remaining()]; data.get(bytes); - assertEquals(new String(bytes, UTF_8), "XXXX"); + assertEquals("XXXX", new String(bytes, UTF_8)); out.println("First data received:" + data); - assertEquals(data.position(), data.limit()); // since bytes read + assertEquals(data.limit(), data.position()); // since bytes read //assertNotEquals(data.limit(), data.capacity()); - assertEquals(data.capacity(), 1024 - 9 /*frame header*/); + assertEquals(1024 - 9 /*frame header*/, data.capacity()); count++; } }; @@ -135,6 +135,6 @@ public class FramesDecoderTest { out.println("Sending " + combined + " to decoder: "); decoder.decode(combined); - Assert.assertEquals(testFrameProcessor.numberOfFramesDecoded(), 1); + assertEquals(1, testFrameProcessor.numberOfFramesDecoded()); } } diff --git a/test/jdk/java/nio/channels/AsynchronousSocketChannel/CompletionHandlerRelease.java b/test/jdk/java/nio/channels/AsynchronousSocketChannel/CompletionHandlerRelease.java index 7abbf064b40..962d7728a55 100644 --- a/test/jdk/java/nio/channels/AsynchronousSocketChannel/CompletionHandlerRelease.java +++ b/test/jdk/java/nio/channels/AsynchronousSocketChannel/CompletionHandlerRelease.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -23,7 +23,7 @@ /* @test * @bug 8202252 - * @run testng CompletionHandlerRelease + * @run junit CompletionHandlerRelease * @summary Verify that reference to CompletionHandler is cleared after use */ @@ -44,10 +44,12 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; -import static org.testng.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; public class CompletionHandlerRelease { @Test @@ -132,16 +134,16 @@ public class CompletionHandlerRelease { } } - private AsynchronousChannelGroup GROUP; + private static AsynchronousChannelGroup GROUP; - @BeforeTest - void setup() throws IOException { + @BeforeAll + static void setup() throws IOException { GROUP = AsynchronousChannelGroup.withFixedThreadPool(2, Executors.defaultThreadFactory()); } - @AfterTest - void cleanup() throws IOException { + @AfterAll + static void cleanup() throws IOException { GROUP.shutdownNow(); } @@ -199,13 +201,13 @@ public class CompletionHandlerRelease { } } - private void waitForRefToClear(Reference ref, ReferenceQueue queue) + private static void waitForRefToClear(Reference ref, ReferenceQueue queue) throws InterruptedException { Reference r; while ((r = queue.remove(20)) == null) { System.gc(); } - assertEquals(r, ref); + assertSame(ref, r); assertNull(r.get()); } } diff --git a/test/jdk/java/nio/channels/Channels/EncodingTest.java b/test/jdk/java/nio/channels/Channels/EncodingTest.java index 1f2530ae41b..341439524c1 100644 --- a/test/jdk/java/nio/channels/Channels/EncodingTest.java +++ b/test/jdk/java/nio/channels/Channels/EncodingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -34,16 +34,21 @@ import java.nio.charset.Charset; import java.nio.charset.MalformedInputException; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @test * @bug 8183743 * @summary Test to verify the new overload method with Charset functions the same * as the existing method that takes a charset name. - * @run testng EncodingTest + * @run junit EncodingTest */ public class EncodingTest { static final int ITERATIONS = 2; @@ -73,53 +78,50 @@ public class EncodingTest { } } - String testFile = Paths.get(USER_DIR, "channelsEncodingTest.txt").toString(); - String testIllegalInput = Paths.get(USER_DIR, "channelsIllegalInputTest.txt").toString(); - String testIllegalOutput = Paths.get(USER_DIR, "channelsIllegalOutputTest.txt").toString(); + static String testFile = Paths.get(USER_DIR, "channelsEncodingTest.txt").toString(); + static String testIllegalInput = Paths.get(USER_DIR, "channelsIllegalInputTest.txt").toString(); + static String testIllegalOutput = Paths.get(USER_DIR, "channelsIllegalOutputTest.txt").toString(); /* * DataProvider for read and write test. * Writes and reads with the same encoding */ - @DataProvider(name = "writeAndRead") - public Object[][] getWRParameters() { - return new Object[][]{ - {testFile, StandardCharsets.ISO_8859_1.name(), null, - StandardCharsets.ISO_8859_1.name(), StandardCharsets.ISO_8859_1}, - {testFile, null, StandardCharsets.ISO_8859_1, - StandardCharsets.ISO_8859_1.name(), StandardCharsets.ISO_8859_1}, - {testFile, StandardCharsets.UTF_8.name(), null, - StandardCharsets.UTF_8.name(), StandardCharsets.UTF_8}, - {testFile, null, StandardCharsets.UTF_8, - StandardCharsets.UTF_8.name(), StandardCharsets.UTF_8} - }; + public static Stream writeAndRead() { + return Stream.of + (Arguments.of(testFile, StandardCharsets.ISO_8859_1.name(), null, + StandardCharsets.ISO_8859_1.name(), StandardCharsets.ISO_8859_1), + Arguments.of(testFile, null, StandardCharsets.ISO_8859_1, + StandardCharsets.ISO_8859_1.name(), StandardCharsets.ISO_8859_1), + Arguments.of(testFile, StandardCharsets.UTF_8.name(), null, + StandardCharsets.UTF_8.name(), StandardCharsets.UTF_8), + Arguments.of(testFile, null, StandardCharsets.UTF_8, + StandardCharsets.UTF_8.name(), StandardCharsets.UTF_8) + ); } /* * DataProvider for illegal input test * Writes the data in ISO8859 and reads with UTF8, expects MalformedInputException */ - @DataProvider(name = "illegalInput") - public Object[][] getParameters() { - return new Object[][]{ - {testIllegalInput, StandardCharsets.ISO_8859_1.name(), null, StandardCharsets.UTF_8.name(), null}, - {testIllegalInput, StandardCharsets.ISO_8859_1.name(), null, null, StandardCharsets.UTF_8}, - {testIllegalInput, null, StandardCharsets.ISO_8859_1, StandardCharsets.UTF_8.name(), null}, - {testIllegalInput, null, StandardCharsets.ISO_8859_1, null, StandardCharsets.UTF_8}, - }; + public static Stream illegalInput() { + return Stream.of + (Arguments.of(testIllegalInput, StandardCharsets.ISO_8859_1.name(), null, StandardCharsets.UTF_8.name(), null), + Arguments.of(testIllegalInput, StandardCharsets.ISO_8859_1.name(), null, null, StandardCharsets.UTF_8), + Arguments.of(testIllegalInput, null, StandardCharsets.ISO_8859_1, StandardCharsets.UTF_8.name(), null), + Arguments.of(testIllegalInput, null, StandardCharsets.ISO_8859_1, null, StandardCharsets.UTF_8) + ); } /* * DataProvider for illegal output test * Attemps to write some malformed chars, expects MalformedInputException */ - @DataProvider(name = "illegalOutput") - public Object[][] getWriteParameters() { - return new Object[][]{ - {testIllegalOutput, StandardCharsets.UTF_8.name(), null}, - {testIllegalOutput, null, StandardCharsets.UTF_8} - }; + public static Stream illegalOutput() { + return Stream.of + (Arguments.of(testIllegalOutput, StandardCharsets.UTF_8.name(), null), + Arguments.of(testIllegalOutput, null, StandardCharsets.UTF_8) + ); } /** @@ -140,7 +142,8 @@ public class EncodingTest { * @param charsetReader the charset for creating the reader * @throws Exception */ - @Test(dataProvider = "writeAndRead") + @ParameterizedTest + @MethodSource("writeAndRead") public void testWriteAndRead(String file, String csnWriter, Charset charsetWriter, String csnReader, Charset charsetReader) throws Exception { writeToFile(data, file, csnWriter, charsetWriter); @@ -148,7 +151,7 @@ public class EncodingTest { String result1 = readFileToString(file, csnReader, null); String result2 = readFileToString(file, null, charsetReader); - Assert.assertEquals(result1, result2); + assertEquals(result1, result2); } /** @@ -162,11 +165,14 @@ public class EncodingTest { * @param charsetReader the charset for creating the reader * @throws Exception */ - @Test(dataProvider = "illegalInput", expectedExceptions = MalformedInputException.class) + @ParameterizedTest + @MethodSource( "illegalInput") void testMalformedInput(String file, String csnWriter, Charset charsetWriter, - String csnReader, Charset charsetReader) throws Exception { + String csnReader, Charset charsetReader) + throws Exception { writeToFile(data, file, csnWriter, charsetWriter); - readFileToString(file, csnReader, charsetReader); + assertThrows(MalformedInputException.class, + () -> readFileToString(file, csnReader, charsetReader)); } /** @@ -178,23 +184,22 @@ public class EncodingTest { * @param charset the charset * @throws Exception */ - @Test(dataProvider = "illegalOutput", expectedExceptions = MalformedInputException.class) + @ParameterizedTest + @MethodSource("illegalOutput") public void testMalformedOutput(String fileName, String csn, Charset charset) - throws Exception { + throws Exception { try (FileOutputStream fos = new FileOutputStream(fileName); - WritableByteChannel wbc = (WritableByteChannel) fos.getChannel();) { - Writer writer; - if (csn != null) { - writer = Channels.newWriter(wbc, csn); - } else { - writer = Channels.newWriter(wbc, charset); - } - - for (int i = 0; i < ITERATIONS; i++) { - writer.write(illChars); - } - writer.flush(); - writer.close(); + WritableByteChannel wbc = (WritableByteChannel) fos.getChannel();) { + Charset cs = (csn != null) ? Charset.forName(csn) : charset; + Writer writer = Channels.newWriter(wbc, cs); + assertThrows(MalformedInputException.class, () -> { + try (writer) { + for (int i = 0; i < ITERATIONS; i++) { + writer.write(illChars); + } + writer.flush(); + } + }); } } diff --git a/test/jdk/java/nio/channels/Channels/ReadXBytes.java b/test/jdk/java/nio/channels/Channels/ReadXBytes.java index 1ea500f355d..4b296bb021e 100644 --- a/test/jdk/java/nio/channels/Channels/ReadXBytes.java +++ b/test/jdk/java/nio/channels/Channels/ReadXBytes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -30,7 +30,7 @@ * @library /test/lib * @build jdk.test.lib.RandomFactory * @modules java.base/jdk.internal.util - * @run testng/othervm/timeout=900 -Xmx12G ReadXBytes + * @run junit/othervm/timeout=900 -Xmx12g ReadXBytes * @key randomness */ import java.io.File; @@ -48,20 +48,24 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Random; +import java.util.stream.IntStream; import jdk.internal.util.ArraysSupport; import static java.nio.file.StandardOpenOption.*; import jdk.test.lib.RandomFactory; -import org.testng.Assert; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class ReadXBytes { @@ -193,7 +197,7 @@ public class ReadXBytes { (length, cis) -> { byte[] bytes = cis.readAllBytes(); assertNotNull(bytes); - assertEquals(bytes.length, 0L); + assertEquals(0, bytes.length); } ); } @@ -206,7 +210,7 @@ public class ReadXBytes { cis.skipNBytes(length); byte[] bytes = cis.readAllBytes(); assertNotNull(bytes); - assertEquals(bytes.length, 0); + assertEquals(0, bytes.length); } ); } @@ -218,9 +222,9 @@ public class ReadXBytes { (length, cis, fis) -> { byte[] cisBytes = cis.readAllBytes(); assertNotNull(cisBytes); - assertEquals(cisBytes.length, (long)length); + assertEquals(length, cisBytes.length); byte[] fisBytes = fis.readAllBytes(); - assertEquals(cisBytes, fisBytes); + assertArrayEquals(fisBytes, cisBytes); } ); } @@ -236,20 +240,19 @@ public class ReadXBytes { ); } - // Provides an array of lengths - @DataProvider - public Object[][] lengthProvider() throws IOException { - return new Object[][] { - {1 + RAND.nextInt(1)}, - {1 + RAND.nextInt(Byte.MAX_VALUE)}, - {1 + RAND.nextInt(Short.MAX_VALUE)}, - {1 + RAND.nextInt(1_000_000)}, - {1 + RAND.nextInt(BIG_LENGTH)} - }; + // Provides a stream of lengths + public static IntStream fileLengths() throws IOException { + return IntStream.of + (1 + RAND.nextInt(1), + 1 + RAND.nextInt(Byte.MAX_VALUE), + 1 + RAND.nextInt(Short.MAX_VALUE), + 1 + RAND.nextInt(1_000_000), + 1 + RAND.nextInt(BIG_LENGTH)); } // Verifies readAllBytes() accuracy for random lengths and initial positions - @Test(dataProvider = "lengthProvider") + @ParameterizedTest + @MethodSource("fileLengths") public void readAllBytes(int len) throws IOException { dataTest(len, (length) -> createFileWithRandomContent(length), (length, cis, fis) -> { @@ -257,10 +260,10 @@ public class ReadXBytes { cis.skipNBytes(position); byte[] cisBytes = cis.readAllBytes(); assertNotNull(cisBytes); - assertEquals(cisBytes.length, length - position); + assertEquals(length - position, cisBytes.length); fis.skipNBytes(position); byte[] fisBytes = fis.readAllBytes(); - assertEquals(cisBytes, fisBytes); + assertArrayEquals(fisBytes, cisBytes); } ); } @@ -285,7 +288,7 @@ public class ReadXBytes { (length, cis) -> { byte[] bytes = cis.readNBytes(1); assertNotNull(bytes); - assertEquals(bytes.length, 0); + assertEquals(0, bytes.length); } ); } @@ -298,7 +301,7 @@ public class ReadXBytes { cis.skipNBytes(length); byte[] bytes = cis.readNBytes(1); assertNotNull(bytes); - assertEquals(bytes.length, 0); + assertEquals(0, bytes.length); } ); } @@ -310,9 +313,9 @@ public class ReadXBytes { (length, cis, fis) -> { byte[] cisBytes = cis.readNBytes(BIG_LENGTH); assertNotNull(cisBytes); - assertEquals(cisBytes.length, (long)length); + assertEquals(length, cisBytes.length); byte[] fisBytes = fis.readNBytes(BIG_LENGTH); - assertEquals(cisBytes, fisBytes); + assertArrayEquals(fisBytes, cisBytes); } ); } @@ -327,16 +330,17 @@ public class ReadXBytes { cis.skipNBytes(BIG_LENGTH); byte[] cisBytes = cis.readNBytes(n); assertNotNull(cisBytes); - assertEquals(cisBytes.length, n); + assertEquals(n, cisBytes.length); fis.skipNBytes(BIG_LENGTH); byte[] fisBytes = fis.readNBytes(n); - assertEquals(cisBytes, fisBytes); + assertArrayEquals(fisBytes, cisBytes); } ); } // Verifies readNBytes() accuracy for random lengths and initial positions - @Test(dataProvider = "lengthProvider") + @ParameterizedTest + @MethodSource("fileLengths") public void readNBytes(int len) throws IOException { dataTest(len, (length) -> createFileWithRandomContent(length), (length, cis, fis) -> { @@ -346,10 +350,10 @@ public class ReadXBytes { cis.skipNBytes(position); byte[] cisBytes = cis.readNBytes(n); assertNotNull(cisBytes); - assertEquals(cisBytes.length, n); + assertEquals(n, cisBytes.length); fis.skipNBytes(position); byte[] fisBytes = fis.readNBytes(n); - assertEquals(cisBytes, fisBytes); + assertArrayEquals(fisBytes, cisBytes); } ); } diff --git a/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java b/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java index 519de1e725f..0eab36dc3ee 100644 --- a/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java +++ b/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -25,7 +25,7 @@ * @bug 8279339 8371718 * @summary Exercise InputStream/OutputStream returned by Channels.newXXXStream * when channel is a SocketChannel - * @run testng SocketChannelStreams + * @run junit SocketChannelStreams */ import java.io.Closeable; @@ -48,101 +48,112 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.testng.annotations.*; -import static org.testng.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; -@Test public class SocketChannelStreams { // Maximum size of internal temporary buffer private static final int MAX_BUFFER_SIZE = 128*1024; - private ScheduledExecutorService executor; + private static ScheduledExecutorService executor; - @BeforeClass() - public void init() { + @BeforeAll() + public static void init() { executor = Executors.newSingleThreadScheduledExecutor(); } - @AfterClass - public void finish() { + @AfterAll + public static void finish() { executor.shutdown(); } /** * Test read when bytes are available. */ + @Test public void testRead1() throws Exception { withConnection((sc, peer) -> { write(peer, 99); int n = Channels.newInputStream(sc).read(); - assertEquals(n, 99); + assertEquals(99, n); }); } /** * Test read blocking before bytes are available. */ + @Test public void testRead2() throws Exception { withConnection((sc, peer) -> { scheduleWrite(peer, 99, 1000); int n = Channels.newInputStream(sc).read(); - assertEquals(n, 99); + assertEquals(99, n); }); } /** * Test read after peer has closed connection. */ + @Test public void testRead3() throws Exception { withConnection((sc, peer) -> { peer.close(); int n = Channels.newInputStream(sc).read(); - assertEquals(n, -1); + assertEquals(-1, n); }); } /** * Test read blocking before peer closes connection. */ + @Test public void testRead4() throws Exception { withConnection((sc, peer) -> { scheduleClose(peer, 1000); int n = Channels.newInputStream(sc).read(); - assertEquals(n, -1); + assertEquals(-1, n); }); } /** * Test async close of channel when thread blocked in read. */ + @Test public void testRead5() throws Exception { withConnection((sc, peer) -> { scheduleClose(sc, 2000); InputStream in = Channels.newInputStream(sc); - expectThrows(IOException.class, () -> in.read()); + assertThrows(IOException.class, () -> in.read()); }); } /** * Test async close of input stream, when thread blocked in read. */ + @Test public void testRead6() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); scheduleClose(in, 2000); - expectThrows(IOException.class, () -> in.read()); + assertThrows(IOException.class, () -> in.read()); }); } /** * Test interrupted status set before read. */ + @Test public void testRead7() throws Exception { withConnection((sc, peer) -> { Thread.currentThread().interrupt(); try { InputStream in = Channels.newInputStream(sc); - expectThrows(IOException.class, () -> in.read()); + assertThrows(IOException.class, () -> in.read()); } finally { Thread.interrupted(); // clear interrupt } @@ -153,12 +164,13 @@ public class SocketChannelStreams { /** * Test interrupt of thread blocked in read. */ + @Test public void testRead8() throws Exception { withConnection((sc, peer) -> { Future interrupter = scheduleInterrupt(Thread.currentThread(), 2000); try { InputStream in = Channels.newInputStream(sc); - expectThrows(IOException.class, () -> in.read()); + assertThrows(IOException.class, () -> in.read()); } finally { interrupter.cancel(true); Thread.interrupted(); // clear interrupt @@ -170,35 +182,38 @@ public class SocketChannelStreams { /** * Test that read is untimed when SO_TIMEOUT is set on the Socket adaptor. */ + @Test public void testRead9() throws Exception { withConnection((sc, peer) -> { sc.socket().setSoTimeout(100); scheduleWrite(peer, 99, 2000); // read should block until bytes are available int b = Channels.newInputStream(sc).read(); - assertTrue(b == 99); + assertEquals(99, b); }); } /** * Test write. */ + @Test public void testWrite1() throws Exception { withConnection((sc, peer) -> { OutputStream out = Channels.newOutputStream(sc); out.write(99); int n = read(peer); - assertEquals(n, 99); + assertEquals(99, n); }); } /** * Test async close of channel when thread blocked in write. */ + @Test public void testWrite2() throws Exception { withConnection((sc, peer) -> { scheduleClose(sc, 2000); - expectThrows(IOException.class, () -> { + assertThrows(IOException.class, () -> { OutputStream out = Channels.newOutputStream(sc); byte[] data = new byte[64*1000]; while (true) { @@ -211,11 +226,12 @@ public class SocketChannelStreams { /** * Test async close of output stream when thread blocked in write. */ + @Test public void testWrite3() throws Exception { withConnection((sc, peer) -> { OutputStream out = Channels.newOutputStream(sc); scheduleClose(out, 2000); - expectThrows(IOException.class, () -> { + assertThrows(IOException.class, () -> { byte[] data = new byte[64*1000]; while (true) { out.write(data); @@ -227,12 +243,13 @@ public class SocketChannelStreams { /** * Test interrupted status set before write. */ + @Test public void testWrite4() throws Exception { withConnection((sc, peer) -> { Thread.currentThread().interrupt(); try { OutputStream out = Channels.newOutputStream(sc); - expectThrows(IOException.class, () -> out.write(99)); + assertThrows(IOException.class, () -> out.write(99)); } finally { Thread.interrupted(); // clear interrupt } @@ -243,11 +260,12 @@ public class SocketChannelStreams { /** * Test interrupt of thread blocked in write. */ + @Test public void testWrite5() throws Exception { withConnection((sc, peer) -> { Future interrupter = scheduleInterrupt(Thread.currentThread(), 2000); try { - expectThrows(IOException.class, () -> { + assertThrows(IOException.class, () -> { OutputStream out = Channels.newOutputStream(sc); byte[] data = new byte[64*1000]; while (true) { @@ -266,6 +284,7 @@ public class SocketChannelStreams { * Test read when another thread is blocked in write. The read should * complete immediately. */ + @Test public void testConcurrentReadWrite1() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); @@ -283,7 +302,7 @@ public class SocketChannelStreams { // test read, should not be blocked by writer thread write(peer, 99); int n = in.read(); - assertEquals(n, 99); + assertEquals(99, n); }); } @@ -291,6 +310,7 @@ public class SocketChannelStreams { * Test read when another thread is blocked in write. The read should * block until bytes are available. */ + @Test public void testConcurrentReadWrite2() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); @@ -308,13 +328,14 @@ public class SocketChannelStreams { // test read, should not be blocked by writer thread scheduleWrite(peer, 99, 500); int n = in.read(); - assertEquals(n, 99); + assertEquals(99, n); }); } /** * Test writing when another thread is blocked in read. */ + @Test public void testConcurrentReadWrite3() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); @@ -329,74 +350,79 @@ public class SocketChannelStreams { // test write, should not be blocked by reader thread out.write(99); int n = read(peer); - assertEquals(n, 99); + assertEquals(99, n); }); } /** * Test read/write when channel configured non-blocking. */ + @Test public void testIllegalBlockingMode() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); OutputStream out = Channels.newOutputStream(sc); sc.configureBlocking(false); - expectThrows(IllegalBlockingModeException.class, () -> in.read()); - expectThrows(IllegalBlockingModeException.class, () -> out.write(99)); + assertThrows(IllegalBlockingModeException.class, () -> in.read()); + assertThrows(IllegalBlockingModeException.class, () -> out.write(99)); }); } /** * Test NullPointerException. */ + @Test public void testNullPointerException() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); OutputStream out = Channels.newOutputStream(sc); - expectThrows(NullPointerException.class, () -> in.read(null)); - expectThrows(NullPointerException.class, () -> in.read(null, 0, 0)); + assertThrows(NullPointerException.class, () -> in.read(null)); + assertThrows(NullPointerException.class, () -> in.read(null, 0, 0)); - expectThrows(NullPointerException.class, () -> out.write(null)); - expectThrows(NullPointerException.class, () -> out.write(null, 0, 0)); + assertThrows(NullPointerException.class, () -> out.write(null)); + assertThrows(NullPointerException.class, () -> out.write(null, 0, 0)); }); } /** * Test IndexOutOfBoundsException. */ + @Test public void testIndexOutOfBoundsException() throws Exception { withConnection((sc, peer) -> { InputStream in = Channels.newInputStream(sc); OutputStream out = Channels.newOutputStream(sc); byte[] ba = new byte[100]; - expectThrows(IndexOutOfBoundsException.class, () -> in.read(ba, -1, 1)); - expectThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 0, -1)); - expectThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 0, 1000)); - expectThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 1, 100)); + assertThrows(IndexOutOfBoundsException.class, () -> in.read(ba, -1, 1)); + assertThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 0, -1)); + assertThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 0, 1000)); + assertThrows(IndexOutOfBoundsException.class, () -> in.read(ba, 1, 100)); - expectThrows(IndexOutOfBoundsException.class, () -> out.write(ba, -1, 1)); - expectThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 0, -1)); - expectThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 0, 1000)); - expectThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 1, 100)); + assertThrows(IndexOutOfBoundsException.class, () -> out.write(ba, -1, 1)); + assertThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 0, -1)); + assertThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 0, 1000)); + assertThrows(IndexOutOfBoundsException.class, () -> out.write(ba, 1, 100)); }); } /** * Test that internal buffers have at most MAX_BUFFER_SIZE bytes remaining. */ + @Test public void testReadLimit() throws IOException { InputStream in = Channels.newInputStream(new TestChannel()); byte[] b = new byte[3*MAX_BUFFER_SIZE]; int n = in.read(b, 0, b.length); - assertEquals(n, MAX_BUFFER_SIZE); + assertEquals(MAX_BUFFER_SIZE, n); } /** * Test that internal buffers have at most MAX_BUFFER_SIZE bytes remaining. */ + @Test public void testWriteLimit() throws IOException { OutputStream out = Channels.newOutputStream(new TestChannel()); byte[] b = new byte[3*MAX_BUFFER_SIZE]; diff --git a/test/jdk/java/nio/channels/Channels/TransferTo.java b/test/jdk/java/nio/channels/Channels/TransferTo.java index b02bf7b3649..a9626978dbe 100644 --- a/test/jdk/java/nio/channels/Channels/TransferTo.java +++ b/test/jdk/java/nio/channels/Channels/TransferTo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -37,17 +37,20 @@ import java.nio.file.Path; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.stream.Stream; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import static org.testng.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertThrows; /* * @test * @library /test/lib * @build jdk.test.lib.RandomFactory - * @run testng/othervm/timeout=720 TransferTo + * @run junit/othervm/timeout=720 TransferTo * @bug 8265891 * @summary Tests whether sun.nio.ChannelInputStream.transferTo conforms to the * InputStream.transferTo specification @@ -59,41 +62,37 @@ public class TransferTo extends TransferToBase { * Provides test scenarios, i.e., combinations of input and output streams * to be tested. */ - @DataProvider - public static Object[][] streamCombinations() { - return new Object[][] { - // tests FileChannel.transferTo(FileChannel) optimized case - {fileChannelInput(), fileChannelOutput()}, + public static Stream streamCombinations() { + return Stream.of + (// tests FileChannel.transferTo(FileChannel) optimized case + Arguments.of(fileChannelInput(), fileChannelOutput()), - // tests FileChannel.transferTo(SelectableChannelOutput) - // optimized case - {fileChannelInput(), selectableChannelOutput()}, + // tests FileChannel.transferTo(SelectableChannelOutput) + // optimized case + Arguments.of(fileChannelInput(), selectableChannelOutput()), - // tests FileChannel.transferTo(WritableByteChannelOutput) - // optimized case - {fileChannelInput(), writableByteChannelOutput()}, + // tests FileChannel.transferTo(WritableByteChannelOutput) + // optimized case + Arguments.of(fileChannelInput(), writableByteChannelOutput()), - // tests InputStream.transferTo(OutputStream) default case - {readableByteChannelInput(), defaultOutput()} - }; + // tests InputStream.transferTo(OutputStream) default case + Arguments.of(readableByteChannelInput(), defaultOutput())); } /* * Input streams to be tested. */ - @DataProvider - public static Object[][] inputStreamProviders() { - return new Object[][] { - {fileChannelInput()}, - {readableByteChannelInput()} - }; + public static Stream inputStreamProviders() { + return Stream.of(Arguments.of(fileChannelInput()), + Arguments.of(readableByteChannelInput())); } /* * Testing API compliance: input stream must throw NullPointerException * when parameter "out" is null. */ - @Test(dataProvider = "inputStreamProviders") + @ParameterizedTest + @MethodSource("inputStreamProviders") public void testNullPointerException(InputStreamProvider inputStreamProvider) { assertNullPointerException(inputStreamProvider); } @@ -102,7 +101,8 @@ public class TransferTo extends TransferToBase { * Testing API compliance: complete content of input stream must be * transferred to output stream. */ - @Test(dataProvider = "streamCombinations") + @ParameterizedTest + @MethodSource("streamCombinations") public void testStreamContents(InputStreamProvider inputStreamProvider, OutputStreamProvider outputStreamProvider) throws Exception { assertStreamContents(inputStreamProvider, outputStreamProvider); diff --git a/test/jdk/java/nio/channels/Channels/TransferTo2.java b/test/jdk/java/nio/channels/Channels/TransferTo2.java index bd7e13c3a9b..0e02803c8d3 100644 --- a/test/jdk/java/nio/channels/Channels/TransferTo2.java +++ b/test/jdk/java/nio/channels/Channels/TransferTo2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -25,9 +25,11 @@ import java.io.OutputStream; import java.io.IOException; import java.nio.channels.Channels; import java.nio.channels.Pipe; +import java.util.stream.Stream; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static java.lang.String.format; @@ -35,7 +37,7 @@ import static java.lang.String.format; * @test * @library /test/lib * @build jdk.test.lib.RandomFactory - * @run testng/othervm/timeout=180 TransferTo2 + * @run junit/othervm/timeout=180 TransferTo2 * @bug 8278268 * @summary Tests FileChannel.transferFrom() optimized case * @key randomness @@ -46,33 +48,29 @@ public class TransferTo2 extends TransferToBase { * Provides test scenarios, i.e., combinations of input and output streams * to be tested. */ - @DataProvider - public static Object[][] streamCombinations() { - return new Object[][] { - // tests FileChannel.transferFrom(SelectableChannelOutput) optimized case - {selectableChannelInput(), fileChannelOutput()}, + public static Stream streamCombinations() { + return Stream.of + (// tests FileChannel.transferFrom(SelectableChannelOutput) optimized case + Arguments.of(selectableChannelInput(), fileChannelOutput()), - // tests FileChannel.transferFrom(ReadableByteChannelInput) optimized case - {readableByteChannelInput(), fileChannelOutput()}, - }; + // tests FileChannel.transferFrom(ReadableByteChannelInput) optimized case + Arguments.of(readableByteChannelInput(), fileChannelOutput())); } /* * Input streams to be tested. */ - @DataProvider - public static Object[][] inputStreamProviders() { - return new Object[][] { - {selectableChannelInput()}, - {readableByteChannelInput()} - }; + public static Stream inputStreamProviders() { + return Stream.of(Arguments.of(selectableChannelInput()), + Arguments.of(readableByteChannelInput())); } /* * Testing API compliance: input stream must throw NullPointerException * when parameter "out" is null. */ - @Test(dataProvider = "inputStreamProviders") + @ParameterizedTest + @MethodSource("inputStreamProviders") public void testNullPointerException(InputStreamProvider inputStreamProvider) { assertNullPointerException(inputStreamProvider); } @@ -81,7 +79,8 @@ public class TransferTo2 extends TransferToBase { * Testing API compliance: complete content of input stream must be * transferred to output stream. */ - @Test(dataProvider = "streamCombinations") + @ParameterizedTest + @MethodSource("streamCombinations") public void testStreamContents(InputStreamProvider inputStreamProvider, OutputStreamProvider outputStreamProvider) throws Exception { assertStreamContents(inputStreamProvider, outputStreamProvider); diff --git a/test/jdk/java/nio/channels/Channels/TransferToBase.java b/test/jdk/java/nio/channels/Channels/TransferToBase.java index 53ca283ae78..482fb1f262c 100644 --- a/test/jdk/java/nio/channels/Channels/TransferToBase.java +++ b/test/jdk/java/nio/channels/Channels/TransferToBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -43,9 +43,9 @@ import jdk.test.lib.RandomFactory; import static java.lang.String.format; import static java.nio.file.StandardOpenOption.*; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertThrows; -import static org.testng.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class TransferToBase { static final int MIN_SIZE = 10_000; @@ -88,7 +88,7 @@ class TransferToBase { long reported = in.transferTo(out); int count = inBytes.length - posIn; - assertEquals(reported, count, format("reported %d bytes but should report %d", reported, count)); + assertEquals(count, reported); byte[] outBytes = recorder.get().get(); assertTrue(Arrays.equals(inBytes, posIn, posIn + count, outBytes, posOut, posOut + count), @@ -238,11 +238,11 @@ class TransferToBase { // compare reported transferred bytes, must be 3 GB // less the value of the initial position - assertEquals(count, BYTES_WRITTEN - initPos); + assertEquals(BYTES_WRITTEN - initPos, count); } // compare content of both files, failing if different - assertEquals(Files.mismatch(sourceFile, targetFile), -1); + assertEquals(-1, Files.mismatch(sourceFile, targetFile)); } finally { Files.delete(targetFile); diff --git a/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferFrom.java b/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferFrom.java index f57d6cca963..1dc17f6f5fc 100644 --- a/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferFrom.java +++ b/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferFrom.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -30,13 +30,13 @@ import java.nio.file.Files; import static java.nio.file.StandardOpenOption.*; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; /* * @test * @library /test/lib * @build jdk.test.lib.RandomFactory - * @run testng/othervm/timeout=720 TransferTo_2GB_transferFrom + * @run junit/othervm/timeout=720 TransferTo_2GB_transferFrom * @bug 8278268 * @summary Tests if ChannelInputStream.transferFrom correctly * transfers 2GB+ using FileChannel.transferFrom(ReadableByteChannel). diff --git a/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferTo.java b/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferTo.java index fdd3bddb126..174b89bd988 100644 --- a/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferTo.java +++ b/test/jdk/java/nio/channels/Channels/TransferTo_2GB_transferTo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -29,13 +29,13 @@ import java.nio.file.Files; import static java.nio.file.StandardOpenOption.*; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; /* * @test * @library /test/lib * @build jdk.test.lib.RandomFactory - * @run testng/othervm/timeout=720 TransferTo_2GB_transferTo + * @run junit/othervm/timeout=720 TransferTo_2GB_transferTo * @bug 8265891 * @summary Tests if ChannelInputStream.transferTo correctly * transfers 2GB+ using FileChannel.transferTo(WritableByteChannel). diff --git a/test/jdk/java/nio/channels/FileChannel/MapToMemorySegmentTest.java b/test/jdk/java/nio/channels/FileChannel/MapToMemorySegmentTest.java index de89e318fc3..bd2097176ca 100644 --- a/test/jdk/java/nio/channels/FileChannel/MapToMemorySegmentTest.java +++ b/test/jdk/java/nio/channels/FileChannel/MapToMemorySegmentTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -24,7 +24,7 @@ /* @test * @bug 8281412 * @summary Test FileChannel::map to MemorySegment with custom file channel - * @run testng/othervm MapToMemorySegmentTest + * @run junit/othervm MapToMemorySegmentTest */ import java.io.File; @@ -39,10 +39,10 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import org.testng.annotations.Test; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; public class MapToMemorySegmentTest { @@ -58,13 +58,14 @@ public class MapToMemorySegmentTest { } } - @Test(expectedExceptions = UnsupportedOperationException.class) + @Test public void testCustomFileChannel() throws IOException { var arena = Arena.ofConfined(); var fc = FileChannel.open(tempPath, StandardOpenOption.WRITE, StandardOpenOption.READ); var fileChannel = new CustomFileChannel(fc); - try (arena; fileChannel){ - fileChannel.map(FileChannel.MapMode.READ_WRITE, 1L, 10L, arena); + try (arena; fileChannel) { + assertThrows(UnsupportedOperationException.class, + () -> fileChannel.map(FileChannel.MapMode.READ_WRITE, 1L, 10L, arena)); } } diff --git a/test/jdk/java/nio/channels/FileChannel/Transfer.java b/test/jdk/java/nio/channels/FileChannel/Transfer.java index 51adba60b06..1afc38a61bd 100644 --- a/test/jdk/java/nio/channels/FileChannel/Transfer.java +++ b/test/jdk/java/nio/channels/FileChannel/Transfer.java @@ -27,7 +27,7 @@ * @library .. * @library /test/lib * @build jdk.test.lib.RandomFactory - * @run testng/timeout=300 Transfer + * @run junit/timeout=300 Transfer * @key randomness */ @@ -54,8 +54,13 @@ import java.util.concurrent.TimeUnit; import jdk.test.lib.RandomFactory; -import org.testng.Assert; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class Transfer { @@ -83,25 +88,22 @@ public class Transfer { long oldSourcePosition = sourceChannel.position(); long bytesWritten = sinkChannel.transferFrom(sourceChannel, 0, 10); - if (bytesWritten != 10) - throw new RuntimeException("Transfer failed"); + assertEquals(10, bytesWritten, "Transfer failed"); - if (sourceChannel.position() == oldSourcePosition) - throw new RuntimeException("Source position didn't change"); + assertNotEquals(oldSourcePosition, sourceChannel.position(), + "Source position didn't change"); - if (sinkChannel.position() != oldSinkPosition) - throw new RuntimeException("Sink position changed"); + assertEquals(oldSinkPosition, sinkChannel.position(), + "Sink position changed"); - if (sinkChannel.size() != 10) - throw new RuntimeException("Unexpected sink size"); + assertEquals(10, sinkChannel.size(), "Unexpected sink size"); bytesWritten = sinkChannel.transferFrom(sourceChannel, 1000, 10); - if (bytesWritten > 10) - throw new RuntimeException("Wrote too many bytes"); + assertFalse(bytesWritten > 10, "Wrote too many bytes"); - if (sinkChannel.size() != 1000 + bytesWritten) - throw new RuntimeException("Unexpected sink size"); + assertEquals(1000 + bytesWritten, sinkChannel.size(), + "Unexpected sink size"); sourceChannel.close(); sinkChannel.close(); @@ -130,8 +132,7 @@ public class Transfer { int totalWritten = 0; while (totalWritten < size + 10) { int written = sink.write(outgoingdata); - if (written < 0) - throw new Exception("Write failed"); + assertTrue(written >= 0, "Write failed"); totalWritten += written; } @@ -143,14 +144,11 @@ public class Transfer { long bytesWritten = fc.transferFrom(source, 0, size); fc.force(true); - if (bytesWritten != size) - throw new RuntimeException("Transfer failed"); + assertEquals(size, bytesWritten, "Transfer failed"); - if (fc.position() != oldPosition) - throw new RuntimeException("Position changed"); + assertEquals(oldPosition, fc.position(), "Position changed"); - if (fc.size() != size) - throw new RuntimeException("Unexpected sink size "+ fc.size()); + assertEquals(size, fc.size(), "Unexpected sink size "+ fc.size()); fc.close(); sink.close(); @@ -168,7 +166,7 @@ public class Transfer { CharSequence csq = "Reality is greater than the sum of its parts."; Files.writeString(source.toPath(), csq); final long length = csq.length(); - Assert.assertEquals(source.length(), length); + assertEquals(length, source.length()); File target = File.createTempFile("before", "after"); target.deleteOnExit(); @@ -183,7 +181,7 @@ public class Transfer { long n = chSource.transferTo(length, 16385, chTarget); // At the end of the input so no bytes should be transferred - Assert.assertEquals(n, 0); + assertEquals(0, n); } } @@ -251,8 +249,7 @@ public class Transfer { fc1.transferTo(0, srcData.length + 1, fc2); - if (fc2.size() > 4) - throw new Exception("xferTest03 failed"); + assertFalse(fc2.size() > 4, "xferTest03 failed"); fc1.close(); fc2.close(); @@ -273,9 +270,7 @@ public class Transfer { while ((c = r.read()) != -1) sb.append((char)c); String contents = sb.toString(); - if (! contents.equals(expected)) - throw new Exception("expected: " + expected - + ", got: " + contents); + assertEquals(expected, contents); r.close(); } @@ -301,8 +296,7 @@ public class Transfer { new RandomAccessFile(sink, "rw").getChannel(); long n = sinkChannel.transferFrom(sourceChannel, 0L, sourceChannel.size()); // overflow - if (n != remaining) - throw new Exception("n == " + n + ", remaining == " + remaining); + assertEquals(remaining, n); sinkChannel.close(); sourceChannel.close(); @@ -363,9 +357,8 @@ public class Transfer { FileChannel fc1 = new FileOutputStream(source).getChannel(); FileChannel fc2 = new RandomAccessFile(target, "rw").getChannel(); try { - fc2.transferFrom(fc1, 0L, 0); - throw new RuntimeException("NonReadableChannelException expected"); - } catch (NonReadableChannelException expected) { + assertThrows(NonReadableChannelException.class, + () -> fc2.transferFrom(fc1, 0L, 0)); } finally { fc1.close(); fc2.close(); diff --git a/test/jdk/java/nio/channels/FileChannel/Transfer4GBFile.java b/test/jdk/java/nio/channels/FileChannel/Transfer4GBFile.java index b8c026c983c..0766f4ffb45 100644 --- a/test/jdk/java/nio/channels/FileChannel/Transfer4GBFile.java +++ b/test/jdk/java/nio/channels/FileChannel/Transfer4GBFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,7 @@ * @bug 4638365 * @summary Test FileChannel.transferFrom and transferTo for 4GB files * @build FileChannelUtils - * @run testng/timeout=300 Transfer4GBFile + * @run junit/timeout=300 Transfer4GBFile */ import java.io.BufferedWriter; @@ -38,10 +38,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.concurrent.TimeUnit; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; import static java.nio.file.StandardOpenOption.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class Transfer4GBFile { private static PrintStream err = System.err; @@ -71,10 +73,8 @@ public class Transfer4GBFile { long bytesWritten = sourceChannel.transferTo(testSize - 40, 10, sinkChannel); - if (bytesWritten != 10) { - throw new RuntimeException("Transfer test 4 failed " + - bytesWritten); - } + assertEquals(10, bytesWritten, + "Transfer test 4 failed " + bytesWritten); } Files.delete(source); @@ -112,10 +112,8 @@ public class Transfer4GBFile { FileChannel sinkChannel = FileChannel.open(sink, WRITE)) { long bytesWritten = sinkChannel.transferFrom(sourceChannel, testSize - 40, 10); - if (bytesWritten != 10) { - throw new RuntimeException("Transfer test 5 failed " + - bytesWritten); - } + assertEquals(10, bytesWritten, + "Transfer test 5 failed " + bytesWritten); } Files.delete(source); diff --git a/test/jdk/java/nio/channels/FileChannel/TransferTo6GBFile.java b/test/jdk/java/nio/channels/FileChannel/TransferTo6GBFile.java index 9ca6df0c870..791a0718a75 100644 --- a/test/jdk/java/nio/channels/FileChannel/TransferTo6GBFile.java +++ b/test/jdk/java/nio/channels/FileChannel/TransferTo6GBFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,7 @@ * @bug 6253145 * @summary Test FileChannel.transferTo with file positions up to 8GB * @build FileChannelUtils - * @run testng/timeout=300 TransferTo6GBFile + * @run junit/timeout=300 TransferTo6GBFile */ import java.io.IOException; @@ -40,10 +40,14 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.concurrent.TimeUnit; -import org.testng.annotations.Test; +import org.junit.jupiter.api.Test; import static java.nio.file.StandardOpenOption.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class TransferTo6GBFile { private static PrintStream err = System.err; @@ -126,16 +130,14 @@ public class TransferTo6GBFile { long nread = 0; while (nread < count) { int n = source.read(readbuf); - if (n < 0) - throw new RuntimeException("Premature EOF!"); + assertTrue(n >= 0, "Premature EOF!"); nread += n; } // check reply from echo server readbuf.flip(); sendbuf.flip(); - if (!readbuf.equals(sendbuf)) - throw new RuntimeException("Echoed bytes do not match!"); + assertEquals(sendbuf, readbuf, "Echoed bytes do not match!"); readbuf.clear(); sendbuf.clear(); } diff --git a/test/jdk/java/nio/channels/FileLock/Overlaps.java b/test/jdk/java/nio/channels/FileLock/Overlaps.java index 64293e2996d..3e3b92ac67e 100644 --- a/test/jdk/java/nio/channels/FileLock/Overlaps.java +++ b/test/jdk/java/nio/channels/FileLock/Overlaps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 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 @@ -25,7 +25,7 @@ * @test * @bug 5041655 * @summary Verify FileLock.overlaps - * @run testng Overlaps + * @run junit Overlaps */ import java.io.IOException; import java.nio.ByteBuffer; @@ -33,15 +33,18 @@ import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Stream; import static java.lang.Boolean.*; import static java.nio.file.StandardOpenOption.*; -import static org.testng.Assert.assertEquals; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class Overlaps { private static final long POS = 27; @@ -49,47 +52,46 @@ public class Overlaps { private static FileChannel fc; - @BeforeClass - public void before() throws IOException { + @BeforeAll + public static void before() throws IOException { Path path = Files.createTempFile(Path.of("."), "foo", ".bar"); fc = FileChannel.open(path, CREATE, WRITE, DELETE_ON_CLOSE); fc.position(POS); fc.write(ByteBuffer.wrap(new byte[(int)SIZE])); } - @AfterClass - public void after() throws IOException { + @AfterAll + public static void after() throws IOException { fc.close(); } - @DataProvider - public Object[][] ranges() { - return new Object[][] { - {POS, SIZE, -1,-1, FALSE}, - {POS, SIZE, 0, -1, FALSE}, - {POS, SIZE, POS - 1, -1, FALSE}, - {POS, SIZE, POS + SIZE/2, -1, FALSE}, - {POS, SIZE, POS + SIZE, -1, FALSE}, - {POS, SIZE, -1, POS, FALSE}, - {POS, SIZE, -1, POS + SIZE/2, TRUE}, - {POS, SIZE, POS - 2, 1, FALSE}, - {POS, SIZE, POS + 1, 1, TRUE}, - {POS, SIZE, POS + SIZE/2, 0, TRUE}, - {POS, SIZE, Long.MAX_VALUE, 2, FALSE}, - {POS, SIZE, POS + SIZE / 2, Long.MAX_VALUE, TRUE}, - {POS, SIZE, 0, 0, TRUE}, - {Long.MAX_VALUE - SIZE/2, 0, 0, SIZE, FALSE}, - {Long.MAX_VALUE - SIZE/2, 0, Long.MAX_VALUE - SIZE/4, SIZE, TRUE}, - {Long.MAX_VALUE - SIZE/2, 0, Long.MAX_VALUE - SIZE, 0, TRUE}, - {Long.MAX_VALUE - SIZE, 0, Long.MAX_VALUE - SIZE/2, 0, TRUE} - }; + public static Stream ranges() { + return Stream.of( + Arguments.of(POS, SIZE, -1, -1, FALSE), + Arguments.of(POS, SIZE, 0, -1, FALSE), + Arguments.of(POS, SIZE, POS - 1, -1, FALSE), + Arguments.of(POS, SIZE, POS + SIZE/2, -1, FALSE), + Arguments.of(POS, SIZE, POS + SIZE, -1, FALSE), + Arguments.of(POS, SIZE, -1, POS, FALSE), + Arguments.of(POS, SIZE, -1, POS + SIZE/2, TRUE), + Arguments.of(POS, SIZE, POS - 2, 1, FALSE), + Arguments.of(POS, SIZE, POS + 1, 1, TRUE), + Arguments.of(POS, SIZE, POS + SIZE/2, 0, TRUE), + Arguments.of(POS, SIZE, Long.MAX_VALUE, 2, FALSE), + Arguments.of(POS, SIZE, POS + SIZE / 2, Long.MAX_VALUE, TRUE), + Arguments.of(POS, SIZE, 0, 0, TRUE), + Arguments.of(Long.MAX_VALUE - SIZE/2, 0, 0, SIZE, FALSE), + Arguments.of(Long.MAX_VALUE - SIZE/2, 0, Long.MAX_VALUE - SIZE/4, SIZE, TRUE), + Arguments.of(Long.MAX_VALUE - SIZE/2, 0, Long.MAX_VALUE - SIZE, 0, TRUE), + Arguments.of(Long.MAX_VALUE - SIZE, 0, Long.MAX_VALUE - SIZE/2, 0, TRUE)); } - @Test(dataProvider = "ranges") + @ParameterizedTest + @MethodSource("ranges") public void overlaps(long lockPos, long lockSize, long pos, long size, boolean overlaps) throws IOException { try (FileLock lock = fc.lock(lockPos, lockSize, false)) { - assertEquals(lock.overlaps(pos, size), overlaps); + assertEquals(overlaps, lock.overlaps(pos, size)); } } } diff --git a/test/jdk/java/nio/channels/SelectionKey/AtomicUpdates.java b/test/jdk/java/nio/channels/SelectionKey/AtomicUpdates.java index 8e5bee51b71..e609530ff69 100644 --- a/test/jdk/java/nio/channels/SelectionKey/AtomicUpdates.java +++ b/test/jdk/java/nio/channels/SelectionKey/AtomicUpdates.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -23,7 +23,7 @@ /* @test * @bug 6350055 - * @run testng AtomicUpdates + * @run junit AtomicUpdates * @summary Unit test for SelectionKey interestOpsOr and interestOpsAnd */ @@ -37,15 +37,19 @@ import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import org.testng.annotations.Test; + +import org.junit.jupiter.api.Test; import static java.nio.channels.SelectionKey.OP_READ; import static java.nio.channels.SelectionKey.OP_WRITE; import static java.nio.channels.SelectionKey.OP_CONNECT; import static java.nio.channels.SelectionKey.OP_ACCEPT; -import static org.testng.Assert.*; -@Test +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; + public class AtomicUpdates { private SelectionKey keyFor(SocketChannel sc) { @@ -94,74 +98,69 @@ public class AtomicUpdates { } private void test(SelectionKey key) { - assertTrue(key.channel() instanceof SocketChannel); + assertInstanceOf(SocketChannel.class, key.channel()); key.interestOps(0); // 0 -> 0 int previous = key.interestOpsOr(0); - assertTrue(previous == 0); - assertTrue(key.interestOps() == 0); + assertEquals(0, previous); + assertEquals(0, key.interestOps()); // 0 -> OP_CONNECT previous = key.interestOpsOr(OP_CONNECT); - assertTrue(previous == 0); - assertTrue(key.interestOps() == OP_CONNECT); + assertEquals(0, previous); + assertEquals(OP_CONNECT, key.interestOps()); // OP_CONNECT -> OP_CONNECT previous = key.interestOpsOr(0); - assertTrue(previous == OP_CONNECT); - assertTrue(key.interestOps() == OP_CONNECT); + assertEquals(OP_CONNECT, previous); + assertEquals(OP_CONNECT, key.interestOps()); // OP_CONNECT -> OP_CONNECT | OP_READ | OP_WRITE previous = key.interestOpsOr(OP_READ | OP_WRITE); - assertTrue(previous == OP_CONNECT); - assertTrue(key.interestOps() == (OP_CONNECT | OP_READ | OP_WRITE)); + assertEquals(OP_CONNECT, previous); + assertEquals(OP_CONNECT | OP_READ | OP_WRITE, key.interestOps()); // OP_CONNECT | OP_READ | OP_WRITE -> OP_CONNECT previous = key.interestOpsAnd(~(OP_READ | OP_WRITE)); - assertTrue(previous == (OP_CONNECT | OP_READ | OP_WRITE)); - assertTrue(key.interestOps() == OP_CONNECT); + assertEquals(OP_CONNECT | OP_READ | OP_WRITE, previous); + assertEquals(OP_CONNECT, key.interestOps()); // OP_CONNECT -> 0 previous = key.interestOpsAnd(~OP_CONNECT); - assertTrue(previous == OP_CONNECT); - assertTrue(key.interestOps() == 0); + assertEquals(OP_CONNECT, previous); + assertEquals(0, key.interestOps()); // OP_READ | OP_WRITE -> OP_READ | OP_WRITE key.interestOps(OP_READ | OP_WRITE); previous = key.interestOpsAnd(~OP_ACCEPT); - assertTrue(previous == (OP_READ | OP_WRITE)); - assertTrue(key.interestOps() == (OP_READ | OP_WRITE)); + assertEquals(OP_READ | OP_WRITE, previous); + assertEquals(OP_READ | OP_WRITE, key.interestOps()); // OP_READ | OP_WRITE -> 0 previous = key.interestOpsAnd(0); - assertTrue(previous == (OP_READ | OP_WRITE)); - assertTrue(key.interestOps() == 0); + assertEquals(OP_READ | OP_WRITE, previous); + assertEquals(0, key.interestOps()); // 0 -> 0 previous = key.interestOpsAnd(0); - assertTrue(previous == 0); - assertTrue(key.interestOps() == 0); + assertEquals(0, previous); + assertEquals(0, key.interestOps()); - try { - key.interestOpsOr(OP_ACCEPT); - fail("IllegalArgumentException expected"); - } catch (IllegalArgumentException expected) { } + assertThrows(IllegalArgumentException.class, + () -> key.interestOpsOr(OP_ACCEPT)); key.cancel(); - try { - key.interestOpsOr(OP_READ); - fail("CancelledKeyException expected"); - } catch (CancelledKeyException expected) { } - try { - key.interestOpsAnd(~OP_READ); - fail("CancelledKeyException expected"); - } catch (CancelledKeyException expected) { } + assertThrows(CancelledKeyException.class, + () -> key.interestOpsOr(OP_READ)); + assertThrows(CancelledKeyException.class, + () -> key.interestOpsAnd(~OP_READ)); } /** * Test default implementation of interestOpsOr/interestOpsAnd */ + @Test public void testDefaultImplementation() throws Exception { try (SocketChannel sc = SocketChannel.open()) { SelectionKey key = keyFor(sc); @@ -172,6 +171,7 @@ public class AtomicUpdates { /** * Test the default provider implementation of SelectionKey. */ + @Test public void testNioImplementation() throws Exception { try (SocketChannel sc = SocketChannel.open(); Selector sel = Selector.open()) { diff --git a/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java b/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java index 1a2ada51bce..b90a68ffd04 100644 --- a/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java +++ b/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -24,12 +24,12 @@ /* @test * @summary Unit test for Selector.select/selectNow(Consumer) * @bug 8199433 8208780 - * @run testng SelectWithConsumer + * @run junit SelectWithConsumer */ /* @test * @requires (os.family == "windows") - * @run testng/othervm -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.WindowsSelectorProvider SelectWithConsumer + * @run junit/othervm -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.WindowsSelectorProvider SelectWithConsumer */ import java.io.Closeable; @@ -49,11 +49,16 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import static java.util.concurrent.TimeUnit.*; -import org.testng.annotations.AfterTest; -import org.testng.annotations.Test; -import static org.testng.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; -@Test public class SelectWithConsumer { /** @@ -81,46 +86,47 @@ public class SelectWithConsumer { // select(Consumer) notifiedOps.set(0); int n = sel.select(k -> { - assertTrue(Thread.currentThread() == callerThread); - assertTrue(k == key); + assertSame(callerThread, Thread.currentThread()); + assertSame(key, k); int readyOps = key.readyOps(); - assertTrue((readyOps & interestOps) != 0); - assertTrue((readyOps & notifiedOps.get()) == 0); + assertNotEquals(0, readyOps & interestOps); + assertEquals(0, readyOps & notifiedOps.get()); notifiedOps.set(notifiedOps.get() | readyOps); }); assertTrue((n == 1) ^ (expectedOps == 0)); - assertTrue(notifiedOps.get() == expectedOps); + assertEquals(expectedOps, notifiedOps.get()); // select(Consumer, timeout) notifiedOps.set(0); n = sel.select(k -> { - assertTrue(Thread.currentThread() == callerThread); - assertTrue(k == key); + assertSame(callerThread, Thread.currentThread()); + assertSame(key, k); int readyOps = key.readyOps(); - assertTrue((readyOps & interestOps) != 0); - assertTrue((readyOps & notifiedOps.get()) == 0); + assertNotEquals(0, readyOps & interestOps); + assertEquals(0, readyOps & notifiedOps.get()); notifiedOps.set(notifiedOps.get() | readyOps); }, 1000); assertTrue((n == 1) ^ (expectedOps == 0)); - assertTrue(notifiedOps.get() == expectedOps); + assertEquals(expectedOps, notifiedOps.get()); // selectNow(Consumer) notifiedOps.set(0); n = sel.selectNow(k -> { - assertTrue(Thread.currentThread() == callerThread); - assertTrue(k == key); + assertSame(callerThread, Thread.currentThread()); + assertSame(key, k); int readyOps = key.readyOps(); - assertTrue((readyOps & interestOps) != 0); - assertTrue((readyOps & notifiedOps.get()) == 0); + assertNotEquals(0, readyOps & interestOps); + assertEquals(0, readyOps & notifiedOps.get()); notifiedOps.set(notifiedOps.get() | readyOps); }); assertTrue((n == 1) ^ (expectedOps == 0)); - assertTrue(notifiedOps.get() == expectedOps); + assertEquals(expectedOps, notifiedOps.get()); } /** * Test that an action is performed when a channel is ready for reading. */ + @Test public void testReadable() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -142,6 +148,7 @@ public class SelectWithConsumer { /** * Test that an action is performed when a channel is ready for writing. */ + @Test public void testWritable() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -161,6 +168,7 @@ public class SelectWithConsumer { * Test that an action is performed when a channel is ready for both * reading and writing. */ + @Test public void testReadableAndWriteable() throws Exception { ServerSocketChannel ssc = null; SocketChannel sc = null; @@ -188,6 +196,7 @@ public class SelectWithConsumer { /** * Test that the action is called for two selected channels */ + @Test public void testTwoChannels() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -217,8 +226,8 @@ public class SelectWithConsumer { assertTrue(k == key1 || k == key2); counter.incrementAndGet(); }); - assertTrue(n == 2); - assertTrue(counter.get() == 2); + assertEquals(2, n); + assertEquals(2, counter.get()); // select(Consumer, timeout) counter.set(0); @@ -226,8 +235,8 @@ public class SelectWithConsumer { assertTrue(k == key1 || k == key2); counter.incrementAndGet(); }, 1000); - assertTrue(n == 2); - assertTrue(counter.get() == 2); + assertEquals(2, n); + assertEquals(2, counter.get()); // selectNow(Consumer) counter.set(0); @@ -235,8 +244,8 @@ public class SelectWithConsumer { assertTrue(k == key1 || k == key2); counter.incrementAndGet(); }); - assertTrue(n == 2); - assertTrue(counter.get() == 2); + assertEquals(2, n); + assertEquals(2, counter.get()); } finally { closePipe(p); } @@ -245,6 +254,7 @@ public class SelectWithConsumer { /** * Test calling select twice, the action should be invoked each time */ + @Test public void testRepeatedSelect1() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -269,6 +279,7 @@ public class SelectWithConsumer { * Test calling select twice. An I/O operation is performed after the * first select so the channel will not be selected by the second select. */ + @Test public void testRepeatedSelect2() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -301,6 +312,7 @@ public class SelectWithConsumer { /** * Test timeout */ + @Test public void testTimeout() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -311,7 +323,7 @@ public class SelectWithConsumer { long start = millisTime(); int n = sel.select(k -> assertTrue(false), 1000L); expectDuration(start, 500, Long.MAX_VALUE); - assertTrue(n == 0); + assertEquals(0, n); } finally { closePipe(p); } @@ -320,12 +332,13 @@ public class SelectWithConsumer { /** * Test wakeup prior to select */ + @Test public void testWakeupBeforeSelect() throws Exception { // select(Consumer) try (Selector sel = Selector.open()) { sel.wakeup(); int n = sel.select(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); } // select(Consumer, timeout) @@ -334,19 +347,20 @@ public class SelectWithConsumer { long start = millisTime(); int n = sel.select(k -> assertTrue(false), 60*1000); expectDuration(start, 0, 20_000); - assertTrue(n == 0); + assertEquals(0, n); } } /** * Test wakeup during select */ + @Test public void testWakeupDuringSelect() throws Exception { // select(Consumer) try (Selector sel = Selector.open()) { scheduleWakeup(sel, 1, SECONDS); int n = sel.select(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); } // select(Consumer, timeout) @@ -355,19 +369,20 @@ public class SelectWithConsumer { long start = millisTime(); int n = sel.select(k -> assertTrue(false), 60*1000); expectDuration(start, 0, 20_000); - assertTrue(n == 0); + assertEquals(0, n); } } /** * Test invoking select with interrupted status set */ + @Test public void testInterruptBeforeSelect() throws Exception { // select(Consumer) try (Selector sel = Selector.open()) { Thread.currentThread().interrupt(); int n = sel.select(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { @@ -380,7 +395,7 @@ public class SelectWithConsumer { long start = millisTime(); int n = sel.select(k -> assertTrue(false), 60*1000); expectDuration(start, 0, 20_000); - assertTrue(n == 0); + assertEquals(0, n); assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { @@ -391,12 +406,13 @@ public class SelectWithConsumer { /** * Test interrupt thread during select */ + @Test public void testInterruptDuringSelect() throws Exception { // select(Consumer) try (Selector sel = Selector.open()) { scheduleInterrupt(Thread.currentThread(), 1, SECONDS); int n = sel.select(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { @@ -407,7 +423,7 @@ public class SelectWithConsumer { try (Selector sel = Selector.open()) { scheduleInterrupt(Thread.currentThread(), 1, SECONDS); int n = sel.select(k -> assertTrue(false), 60*1000); - assertTrue(n == 0); + assertEquals(0, n); assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { @@ -418,34 +434,38 @@ public class SelectWithConsumer { /** * Test invoking select on a closed selector */ - @Test(expectedExceptions = ClosedSelectorException.class) + @Test public void testClosedSelector1() throws Exception { Selector sel = Selector.open(); sel.close(); - sel.select(k -> assertTrue(false)); + assertThrows(ClosedSelectorException.class, + () -> sel.select(k -> assertTrue(false))); } - @Test(expectedExceptions = ClosedSelectorException.class) + @Test public void testClosedSelector2() throws Exception { Selector sel = Selector.open(); sel.close(); - sel.select(k -> assertTrue(false), 1000); + assertThrows(ClosedSelectorException.class, + () -> sel.select(k -> assertTrue(false), 1000)); } - @Test(expectedExceptions = ClosedSelectorException.class) + @Test public void testClosedSelector3() throws Exception { Selector sel = Selector.open(); sel.close(); - sel.selectNow(k -> assertTrue(false)); + assertThrows(ClosedSelectorException.class, + () -> sel.selectNow(k -> assertTrue(false))); } /** * Test closing selector while in a selection operation */ + @Test public void testCloseDuringSelect() throws Exception { // select(Consumer) try (Selector sel = Selector.open()) { scheduleClose(sel, 3, SECONDS); int n = sel.select(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); assertFalse(sel.isOpen()); } @@ -458,7 +478,7 @@ public class SelectWithConsumer { long after = System.nanoTime(); long selectDuration = (after - start) / 1000000; long scheduleDuration = (start - before) / 1000000; - assertTrue(n == 0); + assertEquals(0, n); assertTrue(selectDuration > 2000 && selectDuration < 10*1000, "select took " + selectDuration + " ms schedule took " + scheduleDuration + " ms"); @@ -469,7 +489,7 @@ public class SelectWithConsumer { /** * Test action closing selector */ - @Test(expectedExceptions = ClosedSelectorException.class) + @Test public void testActionClosingSelector() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -482,12 +502,14 @@ public class SelectWithConsumer { sink.write(messageBuffer()); // should relay ClosedSelectorException - sel.select(k -> { - assertTrue(k == key); - try { - sel.close(); - } catch (IOException ioe) { } - }); + assertThrows(ClosedSelectorException.class, + () -> sel.select(k -> { + assertTrue(k == key); + try { + sel.close(); + } catch (IOException ioe) { } + }) + ); } finally { closePipe(p); } @@ -497,6 +519,7 @@ public class SelectWithConsumer { * Test that the action is invoked while synchronized on the selector and * its selected-key set. */ + @Test public void testLocks() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -510,7 +533,7 @@ public class SelectWithConsumer { // select(Consumer) sel.select(k -> { - assertTrue(k == key); + assertSame(key, k); assertTrue(Thread.holdsLock(sel)); assertFalse(Thread.holdsLock(sel.keys())); assertTrue(Thread.holdsLock(sel.selectedKeys())); @@ -518,7 +541,7 @@ public class SelectWithConsumer { // select(Consumer, timeout) sel.select(k -> { - assertTrue(k == key); + assertSame(key, k); assertTrue(Thread.holdsLock(sel)); assertFalse(Thread.holdsLock(sel.keys())); assertTrue(Thread.holdsLock(sel.selectedKeys())); @@ -526,7 +549,7 @@ public class SelectWithConsumer { // selectNow(Consumer) sel.selectNow(k -> { - assertTrue(k == key); + assertSame(key, k); assertTrue(Thread.holdsLock(sel)); assertFalse(Thread.holdsLock(sel.keys())); assertTrue(Thread.holdsLock(sel.selectedKeys())); @@ -540,6 +563,7 @@ public class SelectWithConsumer { * Test that selection operations remove cancelled keys from the selector's * key and selected-key sets. */ + @Test public void testCancel() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -569,7 +593,7 @@ public class SelectWithConsumer { // cancel key1 key1.cancel(); int n = sel.selectNow(k -> assertTrue(k == key2)); - assertTrue(n == 1); + assertEquals(1, n); assertFalse(sel.keys().contains(key1)); assertTrue(sel.keys().contains(key2)); assertFalse(sel.selectedKeys().contains(key1)); @@ -578,7 +602,7 @@ public class SelectWithConsumer { // cancel key2 key2.cancel(); n = sel.selectNow(k -> assertTrue(false)); - assertTrue(n == 0); + assertEquals(0, n); assertFalse(sel.keys().contains(key1)); assertFalse(sel.keys().contains(key2)); assertFalse(sel.selectedKeys().contains(key1)); @@ -591,6 +615,7 @@ public class SelectWithConsumer { /** * Test an action invoking select() */ + @Test public void testReentrantSelect1() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -611,7 +636,7 @@ public class SelectWithConsumer { } catch (IllegalStateException expected) { } }); - assertTrue(n == 1); + assertEquals(1, n); } finally { closePipe(p); } @@ -620,6 +645,7 @@ public class SelectWithConsumer { /** * Test an action invoking selectNow() */ + @Test public void testReentrantSelect2() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -640,7 +666,7 @@ public class SelectWithConsumer { } catch (IllegalStateException expected) { } }); - assertTrue(n == 1); + assertEquals(1, n); } finally { closePipe(p); } @@ -649,6 +675,7 @@ public class SelectWithConsumer { /** * Test an action invoking select(Consumer) */ + @Test public void testReentrantSelect3() throws Exception { Pipe p = Pipe.open(); try (Selector sel = Selector.open()) { @@ -669,7 +696,7 @@ public class SelectWithConsumer { } catch (IllegalStateException expected) { } }); - assertTrue(n == 1); + assertEquals(1, n); } finally { closePipe(p); } @@ -678,42 +705,46 @@ public class SelectWithConsumer { /** * Negative timeout */ - @Test(expectedExceptions = IllegalArgumentException.class) + @Test public void testNegativeTimeout() throws Exception { try (Selector sel = Selector.open()) { - sel.select(k -> { }, -1L); + assertThrows(IllegalArgumentException.class, + () -> sel.select(k -> { }, -1L)); } } /** * Null action */ - @Test(expectedExceptions = NullPointerException.class) + @Test public void testNull1() throws Exception { try (Selector sel = Selector.open()) { - sel.select(null); + assertThrows(NullPointerException.class, + () -> sel.select(null)); } } - @Test(expectedExceptions = NullPointerException.class) + @Test public void testNull2() throws Exception { try (Selector sel = Selector.open()) { - sel.select(null, 1000); + assertThrows(NullPointerException.class, + () -> sel.select(null, 1000)); } } - @Test(expectedExceptions = NullPointerException.class) + @Test public void testNull3() throws Exception { try (Selector sel = Selector.open()) { - sel.selectNow(null); + assertThrows(NullPointerException.class, + () -> sel.selectNow(null)); } } // -- support methods --- - private final ScheduledExecutorService POOL = Executors.newScheduledThreadPool(1); + private static final ScheduledExecutorService POOL = Executors.newScheduledThreadPool(1); - @AfterTest - void shutdownThreadPool() { + @AfterAll + static void shutdownThreadPool() { POOL.shutdown(); } diff --git a/test/jdk/java/nio/channels/Selector/UpdateReadyOps.java b/test/jdk/java/nio/channels/Selector/UpdateReadyOps.java index 57a563c6a59..87b512fe495 100644 --- a/test/jdk/java/nio/channels/Selector/UpdateReadyOps.java +++ b/test/jdk/java/nio/channels/Selector/UpdateReadyOps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -22,7 +22,7 @@ */ /* @test - * @run testng UpdateReadyOps + * @run junit UpdateReadyOps * @summary Test that the ready set from a selection operation is bitwise-disjoined * into a key's ready set when the key is already in the selected-key set */ @@ -37,16 +37,19 @@ import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import org.testng.annotations.Test; -import static org.testng.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -@Test public class UpdateReadyOps { /** * Test that OP_WRITE is preserved when updating the ready set of a key in * the selected-key set to add OP_READ. */ + @Test public void testOpWritePreserved() throws Exception { try (ConnectionPair pair = new ConnectionPair(); Selector sel = Selector.open()) { @@ -58,14 +61,14 @@ public class UpdateReadyOps { SelectionKey key = sc1.register(sel, SelectionKey.OP_WRITE); int updated = sel.select(); - assertTrue(updated == 1); + assertEquals(1, updated); assertTrue(sel.selectedKeys().contains(key)); assertFalse(key.isReadable()); assertTrue(key.isWritable()); // select again, should be no updates updated = sel.select(); - assertTrue(updated == 0); + assertEquals(0, updated); assertTrue(sel.selectedKeys().contains(key)); assertFalse(key.isReadable()); assertTrue(key.isWritable()); @@ -78,16 +81,17 @@ public class UpdateReadyOps { key.interestOps(SelectionKey.OP_READ); updated = sel.select(); - assertTrue(updated == 1); - assertTrue(sel.selectedKeys().size() == 1); + assertEquals(1, updated); + assertEquals(1, sel.selectedKeys().size()); assertTrue(key.isReadable()); assertTrue(key.isWritable()); - assertTrue(key.readyOps() == (SelectionKey.OP_READ|SelectionKey.OP_WRITE)); + assertEquals(SelectionKey.OP_READ|SelectionKey.OP_WRITE, + key.readyOps()); // select again, should be no updates updated = sel.select(); - assertTrue(updated == 0); - assertTrue(sel.selectedKeys().size() == 1); + assertEquals(0, updated); + assertEquals(1, sel.selectedKeys().size()); assertTrue(key.isReadable()); assertTrue(key.isWritable()); } @@ -97,6 +101,7 @@ public class UpdateReadyOps { * Test that OP_READ is preserved when updating the ready set of a key in * the selected-key set to add OP_WRITE. */ + @Test public void testOpReadPreserved() throws Exception { try (ConnectionPair pair = new ConnectionPair(); Selector sel = Selector.open()) { @@ -111,32 +116,32 @@ public class UpdateReadyOps { sc2.write(helloMessage()); int updated = sel.select(); - assertTrue(updated == 1); - assertTrue(sel.selectedKeys().size() == 1); + assertEquals(1, updated); + assertEquals(1, sel.selectedKeys().size()); assertTrue(sel.selectedKeys().contains(key)); assertTrue(key.isReadable()); assertFalse(key.isWritable()); // select again, should be no updates updated = sel.select(); - assertTrue(updated == 0); + assertEquals(0, updated); assertTrue(sel.selectedKeys().contains(key)); assertTrue(key.isReadable()); assertFalse(key.isWritable()); key.interestOps(SelectionKey.OP_WRITE); updated = sel.select(); - assertTrue(updated == 1); - assertTrue(sel.selectedKeys().size() == 1); + assertEquals(1, updated); + assertEquals(1, sel.selectedKeys().size()); assertTrue(sel.selectedKeys().contains(key)); assertTrue(key.isReadable()); assertTrue(key.isWritable()); - assertTrue(key.readyOps() == (SelectionKey.OP_READ|SelectionKey.OP_WRITE)); + assertEquals(SelectionKey.OP_READ|SelectionKey.OP_WRITE, key.readyOps()); // select again, should be no updates updated = sel.select(); - assertTrue(updated == 0); - assertTrue(sel.selectedKeys().size() == 1); + assertEquals(0, updated); + assertEquals(1, sel.selectedKeys().size()); assertTrue(key.isReadable()); assertTrue(key.isWritable()); } diff --git a/test/jdk/java/nio/channels/spi/SelectorProvider/TestDefaultImplementation.java b/test/jdk/java/nio/channels/spi/SelectorProvider/TestDefaultImplementation.java index 6d402949982..e17b16dadc7 100644 --- a/test/jdk/java/nio/channels/spi/SelectorProvider/TestDefaultImplementation.java +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/TestDefaultImplementation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -25,19 +25,22 @@ * @test * @bug 8254692 * @summary Basic test for java.nio.channels.spi.SelectorProvider.java default implementation - * @run testng TestDefaultImplementation + * @run junit TestDefaultImplementation */ -import org.testng.annotations.Test; - import java.io.IOException; import java.net.ProtocolFamily; -import java.nio.channels.*; +import java.nio.channels.DatagramChannel; +import java.nio.channels.Pipe; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; import java.nio.channels.spi.AbstractSelector; import java.nio.channels.spi.SelectorProvider; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertThrows; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; public class TestDefaultImplementation { static final Class UOE = UnsupportedOperationException.class; @@ -67,4 +70,4 @@ public class TestDefaultImplementation { @Override public ServerSocketChannel openServerSocketChannel() { return null; } @Override public SocketChannel openSocketChannel() { return null; } } -} \ No newline at end of file +} diff --git a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java index 934bf509d88..897fc6236dc 100644 --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -36,7 +36,7 @@ * UnixSocketTest StateTest StateTestService EchoTest EchoService * UnixDomainChannelTest CloseTest Launcher Util * CheckIPv6Test CheckIPv6Service - * @run testng/othervm/native InheritedChannelTest + * @run junit/othervm/native InheritedChannelTest * @key intermittent */ @@ -45,14 +45,16 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import jdk.test.lib.JDKToolFinder; import jdk.test.lib.Utils; import jdk.test.lib.process.ProcessTools; import jdk.test.lib.Platform; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static java.util.Arrays.asList; @@ -64,19 +66,18 @@ public class InheritedChannelTest { private static final Path libraryPath = Paths.get(System.getProperty("java.library.path")); - @DataProvider - public Object[][] testCases() { - return new Object[][] { - { "UnixDomainChannelTest", List.of(UnixDomainChannelTest.class.getName())}, - { "UnixSocketTest", List.of(UnixSocketTest.class.getName())}, - { "StateTest", List.of(StateTest.class.getName(), "-Dtest.classes="+TEST_CLASSES)}, - { "EchoTest", List.of(EchoTest.class.getName()) }, - { "CheckIPv6Test", List.of(CheckIPv6Test.class.getName()) }, - { "CloseTest", List.of(CloseTest.class.getName()) }, - }; + public static Stream testCases() { + return Stream.of + (Arguments.of( "UnixDomainChannelTest", List.of(UnixDomainChannelTest.class.getName())), + Arguments.of( "UnixSocketTest", List.of(UnixSocketTest.class.getName())), + Arguments.of( "StateTest", List.of(StateTest.class.getName(), "-Dtest.classes="+TEST_CLASSES)), + Arguments.of( "EchoTest", List.of(EchoTest.class.getName())), + Arguments.of( "CheckIPv6Test", List.of(CheckIPv6Test.class.getName())), + Arguments.of( "CloseTest", List.of(CloseTest.class.getName()))); } - @Test(dataProvider = "testCases") + @ParameterizedTest + @MethodSource("testCases") public void test(String desc, List opts) throws Throwable { String pathVar = Platform.sharedLibraryPathVariableName(); System.out.println(pathVar + "=" + libraryPath); diff --git a/test/jdk/java/util/Arrays/ArraysEqCmpTest.java b/test/jdk/java/util/Arrays/ArraysEqCmpTest.java index a2bb9ce6a79..5e987746771 100644 --- a/test/jdk/java/util/Arrays/ArraysEqCmpTest.java +++ b/test/jdk/java/util/Arrays/ArraysEqCmpTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -25,12 +25,9 @@ * @test * @bug 8033148 8141409 * @summary tests for array equals and compare - * @run testng ArraysEqCmpTest + * @run junit ArraysEqCmpTest */ -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -46,6 +43,13 @@ import java.util.function.BiFunction; import java.util.function.LongFunction; import java.util.stream.IntStream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class ArraysEqCmpTest { // Maximum width in bits @@ -588,7 +592,6 @@ public class ArraysEqCmpTest { static Object[][] arrayTypes; - @DataProvider public static Object[][] arrayTypesProvider() { if (arrayTypes == null) { arrayTypes = new Object[][]{ @@ -613,7 +616,6 @@ public class ArraysEqCmpTest { static Object[][] floatArrayTypes; - @DataProvider public static Object[][] floatArrayTypesProvider() { if (floatArrayTypes == null) { LongFunction bTof = rb -> Float.intBitsToFloat((int) rb); @@ -629,7 +631,6 @@ public class ArraysEqCmpTest { static Object[][] objectArrayTypes; - @DataProvider public static Object[][] objectArrayTypesProvider() { if (objectArrayTypes == null) { LongFunction bTof = rb -> Float.intBitsToFloat((int) rb); @@ -646,7 +647,6 @@ public class ArraysEqCmpTest { static Object[][] signedUnsignedArrayTypes; - @DataProvider public static Object[][] signedUnsignedArrayTypes() { if (signedUnsignedArrayTypes == null) { signedUnsignedArrayTypes = new Object[][]{ @@ -661,7 +661,8 @@ public class ArraysEqCmpTest { // Equality and comparison tests - @Test(dataProvider = "arrayTypesProvider") + @ParameterizedTest + @MethodSource("arrayTypesProvider") public void testArray(ArrayType arrayType) { BiFunction, Integer, Object> constructor = (at, s) -> { Object a = at.construct(s); @@ -677,7 +678,8 @@ public class ArraysEqCmpTest { testArrayType(arrayType, constructor, cloner); } - @Test(dataProvider = "floatArrayTypesProvider") + @ParameterizedTest + @MethodSource("floatArrayTypesProvider") public void testPrimitiveFloatArray( ArrayType arrayType, long canonicalNanRawBits, long nonCanonicalNanRawBits, @@ -722,7 +724,8 @@ public class ArraysEqCmpTest { testArrayType(arrayType, canonicalNaNs, halfNonCanonicalNaNs); } - @Test(dataProvider = "objectArrayTypesProvider") + @ParameterizedTest + @MethodSource("objectArrayTypesProvider") public void testNullElementsInObjectArray(ArrayType arrayType) { BiFunction, Object, Object> cloner = ArrayType::copyOf; @@ -752,11 +755,12 @@ public class ArraysEqCmpTest { Integer[] a = new Integer[]{null, 0}; Integer[] b = new Integer[]{0, 0}; - Assert.assertTrue(Arrays.compare(a, b) < 0); - Assert.assertTrue(Arrays.compare(b, a) > 0); + Assertions.assertTrue(Arrays.compare(a, b) < 0); + Assertions.assertTrue(Arrays.compare(b, a) > 0); } - @Test(dataProvider = "objectArrayTypesProvider") + @ParameterizedTest + @MethodSource("objectArrayTypesProvider") public void testSameRefElementsInObjectArray(ArrayType arrayType) { BiFunction, Object, Object> cloner = ArrayType::copyOf; @@ -796,7 +800,8 @@ public class ArraysEqCmpTest { cloner); } - @Test(dataProvider = "signedUnsignedArrayTypes") + @ParameterizedTest + @MethodSource("signedUnsignedArrayTypes") public void testSignedUnsignedArray(ArrayType sat, ArrayType uat) { BiFunction, Integer, Object> constructor = (at, s) -> { Object a = at.construct(s); @@ -824,8 +829,8 @@ public class ArraysEqCmpTest { int sc = sat.compare(ac, aFrom, aTo, a, aFrom, aTo); int uc = uat.compare(ac, aFrom, aTo, a, aFrom, aTo); - Assert.assertTrue(sc < 0); - Assert.assertTrue(uc > 0); + Assertions.assertTrue(sc < 0); + Assertions.assertTrue(uc > 0); } } } @@ -854,31 +859,31 @@ public class ArraysEqCmpTest { Object bnr = at.copyOf(b, bFrom, bTo); boolean eq = isEqual(at, a, aFrom, aTo, b, bFrom, bTo); - Assert.assertEquals(at.equals(a, aFrom, aTo, b, bFrom, bTo), eq); - Assert.assertEquals(at.equals(b, bFrom, bTo, a, aFrom, aTo), eq); - Assert.assertEquals(at.equals(anr, bnr), eq); - Assert.assertEquals(at.equals(bnr, anr), eq); + Assertions.assertEquals(eq, at.equals(a, aFrom, aTo, b, bFrom, bTo)); + Assertions.assertEquals(eq, at.equals(b, bFrom, bTo, a, aFrom, aTo)); + Assertions.assertEquals(eq, at.equals(anr, bnr)); + Assertions.assertEquals(eq, at.equals(bnr, anr)); if (eq) { - Assert.assertEquals(at.compare(a, aFrom, aTo, b, bFrom, bTo), 0); - Assert.assertEquals(at.compare(b, bFrom, bTo, a, aFrom, aTo), 0); - Assert.assertEquals(at.compare(anr, bnr), 0); - Assert.assertEquals(at.compare(bnr, anr), 0); + Assertions.assertEquals(0, at.compare(a, aFrom, aTo, b, bFrom, bTo)); + Assertions.assertEquals(0, at.compare(b, bFrom, bTo, a, aFrom, aTo)); + Assertions.assertEquals(0, at.compare(anr, bnr)); + Assertions.assertEquals(0, at.compare(bnr, anr)); - Assert.assertEquals(at.mismatch(a, aFrom, aTo, b, bFrom, bTo), -1); - Assert.assertEquals(at.mismatch(b, bFrom, bTo, a, aFrom, aTo), -1); - Assert.assertEquals(at.mismatch(anr, bnr), -1); - Assert.assertEquals(at.mismatch(bnr, anr), -1); + Assertions.assertEquals(-1, at.mismatch(a, aFrom, aTo, b, bFrom, bTo)); + Assertions.assertEquals(-1, at.mismatch(b, bFrom, bTo, a, aFrom, aTo)); + Assertions.assertEquals(-1, at.mismatch(anr, bnr)); + Assertions.assertEquals(-1, at.mismatch(bnr, anr)); } else { int aCb = at.compare(a, aFrom, aTo, b, bFrom, bTo); int bCa = at.compare(b, bFrom, bTo, a, aFrom, aTo); int v = Integer.signum(aCb) * Integer.signum(bCa); - Assert.assertTrue(v == -1); + Assertions.assertTrue(v == -1); int anrCbnr = at.compare(anr, bnr); int bnrCanr = at.compare(bnr, anr); - Assert.assertEquals(anrCbnr, aCb); - Assert.assertEquals(bnrCanr, bCa); + Assertions.assertEquals(aCb, anrCbnr); + Assertions.assertEquals(bCa, bnrCanr); int aMb = at.mismatch(a, aFrom, aTo, b, bFrom, bTo); @@ -886,18 +891,18 @@ public class ArraysEqCmpTest { int anrMbnr = at.mismatch(anr, bnr); int bnrManr = at.mismatch(bnr, anr); - Assert.assertNotEquals(aMb, -1); - Assert.assertEquals(aMb, bMa); - Assert.assertNotEquals(anrMbnr, -1); - Assert.assertEquals(anrMbnr, bnrManr); - Assert.assertEquals(aMb, anrMbnr); - Assert.assertEquals(bMa, bnrManr); + Assertions.assertNotEquals(-1, aMb); + Assertions.assertEquals(bMa, aMb); + Assertions.assertNotEquals(-1, anrMbnr); + Assertions.assertEquals(bnrManr, anrMbnr); + Assertions.assertEquals(anrMbnr, aMb); + Assertions.assertEquals(bnrManr, bMa); // Common or proper prefix - Assert.assertTrue(at.equals(a, aFrom, aFrom + aMb, b, bFrom, bFrom + aMb)); + Assertions.assertTrue(at.equals(a, aFrom, aFrom + aMb, b, bFrom, bFrom + aMb)); if (aMb < Math.min(aLength, bLength)) { // Common prefix - Assert.assertFalse(isEqual(at, a, aFrom + aMb, b, bFrom + aMb)); + Assertions.assertFalse(isEqual(at, a, aFrom + aMb, b, bFrom + aMb)); } } } @@ -912,29 +917,29 @@ public class ArraysEqCmpTest { Object acnr = at.copyOf(ac, aFrom, aTo); Object anr = at.copyOf(a, aFrom, aTo); - Assert.assertFalse(at.equals(ac, aFrom, aTo, a, aFrom, aTo)); - Assert.assertFalse(at.equals(acnr, anr)); + Assertions.assertFalse(at.equals(ac, aFrom, aTo, a, aFrom, aTo)); + Assertions.assertFalse(at.equals(acnr, anr)); int acCa = at.compare(ac, aFrom, aTo, a, aFrom, aTo); int aCac = at.compare(a, aFrom, aTo, ac, aFrom, aTo); int v = Integer.signum(acCa) * Integer.signum(aCac); - Assert.assertTrue(v == -1); + Assertions.assertTrue(v == -1); int acnrCanr = at.compare(acnr, anr); int anrCacnr = at.compare(anr, acnr); - Assert.assertEquals(acnrCanr, acCa); - Assert.assertEquals(anrCacnr, aCac); + Assertions.assertEquals(acCa, acnrCanr); + Assertions.assertEquals(aCac, anrCacnr); int acMa = at.mismatch(ac, aFrom, aTo, a, aFrom, aTo); int aMac = at.mismatch(a, aFrom, aTo, ac, aFrom, aTo); - Assert.assertEquals(acMa, aMac); - Assert.assertEquals(acMa, i - aFrom); + Assertions.assertEquals(aMac, acMa); + Assertions.assertEquals(i - aFrom, acMa); int acnrManr = at.mismatch(acnr, anr); int anrMacnr = at.mismatch(anr, acnr); - Assert.assertEquals(acnrManr, anrMacnr); - Assert.assertEquals(acnrManr, i - aFrom); + Assertions.assertEquals(anrMacnr, acnrManr); + Assertions.assertEquals(i - aFrom, acnrManr); } } } @@ -986,24 +991,26 @@ public class ArraysEqCmpTest { // Null array reference tests - @Test(dataProvider = "arrayTypesProvider") + @ParameterizedTest + @MethodSource("arrayTypesProvider") public void testNullArrayRefs(ArrayType arrayType) { Object n = null; Object a = arrayType.construct(0); - Assert.assertTrue(arrayType.equals(n, n)); - Assert.assertFalse(arrayType.equals(n, a)); - Assert.assertFalse(arrayType.equals(a, n)); + Assertions.assertTrue(arrayType.equals(n, n)); + Assertions.assertFalse(arrayType.equals(n, a)); + Assertions.assertFalse(arrayType.equals(a, n)); - Assert.assertEquals(arrayType.compare(n, n), 0); - Assert.assertTrue(arrayType.compare(n, a) < 0); - Assert.assertTrue(arrayType.compare(a, n) > 0); + Assertions.assertEquals(0, arrayType.compare(n, n)); + Assertions.assertTrue(arrayType.compare(n, a) < 0); + Assertions.assertTrue(arrayType.compare(a, n) > 0); } // Exception throwing tests - @Test(dataProvider = "arrayTypesProvider") + @ParameterizedTest + @MethodSource("arrayTypesProvider") public void testNPEs(ArrayType arrayType) { Object[] values = new Object[]{null, arrayType.construct(0)}; @@ -1046,7 +1053,8 @@ public class ArraysEqCmpTest { } } - @Test(dataProvider = "arrayTypesProvider") + @ParameterizedTest + @MethodSource("arrayTypesProvider") public void testIAEs(ArrayType arrayType) { List values = Arrays.asList(0, 1); @@ -1065,7 +1073,8 @@ public class ArraysEqCmpTest { } } - @Test(dataProvider = "arrayTypesProvider") + @ParameterizedTest + @MethodSource("arrayTypesProvider") public void testAIOBEs(ArrayType arrayType) { List froms = Arrays.asList(-1, 0); @@ -1110,7 +1119,7 @@ public class ArraysEqCmpTest { catch (Throwable t) { caught = t; } - Assert.assertNotNull(caught); - Assert.assertTrue(expected.isInstance(caught)); + Assertions.assertNotNull(caught); + Assertions.assertTrue(expected.isInstance(caught)); } } \ No newline at end of file diff --git a/test/jdk/java/util/Arrays/AsList.java b/test/jdk/java/util/Arrays/AsList.java index c64c473a822..b02f1dcbe68 100644 --- a/test/jdk/java/util/Arrays/AsList.java +++ b/test/jdk/java/util/Arrays/AsList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -21,11 +21,11 @@ * questions. */ -/** +/* * @test * @bug 8155600 * @summary Tests for Arrays.asList() - * @run testng AsList + * @run junit AsList */ import java.util.Arrays; @@ -33,46 +33,35 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.stream.IntStream; -import org.testng.annotations.Test; -import org.testng.annotations.DataProvider; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.fail; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class AsList { /* * Iterator contract test */ - @Test(dataProvider = "Arrays") + @ParameterizedTest + @MethodSource("arrays") public void testIterator(Object[] array) { Iterator itr = Arrays.asList(array).iterator(); - for (int i = 0; i < array.length; i++) { + for (Object o : array) { assertTrue(itr.hasNext()); assertTrue(itr.hasNext()); // must be idempotent - assertSame(array[i], itr.next()); - try { - itr.remove(); - fail("Remove must throw"); - } catch (UnsupportedOperationException ex) { - // expected - } + assertSame(o, itr.next()); + assertThrows(UnsupportedOperationException.class, itr::remove); } - assertFalse(itr.hasNext()); for (int i = 0; i < 3; i++) { assertFalse(itr.hasNext()); - try { - itr.next(); - fail("Next succeed when there's no data left"); - } catch (NoSuchElementException ex) { - // expected - } + assertThrows(NoSuchElementException.class, itr::next); } } - @DataProvider(name = "Arrays") public static Object[][] arrays() { - Object[][] arrays = { + return new Object[][] { { new Object[] { } }, { new Object[] { 1 } }, { new Object[] { null } }, @@ -87,7 +76,5 @@ public class AsList { { new Object[] { "a", "a", "a", "a" } }, { IntStream.range(0, 100).boxed().toArray() } }; - - return arrays; } } diff --git a/test/jdk/java/util/Arrays/Correct.java b/test/jdk/java/util/Arrays/Correct.java index f69ea9160ff..dce169bb0fc 100644 --- a/test/jdk/java/util/Arrays/Correct.java +++ b/test/jdk/java/util/Arrays/Correct.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -25,17 +25,19 @@ * @test * @bug 4726380 8037097 * @summary Check that different sorts give equivalent results. - * @run testng Correct * @key randomness + * @run junit Correct */ import java.util.*; -import org.testng.annotations.Test; -import org.testng.annotations.DataProvider; -import static org.testng.Assert.fail; -import static org.testng.Assert.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class Correct { static final Random rnd = new Random(); @@ -50,11 +52,12 @@ public class Correct { Integer[] array2 = Arrays.copyOf(array1, array1.length); Arrays.sort(array1, array1.length/3, array1.length/2); stupidSort(array2, array2.length/3, array2.length/2); - assertEquals(array1, array2, "Arrays did not match. size=" + size); + Assertions.assertArrayEquals(array2, array1, "Arrays did not match. size=" + size); } } - @Test(dataProvider = "Comparators") + @ParameterizedTest + @MethodSource("comparators") public void testComparatorSort(Comparator comparator) { for (int i=0; i comparators() { Object[][] comparators = new Object[][] { new Object[] { Comparator.naturalOrder() }, diff --git a/test/jdk/java/util/Arrays/SetAllTest.java b/test/jdk/java/util/Arrays/SetAllTest.java index 23a3578cf69..25a229d23d4 100644 --- a/test/jdk/java/util/Arrays/SetAllTest.java +++ b/test/jdk/java/util/Arrays/SetAllTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -25,11 +25,9 @@ * @test * @bug 8012650 * @summary Unit test for setAll, parallelSetAll variants - * @run testng SetAllTest + * @run junit SetAllTest */ -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.util.Arrays; import java.util.function.IntFunction; @@ -37,12 +35,15 @@ import java.util.function.IntToDoubleFunction; import java.util.function.IntToLongFunction; import java.util.function.IntUnaryOperator; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.fail; +import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; -@Test +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class SetAllTest { private static final IntFunction toString = i -> "N" + Integer.valueOf(i); private static final IntFunction fillString = i -> "X"; @@ -93,52 +94,51 @@ public class SetAllTest { { "fill", 3, fillDouble, new double[] { 3.14, 3.14, 3.14 }} }; - @DataProvider(name="string") public Object[][] stringTests() { return stringData; } - @DataProvider(name="int") public Object[][] intTests() { return intData; } - @DataProvider(name="long") public Object[][] longTests() { return longData; } - @DataProvider(name="double") public Object[][] doubleTests() { return doubleData; } - @Test(dataProvider = "string") + @ParameterizedTest + @MethodSource("stringTests") public void testSetAllString(String name, int size, IntFunction generator, String[] expected) { String[] result = new String[size]; Arrays.setAll(result, generator); - assertEquals(result, expected, "setAll(String[], IntFunction) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "setAll(String[], IntFunction) case " + name + " failed."); // ensure fresh array result = new String[size]; Arrays.parallelSetAll(result, generator); - assertEquals(result, expected, "parallelSetAll(String[], IntFunction) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "parallelSetAll(String[], IntFunction) case " + name + " failed."); } - @Test(dataProvider = "int") + @ParameterizedTest + @MethodSource("intTests") public void testSetAllInt(String name, int size, IntUnaryOperator generator, int[] expected) { int[] result = new int[size]; Arrays.setAll(result, generator); - assertEquals(result, expected, "setAll(int[], IntUnaryOperator) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "setAll(int[], IntUnaryOperator) case " + name + " failed."); // ensure fresh array result = new int[size]; Arrays.parallelSetAll(result, generator); - assertEquals(result, expected, "parallelSetAll(int[], IntUnaryOperator) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "parallelSetAll(int[], IntUnaryOperator) case " + name + " failed."); } - @Test(dataProvider = "long") + @ParameterizedTest + @MethodSource("longTests") public void testSetAllLong(String name, int size, IntToLongFunction generator, long[] expected) { long[] result = new long[size]; Arrays.setAll(result, generator); - assertEquals(result, expected, "setAll(long[], IntToLongFunction) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "setAll(long[], IntToLongFunction) case " + name + " failed."); // ensure fresh array result = new long[size]; Arrays.parallelSetAll(result, generator); - assertEquals(result, expected, "parallelSetAll(long[], IntToLongFunction) case " + name + " failed."); + Assertions.assertArrayEquals(expected, result, "parallelSetAll(long[], IntToLongFunction) case " + name + " failed."); } private void assertDoubleArrayEquals(double[] actual, double[] expected, double delta, String msg) { @@ -151,7 +151,8 @@ public class SetAllTest { } } - @Test(dataProvider = "double") + @ParameterizedTest + @MethodSource("doubleTests") public void testSetAllDouble(String name, int size, IntToDoubleFunction generator, double[] expected) { double[] result = new double[size]; Arrays.setAll(result, generator); diff --git a/test/jdk/java/util/Arrays/SortingNearlySortedPrimitive.java b/test/jdk/java/util/Arrays/SortingNearlySortedPrimitive.java index b2c8d6ec45b..b9ad458688e 100644 --- a/test/jdk/java/util/Arrays/SortingNearlySortedPrimitive.java +++ b/test/jdk/java/util/Arrays/SortingNearlySortedPrimitive.java @@ -1,6 +1,6 @@ /* * Copyright 2015 Goldman Sachs. - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -30,11 +30,9 @@ * sorted and if so employs and optimizes merge sort rather than a * Dual-Pivot QuickSort. * - * @run testng SortingNearlySortedPrimitive + * @run junit SortingNearlySortedPrimitive */ -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Arrays; @@ -44,6 +42,12 @@ import java.util.function.IntFunction; import java.util.stream.IntStream; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class SortingNearlySortedPrimitive { static final int BASE = 3; @@ -112,7 +116,6 @@ public class SortingNearlySortedPrimitive { } - @DataProvider(name = "shapes") public Object[][] createShapes() { Stream> baseCases = Stream.of( List.of("hiZeroLowTest", (IntFunction) this::hiZeroLowData), @@ -141,7 +144,8 @@ public class SortingNearlySortedPrimitive { return nl.toArray(); } - @Test(dataProvider = "shapes") + @ParameterizedTest + @MethodSource("createShapes") public void testShapes(String testName, IntFunction dataMethod, int size) { int[] intSourceArray = dataMethod.apply(size); diff --git a/test/jdk/java/util/Arrays/StreamAndSpliterator.java b/test/jdk/java/util/Arrays/StreamAndSpliterator.java index c28b7c4d588..eaf0b02f369 100644 --- a/test/jdk/java/util/Arrays/StreamAndSpliterator.java +++ b/test/jdk/java/util/Arrays/StreamAndSpliterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 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 @@ -21,21 +21,20 @@ * questions. */ -/** +/* * @test * @bug 8037857 * @summary tests for stream and spliterator factory methods - * @run testng StreamAndSpliterator + * @run junit StreamAndSpliterator */ -import org.testng.annotations.Test; import java.util.Arrays; import java.util.Spliterators; -import org.testng.Assert.ThrowingRunnable; - -import static org.testng.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; public class StreamAndSpliterator { @Test @@ -127,11 +126,11 @@ public class StreamAndSpliterator { assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, 0, 1, 0)); } - void assertThrowsNPE(ThrowingRunnable r) { + void assertThrowsNPE(Executable r) { assertThrows(NullPointerException.class, r); } - void assertThrowsAIOOB(ThrowingRunnable r) { + void assertThrowsAIOOB(Executable r) { assertThrows(ArrayIndexOutOfBoundsException.class, r); } } diff --git a/test/jdk/java/util/Arrays/TEST.properties b/test/jdk/java/util/Arrays/TEST.properties new file mode 100644 index 00000000000..8e0b6e58824 --- /dev/null +++ b/test/jdk/java/util/Arrays/TEST.properties @@ -0,0 +1 @@ +disallowedActions=testng diff --git a/test/jdk/java/util/Arrays/largeMemory/ParallelPrefix.java b/test/jdk/java/util/Arrays/largeMemory/ParallelPrefix.java index 41bff170259..8ebf5453187 100644 --- a/test/jdk/java/util/Arrays/largeMemory/ParallelPrefix.java +++ b/test/jdk/java/util/Arrays/largeMemory/ParallelPrefix.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -21,13 +21,12 @@ * questions. */ -/** +/* * @test * @bug 8014076 8025067 * @summary unit test for Arrays.ParallelPrefix(). - * @author Tristan Yan * @modules java.management jdk.management - * @run testng/othervm -Xms256m -Xmx1024m ParallelPrefix + * @run junit/othervm -Xms256m -Xmx1024m ParallelPrefix */ import java.lang.management.ManagementFactory; @@ -40,11 +39,16 @@ import java.util.function.LongBinaryOperator; import java.util.stream.IntStream; import java.util.stream.LongStream; import com.sun.management.OperatingSystemMXBean; -import static org.testng.Assert.*; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; -import org.testng.annotations.BeforeSuite; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class ParallelPrefix { //Array size less than MIN_PARTITION private static final int SMALL_ARRAY_SIZE = 1 << 3; @@ -60,7 +64,7 @@ public class ParallelPrefix { private static int[] arraySizeCollection; - @BeforeSuite + @BeforeAll public static void setup() { java.lang.management.OperatingSystemMXBean bean = ManagementFactory.getOperatingSystemMXBean(); @@ -90,7 +94,6 @@ public class ParallelPrefix { System.out.println("System memory is not large enough, remove large array size test"); } - @DataProvider(name = "intSet") public static Object[][] intSet(){ return genericData(size -> IntStream.range(0, size).toArray(), new IntBinaryOperator[]{ @@ -98,7 +101,6 @@ public class ParallelPrefix { Integer::min}); } - @DataProvider(name = "longSet") public static Object[][] longSet(){ return genericData(size -> LongStream.range(0, size).toArray(), new LongBinaryOperator[]{ @@ -106,7 +108,6 @@ public class ParallelPrefix { Long::min}); } - @DataProvider(name = "doubleSet") public static Object[][] doubleSet(){ return genericData(size -> IntStream.range(0, size).mapToDouble(i -> (double)i).toArray(), new DoubleBinaryOperator[]{ @@ -114,7 +115,6 @@ public class ParallelPrefix { Double::min}); } - @DataProvider(name = "stringSet") public static Object[][] stringSet(){ Function stringsFunc = size -> IntStream.range(0, size).mapToObj(Integer::toString).toArray(String[]::new); @@ -142,7 +142,8 @@ public class ParallelPrefix { return data; } - @Test(dataProvider="intSet") + @ParameterizedTest + @MethodSource("intSet") public void testParallelPrefixForInt(int[] data, int fromIndex, int toIndex, IntBinaryOperator op) { int[] sequentialResult = data.clone(); for (int index = fromIndex + 1; index < toIndex; index++) { @@ -151,14 +152,15 @@ public class ParallelPrefix { int[] parallelResult = data.clone(); Arrays.parallelPrefix(parallelResult, fromIndex, toIndex, op); - assertArraysEqual(parallelResult, sequentialResult); + assertArraysEqual(sequentialResult, parallelResult); int[] parallelRangeResult = Arrays.copyOfRange(data, fromIndex, toIndex); Arrays.parallelPrefix(parallelRangeResult, op); - assertArraysEqual(parallelRangeResult, Arrays.copyOfRange(sequentialResult, fromIndex, toIndex)); + assertArraysEqual(Arrays.copyOfRange(sequentialResult, fromIndex, toIndex), parallelRangeResult); } - @Test(dataProvider="longSet") + @ParameterizedTest + @MethodSource("longSet") public void testParallelPrefixForLong(long[] data, int fromIndex, int toIndex, LongBinaryOperator op) { long[] sequentialResult = data.clone(); for (int index = fromIndex + 1; index < toIndex; index++) { @@ -167,14 +169,15 @@ public class ParallelPrefix { long[] parallelResult = data.clone(); Arrays.parallelPrefix(parallelResult, fromIndex, toIndex, op); - assertArraysEqual(parallelResult, sequentialResult); + assertArraysEqual(sequentialResult, parallelResult); long[] parallelRangeResult = Arrays.copyOfRange(data, fromIndex, toIndex); Arrays.parallelPrefix(parallelRangeResult, op); - assertArraysEqual(parallelRangeResult, Arrays.copyOfRange(sequentialResult, fromIndex, toIndex)); + assertArraysEqual(Arrays.copyOfRange(sequentialResult, fromIndex, toIndex), parallelRangeResult); } - @Test(dataProvider="doubleSet") + @ParameterizedTest + @MethodSource("doubleSet") public void testParallelPrefixForDouble(double[] data, int fromIndex, int toIndex, DoubleBinaryOperator op) { double[] sequentialResult = data.clone(); for (int index = fromIndex + 1; index < toIndex; index++) { @@ -183,14 +186,15 @@ public class ParallelPrefix { double[] parallelResult = data.clone(); Arrays.parallelPrefix(parallelResult, fromIndex, toIndex, op); - assertArraysEqual(parallelResult, sequentialResult); + assertArraysEqual(sequentialResult, parallelResult); double[] parallelRangeResult = Arrays.copyOfRange(data, fromIndex, toIndex); Arrays.parallelPrefix(parallelRangeResult, op); - assertArraysEqual(parallelRangeResult, Arrays.copyOfRange(sequentialResult, fromIndex, toIndex)); + assertArraysEqual(Arrays.copyOfRange(sequentialResult, fromIndex, toIndex), parallelRangeResult); } - @Test(dataProvider="stringSet") + @ParameterizedTest + @MethodSource("stringSet") public void testParallelPrefixForStringr(String[] data , int fromIndex, int toIndex, BinaryOperator op) { String[] sequentialResult = data.clone(); for (int index = fromIndex + 1; index < toIndex; index++) { @@ -199,11 +203,11 @@ public class ParallelPrefix { String[] parallelResult = data.clone(); Arrays.parallelPrefix(parallelResult, fromIndex, toIndex, op); - assertArraysEqual(parallelResult, sequentialResult); + assertArraysEqual(sequentialResult, parallelResult); String[] parallelRangeResult = Arrays.copyOfRange(data, fromIndex, toIndex); Arrays.parallelPrefix(parallelRangeResult, op); - assertArraysEqual(parallelRangeResult, Arrays.copyOfRange(sequentialResult, fromIndex, toIndex)); + assertArraysEqual(Arrays.copyOfRange(sequentialResult, fromIndex, toIndex), parallelRangeResult); } @Test @@ -258,48 +262,48 @@ public class ParallelPrefix { // "library" code - private void assertThrowsNPE(ThrowingRunnable r) { + private void assertThrowsNPE(Executable r) { assertThrows(NullPointerException.class, r); } - private void assertThrowsIAE(ThrowingRunnable r) { + private void assertThrowsIAE(Executable r) { assertThrows(IllegalArgumentException.class, r); } - private void assertThrowsAIOOB(ThrowingRunnable r) { + private void assertThrowsAIOOB(Executable r) { assertThrows(ArrayIndexOutOfBoundsException.class, r); } - static void assertArraysEqual(int[] actual, int[] expected) { + static void assertArraysEqual(int[] expected, int[] actual) { try { - assertEquals(actual, expected, ""); + assertArrayEquals(expected, actual, ""); } catch (AssertionError x) { throw new AssertionError(String.format("Expected:%s, actual:%s", Arrays.toString(expected), Arrays.toString(actual)), x); } } - static void assertArraysEqual(long[] actual, long[] expected) { + static void assertArraysEqual(long[] expected, long[] actual) { try { - assertEquals(actual, expected, ""); + assertArrayEquals(expected, actual, ""); } catch (AssertionError x) { throw new AssertionError(String.format("Expected:%s, actual:%s", Arrays.toString(expected), Arrays.toString(actual)), x); } } - static void assertArraysEqual(double[] actual, double[] expected) { + static void assertArraysEqual(double[] expected, double[] actual) { try { - assertEquals(actual, expected, ""); + assertArrayEquals(expected, actual, ""); } catch (AssertionError x) { throw new AssertionError(String.format("Expected:%s, actual:%s", Arrays.toString(expected), Arrays.toString(actual)), x); } } - static void assertArraysEqual(String[] actual, String[] expected) { + static void assertArraysEqual(String[] expected, String[] actual) { try { - assertEquals(actual, expected, ""); + assertArrayEquals(expected, actual, ""); } catch (AssertionError x) { throw new AssertionError(String.format("Expected:%s, actual:%s", Arrays.toString(expected), Arrays.toString(actual)), x); diff --git a/test/jdk/java/util/TimeZone/TimeZoneData/VERSION b/test/jdk/java/util/TimeZone/TimeZoneData/VERSION index 76d146afc71..2f72d7dbcb2 100644 --- a/test/jdk/java/util/TimeZone/TimeZoneData/VERSION +++ b/test/jdk/java/util/TimeZone/TimeZoneData/VERSION @@ -1 +1 @@ -tzdata2025c +tzdata2026a diff --git a/test/jdk/java/util/concurrent/forkjoin/Starvation.java b/test/jdk/java/util/concurrent/forkjoin/Starvation.java index f3336a3c7e9..3db83688d45 100644 --- a/test/jdk/java/util/concurrent/forkjoin/Starvation.java +++ b/test/jdk/java/util/concurrent/forkjoin/Starvation.java @@ -28,7 +28,6 @@ */ import java.util.concurrent.Callable; import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.ForkJoinTask; import java.util.concurrent.atomic.AtomicInteger; public class Starvation { @@ -43,7 +42,7 @@ public class Starvation { while (count.get() == c) Thread.onSpinWait(); return null; }}; - static void testSubmitExternalCallable() throws Exception { + public static void main(String[] args) throws Exception { try (var pool = new ForkJoinPool(2)) { for (int i = 0; i < 100_000; i++) { var future1 = pool.submit(new AwaitCount(i)); @@ -54,21 +53,4 @@ public class Starvation { } } } - - static void testSubmitAdaptedCallable() throws Exception { - try (var pool = new ForkJoinPool(2)) { - for (int i = 0; i < 100_000; i++) { - var future1 = pool.submit(new AwaitCount(i)); - var future2 = pool.submit(ForkJoinTask.adapt(noop)); - future2.get(); - count.set(i + 1); - future1.get(); - } - } - } - - public static void main(String[] args) throws Exception { - testSubmitExternalCallable(); - testSubmitAdaptedCallable(); - } } diff --git a/test/jdk/jdk/incubator/vector/ByteVector128Tests.java b/test/jdk/jdk/incubator/vector/ByteVector128Tests.java index 91148fd5d66..ca6fa537ac4 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector128Tests.java @@ -1574,6 +1574,59 @@ public class ByteVector128Tests extends AbstractVectorTest { return a >= b; } + static byte firstNonZero(byte a, byte b) { + return Byte.compare(a, (byte) 0) != 0 ? a : b; + } + + static byte scalar_or(byte a, byte b) { + return (byte)(a | b); + } + + static byte scalar_and(byte a, byte b) { + return (byte)(a & b); + } + + static byte scalar_xor(byte a, byte b) { + return (byte)(a ^ b); + } + + static byte scalar_add(byte a, byte b) { + return (byte)(a + b); + } + + static byte scalar_sub(byte a, byte b) { + return (byte)(a - b); + } + + static byte scalar_mul(byte a, byte b) { + return (byte)(a * b); + } + + static byte scalar_min(byte a, byte b) { + return (byte)(Math.min(a, b)); + } + + static byte scalar_max(byte a, byte b) { + return (byte)(Math.max(a, b)); + } + + static byte scalar_div(byte a, byte b) { + return (byte)(a / b); + } + + static byte scalar_fma(byte a, byte b, byte c) { + return (byte)(Math.fma(a, b, c)); + } + + static byte scalar_abs(byte a) { + return (byte)(Math.abs(a)); + } + + static byte scalar_neg(byte a) { + return ((byte)-a); + } + + static boolean ult(byte a, byte b) { return Byte.compareUnsigned(a, b) < 0; } @@ -1590,9 +1643,6 @@ public class ByteVector128Tests extends AbstractVectorTest { return Byte.compareUnsigned(a, b) >= 0; } - static byte firstNonZero(byte a, byte b) { - return Byte.compare(a, (byte) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1701,7 +1751,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte ADD(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1722,7 +1772,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte add(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1779,7 +1829,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte SUB(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1800,7 +1850,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte sub(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1857,7 +1907,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte MUL(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1878,7 +1928,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte mul(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -2025,7 +2075,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte FIRST_NONZERO(byte a, byte b) { - return (byte)((a)!=0?a:b); + return (byte)(firstNonZero(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3239,7 +3289,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte MIN(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3260,7 +3310,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte min(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3279,7 +3329,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte MAX(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3300,7 +3350,7 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte max(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3668,7 +3718,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ANDReduce(byte[] a, int idx) { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3677,7 +3727,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ANDReduceAll(byte[] a) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3695,7 +3745,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3708,20 +3758,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = AND_IDENTITY; - assertEquals((byte) (id & id), id, + assertEquals((byte) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id & x), x); - assertEquals((byte) (x & id), x); + assertEquals((byte) (scalar_and(id, x)), x); + assertEquals((byte) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id & x), x, + assertEquals((byte) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x & id), x, + assertEquals((byte) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3730,7 +3780,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3739,7 +3789,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ANDReduceAllMasked(byte[] a, boolean[] mask) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3759,7 +3809,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3770,7 +3820,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ORReduce(byte[] a, int idx) { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3779,7 +3829,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ORReduceAll(byte[] a) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3797,7 +3847,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3810,20 +3860,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = OR_IDENTITY; - assertEquals((byte) (id | id), id, + assertEquals((byte) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id | x), x); - assertEquals((byte) (x | id), x); + assertEquals((byte) (scalar_or(id, x)), x); + assertEquals((byte) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id | x), x, + assertEquals((byte) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x | id), x, + assertEquals((byte) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3832,7 +3882,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3841,7 +3891,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ORReduceAllMasked(byte[] a, boolean[] mask) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3861,7 +3911,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3872,7 +3922,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte XORReduce(byte[] a, int idx) { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3881,7 +3931,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte XORReduceAll(byte[] a) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3899,7 +3949,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3912,20 +3962,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = XOR_IDENTITY; - assertEquals((byte) (id ^ id), id, + assertEquals((byte) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id ^ x), x); - assertEquals((byte) (x ^ id), x); + assertEquals((byte) (scalar_xor(id, x)), x); + assertEquals((byte) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id ^ x), x, + assertEquals((byte) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x ^ id), x, + assertEquals((byte) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3934,7 +3984,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3943,7 +3993,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte XORReduceAllMasked(byte[] a, boolean[] mask) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3963,7 +4013,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3974,7 +4024,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ADDReduce(byte[] a, int idx) { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3983,7 +4033,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ADDReduceAll(byte[] a) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4001,7 +4051,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4014,20 +4064,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = ADD_IDENTITY; - assertEquals((byte) (id + id), id, + assertEquals((byte) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id + x), x); - assertEquals((byte) (x + id), x); + assertEquals((byte) (scalar_add(id, x)), x); + assertEquals((byte) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id + x), x, + assertEquals((byte) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x + id), x, + assertEquals((byte) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4036,7 +4086,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4045,7 +4095,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte ADDReduceAllMasked(byte[] a, boolean[] mask) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4065,7 +4115,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4076,7 +4126,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MULReduce(byte[] a, int idx) { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4085,7 +4135,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MULReduceAll(byte[] a) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4103,7 +4153,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4116,20 +4166,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MUL_IDENTITY; - assertEquals((byte) (id * id), id, + assertEquals((byte) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id * x), x); - assertEquals((byte) (x * id), x); + assertEquals((byte) (scalar_mul(id, x)), x); + assertEquals((byte) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id * x), x, + assertEquals((byte) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x * id), x, + assertEquals((byte) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4138,7 +4188,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4147,7 +4197,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MULReduceAllMasked(byte[] a, boolean[] mask) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4167,7 +4217,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4178,7 +4228,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MINReduce(byte[] a, int idx) { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4187,7 +4237,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MINReduceAll(byte[] a) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4205,7 +4255,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4218,20 +4268,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MIN_IDENTITY; - assertEquals((byte) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.min(id, x), x); - assertEquals((byte) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4240,7 +4290,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4249,7 +4299,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MINReduceAllMasked(byte[] a, boolean[] mask) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4269,7 +4319,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4280,7 +4330,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MAXReduce(byte[] a, int idx) { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4289,7 +4339,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MAXReduceAll(byte[] a) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4307,7 +4357,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4320,20 +4370,20 @@ public class ByteVector128Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MAX_IDENTITY; - assertEquals((byte) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.max(id, x), x); - assertEquals((byte) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4342,7 +4392,7 @@ public class ByteVector128Tests extends AbstractVectorTest { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4351,7 +4401,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static byte MAXReduceAllMasked(byte[] a, boolean[] mask) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4371,7 +4421,7 @@ public class ByteVector128Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5404,7 +5454,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5424,7 +5474,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5440,7 +5490,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (byte)((long)b[i]))); } } } @@ -5460,7 +5510,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (byte)((long)b[i])))); } } } @@ -5476,7 +5526,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5496,7 +5546,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5512,7 +5562,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (byte)((long)b[i]))); } } } @@ -5532,7 +5582,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (byte)((long)b[i])))); } } } @@ -6244,11 +6294,11 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte NEG(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } static byte neg(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6300,11 +6350,11 @@ public class ByteVector128Tests extends AbstractVectorTest { } static byte ABS(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } static byte abs(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6795,7 +6845,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6811,7 +6861,7 @@ public class ByteVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6891,7 +6941,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static long ADDReduceLong(byte[] a, int idx) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6900,7 +6950,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static long ADDReduceAllLong(byte[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((byte)res, (byte)ADDReduceLong(a, i)); } return res; @@ -6918,8 +6968,8 @@ public class ByteVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6929,8 +6979,9 @@ public class ByteVector128Tests extends AbstractVectorTest { static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6939,7 +6990,7 @@ public class ByteVector128Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((byte)res, (byte)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6959,8 +7010,8 @@ public class ByteVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ByteVector256Tests.java b/test/jdk/jdk/incubator/vector/ByteVector256Tests.java index 1173a4b7783..5c32d4a7f74 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector256Tests.java @@ -1574,6 +1574,59 @@ public class ByteVector256Tests extends AbstractVectorTest { return a >= b; } + static byte firstNonZero(byte a, byte b) { + return Byte.compare(a, (byte) 0) != 0 ? a : b; + } + + static byte scalar_or(byte a, byte b) { + return (byte)(a | b); + } + + static byte scalar_and(byte a, byte b) { + return (byte)(a & b); + } + + static byte scalar_xor(byte a, byte b) { + return (byte)(a ^ b); + } + + static byte scalar_add(byte a, byte b) { + return (byte)(a + b); + } + + static byte scalar_sub(byte a, byte b) { + return (byte)(a - b); + } + + static byte scalar_mul(byte a, byte b) { + return (byte)(a * b); + } + + static byte scalar_min(byte a, byte b) { + return (byte)(Math.min(a, b)); + } + + static byte scalar_max(byte a, byte b) { + return (byte)(Math.max(a, b)); + } + + static byte scalar_div(byte a, byte b) { + return (byte)(a / b); + } + + static byte scalar_fma(byte a, byte b, byte c) { + return (byte)(Math.fma(a, b, c)); + } + + static byte scalar_abs(byte a) { + return (byte)(Math.abs(a)); + } + + static byte scalar_neg(byte a) { + return ((byte)-a); + } + + static boolean ult(byte a, byte b) { return Byte.compareUnsigned(a, b) < 0; } @@ -1590,9 +1643,6 @@ public class ByteVector256Tests extends AbstractVectorTest { return Byte.compareUnsigned(a, b) >= 0; } - static byte firstNonZero(byte a, byte b) { - return Byte.compare(a, (byte) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1701,7 +1751,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte ADD(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1722,7 +1772,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte add(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1779,7 +1829,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte SUB(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1800,7 +1850,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte sub(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1857,7 +1907,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte MUL(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1878,7 +1928,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte mul(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -2025,7 +2075,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte FIRST_NONZERO(byte a, byte b) { - return (byte)((a)!=0?a:b); + return (byte)(firstNonZero(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3239,7 +3289,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte MIN(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3260,7 +3310,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte min(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3279,7 +3329,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte MAX(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3300,7 +3350,7 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte max(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3668,7 +3718,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ANDReduce(byte[] a, int idx) { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3677,7 +3727,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ANDReduceAll(byte[] a) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3695,7 +3745,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3708,20 +3758,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = AND_IDENTITY; - assertEquals((byte) (id & id), id, + assertEquals((byte) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id & x), x); - assertEquals((byte) (x & id), x); + assertEquals((byte) (scalar_and(id, x)), x); + assertEquals((byte) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id & x), x, + assertEquals((byte) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x & id), x, + assertEquals((byte) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3730,7 +3780,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3739,7 +3789,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ANDReduceAllMasked(byte[] a, boolean[] mask) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3759,7 +3809,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3770,7 +3820,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ORReduce(byte[] a, int idx) { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3779,7 +3829,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ORReduceAll(byte[] a) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3797,7 +3847,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3810,20 +3860,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = OR_IDENTITY; - assertEquals((byte) (id | id), id, + assertEquals((byte) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id | x), x); - assertEquals((byte) (x | id), x); + assertEquals((byte) (scalar_or(id, x)), x); + assertEquals((byte) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id | x), x, + assertEquals((byte) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x | id), x, + assertEquals((byte) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3832,7 +3882,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3841,7 +3891,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ORReduceAllMasked(byte[] a, boolean[] mask) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3861,7 +3911,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3872,7 +3922,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte XORReduce(byte[] a, int idx) { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3881,7 +3931,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte XORReduceAll(byte[] a) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3899,7 +3949,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3912,20 +3962,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = XOR_IDENTITY; - assertEquals((byte) (id ^ id), id, + assertEquals((byte) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id ^ x), x); - assertEquals((byte) (x ^ id), x); + assertEquals((byte) (scalar_xor(id, x)), x); + assertEquals((byte) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id ^ x), x, + assertEquals((byte) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x ^ id), x, + assertEquals((byte) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3934,7 +3984,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3943,7 +3993,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte XORReduceAllMasked(byte[] a, boolean[] mask) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3963,7 +4013,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3974,7 +4024,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ADDReduce(byte[] a, int idx) { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3983,7 +4033,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ADDReduceAll(byte[] a) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4001,7 +4051,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4014,20 +4064,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = ADD_IDENTITY; - assertEquals((byte) (id + id), id, + assertEquals((byte) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id + x), x); - assertEquals((byte) (x + id), x); + assertEquals((byte) (scalar_add(id, x)), x); + assertEquals((byte) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id + x), x, + assertEquals((byte) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x + id), x, + assertEquals((byte) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4036,7 +4086,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4045,7 +4095,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte ADDReduceAllMasked(byte[] a, boolean[] mask) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4065,7 +4115,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4076,7 +4126,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MULReduce(byte[] a, int idx) { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4085,7 +4135,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MULReduceAll(byte[] a) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4103,7 +4153,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4116,20 +4166,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MUL_IDENTITY; - assertEquals((byte) (id * id), id, + assertEquals((byte) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id * x), x); - assertEquals((byte) (x * id), x); + assertEquals((byte) (scalar_mul(id, x)), x); + assertEquals((byte) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id * x), x, + assertEquals((byte) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x * id), x, + assertEquals((byte) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4138,7 +4188,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4147,7 +4197,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MULReduceAllMasked(byte[] a, boolean[] mask) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4167,7 +4217,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4178,7 +4228,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MINReduce(byte[] a, int idx) { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4187,7 +4237,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MINReduceAll(byte[] a) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4205,7 +4255,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4218,20 +4268,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MIN_IDENTITY; - assertEquals((byte) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.min(id, x), x); - assertEquals((byte) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4240,7 +4290,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4249,7 +4299,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MINReduceAllMasked(byte[] a, boolean[] mask) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4269,7 +4319,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4280,7 +4330,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MAXReduce(byte[] a, int idx) { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4289,7 +4339,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MAXReduceAll(byte[] a) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4307,7 +4357,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4320,20 +4370,20 @@ public class ByteVector256Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MAX_IDENTITY; - assertEquals((byte) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.max(id, x), x); - assertEquals((byte) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4342,7 +4392,7 @@ public class ByteVector256Tests extends AbstractVectorTest { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4351,7 +4401,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static byte MAXReduceAllMasked(byte[] a, boolean[] mask) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4371,7 +4421,7 @@ public class ByteVector256Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5404,7 +5454,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5424,7 +5474,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5440,7 +5490,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (byte)((long)b[i]))); } } } @@ -5460,7 +5510,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (byte)((long)b[i])))); } } } @@ -5476,7 +5526,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5496,7 +5546,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5512,7 +5562,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (byte)((long)b[i]))); } } } @@ -5532,7 +5582,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (byte)((long)b[i])))); } } } @@ -6244,11 +6294,11 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte NEG(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } static byte neg(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6300,11 +6350,11 @@ public class ByteVector256Tests extends AbstractVectorTest { } static byte ABS(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } static byte abs(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6795,7 +6845,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6811,7 +6861,7 @@ public class ByteVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6891,7 +6941,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static long ADDReduceLong(byte[] a, int idx) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6900,7 +6950,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static long ADDReduceAllLong(byte[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((byte)res, (byte)ADDReduceLong(a, i)); } return res; @@ -6918,8 +6968,8 @@ public class ByteVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6929,8 +6979,9 @@ public class ByteVector256Tests extends AbstractVectorTest { static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6939,7 +6990,7 @@ public class ByteVector256Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((byte)res, (byte)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6959,8 +7010,8 @@ public class ByteVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ByteVector512Tests.java b/test/jdk/jdk/incubator/vector/ByteVector512Tests.java index 02da1889dc8..094f3bbebdc 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector512Tests.java @@ -1574,6 +1574,59 @@ public class ByteVector512Tests extends AbstractVectorTest { return a >= b; } + static byte firstNonZero(byte a, byte b) { + return Byte.compare(a, (byte) 0) != 0 ? a : b; + } + + static byte scalar_or(byte a, byte b) { + return (byte)(a | b); + } + + static byte scalar_and(byte a, byte b) { + return (byte)(a & b); + } + + static byte scalar_xor(byte a, byte b) { + return (byte)(a ^ b); + } + + static byte scalar_add(byte a, byte b) { + return (byte)(a + b); + } + + static byte scalar_sub(byte a, byte b) { + return (byte)(a - b); + } + + static byte scalar_mul(byte a, byte b) { + return (byte)(a * b); + } + + static byte scalar_min(byte a, byte b) { + return (byte)(Math.min(a, b)); + } + + static byte scalar_max(byte a, byte b) { + return (byte)(Math.max(a, b)); + } + + static byte scalar_div(byte a, byte b) { + return (byte)(a / b); + } + + static byte scalar_fma(byte a, byte b, byte c) { + return (byte)(Math.fma(a, b, c)); + } + + static byte scalar_abs(byte a) { + return (byte)(Math.abs(a)); + } + + static byte scalar_neg(byte a) { + return ((byte)-a); + } + + static boolean ult(byte a, byte b) { return Byte.compareUnsigned(a, b) < 0; } @@ -1590,9 +1643,6 @@ public class ByteVector512Tests extends AbstractVectorTest { return Byte.compareUnsigned(a, b) >= 0; } - static byte firstNonZero(byte a, byte b) { - return Byte.compare(a, (byte) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1701,7 +1751,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte ADD(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1722,7 +1772,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte add(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1779,7 +1829,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte SUB(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1800,7 +1850,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte sub(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1857,7 +1907,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte MUL(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1878,7 +1928,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte mul(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -2025,7 +2075,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte FIRST_NONZERO(byte a, byte b) { - return (byte)((a)!=0?a:b); + return (byte)(firstNonZero(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3239,7 +3289,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte MIN(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3260,7 +3310,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte min(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3279,7 +3329,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte MAX(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3300,7 +3350,7 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte max(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3668,7 +3718,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ANDReduce(byte[] a, int idx) { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3677,7 +3727,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ANDReduceAll(byte[] a) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3695,7 +3745,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3708,20 +3758,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = AND_IDENTITY; - assertEquals((byte) (id & id), id, + assertEquals((byte) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id & x), x); - assertEquals((byte) (x & id), x); + assertEquals((byte) (scalar_and(id, x)), x); + assertEquals((byte) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id & x), x, + assertEquals((byte) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x & id), x, + assertEquals((byte) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3730,7 +3780,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3739,7 +3789,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ANDReduceAllMasked(byte[] a, boolean[] mask) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3759,7 +3809,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3770,7 +3820,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ORReduce(byte[] a, int idx) { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3779,7 +3829,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ORReduceAll(byte[] a) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3797,7 +3847,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3810,20 +3860,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = OR_IDENTITY; - assertEquals((byte) (id | id), id, + assertEquals((byte) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id | x), x); - assertEquals((byte) (x | id), x); + assertEquals((byte) (scalar_or(id, x)), x); + assertEquals((byte) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id | x), x, + assertEquals((byte) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x | id), x, + assertEquals((byte) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3832,7 +3882,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3841,7 +3891,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ORReduceAllMasked(byte[] a, boolean[] mask) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3861,7 +3911,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3872,7 +3922,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte XORReduce(byte[] a, int idx) { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3881,7 +3931,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte XORReduceAll(byte[] a) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3899,7 +3949,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3912,20 +3962,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = XOR_IDENTITY; - assertEquals((byte) (id ^ id), id, + assertEquals((byte) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id ^ x), x); - assertEquals((byte) (x ^ id), x); + assertEquals((byte) (scalar_xor(id, x)), x); + assertEquals((byte) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id ^ x), x, + assertEquals((byte) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x ^ id), x, + assertEquals((byte) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3934,7 +3984,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3943,7 +3993,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte XORReduceAllMasked(byte[] a, boolean[] mask) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3963,7 +4013,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3974,7 +4024,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ADDReduce(byte[] a, int idx) { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3983,7 +4033,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ADDReduceAll(byte[] a) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4001,7 +4051,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4014,20 +4064,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = ADD_IDENTITY; - assertEquals((byte) (id + id), id, + assertEquals((byte) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id + x), x); - assertEquals((byte) (x + id), x); + assertEquals((byte) (scalar_add(id, x)), x); + assertEquals((byte) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id + x), x, + assertEquals((byte) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x + id), x, + assertEquals((byte) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4036,7 +4086,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4045,7 +4095,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte ADDReduceAllMasked(byte[] a, boolean[] mask) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4065,7 +4115,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4076,7 +4126,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MULReduce(byte[] a, int idx) { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4085,7 +4135,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MULReduceAll(byte[] a) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4103,7 +4153,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4116,20 +4166,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MUL_IDENTITY; - assertEquals((byte) (id * id), id, + assertEquals((byte) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id * x), x); - assertEquals((byte) (x * id), x); + assertEquals((byte) (scalar_mul(id, x)), x); + assertEquals((byte) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id * x), x, + assertEquals((byte) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x * id), x, + assertEquals((byte) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4138,7 +4188,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4147,7 +4197,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MULReduceAllMasked(byte[] a, boolean[] mask) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4167,7 +4217,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4178,7 +4228,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MINReduce(byte[] a, int idx) { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4187,7 +4237,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MINReduceAll(byte[] a) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4205,7 +4255,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4218,20 +4268,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MIN_IDENTITY; - assertEquals((byte) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.min(id, x), x); - assertEquals((byte) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4240,7 +4290,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4249,7 +4299,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MINReduceAllMasked(byte[] a, boolean[] mask) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4269,7 +4319,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4280,7 +4330,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MAXReduce(byte[] a, int idx) { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4289,7 +4339,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MAXReduceAll(byte[] a) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4307,7 +4357,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4320,20 +4370,20 @@ public class ByteVector512Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MAX_IDENTITY; - assertEquals((byte) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.max(id, x), x); - assertEquals((byte) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4342,7 +4392,7 @@ public class ByteVector512Tests extends AbstractVectorTest { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4351,7 +4401,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static byte MAXReduceAllMasked(byte[] a, boolean[] mask) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4371,7 +4421,7 @@ public class ByteVector512Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5404,7 +5454,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5424,7 +5474,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5440,7 +5490,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (byte)((long)b[i]))); } } } @@ -5460,7 +5510,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (byte)((long)b[i])))); } } } @@ -5476,7 +5526,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5496,7 +5546,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5512,7 +5562,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (byte)((long)b[i]))); } } } @@ -5532,7 +5582,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (byte)((long)b[i])))); } } } @@ -6244,11 +6294,11 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte NEG(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } static byte neg(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6300,11 +6350,11 @@ public class ByteVector512Tests extends AbstractVectorTest { } static byte ABS(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } static byte abs(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6795,7 +6845,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6811,7 +6861,7 @@ public class ByteVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6891,7 +6941,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static long ADDReduceLong(byte[] a, int idx) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6900,7 +6950,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static long ADDReduceAllLong(byte[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((byte)res, (byte)ADDReduceLong(a, i)); } return res; @@ -6918,8 +6968,8 @@ public class ByteVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6929,8 +6979,9 @@ public class ByteVector512Tests extends AbstractVectorTest { static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6939,7 +6990,7 @@ public class ByteVector512Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((byte)res, (byte)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6959,8 +7010,8 @@ public class ByteVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ByteVector64Tests.java b/test/jdk/jdk/incubator/vector/ByteVector64Tests.java index ce671440d2e..e8ff81678cd 100644 --- a/test/jdk/jdk/incubator/vector/ByteVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/ByteVector64Tests.java @@ -1574,6 +1574,59 @@ public class ByteVector64Tests extends AbstractVectorTest { return a >= b; } + static byte firstNonZero(byte a, byte b) { + return Byte.compare(a, (byte) 0) != 0 ? a : b; + } + + static byte scalar_or(byte a, byte b) { + return (byte)(a | b); + } + + static byte scalar_and(byte a, byte b) { + return (byte)(a & b); + } + + static byte scalar_xor(byte a, byte b) { + return (byte)(a ^ b); + } + + static byte scalar_add(byte a, byte b) { + return (byte)(a + b); + } + + static byte scalar_sub(byte a, byte b) { + return (byte)(a - b); + } + + static byte scalar_mul(byte a, byte b) { + return (byte)(a * b); + } + + static byte scalar_min(byte a, byte b) { + return (byte)(Math.min(a, b)); + } + + static byte scalar_max(byte a, byte b) { + return (byte)(Math.max(a, b)); + } + + static byte scalar_div(byte a, byte b) { + return (byte)(a / b); + } + + static byte scalar_fma(byte a, byte b, byte c) { + return (byte)(Math.fma(a, b, c)); + } + + static byte scalar_abs(byte a) { + return (byte)(Math.abs(a)); + } + + static byte scalar_neg(byte a) { + return ((byte)-a); + } + + static boolean ult(byte a, byte b) { return Byte.compareUnsigned(a, b) < 0; } @@ -1590,9 +1643,6 @@ public class ByteVector64Tests extends AbstractVectorTest { return Byte.compareUnsigned(a, b) >= 0; } - static byte firstNonZero(byte a, byte b) { - return Byte.compare(a, (byte) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1701,7 +1751,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte ADD(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1722,7 +1772,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte add(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1779,7 +1829,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte SUB(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1800,7 +1850,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte sub(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1857,7 +1907,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte MUL(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1878,7 +1928,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte mul(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -2025,7 +2075,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte FIRST_NONZERO(byte a, byte b) { - return (byte)((a)!=0?a:b); + return (byte)(firstNonZero(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3239,7 +3289,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte MIN(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3260,7 +3310,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte min(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3279,7 +3329,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte MAX(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3300,7 +3350,7 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte max(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3668,7 +3718,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ANDReduce(byte[] a, int idx) { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3677,7 +3727,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ANDReduceAll(byte[] a) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3695,7 +3745,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3708,20 +3758,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = AND_IDENTITY; - assertEquals((byte) (id & id), id, + assertEquals((byte) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id & x), x); - assertEquals((byte) (x & id), x); + assertEquals((byte) (scalar_and(id, x)), x); + assertEquals((byte) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id & x), x, + assertEquals((byte) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x & id), x, + assertEquals((byte) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3730,7 +3780,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3739,7 +3789,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ANDReduceAllMasked(byte[] a, boolean[] mask) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3759,7 +3809,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3770,7 +3820,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ORReduce(byte[] a, int idx) { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3779,7 +3829,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ORReduceAll(byte[] a) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3797,7 +3847,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3810,20 +3860,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = OR_IDENTITY; - assertEquals((byte) (id | id), id, + assertEquals((byte) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id | x), x); - assertEquals((byte) (x | id), x); + assertEquals((byte) (scalar_or(id, x)), x); + assertEquals((byte) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id | x), x, + assertEquals((byte) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x | id), x, + assertEquals((byte) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3832,7 +3882,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3841,7 +3891,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ORReduceAllMasked(byte[] a, boolean[] mask) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3861,7 +3911,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3872,7 +3922,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte XORReduce(byte[] a, int idx) { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3881,7 +3931,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte XORReduceAll(byte[] a) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3899,7 +3949,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3912,20 +3962,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = XOR_IDENTITY; - assertEquals((byte) (id ^ id), id, + assertEquals((byte) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id ^ x), x); - assertEquals((byte) (x ^ id), x); + assertEquals((byte) (scalar_xor(id, x)), x); + assertEquals((byte) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id ^ x), x, + assertEquals((byte) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x ^ id), x, + assertEquals((byte) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3934,7 +3984,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3943,7 +3993,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte XORReduceAllMasked(byte[] a, boolean[] mask) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3963,7 +4013,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3974,7 +4024,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ADDReduce(byte[] a, int idx) { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3983,7 +4033,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ADDReduceAll(byte[] a) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4001,7 +4051,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4014,20 +4064,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = ADD_IDENTITY; - assertEquals((byte) (id + id), id, + assertEquals((byte) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id + x), x); - assertEquals((byte) (x + id), x); + assertEquals((byte) (scalar_add(id, x)), x); + assertEquals((byte) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id + x), x, + assertEquals((byte) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x + id), x, + assertEquals((byte) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4036,7 +4086,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4045,7 +4095,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte ADDReduceAllMasked(byte[] a, boolean[] mask) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4065,7 +4115,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4076,7 +4126,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MULReduce(byte[] a, int idx) { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4085,7 +4135,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MULReduceAll(byte[] a) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4103,7 +4153,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4116,20 +4166,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MUL_IDENTITY; - assertEquals((byte) (id * id), id, + assertEquals((byte) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id * x), x); - assertEquals((byte) (x * id), x); + assertEquals((byte) (scalar_mul(id, x)), x); + assertEquals((byte) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id * x), x, + assertEquals((byte) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x * id), x, + assertEquals((byte) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4138,7 +4188,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4147,7 +4197,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MULReduceAllMasked(byte[] a, boolean[] mask) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4167,7 +4217,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4178,7 +4228,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MINReduce(byte[] a, int idx) { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4187,7 +4237,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MINReduceAll(byte[] a) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4205,7 +4255,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4218,20 +4268,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MIN_IDENTITY; - assertEquals((byte) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.min(id, x), x); - assertEquals((byte) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4240,7 +4290,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4249,7 +4299,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MINReduceAllMasked(byte[] a, boolean[] mask) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4269,7 +4319,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4280,7 +4330,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MAXReduce(byte[] a, int idx) { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4289,7 +4339,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MAXReduceAll(byte[] a) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4307,7 +4357,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4320,20 +4370,20 @@ public class ByteVector64Tests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MAX_IDENTITY; - assertEquals((byte) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.max(id, x), x); - assertEquals((byte) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4342,7 +4392,7 @@ public class ByteVector64Tests extends AbstractVectorTest { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4351,7 +4401,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static byte MAXReduceAllMasked(byte[] a, boolean[] mask) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4371,7 +4421,7 @@ public class ByteVector64Tests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5404,7 +5454,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5424,7 +5474,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5440,7 +5490,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (byte)((long)b[i]))); } } } @@ -5460,7 +5510,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (byte)((long)b[i])))); } } } @@ -5476,7 +5526,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5496,7 +5546,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5512,7 +5562,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (byte)((long)b[i]))); } } } @@ -5532,7 +5582,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (byte)((long)b[i])))); } } } @@ -6244,11 +6294,11 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte NEG(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } static byte neg(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6300,11 +6350,11 @@ public class ByteVector64Tests extends AbstractVectorTest { } static byte ABS(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } static byte abs(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6795,7 +6845,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6811,7 +6861,7 @@ public class ByteVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6891,7 +6941,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static long ADDReduceLong(byte[] a, int idx) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6900,7 +6950,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static long ADDReduceAllLong(byte[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((byte)res, (byte)ADDReduceLong(a, i)); } return res; @@ -6918,8 +6968,8 @@ public class ByteVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6929,8 +6979,9 @@ public class ByteVector64Tests extends AbstractVectorTest { static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6939,7 +6990,7 @@ public class ByteVector64Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((byte)res, (byte)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6959,8 +7010,8 @@ public class ByteVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java b/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java index c2d8188c090..c53710c3fdd 100644 --- a/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/ByteVectorMaxTests.java @@ -1580,6 +1580,59 @@ public class ByteVectorMaxTests extends AbstractVectorTest { return a >= b; } + static byte firstNonZero(byte a, byte b) { + return Byte.compare(a, (byte) 0) != 0 ? a : b; + } + + static byte scalar_or(byte a, byte b) { + return (byte)(a | b); + } + + static byte scalar_and(byte a, byte b) { + return (byte)(a & b); + } + + static byte scalar_xor(byte a, byte b) { + return (byte)(a ^ b); + } + + static byte scalar_add(byte a, byte b) { + return (byte)(a + b); + } + + static byte scalar_sub(byte a, byte b) { + return (byte)(a - b); + } + + static byte scalar_mul(byte a, byte b) { + return (byte)(a * b); + } + + static byte scalar_min(byte a, byte b) { + return (byte)(Math.min(a, b)); + } + + static byte scalar_max(byte a, byte b) { + return (byte)(Math.max(a, b)); + } + + static byte scalar_div(byte a, byte b) { + return (byte)(a / b); + } + + static byte scalar_fma(byte a, byte b, byte c) { + return (byte)(Math.fma(a, b, c)); + } + + static byte scalar_abs(byte a) { + return (byte)(Math.abs(a)); + } + + static byte scalar_neg(byte a) { + return ((byte)-a); + } + + static boolean ult(byte a, byte b) { return Byte.compareUnsigned(a, b) < 0; } @@ -1596,9 +1649,6 @@ public class ByteVectorMaxTests extends AbstractVectorTest { return Byte.compareUnsigned(a, b) >= 0; } - static byte firstNonZero(byte a, byte b) { - return Byte.compare(a, (byte) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1707,7 +1757,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte ADD(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1728,7 +1778,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte add(byte a, byte b) { - return (byte)(a + b); + return (byte)(scalar_add(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1785,7 +1835,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte SUB(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1806,7 +1856,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte sub(byte a, byte b) { - return (byte)(a - b); + return (byte)(scalar_sub(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1863,7 +1913,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte MUL(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -1884,7 +1934,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte mul(byte a, byte b) { - return (byte)(a * b); + return (byte)(scalar_mul(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -2031,7 +2081,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte FIRST_NONZERO(byte a, byte b) { - return (byte)((a)!=0?a:b); + return (byte)(firstNonZero(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3245,7 +3295,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte MIN(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3266,7 +3316,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte min(byte a, byte b) { - return (byte)(Math.min(a, b)); + return (byte)(scalar_min(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3285,7 +3335,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte MAX(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3306,7 +3356,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte max(byte a, byte b) { - return (byte)(Math.max(a, b)); + return (byte)(scalar_max(a, b)); } @Test(dataProvider = "byteBinaryOpProvider") @@ -3674,7 +3724,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ANDReduce(byte[] a, int idx) { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3683,7 +3733,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ANDReduceAll(byte[] a) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3701,7 +3751,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3714,20 +3764,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = AND_IDENTITY; - assertEquals((byte) (id & id), id, + assertEquals((byte) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id & x), x); - assertEquals((byte) (x & id), x); + assertEquals((byte) (scalar_and(id, x)), x); + assertEquals((byte) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id & x), x, + assertEquals((byte) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x & id), x, + assertEquals((byte) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3736,7 +3786,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3745,7 +3795,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ANDReduceAllMasked(byte[] a, boolean[] mask) { byte res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3765,7 +3815,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3776,7 +3826,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ORReduce(byte[] a, int idx) { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3785,7 +3835,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ORReduceAll(byte[] a) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3803,7 +3853,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3816,20 +3866,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = OR_IDENTITY; - assertEquals((byte) (id | id), id, + assertEquals((byte) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id | x), x); - assertEquals((byte) (x | id), x); + assertEquals((byte) (scalar_or(id, x)), x); + assertEquals((byte) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id | x), x, + assertEquals((byte) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x | id), x, + assertEquals((byte) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3838,7 +3888,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3847,7 +3897,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ORReduceAllMasked(byte[] a, boolean[] mask) { byte res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3867,7 +3917,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3878,7 +3928,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte XORReduce(byte[] a, int idx) { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3887,7 +3937,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte XORReduceAll(byte[] a) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3905,7 +3955,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3918,20 +3968,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = XOR_IDENTITY; - assertEquals((byte) (id ^ id), id, + assertEquals((byte) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id ^ x), x); - assertEquals((byte) (x ^ id), x); + assertEquals((byte) (scalar_xor(id, x)), x); + assertEquals((byte) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id ^ x), x, + assertEquals((byte) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x ^ id), x, + assertEquals((byte) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3940,7 +3990,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3949,7 +3999,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte XORReduceAllMasked(byte[] a, boolean[] mask) { byte res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3969,7 +4019,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3980,7 +4030,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ADDReduce(byte[] a, int idx) { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3989,7 +4039,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ADDReduceAll(byte[] a) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4007,7 +4057,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4020,20 +4070,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = ADD_IDENTITY; - assertEquals((byte) (id + id), id, + assertEquals((byte) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id + x), x); - assertEquals((byte) (x + id), x); + assertEquals((byte) (scalar_add(id, x)), x); + assertEquals((byte) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id + x), x, + assertEquals((byte) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x + id), x, + assertEquals((byte) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4042,7 +4092,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4051,7 +4101,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte ADDReduceAllMasked(byte[] a, boolean[] mask) { byte res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4071,7 +4121,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4082,7 +4132,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MULReduce(byte[] a, int idx) { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4091,7 +4141,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MULReduceAll(byte[] a) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4109,7 +4159,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4122,20 +4172,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MUL_IDENTITY; - assertEquals((byte) (id * id), id, + assertEquals((byte) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) (id * x), x); - assertEquals((byte) (x * id), x); + assertEquals((byte) (scalar_mul(id, x)), x); + assertEquals((byte) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((byte) (id * x), x, + assertEquals((byte) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((byte) (x * id), x, + assertEquals((byte) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4144,7 +4194,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4153,7 +4203,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MULReduceAllMasked(byte[] a, boolean[] mask) { byte res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4173,7 +4223,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4184,7 +4234,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MINReduce(byte[] a, int idx) { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4193,7 +4243,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MINReduceAll(byte[] a) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4211,7 +4261,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4224,20 +4274,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MIN_IDENTITY; - assertEquals((byte) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.min(id, x), x); - assertEquals((byte) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4246,7 +4296,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4255,7 +4305,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MINReduceAllMasked(byte[] a, boolean[] mask) { byte res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4275,7 +4325,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (byte) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4286,7 +4336,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MAXReduce(byte[] a, int idx) { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4295,7 +4345,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MAXReduceAll(byte[] a) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4313,7 +4363,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4326,20 +4376,20 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte[] a = fa.apply(SPECIES.length()); byte id = MAX_IDENTITY; - assertEquals((byte) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); byte x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((byte) Math.max(id, x), x); - assertEquals((byte) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((byte) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((byte) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4348,7 +4398,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { byte res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (byte) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4357,7 +4407,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static byte MAXReduceAllMasked(byte[] a, boolean[] mask) { byte res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (byte) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4377,7 +4427,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { ByteVector av = ByteVector.fromArray(SPECIES, a, i); byte v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (byte) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5410,7 +5460,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5430,7 +5480,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5446,7 +5496,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (byte)((long)b[i]))); } } } @@ -5466,7 +5516,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (byte)((long)b[i])))); } } } @@ -5482,7 +5532,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5502,7 +5552,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5518,7 +5568,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (byte)((long)b[i]))); } } } @@ -5538,7 +5588,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (byte)((long)b[i])))); } } } @@ -6250,11 +6300,11 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte NEG(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } static byte neg(byte a) { - return (byte)(-((byte)a)); + return (byte)(scalar_neg((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6306,11 +6356,11 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } static byte ABS(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } static byte abs(byte a) { - return (byte)(Math.abs((byte)a)); + return (byte)(scalar_abs((byte)a)); } @Test(dataProvider = "byteUnaryOpProvider") @@ -6801,7 +6851,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6817,7 +6867,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6897,7 +6947,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static long ADDReduceLong(byte[] a, int idx) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6906,7 +6956,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLong(byte[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((byte)res, (byte)ADDReduceLong(a, i)); } return res; @@ -6924,8 +6974,8 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6935,8 +6985,9 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) { byte res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6945,7 +6996,7 @@ public class ByteVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((byte)res, (byte)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6965,8 +7016,8 @@ public class ByteVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((byte)ra, (byte)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java index 7b4b587b142..1457e5a51ca 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector128Tests.java @@ -1584,6 +1584,205 @@ relativeError)); return Double.compare(a, (double) 0) != 0 ? a : b; } + + static double scalar_add(double a, double b) { + return (double)(a + b); + } + + static double scalar_sub(double a, double b) { + return (double)(a - b); + } + + static double scalar_mul(double a, double b) { + return (double)(a * b); + } + + static double scalar_min(double a, double b) { + return (double)(Math.min(a, b)); + } + + static double scalar_max(double a, double b) { + return (double)(Math.max(a, b)); + } + + static double scalar_div(double a, double b) { + return (double)(a / b); + } + + static double scalar_fma(double a, double b, double c) { + return (double)(Math.fma(a, b, c)); + } + + static double scalar_abs(double a) { + return (double)(Math.abs(a)); + } + + static double scalar_neg(double a) { + return ((double)-a); + } + + static double scalar_sin(double a) { + return (double)Math.sin((double)a); + } + + static double scalar_exp(double a) { + return (double)Math.exp((double)a); + } + + static double scalar_log1p(double a) { + return (double)Math.log1p((double)a); + } + + static double scalar_log(double a) { + return (double)Math.log((double)a); + } + + static double scalar_log10(double a) { + return (double)Math.log10((double)a); + } + + static double scalar_expm1(double a) { + return (double)Math.expm1((double)a); + } + + static double scalar_cos(double a) { + return (double)Math.cos((double)a); + } + + static double scalar_tan(double a) { + return (double)Math.tan((double)a); + } + + static double scalar_sinh(double a) { + return (double)Math.sinh((double)a); + } + + static double scalar_cosh(double a) { + return (double)Math.cosh((double)a); + } + + static double scalar_tanh(double a) { + return (double)Math.tanh((double)a); + } + + static double scalar_asin(double a) { + return (double)Math.asin((double)a); + } + + static double scalar_acos(double a) { + return (double)Math.acos((double)a); + } + + static double scalar_atan(double a) { + return (double)Math.atan((double)a); + } + + static double scalar_cbrt(double a) { + return (double)Math.cbrt((double)a); + } + + static double scalar_sqrt(double a) { + return (double)Math.sqrt((double)a); + } + + static double scalar_hypot(double a, double b) { + return (double)Math.hypot((double)a, (double)b); + } + + static double scalar_pow(double a, double b) { + return (double)Math.pow((double)a, (double)b); + } + + static double scalar_atan2(double a, double b) { + return (double)Math.atan2((double)a, (double)b); + } + + static double strict_scalar_sin(double a) { + return (double)StrictMath.sin((double)a); + } + + static double strict_scalar_exp(double a) { + return (double)StrictMath.exp((double)a); + } + + static double strict_scalar_log1p(double a) { + return (double)StrictMath.log1p((double)a); + } + + static double strict_scalar_log(double a) { + return (double)StrictMath.log((double)a); + } + + static double strict_scalar_log10(double a) { + return (double)StrictMath.log10((double)a); + } + + static double strict_scalar_expm1(double a) { + return (double)StrictMath.expm1((double)a); + } + + static double strict_scalar_cos(double a) { + return (double)StrictMath.cos((double)a); + } + + static double strict_scalar_tan(double a) { + return (double)StrictMath.tan((double)a); + } + + static double strict_scalar_sinh(double a) { + return (double)StrictMath.sinh((double)a); + } + + static double strict_scalar_cosh(double a) { + return (double)StrictMath.cosh((double)a); + } + + static double strict_scalar_tanh(double a) { + return (double)StrictMath.tanh((double)a); + } + + static double strict_scalar_asin(double a) { + return (double)StrictMath.asin((double)a); + } + + static double strict_scalar_acos(double a) { + return (double)StrictMath.acos((double)a); + } + + static double strict_scalar_atan(double a) { + return (double)StrictMath.atan((double)a); + } + + static double strict_scalar_cbrt(double a) { + return (double)StrictMath.cbrt((double)a); + } + + static double strict_scalar_sqrt(double a) { + return (double)StrictMath.sqrt((double)a); + } + + static double strict_scalar_hypot(double a, double b) { + return (double)StrictMath.hypot((double)a, (double)b); + } + + static double strict_scalar_pow(double a, double b) { + return (double)StrictMath.pow((double)a, (double)b); + } + + static double strict_scalar_atan2(double a, double b) { + return (double)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(double a) { + return Double.isNaN(a); + } + static boolean isFinite(double a) { + return Double.isFinite(a); + } + static boolean isInfinite(double a) { + return Double.isInfinite(a); + } + @Test static void smokeTest1() { DoubleVector three = DoubleVector.broadcast(SPECIES, (byte)-3); @@ -1677,7 +1876,7 @@ relativeError)); } static double ADD(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1698,7 +1897,7 @@ relativeError)); } static double add(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1755,7 +1954,7 @@ relativeError)); } static double SUB(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1776,7 +1975,7 @@ relativeError)); } static double sub(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1833,7 +2032,7 @@ relativeError)); } static double MUL(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1854,7 +2053,7 @@ relativeError)); } static double mul(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1911,7 +2110,7 @@ relativeError)); } static double DIV(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1932,7 +2131,7 @@ relativeError)); } static double div(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1989,7 +2188,7 @@ relativeError)); } static double FIRST_NONZERO(double a, double b) { - return (double)(Double.doubleToLongBits(a)!=0?a:b); + return (double)(firstNonZero(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2291,7 +2490,7 @@ relativeError)); } static double MIN(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2312,7 +2511,7 @@ relativeError)); } static double min(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2331,7 +2530,7 @@ relativeError)); } static double MAX(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2352,7 +2551,7 @@ relativeError)); } static double max(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2429,7 +2628,7 @@ relativeError)); static double ADDReduce(double[] a, int idx) { double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2438,7 +2637,7 @@ relativeError)); static double ADDReduceAll(double[] a) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2456,7 +2655,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2469,20 +2668,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = ADD_IDENTITY; - assertEquals((double) (id + id), id, + assertEquals((double) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id + x), x); - assertEquals((double) (x + id), x); + assertEquals((double) (scalar_add(id, x)), x); + assertEquals((double) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id + x), x, + assertEquals((double) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x + id), x, + assertEquals((double) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2491,7 +2690,7 @@ relativeError)); double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2500,7 +2699,7 @@ relativeError)); static double ADDReduceAllMasked(double[] a, boolean[] mask) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2520,7 +2719,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2531,7 +2730,7 @@ relativeError)); static double MULReduce(double[] a, int idx) { double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2540,7 +2739,7 @@ relativeError)); static double MULReduceAll(double[] a) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2558,7 +2757,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2571,20 +2770,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MUL_IDENTITY; - assertEquals((double) (id * id), id, + assertEquals((double) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id * x), x); - assertEquals((double) (x * id), x); + assertEquals((double) (scalar_mul(id, x)), x); + assertEquals((double) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id * x), x, + assertEquals((double) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x * id), x, + assertEquals((double) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2593,7 +2792,7 @@ relativeError)); double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2602,7 +2801,7 @@ relativeError)); static double MULReduceAllMasked(double[] a, boolean[] mask) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2622,7 +2821,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2633,7 +2832,7 @@ relativeError)); static double MINReduce(double[] a, int idx) { double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2642,7 +2841,7 @@ relativeError)); static double MINReduceAll(double[] a) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2660,7 +2859,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2673,20 +2872,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MIN_IDENTITY; - assertEquals((double) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.min(id, x), x); - assertEquals((double) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2695,7 +2894,7 @@ relativeError)); double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2704,7 +2903,7 @@ relativeError)); static double MINReduceAllMasked(double[] a, boolean[] mask) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2724,7 +2923,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2735,7 +2934,7 @@ relativeError)); static double MAXReduce(double[] a, int idx) { double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2744,7 +2943,7 @@ relativeError)); static double MAXReduceAll(double[] a) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2762,7 +2961,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2775,20 +2974,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MAX_IDENTITY; - assertEquals((double) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.max(id, x), x); - assertEquals((double) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2797,7 +2996,7 @@ relativeError)); double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2806,7 +3005,7 @@ relativeError)); static double MAXReduceAllMasked(double[] a, boolean[] mask) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2826,7 +3025,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3038,7 +3237,7 @@ relativeError)); } static boolean testIS_FINITE(double a) { - return Double.isFinite(a); + return isFinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3079,7 +3278,7 @@ relativeError)); } static boolean testIS_NAN(double a) { - return Double.isNaN(a); + return isNaN(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3120,7 +3319,7 @@ relativeError)); } static boolean testIS_INFINITE(double a) { - return Double.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3461,7 +3660,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3481,7 +3680,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3497,7 +3696,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (double)((long)b[i]))); } } } @@ -3517,7 +3716,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (double)((long)b[i])))); } } } @@ -3533,7 +3732,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3553,7 +3752,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3569,7 +3768,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (double)((long)b[i]))); } } } @@ -3589,7 +3788,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (double)((long)b[i])))); } } } @@ -4089,11 +4288,11 @@ relativeError)); } static double SIN(double a) { - return (double)(Math.sin((double)a)); + return (double)(scalar_sin(a)); } static double strictSIN(double a) { - return (double)(StrictMath.sin((double)a)); + return (double)(strict_scalar_sin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4112,11 +4311,11 @@ relativeError)); } static double EXP(double a) { - return (double)(Math.exp((double)a)); + return (double)(scalar_exp(a)); } static double strictEXP(double a) { - return (double)(StrictMath.exp((double)a)); + return (double)(strict_scalar_exp(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4135,11 +4334,11 @@ relativeError)); } static double LOG1P(double a) { - return (double)(Math.log1p((double)a)); + return (double)(scalar_log1p(a)); } static double strictLOG1P(double a) { - return (double)(StrictMath.log1p((double)a)); + return (double)(strict_scalar_log1p(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4158,11 +4357,11 @@ relativeError)); } static double LOG(double a) { - return (double)(Math.log((double)a)); + return (double)(scalar_log(a)); } static double strictLOG(double a) { - return (double)(StrictMath.log((double)a)); + return (double)(strict_scalar_log(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4181,11 +4380,11 @@ relativeError)); } static double LOG10(double a) { - return (double)(Math.log10((double)a)); + return (double)(scalar_log10(a)); } static double strictLOG10(double a) { - return (double)(StrictMath.log10((double)a)); + return (double)(strict_scalar_log10(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4204,11 +4403,11 @@ relativeError)); } static double EXPM1(double a) { - return (double)(Math.expm1((double)a)); + return (double)(scalar_expm1(a)); } static double strictEXPM1(double a) { - return (double)(StrictMath.expm1((double)a)); + return (double)(strict_scalar_expm1(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4227,11 +4426,11 @@ relativeError)); } static double COS(double a) { - return (double)(Math.cos((double)a)); + return (double)(scalar_cos(a)); } static double strictCOS(double a) { - return (double)(StrictMath.cos((double)a)); + return (double)(strict_scalar_cos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4250,11 +4449,11 @@ relativeError)); } static double TAN(double a) { - return (double)(Math.tan((double)a)); + return (double)(scalar_tan(a)); } static double strictTAN(double a) { - return (double)(StrictMath.tan((double)a)); + return (double)(strict_scalar_tan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4273,11 +4472,11 @@ relativeError)); } static double SINH(double a) { - return (double)(Math.sinh((double)a)); + return (double)(scalar_sinh(a)); } static double strictSINH(double a) { - return (double)(StrictMath.sinh((double)a)); + return (double)(strict_scalar_sinh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4296,11 +4495,11 @@ relativeError)); } static double COSH(double a) { - return (double)(Math.cosh((double)a)); + return (double)(scalar_cosh(a)); } static double strictCOSH(double a) { - return (double)(StrictMath.cosh((double)a)); + return (double)(strict_scalar_cosh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4319,11 +4518,11 @@ relativeError)); } static double TANH(double a) { - return (double)(Math.tanh((double)a)); + return (double)(scalar_tanh(a)); } static double strictTANH(double a) { - return (double)(StrictMath.tanh((double)a)); + return (double)(strict_scalar_tanh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4342,11 +4541,11 @@ relativeError)); } static double ASIN(double a) { - return (double)(Math.asin((double)a)); + return (double)(scalar_asin(a)); } static double strictASIN(double a) { - return (double)(StrictMath.asin((double)a)); + return (double)(strict_scalar_asin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4365,11 +4564,11 @@ relativeError)); } static double ACOS(double a) { - return (double)(Math.acos((double)a)); + return (double)(scalar_acos(a)); } static double strictACOS(double a) { - return (double)(StrictMath.acos((double)a)); + return (double)(strict_scalar_acos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4388,11 +4587,11 @@ relativeError)); } static double ATAN(double a) { - return (double)(Math.atan((double)a)); + return (double)(scalar_atan(a)); } static double strictATAN(double a) { - return (double)(StrictMath.atan((double)a)); + return (double)(strict_scalar_atan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4411,11 +4610,11 @@ relativeError)); } static double CBRT(double a) { - return (double)(Math.cbrt((double)a)); + return (double)(scalar_cbrt(a)); } static double strictCBRT(double a) { - return (double)(StrictMath.cbrt((double)a)); + return (double)(strict_scalar_cbrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4434,11 +4633,11 @@ relativeError)); } static double HYPOT(double a, double b) { - return (double)(Math.hypot((double)a, (double)b)); + return (double)(scalar_hypot(a, b)); } static double strictHYPOT(double a, double b) { - return (double)(StrictMath.hypot((double)a, (double)b)); + return (double)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4460,11 +4659,11 @@ relativeError)); static double POW(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictPOW(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4486,11 +4685,11 @@ relativeError)); static double pow(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictpow(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4512,11 +4711,11 @@ relativeError)); static double ATAN2(double a, double b) { - return (double)(Math.atan2((double)a, (double)b)); + return (double)(scalar_atan2(a, b)); } static double strictATAN2(double a, double b) { - return (double)(StrictMath.atan2((double)a, (double)b)); + return (double)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4568,11 +4767,11 @@ relativeError)); static double FMA(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } static double fma(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } @Test(dataProvider = "doubleTernaryOpProvider") @@ -4792,11 +4991,11 @@ relativeError)); } static double NEG(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } static double neg(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4848,11 +5047,11 @@ relativeError)); } static double ABS(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } static double abs(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4904,11 +5103,11 @@ relativeError)); } static double SQRT(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } static double sqrt(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -5121,7 +5320,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5137,7 +5336,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5196,7 +5395,7 @@ relativeError)); static long ADDReduceLong(double[] a, int idx) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5205,7 +5404,7 @@ relativeError)); static long ADDReduceAllLong(double[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((double)res, (double)ADDReduceLong(a, i)); } return res; @@ -5223,8 +5422,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5234,8 +5433,9 @@ relativeError)); static long ADDReduceLongMasked(double[] a, int idx, boolean[] mask) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5244,7 +5444,7 @@ relativeError)); static long ADDReduceAllLongMasked(double[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((double)res, (double)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5264,8 +5464,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java index 4d650d7b407..e417abe52e6 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector256Tests.java @@ -1584,6 +1584,205 @@ relativeError)); return Double.compare(a, (double) 0) != 0 ? a : b; } + + static double scalar_add(double a, double b) { + return (double)(a + b); + } + + static double scalar_sub(double a, double b) { + return (double)(a - b); + } + + static double scalar_mul(double a, double b) { + return (double)(a * b); + } + + static double scalar_min(double a, double b) { + return (double)(Math.min(a, b)); + } + + static double scalar_max(double a, double b) { + return (double)(Math.max(a, b)); + } + + static double scalar_div(double a, double b) { + return (double)(a / b); + } + + static double scalar_fma(double a, double b, double c) { + return (double)(Math.fma(a, b, c)); + } + + static double scalar_abs(double a) { + return (double)(Math.abs(a)); + } + + static double scalar_neg(double a) { + return ((double)-a); + } + + static double scalar_sin(double a) { + return (double)Math.sin((double)a); + } + + static double scalar_exp(double a) { + return (double)Math.exp((double)a); + } + + static double scalar_log1p(double a) { + return (double)Math.log1p((double)a); + } + + static double scalar_log(double a) { + return (double)Math.log((double)a); + } + + static double scalar_log10(double a) { + return (double)Math.log10((double)a); + } + + static double scalar_expm1(double a) { + return (double)Math.expm1((double)a); + } + + static double scalar_cos(double a) { + return (double)Math.cos((double)a); + } + + static double scalar_tan(double a) { + return (double)Math.tan((double)a); + } + + static double scalar_sinh(double a) { + return (double)Math.sinh((double)a); + } + + static double scalar_cosh(double a) { + return (double)Math.cosh((double)a); + } + + static double scalar_tanh(double a) { + return (double)Math.tanh((double)a); + } + + static double scalar_asin(double a) { + return (double)Math.asin((double)a); + } + + static double scalar_acos(double a) { + return (double)Math.acos((double)a); + } + + static double scalar_atan(double a) { + return (double)Math.atan((double)a); + } + + static double scalar_cbrt(double a) { + return (double)Math.cbrt((double)a); + } + + static double scalar_sqrt(double a) { + return (double)Math.sqrt((double)a); + } + + static double scalar_hypot(double a, double b) { + return (double)Math.hypot((double)a, (double)b); + } + + static double scalar_pow(double a, double b) { + return (double)Math.pow((double)a, (double)b); + } + + static double scalar_atan2(double a, double b) { + return (double)Math.atan2((double)a, (double)b); + } + + static double strict_scalar_sin(double a) { + return (double)StrictMath.sin((double)a); + } + + static double strict_scalar_exp(double a) { + return (double)StrictMath.exp((double)a); + } + + static double strict_scalar_log1p(double a) { + return (double)StrictMath.log1p((double)a); + } + + static double strict_scalar_log(double a) { + return (double)StrictMath.log((double)a); + } + + static double strict_scalar_log10(double a) { + return (double)StrictMath.log10((double)a); + } + + static double strict_scalar_expm1(double a) { + return (double)StrictMath.expm1((double)a); + } + + static double strict_scalar_cos(double a) { + return (double)StrictMath.cos((double)a); + } + + static double strict_scalar_tan(double a) { + return (double)StrictMath.tan((double)a); + } + + static double strict_scalar_sinh(double a) { + return (double)StrictMath.sinh((double)a); + } + + static double strict_scalar_cosh(double a) { + return (double)StrictMath.cosh((double)a); + } + + static double strict_scalar_tanh(double a) { + return (double)StrictMath.tanh((double)a); + } + + static double strict_scalar_asin(double a) { + return (double)StrictMath.asin((double)a); + } + + static double strict_scalar_acos(double a) { + return (double)StrictMath.acos((double)a); + } + + static double strict_scalar_atan(double a) { + return (double)StrictMath.atan((double)a); + } + + static double strict_scalar_cbrt(double a) { + return (double)StrictMath.cbrt((double)a); + } + + static double strict_scalar_sqrt(double a) { + return (double)StrictMath.sqrt((double)a); + } + + static double strict_scalar_hypot(double a, double b) { + return (double)StrictMath.hypot((double)a, (double)b); + } + + static double strict_scalar_pow(double a, double b) { + return (double)StrictMath.pow((double)a, (double)b); + } + + static double strict_scalar_atan2(double a, double b) { + return (double)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(double a) { + return Double.isNaN(a); + } + static boolean isFinite(double a) { + return Double.isFinite(a); + } + static boolean isInfinite(double a) { + return Double.isInfinite(a); + } + @Test static void smokeTest1() { DoubleVector three = DoubleVector.broadcast(SPECIES, (byte)-3); @@ -1677,7 +1876,7 @@ relativeError)); } static double ADD(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1698,7 +1897,7 @@ relativeError)); } static double add(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1755,7 +1954,7 @@ relativeError)); } static double SUB(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1776,7 +1975,7 @@ relativeError)); } static double sub(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1833,7 +2032,7 @@ relativeError)); } static double MUL(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1854,7 +2053,7 @@ relativeError)); } static double mul(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1911,7 +2110,7 @@ relativeError)); } static double DIV(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1932,7 +2131,7 @@ relativeError)); } static double div(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1989,7 +2188,7 @@ relativeError)); } static double FIRST_NONZERO(double a, double b) { - return (double)(Double.doubleToLongBits(a)!=0?a:b); + return (double)(firstNonZero(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2291,7 +2490,7 @@ relativeError)); } static double MIN(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2312,7 +2511,7 @@ relativeError)); } static double min(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2331,7 +2530,7 @@ relativeError)); } static double MAX(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2352,7 +2551,7 @@ relativeError)); } static double max(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2429,7 +2628,7 @@ relativeError)); static double ADDReduce(double[] a, int idx) { double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2438,7 +2637,7 @@ relativeError)); static double ADDReduceAll(double[] a) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2456,7 +2655,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2469,20 +2668,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = ADD_IDENTITY; - assertEquals((double) (id + id), id, + assertEquals((double) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id + x), x); - assertEquals((double) (x + id), x); + assertEquals((double) (scalar_add(id, x)), x); + assertEquals((double) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id + x), x, + assertEquals((double) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x + id), x, + assertEquals((double) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2491,7 +2690,7 @@ relativeError)); double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2500,7 +2699,7 @@ relativeError)); static double ADDReduceAllMasked(double[] a, boolean[] mask) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2520,7 +2719,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2531,7 +2730,7 @@ relativeError)); static double MULReduce(double[] a, int idx) { double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2540,7 +2739,7 @@ relativeError)); static double MULReduceAll(double[] a) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2558,7 +2757,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2571,20 +2770,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MUL_IDENTITY; - assertEquals((double) (id * id), id, + assertEquals((double) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id * x), x); - assertEquals((double) (x * id), x); + assertEquals((double) (scalar_mul(id, x)), x); + assertEquals((double) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id * x), x, + assertEquals((double) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x * id), x, + assertEquals((double) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2593,7 +2792,7 @@ relativeError)); double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2602,7 +2801,7 @@ relativeError)); static double MULReduceAllMasked(double[] a, boolean[] mask) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2622,7 +2821,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2633,7 +2832,7 @@ relativeError)); static double MINReduce(double[] a, int idx) { double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2642,7 +2841,7 @@ relativeError)); static double MINReduceAll(double[] a) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2660,7 +2859,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2673,20 +2872,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MIN_IDENTITY; - assertEquals((double) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.min(id, x), x); - assertEquals((double) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2695,7 +2894,7 @@ relativeError)); double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2704,7 +2903,7 @@ relativeError)); static double MINReduceAllMasked(double[] a, boolean[] mask) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2724,7 +2923,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2735,7 +2934,7 @@ relativeError)); static double MAXReduce(double[] a, int idx) { double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2744,7 +2943,7 @@ relativeError)); static double MAXReduceAll(double[] a) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2762,7 +2961,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2775,20 +2974,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MAX_IDENTITY; - assertEquals((double) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.max(id, x), x); - assertEquals((double) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2797,7 +2996,7 @@ relativeError)); double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2806,7 +3005,7 @@ relativeError)); static double MAXReduceAllMasked(double[] a, boolean[] mask) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2826,7 +3025,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3038,7 +3237,7 @@ relativeError)); } static boolean testIS_FINITE(double a) { - return Double.isFinite(a); + return isFinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3079,7 +3278,7 @@ relativeError)); } static boolean testIS_NAN(double a) { - return Double.isNaN(a); + return isNaN(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3120,7 +3319,7 @@ relativeError)); } static boolean testIS_INFINITE(double a) { - return Double.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3461,7 +3660,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3481,7 +3680,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3497,7 +3696,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (double)((long)b[i]))); } } } @@ -3517,7 +3716,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (double)((long)b[i])))); } } } @@ -3533,7 +3732,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3553,7 +3752,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3569,7 +3768,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (double)((long)b[i]))); } } } @@ -3589,7 +3788,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (double)((long)b[i])))); } } } @@ -4089,11 +4288,11 @@ relativeError)); } static double SIN(double a) { - return (double)(Math.sin((double)a)); + return (double)(scalar_sin(a)); } static double strictSIN(double a) { - return (double)(StrictMath.sin((double)a)); + return (double)(strict_scalar_sin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4112,11 +4311,11 @@ relativeError)); } static double EXP(double a) { - return (double)(Math.exp((double)a)); + return (double)(scalar_exp(a)); } static double strictEXP(double a) { - return (double)(StrictMath.exp((double)a)); + return (double)(strict_scalar_exp(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4135,11 +4334,11 @@ relativeError)); } static double LOG1P(double a) { - return (double)(Math.log1p((double)a)); + return (double)(scalar_log1p(a)); } static double strictLOG1P(double a) { - return (double)(StrictMath.log1p((double)a)); + return (double)(strict_scalar_log1p(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4158,11 +4357,11 @@ relativeError)); } static double LOG(double a) { - return (double)(Math.log((double)a)); + return (double)(scalar_log(a)); } static double strictLOG(double a) { - return (double)(StrictMath.log((double)a)); + return (double)(strict_scalar_log(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4181,11 +4380,11 @@ relativeError)); } static double LOG10(double a) { - return (double)(Math.log10((double)a)); + return (double)(scalar_log10(a)); } static double strictLOG10(double a) { - return (double)(StrictMath.log10((double)a)); + return (double)(strict_scalar_log10(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4204,11 +4403,11 @@ relativeError)); } static double EXPM1(double a) { - return (double)(Math.expm1((double)a)); + return (double)(scalar_expm1(a)); } static double strictEXPM1(double a) { - return (double)(StrictMath.expm1((double)a)); + return (double)(strict_scalar_expm1(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4227,11 +4426,11 @@ relativeError)); } static double COS(double a) { - return (double)(Math.cos((double)a)); + return (double)(scalar_cos(a)); } static double strictCOS(double a) { - return (double)(StrictMath.cos((double)a)); + return (double)(strict_scalar_cos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4250,11 +4449,11 @@ relativeError)); } static double TAN(double a) { - return (double)(Math.tan((double)a)); + return (double)(scalar_tan(a)); } static double strictTAN(double a) { - return (double)(StrictMath.tan((double)a)); + return (double)(strict_scalar_tan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4273,11 +4472,11 @@ relativeError)); } static double SINH(double a) { - return (double)(Math.sinh((double)a)); + return (double)(scalar_sinh(a)); } static double strictSINH(double a) { - return (double)(StrictMath.sinh((double)a)); + return (double)(strict_scalar_sinh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4296,11 +4495,11 @@ relativeError)); } static double COSH(double a) { - return (double)(Math.cosh((double)a)); + return (double)(scalar_cosh(a)); } static double strictCOSH(double a) { - return (double)(StrictMath.cosh((double)a)); + return (double)(strict_scalar_cosh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4319,11 +4518,11 @@ relativeError)); } static double TANH(double a) { - return (double)(Math.tanh((double)a)); + return (double)(scalar_tanh(a)); } static double strictTANH(double a) { - return (double)(StrictMath.tanh((double)a)); + return (double)(strict_scalar_tanh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4342,11 +4541,11 @@ relativeError)); } static double ASIN(double a) { - return (double)(Math.asin((double)a)); + return (double)(scalar_asin(a)); } static double strictASIN(double a) { - return (double)(StrictMath.asin((double)a)); + return (double)(strict_scalar_asin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4365,11 +4564,11 @@ relativeError)); } static double ACOS(double a) { - return (double)(Math.acos((double)a)); + return (double)(scalar_acos(a)); } static double strictACOS(double a) { - return (double)(StrictMath.acos((double)a)); + return (double)(strict_scalar_acos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4388,11 +4587,11 @@ relativeError)); } static double ATAN(double a) { - return (double)(Math.atan((double)a)); + return (double)(scalar_atan(a)); } static double strictATAN(double a) { - return (double)(StrictMath.atan((double)a)); + return (double)(strict_scalar_atan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4411,11 +4610,11 @@ relativeError)); } static double CBRT(double a) { - return (double)(Math.cbrt((double)a)); + return (double)(scalar_cbrt(a)); } static double strictCBRT(double a) { - return (double)(StrictMath.cbrt((double)a)); + return (double)(strict_scalar_cbrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4434,11 +4633,11 @@ relativeError)); } static double HYPOT(double a, double b) { - return (double)(Math.hypot((double)a, (double)b)); + return (double)(scalar_hypot(a, b)); } static double strictHYPOT(double a, double b) { - return (double)(StrictMath.hypot((double)a, (double)b)); + return (double)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4460,11 +4659,11 @@ relativeError)); static double POW(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictPOW(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4486,11 +4685,11 @@ relativeError)); static double pow(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictpow(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4512,11 +4711,11 @@ relativeError)); static double ATAN2(double a, double b) { - return (double)(Math.atan2((double)a, (double)b)); + return (double)(scalar_atan2(a, b)); } static double strictATAN2(double a, double b) { - return (double)(StrictMath.atan2((double)a, (double)b)); + return (double)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4568,11 +4767,11 @@ relativeError)); static double FMA(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } static double fma(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } @Test(dataProvider = "doubleTernaryOpProvider") @@ -4792,11 +4991,11 @@ relativeError)); } static double NEG(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } static double neg(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4848,11 +5047,11 @@ relativeError)); } static double ABS(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } static double abs(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4904,11 +5103,11 @@ relativeError)); } static double SQRT(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } static double sqrt(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -5121,7 +5320,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5137,7 +5336,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5196,7 +5395,7 @@ relativeError)); static long ADDReduceLong(double[] a, int idx) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5205,7 +5404,7 @@ relativeError)); static long ADDReduceAllLong(double[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((double)res, (double)ADDReduceLong(a, i)); } return res; @@ -5223,8 +5422,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5234,8 +5433,9 @@ relativeError)); static long ADDReduceLongMasked(double[] a, int idx, boolean[] mask) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5244,7 +5444,7 @@ relativeError)); static long ADDReduceAllLongMasked(double[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((double)res, (double)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5264,8 +5464,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java index 534470e194c..d23b2bf1511 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector512Tests.java @@ -1584,6 +1584,205 @@ relativeError)); return Double.compare(a, (double) 0) != 0 ? a : b; } + + static double scalar_add(double a, double b) { + return (double)(a + b); + } + + static double scalar_sub(double a, double b) { + return (double)(a - b); + } + + static double scalar_mul(double a, double b) { + return (double)(a * b); + } + + static double scalar_min(double a, double b) { + return (double)(Math.min(a, b)); + } + + static double scalar_max(double a, double b) { + return (double)(Math.max(a, b)); + } + + static double scalar_div(double a, double b) { + return (double)(a / b); + } + + static double scalar_fma(double a, double b, double c) { + return (double)(Math.fma(a, b, c)); + } + + static double scalar_abs(double a) { + return (double)(Math.abs(a)); + } + + static double scalar_neg(double a) { + return ((double)-a); + } + + static double scalar_sin(double a) { + return (double)Math.sin((double)a); + } + + static double scalar_exp(double a) { + return (double)Math.exp((double)a); + } + + static double scalar_log1p(double a) { + return (double)Math.log1p((double)a); + } + + static double scalar_log(double a) { + return (double)Math.log((double)a); + } + + static double scalar_log10(double a) { + return (double)Math.log10((double)a); + } + + static double scalar_expm1(double a) { + return (double)Math.expm1((double)a); + } + + static double scalar_cos(double a) { + return (double)Math.cos((double)a); + } + + static double scalar_tan(double a) { + return (double)Math.tan((double)a); + } + + static double scalar_sinh(double a) { + return (double)Math.sinh((double)a); + } + + static double scalar_cosh(double a) { + return (double)Math.cosh((double)a); + } + + static double scalar_tanh(double a) { + return (double)Math.tanh((double)a); + } + + static double scalar_asin(double a) { + return (double)Math.asin((double)a); + } + + static double scalar_acos(double a) { + return (double)Math.acos((double)a); + } + + static double scalar_atan(double a) { + return (double)Math.atan((double)a); + } + + static double scalar_cbrt(double a) { + return (double)Math.cbrt((double)a); + } + + static double scalar_sqrt(double a) { + return (double)Math.sqrt((double)a); + } + + static double scalar_hypot(double a, double b) { + return (double)Math.hypot((double)a, (double)b); + } + + static double scalar_pow(double a, double b) { + return (double)Math.pow((double)a, (double)b); + } + + static double scalar_atan2(double a, double b) { + return (double)Math.atan2((double)a, (double)b); + } + + static double strict_scalar_sin(double a) { + return (double)StrictMath.sin((double)a); + } + + static double strict_scalar_exp(double a) { + return (double)StrictMath.exp((double)a); + } + + static double strict_scalar_log1p(double a) { + return (double)StrictMath.log1p((double)a); + } + + static double strict_scalar_log(double a) { + return (double)StrictMath.log((double)a); + } + + static double strict_scalar_log10(double a) { + return (double)StrictMath.log10((double)a); + } + + static double strict_scalar_expm1(double a) { + return (double)StrictMath.expm1((double)a); + } + + static double strict_scalar_cos(double a) { + return (double)StrictMath.cos((double)a); + } + + static double strict_scalar_tan(double a) { + return (double)StrictMath.tan((double)a); + } + + static double strict_scalar_sinh(double a) { + return (double)StrictMath.sinh((double)a); + } + + static double strict_scalar_cosh(double a) { + return (double)StrictMath.cosh((double)a); + } + + static double strict_scalar_tanh(double a) { + return (double)StrictMath.tanh((double)a); + } + + static double strict_scalar_asin(double a) { + return (double)StrictMath.asin((double)a); + } + + static double strict_scalar_acos(double a) { + return (double)StrictMath.acos((double)a); + } + + static double strict_scalar_atan(double a) { + return (double)StrictMath.atan((double)a); + } + + static double strict_scalar_cbrt(double a) { + return (double)StrictMath.cbrt((double)a); + } + + static double strict_scalar_sqrt(double a) { + return (double)StrictMath.sqrt((double)a); + } + + static double strict_scalar_hypot(double a, double b) { + return (double)StrictMath.hypot((double)a, (double)b); + } + + static double strict_scalar_pow(double a, double b) { + return (double)StrictMath.pow((double)a, (double)b); + } + + static double strict_scalar_atan2(double a, double b) { + return (double)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(double a) { + return Double.isNaN(a); + } + static boolean isFinite(double a) { + return Double.isFinite(a); + } + static boolean isInfinite(double a) { + return Double.isInfinite(a); + } + @Test static void smokeTest1() { DoubleVector three = DoubleVector.broadcast(SPECIES, (byte)-3); @@ -1677,7 +1876,7 @@ relativeError)); } static double ADD(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1698,7 +1897,7 @@ relativeError)); } static double add(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1755,7 +1954,7 @@ relativeError)); } static double SUB(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1776,7 +1975,7 @@ relativeError)); } static double sub(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1833,7 +2032,7 @@ relativeError)); } static double MUL(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1854,7 +2053,7 @@ relativeError)); } static double mul(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1911,7 +2110,7 @@ relativeError)); } static double DIV(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1932,7 +2131,7 @@ relativeError)); } static double div(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1989,7 +2188,7 @@ relativeError)); } static double FIRST_NONZERO(double a, double b) { - return (double)(Double.doubleToLongBits(a)!=0?a:b); + return (double)(firstNonZero(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2291,7 +2490,7 @@ relativeError)); } static double MIN(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2312,7 +2511,7 @@ relativeError)); } static double min(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2331,7 +2530,7 @@ relativeError)); } static double MAX(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2352,7 +2551,7 @@ relativeError)); } static double max(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2429,7 +2628,7 @@ relativeError)); static double ADDReduce(double[] a, int idx) { double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2438,7 +2637,7 @@ relativeError)); static double ADDReduceAll(double[] a) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2456,7 +2655,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2469,20 +2668,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = ADD_IDENTITY; - assertEquals((double) (id + id), id, + assertEquals((double) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id + x), x); - assertEquals((double) (x + id), x); + assertEquals((double) (scalar_add(id, x)), x); + assertEquals((double) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id + x), x, + assertEquals((double) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x + id), x, + assertEquals((double) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2491,7 +2690,7 @@ relativeError)); double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2500,7 +2699,7 @@ relativeError)); static double ADDReduceAllMasked(double[] a, boolean[] mask) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2520,7 +2719,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2531,7 +2730,7 @@ relativeError)); static double MULReduce(double[] a, int idx) { double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2540,7 +2739,7 @@ relativeError)); static double MULReduceAll(double[] a) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2558,7 +2757,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2571,20 +2770,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MUL_IDENTITY; - assertEquals((double) (id * id), id, + assertEquals((double) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id * x), x); - assertEquals((double) (x * id), x); + assertEquals((double) (scalar_mul(id, x)), x); + assertEquals((double) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id * x), x, + assertEquals((double) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x * id), x, + assertEquals((double) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2593,7 +2792,7 @@ relativeError)); double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2602,7 +2801,7 @@ relativeError)); static double MULReduceAllMasked(double[] a, boolean[] mask) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2622,7 +2821,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2633,7 +2832,7 @@ relativeError)); static double MINReduce(double[] a, int idx) { double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2642,7 +2841,7 @@ relativeError)); static double MINReduceAll(double[] a) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2660,7 +2859,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2673,20 +2872,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MIN_IDENTITY; - assertEquals((double) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.min(id, x), x); - assertEquals((double) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2695,7 +2894,7 @@ relativeError)); double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2704,7 +2903,7 @@ relativeError)); static double MINReduceAllMasked(double[] a, boolean[] mask) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2724,7 +2923,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2735,7 +2934,7 @@ relativeError)); static double MAXReduce(double[] a, int idx) { double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2744,7 +2943,7 @@ relativeError)); static double MAXReduceAll(double[] a) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2762,7 +2961,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2775,20 +2974,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MAX_IDENTITY; - assertEquals((double) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.max(id, x), x); - assertEquals((double) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2797,7 +2996,7 @@ relativeError)); double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2806,7 +3005,7 @@ relativeError)); static double MAXReduceAllMasked(double[] a, boolean[] mask) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2826,7 +3025,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3038,7 +3237,7 @@ relativeError)); } static boolean testIS_FINITE(double a) { - return Double.isFinite(a); + return isFinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3079,7 +3278,7 @@ relativeError)); } static boolean testIS_NAN(double a) { - return Double.isNaN(a); + return isNaN(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3120,7 +3319,7 @@ relativeError)); } static boolean testIS_INFINITE(double a) { - return Double.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3461,7 +3660,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3481,7 +3680,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3497,7 +3696,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (double)((long)b[i]))); } } } @@ -3517,7 +3716,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (double)((long)b[i])))); } } } @@ -3533,7 +3732,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3553,7 +3752,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3569,7 +3768,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (double)((long)b[i]))); } } } @@ -3589,7 +3788,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (double)((long)b[i])))); } } } @@ -4089,11 +4288,11 @@ relativeError)); } static double SIN(double a) { - return (double)(Math.sin((double)a)); + return (double)(scalar_sin(a)); } static double strictSIN(double a) { - return (double)(StrictMath.sin((double)a)); + return (double)(strict_scalar_sin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4112,11 +4311,11 @@ relativeError)); } static double EXP(double a) { - return (double)(Math.exp((double)a)); + return (double)(scalar_exp(a)); } static double strictEXP(double a) { - return (double)(StrictMath.exp((double)a)); + return (double)(strict_scalar_exp(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4135,11 +4334,11 @@ relativeError)); } static double LOG1P(double a) { - return (double)(Math.log1p((double)a)); + return (double)(scalar_log1p(a)); } static double strictLOG1P(double a) { - return (double)(StrictMath.log1p((double)a)); + return (double)(strict_scalar_log1p(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4158,11 +4357,11 @@ relativeError)); } static double LOG(double a) { - return (double)(Math.log((double)a)); + return (double)(scalar_log(a)); } static double strictLOG(double a) { - return (double)(StrictMath.log((double)a)); + return (double)(strict_scalar_log(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4181,11 +4380,11 @@ relativeError)); } static double LOG10(double a) { - return (double)(Math.log10((double)a)); + return (double)(scalar_log10(a)); } static double strictLOG10(double a) { - return (double)(StrictMath.log10((double)a)); + return (double)(strict_scalar_log10(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4204,11 +4403,11 @@ relativeError)); } static double EXPM1(double a) { - return (double)(Math.expm1((double)a)); + return (double)(scalar_expm1(a)); } static double strictEXPM1(double a) { - return (double)(StrictMath.expm1((double)a)); + return (double)(strict_scalar_expm1(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4227,11 +4426,11 @@ relativeError)); } static double COS(double a) { - return (double)(Math.cos((double)a)); + return (double)(scalar_cos(a)); } static double strictCOS(double a) { - return (double)(StrictMath.cos((double)a)); + return (double)(strict_scalar_cos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4250,11 +4449,11 @@ relativeError)); } static double TAN(double a) { - return (double)(Math.tan((double)a)); + return (double)(scalar_tan(a)); } static double strictTAN(double a) { - return (double)(StrictMath.tan((double)a)); + return (double)(strict_scalar_tan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4273,11 +4472,11 @@ relativeError)); } static double SINH(double a) { - return (double)(Math.sinh((double)a)); + return (double)(scalar_sinh(a)); } static double strictSINH(double a) { - return (double)(StrictMath.sinh((double)a)); + return (double)(strict_scalar_sinh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4296,11 +4495,11 @@ relativeError)); } static double COSH(double a) { - return (double)(Math.cosh((double)a)); + return (double)(scalar_cosh(a)); } static double strictCOSH(double a) { - return (double)(StrictMath.cosh((double)a)); + return (double)(strict_scalar_cosh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4319,11 +4518,11 @@ relativeError)); } static double TANH(double a) { - return (double)(Math.tanh((double)a)); + return (double)(scalar_tanh(a)); } static double strictTANH(double a) { - return (double)(StrictMath.tanh((double)a)); + return (double)(strict_scalar_tanh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4342,11 +4541,11 @@ relativeError)); } static double ASIN(double a) { - return (double)(Math.asin((double)a)); + return (double)(scalar_asin(a)); } static double strictASIN(double a) { - return (double)(StrictMath.asin((double)a)); + return (double)(strict_scalar_asin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4365,11 +4564,11 @@ relativeError)); } static double ACOS(double a) { - return (double)(Math.acos((double)a)); + return (double)(scalar_acos(a)); } static double strictACOS(double a) { - return (double)(StrictMath.acos((double)a)); + return (double)(strict_scalar_acos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4388,11 +4587,11 @@ relativeError)); } static double ATAN(double a) { - return (double)(Math.atan((double)a)); + return (double)(scalar_atan(a)); } static double strictATAN(double a) { - return (double)(StrictMath.atan((double)a)); + return (double)(strict_scalar_atan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4411,11 +4610,11 @@ relativeError)); } static double CBRT(double a) { - return (double)(Math.cbrt((double)a)); + return (double)(scalar_cbrt(a)); } static double strictCBRT(double a) { - return (double)(StrictMath.cbrt((double)a)); + return (double)(strict_scalar_cbrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4434,11 +4633,11 @@ relativeError)); } static double HYPOT(double a, double b) { - return (double)(Math.hypot((double)a, (double)b)); + return (double)(scalar_hypot(a, b)); } static double strictHYPOT(double a, double b) { - return (double)(StrictMath.hypot((double)a, (double)b)); + return (double)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4460,11 +4659,11 @@ relativeError)); static double POW(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictPOW(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4486,11 +4685,11 @@ relativeError)); static double pow(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictpow(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4512,11 +4711,11 @@ relativeError)); static double ATAN2(double a, double b) { - return (double)(Math.atan2((double)a, (double)b)); + return (double)(scalar_atan2(a, b)); } static double strictATAN2(double a, double b) { - return (double)(StrictMath.atan2((double)a, (double)b)); + return (double)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4568,11 +4767,11 @@ relativeError)); static double FMA(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } static double fma(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } @Test(dataProvider = "doubleTernaryOpProvider") @@ -4792,11 +4991,11 @@ relativeError)); } static double NEG(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } static double neg(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4848,11 +5047,11 @@ relativeError)); } static double ABS(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } static double abs(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4904,11 +5103,11 @@ relativeError)); } static double SQRT(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } static double sqrt(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -5121,7 +5320,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5137,7 +5336,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5196,7 +5395,7 @@ relativeError)); static long ADDReduceLong(double[] a, int idx) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5205,7 +5404,7 @@ relativeError)); static long ADDReduceAllLong(double[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((double)res, (double)ADDReduceLong(a, i)); } return res; @@ -5223,8 +5422,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5234,8 +5433,9 @@ relativeError)); static long ADDReduceLongMasked(double[] a, int idx, boolean[] mask) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5244,7 +5444,7 @@ relativeError)); static long ADDReduceAllLongMasked(double[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((double)res, (double)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5264,8 +5464,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java b/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java index 7f9f8986f1f..d2aff0b7ea5 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVector64Tests.java @@ -1584,6 +1584,205 @@ relativeError)); return Double.compare(a, (double) 0) != 0 ? a : b; } + + static double scalar_add(double a, double b) { + return (double)(a + b); + } + + static double scalar_sub(double a, double b) { + return (double)(a - b); + } + + static double scalar_mul(double a, double b) { + return (double)(a * b); + } + + static double scalar_min(double a, double b) { + return (double)(Math.min(a, b)); + } + + static double scalar_max(double a, double b) { + return (double)(Math.max(a, b)); + } + + static double scalar_div(double a, double b) { + return (double)(a / b); + } + + static double scalar_fma(double a, double b, double c) { + return (double)(Math.fma(a, b, c)); + } + + static double scalar_abs(double a) { + return (double)(Math.abs(a)); + } + + static double scalar_neg(double a) { + return ((double)-a); + } + + static double scalar_sin(double a) { + return (double)Math.sin((double)a); + } + + static double scalar_exp(double a) { + return (double)Math.exp((double)a); + } + + static double scalar_log1p(double a) { + return (double)Math.log1p((double)a); + } + + static double scalar_log(double a) { + return (double)Math.log((double)a); + } + + static double scalar_log10(double a) { + return (double)Math.log10((double)a); + } + + static double scalar_expm1(double a) { + return (double)Math.expm1((double)a); + } + + static double scalar_cos(double a) { + return (double)Math.cos((double)a); + } + + static double scalar_tan(double a) { + return (double)Math.tan((double)a); + } + + static double scalar_sinh(double a) { + return (double)Math.sinh((double)a); + } + + static double scalar_cosh(double a) { + return (double)Math.cosh((double)a); + } + + static double scalar_tanh(double a) { + return (double)Math.tanh((double)a); + } + + static double scalar_asin(double a) { + return (double)Math.asin((double)a); + } + + static double scalar_acos(double a) { + return (double)Math.acos((double)a); + } + + static double scalar_atan(double a) { + return (double)Math.atan((double)a); + } + + static double scalar_cbrt(double a) { + return (double)Math.cbrt((double)a); + } + + static double scalar_sqrt(double a) { + return (double)Math.sqrt((double)a); + } + + static double scalar_hypot(double a, double b) { + return (double)Math.hypot((double)a, (double)b); + } + + static double scalar_pow(double a, double b) { + return (double)Math.pow((double)a, (double)b); + } + + static double scalar_atan2(double a, double b) { + return (double)Math.atan2((double)a, (double)b); + } + + static double strict_scalar_sin(double a) { + return (double)StrictMath.sin((double)a); + } + + static double strict_scalar_exp(double a) { + return (double)StrictMath.exp((double)a); + } + + static double strict_scalar_log1p(double a) { + return (double)StrictMath.log1p((double)a); + } + + static double strict_scalar_log(double a) { + return (double)StrictMath.log((double)a); + } + + static double strict_scalar_log10(double a) { + return (double)StrictMath.log10((double)a); + } + + static double strict_scalar_expm1(double a) { + return (double)StrictMath.expm1((double)a); + } + + static double strict_scalar_cos(double a) { + return (double)StrictMath.cos((double)a); + } + + static double strict_scalar_tan(double a) { + return (double)StrictMath.tan((double)a); + } + + static double strict_scalar_sinh(double a) { + return (double)StrictMath.sinh((double)a); + } + + static double strict_scalar_cosh(double a) { + return (double)StrictMath.cosh((double)a); + } + + static double strict_scalar_tanh(double a) { + return (double)StrictMath.tanh((double)a); + } + + static double strict_scalar_asin(double a) { + return (double)StrictMath.asin((double)a); + } + + static double strict_scalar_acos(double a) { + return (double)StrictMath.acos((double)a); + } + + static double strict_scalar_atan(double a) { + return (double)StrictMath.atan((double)a); + } + + static double strict_scalar_cbrt(double a) { + return (double)StrictMath.cbrt((double)a); + } + + static double strict_scalar_sqrt(double a) { + return (double)StrictMath.sqrt((double)a); + } + + static double strict_scalar_hypot(double a, double b) { + return (double)StrictMath.hypot((double)a, (double)b); + } + + static double strict_scalar_pow(double a, double b) { + return (double)StrictMath.pow((double)a, (double)b); + } + + static double strict_scalar_atan2(double a, double b) { + return (double)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(double a) { + return Double.isNaN(a); + } + static boolean isFinite(double a) { + return Double.isFinite(a); + } + static boolean isInfinite(double a) { + return Double.isInfinite(a); + } + @Test static void smokeTest1() { DoubleVector three = DoubleVector.broadcast(SPECIES, (byte)-3); @@ -1677,7 +1876,7 @@ relativeError)); } static double ADD(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1698,7 +1897,7 @@ relativeError)); } static double add(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1755,7 +1954,7 @@ relativeError)); } static double SUB(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1776,7 +1975,7 @@ relativeError)); } static double sub(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1833,7 +2032,7 @@ relativeError)); } static double MUL(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1854,7 +2053,7 @@ relativeError)); } static double mul(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1911,7 +2110,7 @@ relativeError)); } static double DIV(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1932,7 +2131,7 @@ relativeError)); } static double div(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1989,7 +2188,7 @@ relativeError)); } static double FIRST_NONZERO(double a, double b) { - return (double)(Double.doubleToLongBits(a)!=0?a:b); + return (double)(firstNonZero(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2291,7 +2490,7 @@ relativeError)); } static double MIN(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2312,7 +2511,7 @@ relativeError)); } static double min(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2331,7 +2530,7 @@ relativeError)); } static double MAX(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2352,7 +2551,7 @@ relativeError)); } static double max(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2429,7 +2628,7 @@ relativeError)); static double ADDReduce(double[] a, int idx) { double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2438,7 +2637,7 @@ relativeError)); static double ADDReduceAll(double[] a) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2456,7 +2655,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2469,20 +2668,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = ADD_IDENTITY; - assertEquals((double) (id + id), id, + assertEquals((double) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id + x), x); - assertEquals((double) (x + id), x); + assertEquals((double) (scalar_add(id, x)), x); + assertEquals((double) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id + x), x, + assertEquals((double) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x + id), x, + assertEquals((double) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2491,7 +2690,7 @@ relativeError)); double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2500,7 +2699,7 @@ relativeError)); static double ADDReduceAllMasked(double[] a, boolean[] mask) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2520,7 +2719,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2531,7 +2730,7 @@ relativeError)); static double MULReduce(double[] a, int idx) { double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2540,7 +2739,7 @@ relativeError)); static double MULReduceAll(double[] a) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2558,7 +2757,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2571,20 +2770,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MUL_IDENTITY; - assertEquals((double) (id * id), id, + assertEquals((double) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id * x), x); - assertEquals((double) (x * id), x); + assertEquals((double) (scalar_mul(id, x)), x); + assertEquals((double) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id * x), x, + assertEquals((double) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x * id), x, + assertEquals((double) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2593,7 +2792,7 @@ relativeError)); double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2602,7 +2801,7 @@ relativeError)); static double MULReduceAllMasked(double[] a, boolean[] mask) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2622,7 +2821,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2633,7 +2832,7 @@ relativeError)); static double MINReduce(double[] a, int idx) { double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2642,7 +2841,7 @@ relativeError)); static double MINReduceAll(double[] a) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2660,7 +2859,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2673,20 +2872,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MIN_IDENTITY; - assertEquals((double) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.min(id, x), x); - assertEquals((double) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2695,7 +2894,7 @@ relativeError)); double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2704,7 +2903,7 @@ relativeError)); static double MINReduceAllMasked(double[] a, boolean[] mask) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2724,7 +2923,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2735,7 +2934,7 @@ relativeError)); static double MAXReduce(double[] a, int idx) { double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2744,7 +2943,7 @@ relativeError)); static double MAXReduceAll(double[] a) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2762,7 +2961,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2775,20 +2974,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MAX_IDENTITY; - assertEquals((double) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.max(id, x), x); - assertEquals((double) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2797,7 +2996,7 @@ relativeError)); double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2806,7 +3005,7 @@ relativeError)); static double MAXReduceAllMasked(double[] a, boolean[] mask) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2826,7 +3025,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3038,7 +3237,7 @@ relativeError)); } static boolean testIS_FINITE(double a) { - return Double.isFinite(a); + return isFinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3079,7 +3278,7 @@ relativeError)); } static boolean testIS_NAN(double a) { - return Double.isNaN(a); + return isNaN(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3120,7 +3319,7 @@ relativeError)); } static boolean testIS_INFINITE(double a) { - return Double.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3461,7 +3660,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3481,7 +3680,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3497,7 +3696,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (double)((long)b[i]))); } } } @@ -3517,7 +3716,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (double)((long)b[i])))); } } } @@ -3533,7 +3732,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3553,7 +3752,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3569,7 +3768,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (double)((long)b[i]))); } } } @@ -3589,7 +3788,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (double)((long)b[i])))); } } } @@ -4089,11 +4288,11 @@ relativeError)); } static double SIN(double a) { - return (double)(Math.sin((double)a)); + return (double)(scalar_sin(a)); } static double strictSIN(double a) { - return (double)(StrictMath.sin((double)a)); + return (double)(strict_scalar_sin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4112,11 +4311,11 @@ relativeError)); } static double EXP(double a) { - return (double)(Math.exp((double)a)); + return (double)(scalar_exp(a)); } static double strictEXP(double a) { - return (double)(StrictMath.exp((double)a)); + return (double)(strict_scalar_exp(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4135,11 +4334,11 @@ relativeError)); } static double LOG1P(double a) { - return (double)(Math.log1p((double)a)); + return (double)(scalar_log1p(a)); } static double strictLOG1P(double a) { - return (double)(StrictMath.log1p((double)a)); + return (double)(strict_scalar_log1p(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4158,11 +4357,11 @@ relativeError)); } static double LOG(double a) { - return (double)(Math.log((double)a)); + return (double)(scalar_log(a)); } static double strictLOG(double a) { - return (double)(StrictMath.log((double)a)); + return (double)(strict_scalar_log(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4181,11 +4380,11 @@ relativeError)); } static double LOG10(double a) { - return (double)(Math.log10((double)a)); + return (double)(scalar_log10(a)); } static double strictLOG10(double a) { - return (double)(StrictMath.log10((double)a)); + return (double)(strict_scalar_log10(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4204,11 +4403,11 @@ relativeError)); } static double EXPM1(double a) { - return (double)(Math.expm1((double)a)); + return (double)(scalar_expm1(a)); } static double strictEXPM1(double a) { - return (double)(StrictMath.expm1((double)a)); + return (double)(strict_scalar_expm1(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4227,11 +4426,11 @@ relativeError)); } static double COS(double a) { - return (double)(Math.cos((double)a)); + return (double)(scalar_cos(a)); } static double strictCOS(double a) { - return (double)(StrictMath.cos((double)a)); + return (double)(strict_scalar_cos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4250,11 +4449,11 @@ relativeError)); } static double TAN(double a) { - return (double)(Math.tan((double)a)); + return (double)(scalar_tan(a)); } static double strictTAN(double a) { - return (double)(StrictMath.tan((double)a)); + return (double)(strict_scalar_tan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4273,11 +4472,11 @@ relativeError)); } static double SINH(double a) { - return (double)(Math.sinh((double)a)); + return (double)(scalar_sinh(a)); } static double strictSINH(double a) { - return (double)(StrictMath.sinh((double)a)); + return (double)(strict_scalar_sinh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4296,11 +4495,11 @@ relativeError)); } static double COSH(double a) { - return (double)(Math.cosh((double)a)); + return (double)(scalar_cosh(a)); } static double strictCOSH(double a) { - return (double)(StrictMath.cosh((double)a)); + return (double)(strict_scalar_cosh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4319,11 +4518,11 @@ relativeError)); } static double TANH(double a) { - return (double)(Math.tanh((double)a)); + return (double)(scalar_tanh(a)); } static double strictTANH(double a) { - return (double)(StrictMath.tanh((double)a)); + return (double)(strict_scalar_tanh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4342,11 +4541,11 @@ relativeError)); } static double ASIN(double a) { - return (double)(Math.asin((double)a)); + return (double)(scalar_asin(a)); } static double strictASIN(double a) { - return (double)(StrictMath.asin((double)a)); + return (double)(strict_scalar_asin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4365,11 +4564,11 @@ relativeError)); } static double ACOS(double a) { - return (double)(Math.acos((double)a)); + return (double)(scalar_acos(a)); } static double strictACOS(double a) { - return (double)(StrictMath.acos((double)a)); + return (double)(strict_scalar_acos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4388,11 +4587,11 @@ relativeError)); } static double ATAN(double a) { - return (double)(Math.atan((double)a)); + return (double)(scalar_atan(a)); } static double strictATAN(double a) { - return (double)(StrictMath.atan((double)a)); + return (double)(strict_scalar_atan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4411,11 +4610,11 @@ relativeError)); } static double CBRT(double a) { - return (double)(Math.cbrt((double)a)); + return (double)(scalar_cbrt(a)); } static double strictCBRT(double a) { - return (double)(StrictMath.cbrt((double)a)); + return (double)(strict_scalar_cbrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4434,11 +4633,11 @@ relativeError)); } static double HYPOT(double a, double b) { - return (double)(Math.hypot((double)a, (double)b)); + return (double)(scalar_hypot(a, b)); } static double strictHYPOT(double a, double b) { - return (double)(StrictMath.hypot((double)a, (double)b)); + return (double)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4460,11 +4659,11 @@ relativeError)); static double POW(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictPOW(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4486,11 +4685,11 @@ relativeError)); static double pow(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictpow(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4512,11 +4711,11 @@ relativeError)); static double ATAN2(double a, double b) { - return (double)(Math.atan2((double)a, (double)b)); + return (double)(scalar_atan2(a, b)); } static double strictATAN2(double a, double b) { - return (double)(StrictMath.atan2((double)a, (double)b)); + return (double)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4568,11 +4767,11 @@ relativeError)); static double FMA(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } static double fma(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } @Test(dataProvider = "doubleTernaryOpProvider") @@ -4792,11 +4991,11 @@ relativeError)); } static double NEG(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } static double neg(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4848,11 +5047,11 @@ relativeError)); } static double ABS(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } static double abs(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4904,11 +5103,11 @@ relativeError)); } static double SQRT(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } static double sqrt(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -5121,7 +5320,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5137,7 +5336,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5196,7 +5395,7 @@ relativeError)); static long ADDReduceLong(double[] a, int idx) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5205,7 +5404,7 @@ relativeError)); static long ADDReduceAllLong(double[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((double)res, (double)ADDReduceLong(a, i)); } return res; @@ -5223,8 +5422,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5234,8 +5433,9 @@ relativeError)); static long ADDReduceLongMasked(double[] a, int idx, boolean[] mask) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5244,7 +5444,7 @@ relativeError)); static long ADDReduceAllLongMasked(double[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((double)res, (double)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5264,8 +5464,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java b/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java index c4dda942e83..2684ae2d0c6 100644 --- a/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/DoubleVectorMaxTests.java @@ -1590,6 +1590,205 @@ relativeError)); return Double.compare(a, (double) 0) != 0 ? a : b; } + + static double scalar_add(double a, double b) { + return (double)(a + b); + } + + static double scalar_sub(double a, double b) { + return (double)(a - b); + } + + static double scalar_mul(double a, double b) { + return (double)(a * b); + } + + static double scalar_min(double a, double b) { + return (double)(Math.min(a, b)); + } + + static double scalar_max(double a, double b) { + return (double)(Math.max(a, b)); + } + + static double scalar_div(double a, double b) { + return (double)(a / b); + } + + static double scalar_fma(double a, double b, double c) { + return (double)(Math.fma(a, b, c)); + } + + static double scalar_abs(double a) { + return (double)(Math.abs(a)); + } + + static double scalar_neg(double a) { + return ((double)-a); + } + + static double scalar_sin(double a) { + return (double)Math.sin((double)a); + } + + static double scalar_exp(double a) { + return (double)Math.exp((double)a); + } + + static double scalar_log1p(double a) { + return (double)Math.log1p((double)a); + } + + static double scalar_log(double a) { + return (double)Math.log((double)a); + } + + static double scalar_log10(double a) { + return (double)Math.log10((double)a); + } + + static double scalar_expm1(double a) { + return (double)Math.expm1((double)a); + } + + static double scalar_cos(double a) { + return (double)Math.cos((double)a); + } + + static double scalar_tan(double a) { + return (double)Math.tan((double)a); + } + + static double scalar_sinh(double a) { + return (double)Math.sinh((double)a); + } + + static double scalar_cosh(double a) { + return (double)Math.cosh((double)a); + } + + static double scalar_tanh(double a) { + return (double)Math.tanh((double)a); + } + + static double scalar_asin(double a) { + return (double)Math.asin((double)a); + } + + static double scalar_acos(double a) { + return (double)Math.acos((double)a); + } + + static double scalar_atan(double a) { + return (double)Math.atan((double)a); + } + + static double scalar_cbrt(double a) { + return (double)Math.cbrt((double)a); + } + + static double scalar_sqrt(double a) { + return (double)Math.sqrt((double)a); + } + + static double scalar_hypot(double a, double b) { + return (double)Math.hypot((double)a, (double)b); + } + + static double scalar_pow(double a, double b) { + return (double)Math.pow((double)a, (double)b); + } + + static double scalar_atan2(double a, double b) { + return (double)Math.atan2((double)a, (double)b); + } + + static double strict_scalar_sin(double a) { + return (double)StrictMath.sin((double)a); + } + + static double strict_scalar_exp(double a) { + return (double)StrictMath.exp((double)a); + } + + static double strict_scalar_log1p(double a) { + return (double)StrictMath.log1p((double)a); + } + + static double strict_scalar_log(double a) { + return (double)StrictMath.log((double)a); + } + + static double strict_scalar_log10(double a) { + return (double)StrictMath.log10((double)a); + } + + static double strict_scalar_expm1(double a) { + return (double)StrictMath.expm1((double)a); + } + + static double strict_scalar_cos(double a) { + return (double)StrictMath.cos((double)a); + } + + static double strict_scalar_tan(double a) { + return (double)StrictMath.tan((double)a); + } + + static double strict_scalar_sinh(double a) { + return (double)StrictMath.sinh((double)a); + } + + static double strict_scalar_cosh(double a) { + return (double)StrictMath.cosh((double)a); + } + + static double strict_scalar_tanh(double a) { + return (double)StrictMath.tanh((double)a); + } + + static double strict_scalar_asin(double a) { + return (double)StrictMath.asin((double)a); + } + + static double strict_scalar_acos(double a) { + return (double)StrictMath.acos((double)a); + } + + static double strict_scalar_atan(double a) { + return (double)StrictMath.atan((double)a); + } + + static double strict_scalar_cbrt(double a) { + return (double)StrictMath.cbrt((double)a); + } + + static double strict_scalar_sqrt(double a) { + return (double)StrictMath.sqrt((double)a); + } + + static double strict_scalar_hypot(double a, double b) { + return (double)StrictMath.hypot((double)a, (double)b); + } + + static double strict_scalar_pow(double a, double b) { + return (double)StrictMath.pow((double)a, (double)b); + } + + static double strict_scalar_atan2(double a, double b) { + return (double)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(double a) { + return Double.isNaN(a); + } + static boolean isFinite(double a) { + return Double.isFinite(a); + } + static boolean isInfinite(double a) { + return Double.isInfinite(a); + } + @Test static void smokeTest1() { DoubleVector three = DoubleVector.broadcast(SPECIES, (byte)-3); @@ -1683,7 +1882,7 @@ relativeError)); } static double ADD(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1704,7 +1903,7 @@ relativeError)); } static double add(double a, double b) { - return (double)(a + b); + return (double)(scalar_add(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1761,7 +1960,7 @@ relativeError)); } static double SUB(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1782,7 +1981,7 @@ relativeError)); } static double sub(double a, double b) { - return (double)(a - b); + return (double)(scalar_sub(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1839,7 +2038,7 @@ relativeError)); } static double MUL(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1860,7 +2059,7 @@ relativeError)); } static double mul(double a, double b) { - return (double)(a * b); + return (double)(scalar_mul(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1917,7 +2116,7 @@ relativeError)); } static double DIV(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1938,7 +2137,7 @@ relativeError)); } static double div(double a, double b) { - return (double)(a / b); + return (double)(scalar_div(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -1995,7 +2194,7 @@ relativeError)); } static double FIRST_NONZERO(double a, double b) { - return (double)(Double.doubleToLongBits(a)!=0?a:b); + return (double)(firstNonZero(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2297,7 +2496,7 @@ relativeError)); } static double MIN(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2318,7 +2517,7 @@ relativeError)); } static double min(double a, double b) { - return (double)(Math.min(a, b)); + return (double)(scalar_min(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2337,7 +2536,7 @@ relativeError)); } static double MAX(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2358,7 +2557,7 @@ relativeError)); } static double max(double a, double b) { - return (double)(Math.max(a, b)); + return (double)(scalar_max(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -2435,7 +2634,7 @@ relativeError)); static double ADDReduce(double[] a, int idx) { double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2444,7 +2643,7 @@ relativeError)); static double ADDReduceAll(double[] a) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2462,7 +2661,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2475,20 +2674,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = ADD_IDENTITY; - assertEquals((double) (id + id), id, + assertEquals((double) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id + x), x); - assertEquals((double) (x + id), x); + assertEquals((double) (scalar_add(id, x)), x); + assertEquals((double) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id + x), x, + assertEquals((double) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x + id), x, + assertEquals((double) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2497,7 +2696,7 @@ relativeError)); double res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2506,7 +2705,7 @@ relativeError)); static double ADDReduceAllMasked(double[] a, boolean[] mask) { double res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2526,7 +2725,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2537,7 +2736,7 @@ relativeError)); static double MULReduce(double[] a, int idx) { double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2546,7 +2745,7 @@ relativeError)); static double MULReduceAll(double[] a) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2564,7 +2763,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2577,20 +2776,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MUL_IDENTITY; - assertEquals((double) (id * id), id, + assertEquals((double) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) (id * x), x); - assertEquals((double) (x * id), x); + assertEquals((double) (scalar_mul(id, x)), x); + assertEquals((double) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((double) (id * x), x, + assertEquals((double) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((double) (x * id), x, + assertEquals((double) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2599,7 +2798,7 @@ relativeError)); double res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2608,7 +2807,7 @@ relativeError)); static double MULReduceAllMasked(double[] a, boolean[] mask) { double res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2628,7 +2827,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2639,7 +2838,7 @@ relativeError)); static double MINReduce(double[] a, int idx) { double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2648,7 +2847,7 @@ relativeError)); static double MINReduceAll(double[] a) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2666,7 +2865,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2679,20 +2878,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MIN_IDENTITY; - assertEquals((double) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.min(id, x), x); - assertEquals((double) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2701,7 +2900,7 @@ relativeError)); double res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2710,7 +2909,7 @@ relativeError)); static double MINReduceAllMasked(double[] a, boolean[] mask) { double res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2730,7 +2929,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (double) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2741,7 +2940,7 @@ relativeError)); static double MAXReduce(double[] a, int idx) { double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2750,7 +2949,7 @@ relativeError)); static double MAXReduceAll(double[] a) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2768,7 +2967,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2781,20 +2980,20 @@ relativeError)); double[] a = fa.apply(SPECIES.length()); double id = MAX_IDENTITY; - assertEquals((double) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); double x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((double) Math.max(id, x), x); - assertEquals((double) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((double) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((double) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2803,7 +3002,7 @@ relativeError)); double res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (double) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2812,7 +3011,7 @@ relativeError)); static double MAXReduceAllMasked(double[] a, boolean[] mask) { double res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (double) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2832,7 +3031,7 @@ relativeError)); DoubleVector av = DoubleVector.fromArray(SPECIES, a, i); double v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (double) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3044,7 +3243,7 @@ relativeError)); } static boolean testIS_FINITE(double a) { - return Double.isFinite(a); + return isFinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3085,7 +3284,7 @@ relativeError)); } static boolean testIS_NAN(double a) { - return Double.isNaN(a); + return isNaN(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3126,7 +3325,7 @@ relativeError)); } static boolean testIS_INFINITE(double a) { - return Double.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "doubleTestOpProvider") @@ -3467,7 +3666,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3487,7 +3686,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3503,7 +3702,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (double)((long)b[i]))); } } } @@ -3523,7 +3722,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (double)((long)b[i])))); } } } @@ -3539,7 +3738,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3559,7 +3758,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3575,7 +3774,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (double)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (double)((long)b[i]))); } } } @@ -3595,7 +3794,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (double)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (double)((long)b[i])))); } } } @@ -4095,11 +4294,11 @@ relativeError)); } static double SIN(double a) { - return (double)(Math.sin((double)a)); + return (double)(scalar_sin(a)); } static double strictSIN(double a) { - return (double)(StrictMath.sin((double)a)); + return (double)(strict_scalar_sin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4118,11 +4317,11 @@ relativeError)); } static double EXP(double a) { - return (double)(Math.exp((double)a)); + return (double)(scalar_exp(a)); } static double strictEXP(double a) { - return (double)(StrictMath.exp((double)a)); + return (double)(strict_scalar_exp(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4141,11 +4340,11 @@ relativeError)); } static double LOG1P(double a) { - return (double)(Math.log1p((double)a)); + return (double)(scalar_log1p(a)); } static double strictLOG1P(double a) { - return (double)(StrictMath.log1p((double)a)); + return (double)(strict_scalar_log1p(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4164,11 +4363,11 @@ relativeError)); } static double LOG(double a) { - return (double)(Math.log((double)a)); + return (double)(scalar_log(a)); } static double strictLOG(double a) { - return (double)(StrictMath.log((double)a)); + return (double)(strict_scalar_log(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4187,11 +4386,11 @@ relativeError)); } static double LOG10(double a) { - return (double)(Math.log10((double)a)); + return (double)(scalar_log10(a)); } static double strictLOG10(double a) { - return (double)(StrictMath.log10((double)a)); + return (double)(strict_scalar_log10(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4210,11 +4409,11 @@ relativeError)); } static double EXPM1(double a) { - return (double)(Math.expm1((double)a)); + return (double)(scalar_expm1(a)); } static double strictEXPM1(double a) { - return (double)(StrictMath.expm1((double)a)); + return (double)(strict_scalar_expm1(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4233,11 +4432,11 @@ relativeError)); } static double COS(double a) { - return (double)(Math.cos((double)a)); + return (double)(scalar_cos(a)); } static double strictCOS(double a) { - return (double)(StrictMath.cos((double)a)); + return (double)(strict_scalar_cos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4256,11 +4455,11 @@ relativeError)); } static double TAN(double a) { - return (double)(Math.tan((double)a)); + return (double)(scalar_tan(a)); } static double strictTAN(double a) { - return (double)(StrictMath.tan((double)a)); + return (double)(strict_scalar_tan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4279,11 +4478,11 @@ relativeError)); } static double SINH(double a) { - return (double)(Math.sinh((double)a)); + return (double)(scalar_sinh(a)); } static double strictSINH(double a) { - return (double)(StrictMath.sinh((double)a)); + return (double)(strict_scalar_sinh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4302,11 +4501,11 @@ relativeError)); } static double COSH(double a) { - return (double)(Math.cosh((double)a)); + return (double)(scalar_cosh(a)); } static double strictCOSH(double a) { - return (double)(StrictMath.cosh((double)a)); + return (double)(strict_scalar_cosh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4325,11 +4524,11 @@ relativeError)); } static double TANH(double a) { - return (double)(Math.tanh((double)a)); + return (double)(scalar_tanh(a)); } static double strictTANH(double a) { - return (double)(StrictMath.tanh((double)a)); + return (double)(strict_scalar_tanh(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4348,11 +4547,11 @@ relativeError)); } static double ASIN(double a) { - return (double)(Math.asin((double)a)); + return (double)(scalar_asin(a)); } static double strictASIN(double a) { - return (double)(StrictMath.asin((double)a)); + return (double)(strict_scalar_asin(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4371,11 +4570,11 @@ relativeError)); } static double ACOS(double a) { - return (double)(Math.acos((double)a)); + return (double)(scalar_acos(a)); } static double strictACOS(double a) { - return (double)(StrictMath.acos((double)a)); + return (double)(strict_scalar_acos(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4394,11 +4593,11 @@ relativeError)); } static double ATAN(double a) { - return (double)(Math.atan((double)a)); + return (double)(scalar_atan(a)); } static double strictATAN(double a) { - return (double)(StrictMath.atan((double)a)); + return (double)(strict_scalar_atan(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4417,11 +4616,11 @@ relativeError)); } static double CBRT(double a) { - return (double)(Math.cbrt((double)a)); + return (double)(scalar_cbrt(a)); } static double strictCBRT(double a) { - return (double)(StrictMath.cbrt((double)a)); + return (double)(strict_scalar_cbrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4440,11 +4639,11 @@ relativeError)); } static double HYPOT(double a, double b) { - return (double)(Math.hypot((double)a, (double)b)); + return (double)(scalar_hypot(a, b)); } static double strictHYPOT(double a, double b) { - return (double)(StrictMath.hypot((double)a, (double)b)); + return (double)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4466,11 +4665,11 @@ relativeError)); static double POW(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictPOW(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4492,11 +4691,11 @@ relativeError)); static double pow(double a, double b) { - return (double)(Math.pow((double)a, (double)b)); + return (double)(scalar_pow(a, b)); } static double strictpow(double a, double b) { - return (double)(StrictMath.pow((double)a, (double)b)); + return (double)(strict_scalar_pow(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4518,11 +4717,11 @@ relativeError)); static double ATAN2(double a, double b) { - return (double)(Math.atan2((double)a, (double)b)); + return (double)(scalar_atan2(a, b)); } static double strictATAN2(double a, double b) { - return (double)(StrictMath.atan2((double)a, (double)b)); + return (double)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "doubleBinaryOpProvider") @@ -4574,11 +4773,11 @@ relativeError)); static double FMA(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } static double fma(double a, double b, double c) { - return (double)(Math.fma(a, b, c)); + return (double)(scalar_fma(a, b, c)); } @Test(dataProvider = "doubleTernaryOpProvider") @@ -4798,11 +4997,11 @@ relativeError)); } static double NEG(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } static double neg(double a) { - return (double)(-((double)a)); + return (double)(scalar_neg((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4854,11 +5053,11 @@ relativeError)); } static double ABS(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } static double abs(double a) { - return (double)(Math.abs((double)a)); + return (double)(scalar_abs((double)a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -4910,11 +5109,11 @@ relativeError)); } static double SQRT(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } static double sqrt(double a) { - return (double)(Math.sqrt((double)a)); + return (double)(scalar_sqrt(a)); } @Test(dataProvider = "doubleUnaryOpProvider") @@ -5127,7 +5326,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5143,7 +5342,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5202,7 +5401,7 @@ relativeError)); static long ADDReduceLong(double[] a, int idx) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5211,7 +5410,7 @@ relativeError)); static long ADDReduceAllLong(double[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((double)res, (double)ADDReduceLong(a, i)); } return res; @@ -5229,8 +5428,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5240,8 +5439,9 @@ relativeError)); static long ADDReduceLongMasked(double[] a, int idx, boolean[] mask) { double res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5250,7 +5450,7 @@ relativeError)); static long ADDReduceAllLongMasked(double[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((double)res, (double)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5270,8 +5470,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((double)ra, (double)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/FloatVector128Tests.java b/test/jdk/jdk/incubator/vector/FloatVector128Tests.java index 51e6365b01b..151ea17a886 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector128Tests.java @@ -1601,6 +1601,205 @@ relativeError)); return Float.compare(a, (float) 0) != 0 ? a : b; } + + static float scalar_add(float a, float b) { + return (float)(a + b); + } + + static float scalar_sub(float a, float b) { + return (float)(a - b); + } + + static float scalar_mul(float a, float b) { + return (float)(a * b); + } + + static float scalar_min(float a, float b) { + return (float)(Math.min(a, b)); + } + + static float scalar_max(float a, float b) { + return (float)(Math.max(a, b)); + } + + static float scalar_div(float a, float b) { + return (float)(a / b); + } + + static float scalar_fma(float a, float b, float c) { + return (float)(Math.fma(a, b, c)); + } + + static float scalar_abs(float a) { + return (float)(Math.abs(a)); + } + + static float scalar_neg(float a) { + return ((float)-a); + } + + static float scalar_sin(float a) { + return (float)Math.sin((double)a); + } + + static float scalar_exp(float a) { + return (float)Math.exp((double)a); + } + + static float scalar_log1p(float a) { + return (float)Math.log1p((double)a); + } + + static float scalar_log(float a) { + return (float)Math.log((double)a); + } + + static float scalar_log10(float a) { + return (float)Math.log10((double)a); + } + + static float scalar_expm1(float a) { + return (float)Math.expm1((double)a); + } + + static float scalar_cos(float a) { + return (float)Math.cos((double)a); + } + + static float scalar_tan(float a) { + return (float)Math.tan((double)a); + } + + static float scalar_sinh(float a) { + return (float)Math.sinh((double)a); + } + + static float scalar_cosh(float a) { + return (float)Math.cosh((double)a); + } + + static float scalar_tanh(float a) { + return (float)Math.tanh((double)a); + } + + static float scalar_asin(float a) { + return (float)Math.asin((double)a); + } + + static float scalar_acos(float a) { + return (float)Math.acos((double)a); + } + + static float scalar_atan(float a) { + return (float)Math.atan((double)a); + } + + static float scalar_cbrt(float a) { + return (float)Math.cbrt((double)a); + } + + static float scalar_sqrt(float a) { + return (float)Math.sqrt((double)a); + } + + static float scalar_hypot(float a, float b) { + return (float)Math.hypot((double)a, (double)b); + } + + static float scalar_pow(float a, float b) { + return (float)Math.pow((double)a, (double)b); + } + + static float scalar_atan2(float a, float b) { + return (float)Math.atan2((double)a, (double)b); + } + + static float strict_scalar_sin(float a) { + return (float)StrictMath.sin((double)a); + } + + static float strict_scalar_exp(float a) { + return (float)StrictMath.exp((double)a); + } + + static float strict_scalar_log1p(float a) { + return (float)StrictMath.log1p((double)a); + } + + static float strict_scalar_log(float a) { + return (float)StrictMath.log((double)a); + } + + static float strict_scalar_log10(float a) { + return (float)StrictMath.log10((double)a); + } + + static float strict_scalar_expm1(float a) { + return (float)StrictMath.expm1((double)a); + } + + static float strict_scalar_cos(float a) { + return (float)StrictMath.cos((double)a); + } + + static float strict_scalar_tan(float a) { + return (float)StrictMath.tan((double)a); + } + + static float strict_scalar_sinh(float a) { + return (float)StrictMath.sinh((double)a); + } + + static float strict_scalar_cosh(float a) { + return (float)StrictMath.cosh((double)a); + } + + static float strict_scalar_tanh(float a) { + return (float)StrictMath.tanh((double)a); + } + + static float strict_scalar_asin(float a) { + return (float)StrictMath.asin((double)a); + } + + static float strict_scalar_acos(float a) { + return (float)StrictMath.acos((double)a); + } + + static float strict_scalar_atan(float a) { + return (float)StrictMath.atan((double)a); + } + + static float strict_scalar_cbrt(float a) { + return (float)StrictMath.cbrt((double)a); + } + + static float strict_scalar_sqrt(float a) { + return (float)StrictMath.sqrt((double)a); + } + + static float strict_scalar_hypot(float a, float b) { + return (float)StrictMath.hypot((double)a, (double)b); + } + + static float strict_scalar_pow(float a, float b) { + return (float)StrictMath.pow((double)a, (double)b); + } + + static float strict_scalar_atan2(float a, float b) { + return (float)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(float a) { + return Float.isNaN(a); + } + static boolean isFinite(float a) { + return Float.isFinite(a); + } + static boolean isInfinite(float a) { + return Float.isInfinite(a); + } + @Test static void smokeTest1() { FloatVector three = FloatVector.broadcast(SPECIES, (byte)-3); @@ -1694,7 +1893,7 @@ relativeError)); } static float ADD(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1715,7 +1914,7 @@ relativeError)); } static float add(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1772,7 +1971,7 @@ relativeError)); } static float SUB(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1793,7 +1992,7 @@ relativeError)); } static float sub(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1850,7 +2049,7 @@ relativeError)); } static float MUL(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1871,7 +2070,7 @@ relativeError)); } static float mul(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1928,7 +2127,7 @@ relativeError)); } static float DIV(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1949,7 +2148,7 @@ relativeError)); } static float div(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2006,7 +2205,7 @@ relativeError)); } static float FIRST_NONZERO(float a, float b) { - return (float)(Double.doubleToLongBits(a)!=0?a:b); + return (float)(firstNonZero(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2308,7 +2507,7 @@ relativeError)); } static float MIN(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2329,7 +2528,7 @@ relativeError)); } static float min(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2348,7 +2547,7 @@ relativeError)); } static float MAX(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2369,7 +2568,7 @@ relativeError)); } static float max(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2446,7 +2645,7 @@ relativeError)); static float ADDReduce(float[] a, int idx) { float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2455,7 +2654,7 @@ relativeError)); static float ADDReduceAll(float[] a) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2473,7 +2672,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2486,20 +2685,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = ADD_IDENTITY; - assertEquals((float) (id + id), id, + assertEquals((float) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id + x), x); - assertEquals((float) (x + id), x); + assertEquals((float) (scalar_add(id, x)), x); + assertEquals((float) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id + x), x, + assertEquals((float) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x + id), x, + assertEquals((float) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2508,7 +2707,7 @@ relativeError)); float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2517,7 +2716,7 @@ relativeError)); static float ADDReduceAllMasked(float[] a, boolean[] mask) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2537,7 +2736,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2548,7 +2747,7 @@ relativeError)); static float MULReduce(float[] a, int idx) { float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2557,7 +2756,7 @@ relativeError)); static float MULReduceAll(float[] a) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2575,7 +2774,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2588,20 +2787,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MUL_IDENTITY; - assertEquals((float) (id * id), id, + assertEquals((float) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id * x), x); - assertEquals((float) (x * id), x); + assertEquals((float) (scalar_mul(id, x)), x); + assertEquals((float) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id * x), x, + assertEquals((float) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x * id), x, + assertEquals((float) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2610,7 +2809,7 @@ relativeError)); float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2619,7 +2818,7 @@ relativeError)); static float MULReduceAllMasked(float[] a, boolean[] mask) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2639,7 +2838,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2650,7 +2849,7 @@ relativeError)); static float MINReduce(float[] a, int idx) { float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2659,7 +2858,7 @@ relativeError)); static float MINReduceAll(float[] a) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2677,7 +2876,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2690,20 +2889,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MIN_IDENTITY; - assertEquals((float) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.min(id, x), x); - assertEquals((float) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2712,7 +2911,7 @@ relativeError)); float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2721,7 +2920,7 @@ relativeError)); static float MINReduceAllMasked(float[] a, boolean[] mask) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2741,7 +2940,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2752,7 +2951,7 @@ relativeError)); static float MAXReduce(float[] a, int idx) { float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2761,7 +2960,7 @@ relativeError)); static float MAXReduceAll(float[] a) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2779,7 +2978,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2792,20 +2991,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MAX_IDENTITY; - assertEquals((float) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.max(id, x), x); - assertEquals((float) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2814,7 +3013,7 @@ relativeError)); float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2823,7 +3022,7 @@ relativeError)); static float MAXReduceAllMasked(float[] a, boolean[] mask) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2843,7 +3042,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3055,7 +3254,7 @@ relativeError)); } static boolean testIS_FINITE(float a) { - return Float.isFinite(a); + return isFinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3096,7 +3295,7 @@ relativeError)); } static boolean testIS_NAN(float a) { - return Float.isNaN(a); + return isNaN(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3137,7 +3336,7 @@ relativeError)); } static boolean testIS_INFINITE(float a) { - return Float.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3478,7 +3677,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3498,7 +3697,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3514,7 +3713,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (float)((long)b[i]))); } } } @@ -3534,7 +3733,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (float)((long)b[i])))); } } } @@ -3550,7 +3749,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3570,7 +3769,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3586,7 +3785,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (float)((long)b[i]))); } } } @@ -3606,7 +3805,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (float)((long)b[i])))); } } } @@ -4106,11 +4305,11 @@ relativeError)); } static float SIN(float a) { - return (float)(Math.sin((double)a)); + return (float)(scalar_sin(a)); } static float strictSIN(float a) { - return (float)(StrictMath.sin((double)a)); + return (float)(strict_scalar_sin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4129,11 +4328,11 @@ relativeError)); } static float EXP(float a) { - return (float)(Math.exp((double)a)); + return (float)(scalar_exp(a)); } static float strictEXP(float a) { - return (float)(StrictMath.exp((double)a)); + return (float)(strict_scalar_exp(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4152,11 +4351,11 @@ relativeError)); } static float LOG1P(float a) { - return (float)(Math.log1p((double)a)); + return (float)(scalar_log1p(a)); } static float strictLOG1P(float a) { - return (float)(StrictMath.log1p((double)a)); + return (float)(strict_scalar_log1p(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4175,11 +4374,11 @@ relativeError)); } static float LOG(float a) { - return (float)(Math.log((double)a)); + return (float)(scalar_log(a)); } static float strictLOG(float a) { - return (float)(StrictMath.log((double)a)); + return (float)(strict_scalar_log(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4198,11 +4397,11 @@ relativeError)); } static float LOG10(float a) { - return (float)(Math.log10((double)a)); + return (float)(scalar_log10(a)); } static float strictLOG10(float a) { - return (float)(StrictMath.log10((double)a)); + return (float)(strict_scalar_log10(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4221,11 +4420,11 @@ relativeError)); } static float EXPM1(float a) { - return (float)(Math.expm1((double)a)); + return (float)(scalar_expm1(a)); } static float strictEXPM1(float a) { - return (float)(StrictMath.expm1((double)a)); + return (float)(strict_scalar_expm1(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4244,11 +4443,11 @@ relativeError)); } static float COS(float a) { - return (float)(Math.cos((double)a)); + return (float)(scalar_cos(a)); } static float strictCOS(float a) { - return (float)(StrictMath.cos((double)a)); + return (float)(strict_scalar_cos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4267,11 +4466,11 @@ relativeError)); } static float TAN(float a) { - return (float)(Math.tan((double)a)); + return (float)(scalar_tan(a)); } static float strictTAN(float a) { - return (float)(StrictMath.tan((double)a)); + return (float)(strict_scalar_tan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4290,11 +4489,11 @@ relativeError)); } static float SINH(float a) { - return (float)(Math.sinh((double)a)); + return (float)(scalar_sinh(a)); } static float strictSINH(float a) { - return (float)(StrictMath.sinh((double)a)); + return (float)(strict_scalar_sinh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4313,11 +4512,11 @@ relativeError)); } static float COSH(float a) { - return (float)(Math.cosh((double)a)); + return (float)(scalar_cosh(a)); } static float strictCOSH(float a) { - return (float)(StrictMath.cosh((double)a)); + return (float)(strict_scalar_cosh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4336,11 +4535,11 @@ relativeError)); } static float TANH(float a) { - return (float)(Math.tanh((double)a)); + return (float)(scalar_tanh(a)); } static float strictTANH(float a) { - return (float)(StrictMath.tanh((double)a)); + return (float)(strict_scalar_tanh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4359,11 +4558,11 @@ relativeError)); } static float ASIN(float a) { - return (float)(Math.asin((double)a)); + return (float)(scalar_asin(a)); } static float strictASIN(float a) { - return (float)(StrictMath.asin((double)a)); + return (float)(strict_scalar_asin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4382,11 +4581,11 @@ relativeError)); } static float ACOS(float a) { - return (float)(Math.acos((double)a)); + return (float)(scalar_acos(a)); } static float strictACOS(float a) { - return (float)(StrictMath.acos((double)a)); + return (float)(strict_scalar_acos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4405,11 +4604,11 @@ relativeError)); } static float ATAN(float a) { - return (float)(Math.atan((double)a)); + return (float)(scalar_atan(a)); } static float strictATAN(float a) { - return (float)(StrictMath.atan((double)a)); + return (float)(strict_scalar_atan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4428,11 +4627,11 @@ relativeError)); } static float CBRT(float a) { - return (float)(Math.cbrt((double)a)); + return (float)(scalar_cbrt(a)); } static float strictCBRT(float a) { - return (float)(StrictMath.cbrt((double)a)); + return (float)(strict_scalar_cbrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4451,11 +4650,11 @@ relativeError)); } static float HYPOT(float a, float b) { - return (float)(Math.hypot((double)a, (double)b)); + return (float)(scalar_hypot(a, b)); } static float strictHYPOT(float a, float b) { - return (float)(StrictMath.hypot((double)a, (double)b)); + return (float)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4477,11 +4676,11 @@ relativeError)); static float POW(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictPOW(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4503,11 +4702,11 @@ relativeError)); static float pow(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictpow(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4529,11 +4728,11 @@ relativeError)); static float ATAN2(float a, float b) { - return (float)(Math.atan2((double)a, (double)b)); + return (float)(scalar_atan2(a, b)); } static float strictATAN2(float a, float b) { - return (float)(StrictMath.atan2((double)a, (double)b)); + return (float)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4585,11 +4784,11 @@ relativeError)); static float FMA(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } static float fma(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } @Test(dataProvider = "floatTernaryOpProvider") @@ -4767,11 +4966,11 @@ relativeError)); } static float NEG(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } static float neg(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4823,11 +5022,11 @@ relativeError)); } static float ABS(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } static float abs(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4879,11 +5078,11 @@ relativeError)); } static float SQRT(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } static float sqrt(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -5096,7 +5295,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5112,7 +5311,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5181,7 +5380,7 @@ relativeError)); static long ADDReduceLong(float[] a, int idx) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5190,7 +5389,7 @@ relativeError)); static long ADDReduceAllLong(float[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((float)res, (float)ADDReduceLong(a, i)); } return res; @@ -5208,8 +5407,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5219,8 +5418,9 @@ relativeError)); static long ADDReduceLongMasked(float[] a, int idx, boolean[] mask) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5229,7 +5429,7 @@ relativeError)); static long ADDReduceAllLongMasked(float[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((float)res, (float)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5249,8 +5449,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/FloatVector256Tests.java b/test/jdk/jdk/incubator/vector/FloatVector256Tests.java index b7d16ecc7f7..5315b69a5b6 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector256Tests.java @@ -1601,6 +1601,205 @@ relativeError)); return Float.compare(a, (float) 0) != 0 ? a : b; } + + static float scalar_add(float a, float b) { + return (float)(a + b); + } + + static float scalar_sub(float a, float b) { + return (float)(a - b); + } + + static float scalar_mul(float a, float b) { + return (float)(a * b); + } + + static float scalar_min(float a, float b) { + return (float)(Math.min(a, b)); + } + + static float scalar_max(float a, float b) { + return (float)(Math.max(a, b)); + } + + static float scalar_div(float a, float b) { + return (float)(a / b); + } + + static float scalar_fma(float a, float b, float c) { + return (float)(Math.fma(a, b, c)); + } + + static float scalar_abs(float a) { + return (float)(Math.abs(a)); + } + + static float scalar_neg(float a) { + return ((float)-a); + } + + static float scalar_sin(float a) { + return (float)Math.sin((double)a); + } + + static float scalar_exp(float a) { + return (float)Math.exp((double)a); + } + + static float scalar_log1p(float a) { + return (float)Math.log1p((double)a); + } + + static float scalar_log(float a) { + return (float)Math.log((double)a); + } + + static float scalar_log10(float a) { + return (float)Math.log10((double)a); + } + + static float scalar_expm1(float a) { + return (float)Math.expm1((double)a); + } + + static float scalar_cos(float a) { + return (float)Math.cos((double)a); + } + + static float scalar_tan(float a) { + return (float)Math.tan((double)a); + } + + static float scalar_sinh(float a) { + return (float)Math.sinh((double)a); + } + + static float scalar_cosh(float a) { + return (float)Math.cosh((double)a); + } + + static float scalar_tanh(float a) { + return (float)Math.tanh((double)a); + } + + static float scalar_asin(float a) { + return (float)Math.asin((double)a); + } + + static float scalar_acos(float a) { + return (float)Math.acos((double)a); + } + + static float scalar_atan(float a) { + return (float)Math.atan((double)a); + } + + static float scalar_cbrt(float a) { + return (float)Math.cbrt((double)a); + } + + static float scalar_sqrt(float a) { + return (float)Math.sqrt((double)a); + } + + static float scalar_hypot(float a, float b) { + return (float)Math.hypot((double)a, (double)b); + } + + static float scalar_pow(float a, float b) { + return (float)Math.pow((double)a, (double)b); + } + + static float scalar_atan2(float a, float b) { + return (float)Math.atan2((double)a, (double)b); + } + + static float strict_scalar_sin(float a) { + return (float)StrictMath.sin((double)a); + } + + static float strict_scalar_exp(float a) { + return (float)StrictMath.exp((double)a); + } + + static float strict_scalar_log1p(float a) { + return (float)StrictMath.log1p((double)a); + } + + static float strict_scalar_log(float a) { + return (float)StrictMath.log((double)a); + } + + static float strict_scalar_log10(float a) { + return (float)StrictMath.log10((double)a); + } + + static float strict_scalar_expm1(float a) { + return (float)StrictMath.expm1((double)a); + } + + static float strict_scalar_cos(float a) { + return (float)StrictMath.cos((double)a); + } + + static float strict_scalar_tan(float a) { + return (float)StrictMath.tan((double)a); + } + + static float strict_scalar_sinh(float a) { + return (float)StrictMath.sinh((double)a); + } + + static float strict_scalar_cosh(float a) { + return (float)StrictMath.cosh((double)a); + } + + static float strict_scalar_tanh(float a) { + return (float)StrictMath.tanh((double)a); + } + + static float strict_scalar_asin(float a) { + return (float)StrictMath.asin((double)a); + } + + static float strict_scalar_acos(float a) { + return (float)StrictMath.acos((double)a); + } + + static float strict_scalar_atan(float a) { + return (float)StrictMath.atan((double)a); + } + + static float strict_scalar_cbrt(float a) { + return (float)StrictMath.cbrt((double)a); + } + + static float strict_scalar_sqrt(float a) { + return (float)StrictMath.sqrt((double)a); + } + + static float strict_scalar_hypot(float a, float b) { + return (float)StrictMath.hypot((double)a, (double)b); + } + + static float strict_scalar_pow(float a, float b) { + return (float)StrictMath.pow((double)a, (double)b); + } + + static float strict_scalar_atan2(float a, float b) { + return (float)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(float a) { + return Float.isNaN(a); + } + static boolean isFinite(float a) { + return Float.isFinite(a); + } + static boolean isInfinite(float a) { + return Float.isInfinite(a); + } + @Test static void smokeTest1() { FloatVector three = FloatVector.broadcast(SPECIES, (byte)-3); @@ -1694,7 +1893,7 @@ relativeError)); } static float ADD(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1715,7 +1914,7 @@ relativeError)); } static float add(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1772,7 +1971,7 @@ relativeError)); } static float SUB(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1793,7 +1992,7 @@ relativeError)); } static float sub(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1850,7 +2049,7 @@ relativeError)); } static float MUL(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1871,7 +2070,7 @@ relativeError)); } static float mul(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1928,7 +2127,7 @@ relativeError)); } static float DIV(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1949,7 +2148,7 @@ relativeError)); } static float div(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2006,7 +2205,7 @@ relativeError)); } static float FIRST_NONZERO(float a, float b) { - return (float)(Double.doubleToLongBits(a)!=0?a:b); + return (float)(firstNonZero(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2308,7 +2507,7 @@ relativeError)); } static float MIN(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2329,7 +2528,7 @@ relativeError)); } static float min(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2348,7 +2547,7 @@ relativeError)); } static float MAX(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2369,7 +2568,7 @@ relativeError)); } static float max(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2446,7 +2645,7 @@ relativeError)); static float ADDReduce(float[] a, int idx) { float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2455,7 +2654,7 @@ relativeError)); static float ADDReduceAll(float[] a) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2473,7 +2672,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2486,20 +2685,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = ADD_IDENTITY; - assertEquals((float) (id + id), id, + assertEquals((float) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id + x), x); - assertEquals((float) (x + id), x); + assertEquals((float) (scalar_add(id, x)), x); + assertEquals((float) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id + x), x, + assertEquals((float) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x + id), x, + assertEquals((float) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2508,7 +2707,7 @@ relativeError)); float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2517,7 +2716,7 @@ relativeError)); static float ADDReduceAllMasked(float[] a, boolean[] mask) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2537,7 +2736,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2548,7 +2747,7 @@ relativeError)); static float MULReduce(float[] a, int idx) { float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2557,7 +2756,7 @@ relativeError)); static float MULReduceAll(float[] a) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2575,7 +2774,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2588,20 +2787,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MUL_IDENTITY; - assertEquals((float) (id * id), id, + assertEquals((float) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id * x), x); - assertEquals((float) (x * id), x); + assertEquals((float) (scalar_mul(id, x)), x); + assertEquals((float) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id * x), x, + assertEquals((float) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x * id), x, + assertEquals((float) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2610,7 +2809,7 @@ relativeError)); float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2619,7 +2818,7 @@ relativeError)); static float MULReduceAllMasked(float[] a, boolean[] mask) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2639,7 +2838,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2650,7 +2849,7 @@ relativeError)); static float MINReduce(float[] a, int idx) { float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2659,7 +2858,7 @@ relativeError)); static float MINReduceAll(float[] a) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2677,7 +2876,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2690,20 +2889,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MIN_IDENTITY; - assertEquals((float) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.min(id, x), x); - assertEquals((float) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2712,7 +2911,7 @@ relativeError)); float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2721,7 +2920,7 @@ relativeError)); static float MINReduceAllMasked(float[] a, boolean[] mask) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2741,7 +2940,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2752,7 +2951,7 @@ relativeError)); static float MAXReduce(float[] a, int idx) { float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2761,7 +2960,7 @@ relativeError)); static float MAXReduceAll(float[] a) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2779,7 +2978,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2792,20 +2991,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MAX_IDENTITY; - assertEquals((float) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.max(id, x), x); - assertEquals((float) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2814,7 +3013,7 @@ relativeError)); float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2823,7 +3022,7 @@ relativeError)); static float MAXReduceAllMasked(float[] a, boolean[] mask) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2843,7 +3042,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3055,7 +3254,7 @@ relativeError)); } static boolean testIS_FINITE(float a) { - return Float.isFinite(a); + return isFinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3096,7 +3295,7 @@ relativeError)); } static boolean testIS_NAN(float a) { - return Float.isNaN(a); + return isNaN(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3137,7 +3336,7 @@ relativeError)); } static boolean testIS_INFINITE(float a) { - return Float.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3478,7 +3677,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3498,7 +3697,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3514,7 +3713,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (float)((long)b[i]))); } } } @@ -3534,7 +3733,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (float)((long)b[i])))); } } } @@ -3550,7 +3749,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3570,7 +3769,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3586,7 +3785,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (float)((long)b[i]))); } } } @@ -3606,7 +3805,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (float)((long)b[i])))); } } } @@ -4106,11 +4305,11 @@ relativeError)); } static float SIN(float a) { - return (float)(Math.sin((double)a)); + return (float)(scalar_sin(a)); } static float strictSIN(float a) { - return (float)(StrictMath.sin((double)a)); + return (float)(strict_scalar_sin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4129,11 +4328,11 @@ relativeError)); } static float EXP(float a) { - return (float)(Math.exp((double)a)); + return (float)(scalar_exp(a)); } static float strictEXP(float a) { - return (float)(StrictMath.exp((double)a)); + return (float)(strict_scalar_exp(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4152,11 +4351,11 @@ relativeError)); } static float LOG1P(float a) { - return (float)(Math.log1p((double)a)); + return (float)(scalar_log1p(a)); } static float strictLOG1P(float a) { - return (float)(StrictMath.log1p((double)a)); + return (float)(strict_scalar_log1p(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4175,11 +4374,11 @@ relativeError)); } static float LOG(float a) { - return (float)(Math.log((double)a)); + return (float)(scalar_log(a)); } static float strictLOG(float a) { - return (float)(StrictMath.log((double)a)); + return (float)(strict_scalar_log(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4198,11 +4397,11 @@ relativeError)); } static float LOG10(float a) { - return (float)(Math.log10((double)a)); + return (float)(scalar_log10(a)); } static float strictLOG10(float a) { - return (float)(StrictMath.log10((double)a)); + return (float)(strict_scalar_log10(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4221,11 +4420,11 @@ relativeError)); } static float EXPM1(float a) { - return (float)(Math.expm1((double)a)); + return (float)(scalar_expm1(a)); } static float strictEXPM1(float a) { - return (float)(StrictMath.expm1((double)a)); + return (float)(strict_scalar_expm1(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4244,11 +4443,11 @@ relativeError)); } static float COS(float a) { - return (float)(Math.cos((double)a)); + return (float)(scalar_cos(a)); } static float strictCOS(float a) { - return (float)(StrictMath.cos((double)a)); + return (float)(strict_scalar_cos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4267,11 +4466,11 @@ relativeError)); } static float TAN(float a) { - return (float)(Math.tan((double)a)); + return (float)(scalar_tan(a)); } static float strictTAN(float a) { - return (float)(StrictMath.tan((double)a)); + return (float)(strict_scalar_tan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4290,11 +4489,11 @@ relativeError)); } static float SINH(float a) { - return (float)(Math.sinh((double)a)); + return (float)(scalar_sinh(a)); } static float strictSINH(float a) { - return (float)(StrictMath.sinh((double)a)); + return (float)(strict_scalar_sinh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4313,11 +4512,11 @@ relativeError)); } static float COSH(float a) { - return (float)(Math.cosh((double)a)); + return (float)(scalar_cosh(a)); } static float strictCOSH(float a) { - return (float)(StrictMath.cosh((double)a)); + return (float)(strict_scalar_cosh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4336,11 +4535,11 @@ relativeError)); } static float TANH(float a) { - return (float)(Math.tanh((double)a)); + return (float)(scalar_tanh(a)); } static float strictTANH(float a) { - return (float)(StrictMath.tanh((double)a)); + return (float)(strict_scalar_tanh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4359,11 +4558,11 @@ relativeError)); } static float ASIN(float a) { - return (float)(Math.asin((double)a)); + return (float)(scalar_asin(a)); } static float strictASIN(float a) { - return (float)(StrictMath.asin((double)a)); + return (float)(strict_scalar_asin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4382,11 +4581,11 @@ relativeError)); } static float ACOS(float a) { - return (float)(Math.acos((double)a)); + return (float)(scalar_acos(a)); } static float strictACOS(float a) { - return (float)(StrictMath.acos((double)a)); + return (float)(strict_scalar_acos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4405,11 +4604,11 @@ relativeError)); } static float ATAN(float a) { - return (float)(Math.atan((double)a)); + return (float)(scalar_atan(a)); } static float strictATAN(float a) { - return (float)(StrictMath.atan((double)a)); + return (float)(strict_scalar_atan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4428,11 +4627,11 @@ relativeError)); } static float CBRT(float a) { - return (float)(Math.cbrt((double)a)); + return (float)(scalar_cbrt(a)); } static float strictCBRT(float a) { - return (float)(StrictMath.cbrt((double)a)); + return (float)(strict_scalar_cbrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4451,11 +4650,11 @@ relativeError)); } static float HYPOT(float a, float b) { - return (float)(Math.hypot((double)a, (double)b)); + return (float)(scalar_hypot(a, b)); } static float strictHYPOT(float a, float b) { - return (float)(StrictMath.hypot((double)a, (double)b)); + return (float)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4477,11 +4676,11 @@ relativeError)); static float POW(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictPOW(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4503,11 +4702,11 @@ relativeError)); static float pow(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictpow(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4529,11 +4728,11 @@ relativeError)); static float ATAN2(float a, float b) { - return (float)(Math.atan2((double)a, (double)b)); + return (float)(scalar_atan2(a, b)); } static float strictATAN2(float a, float b) { - return (float)(StrictMath.atan2((double)a, (double)b)); + return (float)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4585,11 +4784,11 @@ relativeError)); static float FMA(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } static float fma(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } @Test(dataProvider = "floatTernaryOpProvider") @@ -4767,11 +4966,11 @@ relativeError)); } static float NEG(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } static float neg(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4823,11 +5022,11 @@ relativeError)); } static float ABS(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } static float abs(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4879,11 +5078,11 @@ relativeError)); } static float SQRT(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } static float sqrt(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -5096,7 +5295,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5112,7 +5311,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5181,7 +5380,7 @@ relativeError)); static long ADDReduceLong(float[] a, int idx) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5190,7 +5389,7 @@ relativeError)); static long ADDReduceAllLong(float[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((float)res, (float)ADDReduceLong(a, i)); } return res; @@ -5208,8 +5407,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5219,8 +5418,9 @@ relativeError)); static long ADDReduceLongMasked(float[] a, int idx, boolean[] mask) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5229,7 +5429,7 @@ relativeError)); static long ADDReduceAllLongMasked(float[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((float)res, (float)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5249,8 +5449,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/FloatVector512Tests.java b/test/jdk/jdk/incubator/vector/FloatVector512Tests.java index 17493778826..6a958511439 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector512Tests.java @@ -1601,6 +1601,205 @@ relativeError)); return Float.compare(a, (float) 0) != 0 ? a : b; } + + static float scalar_add(float a, float b) { + return (float)(a + b); + } + + static float scalar_sub(float a, float b) { + return (float)(a - b); + } + + static float scalar_mul(float a, float b) { + return (float)(a * b); + } + + static float scalar_min(float a, float b) { + return (float)(Math.min(a, b)); + } + + static float scalar_max(float a, float b) { + return (float)(Math.max(a, b)); + } + + static float scalar_div(float a, float b) { + return (float)(a / b); + } + + static float scalar_fma(float a, float b, float c) { + return (float)(Math.fma(a, b, c)); + } + + static float scalar_abs(float a) { + return (float)(Math.abs(a)); + } + + static float scalar_neg(float a) { + return ((float)-a); + } + + static float scalar_sin(float a) { + return (float)Math.sin((double)a); + } + + static float scalar_exp(float a) { + return (float)Math.exp((double)a); + } + + static float scalar_log1p(float a) { + return (float)Math.log1p((double)a); + } + + static float scalar_log(float a) { + return (float)Math.log((double)a); + } + + static float scalar_log10(float a) { + return (float)Math.log10((double)a); + } + + static float scalar_expm1(float a) { + return (float)Math.expm1((double)a); + } + + static float scalar_cos(float a) { + return (float)Math.cos((double)a); + } + + static float scalar_tan(float a) { + return (float)Math.tan((double)a); + } + + static float scalar_sinh(float a) { + return (float)Math.sinh((double)a); + } + + static float scalar_cosh(float a) { + return (float)Math.cosh((double)a); + } + + static float scalar_tanh(float a) { + return (float)Math.tanh((double)a); + } + + static float scalar_asin(float a) { + return (float)Math.asin((double)a); + } + + static float scalar_acos(float a) { + return (float)Math.acos((double)a); + } + + static float scalar_atan(float a) { + return (float)Math.atan((double)a); + } + + static float scalar_cbrt(float a) { + return (float)Math.cbrt((double)a); + } + + static float scalar_sqrt(float a) { + return (float)Math.sqrt((double)a); + } + + static float scalar_hypot(float a, float b) { + return (float)Math.hypot((double)a, (double)b); + } + + static float scalar_pow(float a, float b) { + return (float)Math.pow((double)a, (double)b); + } + + static float scalar_atan2(float a, float b) { + return (float)Math.atan2((double)a, (double)b); + } + + static float strict_scalar_sin(float a) { + return (float)StrictMath.sin((double)a); + } + + static float strict_scalar_exp(float a) { + return (float)StrictMath.exp((double)a); + } + + static float strict_scalar_log1p(float a) { + return (float)StrictMath.log1p((double)a); + } + + static float strict_scalar_log(float a) { + return (float)StrictMath.log((double)a); + } + + static float strict_scalar_log10(float a) { + return (float)StrictMath.log10((double)a); + } + + static float strict_scalar_expm1(float a) { + return (float)StrictMath.expm1((double)a); + } + + static float strict_scalar_cos(float a) { + return (float)StrictMath.cos((double)a); + } + + static float strict_scalar_tan(float a) { + return (float)StrictMath.tan((double)a); + } + + static float strict_scalar_sinh(float a) { + return (float)StrictMath.sinh((double)a); + } + + static float strict_scalar_cosh(float a) { + return (float)StrictMath.cosh((double)a); + } + + static float strict_scalar_tanh(float a) { + return (float)StrictMath.tanh((double)a); + } + + static float strict_scalar_asin(float a) { + return (float)StrictMath.asin((double)a); + } + + static float strict_scalar_acos(float a) { + return (float)StrictMath.acos((double)a); + } + + static float strict_scalar_atan(float a) { + return (float)StrictMath.atan((double)a); + } + + static float strict_scalar_cbrt(float a) { + return (float)StrictMath.cbrt((double)a); + } + + static float strict_scalar_sqrt(float a) { + return (float)StrictMath.sqrt((double)a); + } + + static float strict_scalar_hypot(float a, float b) { + return (float)StrictMath.hypot((double)a, (double)b); + } + + static float strict_scalar_pow(float a, float b) { + return (float)StrictMath.pow((double)a, (double)b); + } + + static float strict_scalar_atan2(float a, float b) { + return (float)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(float a) { + return Float.isNaN(a); + } + static boolean isFinite(float a) { + return Float.isFinite(a); + } + static boolean isInfinite(float a) { + return Float.isInfinite(a); + } + @Test static void smokeTest1() { FloatVector three = FloatVector.broadcast(SPECIES, (byte)-3); @@ -1694,7 +1893,7 @@ relativeError)); } static float ADD(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1715,7 +1914,7 @@ relativeError)); } static float add(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1772,7 +1971,7 @@ relativeError)); } static float SUB(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1793,7 +1992,7 @@ relativeError)); } static float sub(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1850,7 +2049,7 @@ relativeError)); } static float MUL(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1871,7 +2070,7 @@ relativeError)); } static float mul(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1928,7 +2127,7 @@ relativeError)); } static float DIV(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1949,7 +2148,7 @@ relativeError)); } static float div(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2006,7 +2205,7 @@ relativeError)); } static float FIRST_NONZERO(float a, float b) { - return (float)(Double.doubleToLongBits(a)!=0?a:b); + return (float)(firstNonZero(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2308,7 +2507,7 @@ relativeError)); } static float MIN(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2329,7 +2528,7 @@ relativeError)); } static float min(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2348,7 +2547,7 @@ relativeError)); } static float MAX(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2369,7 +2568,7 @@ relativeError)); } static float max(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2446,7 +2645,7 @@ relativeError)); static float ADDReduce(float[] a, int idx) { float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2455,7 +2654,7 @@ relativeError)); static float ADDReduceAll(float[] a) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2473,7 +2672,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2486,20 +2685,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = ADD_IDENTITY; - assertEquals((float) (id + id), id, + assertEquals((float) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id + x), x); - assertEquals((float) (x + id), x); + assertEquals((float) (scalar_add(id, x)), x); + assertEquals((float) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id + x), x, + assertEquals((float) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x + id), x, + assertEquals((float) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2508,7 +2707,7 @@ relativeError)); float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2517,7 +2716,7 @@ relativeError)); static float ADDReduceAllMasked(float[] a, boolean[] mask) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2537,7 +2736,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2548,7 +2747,7 @@ relativeError)); static float MULReduce(float[] a, int idx) { float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2557,7 +2756,7 @@ relativeError)); static float MULReduceAll(float[] a) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2575,7 +2774,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2588,20 +2787,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MUL_IDENTITY; - assertEquals((float) (id * id), id, + assertEquals((float) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id * x), x); - assertEquals((float) (x * id), x); + assertEquals((float) (scalar_mul(id, x)), x); + assertEquals((float) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id * x), x, + assertEquals((float) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x * id), x, + assertEquals((float) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2610,7 +2809,7 @@ relativeError)); float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2619,7 +2818,7 @@ relativeError)); static float MULReduceAllMasked(float[] a, boolean[] mask) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2639,7 +2838,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2650,7 +2849,7 @@ relativeError)); static float MINReduce(float[] a, int idx) { float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2659,7 +2858,7 @@ relativeError)); static float MINReduceAll(float[] a) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2677,7 +2876,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2690,20 +2889,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MIN_IDENTITY; - assertEquals((float) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.min(id, x), x); - assertEquals((float) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2712,7 +2911,7 @@ relativeError)); float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2721,7 +2920,7 @@ relativeError)); static float MINReduceAllMasked(float[] a, boolean[] mask) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2741,7 +2940,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2752,7 +2951,7 @@ relativeError)); static float MAXReduce(float[] a, int idx) { float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2761,7 +2960,7 @@ relativeError)); static float MAXReduceAll(float[] a) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2779,7 +2978,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2792,20 +2991,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MAX_IDENTITY; - assertEquals((float) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.max(id, x), x); - assertEquals((float) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2814,7 +3013,7 @@ relativeError)); float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2823,7 +3022,7 @@ relativeError)); static float MAXReduceAllMasked(float[] a, boolean[] mask) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2843,7 +3042,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3055,7 +3254,7 @@ relativeError)); } static boolean testIS_FINITE(float a) { - return Float.isFinite(a); + return isFinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3096,7 +3295,7 @@ relativeError)); } static boolean testIS_NAN(float a) { - return Float.isNaN(a); + return isNaN(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3137,7 +3336,7 @@ relativeError)); } static boolean testIS_INFINITE(float a) { - return Float.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3478,7 +3677,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3498,7 +3697,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3514,7 +3713,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (float)((long)b[i]))); } } } @@ -3534,7 +3733,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (float)((long)b[i])))); } } } @@ -3550,7 +3749,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3570,7 +3769,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3586,7 +3785,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (float)((long)b[i]))); } } } @@ -3606,7 +3805,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (float)((long)b[i])))); } } } @@ -4106,11 +4305,11 @@ relativeError)); } static float SIN(float a) { - return (float)(Math.sin((double)a)); + return (float)(scalar_sin(a)); } static float strictSIN(float a) { - return (float)(StrictMath.sin((double)a)); + return (float)(strict_scalar_sin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4129,11 +4328,11 @@ relativeError)); } static float EXP(float a) { - return (float)(Math.exp((double)a)); + return (float)(scalar_exp(a)); } static float strictEXP(float a) { - return (float)(StrictMath.exp((double)a)); + return (float)(strict_scalar_exp(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4152,11 +4351,11 @@ relativeError)); } static float LOG1P(float a) { - return (float)(Math.log1p((double)a)); + return (float)(scalar_log1p(a)); } static float strictLOG1P(float a) { - return (float)(StrictMath.log1p((double)a)); + return (float)(strict_scalar_log1p(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4175,11 +4374,11 @@ relativeError)); } static float LOG(float a) { - return (float)(Math.log((double)a)); + return (float)(scalar_log(a)); } static float strictLOG(float a) { - return (float)(StrictMath.log((double)a)); + return (float)(strict_scalar_log(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4198,11 +4397,11 @@ relativeError)); } static float LOG10(float a) { - return (float)(Math.log10((double)a)); + return (float)(scalar_log10(a)); } static float strictLOG10(float a) { - return (float)(StrictMath.log10((double)a)); + return (float)(strict_scalar_log10(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4221,11 +4420,11 @@ relativeError)); } static float EXPM1(float a) { - return (float)(Math.expm1((double)a)); + return (float)(scalar_expm1(a)); } static float strictEXPM1(float a) { - return (float)(StrictMath.expm1((double)a)); + return (float)(strict_scalar_expm1(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4244,11 +4443,11 @@ relativeError)); } static float COS(float a) { - return (float)(Math.cos((double)a)); + return (float)(scalar_cos(a)); } static float strictCOS(float a) { - return (float)(StrictMath.cos((double)a)); + return (float)(strict_scalar_cos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4267,11 +4466,11 @@ relativeError)); } static float TAN(float a) { - return (float)(Math.tan((double)a)); + return (float)(scalar_tan(a)); } static float strictTAN(float a) { - return (float)(StrictMath.tan((double)a)); + return (float)(strict_scalar_tan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4290,11 +4489,11 @@ relativeError)); } static float SINH(float a) { - return (float)(Math.sinh((double)a)); + return (float)(scalar_sinh(a)); } static float strictSINH(float a) { - return (float)(StrictMath.sinh((double)a)); + return (float)(strict_scalar_sinh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4313,11 +4512,11 @@ relativeError)); } static float COSH(float a) { - return (float)(Math.cosh((double)a)); + return (float)(scalar_cosh(a)); } static float strictCOSH(float a) { - return (float)(StrictMath.cosh((double)a)); + return (float)(strict_scalar_cosh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4336,11 +4535,11 @@ relativeError)); } static float TANH(float a) { - return (float)(Math.tanh((double)a)); + return (float)(scalar_tanh(a)); } static float strictTANH(float a) { - return (float)(StrictMath.tanh((double)a)); + return (float)(strict_scalar_tanh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4359,11 +4558,11 @@ relativeError)); } static float ASIN(float a) { - return (float)(Math.asin((double)a)); + return (float)(scalar_asin(a)); } static float strictASIN(float a) { - return (float)(StrictMath.asin((double)a)); + return (float)(strict_scalar_asin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4382,11 +4581,11 @@ relativeError)); } static float ACOS(float a) { - return (float)(Math.acos((double)a)); + return (float)(scalar_acos(a)); } static float strictACOS(float a) { - return (float)(StrictMath.acos((double)a)); + return (float)(strict_scalar_acos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4405,11 +4604,11 @@ relativeError)); } static float ATAN(float a) { - return (float)(Math.atan((double)a)); + return (float)(scalar_atan(a)); } static float strictATAN(float a) { - return (float)(StrictMath.atan((double)a)); + return (float)(strict_scalar_atan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4428,11 +4627,11 @@ relativeError)); } static float CBRT(float a) { - return (float)(Math.cbrt((double)a)); + return (float)(scalar_cbrt(a)); } static float strictCBRT(float a) { - return (float)(StrictMath.cbrt((double)a)); + return (float)(strict_scalar_cbrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4451,11 +4650,11 @@ relativeError)); } static float HYPOT(float a, float b) { - return (float)(Math.hypot((double)a, (double)b)); + return (float)(scalar_hypot(a, b)); } static float strictHYPOT(float a, float b) { - return (float)(StrictMath.hypot((double)a, (double)b)); + return (float)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4477,11 +4676,11 @@ relativeError)); static float POW(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictPOW(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4503,11 +4702,11 @@ relativeError)); static float pow(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictpow(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4529,11 +4728,11 @@ relativeError)); static float ATAN2(float a, float b) { - return (float)(Math.atan2((double)a, (double)b)); + return (float)(scalar_atan2(a, b)); } static float strictATAN2(float a, float b) { - return (float)(StrictMath.atan2((double)a, (double)b)); + return (float)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4585,11 +4784,11 @@ relativeError)); static float FMA(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } static float fma(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } @Test(dataProvider = "floatTernaryOpProvider") @@ -4767,11 +4966,11 @@ relativeError)); } static float NEG(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } static float neg(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4823,11 +5022,11 @@ relativeError)); } static float ABS(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } static float abs(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4879,11 +5078,11 @@ relativeError)); } static float SQRT(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } static float sqrt(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -5096,7 +5295,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5112,7 +5311,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5181,7 +5380,7 @@ relativeError)); static long ADDReduceLong(float[] a, int idx) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5190,7 +5389,7 @@ relativeError)); static long ADDReduceAllLong(float[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((float)res, (float)ADDReduceLong(a, i)); } return res; @@ -5208,8 +5407,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5219,8 +5418,9 @@ relativeError)); static long ADDReduceLongMasked(float[] a, int idx, boolean[] mask) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5229,7 +5429,7 @@ relativeError)); static long ADDReduceAllLongMasked(float[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((float)res, (float)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5249,8 +5449,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/FloatVector64Tests.java b/test/jdk/jdk/incubator/vector/FloatVector64Tests.java index 663a56dfe26..b06dff18194 100644 --- a/test/jdk/jdk/incubator/vector/FloatVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/FloatVector64Tests.java @@ -1601,6 +1601,205 @@ relativeError)); return Float.compare(a, (float) 0) != 0 ? a : b; } + + static float scalar_add(float a, float b) { + return (float)(a + b); + } + + static float scalar_sub(float a, float b) { + return (float)(a - b); + } + + static float scalar_mul(float a, float b) { + return (float)(a * b); + } + + static float scalar_min(float a, float b) { + return (float)(Math.min(a, b)); + } + + static float scalar_max(float a, float b) { + return (float)(Math.max(a, b)); + } + + static float scalar_div(float a, float b) { + return (float)(a / b); + } + + static float scalar_fma(float a, float b, float c) { + return (float)(Math.fma(a, b, c)); + } + + static float scalar_abs(float a) { + return (float)(Math.abs(a)); + } + + static float scalar_neg(float a) { + return ((float)-a); + } + + static float scalar_sin(float a) { + return (float)Math.sin((double)a); + } + + static float scalar_exp(float a) { + return (float)Math.exp((double)a); + } + + static float scalar_log1p(float a) { + return (float)Math.log1p((double)a); + } + + static float scalar_log(float a) { + return (float)Math.log((double)a); + } + + static float scalar_log10(float a) { + return (float)Math.log10((double)a); + } + + static float scalar_expm1(float a) { + return (float)Math.expm1((double)a); + } + + static float scalar_cos(float a) { + return (float)Math.cos((double)a); + } + + static float scalar_tan(float a) { + return (float)Math.tan((double)a); + } + + static float scalar_sinh(float a) { + return (float)Math.sinh((double)a); + } + + static float scalar_cosh(float a) { + return (float)Math.cosh((double)a); + } + + static float scalar_tanh(float a) { + return (float)Math.tanh((double)a); + } + + static float scalar_asin(float a) { + return (float)Math.asin((double)a); + } + + static float scalar_acos(float a) { + return (float)Math.acos((double)a); + } + + static float scalar_atan(float a) { + return (float)Math.atan((double)a); + } + + static float scalar_cbrt(float a) { + return (float)Math.cbrt((double)a); + } + + static float scalar_sqrt(float a) { + return (float)Math.sqrt((double)a); + } + + static float scalar_hypot(float a, float b) { + return (float)Math.hypot((double)a, (double)b); + } + + static float scalar_pow(float a, float b) { + return (float)Math.pow((double)a, (double)b); + } + + static float scalar_atan2(float a, float b) { + return (float)Math.atan2((double)a, (double)b); + } + + static float strict_scalar_sin(float a) { + return (float)StrictMath.sin((double)a); + } + + static float strict_scalar_exp(float a) { + return (float)StrictMath.exp((double)a); + } + + static float strict_scalar_log1p(float a) { + return (float)StrictMath.log1p((double)a); + } + + static float strict_scalar_log(float a) { + return (float)StrictMath.log((double)a); + } + + static float strict_scalar_log10(float a) { + return (float)StrictMath.log10((double)a); + } + + static float strict_scalar_expm1(float a) { + return (float)StrictMath.expm1((double)a); + } + + static float strict_scalar_cos(float a) { + return (float)StrictMath.cos((double)a); + } + + static float strict_scalar_tan(float a) { + return (float)StrictMath.tan((double)a); + } + + static float strict_scalar_sinh(float a) { + return (float)StrictMath.sinh((double)a); + } + + static float strict_scalar_cosh(float a) { + return (float)StrictMath.cosh((double)a); + } + + static float strict_scalar_tanh(float a) { + return (float)StrictMath.tanh((double)a); + } + + static float strict_scalar_asin(float a) { + return (float)StrictMath.asin((double)a); + } + + static float strict_scalar_acos(float a) { + return (float)StrictMath.acos((double)a); + } + + static float strict_scalar_atan(float a) { + return (float)StrictMath.atan((double)a); + } + + static float strict_scalar_cbrt(float a) { + return (float)StrictMath.cbrt((double)a); + } + + static float strict_scalar_sqrt(float a) { + return (float)StrictMath.sqrt((double)a); + } + + static float strict_scalar_hypot(float a, float b) { + return (float)StrictMath.hypot((double)a, (double)b); + } + + static float strict_scalar_pow(float a, float b) { + return (float)StrictMath.pow((double)a, (double)b); + } + + static float strict_scalar_atan2(float a, float b) { + return (float)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(float a) { + return Float.isNaN(a); + } + static boolean isFinite(float a) { + return Float.isFinite(a); + } + static boolean isInfinite(float a) { + return Float.isInfinite(a); + } + @Test static void smokeTest1() { FloatVector three = FloatVector.broadcast(SPECIES, (byte)-3); @@ -1694,7 +1893,7 @@ relativeError)); } static float ADD(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1715,7 +1914,7 @@ relativeError)); } static float add(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1772,7 +1971,7 @@ relativeError)); } static float SUB(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1793,7 +1992,7 @@ relativeError)); } static float sub(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1850,7 +2049,7 @@ relativeError)); } static float MUL(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1871,7 +2070,7 @@ relativeError)); } static float mul(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1928,7 +2127,7 @@ relativeError)); } static float DIV(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1949,7 +2148,7 @@ relativeError)); } static float div(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2006,7 +2205,7 @@ relativeError)); } static float FIRST_NONZERO(float a, float b) { - return (float)(Double.doubleToLongBits(a)!=0?a:b); + return (float)(firstNonZero(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2308,7 +2507,7 @@ relativeError)); } static float MIN(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2329,7 +2528,7 @@ relativeError)); } static float min(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2348,7 +2547,7 @@ relativeError)); } static float MAX(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2369,7 +2568,7 @@ relativeError)); } static float max(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2446,7 +2645,7 @@ relativeError)); static float ADDReduce(float[] a, int idx) { float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2455,7 +2654,7 @@ relativeError)); static float ADDReduceAll(float[] a) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2473,7 +2672,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2486,20 +2685,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = ADD_IDENTITY; - assertEquals((float) (id + id), id, + assertEquals((float) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id + x), x); - assertEquals((float) (x + id), x); + assertEquals((float) (scalar_add(id, x)), x); + assertEquals((float) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id + x), x, + assertEquals((float) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x + id), x, + assertEquals((float) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2508,7 +2707,7 @@ relativeError)); float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2517,7 +2716,7 @@ relativeError)); static float ADDReduceAllMasked(float[] a, boolean[] mask) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2537,7 +2736,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2548,7 +2747,7 @@ relativeError)); static float MULReduce(float[] a, int idx) { float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2557,7 +2756,7 @@ relativeError)); static float MULReduceAll(float[] a) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2575,7 +2774,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2588,20 +2787,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MUL_IDENTITY; - assertEquals((float) (id * id), id, + assertEquals((float) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id * x), x); - assertEquals((float) (x * id), x); + assertEquals((float) (scalar_mul(id, x)), x); + assertEquals((float) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id * x), x, + assertEquals((float) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x * id), x, + assertEquals((float) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2610,7 +2809,7 @@ relativeError)); float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2619,7 +2818,7 @@ relativeError)); static float MULReduceAllMasked(float[] a, boolean[] mask) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2639,7 +2838,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2650,7 +2849,7 @@ relativeError)); static float MINReduce(float[] a, int idx) { float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2659,7 +2858,7 @@ relativeError)); static float MINReduceAll(float[] a) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2677,7 +2876,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2690,20 +2889,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MIN_IDENTITY; - assertEquals((float) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.min(id, x), x); - assertEquals((float) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2712,7 +2911,7 @@ relativeError)); float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2721,7 +2920,7 @@ relativeError)); static float MINReduceAllMasked(float[] a, boolean[] mask) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2741,7 +2940,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2752,7 +2951,7 @@ relativeError)); static float MAXReduce(float[] a, int idx) { float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2761,7 +2960,7 @@ relativeError)); static float MAXReduceAll(float[] a) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2779,7 +2978,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2792,20 +2991,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MAX_IDENTITY; - assertEquals((float) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.max(id, x), x); - assertEquals((float) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2814,7 +3013,7 @@ relativeError)); float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2823,7 +3022,7 @@ relativeError)); static float MAXReduceAllMasked(float[] a, boolean[] mask) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2843,7 +3042,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3055,7 +3254,7 @@ relativeError)); } static boolean testIS_FINITE(float a) { - return Float.isFinite(a); + return isFinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3096,7 +3295,7 @@ relativeError)); } static boolean testIS_NAN(float a) { - return Float.isNaN(a); + return isNaN(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3137,7 +3336,7 @@ relativeError)); } static boolean testIS_INFINITE(float a) { - return Float.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3478,7 +3677,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3498,7 +3697,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3514,7 +3713,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (float)((long)b[i]))); } } } @@ -3534,7 +3733,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (float)((long)b[i])))); } } } @@ -3550,7 +3749,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3570,7 +3769,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3586,7 +3785,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (float)((long)b[i]))); } } } @@ -3606,7 +3805,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (float)((long)b[i])))); } } } @@ -4106,11 +4305,11 @@ relativeError)); } static float SIN(float a) { - return (float)(Math.sin((double)a)); + return (float)(scalar_sin(a)); } static float strictSIN(float a) { - return (float)(StrictMath.sin((double)a)); + return (float)(strict_scalar_sin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4129,11 +4328,11 @@ relativeError)); } static float EXP(float a) { - return (float)(Math.exp((double)a)); + return (float)(scalar_exp(a)); } static float strictEXP(float a) { - return (float)(StrictMath.exp((double)a)); + return (float)(strict_scalar_exp(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4152,11 +4351,11 @@ relativeError)); } static float LOG1P(float a) { - return (float)(Math.log1p((double)a)); + return (float)(scalar_log1p(a)); } static float strictLOG1P(float a) { - return (float)(StrictMath.log1p((double)a)); + return (float)(strict_scalar_log1p(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4175,11 +4374,11 @@ relativeError)); } static float LOG(float a) { - return (float)(Math.log((double)a)); + return (float)(scalar_log(a)); } static float strictLOG(float a) { - return (float)(StrictMath.log((double)a)); + return (float)(strict_scalar_log(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4198,11 +4397,11 @@ relativeError)); } static float LOG10(float a) { - return (float)(Math.log10((double)a)); + return (float)(scalar_log10(a)); } static float strictLOG10(float a) { - return (float)(StrictMath.log10((double)a)); + return (float)(strict_scalar_log10(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4221,11 +4420,11 @@ relativeError)); } static float EXPM1(float a) { - return (float)(Math.expm1((double)a)); + return (float)(scalar_expm1(a)); } static float strictEXPM1(float a) { - return (float)(StrictMath.expm1((double)a)); + return (float)(strict_scalar_expm1(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4244,11 +4443,11 @@ relativeError)); } static float COS(float a) { - return (float)(Math.cos((double)a)); + return (float)(scalar_cos(a)); } static float strictCOS(float a) { - return (float)(StrictMath.cos((double)a)); + return (float)(strict_scalar_cos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4267,11 +4466,11 @@ relativeError)); } static float TAN(float a) { - return (float)(Math.tan((double)a)); + return (float)(scalar_tan(a)); } static float strictTAN(float a) { - return (float)(StrictMath.tan((double)a)); + return (float)(strict_scalar_tan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4290,11 +4489,11 @@ relativeError)); } static float SINH(float a) { - return (float)(Math.sinh((double)a)); + return (float)(scalar_sinh(a)); } static float strictSINH(float a) { - return (float)(StrictMath.sinh((double)a)); + return (float)(strict_scalar_sinh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4313,11 +4512,11 @@ relativeError)); } static float COSH(float a) { - return (float)(Math.cosh((double)a)); + return (float)(scalar_cosh(a)); } static float strictCOSH(float a) { - return (float)(StrictMath.cosh((double)a)); + return (float)(strict_scalar_cosh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4336,11 +4535,11 @@ relativeError)); } static float TANH(float a) { - return (float)(Math.tanh((double)a)); + return (float)(scalar_tanh(a)); } static float strictTANH(float a) { - return (float)(StrictMath.tanh((double)a)); + return (float)(strict_scalar_tanh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4359,11 +4558,11 @@ relativeError)); } static float ASIN(float a) { - return (float)(Math.asin((double)a)); + return (float)(scalar_asin(a)); } static float strictASIN(float a) { - return (float)(StrictMath.asin((double)a)); + return (float)(strict_scalar_asin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4382,11 +4581,11 @@ relativeError)); } static float ACOS(float a) { - return (float)(Math.acos((double)a)); + return (float)(scalar_acos(a)); } static float strictACOS(float a) { - return (float)(StrictMath.acos((double)a)); + return (float)(strict_scalar_acos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4405,11 +4604,11 @@ relativeError)); } static float ATAN(float a) { - return (float)(Math.atan((double)a)); + return (float)(scalar_atan(a)); } static float strictATAN(float a) { - return (float)(StrictMath.atan((double)a)); + return (float)(strict_scalar_atan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4428,11 +4627,11 @@ relativeError)); } static float CBRT(float a) { - return (float)(Math.cbrt((double)a)); + return (float)(scalar_cbrt(a)); } static float strictCBRT(float a) { - return (float)(StrictMath.cbrt((double)a)); + return (float)(strict_scalar_cbrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4451,11 +4650,11 @@ relativeError)); } static float HYPOT(float a, float b) { - return (float)(Math.hypot((double)a, (double)b)); + return (float)(scalar_hypot(a, b)); } static float strictHYPOT(float a, float b) { - return (float)(StrictMath.hypot((double)a, (double)b)); + return (float)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4477,11 +4676,11 @@ relativeError)); static float POW(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictPOW(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4503,11 +4702,11 @@ relativeError)); static float pow(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictpow(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4529,11 +4728,11 @@ relativeError)); static float ATAN2(float a, float b) { - return (float)(Math.atan2((double)a, (double)b)); + return (float)(scalar_atan2(a, b)); } static float strictATAN2(float a, float b) { - return (float)(StrictMath.atan2((double)a, (double)b)); + return (float)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4585,11 +4784,11 @@ relativeError)); static float FMA(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } static float fma(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } @Test(dataProvider = "floatTernaryOpProvider") @@ -4767,11 +4966,11 @@ relativeError)); } static float NEG(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } static float neg(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4823,11 +5022,11 @@ relativeError)); } static float ABS(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } static float abs(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4879,11 +5078,11 @@ relativeError)); } static float SQRT(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } static float sqrt(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -5096,7 +5295,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5112,7 +5311,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5181,7 +5380,7 @@ relativeError)); static long ADDReduceLong(float[] a, int idx) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5190,7 +5389,7 @@ relativeError)); static long ADDReduceAllLong(float[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((float)res, (float)ADDReduceLong(a, i)); } return res; @@ -5208,8 +5407,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5219,8 +5418,9 @@ relativeError)); static long ADDReduceLongMasked(float[] a, int idx, boolean[] mask) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5229,7 +5429,7 @@ relativeError)); static long ADDReduceAllLongMasked(float[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((float)res, (float)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5249,8 +5449,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java b/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java index 9d272f43863..9b84e852c1c 100644 --- a/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/FloatVectorMaxTests.java @@ -1607,6 +1607,205 @@ relativeError)); return Float.compare(a, (float) 0) != 0 ? a : b; } + + static float scalar_add(float a, float b) { + return (float)(a + b); + } + + static float scalar_sub(float a, float b) { + return (float)(a - b); + } + + static float scalar_mul(float a, float b) { + return (float)(a * b); + } + + static float scalar_min(float a, float b) { + return (float)(Math.min(a, b)); + } + + static float scalar_max(float a, float b) { + return (float)(Math.max(a, b)); + } + + static float scalar_div(float a, float b) { + return (float)(a / b); + } + + static float scalar_fma(float a, float b, float c) { + return (float)(Math.fma(a, b, c)); + } + + static float scalar_abs(float a) { + return (float)(Math.abs(a)); + } + + static float scalar_neg(float a) { + return ((float)-a); + } + + static float scalar_sin(float a) { + return (float)Math.sin((double)a); + } + + static float scalar_exp(float a) { + return (float)Math.exp((double)a); + } + + static float scalar_log1p(float a) { + return (float)Math.log1p((double)a); + } + + static float scalar_log(float a) { + return (float)Math.log((double)a); + } + + static float scalar_log10(float a) { + return (float)Math.log10((double)a); + } + + static float scalar_expm1(float a) { + return (float)Math.expm1((double)a); + } + + static float scalar_cos(float a) { + return (float)Math.cos((double)a); + } + + static float scalar_tan(float a) { + return (float)Math.tan((double)a); + } + + static float scalar_sinh(float a) { + return (float)Math.sinh((double)a); + } + + static float scalar_cosh(float a) { + return (float)Math.cosh((double)a); + } + + static float scalar_tanh(float a) { + return (float)Math.tanh((double)a); + } + + static float scalar_asin(float a) { + return (float)Math.asin((double)a); + } + + static float scalar_acos(float a) { + return (float)Math.acos((double)a); + } + + static float scalar_atan(float a) { + return (float)Math.atan((double)a); + } + + static float scalar_cbrt(float a) { + return (float)Math.cbrt((double)a); + } + + static float scalar_sqrt(float a) { + return (float)Math.sqrt((double)a); + } + + static float scalar_hypot(float a, float b) { + return (float)Math.hypot((double)a, (double)b); + } + + static float scalar_pow(float a, float b) { + return (float)Math.pow((double)a, (double)b); + } + + static float scalar_atan2(float a, float b) { + return (float)Math.atan2((double)a, (double)b); + } + + static float strict_scalar_sin(float a) { + return (float)StrictMath.sin((double)a); + } + + static float strict_scalar_exp(float a) { + return (float)StrictMath.exp((double)a); + } + + static float strict_scalar_log1p(float a) { + return (float)StrictMath.log1p((double)a); + } + + static float strict_scalar_log(float a) { + return (float)StrictMath.log((double)a); + } + + static float strict_scalar_log10(float a) { + return (float)StrictMath.log10((double)a); + } + + static float strict_scalar_expm1(float a) { + return (float)StrictMath.expm1((double)a); + } + + static float strict_scalar_cos(float a) { + return (float)StrictMath.cos((double)a); + } + + static float strict_scalar_tan(float a) { + return (float)StrictMath.tan((double)a); + } + + static float strict_scalar_sinh(float a) { + return (float)StrictMath.sinh((double)a); + } + + static float strict_scalar_cosh(float a) { + return (float)StrictMath.cosh((double)a); + } + + static float strict_scalar_tanh(float a) { + return (float)StrictMath.tanh((double)a); + } + + static float strict_scalar_asin(float a) { + return (float)StrictMath.asin((double)a); + } + + static float strict_scalar_acos(float a) { + return (float)StrictMath.acos((double)a); + } + + static float strict_scalar_atan(float a) { + return (float)StrictMath.atan((double)a); + } + + static float strict_scalar_cbrt(float a) { + return (float)StrictMath.cbrt((double)a); + } + + static float strict_scalar_sqrt(float a) { + return (float)StrictMath.sqrt((double)a); + } + + static float strict_scalar_hypot(float a, float b) { + return (float)StrictMath.hypot((double)a, (double)b); + } + + static float strict_scalar_pow(float a, float b) { + return (float)StrictMath.pow((double)a, (double)b); + } + + static float strict_scalar_atan2(float a, float b) { + return (float)StrictMath.atan2((double)a, (double)b); + } + + static boolean isNaN(float a) { + return Float.isNaN(a); + } + static boolean isFinite(float a) { + return Float.isFinite(a); + } + static boolean isInfinite(float a) { + return Float.isInfinite(a); + } + @Test static void smokeTest1() { FloatVector three = FloatVector.broadcast(SPECIES, (byte)-3); @@ -1700,7 +1899,7 @@ relativeError)); } static float ADD(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1721,7 +1920,7 @@ relativeError)); } static float add(float a, float b) { - return (float)(a + b); + return (float)(scalar_add(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1778,7 +1977,7 @@ relativeError)); } static float SUB(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1799,7 +1998,7 @@ relativeError)); } static float sub(float a, float b) { - return (float)(a - b); + return (float)(scalar_sub(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1856,7 +2055,7 @@ relativeError)); } static float MUL(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1877,7 +2076,7 @@ relativeError)); } static float mul(float a, float b) { - return (float)(a * b); + return (float)(scalar_mul(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1934,7 +2133,7 @@ relativeError)); } static float DIV(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -1955,7 +2154,7 @@ relativeError)); } static float div(float a, float b) { - return (float)(a / b); + return (float)(scalar_div(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2012,7 +2211,7 @@ relativeError)); } static float FIRST_NONZERO(float a, float b) { - return (float)(Double.doubleToLongBits(a)!=0?a:b); + return (float)(firstNonZero(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2314,7 +2513,7 @@ relativeError)); } static float MIN(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2335,7 +2534,7 @@ relativeError)); } static float min(float a, float b) { - return (float)(Math.min(a, b)); + return (float)(scalar_min(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2354,7 +2553,7 @@ relativeError)); } static float MAX(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2375,7 +2574,7 @@ relativeError)); } static float max(float a, float b) { - return (float)(Math.max(a, b)); + return (float)(scalar_max(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -2452,7 +2651,7 @@ relativeError)); static float ADDReduce(float[] a, int idx) { float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2461,7 +2660,7 @@ relativeError)); static float ADDReduceAll(float[] a) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -2479,7 +2678,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2492,20 +2691,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = ADD_IDENTITY; - assertEquals((float) (id + id), id, + assertEquals((float) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id + x), x); - assertEquals((float) (x + id), x); + assertEquals((float) (scalar_add(id, x)), x); + assertEquals((float) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id + x), x, + assertEquals((float) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x + id), x, + assertEquals((float) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -2514,7 +2713,7 @@ relativeError)); float res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -2523,7 +2722,7 @@ relativeError)); static float ADDReduceAllMasked(float[] a, boolean[] mask) { float res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -2543,7 +2742,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -2554,7 +2753,7 @@ relativeError)); static float MULReduce(float[] a, int idx) { float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2563,7 +2762,7 @@ relativeError)); static float MULReduceAll(float[] a) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -2581,7 +2780,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2594,20 +2793,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MUL_IDENTITY; - assertEquals((float) (id * id), id, + assertEquals((float) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) (id * x), x); - assertEquals((float) (x * id), x); + assertEquals((float) (scalar_mul(id, x)), x); + assertEquals((float) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((float) (id * x), x, + assertEquals((float) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((float) (x * id), x, + assertEquals((float) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -2616,7 +2815,7 @@ relativeError)); float res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -2625,7 +2824,7 @@ relativeError)); static float MULReduceAllMasked(float[] a, boolean[] mask) { float res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -2645,7 +2844,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -2656,7 +2855,7 @@ relativeError)); static float MINReduce(float[] a, int idx) { float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2665,7 +2864,7 @@ relativeError)); static float MINReduceAll(float[] a) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -2683,7 +2882,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2696,20 +2895,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MIN_IDENTITY; - assertEquals((float) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.min(id, x), x); - assertEquals((float) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -2718,7 +2917,7 @@ relativeError)); float res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -2727,7 +2926,7 @@ relativeError)); static float MINReduceAllMasked(float[] a, boolean[] mask) { float res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -2747,7 +2946,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (float) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -2758,7 +2957,7 @@ relativeError)); static float MAXReduce(float[] a, int idx) { float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2767,7 +2966,7 @@ relativeError)); static float MAXReduceAll(float[] a) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -2785,7 +2984,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -2798,20 +2997,20 @@ relativeError)); float[] a = fa.apply(SPECIES.length()); float id = MAX_IDENTITY; - assertEquals((float) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); float x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((float) Math.max(id, x), x); - assertEquals((float) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((float) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((float) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -2820,7 +3019,7 @@ relativeError)); float res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (float) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -2829,7 +3028,7 @@ relativeError)); static float MAXReduceAllMasked(float[] a, boolean[] mask) { float res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (float) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -2849,7 +3048,7 @@ relativeError)); FloatVector av = FloatVector.fromArray(SPECIES, a, i); float v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (float) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -3061,7 +3260,7 @@ relativeError)); } static boolean testIS_FINITE(float a) { - return Float.isFinite(a); + return isFinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3102,7 +3301,7 @@ relativeError)); } static boolean testIS_NAN(float a) { - return Float.isNaN(a); + return isNaN(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3143,7 +3342,7 @@ relativeError)); } static boolean testIS_INFINITE(float a) { - return Float.isInfinite(a); + return isInfinite(a); } @Test(dataProvider = "floatTestOpProvider") @@ -3484,7 +3683,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -3504,7 +3703,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -3520,7 +3719,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (float)((long)b[i]))); } } } @@ -3540,7 +3739,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (float)((long)b[i])))); } } } @@ -3556,7 +3755,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -3576,7 +3775,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -3592,7 +3791,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (float)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (float)((long)b[i]))); } } } @@ -3612,7 +3811,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (float)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (float)((long)b[i])))); } } } @@ -4112,11 +4311,11 @@ relativeError)); } static float SIN(float a) { - return (float)(Math.sin((double)a)); + return (float)(scalar_sin(a)); } static float strictSIN(float a) { - return (float)(StrictMath.sin((double)a)); + return (float)(strict_scalar_sin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4135,11 +4334,11 @@ relativeError)); } static float EXP(float a) { - return (float)(Math.exp((double)a)); + return (float)(scalar_exp(a)); } static float strictEXP(float a) { - return (float)(StrictMath.exp((double)a)); + return (float)(strict_scalar_exp(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4158,11 +4357,11 @@ relativeError)); } static float LOG1P(float a) { - return (float)(Math.log1p((double)a)); + return (float)(scalar_log1p(a)); } static float strictLOG1P(float a) { - return (float)(StrictMath.log1p((double)a)); + return (float)(strict_scalar_log1p(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4181,11 +4380,11 @@ relativeError)); } static float LOG(float a) { - return (float)(Math.log((double)a)); + return (float)(scalar_log(a)); } static float strictLOG(float a) { - return (float)(StrictMath.log((double)a)); + return (float)(strict_scalar_log(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4204,11 +4403,11 @@ relativeError)); } static float LOG10(float a) { - return (float)(Math.log10((double)a)); + return (float)(scalar_log10(a)); } static float strictLOG10(float a) { - return (float)(StrictMath.log10((double)a)); + return (float)(strict_scalar_log10(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4227,11 +4426,11 @@ relativeError)); } static float EXPM1(float a) { - return (float)(Math.expm1((double)a)); + return (float)(scalar_expm1(a)); } static float strictEXPM1(float a) { - return (float)(StrictMath.expm1((double)a)); + return (float)(strict_scalar_expm1(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4250,11 +4449,11 @@ relativeError)); } static float COS(float a) { - return (float)(Math.cos((double)a)); + return (float)(scalar_cos(a)); } static float strictCOS(float a) { - return (float)(StrictMath.cos((double)a)); + return (float)(strict_scalar_cos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4273,11 +4472,11 @@ relativeError)); } static float TAN(float a) { - return (float)(Math.tan((double)a)); + return (float)(scalar_tan(a)); } static float strictTAN(float a) { - return (float)(StrictMath.tan((double)a)); + return (float)(strict_scalar_tan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4296,11 +4495,11 @@ relativeError)); } static float SINH(float a) { - return (float)(Math.sinh((double)a)); + return (float)(scalar_sinh(a)); } static float strictSINH(float a) { - return (float)(StrictMath.sinh((double)a)); + return (float)(strict_scalar_sinh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4319,11 +4518,11 @@ relativeError)); } static float COSH(float a) { - return (float)(Math.cosh((double)a)); + return (float)(scalar_cosh(a)); } static float strictCOSH(float a) { - return (float)(StrictMath.cosh((double)a)); + return (float)(strict_scalar_cosh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4342,11 +4541,11 @@ relativeError)); } static float TANH(float a) { - return (float)(Math.tanh((double)a)); + return (float)(scalar_tanh(a)); } static float strictTANH(float a) { - return (float)(StrictMath.tanh((double)a)); + return (float)(strict_scalar_tanh(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4365,11 +4564,11 @@ relativeError)); } static float ASIN(float a) { - return (float)(Math.asin((double)a)); + return (float)(scalar_asin(a)); } static float strictASIN(float a) { - return (float)(StrictMath.asin((double)a)); + return (float)(strict_scalar_asin(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4388,11 +4587,11 @@ relativeError)); } static float ACOS(float a) { - return (float)(Math.acos((double)a)); + return (float)(scalar_acos(a)); } static float strictACOS(float a) { - return (float)(StrictMath.acos((double)a)); + return (float)(strict_scalar_acos(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4411,11 +4610,11 @@ relativeError)); } static float ATAN(float a) { - return (float)(Math.atan((double)a)); + return (float)(scalar_atan(a)); } static float strictATAN(float a) { - return (float)(StrictMath.atan((double)a)); + return (float)(strict_scalar_atan(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4434,11 +4633,11 @@ relativeError)); } static float CBRT(float a) { - return (float)(Math.cbrt((double)a)); + return (float)(scalar_cbrt(a)); } static float strictCBRT(float a) { - return (float)(StrictMath.cbrt((double)a)); + return (float)(strict_scalar_cbrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4457,11 +4656,11 @@ relativeError)); } static float HYPOT(float a, float b) { - return (float)(Math.hypot((double)a, (double)b)); + return (float)(scalar_hypot(a, b)); } static float strictHYPOT(float a, float b) { - return (float)(StrictMath.hypot((double)a, (double)b)); + return (float)(strict_scalar_hypot(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4483,11 +4682,11 @@ relativeError)); static float POW(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictPOW(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4509,11 +4708,11 @@ relativeError)); static float pow(float a, float b) { - return (float)(Math.pow((double)a, (double)b)); + return (float)(scalar_pow(a, b)); } static float strictpow(float a, float b) { - return (float)(StrictMath.pow((double)a, (double)b)); + return (float)(strict_scalar_pow(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4535,11 +4734,11 @@ relativeError)); static float ATAN2(float a, float b) { - return (float)(Math.atan2((double)a, (double)b)); + return (float)(scalar_atan2(a, b)); } static float strictATAN2(float a, float b) { - return (float)(StrictMath.atan2((double)a, (double)b)); + return (float)(strict_scalar_atan2(a, b)); } @Test(dataProvider = "floatBinaryOpProvider") @@ -4591,11 +4790,11 @@ relativeError)); static float FMA(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } static float fma(float a, float b, float c) { - return (float)(Math.fma(a, b, c)); + return (float)(scalar_fma(a, b, c)); } @Test(dataProvider = "floatTernaryOpProvider") @@ -4773,11 +4972,11 @@ relativeError)); } static float NEG(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } static float neg(float a) { - return (float)(-((float)a)); + return (float)(scalar_neg((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4829,11 +5028,11 @@ relativeError)); } static float ABS(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } static float abs(float a) { - return (float)(Math.abs((float)a)); + return (float)(scalar_abs((float)a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -4885,11 +5084,11 @@ relativeError)); } static float SQRT(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } static float sqrt(float a) { - return (float)(Math.sqrt((double)a)); + return (float)(scalar_sqrt(a)); } @Test(dataProvider = "floatUnaryOpProvider") @@ -5102,7 +5301,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5118,7 +5317,7 @@ relativeError)); // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5187,7 +5386,7 @@ relativeError)); static long ADDReduceLong(float[] a, int idx) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -5196,7 +5395,7 @@ relativeError)); static long ADDReduceAllLong(float[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((float)res, (float)ADDReduceLong(a, i)); } return res; @@ -5214,8 +5413,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -5225,8 +5424,9 @@ relativeError)); static long ADDReduceLongMasked(float[] a, int idx, boolean[] mask) { float res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -5235,7 +5435,7 @@ relativeError)); static long ADDReduceAllLongMasked(float[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((float)res, (float)ADDReduceLongMasked(a, i, mask)); } return res; @@ -5255,8 +5455,8 @@ relativeError)); } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((float)ra, (float)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/IntVector128Tests.java b/test/jdk/jdk/incubator/vector/IntVector128Tests.java index ecdb23eb40d..d62f5d8df00 100644 --- a/test/jdk/jdk/incubator/vector/IntVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector128Tests.java @@ -1531,6 +1531,59 @@ public class IntVector128Tests extends AbstractVectorTest { return a >= b; } + static int firstNonZero(int a, int b) { + return Integer.compare(a, (int) 0) != 0 ? a : b; + } + + static int scalar_or(int a, int b) { + return (int)(a | b); + } + + static int scalar_and(int a, int b) { + return (int)(a & b); + } + + static int scalar_xor(int a, int b) { + return (int)(a ^ b); + } + + static int scalar_add(int a, int b) { + return (int)(a + b); + } + + static int scalar_sub(int a, int b) { + return (int)(a - b); + } + + static int scalar_mul(int a, int b) { + return (int)(a * b); + } + + static int scalar_min(int a, int b) { + return (int)(Math.min(a, b)); + } + + static int scalar_max(int a, int b) { + return (int)(Math.max(a, b)); + } + + static int scalar_div(int a, int b) { + return (int)(a / b); + } + + static int scalar_fma(int a, int b, int c) { + return (int)(Math.fma(a, b, c)); + } + + static int scalar_abs(int a) { + return (int)(Math.abs(a)); + } + + static int scalar_neg(int a) { + return ((int)-a); + } + + static boolean ult(int a, int b) { return Integer.compareUnsigned(a, b) < 0; } @@ -1547,9 +1600,6 @@ public class IntVector128Tests extends AbstractVectorTest { return Integer.compareUnsigned(a, b) >= 0; } - static int firstNonZero(int a, int b) { - return Integer.compare(a, (int) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1663,7 +1713,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int ADD(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1684,7 +1734,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int add(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1741,7 +1791,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int SUB(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1762,7 +1812,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int sub(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1819,7 +1869,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int MUL(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1840,7 +1890,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int mul(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1987,7 +2037,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int FIRST_NONZERO(int a, int b) { - return (int)((a)!=0?a:b); + return (int)(firstNonZero(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3283,7 +3333,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int MIN(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3304,7 +3354,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int min(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3323,7 +3373,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int MAX(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3344,7 +3394,7 @@ public class IntVector128Tests extends AbstractVectorTest { } static int max(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3712,7 +3762,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ANDReduce(int[] a, int idx) { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3721,7 +3771,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ANDReduceAll(int[] a) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3739,7 +3789,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3752,20 +3802,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = AND_IDENTITY; - assertEquals((int) (id & id), id, + assertEquals((int) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id & x), x); - assertEquals((int) (x & id), x); + assertEquals((int) (scalar_and(id, x)), x); + assertEquals((int) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id & x), x, + assertEquals((int) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x & id), x, + assertEquals((int) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3774,7 +3824,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3783,7 +3833,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ANDReduceAllMasked(int[] a, boolean[] mask) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3803,7 +3853,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3814,7 +3864,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ORReduce(int[] a, int idx) { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3823,7 +3873,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ORReduceAll(int[] a) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3841,7 +3891,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3854,20 +3904,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = OR_IDENTITY; - assertEquals((int) (id | id), id, + assertEquals((int) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id | x), x); - assertEquals((int) (x | id), x); + assertEquals((int) (scalar_or(id, x)), x); + assertEquals((int) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id | x), x, + assertEquals((int) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x | id), x, + assertEquals((int) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3876,7 +3926,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3885,7 +3935,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ORReduceAllMasked(int[] a, boolean[] mask) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3905,7 +3955,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3916,7 +3966,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int XORReduce(int[] a, int idx) { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3925,7 +3975,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int XORReduceAll(int[] a) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3943,7 +3993,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3956,20 +4006,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = XOR_IDENTITY; - assertEquals((int) (id ^ id), id, + assertEquals((int) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id ^ x), x); - assertEquals((int) (x ^ id), x); + assertEquals((int) (scalar_xor(id, x)), x); + assertEquals((int) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id ^ x), x, + assertEquals((int) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x ^ id), x, + assertEquals((int) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3978,7 +4028,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3987,7 +4037,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int XORReduceAllMasked(int[] a, boolean[] mask) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4007,7 +4057,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4018,7 +4068,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ADDReduce(int[] a, int idx) { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4027,7 +4077,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ADDReduceAll(int[] a) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4045,7 +4095,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4058,20 +4108,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = ADD_IDENTITY; - assertEquals((int) (id + id), id, + assertEquals((int) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id + x), x); - assertEquals((int) (x + id), x); + assertEquals((int) (scalar_add(id, x)), x); + assertEquals((int) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id + x), x, + assertEquals((int) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x + id), x, + assertEquals((int) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4080,7 +4130,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4089,7 +4139,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int ADDReduceAllMasked(int[] a, boolean[] mask) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4109,7 +4159,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4120,7 +4170,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MULReduce(int[] a, int idx) { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4129,7 +4179,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MULReduceAll(int[] a) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4147,7 +4197,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4160,20 +4210,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MUL_IDENTITY; - assertEquals((int) (id * id), id, + assertEquals((int) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id * x), x); - assertEquals((int) (x * id), x); + assertEquals((int) (scalar_mul(id, x)), x); + assertEquals((int) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id * x), x, + assertEquals((int) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x * id), x, + assertEquals((int) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4182,7 +4232,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4191,7 +4241,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MULReduceAllMasked(int[] a, boolean[] mask) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4211,7 +4261,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4222,7 +4272,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MINReduce(int[] a, int idx) { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4231,7 +4281,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MINReduceAll(int[] a) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4249,7 +4299,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4262,20 +4312,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MIN_IDENTITY; - assertEquals((int) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.min(id, x), x); - assertEquals((int) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4284,7 +4334,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4293,7 +4343,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MINReduceAllMasked(int[] a, boolean[] mask) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4313,7 +4363,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4324,7 +4374,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MAXReduce(int[] a, int idx) { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4333,7 +4383,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MAXReduceAll(int[] a) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4351,7 +4401,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4364,20 +4414,20 @@ public class IntVector128Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MAX_IDENTITY; - assertEquals((int) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.max(id, x), x); - assertEquals((int) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4386,7 +4436,7 @@ public class IntVector128Tests extends AbstractVectorTest { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4395,7 +4445,7 @@ public class IntVector128Tests extends AbstractVectorTest { static int MAXReduceAllMasked(int[] a, boolean[] mask) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4415,7 +4465,7 @@ public class IntVector128Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5448,7 +5498,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5468,7 +5518,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5484,7 +5534,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (int)((long)b[i]))); } } } @@ -5504,7 +5554,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (int)((long)b[i])))); } } } @@ -5520,7 +5570,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5540,7 +5590,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5556,7 +5606,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (int)((long)b[i]))); } } } @@ -5576,7 +5626,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (int)((long)b[i])))); } } } @@ -6288,11 +6338,11 @@ public class IntVector128Tests extends AbstractVectorTest { } static int NEG(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } static int neg(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6344,11 +6394,11 @@ public class IntVector128Tests extends AbstractVectorTest { } static int ABS(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } static int abs(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6839,7 +6889,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6855,7 +6905,7 @@ public class IntVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6924,7 +6974,7 @@ public class IntVector128Tests extends AbstractVectorTest { static long ADDReduceLong(int[] a, int idx) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6933,7 +6983,7 @@ public class IntVector128Tests extends AbstractVectorTest { static long ADDReduceAllLong(int[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((int)res, (int)ADDReduceLong(a, i)); } return res; @@ -6951,8 +7001,8 @@ public class IntVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6962,8 +7012,9 @@ public class IntVector128Tests extends AbstractVectorTest { static long ADDReduceLongMasked(int[] a, int idx, boolean[] mask) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6972,7 +7023,7 @@ public class IntVector128Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(int[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((int)res, (int)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6992,8 +7043,8 @@ public class IntVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/IntVector256Tests.java b/test/jdk/jdk/incubator/vector/IntVector256Tests.java index 7100ebd1693..bb2d1d717f4 100644 --- a/test/jdk/jdk/incubator/vector/IntVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector256Tests.java @@ -1531,6 +1531,59 @@ public class IntVector256Tests extends AbstractVectorTest { return a >= b; } + static int firstNonZero(int a, int b) { + return Integer.compare(a, (int) 0) != 0 ? a : b; + } + + static int scalar_or(int a, int b) { + return (int)(a | b); + } + + static int scalar_and(int a, int b) { + return (int)(a & b); + } + + static int scalar_xor(int a, int b) { + return (int)(a ^ b); + } + + static int scalar_add(int a, int b) { + return (int)(a + b); + } + + static int scalar_sub(int a, int b) { + return (int)(a - b); + } + + static int scalar_mul(int a, int b) { + return (int)(a * b); + } + + static int scalar_min(int a, int b) { + return (int)(Math.min(a, b)); + } + + static int scalar_max(int a, int b) { + return (int)(Math.max(a, b)); + } + + static int scalar_div(int a, int b) { + return (int)(a / b); + } + + static int scalar_fma(int a, int b, int c) { + return (int)(Math.fma(a, b, c)); + } + + static int scalar_abs(int a) { + return (int)(Math.abs(a)); + } + + static int scalar_neg(int a) { + return ((int)-a); + } + + static boolean ult(int a, int b) { return Integer.compareUnsigned(a, b) < 0; } @@ -1547,9 +1600,6 @@ public class IntVector256Tests extends AbstractVectorTest { return Integer.compareUnsigned(a, b) >= 0; } - static int firstNonZero(int a, int b) { - return Integer.compare(a, (int) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1663,7 +1713,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int ADD(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1684,7 +1734,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int add(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1741,7 +1791,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int SUB(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1762,7 +1812,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int sub(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1819,7 +1869,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int MUL(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1840,7 +1890,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int mul(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1987,7 +2037,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int FIRST_NONZERO(int a, int b) { - return (int)((a)!=0?a:b); + return (int)(firstNonZero(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3283,7 +3333,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int MIN(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3304,7 +3354,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int min(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3323,7 +3373,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int MAX(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3344,7 +3394,7 @@ public class IntVector256Tests extends AbstractVectorTest { } static int max(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3712,7 +3762,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ANDReduce(int[] a, int idx) { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3721,7 +3771,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ANDReduceAll(int[] a) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3739,7 +3789,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3752,20 +3802,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = AND_IDENTITY; - assertEquals((int) (id & id), id, + assertEquals((int) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id & x), x); - assertEquals((int) (x & id), x); + assertEquals((int) (scalar_and(id, x)), x); + assertEquals((int) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id & x), x, + assertEquals((int) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x & id), x, + assertEquals((int) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3774,7 +3824,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3783,7 +3833,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ANDReduceAllMasked(int[] a, boolean[] mask) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3803,7 +3853,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3814,7 +3864,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ORReduce(int[] a, int idx) { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3823,7 +3873,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ORReduceAll(int[] a) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3841,7 +3891,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3854,20 +3904,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = OR_IDENTITY; - assertEquals((int) (id | id), id, + assertEquals((int) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id | x), x); - assertEquals((int) (x | id), x); + assertEquals((int) (scalar_or(id, x)), x); + assertEquals((int) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id | x), x, + assertEquals((int) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x | id), x, + assertEquals((int) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3876,7 +3926,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3885,7 +3935,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ORReduceAllMasked(int[] a, boolean[] mask) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3905,7 +3955,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3916,7 +3966,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int XORReduce(int[] a, int idx) { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3925,7 +3975,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int XORReduceAll(int[] a) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3943,7 +3993,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3956,20 +4006,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = XOR_IDENTITY; - assertEquals((int) (id ^ id), id, + assertEquals((int) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id ^ x), x); - assertEquals((int) (x ^ id), x); + assertEquals((int) (scalar_xor(id, x)), x); + assertEquals((int) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id ^ x), x, + assertEquals((int) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x ^ id), x, + assertEquals((int) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3978,7 +4028,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3987,7 +4037,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int XORReduceAllMasked(int[] a, boolean[] mask) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4007,7 +4057,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4018,7 +4068,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ADDReduce(int[] a, int idx) { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4027,7 +4077,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ADDReduceAll(int[] a) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4045,7 +4095,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4058,20 +4108,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = ADD_IDENTITY; - assertEquals((int) (id + id), id, + assertEquals((int) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id + x), x); - assertEquals((int) (x + id), x); + assertEquals((int) (scalar_add(id, x)), x); + assertEquals((int) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id + x), x, + assertEquals((int) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x + id), x, + assertEquals((int) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4080,7 +4130,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4089,7 +4139,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int ADDReduceAllMasked(int[] a, boolean[] mask) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4109,7 +4159,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4120,7 +4170,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MULReduce(int[] a, int idx) { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4129,7 +4179,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MULReduceAll(int[] a) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4147,7 +4197,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4160,20 +4210,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MUL_IDENTITY; - assertEquals((int) (id * id), id, + assertEquals((int) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id * x), x); - assertEquals((int) (x * id), x); + assertEquals((int) (scalar_mul(id, x)), x); + assertEquals((int) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id * x), x, + assertEquals((int) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x * id), x, + assertEquals((int) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4182,7 +4232,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4191,7 +4241,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MULReduceAllMasked(int[] a, boolean[] mask) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4211,7 +4261,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4222,7 +4272,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MINReduce(int[] a, int idx) { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4231,7 +4281,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MINReduceAll(int[] a) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4249,7 +4299,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4262,20 +4312,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MIN_IDENTITY; - assertEquals((int) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.min(id, x), x); - assertEquals((int) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4284,7 +4334,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4293,7 +4343,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MINReduceAllMasked(int[] a, boolean[] mask) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4313,7 +4363,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4324,7 +4374,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MAXReduce(int[] a, int idx) { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4333,7 +4383,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MAXReduceAll(int[] a) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4351,7 +4401,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4364,20 +4414,20 @@ public class IntVector256Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MAX_IDENTITY; - assertEquals((int) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.max(id, x), x); - assertEquals((int) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4386,7 +4436,7 @@ public class IntVector256Tests extends AbstractVectorTest { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4395,7 +4445,7 @@ public class IntVector256Tests extends AbstractVectorTest { static int MAXReduceAllMasked(int[] a, boolean[] mask) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4415,7 +4465,7 @@ public class IntVector256Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5448,7 +5498,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5468,7 +5518,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5484,7 +5534,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (int)((long)b[i]))); } } } @@ -5504,7 +5554,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (int)((long)b[i])))); } } } @@ -5520,7 +5570,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5540,7 +5590,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5556,7 +5606,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (int)((long)b[i]))); } } } @@ -5576,7 +5626,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (int)((long)b[i])))); } } } @@ -6288,11 +6338,11 @@ public class IntVector256Tests extends AbstractVectorTest { } static int NEG(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } static int neg(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6344,11 +6394,11 @@ public class IntVector256Tests extends AbstractVectorTest { } static int ABS(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } static int abs(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6839,7 +6889,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6855,7 +6905,7 @@ public class IntVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6924,7 +6974,7 @@ public class IntVector256Tests extends AbstractVectorTest { static long ADDReduceLong(int[] a, int idx) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6933,7 +6983,7 @@ public class IntVector256Tests extends AbstractVectorTest { static long ADDReduceAllLong(int[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((int)res, (int)ADDReduceLong(a, i)); } return res; @@ -6951,8 +7001,8 @@ public class IntVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6962,8 +7012,9 @@ public class IntVector256Tests extends AbstractVectorTest { static long ADDReduceLongMasked(int[] a, int idx, boolean[] mask) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6972,7 +7023,7 @@ public class IntVector256Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(int[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((int)res, (int)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6992,8 +7043,8 @@ public class IntVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/IntVector512Tests.java b/test/jdk/jdk/incubator/vector/IntVector512Tests.java index 468d3b15efe..5ceba4e88ec 100644 --- a/test/jdk/jdk/incubator/vector/IntVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector512Tests.java @@ -1531,6 +1531,59 @@ public class IntVector512Tests extends AbstractVectorTest { return a >= b; } + static int firstNonZero(int a, int b) { + return Integer.compare(a, (int) 0) != 0 ? a : b; + } + + static int scalar_or(int a, int b) { + return (int)(a | b); + } + + static int scalar_and(int a, int b) { + return (int)(a & b); + } + + static int scalar_xor(int a, int b) { + return (int)(a ^ b); + } + + static int scalar_add(int a, int b) { + return (int)(a + b); + } + + static int scalar_sub(int a, int b) { + return (int)(a - b); + } + + static int scalar_mul(int a, int b) { + return (int)(a * b); + } + + static int scalar_min(int a, int b) { + return (int)(Math.min(a, b)); + } + + static int scalar_max(int a, int b) { + return (int)(Math.max(a, b)); + } + + static int scalar_div(int a, int b) { + return (int)(a / b); + } + + static int scalar_fma(int a, int b, int c) { + return (int)(Math.fma(a, b, c)); + } + + static int scalar_abs(int a) { + return (int)(Math.abs(a)); + } + + static int scalar_neg(int a) { + return ((int)-a); + } + + static boolean ult(int a, int b) { return Integer.compareUnsigned(a, b) < 0; } @@ -1547,9 +1600,6 @@ public class IntVector512Tests extends AbstractVectorTest { return Integer.compareUnsigned(a, b) >= 0; } - static int firstNonZero(int a, int b) { - return Integer.compare(a, (int) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1663,7 +1713,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int ADD(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1684,7 +1734,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int add(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1741,7 +1791,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int SUB(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1762,7 +1812,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int sub(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1819,7 +1869,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int MUL(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1840,7 +1890,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int mul(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1987,7 +2037,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int FIRST_NONZERO(int a, int b) { - return (int)((a)!=0?a:b); + return (int)(firstNonZero(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3283,7 +3333,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int MIN(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3304,7 +3354,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int min(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3323,7 +3373,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int MAX(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3344,7 +3394,7 @@ public class IntVector512Tests extends AbstractVectorTest { } static int max(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3712,7 +3762,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ANDReduce(int[] a, int idx) { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3721,7 +3771,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ANDReduceAll(int[] a) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3739,7 +3789,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3752,20 +3802,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = AND_IDENTITY; - assertEquals((int) (id & id), id, + assertEquals((int) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id & x), x); - assertEquals((int) (x & id), x); + assertEquals((int) (scalar_and(id, x)), x); + assertEquals((int) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id & x), x, + assertEquals((int) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x & id), x, + assertEquals((int) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3774,7 +3824,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3783,7 +3833,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ANDReduceAllMasked(int[] a, boolean[] mask) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3803,7 +3853,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3814,7 +3864,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ORReduce(int[] a, int idx) { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3823,7 +3873,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ORReduceAll(int[] a) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3841,7 +3891,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3854,20 +3904,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = OR_IDENTITY; - assertEquals((int) (id | id), id, + assertEquals((int) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id | x), x); - assertEquals((int) (x | id), x); + assertEquals((int) (scalar_or(id, x)), x); + assertEquals((int) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id | x), x, + assertEquals((int) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x | id), x, + assertEquals((int) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3876,7 +3926,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3885,7 +3935,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ORReduceAllMasked(int[] a, boolean[] mask) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3905,7 +3955,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3916,7 +3966,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int XORReduce(int[] a, int idx) { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3925,7 +3975,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int XORReduceAll(int[] a) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3943,7 +3993,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3956,20 +4006,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = XOR_IDENTITY; - assertEquals((int) (id ^ id), id, + assertEquals((int) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id ^ x), x); - assertEquals((int) (x ^ id), x); + assertEquals((int) (scalar_xor(id, x)), x); + assertEquals((int) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id ^ x), x, + assertEquals((int) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x ^ id), x, + assertEquals((int) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3978,7 +4028,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3987,7 +4037,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int XORReduceAllMasked(int[] a, boolean[] mask) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4007,7 +4057,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4018,7 +4068,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ADDReduce(int[] a, int idx) { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4027,7 +4077,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ADDReduceAll(int[] a) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4045,7 +4095,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4058,20 +4108,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = ADD_IDENTITY; - assertEquals((int) (id + id), id, + assertEquals((int) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id + x), x); - assertEquals((int) (x + id), x); + assertEquals((int) (scalar_add(id, x)), x); + assertEquals((int) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id + x), x, + assertEquals((int) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x + id), x, + assertEquals((int) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4080,7 +4130,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4089,7 +4139,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int ADDReduceAllMasked(int[] a, boolean[] mask) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4109,7 +4159,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4120,7 +4170,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MULReduce(int[] a, int idx) { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4129,7 +4179,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MULReduceAll(int[] a) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4147,7 +4197,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4160,20 +4210,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MUL_IDENTITY; - assertEquals((int) (id * id), id, + assertEquals((int) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id * x), x); - assertEquals((int) (x * id), x); + assertEquals((int) (scalar_mul(id, x)), x); + assertEquals((int) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id * x), x, + assertEquals((int) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x * id), x, + assertEquals((int) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4182,7 +4232,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4191,7 +4241,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MULReduceAllMasked(int[] a, boolean[] mask) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4211,7 +4261,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4222,7 +4272,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MINReduce(int[] a, int idx) { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4231,7 +4281,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MINReduceAll(int[] a) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4249,7 +4299,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4262,20 +4312,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MIN_IDENTITY; - assertEquals((int) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.min(id, x), x); - assertEquals((int) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4284,7 +4334,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4293,7 +4343,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MINReduceAllMasked(int[] a, boolean[] mask) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4313,7 +4363,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4324,7 +4374,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MAXReduce(int[] a, int idx) { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4333,7 +4383,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MAXReduceAll(int[] a) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4351,7 +4401,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4364,20 +4414,20 @@ public class IntVector512Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MAX_IDENTITY; - assertEquals((int) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.max(id, x), x); - assertEquals((int) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4386,7 +4436,7 @@ public class IntVector512Tests extends AbstractVectorTest { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4395,7 +4445,7 @@ public class IntVector512Tests extends AbstractVectorTest { static int MAXReduceAllMasked(int[] a, boolean[] mask) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4415,7 +4465,7 @@ public class IntVector512Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5448,7 +5498,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5468,7 +5518,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5484,7 +5534,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (int)((long)b[i]))); } } } @@ -5504,7 +5554,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (int)((long)b[i])))); } } } @@ -5520,7 +5570,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5540,7 +5590,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5556,7 +5606,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (int)((long)b[i]))); } } } @@ -5576,7 +5626,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (int)((long)b[i])))); } } } @@ -6288,11 +6338,11 @@ public class IntVector512Tests extends AbstractVectorTest { } static int NEG(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } static int neg(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6344,11 +6394,11 @@ public class IntVector512Tests extends AbstractVectorTest { } static int ABS(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } static int abs(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6839,7 +6889,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6855,7 +6905,7 @@ public class IntVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6924,7 +6974,7 @@ public class IntVector512Tests extends AbstractVectorTest { static long ADDReduceLong(int[] a, int idx) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6933,7 +6983,7 @@ public class IntVector512Tests extends AbstractVectorTest { static long ADDReduceAllLong(int[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((int)res, (int)ADDReduceLong(a, i)); } return res; @@ -6951,8 +7001,8 @@ public class IntVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6962,8 +7012,9 @@ public class IntVector512Tests extends AbstractVectorTest { static long ADDReduceLongMasked(int[] a, int idx, boolean[] mask) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6972,7 +7023,7 @@ public class IntVector512Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(int[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((int)res, (int)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6992,8 +7043,8 @@ public class IntVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/IntVector64Tests.java b/test/jdk/jdk/incubator/vector/IntVector64Tests.java index 0715981e050..9d3849a2c04 100644 --- a/test/jdk/jdk/incubator/vector/IntVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/IntVector64Tests.java @@ -1531,6 +1531,59 @@ public class IntVector64Tests extends AbstractVectorTest { return a >= b; } + static int firstNonZero(int a, int b) { + return Integer.compare(a, (int) 0) != 0 ? a : b; + } + + static int scalar_or(int a, int b) { + return (int)(a | b); + } + + static int scalar_and(int a, int b) { + return (int)(a & b); + } + + static int scalar_xor(int a, int b) { + return (int)(a ^ b); + } + + static int scalar_add(int a, int b) { + return (int)(a + b); + } + + static int scalar_sub(int a, int b) { + return (int)(a - b); + } + + static int scalar_mul(int a, int b) { + return (int)(a * b); + } + + static int scalar_min(int a, int b) { + return (int)(Math.min(a, b)); + } + + static int scalar_max(int a, int b) { + return (int)(Math.max(a, b)); + } + + static int scalar_div(int a, int b) { + return (int)(a / b); + } + + static int scalar_fma(int a, int b, int c) { + return (int)(Math.fma(a, b, c)); + } + + static int scalar_abs(int a) { + return (int)(Math.abs(a)); + } + + static int scalar_neg(int a) { + return ((int)-a); + } + + static boolean ult(int a, int b) { return Integer.compareUnsigned(a, b) < 0; } @@ -1547,9 +1600,6 @@ public class IntVector64Tests extends AbstractVectorTest { return Integer.compareUnsigned(a, b) >= 0; } - static int firstNonZero(int a, int b) { - return Integer.compare(a, (int) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1663,7 +1713,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int ADD(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1684,7 +1734,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int add(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1741,7 +1791,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int SUB(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1762,7 +1812,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int sub(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1819,7 +1869,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int MUL(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1840,7 +1890,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int mul(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1987,7 +2037,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int FIRST_NONZERO(int a, int b) { - return (int)((a)!=0?a:b); + return (int)(firstNonZero(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3283,7 +3333,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int MIN(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3304,7 +3354,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int min(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3323,7 +3373,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int MAX(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3344,7 +3394,7 @@ public class IntVector64Tests extends AbstractVectorTest { } static int max(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3712,7 +3762,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ANDReduce(int[] a, int idx) { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3721,7 +3771,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ANDReduceAll(int[] a) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3739,7 +3789,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3752,20 +3802,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = AND_IDENTITY; - assertEquals((int) (id & id), id, + assertEquals((int) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id & x), x); - assertEquals((int) (x & id), x); + assertEquals((int) (scalar_and(id, x)), x); + assertEquals((int) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id & x), x, + assertEquals((int) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x & id), x, + assertEquals((int) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3774,7 +3824,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3783,7 +3833,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ANDReduceAllMasked(int[] a, boolean[] mask) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3803,7 +3853,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3814,7 +3864,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ORReduce(int[] a, int idx) { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3823,7 +3873,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ORReduceAll(int[] a) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3841,7 +3891,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3854,20 +3904,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = OR_IDENTITY; - assertEquals((int) (id | id), id, + assertEquals((int) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id | x), x); - assertEquals((int) (x | id), x); + assertEquals((int) (scalar_or(id, x)), x); + assertEquals((int) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id | x), x, + assertEquals((int) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x | id), x, + assertEquals((int) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3876,7 +3926,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3885,7 +3935,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ORReduceAllMasked(int[] a, boolean[] mask) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3905,7 +3955,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3916,7 +3966,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int XORReduce(int[] a, int idx) { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3925,7 +3975,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int XORReduceAll(int[] a) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3943,7 +3993,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3956,20 +4006,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = XOR_IDENTITY; - assertEquals((int) (id ^ id), id, + assertEquals((int) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id ^ x), x); - assertEquals((int) (x ^ id), x); + assertEquals((int) (scalar_xor(id, x)), x); + assertEquals((int) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id ^ x), x, + assertEquals((int) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x ^ id), x, + assertEquals((int) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3978,7 +4028,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3987,7 +4037,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int XORReduceAllMasked(int[] a, boolean[] mask) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4007,7 +4057,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4018,7 +4068,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ADDReduce(int[] a, int idx) { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4027,7 +4077,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ADDReduceAll(int[] a) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4045,7 +4095,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4058,20 +4108,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = ADD_IDENTITY; - assertEquals((int) (id + id), id, + assertEquals((int) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id + x), x); - assertEquals((int) (x + id), x); + assertEquals((int) (scalar_add(id, x)), x); + assertEquals((int) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id + x), x, + assertEquals((int) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x + id), x, + assertEquals((int) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4080,7 +4130,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4089,7 +4139,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int ADDReduceAllMasked(int[] a, boolean[] mask) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4109,7 +4159,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4120,7 +4170,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MULReduce(int[] a, int idx) { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4129,7 +4179,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MULReduceAll(int[] a) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4147,7 +4197,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4160,20 +4210,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MUL_IDENTITY; - assertEquals((int) (id * id), id, + assertEquals((int) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id * x), x); - assertEquals((int) (x * id), x); + assertEquals((int) (scalar_mul(id, x)), x); + assertEquals((int) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id * x), x, + assertEquals((int) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x * id), x, + assertEquals((int) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4182,7 +4232,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4191,7 +4241,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MULReduceAllMasked(int[] a, boolean[] mask) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4211,7 +4261,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4222,7 +4272,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MINReduce(int[] a, int idx) { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4231,7 +4281,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MINReduceAll(int[] a) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4249,7 +4299,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4262,20 +4312,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MIN_IDENTITY; - assertEquals((int) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.min(id, x), x); - assertEquals((int) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4284,7 +4334,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4293,7 +4343,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MINReduceAllMasked(int[] a, boolean[] mask) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4313,7 +4363,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4324,7 +4374,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MAXReduce(int[] a, int idx) { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4333,7 +4383,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MAXReduceAll(int[] a) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4351,7 +4401,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4364,20 +4414,20 @@ public class IntVector64Tests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MAX_IDENTITY; - assertEquals((int) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.max(id, x), x); - assertEquals((int) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4386,7 +4436,7 @@ public class IntVector64Tests extends AbstractVectorTest { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4395,7 +4445,7 @@ public class IntVector64Tests extends AbstractVectorTest { static int MAXReduceAllMasked(int[] a, boolean[] mask) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4415,7 +4465,7 @@ public class IntVector64Tests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5448,7 +5498,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5468,7 +5518,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5484,7 +5534,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (int)((long)b[i]))); } } } @@ -5504,7 +5554,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (int)((long)b[i])))); } } } @@ -5520,7 +5570,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5540,7 +5590,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5556,7 +5606,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (int)((long)b[i]))); } } } @@ -5576,7 +5626,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (int)((long)b[i])))); } } } @@ -6288,11 +6338,11 @@ public class IntVector64Tests extends AbstractVectorTest { } static int NEG(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } static int neg(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6344,11 +6394,11 @@ public class IntVector64Tests extends AbstractVectorTest { } static int ABS(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } static int abs(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6839,7 +6889,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6855,7 +6905,7 @@ public class IntVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6924,7 +6974,7 @@ public class IntVector64Tests extends AbstractVectorTest { static long ADDReduceLong(int[] a, int idx) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6933,7 +6983,7 @@ public class IntVector64Tests extends AbstractVectorTest { static long ADDReduceAllLong(int[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((int)res, (int)ADDReduceLong(a, i)); } return res; @@ -6951,8 +7001,8 @@ public class IntVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6962,8 +7012,9 @@ public class IntVector64Tests extends AbstractVectorTest { static long ADDReduceLongMasked(int[] a, int idx, boolean[] mask) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6972,7 +7023,7 @@ public class IntVector64Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(int[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((int)res, (int)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6992,8 +7043,8 @@ public class IntVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java b/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java index ad519b36dc9..6c671a81bf1 100644 --- a/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/IntVectorMaxTests.java @@ -1537,6 +1537,59 @@ public class IntVectorMaxTests extends AbstractVectorTest { return a >= b; } + static int firstNonZero(int a, int b) { + return Integer.compare(a, (int) 0) != 0 ? a : b; + } + + static int scalar_or(int a, int b) { + return (int)(a | b); + } + + static int scalar_and(int a, int b) { + return (int)(a & b); + } + + static int scalar_xor(int a, int b) { + return (int)(a ^ b); + } + + static int scalar_add(int a, int b) { + return (int)(a + b); + } + + static int scalar_sub(int a, int b) { + return (int)(a - b); + } + + static int scalar_mul(int a, int b) { + return (int)(a * b); + } + + static int scalar_min(int a, int b) { + return (int)(Math.min(a, b)); + } + + static int scalar_max(int a, int b) { + return (int)(Math.max(a, b)); + } + + static int scalar_div(int a, int b) { + return (int)(a / b); + } + + static int scalar_fma(int a, int b, int c) { + return (int)(Math.fma(a, b, c)); + } + + static int scalar_abs(int a) { + return (int)(Math.abs(a)); + } + + static int scalar_neg(int a) { + return ((int)-a); + } + + static boolean ult(int a, int b) { return Integer.compareUnsigned(a, b) < 0; } @@ -1553,9 +1606,6 @@ public class IntVectorMaxTests extends AbstractVectorTest { return Integer.compareUnsigned(a, b) >= 0; } - static int firstNonZero(int a, int b) { - return Integer.compare(a, (int) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1669,7 +1719,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int ADD(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1690,7 +1740,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int add(int a, int b) { - return (int)(a + b); + return (int)(scalar_add(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1747,7 +1797,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int SUB(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1768,7 +1818,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int sub(int a, int b) { - return (int)(a - b); + return (int)(scalar_sub(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1825,7 +1875,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int MUL(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1846,7 +1896,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int mul(int a, int b) { - return (int)(a * b); + return (int)(scalar_mul(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -1993,7 +2043,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int FIRST_NONZERO(int a, int b) { - return (int)((a)!=0?a:b); + return (int)(firstNonZero(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3289,7 +3339,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int MIN(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3310,7 +3360,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int min(int a, int b) { - return (int)(Math.min(a, b)); + return (int)(scalar_min(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3329,7 +3379,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int MAX(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3350,7 +3400,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int max(int a, int b) { - return (int)(Math.max(a, b)); + return (int)(scalar_max(a, b)); } @Test(dataProvider = "intBinaryOpProvider") @@ -3718,7 +3768,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ANDReduce(int[] a, int idx) { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3727,7 +3777,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ANDReduceAll(int[] a) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3745,7 +3795,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3758,20 +3808,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = AND_IDENTITY; - assertEquals((int) (id & id), id, + assertEquals((int) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id & x), x); - assertEquals((int) (x & id), x); + assertEquals((int) (scalar_and(id, x)), x); + assertEquals((int) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id & x), x, + assertEquals((int) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x & id), x, + assertEquals((int) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3780,7 +3830,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3789,7 +3839,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ANDReduceAllMasked(int[] a, boolean[] mask) { int res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3809,7 +3859,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3820,7 +3870,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ORReduce(int[] a, int idx) { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3829,7 +3879,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ORReduceAll(int[] a) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3847,7 +3897,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3860,20 +3910,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = OR_IDENTITY; - assertEquals((int) (id | id), id, + assertEquals((int) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id | x), x); - assertEquals((int) (x | id), x); + assertEquals((int) (scalar_or(id, x)), x); + assertEquals((int) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id | x), x, + assertEquals((int) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x | id), x, + assertEquals((int) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3882,7 +3932,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3891,7 +3941,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ORReduceAllMasked(int[] a, boolean[] mask) { int res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3911,7 +3961,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3922,7 +3972,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int XORReduce(int[] a, int idx) { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3931,7 +3981,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int XORReduceAll(int[] a) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3949,7 +3999,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3962,20 +4012,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = XOR_IDENTITY; - assertEquals((int) (id ^ id), id, + assertEquals((int) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id ^ x), x); - assertEquals((int) (x ^ id), x); + assertEquals((int) (scalar_xor(id, x)), x); + assertEquals((int) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id ^ x), x, + assertEquals((int) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x ^ id), x, + assertEquals((int) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3984,7 +4034,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3993,7 +4043,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int XORReduceAllMasked(int[] a, boolean[] mask) { int res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4013,7 +4063,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4024,7 +4074,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ADDReduce(int[] a, int idx) { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4033,7 +4083,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ADDReduceAll(int[] a) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4051,7 +4101,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4064,20 +4114,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = ADD_IDENTITY; - assertEquals((int) (id + id), id, + assertEquals((int) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id + x), x); - assertEquals((int) (x + id), x); + assertEquals((int) (scalar_add(id, x)), x); + assertEquals((int) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id + x), x, + assertEquals((int) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x + id), x, + assertEquals((int) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4086,7 +4136,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4095,7 +4145,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int ADDReduceAllMasked(int[] a, boolean[] mask) { int res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4115,7 +4165,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4126,7 +4176,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MULReduce(int[] a, int idx) { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4135,7 +4185,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MULReduceAll(int[] a) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4153,7 +4203,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4166,20 +4216,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MUL_IDENTITY; - assertEquals((int) (id * id), id, + assertEquals((int) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) (id * x), x); - assertEquals((int) (x * id), x); + assertEquals((int) (scalar_mul(id, x)), x); + assertEquals((int) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((int) (id * x), x, + assertEquals((int) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((int) (x * id), x, + assertEquals((int) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4188,7 +4238,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4197,7 +4247,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MULReduceAllMasked(int[] a, boolean[] mask) { int res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4217,7 +4267,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4228,7 +4278,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MINReduce(int[] a, int idx) { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4237,7 +4287,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MINReduceAll(int[] a) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4255,7 +4305,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4268,20 +4318,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MIN_IDENTITY; - assertEquals((int) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.min(id, x), x); - assertEquals((int) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4290,7 +4340,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4299,7 +4349,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MINReduceAllMasked(int[] a, boolean[] mask) { int res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4319,7 +4369,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (int) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4330,7 +4380,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MAXReduce(int[] a, int idx) { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4339,7 +4389,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MAXReduceAll(int[] a) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4357,7 +4407,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4370,20 +4420,20 @@ public class IntVectorMaxTests extends AbstractVectorTest { int[] a = fa.apply(SPECIES.length()); int id = MAX_IDENTITY; - assertEquals((int) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); int x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((int) Math.max(id, x), x); - assertEquals((int) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((int) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((int) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4392,7 +4442,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { int res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (int) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4401,7 +4451,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static int MAXReduceAllMasked(int[] a, boolean[] mask) { int res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (int) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4421,7 +4471,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { IntVector av = IntVector.fromArray(SPECIES, a, i); int v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (int) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5454,7 +5504,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5474,7 +5524,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5490,7 +5540,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (int)((long)b[i]))); } } } @@ -5510,7 +5560,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (int)((long)b[i])))); } } } @@ -5526,7 +5576,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5546,7 +5596,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5562,7 +5612,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (int)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (int)((long)b[i]))); } } } @@ -5582,7 +5632,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (int)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (int)((long)b[i])))); } } } @@ -6294,11 +6344,11 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int NEG(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } static int neg(int a) { - return (int)(-((int)a)); + return (int)(scalar_neg((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6350,11 +6400,11 @@ public class IntVectorMaxTests extends AbstractVectorTest { } static int ABS(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } static int abs(int a) { - return (int)(Math.abs((int)a)); + return (int)(scalar_abs((int)a)); } @Test(dataProvider = "intUnaryOpProvider") @@ -6845,7 +6895,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6861,7 +6911,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6930,7 +6980,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static long ADDReduceLong(int[] a, int idx) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6939,7 +6989,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLong(int[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((int)res, (int)ADDReduceLong(a, i)); } return res; @@ -6957,8 +7007,8 @@ public class IntVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6968,8 +7018,9 @@ public class IntVectorMaxTests extends AbstractVectorTest { static long ADDReduceLongMasked(int[] a, int idx, boolean[] mask) { int res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6978,7 +7029,7 @@ public class IntVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLongMasked(int[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((int)res, (int)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6998,8 +7049,8 @@ public class IntVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((int)ra, (int)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/LongVector128Tests.java b/test/jdk/jdk/incubator/vector/LongVector128Tests.java index 1d3af1684b9..49e2e1a0078 100644 --- a/test/jdk/jdk/incubator/vector/LongVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector128Tests.java @@ -1547,6 +1547,59 @@ public class LongVector128Tests extends AbstractVectorTest { return a >= b; } + static long firstNonZero(long a, long b) { + return Long.compare(a, (long) 0) != 0 ? a : b; + } + + static long scalar_or(long a, long b) { + return (long)(a | b); + } + + static long scalar_and(long a, long b) { + return (long)(a & b); + } + + static long scalar_xor(long a, long b) { + return (long)(a ^ b); + } + + static long scalar_add(long a, long b) { + return (long)(a + b); + } + + static long scalar_sub(long a, long b) { + return (long)(a - b); + } + + static long scalar_mul(long a, long b) { + return (long)(a * b); + } + + static long scalar_min(long a, long b) { + return (long)(Math.min(a, b)); + } + + static long scalar_max(long a, long b) { + return (long)(Math.max(a, b)); + } + + static long scalar_div(long a, long b) { + return (long)(a / b); + } + + static long scalar_fma(long a, long b, long c) { + return (long)(Math.fma(a, b, c)); + } + + static long scalar_abs(long a) { + return (long)(Math.abs(a)); + } + + static long scalar_neg(long a) { + return ((long)-a); + } + + static boolean ult(long a, long b) { return Long.compareUnsigned(a, b) < 0; } @@ -1563,9 +1616,6 @@ public class LongVector128Tests extends AbstractVectorTest { return Long.compareUnsigned(a, b) >= 0; } - static long firstNonZero(long a, long b) { - return Long.compare(a, (long) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1679,7 +1729,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long ADD(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1700,7 +1750,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long add(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1757,7 +1807,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long SUB(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1778,7 +1828,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long sub(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1835,7 +1885,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long MUL(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1856,7 +1906,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long mul(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -2003,7 +2053,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long FIRST_NONZERO(long a, long b) { - return (long)((a)!=0?a:b); + return (long)(firstNonZero(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3299,7 +3349,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long MIN(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3320,7 +3370,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long min(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3339,7 +3389,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long MAX(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3360,7 +3410,7 @@ public class LongVector128Tests extends AbstractVectorTest { } static long max(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3728,7 +3778,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ANDReduce(long[] a, int idx) { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3737,7 +3787,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ANDReduceAll(long[] a) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3755,7 +3805,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3768,20 +3818,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = AND_IDENTITY; - assertEquals((long) (id & id), id, + assertEquals((long) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id & x), x); - assertEquals((long) (x & id), x); + assertEquals((long) (scalar_and(id, x)), x); + assertEquals((long) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id & x), x, + assertEquals((long) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x & id), x, + assertEquals((long) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3790,7 +3840,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3799,7 +3849,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ANDReduceAllMasked(long[] a, boolean[] mask) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3819,7 +3869,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3830,7 +3880,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ORReduce(long[] a, int idx) { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3839,7 +3889,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ORReduceAll(long[] a) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3857,7 +3907,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3870,20 +3920,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = OR_IDENTITY; - assertEquals((long) (id | id), id, + assertEquals((long) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id | x), x); - assertEquals((long) (x | id), x); + assertEquals((long) (scalar_or(id, x)), x); + assertEquals((long) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id | x), x, + assertEquals((long) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x | id), x, + assertEquals((long) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3892,7 +3942,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3901,7 +3951,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ORReduceAllMasked(long[] a, boolean[] mask) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3921,7 +3971,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3932,7 +3982,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long XORReduce(long[] a, int idx) { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3941,7 +3991,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long XORReduceAll(long[] a) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3959,7 +4009,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3972,20 +4022,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = XOR_IDENTITY; - assertEquals((long) (id ^ id), id, + assertEquals((long) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id ^ x), x); - assertEquals((long) (x ^ id), x); + assertEquals((long) (scalar_xor(id, x)), x); + assertEquals((long) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id ^ x), x, + assertEquals((long) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x ^ id), x, + assertEquals((long) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3994,7 +4044,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -4003,7 +4053,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long XORReduceAllMasked(long[] a, boolean[] mask) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4023,7 +4073,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4034,7 +4084,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ADDReduce(long[] a, int idx) { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4043,7 +4093,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ADDReduceAll(long[] a) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4061,7 +4111,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4074,20 +4124,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = ADD_IDENTITY; - assertEquals((long) (id + id), id, + assertEquals((long) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id + x), x); - assertEquals((long) (x + id), x); + assertEquals((long) (scalar_add(id, x)), x); + assertEquals((long) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id + x), x, + assertEquals((long) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x + id), x, + assertEquals((long) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4096,7 +4146,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4105,7 +4155,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long ADDReduceAllMasked(long[] a, boolean[] mask) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4125,7 +4175,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4136,7 +4186,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MULReduce(long[] a, int idx) { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4145,7 +4195,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MULReduceAll(long[] a) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4163,7 +4213,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4176,20 +4226,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MUL_IDENTITY; - assertEquals((long) (id * id), id, + assertEquals((long) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id * x), x); - assertEquals((long) (x * id), x); + assertEquals((long) (scalar_mul(id, x)), x); + assertEquals((long) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id * x), x, + assertEquals((long) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x * id), x, + assertEquals((long) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4198,7 +4248,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4207,7 +4257,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MULReduceAllMasked(long[] a, boolean[] mask) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4227,7 +4277,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4238,7 +4288,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MINReduce(long[] a, int idx) { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4247,7 +4297,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MINReduceAll(long[] a) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4265,7 +4315,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4278,20 +4328,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MIN_IDENTITY; - assertEquals((long) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.min(id, x), x); - assertEquals((long) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4300,7 +4350,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4309,7 +4359,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MINReduceAllMasked(long[] a, boolean[] mask) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4329,7 +4379,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4340,7 +4390,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MAXReduce(long[] a, int idx) { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4349,7 +4399,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MAXReduceAll(long[] a) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4367,7 +4417,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4380,20 +4430,20 @@ public class LongVector128Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MAX_IDENTITY; - assertEquals((long) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.max(id, x), x); - assertEquals((long) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4402,7 +4452,7 @@ public class LongVector128Tests extends AbstractVectorTest { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4411,7 +4461,7 @@ public class LongVector128Tests extends AbstractVectorTest { static long MAXReduceAllMasked(long[] a, boolean[] mask) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4431,7 +4481,7 @@ public class LongVector128Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5464,7 +5514,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5484,7 +5534,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5501,7 +5551,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5521,7 +5571,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -6234,11 +6284,11 @@ public class LongVector128Tests extends AbstractVectorTest { } static long NEG(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } static long neg(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6290,11 +6340,11 @@ public class LongVector128Tests extends AbstractVectorTest { } static long ABS(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } static long abs(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6785,7 +6835,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6801,7 +6851,7 @@ public class LongVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } diff --git a/test/jdk/jdk/incubator/vector/LongVector256Tests.java b/test/jdk/jdk/incubator/vector/LongVector256Tests.java index a766abe920f..84c8da4e800 100644 --- a/test/jdk/jdk/incubator/vector/LongVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector256Tests.java @@ -1547,6 +1547,59 @@ public class LongVector256Tests extends AbstractVectorTest { return a >= b; } + static long firstNonZero(long a, long b) { + return Long.compare(a, (long) 0) != 0 ? a : b; + } + + static long scalar_or(long a, long b) { + return (long)(a | b); + } + + static long scalar_and(long a, long b) { + return (long)(a & b); + } + + static long scalar_xor(long a, long b) { + return (long)(a ^ b); + } + + static long scalar_add(long a, long b) { + return (long)(a + b); + } + + static long scalar_sub(long a, long b) { + return (long)(a - b); + } + + static long scalar_mul(long a, long b) { + return (long)(a * b); + } + + static long scalar_min(long a, long b) { + return (long)(Math.min(a, b)); + } + + static long scalar_max(long a, long b) { + return (long)(Math.max(a, b)); + } + + static long scalar_div(long a, long b) { + return (long)(a / b); + } + + static long scalar_fma(long a, long b, long c) { + return (long)(Math.fma(a, b, c)); + } + + static long scalar_abs(long a) { + return (long)(Math.abs(a)); + } + + static long scalar_neg(long a) { + return ((long)-a); + } + + static boolean ult(long a, long b) { return Long.compareUnsigned(a, b) < 0; } @@ -1563,9 +1616,6 @@ public class LongVector256Tests extends AbstractVectorTest { return Long.compareUnsigned(a, b) >= 0; } - static long firstNonZero(long a, long b) { - return Long.compare(a, (long) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1679,7 +1729,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long ADD(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1700,7 +1750,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long add(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1757,7 +1807,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long SUB(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1778,7 +1828,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long sub(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1835,7 +1885,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long MUL(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1856,7 +1906,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long mul(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -2003,7 +2053,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long FIRST_NONZERO(long a, long b) { - return (long)((a)!=0?a:b); + return (long)(firstNonZero(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3299,7 +3349,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long MIN(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3320,7 +3370,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long min(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3339,7 +3389,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long MAX(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3360,7 +3410,7 @@ public class LongVector256Tests extends AbstractVectorTest { } static long max(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3728,7 +3778,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ANDReduce(long[] a, int idx) { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3737,7 +3787,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ANDReduceAll(long[] a) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3755,7 +3805,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3768,20 +3818,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = AND_IDENTITY; - assertEquals((long) (id & id), id, + assertEquals((long) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id & x), x); - assertEquals((long) (x & id), x); + assertEquals((long) (scalar_and(id, x)), x); + assertEquals((long) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id & x), x, + assertEquals((long) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x & id), x, + assertEquals((long) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3790,7 +3840,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3799,7 +3849,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ANDReduceAllMasked(long[] a, boolean[] mask) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3819,7 +3869,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3830,7 +3880,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ORReduce(long[] a, int idx) { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3839,7 +3889,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ORReduceAll(long[] a) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3857,7 +3907,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3870,20 +3920,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = OR_IDENTITY; - assertEquals((long) (id | id), id, + assertEquals((long) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id | x), x); - assertEquals((long) (x | id), x); + assertEquals((long) (scalar_or(id, x)), x); + assertEquals((long) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id | x), x, + assertEquals((long) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x | id), x, + assertEquals((long) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3892,7 +3942,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3901,7 +3951,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ORReduceAllMasked(long[] a, boolean[] mask) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3921,7 +3971,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3932,7 +3982,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long XORReduce(long[] a, int idx) { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3941,7 +3991,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long XORReduceAll(long[] a) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3959,7 +4009,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3972,20 +4022,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = XOR_IDENTITY; - assertEquals((long) (id ^ id), id, + assertEquals((long) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id ^ x), x); - assertEquals((long) (x ^ id), x); + assertEquals((long) (scalar_xor(id, x)), x); + assertEquals((long) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id ^ x), x, + assertEquals((long) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x ^ id), x, + assertEquals((long) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3994,7 +4044,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -4003,7 +4053,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long XORReduceAllMasked(long[] a, boolean[] mask) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4023,7 +4073,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4034,7 +4084,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ADDReduce(long[] a, int idx) { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4043,7 +4093,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ADDReduceAll(long[] a) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4061,7 +4111,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4074,20 +4124,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = ADD_IDENTITY; - assertEquals((long) (id + id), id, + assertEquals((long) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id + x), x); - assertEquals((long) (x + id), x); + assertEquals((long) (scalar_add(id, x)), x); + assertEquals((long) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id + x), x, + assertEquals((long) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x + id), x, + assertEquals((long) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4096,7 +4146,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4105,7 +4155,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long ADDReduceAllMasked(long[] a, boolean[] mask) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4125,7 +4175,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4136,7 +4186,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MULReduce(long[] a, int idx) { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4145,7 +4195,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MULReduceAll(long[] a) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4163,7 +4213,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4176,20 +4226,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MUL_IDENTITY; - assertEquals((long) (id * id), id, + assertEquals((long) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id * x), x); - assertEquals((long) (x * id), x); + assertEquals((long) (scalar_mul(id, x)), x); + assertEquals((long) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id * x), x, + assertEquals((long) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x * id), x, + assertEquals((long) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4198,7 +4248,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4207,7 +4257,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MULReduceAllMasked(long[] a, boolean[] mask) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4227,7 +4277,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4238,7 +4288,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MINReduce(long[] a, int idx) { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4247,7 +4297,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MINReduceAll(long[] a) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4265,7 +4315,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4278,20 +4328,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MIN_IDENTITY; - assertEquals((long) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.min(id, x), x); - assertEquals((long) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4300,7 +4350,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4309,7 +4359,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MINReduceAllMasked(long[] a, boolean[] mask) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4329,7 +4379,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4340,7 +4390,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MAXReduce(long[] a, int idx) { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4349,7 +4399,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MAXReduceAll(long[] a) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4367,7 +4417,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4380,20 +4430,20 @@ public class LongVector256Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MAX_IDENTITY; - assertEquals((long) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.max(id, x), x); - assertEquals((long) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4402,7 +4452,7 @@ public class LongVector256Tests extends AbstractVectorTest { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4411,7 +4461,7 @@ public class LongVector256Tests extends AbstractVectorTest { static long MAXReduceAllMasked(long[] a, boolean[] mask) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4431,7 +4481,7 @@ public class LongVector256Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5464,7 +5514,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5484,7 +5534,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5501,7 +5551,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5521,7 +5571,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -6234,11 +6284,11 @@ public class LongVector256Tests extends AbstractVectorTest { } static long NEG(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } static long neg(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6290,11 +6340,11 @@ public class LongVector256Tests extends AbstractVectorTest { } static long ABS(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } static long abs(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6785,7 +6835,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6801,7 +6851,7 @@ public class LongVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } diff --git a/test/jdk/jdk/incubator/vector/LongVector512Tests.java b/test/jdk/jdk/incubator/vector/LongVector512Tests.java index 503bd7942f2..00d8c4b010a 100644 --- a/test/jdk/jdk/incubator/vector/LongVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector512Tests.java @@ -1547,6 +1547,59 @@ public class LongVector512Tests extends AbstractVectorTest { return a >= b; } + static long firstNonZero(long a, long b) { + return Long.compare(a, (long) 0) != 0 ? a : b; + } + + static long scalar_or(long a, long b) { + return (long)(a | b); + } + + static long scalar_and(long a, long b) { + return (long)(a & b); + } + + static long scalar_xor(long a, long b) { + return (long)(a ^ b); + } + + static long scalar_add(long a, long b) { + return (long)(a + b); + } + + static long scalar_sub(long a, long b) { + return (long)(a - b); + } + + static long scalar_mul(long a, long b) { + return (long)(a * b); + } + + static long scalar_min(long a, long b) { + return (long)(Math.min(a, b)); + } + + static long scalar_max(long a, long b) { + return (long)(Math.max(a, b)); + } + + static long scalar_div(long a, long b) { + return (long)(a / b); + } + + static long scalar_fma(long a, long b, long c) { + return (long)(Math.fma(a, b, c)); + } + + static long scalar_abs(long a) { + return (long)(Math.abs(a)); + } + + static long scalar_neg(long a) { + return ((long)-a); + } + + static boolean ult(long a, long b) { return Long.compareUnsigned(a, b) < 0; } @@ -1563,9 +1616,6 @@ public class LongVector512Tests extends AbstractVectorTest { return Long.compareUnsigned(a, b) >= 0; } - static long firstNonZero(long a, long b) { - return Long.compare(a, (long) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1679,7 +1729,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long ADD(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1700,7 +1750,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long add(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1757,7 +1807,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long SUB(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1778,7 +1828,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long sub(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1835,7 +1885,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long MUL(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1856,7 +1906,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long mul(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -2003,7 +2053,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long FIRST_NONZERO(long a, long b) { - return (long)((a)!=0?a:b); + return (long)(firstNonZero(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3299,7 +3349,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long MIN(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3320,7 +3370,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long min(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3339,7 +3389,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long MAX(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3360,7 +3410,7 @@ public class LongVector512Tests extends AbstractVectorTest { } static long max(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3728,7 +3778,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ANDReduce(long[] a, int idx) { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3737,7 +3787,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ANDReduceAll(long[] a) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3755,7 +3805,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3768,20 +3818,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = AND_IDENTITY; - assertEquals((long) (id & id), id, + assertEquals((long) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id & x), x); - assertEquals((long) (x & id), x); + assertEquals((long) (scalar_and(id, x)), x); + assertEquals((long) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id & x), x, + assertEquals((long) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x & id), x, + assertEquals((long) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3790,7 +3840,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3799,7 +3849,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ANDReduceAllMasked(long[] a, boolean[] mask) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3819,7 +3869,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3830,7 +3880,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ORReduce(long[] a, int idx) { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3839,7 +3889,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ORReduceAll(long[] a) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3857,7 +3907,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3870,20 +3920,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = OR_IDENTITY; - assertEquals((long) (id | id), id, + assertEquals((long) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id | x), x); - assertEquals((long) (x | id), x); + assertEquals((long) (scalar_or(id, x)), x); + assertEquals((long) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id | x), x, + assertEquals((long) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x | id), x, + assertEquals((long) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3892,7 +3942,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3901,7 +3951,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ORReduceAllMasked(long[] a, boolean[] mask) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3921,7 +3971,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3932,7 +3982,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long XORReduce(long[] a, int idx) { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3941,7 +3991,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long XORReduceAll(long[] a) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3959,7 +4009,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3972,20 +4022,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = XOR_IDENTITY; - assertEquals((long) (id ^ id), id, + assertEquals((long) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id ^ x), x); - assertEquals((long) (x ^ id), x); + assertEquals((long) (scalar_xor(id, x)), x); + assertEquals((long) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id ^ x), x, + assertEquals((long) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x ^ id), x, + assertEquals((long) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3994,7 +4044,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -4003,7 +4053,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long XORReduceAllMasked(long[] a, boolean[] mask) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4023,7 +4073,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4034,7 +4084,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ADDReduce(long[] a, int idx) { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4043,7 +4093,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ADDReduceAll(long[] a) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4061,7 +4111,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4074,20 +4124,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = ADD_IDENTITY; - assertEquals((long) (id + id), id, + assertEquals((long) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id + x), x); - assertEquals((long) (x + id), x); + assertEquals((long) (scalar_add(id, x)), x); + assertEquals((long) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id + x), x, + assertEquals((long) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x + id), x, + assertEquals((long) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4096,7 +4146,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4105,7 +4155,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long ADDReduceAllMasked(long[] a, boolean[] mask) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4125,7 +4175,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4136,7 +4186,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MULReduce(long[] a, int idx) { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4145,7 +4195,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MULReduceAll(long[] a) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4163,7 +4213,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4176,20 +4226,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MUL_IDENTITY; - assertEquals((long) (id * id), id, + assertEquals((long) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id * x), x); - assertEquals((long) (x * id), x); + assertEquals((long) (scalar_mul(id, x)), x); + assertEquals((long) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id * x), x, + assertEquals((long) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x * id), x, + assertEquals((long) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4198,7 +4248,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4207,7 +4257,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MULReduceAllMasked(long[] a, boolean[] mask) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4227,7 +4277,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4238,7 +4288,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MINReduce(long[] a, int idx) { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4247,7 +4297,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MINReduceAll(long[] a) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4265,7 +4315,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4278,20 +4328,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MIN_IDENTITY; - assertEquals((long) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.min(id, x), x); - assertEquals((long) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4300,7 +4350,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4309,7 +4359,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MINReduceAllMasked(long[] a, boolean[] mask) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4329,7 +4379,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4340,7 +4390,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MAXReduce(long[] a, int idx) { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4349,7 +4399,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MAXReduceAll(long[] a) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4367,7 +4417,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4380,20 +4430,20 @@ public class LongVector512Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MAX_IDENTITY; - assertEquals((long) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.max(id, x), x); - assertEquals((long) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4402,7 +4452,7 @@ public class LongVector512Tests extends AbstractVectorTest { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4411,7 +4461,7 @@ public class LongVector512Tests extends AbstractVectorTest { static long MAXReduceAllMasked(long[] a, boolean[] mask) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4431,7 +4481,7 @@ public class LongVector512Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5464,7 +5514,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5484,7 +5534,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5501,7 +5551,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5521,7 +5571,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -6234,11 +6284,11 @@ public class LongVector512Tests extends AbstractVectorTest { } static long NEG(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } static long neg(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6290,11 +6340,11 @@ public class LongVector512Tests extends AbstractVectorTest { } static long ABS(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } static long abs(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6785,7 +6835,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6801,7 +6851,7 @@ public class LongVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } diff --git a/test/jdk/jdk/incubator/vector/LongVector64Tests.java b/test/jdk/jdk/incubator/vector/LongVector64Tests.java index 6ca3c63054a..d4cdfe54ad2 100644 --- a/test/jdk/jdk/incubator/vector/LongVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/LongVector64Tests.java @@ -1547,6 +1547,59 @@ public class LongVector64Tests extends AbstractVectorTest { return a >= b; } + static long firstNonZero(long a, long b) { + return Long.compare(a, (long) 0) != 0 ? a : b; + } + + static long scalar_or(long a, long b) { + return (long)(a | b); + } + + static long scalar_and(long a, long b) { + return (long)(a & b); + } + + static long scalar_xor(long a, long b) { + return (long)(a ^ b); + } + + static long scalar_add(long a, long b) { + return (long)(a + b); + } + + static long scalar_sub(long a, long b) { + return (long)(a - b); + } + + static long scalar_mul(long a, long b) { + return (long)(a * b); + } + + static long scalar_min(long a, long b) { + return (long)(Math.min(a, b)); + } + + static long scalar_max(long a, long b) { + return (long)(Math.max(a, b)); + } + + static long scalar_div(long a, long b) { + return (long)(a / b); + } + + static long scalar_fma(long a, long b, long c) { + return (long)(Math.fma(a, b, c)); + } + + static long scalar_abs(long a) { + return (long)(Math.abs(a)); + } + + static long scalar_neg(long a) { + return ((long)-a); + } + + static boolean ult(long a, long b) { return Long.compareUnsigned(a, b) < 0; } @@ -1563,9 +1616,6 @@ public class LongVector64Tests extends AbstractVectorTest { return Long.compareUnsigned(a, b) >= 0; } - static long firstNonZero(long a, long b) { - return Long.compare(a, (long) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1679,7 +1729,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long ADD(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1700,7 +1750,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long add(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1757,7 +1807,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long SUB(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1778,7 +1828,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long sub(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1835,7 +1885,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long MUL(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1856,7 +1906,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long mul(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -2003,7 +2053,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long FIRST_NONZERO(long a, long b) { - return (long)((a)!=0?a:b); + return (long)(firstNonZero(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3299,7 +3349,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long MIN(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3320,7 +3370,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long min(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3339,7 +3389,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long MAX(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3360,7 +3410,7 @@ public class LongVector64Tests extends AbstractVectorTest { } static long max(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3728,7 +3778,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ANDReduce(long[] a, int idx) { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3737,7 +3787,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ANDReduceAll(long[] a) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3755,7 +3805,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3768,20 +3818,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = AND_IDENTITY; - assertEquals((long) (id & id), id, + assertEquals((long) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id & x), x); - assertEquals((long) (x & id), x); + assertEquals((long) (scalar_and(id, x)), x); + assertEquals((long) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id & x), x, + assertEquals((long) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x & id), x, + assertEquals((long) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3790,7 +3840,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3799,7 +3849,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ANDReduceAllMasked(long[] a, boolean[] mask) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3819,7 +3869,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3830,7 +3880,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ORReduce(long[] a, int idx) { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3839,7 +3889,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ORReduceAll(long[] a) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3857,7 +3907,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3870,20 +3920,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = OR_IDENTITY; - assertEquals((long) (id | id), id, + assertEquals((long) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id | x), x); - assertEquals((long) (x | id), x); + assertEquals((long) (scalar_or(id, x)), x); + assertEquals((long) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id | x), x, + assertEquals((long) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x | id), x, + assertEquals((long) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3892,7 +3942,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3901,7 +3951,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ORReduceAllMasked(long[] a, boolean[] mask) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3921,7 +3971,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3932,7 +3982,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long XORReduce(long[] a, int idx) { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3941,7 +3991,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long XORReduceAll(long[] a) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3959,7 +4009,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3972,20 +4022,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = XOR_IDENTITY; - assertEquals((long) (id ^ id), id, + assertEquals((long) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id ^ x), x); - assertEquals((long) (x ^ id), x); + assertEquals((long) (scalar_xor(id, x)), x); + assertEquals((long) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id ^ x), x, + assertEquals((long) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x ^ id), x, + assertEquals((long) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3994,7 +4044,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -4003,7 +4053,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long XORReduceAllMasked(long[] a, boolean[] mask) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4023,7 +4073,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4034,7 +4084,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ADDReduce(long[] a, int idx) { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4043,7 +4093,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ADDReduceAll(long[] a) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4061,7 +4111,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4074,20 +4124,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = ADD_IDENTITY; - assertEquals((long) (id + id), id, + assertEquals((long) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id + x), x); - assertEquals((long) (x + id), x); + assertEquals((long) (scalar_add(id, x)), x); + assertEquals((long) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id + x), x, + assertEquals((long) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x + id), x, + assertEquals((long) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4096,7 +4146,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4105,7 +4155,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long ADDReduceAllMasked(long[] a, boolean[] mask) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4125,7 +4175,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4136,7 +4186,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MULReduce(long[] a, int idx) { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4145,7 +4195,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MULReduceAll(long[] a) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4163,7 +4213,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4176,20 +4226,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MUL_IDENTITY; - assertEquals((long) (id * id), id, + assertEquals((long) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id * x), x); - assertEquals((long) (x * id), x); + assertEquals((long) (scalar_mul(id, x)), x); + assertEquals((long) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id * x), x, + assertEquals((long) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x * id), x, + assertEquals((long) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4198,7 +4248,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4207,7 +4257,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MULReduceAllMasked(long[] a, boolean[] mask) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4227,7 +4277,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4238,7 +4288,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MINReduce(long[] a, int idx) { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4247,7 +4297,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MINReduceAll(long[] a) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4265,7 +4315,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4278,20 +4328,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MIN_IDENTITY; - assertEquals((long) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.min(id, x), x); - assertEquals((long) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4300,7 +4350,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4309,7 +4359,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MINReduceAllMasked(long[] a, boolean[] mask) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4329,7 +4379,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4340,7 +4390,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MAXReduce(long[] a, int idx) { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4349,7 +4399,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MAXReduceAll(long[] a) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4367,7 +4417,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4380,20 +4430,20 @@ public class LongVector64Tests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MAX_IDENTITY; - assertEquals((long) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.max(id, x), x); - assertEquals((long) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4402,7 +4452,7 @@ public class LongVector64Tests extends AbstractVectorTest { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4411,7 +4461,7 @@ public class LongVector64Tests extends AbstractVectorTest { static long MAXReduceAllMasked(long[] a, boolean[] mask) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4431,7 +4481,7 @@ public class LongVector64Tests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5464,7 +5514,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5484,7 +5534,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5501,7 +5551,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5521,7 +5571,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -6234,11 +6284,11 @@ public class LongVector64Tests extends AbstractVectorTest { } static long NEG(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } static long neg(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6290,11 +6340,11 @@ public class LongVector64Tests extends AbstractVectorTest { } static long ABS(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } static long abs(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6785,7 +6835,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6801,7 +6851,7 @@ public class LongVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } diff --git a/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java b/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java index aef89af5893..597169b00f5 100644 --- a/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/LongVectorMaxTests.java @@ -1553,6 +1553,59 @@ public class LongVectorMaxTests extends AbstractVectorTest { return a >= b; } + static long firstNonZero(long a, long b) { + return Long.compare(a, (long) 0) != 0 ? a : b; + } + + static long scalar_or(long a, long b) { + return (long)(a | b); + } + + static long scalar_and(long a, long b) { + return (long)(a & b); + } + + static long scalar_xor(long a, long b) { + return (long)(a ^ b); + } + + static long scalar_add(long a, long b) { + return (long)(a + b); + } + + static long scalar_sub(long a, long b) { + return (long)(a - b); + } + + static long scalar_mul(long a, long b) { + return (long)(a * b); + } + + static long scalar_min(long a, long b) { + return (long)(Math.min(a, b)); + } + + static long scalar_max(long a, long b) { + return (long)(Math.max(a, b)); + } + + static long scalar_div(long a, long b) { + return (long)(a / b); + } + + static long scalar_fma(long a, long b, long c) { + return (long)(Math.fma(a, b, c)); + } + + static long scalar_abs(long a) { + return (long)(Math.abs(a)); + } + + static long scalar_neg(long a) { + return ((long)-a); + } + + static boolean ult(long a, long b) { return Long.compareUnsigned(a, b) < 0; } @@ -1569,9 +1622,6 @@ public class LongVectorMaxTests extends AbstractVectorTest { return Long.compareUnsigned(a, b) >= 0; } - static long firstNonZero(long a, long b) { - return Long.compare(a, (long) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1685,7 +1735,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long ADD(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1706,7 +1756,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long add(long a, long b) { - return (long)(a + b); + return (long)(scalar_add(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1763,7 +1813,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long SUB(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1784,7 +1834,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long sub(long a, long b) { - return (long)(a - b); + return (long)(scalar_sub(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1841,7 +1891,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long MUL(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -1862,7 +1912,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long mul(long a, long b) { - return (long)(a * b); + return (long)(scalar_mul(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -2009,7 +2059,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long FIRST_NONZERO(long a, long b) { - return (long)((a)!=0?a:b); + return (long)(firstNonZero(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3305,7 +3355,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long MIN(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3326,7 +3376,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long min(long a, long b) { - return (long)(Math.min(a, b)); + return (long)(scalar_min(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3345,7 +3395,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long MAX(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3366,7 +3416,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long max(long a, long b) { - return (long)(Math.max(a, b)); + return (long)(scalar_max(a, b)); } @Test(dataProvider = "longBinaryOpProvider") @@ -3734,7 +3784,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ANDReduce(long[] a, int idx) { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3743,7 +3793,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ANDReduceAll(long[] a) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3761,7 +3811,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3774,20 +3824,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = AND_IDENTITY; - assertEquals((long) (id & id), id, + assertEquals((long) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id & x), x); - assertEquals((long) (x & id), x); + assertEquals((long) (scalar_and(id, x)), x); + assertEquals((long) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id & x), x, + assertEquals((long) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x & id), x, + assertEquals((long) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3796,7 +3846,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3805,7 +3855,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ANDReduceAllMasked(long[] a, boolean[] mask) { long res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3825,7 +3875,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3836,7 +3886,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ORReduce(long[] a, int idx) { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3845,7 +3895,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ORReduceAll(long[] a) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3863,7 +3913,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3876,20 +3926,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = OR_IDENTITY; - assertEquals((long) (id | id), id, + assertEquals((long) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id | x), x); - assertEquals((long) (x | id), x); + assertEquals((long) (scalar_or(id, x)), x); + assertEquals((long) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id | x), x, + assertEquals((long) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x | id), x, + assertEquals((long) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3898,7 +3948,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3907,7 +3957,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ORReduceAllMasked(long[] a, boolean[] mask) { long res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3927,7 +3977,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3938,7 +3988,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long XORReduce(long[] a, int idx) { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3947,7 +3997,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long XORReduceAll(long[] a) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3965,7 +4015,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3978,20 +4028,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = XOR_IDENTITY; - assertEquals((long) (id ^ id), id, + assertEquals((long) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id ^ x), x); - assertEquals((long) (x ^ id), x); + assertEquals((long) (scalar_xor(id, x)), x); + assertEquals((long) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id ^ x), x, + assertEquals((long) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x ^ id), x, + assertEquals((long) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -4000,7 +4050,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -4009,7 +4059,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long XORReduceAllMasked(long[] a, boolean[] mask) { long res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -4029,7 +4079,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -4040,7 +4090,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ADDReduce(long[] a, int idx) { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4049,7 +4099,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ADDReduceAll(long[] a) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -4067,7 +4117,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4080,20 +4130,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = ADD_IDENTITY; - assertEquals((long) (id + id), id, + assertEquals((long) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id + x), x); - assertEquals((long) (x + id), x); + assertEquals((long) (scalar_add(id, x)), x); + assertEquals((long) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id + x), x, + assertEquals((long) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x + id), x, + assertEquals((long) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4102,7 +4152,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4111,7 +4161,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllMasked(long[] a, boolean[] mask) { long res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4131,7 +4181,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4142,7 +4192,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MULReduce(long[] a, int idx) { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4151,7 +4201,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MULReduceAll(long[] a) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4169,7 +4219,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4182,20 +4232,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MUL_IDENTITY; - assertEquals((long) (id * id), id, + assertEquals((long) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) (id * x), x); - assertEquals((long) (x * id), x); + assertEquals((long) (scalar_mul(id, x)), x); + assertEquals((long) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((long) (id * x), x, + assertEquals((long) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((long) (x * id), x, + assertEquals((long) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4204,7 +4254,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4213,7 +4263,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MULReduceAllMasked(long[] a, boolean[] mask) { long res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4233,7 +4283,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4244,7 +4294,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MINReduce(long[] a, int idx) { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4253,7 +4303,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MINReduceAll(long[] a) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4271,7 +4321,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4284,20 +4334,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MIN_IDENTITY; - assertEquals((long) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.min(id, x), x); - assertEquals((long) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4306,7 +4356,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4315,7 +4365,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MINReduceAllMasked(long[] a, boolean[] mask) { long res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4335,7 +4385,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (long) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4346,7 +4396,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MAXReduce(long[] a, int idx) { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4355,7 +4405,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MAXReduceAll(long[] a) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4373,7 +4423,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4386,20 +4436,20 @@ public class LongVectorMaxTests extends AbstractVectorTest { long[] a = fa.apply(SPECIES.length()); long id = MAX_IDENTITY; - assertEquals((long) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); long x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((long) Math.max(id, x), x); - assertEquals((long) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((long) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((long) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4408,7 +4458,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { long res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (long) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4417,7 +4467,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { static long MAXReduceAllMasked(long[] a, boolean[] mask) { long res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (long) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4437,7 +4487,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { LongVector av = LongVector.fromArray(SPECIES, a, i); long v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (long) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5470,7 +5520,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5490,7 +5540,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5507,7 +5557,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5527,7 +5577,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -6240,11 +6290,11 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long NEG(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } static long neg(long a) { - return (long)(-((long)a)); + return (long)(scalar_neg((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6296,11 +6346,11 @@ public class LongVectorMaxTests extends AbstractVectorTest { } static long ABS(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } static long abs(long a) { - return (long)(Math.abs((long)a)); + return (long)(scalar_abs((long)a)); } @Test(dataProvider = "longUnaryOpProvider") @@ -6791,7 +6841,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6807,7 +6857,7 @@ public class LongVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } diff --git a/test/jdk/jdk/incubator/vector/ShortVector128Tests.java b/test/jdk/jdk/incubator/vector/ShortVector128Tests.java index 7cf49513620..85e7d715182 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector128Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector128Tests.java @@ -1565,6 +1565,59 @@ public class ShortVector128Tests extends AbstractVectorTest { return a >= b; } + static short firstNonZero(short a, short b) { + return Short.compare(a, (short) 0) != 0 ? a : b; + } + + static short scalar_or(short a, short b) { + return (short)(a | b); + } + + static short scalar_and(short a, short b) { + return (short)(a & b); + } + + static short scalar_xor(short a, short b) { + return (short)(a ^ b); + } + + static short scalar_add(short a, short b) { + return (short)(a + b); + } + + static short scalar_sub(short a, short b) { + return (short)(a - b); + } + + static short scalar_mul(short a, short b) { + return (short)(a * b); + } + + static short scalar_min(short a, short b) { + return (short)(Math.min(a, b)); + } + + static short scalar_max(short a, short b) { + return (short)(Math.max(a, b)); + } + + static short scalar_div(short a, short b) { + return (short)(a / b); + } + + static short scalar_fma(short a, short b, short c) { + return (short)(Math.fma(a, b, c)); + } + + static short scalar_abs(short a) { + return (short)(Math.abs(a)); + } + + static short scalar_neg(short a) { + return ((short)-a); + } + + static boolean ult(short a, short b) { return Short.compareUnsigned(a, b) < 0; } @@ -1581,9 +1634,6 @@ public class ShortVector128Tests extends AbstractVectorTest { return Short.compareUnsigned(a, b) >= 0; } - static short firstNonZero(short a, short b) { - return Short.compare(a, (short) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1692,7 +1742,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short ADD(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1713,7 +1763,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short add(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1770,7 +1820,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short SUB(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1791,7 +1841,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short sub(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1848,7 +1898,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short MUL(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1869,7 +1919,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short mul(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -2016,7 +2066,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short FIRST_NONZERO(short a, short b) { - return (short)((a)!=0?a:b); + return (short)(firstNonZero(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3230,7 +3280,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short MIN(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3251,7 +3301,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short min(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3270,7 +3320,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short MAX(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3291,7 +3341,7 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short max(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3659,7 +3709,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ANDReduce(short[] a, int idx) { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3668,7 +3718,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ANDReduceAll(short[] a) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3686,7 +3736,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3699,20 +3749,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = AND_IDENTITY; - assertEquals((short) (id & id), id, + assertEquals((short) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id & x), x); - assertEquals((short) (x & id), x); + assertEquals((short) (scalar_and(id, x)), x); + assertEquals((short) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id & x), x, + assertEquals((short) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x & id), x, + assertEquals((short) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3721,7 +3771,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3730,7 +3780,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ANDReduceAllMasked(short[] a, boolean[] mask) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3750,7 +3800,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3761,7 +3811,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ORReduce(short[] a, int idx) { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3770,7 +3820,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ORReduceAll(short[] a) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3788,7 +3838,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3801,20 +3851,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = OR_IDENTITY; - assertEquals((short) (id | id), id, + assertEquals((short) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id | x), x); - assertEquals((short) (x | id), x); + assertEquals((short) (scalar_or(id, x)), x); + assertEquals((short) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id | x), x, + assertEquals((short) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x | id), x, + assertEquals((short) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3823,7 +3873,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3832,7 +3882,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ORReduceAllMasked(short[] a, boolean[] mask) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3852,7 +3902,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3863,7 +3913,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short XORReduce(short[] a, int idx) { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3872,7 +3922,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short XORReduceAll(short[] a) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3890,7 +3940,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3903,20 +3953,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = XOR_IDENTITY; - assertEquals((short) (id ^ id), id, + assertEquals((short) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id ^ x), x); - assertEquals((short) (x ^ id), x); + assertEquals((short) (scalar_xor(id, x)), x); + assertEquals((short) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id ^ x), x, + assertEquals((short) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x ^ id), x, + assertEquals((short) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3925,7 +3975,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3934,7 +3984,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short XORReduceAllMasked(short[] a, boolean[] mask) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3954,7 +4004,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3965,7 +4015,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ADDReduce(short[] a, int idx) { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3974,7 +4024,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ADDReduceAll(short[] a) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -3992,7 +4042,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4005,20 +4055,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = ADD_IDENTITY; - assertEquals((short) (id + id), id, + assertEquals((short) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id + x), x); - assertEquals((short) (x + id), x); + assertEquals((short) (scalar_add(id, x)), x); + assertEquals((short) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id + x), x, + assertEquals((short) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x + id), x, + assertEquals((short) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4027,7 +4077,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4036,7 +4086,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short ADDReduceAllMasked(short[] a, boolean[] mask) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4056,7 +4106,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4067,7 +4117,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MULReduce(short[] a, int idx) { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4076,7 +4126,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MULReduceAll(short[] a) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4094,7 +4144,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4107,20 +4157,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MUL_IDENTITY; - assertEquals((short) (id * id), id, + assertEquals((short) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id * x), x); - assertEquals((short) (x * id), x); + assertEquals((short) (scalar_mul(id, x)), x); + assertEquals((short) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id * x), x, + assertEquals((short) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x * id), x, + assertEquals((short) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4129,7 +4179,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4138,7 +4188,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MULReduceAllMasked(short[] a, boolean[] mask) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4158,7 +4208,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4169,7 +4219,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MINReduce(short[] a, int idx) { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4178,7 +4228,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MINReduceAll(short[] a) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4196,7 +4246,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4209,20 +4259,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MIN_IDENTITY; - assertEquals((short) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.min(id, x), x); - assertEquals((short) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4231,7 +4281,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4240,7 +4290,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MINReduceAllMasked(short[] a, boolean[] mask) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4260,7 +4310,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4271,7 +4321,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MAXReduce(short[] a, int idx) { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4280,7 +4330,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MAXReduceAll(short[] a) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4298,7 +4348,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4311,20 +4361,20 @@ public class ShortVector128Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MAX_IDENTITY; - assertEquals((short) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.max(id, x), x); - assertEquals((short) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4333,7 +4383,7 @@ public class ShortVector128Tests extends AbstractVectorTest { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4342,7 +4392,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static short MAXReduceAllMasked(short[] a, boolean[] mask) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4362,7 +4412,7 @@ public class ShortVector128Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5395,7 +5445,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5415,7 +5465,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5431,7 +5481,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (short)((long)b[i]))); } } } @@ -5451,7 +5501,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (short)((long)b[i])))); } } } @@ -5467,7 +5517,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5487,7 +5537,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5503,7 +5553,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (short)((long)b[i]))); } } } @@ -5523,7 +5573,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (short)((long)b[i])))); } } } @@ -6235,11 +6285,11 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short NEG(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } static short neg(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6291,11 +6341,11 @@ public class ShortVector128Tests extends AbstractVectorTest { } static short ABS(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } static short abs(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6786,7 +6836,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6802,7 +6852,7 @@ public class ShortVector128Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6871,7 +6921,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static long ADDReduceLong(short[] a, int idx) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6880,7 +6930,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static long ADDReduceAllLong(short[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((short)res, (short)ADDReduceLong(a, i)); } return res; @@ -6898,8 +6948,8 @@ public class ShortVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6909,8 +6959,9 @@ public class ShortVector128Tests extends AbstractVectorTest { static long ADDReduceLongMasked(short[] a, int idx, boolean[] mask) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6919,7 +6970,7 @@ public class ShortVector128Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(short[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((short)res, (short)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6939,8 +6990,8 @@ public class ShortVector128Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ShortVector256Tests.java b/test/jdk/jdk/incubator/vector/ShortVector256Tests.java index 5104e3724f7..df379b64e3a 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector256Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector256Tests.java @@ -1565,6 +1565,59 @@ public class ShortVector256Tests extends AbstractVectorTest { return a >= b; } + static short firstNonZero(short a, short b) { + return Short.compare(a, (short) 0) != 0 ? a : b; + } + + static short scalar_or(short a, short b) { + return (short)(a | b); + } + + static short scalar_and(short a, short b) { + return (short)(a & b); + } + + static short scalar_xor(short a, short b) { + return (short)(a ^ b); + } + + static short scalar_add(short a, short b) { + return (short)(a + b); + } + + static short scalar_sub(short a, short b) { + return (short)(a - b); + } + + static short scalar_mul(short a, short b) { + return (short)(a * b); + } + + static short scalar_min(short a, short b) { + return (short)(Math.min(a, b)); + } + + static short scalar_max(short a, short b) { + return (short)(Math.max(a, b)); + } + + static short scalar_div(short a, short b) { + return (short)(a / b); + } + + static short scalar_fma(short a, short b, short c) { + return (short)(Math.fma(a, b, c)); + } + + static short scalar_abs(short a) { + return (short)(Math.abs(a)); + } + + static short scalar_neg(short a) { + return ((short)-a); + } + + static boolean ult(short a, short b) { return Short.compareUnsigned(a, b) < 0; } @@ -1581,9 +1634,6 @@ public class ShortVector256Tests extends AbstractVectorTest { return Short.compareUnsigned(a, b) >= 0; } - static short firstNonZero(short a, short b) { - return Short.compare(a, (short) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1692,7 +1742,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short ADD(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1713,7 +1763,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short add(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1770,7 +1820,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short SUB(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1791,7 +1841,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short sub(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1848,7 +1898,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short MUL(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1869,7 +1919,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short mul(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -2016,7 +2066,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short FIRST_NONZERO(short a, short b) { - return (short)((a)!=0?a:b); + return (short)(firstNonZero(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3230,7 +3280,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short MIN(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3251,7 +3301,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short min(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3270,7 +3320,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short MAX(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3291,7 +3341,7 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short max(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3659,7 +3709,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ANDReduce(short[] a, int idx) { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3668,7 +3718,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ANDReduceAll(short[] a) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3686,7 +3736,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3699,20 +3749,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = AND_IDENTITY; - assertEquals((short) (id & id), id, + assertEquals((short) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id & x), x); - assertEquals((short) (x & id), x); + assertEquals((short) (scalar_and(id, x)), x); + assertEquals((short) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id & x), x, + assertEquals((short) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x & id), x, + assertEquals((short) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3721,7 +3771,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3730,7 +3780,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ANDReduceAllMasked(short[] a, boolean[] mask) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3750,7 +3800,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3761,7 +3811,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ORReduce(short[] a, int idx) { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3770,7 +3820,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ORReduceAll(short[] a) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3788,7 +3838,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3801,20 +3851,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = OR_IDENTITY; - assertEquals((short) (id | id), id, + assertEquals((short) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id | x), x); - assertEquals((short) (x | id), x); + assertEquals((short) (scalar_or(id, x)), x); + assertEquals((short) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id | x), x, + assertEquals((short) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x | id), x, + assertEquals((short) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3823,7 +3873,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3832,7 +3882,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ORReduceAllMasked(short[] a, boolean[] mask) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3852,7 +3902,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3863,7 +3913,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short XORReduce(short[] a, int idx) { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3872,7 +3922,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short XORReduceAll(short[] a) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3890,7 +3940,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3903,20 +3953,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = XOR_IDENTITY; - assertEquals((short) (id ^ id), id, + assertEquals((short) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id ^ x), x); - assertEquals((short) (x ^ id), x); + assertEquals((short) (scalar_xor(id, x)), x); + assertEquals((short) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id ^ x), x, + assertEquals((short) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x ^ id), x, + assertEquals((short) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3925,7 +3975,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3934,7 +3984,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short XORReduceAllMasked(short[] a, boolean[] mask) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3954,7 +4004,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3965,7 +4015,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ADDReduce(short[] a, int idx) { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3974,7 +4024,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ADDReduceAll(short[] a) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -3992,7 +4042,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4005,20 +4055,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = ADD_IDENTITY; - assertEquals((short) (id + id), id, + assertEquals((short) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id + x), x); - assertEquals((short) (x + id), x); + assertEquals((short) (scalar_add(id, x)), x); + assertEquals((short) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id + x), x, + assertEquals((short) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x + id), x, + assertEquals((short) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4027,7 +4077,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4036,7 +4086,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short ADDReduceAllMasked(short[] a, boolean[] mask) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4056,7 +4106,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4067,7 +4117,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MULReduce(short[] a, int idx) { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4076,7 +4126,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MULReduceAll(short[] a) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4094,7 +4144,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4107,20 +4157,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MUL_IDENTITY; - assertEquals((short) (id * id), id, + assertEquals((short) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id * x), x); - assertEquals((short) (x * id), x); + assertEquals((short) (scalar_mul(id, x)), x); + assertEquals((short) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id * x), x, + assertEquals((short) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x * id), x, + assertEquals((short) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4129,7 +4179,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4138,7 +4188,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MULReduceAllMasked(short[] a, boolean[] mask) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4158,7 +4208,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4169,7 +4219,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MINReduce(short[] a, int idx) { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4178,7 +4228,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MINReduceAll(short[] a) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4196,7 +4246,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4209,20 +4259,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MIN_IDENTITY; - assertEquals((short) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.min(id, x), x); - assertEquals((short) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4231,7 +4281,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4240,7 +4290,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MINReduceAllMasked(short[] a, boolean[] mask) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4260,7 +4310,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4271,7 +4321,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MAXReduce(short[] a, int idx) { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4280,7 +4330,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MAXReduceAll(short[] a) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4298,7 +4348,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4311,20 +4361,20 @@ public class ShortVector256Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MAX_IDENTITY; - assertEquals((short) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.max(id, x), x); - assertEquals((short) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4333,7 +4383,7 @@ public class ShortVector256Tests extends AbstractVectorTest { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4342,7 +4392,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static short MAXReduceAllMasked(short[] a, boolean[] mask) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4362,7 +4412,7 @@ public class ShortVector256Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5395,7 +5445,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5415,7 +5465,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5431,7 +5481,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (short)((long)b[i]))); } } } @@ -5451,7 +5501,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (short)((long)b[i])))); } } } @@ -5467,7 +5517,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5487,7 +5537,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5503,7 +5553,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (short)((long)b[i]))); } } } @@ -5523,7 +5573,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (short)((long)b[i])))); } } } @@ -6235,11 +6285,11 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short NEG(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } static short neg(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6291,11 +6341,11 @@ public class ShortVector256Tests extends AbstractVectorTest { } static short ABS(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } static short abs(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6786,7 +6836,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6802,7 +6852,7 @@ public class ShortVector256Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6871,7 +6921,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static long ADDReduceLong(short[] a, int idx) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6880,7 +6930,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static long ADDReduceAllLong(short[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((short)res, (short)ADDReduceLong(a, i)); } return res; @@ -6898,8 +6948,8 @@ public class ShortVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6909,8 +6959,9 @@ public class ShortVector256Tests extends AbstractVectorTest { static long ADDReduceLongMasked(short[] a, int idx, boolean[] mask) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6919,7 +6970,7 @@ public class ShortVector256Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(short[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((short)res, (short)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6939,8 +6990,8 @@ public class ShortVector256Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ShortVector512Tests.java b/test/jdk/jdk/incubator/vector/ShortVector512Tests.java index 69dc6d8019f..ae5804c3688 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector512Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector512Tests.java @@ -1565,6 +1565,59 @@ public class ShortVector512Tests extends AbstractVectorTest { return a >= b; } + static short firstNonZero(short a, short b) { + return Short.compare(a, (short) 0) != 0 ? a : b; + } + + static short scalar_or(short a, short b) { + return (short)(a | b); + } + + static short scalar_and(short a, short b) { + return (short)(a & b); + } + + static short scalar_xor(short a, short b) { + return (short)(a ^ b); + } + + static short scalar_add(short a, short b) { + return (short)(a + b); + } + + static short scalar_sub(short a, short b) { + return (short)(a - b); + } + + static short scalar_mul(short a, short b) { + return (short)(a * b); + } + + static short scalar_min(short a, short b) { + return (short)(Math.min(a, b)); + } + + static short scalar_max(short a, short b) { + return (short)(Math.max(a, b)); + } + + static short scalar_div(short a, short b) { + return (short)(a / b); + } + + static short scalar_fma(short a, short b, short c) { + return (short)(Math.fma(a, b, c)); + } + + static short scalar_abs(short a) { + return (short)(Math.abs(a)); + } + + static short scalar_neg(short a) { + return ((short)-a); + } + + static boolean ult(short a, short b) { return Short.compareUnsigned(a, b) < 0; } @@ -1581,9 +1634,6 @@ public class ShortVector512Tests extends AbstractVectorTest { return Short.compareUnsigned(a, b) >= 0; } - static short firstNonZero(short a, short b) { - return Short.compare(a, (short) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1692,7 +1742,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short ADD(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1713,7 +1763,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short add(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1770,7 +1820,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short SUB(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1791,7 +1841,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short sub(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1848,7 +1898,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short MUL(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1869,7 +1919,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short mul(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -2016,7 +2066,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short FIRST_NONZERO(short a, short b) { - return (short)((a)!=0?a:b); + return (short)(firstNonZero(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3230,7 +3280,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short MIN(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3251,7 +3301,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short min(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3270,7 +3320,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short MAX(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3291,7 +3341,7 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short max(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3659,7 +3709,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ANDReduce(short[] a, int idx) { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3668,7 +3718,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ANDReduceAll(short[] a) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3686,7 +3736,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3699,20 +3749,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = AND_IDENTITY; - assertEquals((short) (id & id), id, + assertEquals((short) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id & x), x); - assertEquals((short) (x & id), x); + assertEquals((short) (scalar_and(id, x)), x); + assertEquals((short) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id & x), x, + assertEquals((short) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x & id), x, + assertEquals((short) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3721,7 +3771,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3730,7 +3780,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ANDReduceAllMasked(short[] a, boolean[] mask) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3750,7 +3800,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3761,7 +3811,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ORReduce(short[] a, int idx) { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3770,7 +3820,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ORReduceAll(short[] a) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3788,7 +3838,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3801,20 +3851,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = OR_IDENTITY; - assertEquals((short) (id | id), id, + assertEquals((short) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id | x), x); - assertEquals((short) (x | id), x); + assertEquals((short) (scalar_or(id, x)), x); + assertEquals((short) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id | x), x, + assertEquals((short) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x | id), x, + assertEquals((short) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3823,7 +3873,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3832,7 +3882,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ORReduceAllMasked(short[] a, boolean[] mask) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3852,7 +3902,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3863,7 +3913,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short XORReduce(short[] a, int idx) { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3872,7 +3922,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short XORReduceAll(short[] a) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3890,7 +3940,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3903,20 +3953,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = XOR_IDENTITY; - assertEquals((short) (id ^ id), id, + assertEquals((short) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id ^ x), x); - assertEquals((short) (x ^ id), x); + assertEquals((short) (scalar_xor(id, x)), x); + assertEquals((short) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id ^ x), x, + assertEquals((short) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x ^ id), x, + assertEquals((short) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3925,7 +3975,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3934,7 +3984,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short XORReduceAllMasked(short[] a, boolean[] mask) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3954,7 +4004,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3965,7 +4015,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ADDReduce(short[] a, int idx) { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3974,7 +4024,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ADDReduceAll(short[] a) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -3992,7 +4042,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4005,20 +4055,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = ADD_IDENTITY; - assertEquals((short) (id + id), id, + assertEquals((short) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id + x), x); - assertEquals((short) (x + id), x); + assertEquals((short) (scalar_add(id, x)), x); + assertEquals((short) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id + x), x, + assertEquals((short) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x + id), x, + assertEquals((short) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4027,7 +4077,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4036,7 +4086,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short ADDReduceAllMasked(short[] a, boolean[] mask) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4056,7 +4106,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4067,7 +4117,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MULReduce(short[] a, int idx) { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4076,7 +4126,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MULReduceAll(short[] a) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4094,7 +4144,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4107,20 +4157,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MUL_IDENTITY; - assertEquals((short) (id * id), id, + assertEquals((short) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id * x), x); - assertEquals((short) (x * id), x); + assertEquals((short) (scalar_mul(id, x)), x); + assertEquals((short) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id * x), x, + assertEquals((short) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x * id), x, + assertEquals((short) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4129,7 +4179,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4138,7 +4188,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MULReduceAllMasked(short[] a, boolean[] mask) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4158,7 +4208,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4169,7 +4219,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MINReduce(short[] a, int idx) { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4178,7 +4228,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MINReduceAll(short[] a) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4196,7 +4246,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4209,20 +4259,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MIN_IDENTITY; - assertEquals((short) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.min(id, x), x); - assertEquals((short) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4231,7 +4281,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4240,7 +4290,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MINReduceAllMasked(short[] a, boolean[] mask) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4260,7 +4310,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4271,7 +4321,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MAXReduce(short[] a, int idx) { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4280,7 +4330,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MAXReduceAll(short[] a) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4298,7 +4348,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4311,20 +4361,20 @@ public class ShortVector512Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MAX_IDENTITY; - assertEquals((short) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.max(id, x), x); - assertEquals((short) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4333,7 +4383,7 @@ public class ShortVector512Tests extends AbstractVectorTest { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4342,7 +4392,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static short MAXReduceAllMasked(short[] a, boolean[] mask) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4362,7 +4412,7 @@ public class ShortVector512Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5395,7 +5445,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5415,7 +5465,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5431,7 +5481,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (short)((long)b[i]))); } } } @@ -5451,7 +5501,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (short)((long)b[i])))); } } } @@ -5467,7 +5517,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5487,7 +5537,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5503,7 +5553,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (short)((long)b[i]))); } } } @@ -5523,7 +5573,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (short)((long)b[i])))); } } } @@ -6235,11 +6285,11 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short NEG(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } static short neg(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6291,11 +6341,11 @@ public class ShortVector512Tests extends AbstractVectorTest { } static short ABS(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } static short abs(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6786,7 +6836,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6802,7 +6852,7 @@ public class ShortVector512Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6871,7 +6921,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static long ADDReduceLong(short[] a, int idx) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6880,7 +6930,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static long ADDReduceAllLong(short[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((short)res, (short)ADDReduceLong(a, i)); } return res; @@ -6898,8 +6948,8 @@ public class ShortVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6909,8 +6959,9 @@ public class ShortVector512Tests extends AbstractVectorTest { static long ADDReduceLongMasked(short[] a, int idx, boolean[] mask) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6919,7 +6970,7 @@ public class ShortVector512Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(short[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((short)res, (short)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6939,8 +6990,8 @@ public class ShortVector512Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ShortVector64Tests.java b/test/jdk/jdk/incubator/vector/ShortVector64Tests.java index dd9f7125853..5f84682f02f 100644 --- a/test/jdk/jdk/incubator/vector/ShortVector64Tests.java +++ b/test/jdk/jdk/incubator/vector/ShortVector64Tests.java @@ -1565,6 +1565,59 @@ public class ShortVector64Tests extends AbstractVectorTest { return a >= b; } + static short firstNonZero(short a, short b) { + return Short.compare(a, (short) 0) != 0 ? a : b; + } + + static short scalar_or(short a, short b) { + return (short)(a | b); + } + + static short scalar_and(short a, short b) { + return (short)(a & b); + } + + static short scalar_xor(short a, short b) { + return (short)(a ^ b); + } + + static short scalar_add(short a, short b) { + return (short)(a + b); + } + + static short scalar_sub(short a, short b) { + return (short)(a - b); + } + + static short scalar_mul(short a, short b) { + return (short)(a * b); + } + + static short scalar_min(short a, short b) { + return (short)(Math.min(a, b)); + } + + static short scalar_max(short a, short b) { + return (short)(Math.max(a, b)); + } + + static short scalar_div(short a, short b) { + return (short)(a / b); + } + + static short scalar_fma(short a, short b, short c) { + return (short)(Math.fma(a, b, c)); + } + + static short scalar_abs(short a) { + return (short)(Math.abs(a)); + } + + static short scalar_neg(short a) { + return ((short)-a); + } + + static boolean ult(short a, short b) { return Short.compareUnsigned(a, b) < 0; } @@ -1581,9 +1634,6 @@ public class ShortVector64Tests extends AbstractVectorTest { return Short.compareUnsigned(a, b) >= 0; } - static short firstNonZero(short a, short b) { - return Short.compare(a, (short) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1692,7 +1742,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short ADD(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1713,7 +1763,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short add(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1770,7 +1820,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short SUB(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1791,7 +1841,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short sub(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1848,7 +1898,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short MUL(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1869,7 +1919,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short mul(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -2016,7 +2066,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short FIRST_NONZERO(short a, short b) { - return (short)((a)!=0?a:b); + return (short)(firstNonZero(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3230,7 +3280,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short MIN(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3251,7 +3301,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short min(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3270,7 +3320,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short MAX(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3291,7 +3341,7 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short max(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3659,7 +3709,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ANDReduce(short[] a, int idx) { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3668,7 +3718,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ANDReduceAll(short[] a) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3686,7 +3736,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3699,20 +3749,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = AND_IDENTITY; - assertEquals((short) (id & id), id, + assertEquals((short) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id & x), x); - assertEquals((short) (x & id), x); + assertEquals((short) (scalar_and(id, x)), x); + assertEquals((short) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id & x), x, + assertEquals((short) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x & id), x, + assertEquals((short) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3721,7 +3771,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3730,7 +3780,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ANDReduceAllMasked(short[] a, boolean[] mask) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3750,7 +3800,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3761,7 +3811,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ORReduce(short[] a, int idx) { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3770,7 +3820,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ORReduceAll(short[] a) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3788,7 +3838,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3801,20 +3851,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = OR_IDENTITY; - assertEquals((short) (id | id), id, + assertEquals((short) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id | x), x); - assertEquals((short) (x | id), x); + assertEquals((short) (scalar_or(id, x)), x); + assertEquals((short) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id | x), x, + assertEquals((short) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x | id), x, + assertEquals((short) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3823,7 +3873,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3832,7 +3882,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ORReduceAllMasked(short[] a, boolean[] mask) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3852,7 +3902,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3863,7 +3913,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short XORReduce(short[] a, int idx) { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3872,7 +3922,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short XORReduceAll(short[] a) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3890,7 +3940,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3903,20 +3953,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = XOR_IDENTITY; - assertEquals((short) (id ^ id), id, + assertEquals((short) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id ^ x), x); - assertEquals((short) (x ^ id), x); + assertEquals((short) (scalar_xor(id, x)), x); + assertEquals((short) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id ^ x), x, + assertEquals((short) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x ^ id), x, + assertEquals((short) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3925,7 +3975,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3934,7 +3984,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short XORReduceAllMasked(short[] a, boolean[] mask) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3954,7 +4004,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3965,7 +4015,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ADDReduce(short[] a, int idx) { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3974,7 +4024,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ADDReduceAll(short[] a) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -3992,7 +4042,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4005,20 +4055,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = ADD_IDENTITY; - assertEquals((short) (id + id), id, + assertEquals((short) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id + x), x); - assertEquals((short) (x + id), x); + assertEquals((short) (scalar_add(id, x)), x); + assertEquals((short) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id + x), x, + assertEquals((short) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x + id), x, + assertEquals((short) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4027,7 +4077,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4036,7 +4086,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short ADDReduceAllMasked(short[] a, boolean[] mask) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4056,7 +4106,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4067,7 +4117,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MULReduce(short[] a, int idx) { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4076,7 +4126,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MULReduceAll(short[] a) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4094,7 +4144,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4107,20 +4157,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MUL_IDENTITY; - assertEquals((short) (id * id), id, + assertEquals((short) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id * x), x); - assertEquals((short) (x * id), x); + assertEquals((short) (scalar_mul(id, x)), x); + assertEquals((short) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id * x), x, + assertEquals((short) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x * id), x, + assertEquals((short) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4129,7 +4179,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4138,7 +4188,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MULReduceAllMasked(short[] a, boolean[] mask) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4158,7 +4208,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4169,7 +4219,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MINReduce(short[] a, int idx) { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4178,7 +4228,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MINReduceAll(short[] a) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4196,7 +4246,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4209,20 +4259,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MIN_IDENTITY; - assertEquals((short) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.min(id, x), x); - assertEquals((short) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4231,7 +4281,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4240,7 +4290,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MINReduceAllMasked(short[] a, boolean[] mask) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4260,7 +4310,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4271,7 +4321,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MAXReduce(short[] a, int idx) { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4280,7 +4330,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MAXReduceAll(short[] a) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4298,7 +4348,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4311,20 +4361,20 @@ public class ShortVector64Tests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MAX_IDENTITY; - assertEquals((short) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.max(id, x), x); - assertEquals((short) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4333,7 +4383,7 @@ public class ShortVector64Tests extends AbstractVectorTest { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4342,7 +4392,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static short MAXReduceAllMasked(short[] a, boolean[] mask) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4362,7 +4412,7 @@ public class ShortVector64Tests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5395,7 +5445,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5415,7 +5465,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5431,7 +5481,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (short)((long)b[i]))); } } } @@ -5451,7 +5501,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (short)((long)b[i])))); } } } @@ -5467,7 +5517,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5487,7 +5537,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5503,7 +5553,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (short)((long)b[i]))); } } } @@ -5523,7 +5573,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (short)((long)b[i])))); } } } @@ -6235,11 +6285,11 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short NEG(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } static short neg(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6291,11 +6341,11 @@ public class ShortVector64Tests extends AbstractVectorTest { } static short ABS(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } static short abs(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6786,7 +6836,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6802,7 +6852,7 @@ public class ShortVector64Tests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6871,7 +6921,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static long ADDReduceLong(short[] a, int idx) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6880,7 +6930,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static long ADDReduceAllLong(short[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((short)res, (short)ADDReduceLong(a, i)); } return res; @@ -6898,8 +6948,8 @@ public class ShortVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6909,8 +6959,9 @@ public class ShortVector64Tests extends AbstractVectorTest { static long ADDReduceLongMasked(short[] a, int idx, boolean[] mask) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6919,7 +6970,7 @@ public class ShortVector64Tests extends AbstractVectorTest { static long ADDReduceAllLongMasked(short[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((short)res, (short)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6939,8 +6990,8 @@ public class ShortVector64Tests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java b/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java index 65234fb3173..5451ad6c50e 100644 --- a/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java +++ b/test/jdk/jdk/incubator/vector/ShortVectorMaxTests.java @@ -1571,6 +1571,59 @@ public class ShortVectorMaxTests extends AbstractVectorTest { return a >= b; } + static short firstNonZero(short a, short b) { + return Short.compare(a, (short) 0) != 0 ? a : b; + } + + static short scalar_or(short a, short b) { + return (short)(a | b); + } + + static short scalar_and(short a, short b) { + return (short)(a & b); + } + + static short scalar_xor(short a, short b) { + return (short)(a ^ b); + } + + static short scalar_add(short a, short b) { + return (short)(a + b); + } + + static short scalar_sub(short a, short b) { + return (short)(a - b); + } + + static short scalar_mul(short a, short b) { + return (short)(a * b); + } + + static short scalar_min(short a, short b) { + return (short)(Math.min(a, b)); + } + + static short scalar_max(short a, short b) { + return (short)(Math.max(a, b)); + } + + static short scalar_div(short a, short b) { + return (short)(a / b); + } + + static short scalar_fma(short a, short b, short c) { + return (short)(Math.fma(a, b, c)); + } + + static short scalar_abs(short a) { + return (short)(Math.abs(a)); + } + + static short scalar_neg(short a) { + return ((short)-a); + } + + static boolean ult(short a, short b) { return Short.compareUnsigned(a, b) < 0; } @@ -1587,9 +1640,6 @@ public class ShortVectorMaxTests extends AbstractVectorTest { return Short.compareUnsigned(a, b) >= 0; } - static short firstNonZero(short a, short b) { - return Short.compare(a, (short) 0) != 0 ? a : b; - } @Test static void smokeTest1() { @@ -1698,7 +1748,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short ADD(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1719,7 +1769,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short add(short a, short b) { - return (short)(a + b); + return (short)(scalar_add(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1776,7 +1826,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short SUB(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1797,7 +1847,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short sub(short a, short b) { - return (short)(a - b); + return (short)(scalar_sub(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1854,7 +1904,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short MUL(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -1875,7 +1925,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short mul(short a, short b) { - return (short)(a * b); + return (short)(scalar_mul(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -2022,7 +2072,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short FIRST_NONZERO(short a, short b) { - return (short)((a)!=0?a:b); + return (short)(firstNonZero(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3236,7 +3286,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short MIN(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3257,7 +3307,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short min(short a, short b) { - return (short)(Math.min(a, b)); + return (short)(scalar_min(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3276,7 +3326,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short MAX(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3297,7 +3347,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short max(short a, short b) { - return (short)(Math.max(a, b)); + return (short)(scalar_max(a, b)); } @Test(dataProvider = "shortBinaryOpProvider") @@ -3665,7 +3715,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ANDReduce(short[] a, int idx) { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3674,7 +3724,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ANDReduceAll(short[] a) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduce(a, i); + res = scalar_and(res, ANDReduce(a, i)); } return res; @@ -3692,7 +3742,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3705,20 +3755,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = AND_IDENTITY; - assertEquals((short) (id & id), id, + assertEquals((short) (scalar_and(id, id)), id, "AND(AND_IDENTITY, AND_IDENTITY) != AND_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id & x), x); - assertEquals((short) (x & id), x); + assertEquals((short) (scalar_and(id, x)), x); + assertEquals((short) (scalar_and(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id & x), x, + assertEquals((short) (scalar_and(id, x)), x, "AND(AND_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x & id), x, + assertEquals((short) (scalar_and(x, id)), x, "AND(" + x + ", AND_IDENTITY) != " + x); } } @@ -3727,7 +3777,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = AND_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res &= a[i]; + res = scalar_and(res, a[i]); } return res; @@ -3736,7 +3786,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ANDReduceAllMasked(short[] a, boolean[] mask) { short res = AND_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res &= ANDReduceMasked(a, i, mask); + res = scalar_and(res, ANDReduceMasked(a, i, mask)); } return res; @@ -3756,7 +3806,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.AND, vmask); r[i] = v; - ra &= v; + ra = scalar_and(ra, v); } } @@ -3767,7 +3817,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ORReduce(short[] a, int idx) { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3776,7 +3826,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ORReduceAll(short[] a) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduce(a, i); + res = scalar_or(res, ORReduce(a, i)); } return res; @@ -3794,7 +3844,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3807,20 +3857,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = OR_IDENTITY; - assertEquals((short) (id | id), id, + assertEquals((short) (scalar_or(id, id)), id, "OR(OR_IDENTITY, OR_IDENTITY) != OR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id | x), x); - assertEquals((short) (x | id), x); + assertEquals((short) (scalar_or(id, x)), x); + assertEquals((short) (scalar_or(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id | x), x, + assertEquals((short) (scalar_or(id, x)), x, "OR(OR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x | id), x, + assertEquals((short) (scalar_or(x, id)), x, "OR(" + x + ", OR_IDENTITY) != " + x); } } @@ -3829,7 +3879,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = OR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res |= a[i]; + res = scalar_or(res, a[i]); } return res; @@ -3838,7 +3888,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ORReduceAllMasked(short[] a, boolean[] mask) { short res = OR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res |= ORReduceMasked(a, i, mask); + res = scalar_or(res, ORReduceMasked(a, i, mask)); } return res; @@ -3858,7 +3908,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.OR, vmask); r[i] = v; - ra |= v; + ra = scalar_or(ra, v); } } @@ -3869,7 +3919,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short XORReduce(short[] a, int idx) { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3878,7 +3928,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short XORReduceAll(short[] a) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduce(a, i); + res = scalar_xor(res, XORReduce(a, i)); } return res; @@ -3896,7 +3946,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3909,20 +3959,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = XOR_IDENTITY; - assertEquals((short) (id ^ id), id, + assertEquals((short) (scalar_xor(id, id)), id, "XOR(XOR_IDENTITY, XOR_IDENTITY) != XOR_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id ^ x), x); - assertEquals((short) (x ^ id), x); + assertEquals((short) (scalar_xor(id, x)), x); + assertEquals((short) (scalar_xor(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id ^ x), x, + assertEquals((short) (scalar_xor(id, x)), x, "XOR(XOR_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x ^ id), x, + assertEquals((short) (scalar_xor(x, id)), x, "XOR(" + x + ", XOR_IDENTITY) != " + x); } } @@ -3931,7 +3981,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = XOR_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res ^= a[i]; + res = scalar_xor(res, a[i]); } return res; @@ -3940,7 +3990,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short XORReduceAllMasked(short[] a, boolean[] mask) { short res = XOR_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res ^= XORReduceMasked(a, i, mask); + res = scalar_xor(res, XORReduceMasked(a, i, mask)); } return res; @@ -3960,7 +4010,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.XOR, vmask); r[i] = v; - ra ^= v; + ra = scalar_xor(ra, v); } } @@ -3971,7 +4021,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ADDReduce(short[] a, int idx) { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -3980,7 +4030,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ADDReduceAll(short[] a) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduce(a, i); + res = scalar_add(res, ADDReduce(a, i)); } return res; @@ -3998,7 +4048,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4011,20 +4061,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = ADD_IDENTITY; - assertEquals((short) (id + id), id, + assertEquals((short) (scalar_add(id, id)), id, "ADD(ADD_IDENTITY, ADD_IDENTITY) != ADD_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id + x), x); - assertEquals((short) (x + id), x); + assertEquals((short) (scalar_add(id, x)), x); + assertEquals((short) (scalar_add(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id + x), x, + assertEquals((short) (scalar_add(id, x)), x, "ADD(ADD_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x + id), x, + assertEquals((short) (scalar_add(x, id)), x, "ADD(" + x + ", ADD_IDENTITY) != " + x); } } @@ -4033,7 +4083,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = ADD_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res += a[i]; + res = scalar_add(res, a[i]); } return res; @@ -4042,7 +4092,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short ADDReduceAllMasked(short[] a, boolean[] mask) { short res = ADD_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceMasked(a, i, mask); + res = scalar_add(res, ADDReduceMasked(a, i, mask)); } return res; @@ -4062,7 +4112,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.ADD, vmask); r[i] = v; - ra += v; + ra = scalar_add(ra, v); } } @@ -4073,7 +4123,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MULReduce(short[] a, int idx) { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4082,7 +4132,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MULReduceAll(short[] a) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduce(a, i); + res = scalar_mul(res, MULReduce(a, i)); } return res; @@ -4100,7 +4150,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4113,20 +4163,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MUL_IDENTITY; - assertEquals((short) (id * id), id, + assertEquals((short) (scalar_mul(id, id)), id, "MUL(MUL_IDENTITY, MUL_IDENTITY) != MUL_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) (id * x), x); - assertEquals((short) (x * id), x); + assertEquals((short) (scalar_mul(id, x)), x); + assertEquals((short) (scalar_mul(x, id)), x); } } catch (AssertionError e) { - assertEquals((short) (id * x), x, + assertEquals((short) (scalar_mul(id, x)), x, "MUL(MUL_IDENTITY, " + x + ") != " + x); - assertEquals((short) (x * id), x, + assertEquals((short) (scalar_mul(x, id)), x, "MUL(" + x + ", MUL_IDENTITY) != " + x); } } @@ -4135,7 +4185,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = MUL_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res *= a[i]; + res = scalar_mul(res, a[i]); } return res; @@ -4144,7 +4194,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MULReduceAllMasked(short[] a, boolean[] mask) { short res = MUL_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res *= MULReduceMasked(a, i, mask); + res = scalar_mul(res, MULReduceMasked(a, i, mask)); } return res; @@ -4164,7 +4214,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MUL, vmask); r[i] = v; - ra *= v; + ra = scalar_mul(ra, v); } } @@ -4175,7 +4225,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MINReduce(short[] a, int idx) { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4184,7 +4234,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MINReduceAll(short[] a) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduce(a, i)); + res = scalar_min(res, MINReduce(a, i)); } return res; @@ -4202,7 +4252,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4215,20 +4265,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MIN_IDENTITY; - assertEquals((short) Math.min(id, id), id, + assertEquals(scalar_min(id, id), id, "MIN(MIN_IDENTITY, MIN_IDENTITY) != MIN_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.min(id, x), x); - assertEquals((short) Math.min(x, id), x); + assertEquals(scalar_min(id, x), x); + assertEquals(scalar_min(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.min(id, x), x, + assertEquals(scalar_min(id, x), x, "MIN(MIN_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.min(x, id), x, + assertEquals(scalar_min(x, id), x, "MIN(" + x + ", MIN_IDENTITY) != " + x); } } @@ -4237,7 +4287,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = MIN_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.min(res, a[i]); + res = scalar_min(res, a[i]); } return res; @@ -4246,7 +4296,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MINReduceAllMasked(short[] a, boolean[] mask) { short res = MIN_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.min(res, MINReduceMasked(a, i, mask)); + res = scalar_min(res, MINReduceMasked(a, i, mask)); } return res; @@ -4266,7 +4316,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MIN, vmask); r[i] = v; - ra = (short) Math.min(ra, v); + ra = scalar_min(ra, v); } } @@ -4277,7 +4327,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MAXReduce(short[] a, int idx) { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4286,7 +4336,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MAXReduceAll(short[] a) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduce(a, i)); + res = scalar_max(res, MAXReduce(a, i)); } return res; @@ -4304,7 +4354,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -4317,20 +4367,20 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short[] a = fa.apply(SPECIES.length()); short id = MAX_IDENTITY; - assertEquals((short) Math.max(id, id), id, + assertEquals(scalar_max(id, id), id, "MAX(MAX_IDENTITY, MAX_IDENTITY) != MAX_IDENTITY"); short x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals((short) Math.max(id, x), x); - assertEquals((short) Math.max(x, id), x); + assertEquals(scalar_max(id, x), x); + assertEquals(scalar_max(x, id), x); } } catch (AssertionError e) { - assertEquals((short) Math.max(id, x), x, + assertEquals(scalar_max(id, x), x, "MAX(MAX_IDENTITY, " + x + ") != " + x); - assertEquals((short) Math.max(x, id), x, + assertEquals(scalar_max(x, id), x, "MAX(" + x + ", MAX_IDENTITY) != " + x); } } @@ -4339,7 +4389,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { short res = MAX_IDENTITY; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res = (short) Math.max(res, a[i]); + res = scalar_max(res, a[i]); } return res; @@ -4348,7 +4398,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static short MAXReduceAllMasked(short[] a, boolean[] mask) { short res = MAX_IDENTITY; for (int i = 0; i < a.length; i += SPECIES.length()) { - res = (short) Math.max(res, MAXReduceMasked(a, i, mask)); + res = scalar_max(res, MAXReduceMasked(a, i, mask)); } return res; @@ -4368,7 +4418,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { ShortVector av = ShortVector.fromArray(SPECIES, a, i); short v = av.reduceLanes(VectorOperators.MAX, vmask); r[i] = v; - ra = (short) Math.max(ra, v); + ra = scalar_max(ra, v); } } @@ -5401,7 +5451,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -5421,7 +5471,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], b[i]))); } } } @@ -5437,7 +5487,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), lt(a[i + j], (short)((long)b[i]))); } } } @@ -5457,7 +5507,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (lt(a[i + j], (short)((long)b[i])))); } } } @@ -5473,7 +5523,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -5493,7 +5543,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], b[i]))); } } } @@ -5509,7 +5559,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == (short)((long)b[i])); + assertEquals(mv.laneIsSet(j), eq(a[i + j], (short)((long)b[i]))); } } } @@ -5529,7 +5579,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (short)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && (eq(a[i + j], (short)((long)b[i])))); } } } @@ -6241,11 +6291,11 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short NEG(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } static short neg(short a) { - return (short)(-((short)a)); + return (short)(scalar_neg((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6297,11 +6347,11 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } static short ABS(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } static short abs(short a) { - return (short)(Math.abs((short)a)); + return (short)(scalar_abs((short)a)); } @Test(dataProvider = "shortUnaryOpProvider") @@ -6792,7 +6842,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -6808,7 +6858,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -6877,7 +6927,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static long ADDReduceLong(short[] a, int idx) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -6886,7 +6936,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLong(short[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add((short)res, (short)ADDReduceLong(a, i)); } return res; @@ -6904,8 +6954,8 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -6915,8 +6965,9 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static long ADDReduceLongMasked(short[] a, int idx, boolean[] mask) { short res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -6925,7 +6976,7 @@ public class ShortVectorMaxTests extends AbstractVectorTest { static long ADDReduceAllLongMasked(short[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add((short)res, (short)ADDReduceLongMasked(a, i, mask)); } return res; @@ -6945,8 +6996,8 @@ public class ShortVectorMaxTests extends AbstractVectorTest { } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add((short)ra, (short)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/gen-template.sh b/test/jdk/jdk/incubator/vector/gen-template.sh index d2528b13b78..4e961e2f2b0 100644 --- a/test/jdk/jdk/incubator/vector/gen-template.sh +++ b/test/jdk/jdk/incubator/vector/gen-template.sh @@ -383,6 +383,7 @@ function gen_bool_reduction_op { gen_op_tmpl $bool_reduction_scalar "$@" gen_op_tmpl $bool_reduction_template "$@" } + function gen_saturating_reduction_op { echo "Generating saturating reduction op $1 ($2)..." gen_op_tmpl $reduction_scalar_func "$@" @@ -434,13 +435,13 @@ fi # ALU binary ops. # Here "ADD+add+withMask" says VectorOperator name is "ADD", and we have a dedicate method too named 'add', and add() is also available with mask variant. -gen_binary_alu_op "ADD+add+withMask" "a + b" -gen_binary_alu_op "SUB+sub+withMask" "a - b" -gen_binary_alu_op "MUL+mul+withMask" "a \* b" -gen_binary_alu_op "DIV+div+withMask" "a \/ b" "FP" +gen_binary_alu_op "ADD+add+withMask" "scalar_add(a, b)" +gen_binary_alu_op "SUB+sub+withMask" "scalar_sub(a, b)" +gen_binary_alu_op "MUL+mul+withMask" "scalar_mul(a, b)" +gen_binary_alu_op "DIV+div+withMask" "scalar_div(a, b)" "FP" gen_op_tmpl "Binary-op_bitwise-div" "DIV+div+withMask" "a \/ b" "BITWISE" gen_op_tmpl "Binary-Masked-op_bitwise-div" "DIV+div+withMask" "a \/ b" "BITWISE" -gen_binary_alu_op "FIRST_NONZERO" "{#if[FP]?Double.doubleToLongBits}(a)!=0?a:b" +gen_binary_alu_op "FIRST_NONZERO" "firstNonZero(a, b)" gen_binary_alu_op "AND+and" "a \& b" "BITWISE" gen_binary_alu_op "AND_NOT" "a \& ~b" "BITWISE" gen_binary_alu_op "OR+or" "a | b" "BITWISE" @@ -449,16 +450,16 @@ gen_binary_alu_op "XOR" "a ^ b" "BITWISE" gen_binary_alu_op "COMPRESS_BITS" "\$Boxtype\$.compress(a, b)" "intOrLong" gen_binary_alu_op "EXPAND_BITS" "\$Boxtype\$.expand(a, b)" "intOrLong" # Generate the broadcast versions -gen_binary_alu_bcst_op "add+withMask" "a + b" -gen_binary_alu_bcst_op "sub+withMask" "a - b" -gen_binary_alu_bcst_op "mul+withMask" "a \* b" -gen_binary_alu_bcst_op "div+withMask" "a \/ b" "FP" +gen_binary_alu_bcst_op "add+withMask" "scalar_add(a, b)" +gen_binary_alu_bcst_op "sub+withMask" "scalar_sub(a, b)" +gen_binary_alu_bcst_op "mul+withMask" "scalar_mul(a, b)" +gen_binary_alu_bcst_op "div+withMask" "scalar_div(a, b)" "FP" gen_op_tmpl "Binary-Broadcast-op_bitwise-div" "div+withMask" "a \/ b" "BITWISE" gen_op_tmpl "Binary-Broadcast-Masked-op_bitwise-div" "div+withMask" "a \/ b" "BITWISE" gen_binary_alu_bcst_op "OR+or" "a | b" "BITWISE" gen_binary_alu_bcst_op "AND+and" "a \& b" "BITWISE" gen_binary_alu_bcst_long_op "OR" "a | b" "BITWISE" -gen_binary_alu_bcst_long_op "ADD" "a + b" +gen_binary_alu_bcst_long_op "ADD" "scalar_add(a, b)" # Shifts gen_binary_alu_op "LSHL" "(a << b)" "intOrLong" @@ -494,30 +495,30 @@ gen_shift_cst_op "ROR" "ROR_scalar(a, CONST_SHIFT)" "BITWISE" gen_shift_cst_op "ROL" "ROL_scalar(a, CONST_SHIFT)" "BITWISE" # Binary operation with one memory operand -gen_binary_alu_mem_op "MIN+min+withMask", "Math.min(a, b)" -gen_binary_alu_mem_op "MAX+max+withMask", "Math.max(a, b)" +gen_binary_alu_mem_op "MIN+min+withMask", "scalar_min(a, b)" +gen_binary_alu_mem_op "MAX+max+withMask", "scalar_max(a, b)" # Masked reductions. -gen_binary_op_no_masked "MIN+min" "Math.min(a, b)" -gen_binary_op_no_masked "MAX+max" "Math.max(a, b)" +gen_binary_op_no_masked "MIN+min" "scalar_min(a, b)" +gen_binary_op_no_masked "MAX+max" "scalar_max(a, b)" gen_binary_op "UMIN" "VectorMath.minUnsigned(a, b)" "BITWISE" gen_binary_op "UMAX" "VectorMath.maxUnsigned(a, b)" "BITWISE" gen_saturating_binary_op "SADD" "VectorMath.addSaturating(a, b)" "BITWISE" gen_saturating_binary_op "SSUB" "VectorMath.subSaturating(a, b)" "BITWISE" gen_saturating_binary_op "SUADD" "VectorMath.addSaturatingUnsigned(a, b)" "BITWISE" gen_saturating_binary_op "SUSUB" "VectorMath.subSaturatingUnsigned(a, b)" "BITWISE" -gen_binary_bcst_op_no_masked "MIN+min" "Math.min(a, b)" -gen_binary_bcst_op_no_masked "MAX+max" "Math.max(a, b)" +gen_binary_bcst_op_no_masked "MIN+min" "scalar_min(a, b)" +gen_binary_bcst_op_no_masked "MAX+max" "scalar_max(a, b)" gen_saturating_binary_op_associative "SUADD" "VectorMath.addSaturatingUnsigned(a, b)" "BITWISE" # Reductions. -gen_reduction_op "AND" "\&" "BITWISE" "AND_IDENTITY" -gen_reduction_op "OR" "|" "BITWISE" "OR_IDENTITY" -gen_reduction_op "XOR" "^" "BITWISE" "XOR_IDENTITY" -gen_reduction_op "ADD" "+" "" "ADD_IDENTITY" -gen_reduction_op "MUL" "*" "" "MUL_IDENTITY" -gen_reduction_op_func "MIN" "(\$type\$) Math.min" "" "MIN_IDENTITY" -gen_reduction_op_func "MAX" "(\$type\$) Math.max" "" "MAX_IDENTITY" +gen_reduction_op "AND" "scalar_and" "BITWISE" "AND_IDENTITY" +gen_reduction_op "OR" "scalar_or" "BITWISE" "OR_IDENTITY" +gen_reduction_op "XOR" "scalar_xor" "BITWISE" "XOR_IDENTITY" +gen_reduction_op "ADD" "scalar_add" "" "ADD_IDENTITY" +gen_reduction_op "MUL" "scalar_mul" "" "MUL_IDENTITY" +gen_reduction_op_func "MIN" "scalar_min" "" "MIN_IDENTITY" +gen_reduction_op_func "MAX" "scalar_max" "" "MAX_IDENTITY" gen_reduction_op_func "UMIN" "(\$type\$) VectorMath.minUnsigned" "BITWISE" "UMIN_IDENTITY" gen_reduction_op_func "UMAX" "(\$type\$) VectorMath.maxUnsigned" "BITWISE" "UMAX_IDENTITY" gen_reduction_op_func "FIRST_NONZERO" "firstNonZero" "" "FIRST_NONZERO_IDENTITY" @@ -535,9 +536,9 @@ gen_with_op "withLane" "" "" "" # Tests gen_op_tmpl $test_template "IS_DEFAULT" "bits(a)==0" gen_op_tmpl $test_template "IS_NEGATIVE" "bits(a)<0" -gen_op_tmpl $test_template "IS_FINITE" "\$Boxtype\$.isFinite(a)" "FP" -gen_op_tmpl $test_template "IS_NAN" "\$Boxtype\$.isNaN(a)" "FP" -gen_op_tmpl $test_template "IS_INFINITE" "\$Boxtype\$.isInfinite(a)" "FP" +gen_op_tmpl $test_template "IS_FINITE" "isFinite(a)" "FP" +gen_op_tmpl $test_template "IS_NAN" "isNaN(a)" "FP" +gen_op_tmpl $test_template "IS_INFINITE" "isInfinite(a)" "FP" # Compares gen_compare_op "LT+lt" "lt" @@ -553,8 +554,8 @@ gen_compare_op "ULE" "ule" "BITWISE" gen_compare_op "UGE" "uge" "BITWISE" -gen_compare_bcst_op "LT" "<" -gen_compare_bcst_op "EQ" "==" +gen_compare_bcst_op "LT" "lt" +gen_compare_bcst_op "EQ" "eq" # Blend. gen_op_tmpl $blend "blend" "" @@ -585,28 +586,28 @@ gen_op_tmpl $unslice1_template "unsliceBinary" "" gen_op_tmpl $unslice1_masked_template "unslice" "" # Math -gen_op_tmpl $unary_math_template "SIN" "Math.sin((double)a)" "FP" -gen_op_tmpl $unary_math_template "EXP" "Math.exp((double)a)" "FP" -gen_op_tmpl $unary_math_template "LOG1P" "Math.log1p((double)a)" "FP" -gen_op_tmpl $unary_math_template "LOG" "Math.log((double)a)" "FP" -gen_op_tmpl $unary_math_template "LOG10" "Math.log10((double)a)" "FP" -gen_op_tmpl $unary_math_template "EXPM1" "Math.expm1((double)a)" "FP" -gen_op_tmpl $unary_math_template "COS" "Math.cos((double)a)" "FP" -gen_op_tmpl $unary_math_template "TAN" "Math.tan((double)a)" "FP" -gen_op_tmpl $unary_math_template "SINH" "Math.sinh((double)a)" "FP" -gen_op_tmpl $unary_math_template "COSH" "Math.cosh((double)a)" "FP" -gen_op_tmpl $unary_math_template "TANH" "Math.tanh((double)a)" "FP" -gen_op_tmpl $unary_math_template "ASIN" "Math.asin((double)a)" "FP" -gen_op_tmpl $unary_math_template "ACOS" "Math.acos((double)a)" "FP" -gen_op_tmpl $unary_math_template "ATAN" "Math.atan((double)a)" "FP" -gen_op_tmpl $unary_math_template "CBRT" "Math.cbrt((double)a)" "FP" -gen_op_tmpl $binary_math_template "HYPOT" "Math.hypot((double)a, (double)b)" "FP" -gen_op_tmpl $binary_math_template "POW+pow" "Math.pow((double)a, (double)b)" "FP" -gen_op_tmpl $binary_math_template "ATAN2" "Math.atan2((double)a, (double)b)" "FP" -gen_op_tmpl $binary_math_broadcast_template "POW+pow" "Math.pow((double)a, (double)b)" "FP" +gen_op_tmpl $unary_math_template "SIN" "scalar_sin(a)" "FP" +gen_op_tmpl $unary_math_template "EXP" "scalar_exp(a)" "FP" +gen_op_tmpl $unary_math_template "LOG1P" "scalar_log1p(a)" "FP" +gen_op_tmpl $unary_math_template "LOG" "scalar_log(a)" "FP" +gen_op_tmpl $unary_math_template "LOG10" "scalar_log10(a)" "FP" +gen_op_tmpl $unary_math_template "EXPM1" "scalar_expm1(a)" "FP" +gen_op_tmpl $unary_math_template "COS" "scalar_cos(a)" "FP" +gen_op_tmpl $unary_math_template "TAN" "scalar_tan(a)" "FP" +gen_op_tmpl $unary_math_template "SINH" "scalar_sinh(a)" "FP" +gen_op_tmpl $unary_math_template "COSH" "scalar_cosh(a)" "FP" +gen_op_tmpl $unary_math_template "TANH" "scalar_tanh(a)" "FP" +gen_op_tmpl $unary_math_template "ASIN" "scalar_asin(a)" "FP" +gen_op_tmpl $unary_math_template "ACOS" "scalar_acos(a)" "FP" +gen_op_tmpl $unary_math_template "ATAN" "scalar_atan(a)" "FP" +gen_op_tmpl $unary_math_template "CBRT" "scalar_cbrt(a)" "FP" +gen_op_tmpl $binary_math_template "HYPOT" "scalar_hypot(a, b)" "FP" +gen_op_tmpl $binary_math_template "POW+pow" "scalar_pow(a, b)" "FP" +gen_op_tmpl $binary_math_template "ATAN2" "scalar_atan2(a, b)" "FP" +gen_op_tmpl $binary_math_broadcast_template "POW+pow" "scalar_pow(a, b)" "FP" # Ternary operations. -gen_ternary_alu_op "FMA+fma" "Math.fma(a, b, c)" "FP" +gen_ternary_alu_op "FMA+fma" "scalar_fma(a, b, c)" "FP" gen_ternary_alu_op "BITWISE_BLEND+bitwiseBlend" "(a\&~(c))|(b\&c)" "BITWISE" gen_ternary_alu_bcst_op "FMA" "Math.fma(a, b, c)" "FP" gen_ternary_alu_bcst_op "BITWISE_BLEND+bitwiseBlend" "(a\&~(c))|(b\&c)" "BITWISE" @@ -614,11 +615,11 @@ gen_ternary_alu_double_bcst_op "FMA+fma" "Math.fma(a, b, c)" "FP" gen_ternary_alu_double_bcst_op "BITWISE_BLEND+bitwiseBlend" "(a\&~(c))|(b\&c)" "BITWISE" # Unary operations. -gen_unary_alu_op "NEG+neg" "-((\$type\$)a)" -gen_unary_alu_op "ABS+abs" "Math.abs((\$type\$)a)" +gen_unary_alu_op "NEG+neg" "scalar_neg((\$type\$)a)" +gen_unary_alu_op "ABS+abs" "scalar_abs((\$type\$)a)" gen_unary_alu_op "NOT+not" "~((\$type\$)a)" "BITWISE" gen_unary_alu_op "ZOMO" "(a==0?0:-1)" "BITWISE" -gen_unary_alu_op "SQRT+sqrt" "Math.sqrt((double)a)" "FP" +gen_unary_alu_op "SQRT+sqrt" "scalar_sqrt(a)" "FP" gen_unary_alu_op "BIT_COUNT" "\$Boxtype\$.bitCount(a)" "intOrLong" gen_unary_alu_op "BIT_COUNT" "Integer.bitCount((int)a \& 0xFF)" "byte" gen_unary_alu_op "BIT_COUNT" "Integer.bitCount((int)a \& 0xFFFF)" "short" diff --git a/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-Masked-op.template b/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-Masked-op.template index 82e20d594b6..73e02bf68dd 100644 --- a/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-Masked-op.template +++ b/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-Masked-op.template @@ -10,7 +10,7 @@ $abstractvectortype$ av = $abstractvectortype$.fromArray(SPECIES, a, i); $type$ v = av.reduceLanes(VectorOperators.[[TEST]], vmask); r[i] = v; - ra [[TEST_OP]]= v; + ra = [[TEST_OP]](ra, v); } } diff --git a/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-op.template b/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-op.template index 3edc2b27e3e..94fae420cdd 100644 --- a/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-op.template +++ b/test/jdk/jdk/incubator/vector/templates/Kernel-Reduction-op.template @@ -8,7 +8,7 @@ $abstractvectortype$ av = $abstractvectortype$.fromArray(SPECIES, a, i); $type$ v = av.reduceLanes(VectorOperators.[[TEST]]); r[i] = v; - ra [[TEST_OP]]= v; + ra = [[TEST_OP]](ra, v); } } diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Binary-op-math.template b/test/jdk/jdk/incubator/vector/templates/Unit-Binary-op-math.template index a3d44526db9..1866c28e2ba 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Binary-op-math.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Binary-op-math.template @@ -4,7 +4,7 @@ } static $type$ strict[[TEST]]($type$ a, $type$ b) { - return ($type$)(Strict[[TEST_OP]]); + return ($type$)(strict_[[TEST_OP]]); } @Test(dataProvider = "$type$BinaryOpProvider") diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Compare-Broadcast.template b/test/jdk/jdk/incubator/vector/templates/Unit-Compare-Broadcast.template index 92e612e8184..faae74426e7 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Compare-Broadcast.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Compare-Broadcast.template @@ -10,7 +10,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] [[TEST_OP]] b[i]); + assertEquals(mv.laneIsSet(j), [[TEST_OP]](a[i + j], b[i])); } } } @@ -30,7 +30,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] [[TEST_OP]] b[i])); + assertEquals(mv.laneIsSet(j), mask[j] && ([[TEST_OP]](a[i + j], b[i]))); } } } @@ -47,7 +47,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] [[TEST_OP]] ($type$)((long)b[i])); + assertEquals(mv.laneIsSet(j), [[TEST_OP]](a[i + j], ($type$)((long)b[i]))); } } } @@ -67,7 +67,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] [[TEST_OP]] ($type$)((long)b[i]))); + assertEquals(mv.laneIsSet(j), mask[j] && ([[TEST_OP]](a[i + j], ($type$)((long)b[i])))); } } } diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Miscellaneous.template b/test/jdk/jdk/incubator/vector/templates/Unit-Miscellaneous.template index 8411565628d..5ad7623d2c0 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Miscellaneous.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Miscellaneous.template @@ -10,7 +10,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] < b[i]); + assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i])); } } } @@ -26,7 +26,7 @@ // Check results as part of computation. for (int j = 0; j < SPECIES.length(); j++) { - assertEquals(mv.laneIsSet(j), a[i + j] == b[i]); + assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i])); } } } @@ -123,7 +123,7 @@ static long ADDReduceLong($type$[] a, int idx) { $type$ res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res += a[i]; + res = scalar_add(res, a[i]); } return (long)res; @@ -132,7 +132,7 @@ static long ADDReduceAllLong($type$[] a) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLong(a, i); + res = (long)scalar_add(($type$)res, ($type$)ADDReduceLong(a, i)); } return res; @@ -150,8 +150,8 @@ } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add(($type$)ra, ($type$)r[i]); } assertReductionLongArraysEquals(r, ra, a, @@ -161,8 +161,9 @@ static long ADDReduceLongMasked($type$[] a, int idx, boolean[] mask) { $type$ res = 0; for (int i = idx; i < (idx + SPECIES.length()); i++) { - if(mask[i % SPECIES.length()]) - res += a[i]; + if (mask[i % SPECIES.length()]) { + res = scalar_add(res, a[i]); + } } return (long)res; @@ -171,7 +172,7 @@ static long ADDReduceAllLongMasked($type$[] a, boolean[] mask) { long res = 0; for (int i = 0; i < a.length; i += SPECIES.length()) { - res += ADDReduceLongMasked(a, i, mask); + res = (long)scalar_add(($type$)res, ($type$)ADDReduceLongMasked(a, i, mask)); } return res; @@ -191,8 +192,8 @@ } ra = 0; - for (int i = 0; i < a.length; i ++) { - ra += r[i]; + for (int i = 0; i < a.length; i++) { + ra = (long)scalar_add(($type$)ra, ($type$)r[i]); } assertReductionLongArraysEqualsMasked(r, ra, a, mask, diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-Masked-op.template b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-Masked-op.template index ab383e61256..1565c9f3551 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-Masked-op.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-Masked-op.template @@ -3,7 +3,7 @@ $type$ res = [[TEST_INIT]]; for (int i = idx; i < (idx + SPECIES.length()); i++) { if (mask[i % SPECIES.length()]) - res [[TEST_OP]]= a[i]; + res = [[TEST_OP]](res, a[i]); } return res; @@ -12,7 +12,7 @@ static $type$ [[TEST]]ReduceAllMasked($type$[] a, boolean[] mask) { $type$ res = [[TEST_INIT]]; for (int i = 0; i < a.length; i += SPECIES.length()) { - res [[TEST_OP]]= [[TEST]]ReduceMasked(a, i, mask); + res = [[TEST_OP]](res, [[TEST]]ReduceMasked(a, i, mask)); } return res; diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-op.template b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-op.template index 88586fa8129..63d154df112 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-op.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-Scalar-op.template @@ -2,7 +2,7 @@ static $type$ [[TEST]]Reduce($type$[] a, int idx) { $type$ res = [[TEST_INIT]]; for (int i = idx; i < (idx + SPECIES.length()); i++) { - res [[TEST_OP]]= a[i]; + res = [[TEST_OP]](res, a[i]); } return res; @@ -11,7 +11,7 @@ static $type$ [[TEST]]ReduceAll($type$[] a) { $type$ res = [[TEST_INIT]]; for (int i = 0; i < a.length; i += SPECIES.length()) { - res [[TEST_OP]]= [[TEST]]Reduce(a, i); + res = [[TEST_OP]](res, [[TEST]]Reduce(a, i)); } return res; diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-op.template b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-op.template index 25ae3ba2f12..d82b5533c4f 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-op.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Reduction-op.template @@ -15,20 +15,20 @@ $type$[] a = fa.apply(SPECIES.length()); $type$ id = [[TEST_INIT]]; - assertEquals(($type$) (id [[TEST_OP]] id), id, + assertEquals(($type$) ([[TEST_OP]](id, id)), id, "[[TEST]]([[TEST_INIT]], [[TEST_INIT]]) != [[TEST_INIT]]"); $type$ x = 0; try { for (int i = 0; i < a.length; i++) { x = a[i]; - assertEquals(($type$) (id [[TEST_OP]] x), x); - assertEquals(($type$) (x [[TEST_OP]] id), x); + assertEquals(($type$) ([[TEST_OP]](id, x)), x); + assertEquals(($type$) ([[TEST_OP]](x, id)), x); } } catch (AssertionError e) { - assertEquals(($type$) (id [[TEST_OP]] x), x, + assertEquals(($type$) ([[TEST_OP]](id, x)), x, "[[TEST]]([[TEST_INIT]], " + x + ") != " + x); - assertEquals(($type$) (x [[TEST_OP]] id), x, + assertEquals(($type$) ([[TEST_OP]](x, id)), x, "[[TEST]](" + x + ", [[TEST_INIT]]) != " + x); } } diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-Unary-op-math.template b/test/jdk/jdk/incubator/vector/templates/Unit-Unary-op-math.template index 52293d9f614..f6943a0b40b 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-Unary-op-math.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-Unary-op-math.template @@ -4,7 +4,7 @@ } static $type$ strict[[TEST]]($type$ a) { - return ($type$)(Strict[[TEST_OP]]); + return ($type$)(strict_[[TEST_OP]]); } @Test(dataProvider = "$type$UnaryOpProvider") diff --git a/test/jdk/jdk/incubator/vector/templates/Unit-header.template b/test/jdk/jdk/incubator/vector/templates/Unit-header.template index 00a7766492c..e1434dccb2b 100644 --- a/test/jdk/jdk/incubator/vector/templates/Unit-header.template +++ b/test/jdk/jdk/incubator/vector/templates/Unit-header.template @@ -1943,6 +1943,214 @@ relativeError)); static boolean ge($type$ a, $type$ b) { return a >= b; } + + static $type$ firstNonZero($type$ a, $type$ b) { + return $Wideboxtype$.compare(a, ($type$) 0) != 0 ? a : b; + } + +#if[BITWISE] + static $type$ scalar_or($type$ a, $type$ b) { + return ($type$)(a | b); + } + + static $type$ scalar_and($type$ a, $type$ b) { + return ($type$)(a & b); + } + + static $type$ scalar_xor($type$ a, $type$ b) { + return ($type$)(a ^ b); + } +#end[BITWISE]; + + static $type$ scalar_add($type$ a, $type$ b) { + return ($type$)(a + b); + } + + static $type$ scalar_sub($type$ a, $type$ b) { + return ($type$)(a - b); + } + + static $type$ scalar_mul($type$ a, $type$ b) { + return ($type$)(a * b); + } + + static $type$ scalar_min($type$ a, $type$ b) { + return ($type$)(Math.min(a, b)); + } + + static $type$ scalar_max($type$ a, $type$ b) { + return ($type$)(Math.max(a, b)); + } + + static $type$ scalar_div($type$ a, $type$ b) { + return ($type$)(a / b); + } + + static $type$ scalar_fma($type$ a, $type$ b, $type$ c) { + return ($type$)(Math.fma(a, b, c)); + } + + static $type$ scalar_abs($type$ a) { + return ($type$)(Math.abs(a)); + } + + static $type$ scalar_neg($type$ a) { + return (($type$)-a); + } + +#if[!BITWISE] + static $type$ scalar_sin($type$ a) { + return ($type$)Math.sin((double)a); + } + + static $type$ scalar_exp($type$ a) { + return ($type$)Math.exp((double)a); + } + + static $type$ scalar_log1p($type$ a) { + return ($type$)Math.log1p((double)a); + } + + static $type$ scalar_log($type$ a) { + return ($type$)Math.log((double)a); + } + + static $type$ scalar_log10($type$ a) { + return ($type$)Math.log10((double)a); + } + + static $type$ scalar_expm1($type$ a) { + return ($type$)Math.expm1((double)a); + } + + static $type$ scalar_cos($type$ a) { + return ($type$)Math.cos((double)a); + } + + static $type$ scalar_tan($type$ a) { + return ($type$)Math.tan((double)a); + } + + static $type$ scalar_sinh($type$ a) { + return ($type$)Math.sinh((double)a); + } + + static $type$ scalar_cosh($type$ a) { + return ($type$)Math.cosh((double)a); + } + + static $type$ scalar_tanh($type$ a) { + return ($type$)Math.tanh((double)a); + } + + static $type$ scalar_asin($type$ a) { + return ($type$)Math.asin((double)a); + } + + static $type$ scalar_acos($type$ a) { + return ($type$)Math.acos((double)a); + } + + static $type$ scalar_atan($type$ a) { + return ($type$)Math.atan((double)a); + } + + static $type$ scalar_cbrt($type$ a) { + return ($type$)Math.cbrt((double)a); + } + + static $type$ scalar_sqrt($type$ a) { + return ($type$)Math.sqrt((double)a); + } + + static $type$ scalar_hypot($type$ a, $type$ b) { + return ($type$)Math.hypot((double)a, (double)b); + } + + static $type$ scalar_pow($type$ a, $type$ b) { + return ($type$)Math.pow((double)a, (double)b); + } + + static $type$ scalar_atan2($type$ a, $type$ b) { + return ($type$)Math.atan2((double)a, (double)b); + } + + static $type$ strict_scalar_sin($type$ a) { + return ($type$)StrictMath.sin((double)a); + } + + static $type$ strict_scalar_exp($type$ a) { + return ($type$)StrictMath.exp((double)a); + } + + static $type$ strict_scalar_log1p($type$ a) { + return ($type$)StrictMath.log1p((double)a); + } + + static $type$ strict_scalar_log($type$ a) { + return ($type$)StrictMath.log((double)a); + } + + static $type$ strict_scalar_log10($type$ a) { + return ($type$)StrictMath.log10((double)a); + } + + static $type$ strict_scalar_expm1($type$ a) { + return ($type$)StrictMath.expm1((double)a); + } + + static $type$ strict_scalar_cos($type$ a) { + return ($type$)StrictMath.cos((double)a); + } + + static $type$ strict_scalar_tan($type$ a) { + return ($type$)StrictMath.tan((double)a); + } + + static $type$ strict_scalar_sinh($type$ a) { + return ($type$)StrictMath.sinh((double)a); + } + + static $type$ strict_scalar_cosh($type$ a) { + return ($type$)StrictMath.cosh((double)a); + } + + static $type$ strict_scalar_tanh($type$ a) { + return ($type$)StrictMath.tanh((double)a); + } + + static $type$ strict_scalar_asin($type$ a) { + return ($type$)StrictMath.asin((double)a); + } + + static $type$ strict_scalar_acos($type$ a) { + return ($type$)StrictMath.acos((double)a); + } + + static $type$ strict_scalar_atan($type$ a) { + return ($type$)StrictMath.atan((double)a); + } + + static $type$ strict_scalar_cbrt($type$ a) { + return ($type$)StrictMath.cbrt((double)a); + } + + static $type$ strict_scalar_sqrt($type$ a) { + return ($type$)StrictMath.sqrt((double)a); + } + + static $type$ strict_scalar_hypot($type$ a, $type$ b) { + return ($type$)StrictMath.hypot((double)a, (double)b); + } + + static $type$ strict_scalar_pow($type$ a, $type$ b) { + return ($type$)StrictMath.pow((double)a, (double)b); + } + + static $type$ strict_scalar_atan2($type$ a, $type$ b) { + return ($type$)StrictMath.atan2((double)a, (double)b); + } +#end[!BITWISE] #if[!FP] static boolean ult($type$ a, $type$ b) { @@ -1962,9 +2170,17 @@ relativeError)); } #end[!FP] - static $type$ firstNonZero($type$ a, $type$ b) { - return $Boxtype$.compare(a, ($type$) 0) != 0 ? a : b; +#if[FP] + static boolean isNaN($type$ a) { + return $Wideboxtype$.isNaN(a); } + static boolean isFinite($type$ a) { + return $Wideboxtype$.isFinite(a); + } + static boolean isInfinite($type$ a) { + return $Wideboxtype$.isInfinite(a); + } +#end[FP] @Test static void smokeTest1() { diff --git a/test/jdk/jdk/jfr/event/gc/detailed/TestZRelocationSetGroupEvent.java b/test/jdk/jdk/jfr/event/gc/detailed/TestZRelocationSetGroupEvent.java index 29e1de24224..8ece7bf12d7 100644 --- a/test/jdk/jdk/jfr/event/gc/detailed/TestZRelocationSetGroupEvent.java +++ b/test/jdk/jdk/jfr/event/gc/detailed/TestZRelocationSetGroupEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 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 @@ -36,7 +36,7 @@ import jdk.test.lib.jfr.Events; * @requires vm.hasJFR & vm.gc.Z * @requires vm.flagless * @library /test/lib /test/jdk /test/hotspot/jtreg - * @run main/othervm -XX:+UseZGC -Xmx32M jdk.jfr.event.gc.detailed.TestZRelocationSetGroupEvent + * @run main/othervm -XX:+UseZGC -Xmx64M jdk.jfr.event.gc.detailed.TestZRelocationSetGroupEvent */ public class TestZRelocationSetGroupEvent { diff --git a/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java b/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java index 0dccbc4495a..022a9c27674 100644 --- a/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java +++ b/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -23,6 +23,7 @@ package jdk.jfr.event.runtime; import static jdk.test.lib.Asserts.assertTrue; +import static jdk.test.lib.Asserts.assertEquals; import java.nio.file.Paths; import java.time.Duration; @@ -31,7 +32,6 @@ import java.util.*; import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedEvent; -import jdk.test.lib.Asserts; import jdk.test.lib.jfr.EventNames; import jdk.test.lib.jfr.Events; import jdk.test.whitebox.WhiteBox; @@ -65,43 +65,30 @@ public class TestSafepointEvents { recording.stop(); try { - // Verify that each event type was seen at least once - List events = Events.fromRecording(recording); - for (String name : EVENT_NAMES) { - boolean found = false; - for (RecordedEvent event : events) { - found = event.getEventType().getName().equals(name); - if (found) { - break; - } - } - assertTrue(found, "Expected event from test [" + name + "]"); - } - // Collect all events grouped by safepoint id SortedMap> safepointIds = new TreeMap<>(); - for (RecordedEvent event : events) { + for (RecordedEvent event : Events.fromRecording(recording)) { Long safepointId = event.getValue("safepointId"); - if (!safepointIds.containsKey(safepointId)) { - safepointIds.put(safepointId, new HashSet<>()); - } - safepointIds.get(safepointId).add(event.getEventType().getName()); + String eventName = event.getEventType().getName(); + safepointIds.computeIfAbsent(safepointId, k -> new HashSet<>()).add(eventName); } - // The last safepoint may be related to stopping the recording and can thus be - // incomplete - so if there is more than one, ignore the last one - if (safepointIds.size() > 1) { - safepointIds.remove(safepointIds.lastKey()); - } - Asserts.assertGreaterThanOrEqual(safepointIds.size(), 1, "At least 1 safepoint must have occured"); - - // Verify that each safepoint id has an occurence of every event type, - // this ensures that all events related to a given safepoint had the same id - for (Set safepointEvents : safepointIds.values()) { - for (String name : EVENT_NAMES) { - assertTrue(safepointEvents.contains(name), "Expected event '" + name + "' to be present"); + // Select the first set that is complete. + Set safepointEvents = null; + for (Long key : safepointIds.keySet()) { + safepointEvents = safepointIds.get(key); + if (safepointEvents.size() == EVENT_NAMES.length) { + break; } } + assertEquals(safepointEvents.size(), EVENT_NAMES.length, + "At least one safepoint id should map to a set containing an instance of each enabled event type."); + + // Verify that the selected set contains an instance of each enabled event type. + for (String name : EVENT_NAMES) { + assertTrue(safepointEvents.contains(name), "Expected event '" + name + "' to be present"); + } + } catch (Throwable e) { recording.dump(Paths.get("failed.jfr")); throw e; diff --git a/test/jdk/sun/security/provider/pqc/PrivateKeyEncodings.java b/test/jdk/sun/security/provider/pqc/PrivateKeyEncodings.java index 25060d0b74e..39183eb9881 100644 --- a/test/jdk/sun/security/provider/pqc/PrivateKeyEncodings.java +++ b/test/jdk/sun/security/provider/pqc/PrivateKeyEncodings.java @@ -26,7 +26,7 @@ * @bug 8347938 * @library /test/lib * @summary ensure ML-KEM and ML-DSA encodings consistent with - * draft-ietf-lamps-kyber-certificates-11 and RFC 9881 + * RFC 9935 and RFC 9881 * @modules java.base/com.sun.crypto.provider * java.base/sun.security.pkcs * java.base/sun.security.provider @@ -62,17 +62,17 @@ import java.util.stream.Collectors; public class PrivateKeyEncodings { public static void main(String[] args) throws Exception { - // Example keys and certificates draft-ietf-lamps-kyber-certificates-11, Appendix B - // (https://datatracker.ietf.org/doc/html/draft-ietf-lamps-kyber-certificates-11#autoid-17) - // and RFC 9881, Appendix C.3 - // (https://datatracker.ietf.org/doc/html/rfc9881#name-example-certificates) + // Example keys and certificates in RFC 9935, Appendix C + // (https://datatracker.ietf.org/doc/html/rfc9935#name-examples) + // and RFC 9881, Appendix C + // (https://datatracker.ietf.org/doc/html/rfc9881#name-examples) // // These data can be retrieved from the following GitHub releases: // https://github.com/lamps-wg/kyber-certificates/releases/tag/draft-ietf-lamps-kyber-certificates-11 // https://github.com/lamps-wg/dilithium-certificates/releases/tag/draft-ietf-lamps-dilithium-certificates-13 // // Although the release tags include "draft", these values are the - // same as those in the final RFC 9881. + // same as those in the final RFCs. try (var kemReader = RepositoryFileReader.of(RepositoryFileReader.KYBER_CERTIFICATES.class, "kyber-certificates-draft-ietf-lamps-kyber-certificates-11/"); var dsaReader = RepositoryFileReader.of(RepositoryFileReader.DILITHIUM_CERTIFICATES.class, diff --git a/test/jdk/sun/security/ssl/X509KeyManager/SelfSignedCertKeyType.java b/test/jdk/sun/security/ssl/X509KeyManager/SelfSignedCertKeyType.java new file mode 100644 index 00000000000..2395020de08 --- /dev/null +++ b/test/jdk/sun/security/ssl/X509KeyManager/SelfSignedCertKeyType.java @@ -0,0 +1,131 @@ +/* + * 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. + */ + +import static jdk.test.lib.Asserts.assertEquals; +import static jdk.test.lib.Asserts.assertNotNull; + +import java.math.BigInteger; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.X509ExtendedKeyManager; +import jdk.test.lib.security.CertificateBuilder; + +/* + * @test + * @bug 8379191 + * @summary SunX509KeyManagerImpl alias chooser methods returns null for EC_EC + * @modules java.base/sun.security.x509 + * java.base/sun.security.util + * @library /test/lib + * @run main SelfSignedCertKeyType SunX509 + * @run main SelfSignedCertKeyType PKIX + */ + +public class SelfSignedCertKeyType { + + private static final String CERT_ALIAS = "testalias"; + private static final String KEY_ALG = "EC"; + private static final String KEY_TYPE = "EC_EC"; + private static final String CERT_SIG_ALG = "SHA256withECDSA"; + + public static void main(String[] args) throws Exception { + if (args.length != 1) { + throw new RuntimeException("Wrong number of arguments"); + } + + X509ExtendedKeyManager km = getKeyManager(args[0]); + + String serverAlias = km.chooseServerAlias(KEY_TYPE, null, null); + String engineServerAlias = km.chooseEngineServerAlias( + KEY_TYPE, null, null); + String clientAlias = km.chooseClientAlias( + new String[]{KEY_TYPE}, null, null); + String engineClientAlias = km.chooseEngineClientAlias( + new String[]{KEY_TYPE}, null, null); + + for (String alias : new String[]{serverAlias, + engineServerAlias, clientAlias, engineClientAlias}) { + assertNotNull(alias); + assertEquals(CERT_ALIAS, normalizeAlias(alias)); + } + } + + // PKIX KeyManager adds a cache prefix to an alias. + private static String normalizeAlias(String alias) { + return alias.substring(alias.lastIndexOf(".") + 1); + } + + // Returns a KeyManager with a single self-signed certificate. + private static X509ExtendedKeyManager getKeyManager(String kmAlg) + throws Exception { + KeyPair caKeys = KeyPairGenerator.getInstance(KEY_ALG) + .generateKeyPair(); + X509Certificate trustedCert = createTrustedCert(caKeys); + + // create a key store + KeyStore ks = KeyStore.getInstance("PKCS12"); + ks.load(null, null); + + // import the trusted cert + ks.setCertificateEntry("TLS Signer", trustedCert); + + // generate certificate chain + Certificate[] chain = new Certificate[1]; + chain[0] = trustedCert; + + // import the key entry. + final char[] passphrase = "passphrase".toCharArray(); + ks.setKeyEntry(CERT_ALIAS, caKeys.getPrivate(), passphrase, chain); + + KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmAlg); + kmf.init(ks, passphrase); + + return (X509ExtendedKeyManager) kmf.getKeyManagers()[0]; + } + + private static X509Certificate createTrustedCert(KeyPair caKeys) + throws Exception { + return new CertificateBuilder() + .setSubjectName("O=CA-Org, L=Some-City, ST=Some-State, C=US") + .setPublicKey(caKeys.getPublic()) + .setNotBefore( + Date.from(Instant.now().minus(1, ChronoUnit.HOURS))) + .setNotAfter(Date.from(Instant.now().plus(1, ChronoUnit.HOURS))) + .setSerialNumber(BigInteger.valueOf( + new SecureRandom().nextLong(1000000) + 1)) + .addSubjectKeyIdExt(caKeys.getPublic()) + .addAuthorityKeyIdExt(caKeys.getPublic()) + .addKeyUsageExt(new boolean[]{ + true, true, true, true, true, true, true}) + .addBasicConstraintsExt(true, true, 1) + .build(null, caKeys.getPrivate(), CERT_SIG_ALG); + } +} diff --git a/test/jdk/sun/tools/jhsdb/BasicLauncherTest.java b/test/jdk/sun/tools/jhsdb/BasicLauncherTest.java index 75f2af6db5a..412a811d219 100644 --- a/test/jdk/sun/tools/jhsdb/BasicLauncherTest.java +++ b/test/jdk/sun/tools/jhsdb/BasicLauncherTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -26,6 +26,7 @@ * @summary Basic test for jhsdb launcher * @library /test/lib * @requires vm.hasSA + * @requires vm.gc != "Z" * @build jdk.test.lib.apps.* * @run main/timeout=480 BasicLauncherTest */ diff --git a/test/jdk/sun/tools/jhsdb/HeapDumpTest.java b/test/jdk/sun/tools/jhsdb/HeapDumpTest.java index c59e2b0e040..5ef1dadcb62 100644 --- a/test/jdk/sun/tools/jhsdb/HeapDumpTest.java +++ b/test/jdk/sun/tools/jhsdb/HeapDumpTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -26,6 +26,7 @@ * @bug 8163346 * @summary Test hashing of extended characters in Serviceability Agent. * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @compile -encoding utf8 HeapDumpTest.java * @run main/timeout=240 HeapDumpTest diff --git a/test/jdk/sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java b/test/jdk/sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java index bd5a400225f..fffbe439f94 100644 --- a/test/jdk/sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java +++ b/test/jdk/sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -25,6 +25,7 @@ * @test * @bug 8230731 8001227 8231635 8231634 8196969 * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @compile JShellHeapDumpTest.java * @run main/timeout=240 JShellHeapDumpTest nosleep diff --git a/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java b/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java index 6fbc96362a9..a9e5f7aeffe 100644 --- a/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java +++ b/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -25,6 +25,7 @@ * @test * @bug 8225715 * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @compile JShellHeapDumpTest.java * @run main/timeout=240 JShellHeapDumpTest diff --git a/test/jdk/sun/tools/jhsdb/JStackStressTest.java b/test/jdk/sun/tools/jhsdb/JStackStressTest.java index 97945b6092b..a28cdf3be5a 100644 --- a/test/jdk/sun/tools/jhsdb/JStackStressTest.java +++ b/test/jdk/sun/tools/jhsdb/JStackStressTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -25,6 +25,7 @@ * @test * @bug 8262271 * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @run main/timeout=240 JStackStressTest */ diff --git a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java index 659eac2ee8f..b2c7ba0ef87 100644 --- a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java +++ b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -39,6 +39,7 @@ import jdk.test.lib.Utils; * @summary Unit test for jmap utility test heap configuration reader * * @requires vm.hasSA + * @requires vm.gc != "Z" * @library /test/lib * @modules java.management * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JPackageStringBundleTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JPackageStringBundleTest.java new file mode 100644 index 00000000000..bf1eb2bdaec --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JPackageStringBundleTest.java @@ -0,0 +1,158 @@ +/* + * 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 jdk.jpackage.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrowsExactly; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class JPackageStringBundleTest { + + @Test + void test_cannedFormattedString() { + assertFalse(JPackageStringBundle.MAIN.cannedFormattedString("error.version-string-empty").getValue().isBlank()); + } + + @Test + void test_cannedFormattedStringAsPattern() { + var pred = JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("error.version-string-empty", UNREACHABLE_FORMAT_ARG_MAPPER).asMatchPredicate(); + + var str = JPackageStringBundle.MAIN.cannedFormattedString("error.version-string-empty").getValue(); + assertTrue(pred.test(str)); + assertFalse(pred.test(str + str)); + } + + @Test + void test_cannedFormattedStringAsPattern_with_arg() { + var pred = JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("message.error-header", DEFAULT_FORMAT_ARG_MAPPER, "foo").asMatchPredicate(); + + for (var err : List.of("foo", "bar", "", "Unexpected value")) { + var str = JPackageStringBundle.MAIN.cannedFormattedString("message.error-header", err).getValue(); + assertTrue(pred.test(str)); + assertFalse(pred.test(err)); + } + } + + @ParameterizedTest + @MethodSource + void test_cannedFormattedString_wrong_argument_count(CannedFormattedString cannedStr) { + assertThrowsExactly(IllegalArgumentException.class, cannedStr::getValue); + } + + @Test + void test_cannedFormattedStringAsPattern_wrong_argument_count() { + assertThrowsExactly(IllegalArgumentException.class, () -> { + JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("error.version-string-empty", UNREACHABLE_FORMAT_ARG_MAPPER, "foo"); + }); + + assertThrowsExactly(IllegalArgumentException.class, () -> { + JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("message.error-header", UNREACHABLE_FORMAT_ARG_MAPPER); + }); + + assertThrowsExactly(IllegalArgumentException.class, () -> { + JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("message.error-header", UNREACHABLE_FORMAT_ARG_MAPPER, "foo", "bar"); + }); + } + + @ParameterizedTest + @MethodSource + void test_toPattern(TestSpec test) { + var pattern = JPackageStringBundle.toPattern(new MessageFormat(test.formatter()), test.formatArgMapper(), test.args().toArray()); + assertEquals(test.expectedPattern().toString(), pattern.toString()); + } + + private static Collection test_cannedFormattedString_wrong_argument_count() { + return List.of( + JPackageStringBundle.MAIN.cannedFormattedString("error.version-string-empty", "foo"), + JPackageStringBundle.MAIN.cannedFormattedString("message.error-header"), + JPackageStringBundle.MAIN.cannedFormattedString("message.error-header", "foo", "bar") + ); + } + + private static Collection test_toPattern() { + + var testCases = new ArrayList(); + + testCases.addAll(List.of( + TestSpec.create("", Pattern.compile("")), + TestSpec.create("", Pattern.compile(""), "foo") + )); + + for (List args : List.of(List.of(), List.of("foo"))) { + Stream.of( + "Stop." + ).map(formatter -> { + return new TestSpec(formatter, args, Pattern.compile(Pattern.quote(formatter))); + }).forEach(testCases::add); + } + + testCases.add(TestSpec.create("Hello {1} {0}{1}!", Pattern.compile("\\QHello \\E.*\\Q \\E.*.*\\Q!\\E"), "foo", "bar")); + testCases.add(TestSpec.create("Hello {1} {0}{0} {0}{0}{0} {0}", Pattern.compile("\\QHello \\E.*\\Q \\E.*\\Q \\E.*\\Q \\E.*"), "foo", "bar")); + testCases.add(TestSpec.create("{0}{0}", Pattern.compile(".*"), "foo")); + + return testCases; + } + + record TestSpec(String formatter, List args, Pattern expectedPattern) { + TestSpec { + Objects.requireNonNull(formatter); + Objects.requireNonNull(args); + Objects.requireNonNull(expectedPattern); + } + + Function formatArgMapper() { + if (Pattern.compile(Pattern.quote(formatter)).toString().equals(expectedPattern.toString())) { + return UNREACHABLE_FORMAT_ARG_MAPPER; + } else { + return DEFAULT_FORMAT_ARG_MAPPER; + } + } + + static TestSpec create(String formatter, Pattern expectedPattern, Object... args) { + return new TestSpec(formatter, List.of(args), expectedPattern); + } + } + + private static final Pattern DEFAULT_FORMAT_ARG_PATTERN = Pattern.compile(".*"); + + private static final Function DEFAULT_FORMAT_ARG_MAPPER = _ -> { + return DEFAULT_FORMAT_ARG_PATTERN; + }; + + private static final Function UNREACHABLE_FORMAT_ARG_MAPPER = _ -> { + throw new AssertionError(); + }; +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 251d95a1089..2e58ea7a0ab 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -43,7 +43,6 @@ import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -245,7 +244,12 @@ public class JPackageCommand extends CommandArguments { } public String version() { - return getArgumentValue("--app-version", () -> "1.0"); + return PropertyFinder.findAppProperty(this, + PropertyFinder.cmdlineOptionWithValue("--app-version"), + PropertyFinder.appImageFile(appImageFile -> { + return appImageFile.version(); + }) + ).orElse("1.0"); } public String name() { @@ -1050,6 +1054,10 @@ public class JPackageCommand extends CommandArguments { final var directoriesAssert = new ReadOnlyPathsAssert(copy); + standardAssertOutputValidators().forEach(validator -> { + validator.applyTo(copy); + }); + Executor.Result result; if (expectedExitCode.isEmpty()) { result = copy.createExecutor().executeWithoutExitCodeCheck(); @@ -1064,7 +1072,7 @@ public class JPackageCommand extends CommandArguments { ConfigFilesStasher.INSTANCE.accept(this); } - for (final var validator: validators) { + for (final var validator: copy.validators) { validator.accept(result); } @@ -1375,10 +1383,38 @@ public class JPackageCommand extends CommandArguments { TKit.assertFileExists(cmd.appLayout().libapplauncher()); } }), + LINUX_PACKAGE_ARCH(cmd -> { + if (TKit.isLinux() && !cmd.isImagePackageType()) { + var asserter = TKit.assertTextStream(LinuxUnexpectedBundleArchRegexp.VALUE).negate(); + return Stream.of(true, false).map(stderr -> { + var validator = new JPackageOutputValidator(); + if (stderr) { + return validator.stderr(); + } else { + return validator; + } + }).map(validator -> { + return validator.add(asserter); + }).toList(); + } else { + return List.of(); + } + }), ; - StandardAssert(Consumer action) { + StandardAssert( + Consumer action, + Function> outputValidatorsSupplier) { this.action = action; + this.outputValidatorsSupplier = outputValidatorsSupplier; + } + + StandardAssert(Consumer action) { + this(Objects.requireNonNull(action), null); + } + + StandardAssert(Function> outputValidatorsSupplier) { + this(null, Objects.requireNonNull(outputValidatorsSupplier)); } private static JPackageCommand convertFromRuntime(JPackageCommand cmd) { @@ -1390,7 +1426,38 @@ public class JPackageCommand extends CommandArguments { return copy; } + Stream outputValidators(JPackageCommand cmd) { + Objects.requireNonNull(cmd); + return Optional.ofNullable(outputValidatorsSupplier).map(v -> { + return v.apply(cmd); + }).stream().flatMap(Collection::stream); + } + + void apply(JPackageCommand cmd) { + Objects.requireNonNull(cmd); + if (action != null) { + action.accept(cmd); + } + } + private final Consumer action; + private final Function> outputValidatorsSupplier; + + private static final class LinuxUnexpectedBundleArchRegexp { + private static final Pattern ANY = Pattern.compile(".*"); + private static final Pattern ARCHITECTURE_PROPERTY = Pattern.compile("Arch|Architecture"); + + static final Pattern VALUE = JPackageStringBundle.MAIN.cannedFormattedStringAsPattern("error.unexpected-package-property", arg -> { + return switch ((String)arg) { + case "propertyName" -> { + yield ARCHITECTURE_PROPERTY; + } + default -> { + yield ANY; + } + }; + }, "propertyName", "expectedValue", "actualValue", "customResource"); + } } public JPackageCommand setStandardAsserts(StandardAssert ... asserts) { @@ -1407,11 +1474,17 @@ public class JPackageCommand extends CommandArguments { JPackageCommand runStandardAsserts() { for (var standardAssert : standardAsserts.stream().sorted().toList()) { - standardAssert.action.accept(this); + standardAssert.apply(this); } return this; } + private List standardAssertOutputValidators() { + return standardAsserts.stream().sorted().flatMap(standardAssert -> { + return standardAssert.outputValidators(this); + }).toList(); + } + private boolean expectAppImageFile() { if (isRuntime()) { return false; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java index 9425b84472c..cd8ffd853b7 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -23,10 +23,16 @@ package jdk.jpackage.test; +import static jdk.jpackage.internal.util.function.ExceptionBox.toUnchecked; + import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.MessageFormat; -import static jdk.jpackage.internal.util.function.ExceptionBox.toUnchecked; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.regex.Pattern; public enum JPackageStringBundle { @@ -56,18 +62,95 @@ public enum JPackageStringBundle { } private String getFormattedString(String key, Object[] args) { - var str = getString(key); - if (args.length != 0) { - return MessageFormat.format(str, args); - } else { - return str; - } + return new FormattedMessage(key, args).value(); } public CannedFormattedString cannedFormattedString(String key, Object ... args) { return new CannedFormattedString(this::getFormattedString, key, args); } + public Pattern cannedFormattedStringAsPattern(String key, Function formatArgMapper, Object ... args) { + var fm = new FormattedMessage(key, args); + return fm.messageFormat().map(mf -> { + return toPattern(mf, formatArgMapper, args); + }).orElseGet(() -> { + return Pattern.compile(Pattern.quote(fm.value())); + }); + } + + static Pattern toPattern(MessageFormat mf, Function formatArgMapper, Object ... args) { + Objects.requireNonNull(mf); + Objects.requireNonNull(formatArgMapper); + + var patternSb = new StringBuilder(); + var runSb = new StringBuilder(); + + var it = mf.formatToCharacterIterator(args); + while (it.getIndex() < it.getEndIndex()) { + var runBegin = it.getRunStart(); + var runEnd = it.getRunLimit(); + if (runEnd < runBegin) { + throw new IllegalStateException(); + } + + var attrs = it.getAttributes(); + if (attrs.isEmpty()) { + // Regular text run. + runSb.setLength(0); + it.setIndex(runBegin); + for (int counter = runEnd - runBegin; counter != 0; --counter) { + runSb.append(it.current()); + it.next(); + } + patternSb.append(Pattern.quote(runSb.toString())); + } else { + // Format run. + int argi = (Integer)attrs.get(MessageFormat.Field.ARGUMENT); + var arg = args[argi]; + var pattern = Objects.requireNonNull(formatArgMapper.apply(arg)); + patternSb.append(pattern.toString()); + it.setIndex(runEnd); + } + } + + return Pattern.compile(patternSb.toString()); + } + + private final class FormattedMessage { + + FormattedMessage(String key, Object[] args) { + List.of(args).forEach(Objects::requireNonNull); + + var formatter = getString(key); + + var mf = new MessageFormat(formatter); + var formatCount = mf.getFormatsByArgumentIndex().length; + if (formatCount != args.length) { + throw new IllegalArgumentException(String.format( + "Expected %d arguments for [%s] string, but given %d", formatCount, key, args.length)); + } + + if (formatCount == 0) { + this.mf = null; + value = formatter; + } else { + this.mf = mf; + value = mf.format(args); + } + } + + String value() { + return value; + } + + Optional messageFormat() { + return Optional.ofNullable(mf); + } + + private final String value; + private final MessageFormat mf; + } + private final Class i18nClass; private final Method i18nClass_getString; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 78562b2ed26..66462bedfd7 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -26,6 +26,7 @@ import static java.util.Collections.unmodifiableSortedSet; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; +import static jdk.jpackage.internal.util.MemoizingSupplier.runOnce; import java.io.IOException; import java.io.UncheckedIOException; @@ -36,7 +37,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -46,35 +46,34 @@ import java.util.TreeMap; import java.util.TreeSet; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; +import jdk.internal.util.Architecture; import jdk.jpackage.internal.util.PathUtils; +import jdk.jpackage.internal.util.Result; import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.test.LauncherShortcut.InvokeShortcutSpec; import jdk.jpackage.test.PackageTest.PackageHandlers; public final class LinuxHelper { - private static String getReleaseSuffix(JPackageCommand cmd) { - final String value; - final PackageType packageType = cmd.packageType(); - switch (packageType) { - case LINUX_DEB: - value = Optional.ofNullable(cmd.getArgumentValue( - "--linux-app-release", () -> null)).map(v -> "-" + v).orElse( - ""); - break; - case LINUX_RPM: - value = "-" + cmd.getArgumentValue("--linux-app-release", - () -> "1"); - break; - - default: - value = null; + static String getReleaseSuffix(JPackageCommand cmd) { + cmd.verifyIsOfType(PackageType.LINUX); + var release = Optional.ofNullable(cmd.getArgumentValue("--linux-app-release")); + switch (cmd.packageType()) { + case LINUX_DEB -> { + return release.map(v -> "-" + v).orElse(""); + } + case LINUX_RPM -> { + return "-" + release.orElse("1"); + } + default -> { + throw new UnsupportedOperationException(); + } } - return value; } public static String getPackageName(JPackageCommand cmd) { @@ -333,10 +332,14 @@ public final class LinuxHelper { long packageSize = getInstalledPackageSizeKB(cmd); TKit.trace("InstalledPackageSize: " + packageSize); TKit.assertNotEquals(0, packageSize, String.format( - "Check installed size of [%s] package in not zero", packageName)); + "Check installed size of [%s] package is not zero", packageName)); final boolean checkPrerequisites; - if (cmd.isRuntime()) { + if (NativePackageType.VALUE != cmd.packageType()) { + // Alien packaging (DEB packaging on RPM Linux or RPM packaging on Debian). + // Don't validate required packages. + checkPrerequisites = false; + } else if (cmd.isRuntime()) { Path runtimeDir = cmd.appRuntimeDirectory(); Set expectedCriticalRuntimePaths = CRITICAL_RUNTIME_FILES.stream().map( runtimeDir::resolve).collect(toSet()); @@ -850,29 +853,7 @@ public final class LinuxHelper { } public static String getDefaultPackageArch(PackageType type) { - if (archs == null) { - archs = new HashMap<>(); - } - - String arch = archs.get(type); - if (arch == null) { - final Executor exec; - switch (type) { - case LINUX_DEB: - exec = Executor.of("dpkg", "--print-architecture"); - break; - - case LINUX_RPM: - exec = Executor.of("rpmbuild", "--eval=%{_target_cpu}"); - break; - - default: - throw new UnsupportedOperationException(); - } - arch = exec.executeAndGetFirstLineOfOutput(); - archs.put(type, arch); - } - return arch; + return LinuxPackageArchitecture.get(type); } private static String getServiceUnitFileName(String packageName, String launcherName) { @@ -960,7 +941,62 @@ public final class LinuxHelper { static final Set CRITICAL_RUNTIME_FILES = Set.of(Path.of( "lib/server/libjvm.so")); - private static Map archs; + private enum LinuxPackageArchitecture implements Supplier { + RPM("rpmbuild", "--eval=%{_target_cpu}"), + DEB("dpkg", "--print-architecture"), + ; + + LinuxPackageArchitecture(String... cmdline) { + this.cmdline = List.of(cmdline); + } + + static String get(PackageType type) { + Objects.requireNonNull(type); + if (type.isSupported()) { + return ARCHS.get(type).get(); + } else { + return Architecture.current().name().toLowerCase(); + } + } + + @Override + public String get() { + return Executor.of(cmdline).executeAndGetFirstLineOfOutput(); + } + + private final List cmdline; + + private static final Map> ARCHS = Map.of( + PackageType.LINUX_RPM, runOnce(RPM), + PackageType.LINUX_DEB, runOnce(DEB)); + } + + private static final class NativePackageType { + + static final PackageType VALUE; + + private static boolean isDebian() { + // we are just going to run "dpkg -s coreutils" and assume Debian + // or derivative if no error is returned. + return Result.of(Executor.of("dpkg", "-s", "coreutils")::execute).hasValue(); + } + + private static boolean isRpm() { + // we are just going to run "rpm -q rpm" and assume RPM + // or derivative if no error is returned. + return Result.of(Executor.of("rpm", "-q", "rpm")::execute).hasValue(); + } + + static { + if (isDebian()) { + VALUE = PackageType.LINUX_DEB; + } else if (isRpm()) { + VALUE = PackageType.LINUX_RPM; + } else { + VALUE = null; + } + } + } private static final Pattern XDG_CMD_ICON_SIZE_PATTERN = Pattern.compile("\\s--size\\s+(\\d+)\\b"); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java index 20f7ac41eef..81e5da34140 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java @@ -67,6 +67,7 @@ import java.util.function.Supplier; import java.util.stream.Stream; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; +import jdk.internal.util.OSVersion; import jdk.jpackage.internal.util.MemoizingSupplier; import jdk.jpackage.internal.util.function.ExceptionBox; import jdk.jpackage.internal.util.function.ThrowingConsumer; @@ -233,7 +234,7 @@ import jdk.jpackage.internal.util.function.ThrowingSupplier; * An untrusted certificate can NOT be used with /usr/bin/codesign. Use * *
    - * /usr/bin/security security add-trusted-cert -k foo.keychain cert.pem
    + * /usr/bin/security add-trusted-cert -k foo.keychain cert.pem
      * 
    * * command to add trusted certificate from "cert.pem" file to "foo.keychain" @@ -440,7 +441,21 @@ public final class MacSign { } Keychain unlock() { - createExecutor("unlock-keychain").execute(); + var exec = createExecutor("unlock-keychain"); + + exec.execute(); + + if (UnlockKeychainWithOsascript.VALUE) { + exec = Executor.of("osascript") + .addArguments(SIGN_UTILS_SCRIPT.toString(), "run-shell-script") + .addArgument(Stream.concat( + Stream.of(exec.getExecutable().orElseThrow().toString()), + exec.getAllArguments().stream() + ).collect(joining(" "))); + + exec.execute(); + } + return this; } @@ -576,29 +591,43 @@ public final class MacSign { } private static CertificateStats create(KeychainWithCertsSpec spec) { - final var allCertificates = spec.keychain().findCertificates(); final List allResolvedCertificateRequests = new ArrayList<>(); final Map unmappedCertificates = new HashMap<>(); - withTempDirectory(workDir -> { - for (final var cert : allCertificates) { - ResolvedCertificateRequest resolvedCertificateRequest; - try { - resolvedCertificateRequest = new ResolvedCertificateRequest(cert); - } catch (RuntimeException ex) { - unmappedCertificates.put(cert, ExceptionBox.unbox(ex)); - continue; - } + final Runnable workload = () -> { + final var allCertificates = spec.keychain().findCertificates(); + withTempDirectory(workDir -> { + for (final var cert : allCertificates) { + ResolvedCertificateRequest resolvedCertificateRequest; + try { + resolvedCertificateRequest = new ResolvedCertificateRequest(cert); + } catch (RuntimeException ex) { + unmappedCertificates.put(cert, ExceptionBox.unbox(ex)); + continue; + } - if (spec.certificateRequests().stream().anyMatch(resolvedCertificateRequest.installed()::match)) { - final var certFile = workDir.resolve(CertificateHash.of(cert).toString() + ".pem"); - final var verifyStatus = verifyCertificate(resolvedCertificateRequest, spec.keychain(), certFile); - resolvedCertificateRequest = resolvedCertificateRequest.copyVerified(verifyStatus); - } + if (spec.certificateRequests().stream().anyMatch(resolvedCertificateRequest.installed()::match)) { + final var certFile = workDir.resolve(CertificateHash.of(cert).toString() + ".pem"); + final var verifyStatus = verifyCertificate(resolvedCertificateRequest, spec.keychain(), certFile); + resolvedCertificateRequest = resolvedCertificateRequest.copyVerified(verifyStatus); + } - allResolvedCertificateRequests.add(resolvedCertificateRequest); - } - }); + allResolvedCertificateRequests.add(resolvedCertificateRequest); + } + }); + }; + + // Starting from some macOS version, it is no longer necessary to have the keychain + // in the list of keychains when running the "/usr/bin/security verify-cert ..." command to verify its certificate(s). + // The exact version when they relaxed this constraint is unknown, but it is still required on Catalina 10.15.7. + // On Catalina, if the keychain is not in the list of keychains, "/usr/bin/security verify-cert ..." command + // executed on the certificates of this keychain returns "untrusted" result. + if (OSVersion.current().compareTo(new OSVersion(10, 16)) < 0) { + // macOS Catalina or older + withKeychains(spec).addToSearchList().run(workload); + } else { + workload.run(); + } return new CertificateStats(allResolvedCertificateRequests, List.copyOf(spec.certificateRequests()), unmappedCertificates); @@ -1272,7 +1301,11 @@ public final class MacSign { for (final var quite : List.of(true, false)) { result = security("verify-cert", "-L", "-n", quite ? "-q" : "-v", - "-c", certFile.normalize().toString(), + // Use "-r" option to verify the certificate against itself. + // "-c" option works on newer macOS versions, but on older ones (at least on Catalina 10.15.7), + // in case there are two self-signed certificates with the same name in the given keychain, + // it links them in the certificate list and fails verification. + "-r", certFile.normalize().toString(), "-k", keychain.name(), "-p", resolvedCertificateRequest.installed().type().verifyPolicy()).saveOutput(!quite).executeWithoutExitCodeCheck(); if (result.getExitCode() == 0) { @@ -1463,4 +1496,10 @@ public final class MacSign { // faketime is not a standard macOS command. // One way to get it is with Homebrew. private static final Path FAKETIME = Path.of(Optional.ofNullable(TKit.getConfigProperty("faketime")).orElse("/usr/local/bin/faketime")); + + // Run the "/usr/bin/system unlock-keychain" command in Terminal.app if + // the current process runs in an SSH session and the OS version is macOS Catalina or older. + private static final class UnlockKeychainWithOsascript { + static final boolean VALUE = System.getenv("SSH_CONNECTION") != null && OSVersion.current().compareTo(new OSVersion(10, 16)) < 0; + } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java index 01c510070be..404811ea0f8 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java @@ -93,8 +93,11 @@ public final class MacSignVerify { final var exec = Executor.of( "/usr/bin/codesign", "-d", - "--entitlements", "-", - "--xml", path.toString()).saveOutput().dumpOutput().binaryOutput(); + // `--entitlements :-` will print entitlements as XML plist in the stdout and "Executable=..." message to the stderr. + // Prefer this option combination to `--entitlements - --xml` as + // the latter doesn't work on older macOS releases (Proved unsupported on Catalina 10.15.7). + "--entitlements", ":-", + path.toString()).saveOutput().dumpOutput().binaryOutput(); final var result = exec.execute(); var xml = result.byteStdout(); if (xml.length == 0) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java index 3d7ac490350..46425ceccbd 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -21,6 +21,7 @@ * questions. */ package jdk.jpackage.test; + import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import java.nio.file.Path; @@ -66,8 +67,13 @@ final class PropertyFinder { } static Finder nop() { + return of(Optional.empty()); + } + + static Finder of(Optional v) { + Objects.requireNonNull(v); return target -> { - return Optional.empty(); + return v; }; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index db76309c292..04b828677ca 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -37,7 +37,6 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; @@ -606,25 +605,6 @@ public final class TKit { return JtregSkippedExceptionClass.INSTANCE.isInstance(t); } - public static Path createRelativePathCopy(final Path file) { - Path fileCopy = ThrowingSupplier.toSupplier(() -> { - Path localPath = createTempFile(file.getFileName()); - Files.copy(file, localPath, StandardCopyOption.REPLACE_EXISTING); - return localPath; - }).get().toAbsolutePath().normalize(); - - final Path basePath = Path.of(".").toAbsolutePath().normalize(); - try { - return basePath.relativize(fileCopy); - } catch (IllegalArgumentException ex) { - // May happen on Windows: java.lang.IllegalArgumentException: 'other' has different root - trace(String.format("Failed to relativize [%s] at [%s]", fileCopy, - basePath)); - printStackTrace(ex); - } - return file; - } - public static void waitForFileCreated(Path fileToWaitFor, Duration timeout, Duration afterCreatedTimeout) throws IOException { waitForFileCreated(fileToWaitFor, timeout); diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/MainTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/MainTest.java index 3f933093e97..1b89d23c301 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/MainTest.java +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/MainTest.java @@ -154,6 +154,7 @@ public class MainTest extends JUnitAdapter { JPackageCommand.helloAppImage() .ignoreDefaultVerbose(true) + .ignoreDefaultRuntime(true) .useToolProvider(jpackageToolProviderMock) .execute(jpackageExitCode); } diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/OptionsValidationFailTest.excludes b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/OptionsValidationFailTest.excludes index f86fb9a3897..32968db0606 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/OptionsValidationFailTest.excludes +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/cli/OptionsValidationFailTest.excludes @@ -28,16 +28,16 @@ ErrorTest.test(NATIVE; args-add=[--runtime-image, @@EMPTY_DIR@@]; errors=[messag ErrorTest.test(NATIVE; args-add=[--runtime-image, @@INVALID_MAC_RUNTIME_BUNDLE@@]; errors=[message.error-header+[error.invalid-runtime-image-missing-file, @@INVALID_MAC_RUNTIME_BUNDLE@@, Contents/Home/lib/**/libjli.dylib]]) ErrorTest.test(NATIVE; args-add=[--runtime-image, @@INVALID_MAC_RUNTIME_IMAGE@@]; errors=[message.error-header+[error.invalid-runtime-image-missing-file, @@INVALID_MAC_RUNTIME_IMAGE@@, lib/**/libjli.dylib]]) ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1.2.3.4.5]; errors=[message.error-header+[error.msi-product-version-components, 1.2.3.4.5], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1.2.65536]; errors=[message.error-header+[error.msi-product-version-build-out-of-range, 1.2.65536], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1.256]; errors=[message.error-header+[error.msi-product-version-minor-out-of-range, 1.256], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1.2.65536]; errors=[message.error-header+[error.msi-product-version-build-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1.256]; errors=[message.error-header+[error.msi-product-version-minor-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 1234]; errors=[message.error-header+[error.msi-product-version-components, 1234], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 256.1]; errors=[message.error-header+[error.msi-product-version-major-out-of-range, 256.1], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--app-version, 256.1]; errors=[message.error-header+[error.msi-product-version-major-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) ErrorTest.test(WIN_EXE; app-desc=Hello; args-add=[--launcher-as-service]; errors=[message.error-header+[error.missing-service-installer], message.advice-header+[error.missing-service-installer.advice]]) ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1.2.3.4.5]; errors=[message.error-header+[error.msi-product-version-components, 1.2.3.4.5], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1.2.65536]; errors=[message.error-header+[error.msi-product-version-build-out-of-range, 1.2.65536], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1.256]; errors=[message.error-header+[error.msi-product-version-minor-out-of-range, 1.256], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1.2.65536]; errors=[message.error-header+[error.msi-product-version-build-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1.256]; errors=[message.error-header+[error.msi-product-version-minor-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 1234]; errors=[message.error-header+[error.msi-product-version-components, 1234], message.advice-header+[error.version-string-wrong-format.advice]]) -ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 256.1]; errors=[message.error-header+[error.msi-product-version-major-out-of-range, 256.1], message.advice-header+[error.version-string-wrong-format.advice]]) +ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--app-version, 256.1]; errors=[message.error-header+[error.msi-product-version-major-out-of-range], message.advice-header+[error.version-string-wrong-format.advice]]) ErrorTest.test(WIN_MSI; app-desc=Hello; args-add=[--launcher-as-service]; errors=[message.error-header+[error.missing-service-installer], message.advice-header+[error.missing-service-installer.advice]]) ErrorTest.test(args-add=[@foo]; errors=[message.error-header+[ERR_CannotParseOptions, foo]]) ErrorTest.testMacSignWithoutIdentity(IMAGE; app-desc=Hello; args-add=[--mac-sign, --mac-signing-keychain, @@EMPTY_KEYCHAIN@@]; errors=[message.error-header+[error.cert.not.found, CODE_SIGN, EMPTY_KEYCHAIN]]) diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java index 885ea31f726..df020f1a34c 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -32,8 +32,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertNotSame; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; @@ -108,12 +111,113 @@ public class DottedVersionTest { TestConfig.lazy("+1", "+1", 0, ""), TestConfig.lazy("-1", "-1", 0, ""), TestConfig.lazy("-0", "-0", 0, ""), - TestConfig.lazy("+0", "+0", 0, "") + TestConfig.lazy("+0", "+0", 0, ""), + TestConfig.lazy("+0", "+0", 0, ""), + TestConfig.lazy("1.2.3+ea", "+ea", 3, "1.2.3"), + TestConfig.lazy(".7", ".7", 0, ""), + TestConfig.lazy(".+7", ".+7", 0, "") )); return data; } + @ParameterizedTest + @MethodSource + public void testTrim(DottedVersion ver, String expectedStr, int limit) { + var expected = DottedVersion.lazy(expectedStr); + var actual = ver.trim(limit); + assertEquals(expected, actual); + if (limit >= ver.getComponents().length) { + assertSame(ver, actual); + } else { + assertNotSame(ver, actual); + } + assertEquals(expectedStr, actual.toString()); + } + + @ParameterizedTest + @MethodSource + public void testTrimNegative(DottedVersion ver, int limit) { + assertThrowsExactly(IllegalArgumentException.class, () -> { + ver.trim(limit); + }); + } + + private static Stream testTrim() { + + var testCases = new ArrayList(); + + for (var suffix : List.of("", ".foo", "-ea", "+345")) { + testCases.addAll(List.of( + Arguments.of("1.02.3" + suffix, "" + suffix, 0), + Arguments.of("1.02.3" + suffix, "1" + suffix, 1), + Arguments.of("1.02.3" + suffix, "1.02" + suffix, 2), + Arguments.of("1.02.3" + suffix, "1.02.3" + suffix, 3), + Arguments.of("1.02.3" + suffix, "1.02.3" + suffix, 4) + )); + } + + return testCases.stream().map(DottedVersionTest::mapFirstStringToDottedVersion); + } + + private static Stream testTrimNegative() { + return Stream.of( + Arguments.of("10.5.foo", -1) + ).map(DottedVersionTest::mapFirstStringToDottedVersion); + } + + @ParameterizedTest + @MethodSource + public void testPad(DottedVersion ver, String expectedStr, int limit) { + var expected = DottedVersion.lazy(expectedStr); + var actual = ver.pad(limit); + assertEquals(expected, actual); + if (limit <= ver.getComponents().length) { + assertSame(ver, actual); + } else { + assertNotSame(ver, actual); + } + assertEquals(expectedStr, actual.toString()); + } + + @ParameterizedTest + @MethodSource + public void testPadNegative(DottedVersion ver, int limit) { + assertThrowsExactly(IllegalArgumentException.class, () -> { + ver.pad(limit); + }); + } + + private static Stream testPad() { + + var testCases = new ArrayList(); + + for (var suffix : List.of("", ".foo", "-ea", "+345")) { + testCases.addAll(List.of( + Arguments.of("" + suffix, "" + suffix, 0), + Arguments.of("1.02.3" + suffix, "1.02.3" + suffix, 0), + Arguments.of("" + suffix, "0" + suffix, 1), + Arguments.of("1" + suffix, "1" + suffix, 1), + Arguments.of("1" + suffix, "1.0" + suffix, 2), + Arguments.of("1.02.3" + suffix, "1.02.3.0.0" + suffix, 5) + )); + } + + return testCases.stream().map(DottedVersionTest::mapFirstStringToDottedVersion); + } + + private static Stream testPadNegative() { + return Stream.of( + Arguments.of("10.5.foo", -1) + ).map(DottedVersionTest::mapFirstStringToDottedVersion); + } + + private static Arguments mapFirstStringToDottedVersion(Arguments v) { + var objs = v.get(); + objs[0] = DottedVersion.lazy((String)objs[0]); + return Arguments.of(objs); + } + record InvalidVersionTestSpec(String version, String invalidComponent) { public InvalidVersionTestSpec { Objects.requireNonNull(version); diff --git a/test/jdk/tools/jpackage/linux/LinuxResourceTest.java b/test/jdk/tools/jpackage/linux/LinuxResourceTest.java index b82706fc2c2..503c4db77fb 100644 --- a/test/jdk/tools/jpackage/linux/LinuxResourceTest.java +++ b/test/jdk/tools/jpackage/linux/LinuxResourceTest.java @@ -30,6 +30,7 @@ import java.util.Objects; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.CannedFormattedString; import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.JPackageCommand.StandardAssert; import jdk.jpackage.test.JPackageOutputValidator; import jdk.jpackage.test.LinuxHelper; import jdk.jpackage.test.PackageTest; @@ -66,7 +67,7 @@ public class LinuxResourceTest { final var packageProp = property("Package", "dont-install-me"); final var verProp = property("Version", "1.2.3-R2"); - final var arhProp = property("Architecture", "bar"); + final var archProp = property("Architecture", "bar"); TKit.createTextFile(controlFile, List.of( packageProp.format(), @@ -74,13 +75,15 @@ public class LinuxResourceTest { "Section: APPLICATION_SECTION", "Maintainer: APPLICATION_MAINTAINER", "Priority: optional", - arhProp.format(), + archProp.format(), "Provides: dont-install-me", "Description: APPLICATION_DESCRIPTION", "Installed-Size: APPLICATION_INSTALLED_SIZE", "Depends: PACKAGE_DEFAULT_DEPENDENCIES" )); + cmd.excludeStandardAsserts(StandardAssert.LINUX_PACKAGE_ARCH); + new JPackageOutputValidator() .expectMatchingStrings(MAIN.cannedFormattedString( "message.using-custom-resource", @@ -92,7 +95,7 @@ public class LinuxResourceTest { packageProp.expectedValue(LinuxHelper.getPackageName(cmd)).token("APPLICATION_PACKAGE").resourceDirFile(controlFile).validateOutput(cmd); verProp.expectedValue(cmd.version()).token("APPLICATION_VERSION_WITH_RELEASE").resourceDirFile(controlFile).validateOutput(cmd); - arhProp.expectedValue(LinuxHelper.getDefaultPackageArch(cmd.packageType())).token("APPLICATION_ARCH").resourceDirFile(controlFile).validateOutput(cmd); + archProp.expectedValue(LinuxHelper.getDefaultPackageArch(cmd.packageType())).token("APPLICATION_ARCH").resourceDirFile(controlFile).validateOutput(cmd); }) .forTypes(PackageType.LINUX_RPM) .addInitializer(cmd -> { diff --git a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java index 54021aa2a0b..11b466ed715 100644 --- a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java @@ -200,7 +200,7 @@ public class SigningRuntimeImagePackageTest { // This way we can test if jpackage keeps or replaces the signature of // the predefined runtime bundle when backing it in the pkg or dmg installer. return new SignKeyOptionWithKeychain( - SignKeyOption.Type.SIGN_KEY_USER_SHORT_NAME, + SignKeyOption.Type.SIGN_KEY_IDENTITY_APP_IMAGE, SigningBase.StandardCertificateRequest.CODESIGN_ACME_TECH_LTD, SigningBase.StandardKeychain.MAIN.keychain()); } diff --git a/test/jdk/tools/jpackage/share/ErrorTest.java b/test/jdk/tools/jpackage/share/ErrorTest.java index 8bc7ba2521f..b325c02f039 100644 --- a/test/jdk/tools/jpackage/share/ErrorTest.java +++ b/test/jdk/tools/jpackage/share/ErrorTest.java @@ -945,13 +945,13 @@ public final class ErrorTest { .error("error.msi-product-version-components", "1.2.3.4.5") .advice("error.version-string-wrong-format.advice"), testSpec().type(type).addArgs("--app-version", "256.1") - .error("error.msi-product-version-major-out-of-range", "256.1") + .error("error.msi-product-version-major-out-of-range") .advice("error.version-string-wrong-format.advice"), testSpec().type(type).addArgs("--app-version", "1.256") - .error("error.msi-product-version-minor-out-of-range", "1.256") + .error("error.msi-product-version-minor-out-of-range") .advice("error.version-string-wrong-format.advice"), testSpec().type(type).addArgs("--app-version", "1.2.65536") - .error("error.msi-product-version-build-out-of-range", "1.2.65536") + .error("error.msi-product-version-build-out-of-range") .advice("error.version-string-wrong-format.advice") ); }).flatMap(x -> x).map(TestSpec.Builder::create).toList()); diff --git a/test/jdk/tools/jpackage/share/FileAssociationsTest.java b/test/jdk/tools/jpackage/share/FileAssociationsTest.java index c9bd690d73f..0af7e7a54ff 100644 --- a/test/jdk/tools/jpackage/share/FileAssociationsTest.java +++ b/test/jdk/tools/jpackage/share/FileAssociationsTest.java @@ -23,6 +23,8 @@ import static java.util.Map.entry; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import jdk.jpackage.test.Annotations.Parameter; @@ -84,7 +86,7 @@ public class FileAssociationsTest { @Test @Parameter("true") @Parameter("false") - public static void test(boolean includeDescription) { + public static void test(boolean includeDescription) throws IOException { PackageTest packageTest = new PackageTest(); // Not supported @@ -96,10 +98,8 @@ public class FileAssociationsTest { } fa.applyTo(packageTest); - Path icon = TKit.TEST_SRC_ROOT.resolve(Path.of("resources", "icon" - + TKit.ICON_SUFFIX)); - - icon = TKit.createRelativePathCopy(icon); + var icon = TKit.createTempDirectory("icon-dir").resolve(ICON.getFileName()); + Files.copy(ICON, icon); new FileAssociations("jptest2") .setFilename("fa2") @@ -151,4 +151,6 @@ public class FileAssociationsTest { .addInitializer(JPackageCommand::setFakeRuntime) .setExpectedExitCode(1); } + + private static final Path ICON = TKit.TEST_SRC_ROOT.resolve(Path.of("resources", "icon" + TKit.ICON_SUFFIX)); } diff --git a/test/jdk/tools/jpackage/share/InstallDirTest.java b/test/jdk/tools/jpackage/share/InstallDirTest.java index 81d1fb3556e..4d5c1979190 100644 --- a/test/jdk/tools/jpackage/share/InstallDirTest.java +++ b/test/jdk/tools/jpackage/share/InstallDirTest.java @@ -102,10 +102,7 @@ public class InstallDirTest { .forTypes(PackageType.LINUX) .addInitializer(cmd -> { cmd.addArguments("--install-dir", installDir); - cmd.saveConsoleOutput(true); - }) - .addBundleVerifier((cmd, result) -> { - cmd.validateErr(JPackageCommand.makeError("error.invalid-install-dir")); + cmd.validateErr(JPackageCommand.makeError("error.invalid-install-dir", installDir)); }) .run(); } diff --git a/test/jdk/tools/jpackage/share/LicenseTest.java b/test/jdk/tools/jpackage/share/LicenseTest.java index 9c2d1077584..bf4c26fe76a 100644 --- a/test/jdk/tools/jpackage/share/LicenseTest.java +++ b/test/jdk/tools/jpackage/share/LicenseTest.java @@ -21,21 +21,23 @@ * questions. */ +import static jdk.internal.util.OperatingSystem.LINUX; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.List; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; -import static jdk.internal.util.OperatingSystem.LINUX; +import jdk.jpackage.internal.util.Slot; import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.LinuxHelper; import jdk.jpackage.test.Executor; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.LinuxHelper; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; /** @@ -93,11 +95,7 @@ public class LicenseTest { @Test public static void testCommon() { - PackageTest test = new PackageTest().configureHelloApp() - .addInitializer(cmd -> { - cmd.addArguments("--license-file", TKit.createRelativePathCopy( - LICENSE_FILE)); - }); + PackageTest test = new PackageTest().configureHelloApp().mutate(LicenseTest::setLicenseFile); initMacDmgLicenseVerifier(test.forTypes(PackageType.MAC_DMG)); initLinuxLicenseVerifier(test.forTypes(PackageType.LINUX)); @@ -127,19 +125,16 @@ public class LicenseTest { @Test(ifOS = LINUX) public static void testCustomDebianCopyright() { - new CustomDebianCopyrightTest().run(); + new CustomDebianCopyrightTest(false).run(); } @Test(ifOS = LINUX) public static void testCustomDebianCopyrightSubst() { - new CustomDebianCopyrightTest().withSubstitution(true).run(); + new CustomDebianCopyrightTest(true).run(); } private static PackageTest initMacDmgLicenseVerifier(PackageTest test) { - return test - .addBundleVerifier(cmd -> { - verifyLicenseFileInDMGPackage(cmd); - }); + return test.addBundleVerifier(LicenseTest::verifyLicenseFileInDMGPackage); } private static void verifyLicenseFileInDMGPackage(JPackageCommand cmd) @@ -179,10 +174,9 @@ public class LicenseTest { PackageTest test = new PackageTest() .forTypes(PackageType.LINUX) .configureHelloApp() + .addInitializer(JPackageCommand::setFakeRuntime) + .mutate(LicenseTest::setLicenseFile) .addInitializer(cmd -> { - cmd.setFakeRuntime(); - cmd.addArguments("--license-file", TKit.createRelativePathCopy( - LICENSE_FILE)); cmd.addArguments("--install-dir", installDir); }); @@ -191,6 +185,18 @@ public class LicenseTest { test.run(); } + private static void setLicenseFile(PackageTest test) { + var inputLicenseFile = Slot.createEmpty(); + + test.addRunOnceInitializer(() -> { + var dir = TKit.createTempDirectory("license-dir"); + inputLicenseFile.set(dir.resolve(LICENSE_FILE.getFileName())); + Files.copy(LICENSE_FILE, inputLicenseFile.get()); + }).addInitializer(cmd -> { + cmd.setArgumentValue("--license-file", inputLicenseFile.get()); + }); + } + private static Path rpmLicenseFile(JPackageCommand cmd) { final Path licenseRoot = Path.of( new Executor() @@ -296,12 +302,36 @@ public class LicenseTest { TKit.assertPathExists(licenseFile.getParent(), false); } - private static class CustomDebianCopyrightTest { - CustomDebianCopyrightTest() { - withSubstitution(false); + private record CustomDebianCopyrightTest(boolean withSubstitution) { + + private String copyright() { + // Different values just to make easy to figure out from the test log which test was executed. + if (withSubstitution) { + return "Duke (C)"; + } else { + return "Java (C)"; + } } - private List licenseFileText(String copyright, String licenseText) { + private String licenseText() { + // Different values just to make easy to figure out from the test log which test was executed. + if (withSubstitution) { + return "The quick brown fox\n jumps over the lazy dog"; + } else { + return "How vexingly quick daft zebras jump!"; + } + } + + private String name() { + // Different values just to make easy to figure out from the test log which test was executed. + if (withSubstitution) { + return "CustomDebianCopyrightWithSubst"; + } else { + return "CustomDebianCopyright"; + } + } + + static private List licenseFileText(String copyright, String licenseText) { List lines = new ArrayList<>(List.of( String.format("Copyright=%s", copyright), "Foo", @@ -313,28 +343,14 @@ public class LicenseTest { private List licenseFileText() { if (withSubstitution) { - return licenseFileText("APPLICATION_COPYRIGHT", - "APPLICATION_LICENSE_TEXT"); + return licenseFileText("APPLICATION_COPYRIGHT", "APPLICATION_LICENSE_TEXT"); } else { return expectedLicenseFileText(); } } private List expectedLicenseFileText() { - return licenseFileText(copyright, licenseText); - } - - CustomDebianCopyrightTest withSubstitution(boolean v) { - withSubstitution = v; - // Different values just to make easy to figure out from the test log which test was executed. - if (v) { - copyright = "Duke (C)"; - licenseText = "The quick brown fox\n jumps over the lazy dog"; - } else { - copyright = "Java (C)"; - licenseText = "How vexingly quick daft zebras jump!"; - } - return this; + return licenseFileText(copyright(), licenseText()); } void run() { @@ -343,20 +359,19 @@ public class LicenseTest { .addInitializer(cmd -> { // Create source license file. Files.write(srcLicenseFile, List.of( - licenseText.split("\\R", -1))); + licenseText().split("\\R", -1))); cmd.setFakeRuntime(); - cmd.setArgumentValue("--name", String.format("%s%s", - withSubstitution ? "CustomDebianCopyrightWithSubst" : "CustomDebianCopyright", - cmd.name())); + cmd.setArgumentValue("--name", String.format("%s%s", name(), cmd.name())); cmd.addArguments("--license-file", srcLicenseFile); - cmd.addArguments("--copyright", copyright); - cmd.addArguments("--resource-dir", RESOURCE_DIR); + cmd.addArguments("--copyright", copyright()); + + var resourceDir = TKit.createTempDirectory("resources"); + + cmd.addArguments("--resource-dir", resourceDir); // Create copyright template file in a resource dir. - Files.createDirectories(RESOURCE_DIR); - Files.write(RESOURCE_DIR.resolve("copyright"), - licenseFileText()); + Files.write(resourceDir.resolve("copyright"), licenseFileText()); }) .addInstallVerifier(cmd -> { Path installedLicenseFile = linuxLicenseFile(cmd); @@ -368,12 +383,6 @@ public class LicenseTest { }) .run(); } - - private boolean withSubstitution; - private String copyright; - private String licenseText; - - private final Path RESOURCE_DIR = TKit.workDir().resolve("resources"); } private static final Path LICENSE_FILE = TKit.TEST_SRC_ROOT.resolve( diff --git a/test/jdk/tools/jpackage/share/ModularAppTest.java b/test/jdk/tools/jpackage/share/ModularAppTest.java new file mode 100644 index 00000000000..b14d70cc8f3 --- /dev/null +++ b/test/jdk/tools/jpackage/share/ModularAppTest.java @@ -0,0 +1,336 @@ +/* + * 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. + */ + + +import static jdk.jpackage.internal.util.MemoizingSupplier.runOnce; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Stream; +import javax.xml.xpath.XPathExpressionException; +import jdk.internal.util.OperatingSystem; +import jdk.jpackage.internal.util.MacBundle; +import jdk.jpackage.internal.util.Slot; +import jdk.jpackage.internal.util.TokenReplace; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.CannedFormattedString; +import jdk.jpackage.test.Executor; +import jdk.jpackage.test.HelloApp; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.JavaAppDesc; +import jdk.jpackage.test.JavaTool; +import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.TKit; + + +/* + * @test + * @summary jpackage bundling modular app + * @library /test/jdk/tools/jpackage/helpers + * @build jdk.jpackage.test.* + * @compile -Xlint:all -Werror ModularAppTest.java + * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=ModularAppTest + */ + +public final class ModularAppTest { + + @Test + @ParameterSupplier + public void test(TestSpec spec) { + spec.run(); + } + + /** + * Test case for JDK-8233265. Adding modules in .jmod files for non-modular app + * results in unexpected jpackage failure. + */ + @Test + @Parameter("Hello!") + @Parameter("com.foo/com.foo.ModuleApp") + public void test8233265(String mainAppDesc) throws IOException { + JPackageCommand cmd = JPackageCommand.helloAppImage(mainAppDesc); + + // The test should make jpackage invoke jlink. + cmd.ignoreDefaultRuntime(true); + + var modulePath = Optional.ofNullable(cmd.getArgumentValue("--module-path")).map(Path::of).orElseGet(() -> { + var newModulePath = TKit.createTempDirectory("input-modules"); + cmd.addArguments("--module-path", newModulePath); + return newModulePath; + }); + + JavaAppDesc extraModule = JavaAppDesc.parse("x.jmod:com.x/com.x.Y"); + HelloApp.createBundle(extraModule, modulePath); + cmd.addArguments("--add-modules", extraModule.moduleName()); + + cmd.executeAndAssertHelloAppImageCreated(); + } + + /** + * Test case for JDK-8248254. App's module in the predefined runtime directory; + * no "--module-path" option on the command line. jpackage should find the app's + * module in the predefined runtime. + */ + @Test + @Parameter("IMAGE") + @Parameter(value = "MAC_BUNDLE", ifOS = OperatingSystem.MACOS) + public void test8248254(RuntimeType runtimeType) throws XPathExpressionException, IOException { + + final var appDesc = JavaAppDesc.parse("me.mymodule/me.mymodule.Main"); + + new JPackageCommand() + .setDefaultAppName() + .setPackageType(PackageType.IMAGE) + .setDefaultInputOutput() + .removeArgumentWithValue("--input") + .addArguments("--module", appDesc.moduleName() + "/" + appDesc.className()) + .setArgumentValue("--runtime-image", bakeModuleInRuntime(appDesc, runtimeType)) + .executeAndAssertHelloAppImageCreated(); + } + + /** + * Test case for JDK-8261518. App's module is baked into the predefined runtime + * image with jlink; no "--module-path" option on the command line. If there is + * a non-modular jar in the current directory, jpackage used to throw. + */ + @Test + @Parameter("IMAGE") + @Parameter(value = "MAC_BUNDLE", ifOS = OperatingSystem.MACOS) + public void test8261518(RuntimeType runtimeType) throws XPathExpressionException, IOException { + + final var appDesc = JavaAppDesc.parse("com.foo/com.foo.main.Aloha"); + + final var fooJarDir = TKit.createTempDirectory("foo"); + + // Create "foo.jar" in dedicated directory. + HelloApp.createBundle(JavaAppDesc.parse("foo.jar:"), fooJarDir); + + new JPackageCommand() + .setDefaultAppName() + .setPackageType(PackageType.IMAGE) + .setDefaultInputOutput() + .removeArgumentWithValue("--input") + .addArguments("--module", appDesc.moduleName() + "/" + appDesc.className()) + .setArgumentValue("--runtime-image", bakeModuleInRuntime(appDesc, runtimeType).toAbsolutePath()) + // Run jpackage in the directory with "foo.jar" + .setDirectory(fooJarDir).useToolProvider(false) + .executeAndAssertHelloAppImageCreated(); + } + + private static Path bakeModuleInRuntime(JavaAppDesc appDesc, RuntimeType runtimeType) throws IOException { + + final var moduleOutputDir = TKit.createTempDirectory("modules"); + HelloApp.createBundle(appDesc, moduleOutputDir); + + final var workDir = TKit.createTempDirectory("runtime").resolve("data"); + final Path jlinkOutputDir; + switch (runtimeType) { + case IMAGE -> { + jlinkOutputDir = workDir; + } + case MAC_BUNDLE -> { + var macBundle = new MacBundle(workDir); + + // Create macOS bundle structure sufficient to pass jpackage validation. + Files.createDirectories(macBundle.homeDir().getParent()); + Files.createDirectories(macBundle.macOsDir()); + Files.createFile(macBundle.infoPlistFile()); + jlinkOutputDir = macBundle.homeDir(); + } + default -> { + throw new AssertionError(); + } + } + + // List of modules required for the test app. + final var modules = new String[] { + "java.base", + "java.desktop", + appDesc.moduleName() + }; + + new Executor() + .setToolProvider(JavaTool.JLINK) + .dumpOutput() + .addArguments( + "--add-modules", String.join(",", modules), + "--output", jlinkOutputDir.toString(), + "--module-path", moduleOutputDir.resolve(appDesc.jarFileName()).toString(), + "--strip-debug", + "--no-header-files", + "--no-man-pages", + "--strip-native-commands") + .execute(); + + return workDir; + } + + enum RuntimeType { + IMAGE, + MAC_BUNDLE, + ; + } + + record TestSpec(List paths, String appDesc) { + TestSpec { + Objects.requireNonNull(paths); + Objects.requireNonNull(appDesc); + Objects.requireNonNull(JavaAppDesc.parse(appDesc).moduleName()); + } + + boolean isWithGoodPath() { + var isWithGoodPath = Slot.createEmpty(); + paths.forEach(path -> { + ALL_TOKENS.applyTo(path, token -> { + if (token.equals(Token.GOOD_DIR.token())) { + isWithGoodPath.set(true); + } + return token; + }); + }); + return isWithGoodPath.find().isPresent(); + } + + void run() { + var emptyDir = runOnce(() -> { + return TKit.createTempDirectory("empty-dir"); + }); + + var nonExistingDir = runOnce(() -> { + return TKit.withTempDirectory("non-existing-dir", x -> {}); + }); + + var goodDir = runOnce(() -> { + return TKit.createTempDirectory("modules"); + }); + + var theAppDesc = JavaAppDesc.parse(appDesc); + + HelloApp.createBundle(theAppDesc, goodDir.get()); + + var cmd = new JPackageCommand() + .setArgumentValue("--dest", TKit.workDir().resolve("output")) + .setDefaultAppName() + .setPackageType(PackageType.IMAGE) + // Ignore runtime that can be set for all tests. Usually if default + // runtime is set, it is fake one to save time on running jlink and + // copying megabytes of data from Java home to application image. + // We need proper runtime for this test. + .ignoreDefaultRuntime(true) + .addArguments("--module", String.join("/", theAppDesc.moduleName(), theAppDesc.className())); + + if (TKit.isWindows()) { + cmd.addArguments("--win-console"); + } + + paths.stream().map(path -> { + return ALL_TOKENS.applyTo(path, token -> { + return (switch (Token.valueOf(token.substring(2, token.length() - 2))) { + case EMPTY_DIR -> { + yield emptyDir; + } + case GOOD_DIR -> { + yield goodDir; + } + case NON_EXISTING_DIR -> { + yield nonExistingDir; + } + default -> { + throw new AssertionError(); + } + }).get(); + }); + }).mapMulti((path, acc) -> { + acc.accept("--module-path"); + acc.accept(path); + }).forEach(cmd::addArgument); + + if (isWithGoodPath()) { + cmd.executeAndAssertHelloAppImageCreated(); + } else { + final CannedFormattedString expectedErrorMessage; + if (paths.isEmpty()) { + expectedErrorMessage = JPackageCommand.makeError( + "ERR_MissingArgument2", "--runtime-image", "--module-path"); + } else { + expectedErrorMessage = JPackageCommand.makeError( + "error.no-module-in-path", theAppDesc.moduleName()); + } + + cmd.validateErr(expectedErrorMessage).execute(1); + } + } + + private static final TokenReplace ALL_TOKENS = + new TokenReplace(Stream.of(Token.values()).map(Token::token).toArray(String[]::new)); + } + + public static Collection test() { + + var testCases = new ArrayList(); + + for (String appDesc : List.of( + "benvenuto.jar:com.jar.foo/com.jar.foo.Hello", + "benvenuto.jmod:com.jmod.foo/com.jmod.foo.JModHello" + )) { + Stream.>of( + Stream.of(Token.GOOD_DIR, Token.EMPTY_DIR, Token.NON_EXISTING_DIR).map(Token::token), + Stream.of(Token.EMPTY_DIR, Token.NON_EXISTING_DIR, Token.GOOD_DIR).map(Token::token), + Stream.of(Token.GOOD_DIR.token() + "/a/b/c/d", Token.GOOD_DIR.token()), + Stream.of(), + Stream.of(Token.EMPTY_DIR).map(Token::token) + ).map(Stream::toList).map(paths -> { + return new TestSpec(paths, appDesc); + }).forEach(testCases::add); + } + + return testCases.stream().map(v -> { + return new Object[] {v}; + }).toList(); + } + + enum Token { + GOOD_DIR, + EMPTY_DIR, + NON_EXISTING_DIR, + ; + + String token() { + return makeToken(name()); + } + + private static String makeToken(String v) { + Objects.requireNonNull(v); + return String.format("@@%s@@", v); + } + } +} diff --git a/test/jdk/tools/jpackage/share/ModulePathTest.java b/test/jdk/tools/jpackage/share/ModulePathTest.java deleted file mode 100644 index 583dd1eb0c4..00000000000 --- a/test/jdk/tools/jpackage/share/ModulePathTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2019, 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. - */ - - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Collection; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import jdk.jpackage.test.CannedFormattedString; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.JavaAppDesc; -import jdk.jpackage.test.HelloApp; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.JPackageStringBundle; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.Annotations.Parameters; -import jdk.jpackage.test.Annotations.Test; - - -/* - * @test - * @summary jpackage with --module-path testing - * @library /test/jdk/tools/jpackage/helpers - * @build jdk.jpackage.test.* - * @compile -Xlint:all -Werror ModulePathTest.java - * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=ModulePathTest - */ - -public final class ModulePathTest { - - @Parameters - public static Collection data() { - return List.of(new String[][]{ - {GOOD_PATH, EMPTY_DIR, NON_EXISTING_DIR}, - {EMPTY_DIR, NON_EXISTING_DIR, GOOD_PATH}, - {GOOD_PATH + "/a/b/c/d", GOOD_PATH}, - {String.join(File.pathSeparator, EMPTY_DIR, NON_EXISTING_DIR, - GOOD_PATH)}, - {String.join(File.pathSeparator, EMPTY_DIR, NON_EXISTING_DIR), - String.join(File.pathSeparator, EMPTY_DIR, NON_EXISTING_DIR, - GOOD_PATH)}, - {}, - {EMPTY_DIR} - }); - } - - public ModulePathTest(String... modulePathArgs) { - this.modulePathArgs = List.of(modulePathArgs); - } - - @Test - @Parameter("benvenuto.jar:com.jar.foo/com.jar.foo.Hello") - @Parameter("benvenuto.jmod:com.jmod.foo/com.jmod.foo.JModHello") - public void test(String javaAppDesc) throws IOException { - JavaAppDesc appDesc = JavaAppDesc.parse(javaAppDesc); - - Path goodModulePath = TKit.createTempDirectory("modules"); - - HelloApp.createBundle(appDesc, goodModulePath); - - JPackageCommand cmd = new JPackageCommand() - .setArgumentValue("--dest", TKit.workDir().resolve("output")) - .setDefaultAppName() - .setPackageType(PackageType.IMAGE); - - if (TKit.isWindows()) { - cmd.addArguments("--win-console"); - } - - cmd.addArguments("--module", String.join("/", appDesc.moduleName(), - appDesc.className())); - - // Ignore runtime that can be set for all tests. Usually if default - // runtime is set, it is fake one to save time on running jlink and - // copying megabytes of data from Java home to application image. - // We need proper runtime for this test. - cmd.ignoreDefaultRuntime(true); - - Path emptyDir = TKit.createTempDirectory("empty-dir"); - Path nonExistingDir = TKit.withTempDirectory("non-existing-dir", x -> {}); - - Function substitute = str -> { - String v = str; - v = v.replace(GOOD_PATH, goodModulePath.toString()); - v = v.replace(EMPTY_DIR, emptyDir.toString()); - v = v.replace(NON_EXISTING_DIR, nonExistingDir.toString()); - return v; - }; - - boolean withGoodPath = modulePathArgs.stream().anyMatch( - s -> s.contains(GOOD_PATH)); - - cmd.addArguments(modulePathArgs.stream().map(arg -> Stream.of( - "--module-path", substitute.apply(arg))).flatMap(s -> s).collect( - Collectors.toList())); - - if (withGoodPath) { - cmd.executeAndAssertHelloAppImageCreated(); - } else { - final CannedFormattedString expectedErrorMessage; - if (modulePathArgs.isEmpty()) { - expectedErrorMessage = JPackageCommand.makeError( - "ERR_MissingArgument2", "--runtime-image", "--module-path"); - } else { - expectedErrorMessage = JPackageCommand.makeError( - "error.no-module-in-path", appDesc.moduleName()); - } - - cmd.validateErr(expectedErrorMessage).execute(1); - } - } - - private final List modulePathArgs; - - private static final String GOOD_PATH = "@GoodPath@"; - private static final String EMPTY_DIR = "@EmptyDir@"; - private static final String NON_EXISTING_DIR = "@NonExistingDir@"; -} diff --git a/test/jdk/tools/jpackage/share/ModulePathTest2.java b/test/jdk/tools/jpackage/share/ModulePathTest2.java deleted file mode 100644 index b2cc674e7e9..00000000000 --- a/test/jdk/tools/jpackage/share/ModulePathTest2.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2019, 2025, 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. - */ - - -import java.io.IOException; -import java.nio.file.Path; -import jdk.jpackage.test.HelloApp; -import jdk.jpackage.test.JavaAppDesc; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.TKit; - - -/* - * @test - * @summary jpackage with --module-path testing - * @library /test/jdk/tools/jpackage/helpers - * @build jdk.jpackage.test.* - * @compile -Xlint:all -Werror ModulePathTest2.java - * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=ModulePathTest2 - */ - -public final class ModulePathTest2 { - - /** - * Test case for JDK-8233265. - * Adding modules in .jmod files for non-modular app results in unexpected - * jpackage failure. - * @param mainAppDesc - */ - @Test - @Parameter("Hello!") - @Parameter("com.foo/com.foo.ModuleApp") - public void test8233265(String mainAppDesc) throws IOException { - JPackageCommand cmd = JPackageCommand.helloAppImage(mainAppDesc); - - // The test should make jpackage invoke jlink. - cmd.ignoreDefaultRuntime(true); - - Path modulePath = cmd.getArgumentValue("--module-path", () -> null, Path::of); - if (modulePath == null) { - modulePath = TKit.createTempDirectory("input-modules"); - cmd.addArguments("--module-path", modulePath); - } - - JavaAppDesc extraModule = JavaAppDesc.parse("x.jmod:com.x/com.x.Y"); - HelloApp.createBundle(extraModule, modulePath); - cmd.addArguments("--add-modules", extraModule.moduleName()); - - cmd.executeAndAssertHelloAppImageCreated(); - } -} diff --git a/test/jdk/tools/jpackage/share/ModulePathTest3.java b/test/jdk/tools/jpackage/share/ModulePathTest3.java deleted file mode 100644 index c3960c0d4c8..00000000000 --- a/test/jdk/tools/jpackage/share/ModulePathTest3.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2020, 2025, 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. - */ - - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import javax.xml.xpath.XPathExpressionException; -import jdk.jpackage.test.AppImageFile; -import jdk.jpackage.test.HelloApp; -import jdk.jpackage.test.JavaAppDesc; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameters; -import jdk.jpackage.test.Executor; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.JavaTool; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.TKit; - - -/* - * @test - * @summary jpackage for app's module linked in external runtime - * @library /test/jdk/tools/jpackage/helpers - * @build jdk.jpackage.test.* - * @compile -Xlint:all -Werror ModulePathTest3.java - * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=ModulePathTest3 - */ - -public final class ModulePathTest3 { - - public ModulePathTest3(String jlinkOutputSubdir, String runtimeSubdir) { - this.jlinkOutputSubdir = Path.of(jlinkOutputSubdir); - this.runtimeSubdir = Path.of(runtimeSubdir); - } - - /** - * Test case for JDK-8248254. - * App's module in runtime directory. - */ - @Test - public void test8248254() throws XPathExpressionException, IOException { - testIt("me.mymodule/me.mymodule.Main"); - } - - private void testIt(String mainAppDesc) throws XPathExpressionException, - IOException { - final JavaAppDesc appDesc = JavaAppDesc.parse(mainAppDesc); - final Path moduleOutputDir = TKit.createTempDirectory("modules"); - HelloApp.createBundle(appDesc, moduleOutputDir); - - final Path workDir = TKit.createTempDirectory("runtime").resolve("data"); - final Path jlinkOutputDir = workDir.resolve(jlinkOutputSubdir); - Files.createDirectories(jlinkOutputDir.getParent()); - - new Executor() - .setToolProvider(JavaTool.JLINK) - .dumpOutput() - .addArguments( - "--add-modules", appDesc.moduleName(), - "--output", jlinkOutputDir.toString(), - "--module-path", moduleOutputDir.resolve(appDesc.jarFileName()).toString(), - "--strip-debug", - "--no-header-files", - "--no-man-pages", - "--strip-native-commands") - .execute(); - - JPackageCommand cmd = new JPackageCommand() - .setDefaultAppName() - .setPackageType(PackageType.IMAGE) - .setDefaultInputOutput() - .removeArgumentWithValue("--input") - .addArguments("--module", appDesc.moduleName() + "/" + appDesc.className()) - .setArgumentValue("--runtime-image", workDir.resolve(runtimeSubdir)); - - cmd.executeAndAssertHelloAppImageCreated(); - - if (appDesc.moduleVersion() != null) { - String actualVersion = AppImageFile.load(cmd.outputBundle()).version(); - TKit.assertEquals(appDesc.moduleVersion(), actualVersion, - "Check application version"); - } - } - - @Parameters - public static Collection data() { - final List paths = new ArrayList<>(); - paths.add(new String[] { "", "" }); - if (TKit.isOSX()) { - // On OSX jpackage should accept both runtime root and runtime home - // directories. - paths.add(new String[] { "Contents/Home", "" }); - } - - List data = new ArrayList<>(); - for (var pathCfg : paths) { - data.add(new Object[] { pathCfg[0], pathCfg[1] }); - } - - return data; - } - - private final Path jlinkOutputSubdir; - private final Path runtimeSubdir; -} diff --git a/test/jdk/tools/jpackage/share/NoMPathRuntimeTest.java b/test/jdk/tools/jpackage/share/NoMPathRuntimeTest.java deleted file mode 100644 index 91679945925..00000000000 --- a/test/jdk/tools/jpackage/share/NoMPathRuntimeTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2020, 2025, 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. - */ - - -import java.io.IOException; -import java.nio.file.Files; -import java.util.Collection; -import java.util.ArrayList; -import java.util.List; -import java.nio.file.Path; -import jdk.jpackage.test.Annotations.Parameters; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Executor; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.JavaAppDesc; -import jdk.jpackage.test.JavaTool; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.HelloApp; - - -/* - * @test - * @summary test '--runtime-image' option of jpackage - * @library /test/jdk/tools/jpackage/helpers - * @build jdk.jpackage.test.* - * @compile -Xlint:all -Werror NoMPathRuntimeTest.java - * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=NoMPathRuntimeTest - */ - -public final class NoMPathRuntimeTest { - - public NoMPathRuntimeTest(String jlinkOutputSubdir, String runtimeSubdir) { - this.jlinkOutputSubdir = Path.of(jlinkOutputSubdir); - this.runtimeSubdir = Path.of(runtimeSubdir); - } - - @Test - public void test() throws IOException { - JavaAppDesc appDesc = JavaAppDesc.parse("com.foo/com.foo.main.Aloha"); - - JPackageCommand cmd = JPackageCommand.helloAppImage(appDesc); - - // Build module jar. - cmd.executePrerequisiteActions(); - - final Path workDir = TKit.createTempDirectory("runtime").resolve("data"); - final Path jlinkOutputDir = workDir.resolve(jlinkOutputSubdir); - Files.createDirectories(jlinkOutputDir.getParent()); - - // List of modules required for test app. - final var modules = new String[] { - "java.base", - "java.desktop" - }; - - Executor jlink = new Executor() - .setToolProvider(JavaTool.JLINK) - .dumpOutput() - .addArguments( - "--add-modules", String.join(",", modules), - "--output", jlinkOutputDir.toString(), - "--strip-debug", - "--no-header-files", - "--no-man-pages"); - - jlink.addArguments("--add-modules", appDesc.moduleName(), - "--module-path", Path.of(cmd.getArgumentValue("--module-path")) - .resolve("hello.jar").toString()); - - jlink.execute(); - - // non-modular jar in current dir caused error whe no module-path given - cmd.removeArgumentWithValue("--module-path"); - - cmd.setArgumentValue("--runtime-image", workDir.resolve(runtimeSubdir)); - Path junkJar = null; - try { - // create a non-modular jar in the current directory - junkJar = HelloApp.createBundle( - JavaAppDesc.parse("junk.jar:Hello"), Path.of(".")); - - cmd.executeAndAssertHelloAppImageCreated(); - } finally { - if (junkJar != null) { - TKit.deleteIfExists(junkJar); - } - } - - } - - @Parameters - public static Collection data() { - - final List paths = new ArrayList<>(); - paths.add(new String[] { "", "" }); - if (TKit.isOSX()) { - // On OSX jpackage should accept both runtime root and runtime home - // directories. - paths.add(new String[] { "Contents/Home", "" }); - } - - List data = new ArrayList<>(); - for (var pathCfg : paths) { - data.add(new Object[] { pathCfg[0], pathCfg[1] }); - } - - return data; - } - - private final Path jlinkOutputSubdir; - private final Path runtimeSubdir; -} diff --git a/test/jdk/tools/jpackage/windows/WinInstallerUiTest.java b/test/jdk/tools/jpackage/windows/WinInstallerUiTest.java index 7dcf025a506..d6cebde6444 100644 --- a/test/jdk/tools/jpackage/windows/WinInstallerUiTest.java +++ b/test/jdk/tools/jpackage/windows/WinInstallerUiTest.java @@ -21,13 +21,15 @@ * questions. */ +import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameters; import java.util.List; +import jdk.jpackage.internal.util.Slot; +import jdk.jpackage.test.Annotations.Parameters; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; @@ -108,11 +110,7 @@ public class WinInstallerUiTest { } if (withLicense) { - test.addInitializer(cmd -> { - cmd.addArguments("--license-file", TKit.createRelativePathCopy( - TKit.TEST_SRC_ROOT.resolve(Path.of("resources", - "license.txt")))); - }); + setLicenseFile(test); } test.run(); @@ -133,7 +131,21 @@ public class WinInstallerUiTest { cmd.setArgumentValue("--name", sb.toString()); } + private static void setLicenseFile(PackageTest test) { + var inputLicenseFile = Slot.createEmpty(); + + test.addRunOnceInitializer(() -> { + var dir = TKit.createTempDirectory("license-dir"); + inputLicenseFile.set(dir.resolve(LICENSE_FILE.getFileName())); + Files.copy(LICENSE_FILE, inputLicenseFile.get()); + }).addInitializer(cmd -> { + cmd.setArgumentValue("--license-file", inputLicenseFile.get()); + }); + } + private final boolean withDirChooser; private final boolean withLicense; private final boolean withShortcutPrompt; + + private static final Path LICENSE_FILE = TKit.TEST_SRC_ROOT.resolve(Path.of("resources", "license.txt")); } diff --git a/test/langtools/TEST.ROOT b/test/langtools/TEST.ROOT index 434cf91b0ec..c76f99d1396 100644 --- a/test/langtools/TEST.ROOT +++ b/test/langtools/TEST.ROOT @@ -17,11 +17,6 @@ groups=TEST.groups # Minimum jtreg version requiredVersion=8.2.1+1 -# Use new module options -useNewOptions=true - -# Use --patch-module instead of -Xmodule: -useNewPatchModule=true # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them diff --git a/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java b/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java index f3294f6647c..57854396cf4 100644 --- a/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java +++ b/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -24,6 +24,7 @@ /* * @test * @bug 8017191 8182765 8200432 8239804 8250766 8262992 8281944 8307377 + * 8284315 * @summary Javadoc is confused by at-link to imported classes outside of the set of generated packages * @library /tools/lib ../../lib * @modules jdk.javadoc/jdk.javadoc.internal.tool @@ -103,7 +104,12 @@ public class TestSeeTag extends JavadocTester {
    See Also:
      -
    • Object
    • +
    • +
      + invalid reference +
      Object[]
      +
      +
    • invalid reference diff --git a/test/langtools/tools/doclint/ReferenceTest.java b/test/langtools/tools/doclint/ReferenceTest.java index ca677d64927..63512d1efc4 100644 --- a/test/langtools/tools/doclint/ReferenceTest.java +++ b/test/langtools/tools/doclint/ReferenceTest.java @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8004832 8020556 8002154 8200432 8177280 + * @bug 8004832 8020556 8002154 8200432 8177280 8284315 * @summary Add new doclint package * @modules jdk.javadoc/jdk.javadoc.internal.doclint * @build DocLintTester diff --git a/test/langtools/tools/doclint/ReferenceTest.out b/test/langtools/tools/doclint/ReferenceTest.out index 0b39ea20a41..4232f7b12ba 100644 --- a/test/langtools/tools/doclint/ReferenceTest.out +++ b/test/langtools/tools/doclint/ReferenceTest.out @@ -31,12 +31,24 @@ ReferenceTest.java:71: error: reference not found ReferenceTest.java:74: error: reference not found * @see not.Found ^ +ReferenceTest.java:79: error: reference not found + * {@link java.lang.String[]} + ^ +ReferenceTest.java:80: error: reference not found + * {@link java.lang.String[]#equals} + ^ ReferenceTest.java:81: error: reference not found * {@link not.Found[]} ^ +ReferenceTest.java:82: error: reference not found + * @see java.lang.String[] + ^ +ReferenceTest.java:83: error: reference not found + * @see java.lang.String[]#equals + ^ ReferenceTest.java:84: error: reference not found * @see not.Found[] ^ -12 errors +16 errors 1 warning diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/IncorrectCastOffsetTest.java b/test/langtools/tools/javac/annotations/typeAnnotations/IncorrectCastOffsetTest.java new file mode 100644 index 00000000000..7a00cf1c897 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/IncorrectCastOffsetTest.java @@ -0,0 +1,178 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8214934 8379201 + * @summary Wrong type annotation offset on casts on expressions + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * @build toolbox.ToolBox toolbox.JavapTask + * @run compile -g:none IncorrectCastOffsetTest.java + * @run main IncorrectCastOffsetTest + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import java.util.List; + +import toolbox.JavapTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class IncorrectCastOffsetTest { + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + @interface TypeUse {} + + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + @interface TypeUse2 {} + + class AnnotatedCast1 { + private static String checkcast(boolean test, Object obj, Object obj2) { + return (@TypeUse String)(test ? obj : obj2); + } + } + + class AnnotatedCast2 { + private static String checkcast(Object obj) { + return (@TypeUse String)(obj); + } + } + + class AnnotatedCast3 { + private static String checkcast(boolean test, Object obj, Object obj2) { + return (@TypeUse @TypeUse2 String)(test ? obj : obj2); + } + } + + class AnnotatedCast4 { + private static String checkcast(Object obj) { + return (@TypeUse String)(@TypeUse2 CharSequence)(obj); + } + } + + ToolBox tb; + + IncorrectCastOffsetTest() { + tb = new ToolBox(); + } + + public static void main(String args[]) { + IncorrectCastOffsetTest incorrectCastOffsetTest = new IncorrectCastOffsetTest(); + incorrectCastOffsetTest.run(); + } + + void run() { + test("IncorrectCastOffsetTest$AnnotatedCast1.class", + /* + * generated code: + * 0: iload_0 + * 1: ifeq 8 + * 4: aload_1 + * 5: goto 9 + * 8: aload_2 + * 9: checkcast #13 // class java/lang/String + * 12: areturn + */ + List.of( + "RuntimeVisibleTypeAnnotations:", + "0: #24(): CAST, offset=9, type_index=0", + "IncorrectCastOffsetTest$TypeUse" + ) + ); + test("IncorrectCastOffsetTest$AnnotatedCast2.class", + /* + * generated code: + * 0: aload_0 + * 1: checkcast #13 // class java/lang/String + * 4: areturn + */ + List.of( + "RuntimeVisibleTypeAnnotations:", + "0: #23(): CAST, offset=1, type_index=0", + "IncorrectCastOffsetTest$TypeUse" + ) + ); + test("IncorrectCastOffsetTest$AnnotatedCast3.class", + /* + * generated code: + * 0: iload_0 + * 1: ifeq 8 + * 4: aload_1 + * 5: goto 9 + * 8: aload_2 + * 9: checkcast #13 // class java/lang/String + * 12: areturn + */ + List.of( + "RuntimeVisibleTypeAnnotations:", + "0: #24(): CAST, offset=9, type_index=0", + "IncorrectCastOffsetTest$TypeUse", + "1: #25(): CAST, offset=9, type_index=0", + "IncorrectCastOffsetTest$TypeUse2" + ) + ); + test("IncorrectCastOffsetTest$AnnotatedCast4.class", + /* + * generated code: + * 0: aload_0 + * 1: checkcast #13 // class java/lang/CharSequence + * 4: checkcast #15 // class java/lang/String + * 7: areturn + */ + List.of( + "RuntimeVisibleTypeAnnotations:", + "0: #25(): CAST, offset=4, type_index=0", + "IncorrectCastOffsetTest$TypeUse", + "1: #26(): CAST, offset=1, type_index=0", + "IncorrectCastOffsetTest$TypeUse2" + ) + ); + } + + void test(String clazz, List expectedOutput) { + Path pathToClass = Paths.get(ToolBox.testClasses, clazz); + String javapOut = new JavapTask(tb) + .options("-v", "-p") + .classes(pathToClass.toString()) + .run() + .getOutput(Task.OutputKind.DIRECT); + + for (String expected : expectedOutput) { + if (!javapOut.contains(expected)) { + throw new AssertionError("unexpected output"); + } + } + } + +} diff --git a/test/langtools/tools/javac/doctree/ReferenceTest.java b/test/langtools/tools/javac/doctree/ReferenceTest.java index 540cb9a6621..83a10ee4d20 100644 --- a/test/langtools/tools/javac/doctree/ReferenceTest.java +++ b/test/langtools/tools/javac/doctree/ReferenceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 7021614 8278373 8164094 8371248 + * @bug 7021614 8278373 8164094 8371248 8284315 * @summary extend com.sun.source API to support parsing javadoc comments * @summary check references in at-see and {at-link} tags * @modules jdk.compiler @@ -56,6 +56,7 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.QualifiedNameable; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic.Kind; @@ -84,11 +85,14 @@ import javax.tools.Diagnostic.Kind; * {@link #trees Field} * {@link #getSupportedSourceVersion Method} * {@link #init(ProcessingEnvironment Method} - * {@link double Class} + * {@link double type-only:double} + * {@link int type-only:int} + * {@link void type-only:void} * {@link double.NAN Bad} * {@link double#NAN Bad} * {@link double#double Bad} * {@link java.base/double Bad} + * {@link jdk.javadoc/double Bad} * * {@link List Interface} * {@link List.add Bad} @@ -100,15 +104,20 @@ import javax.tools.Diagnostic.Kind; * {@link Map.Entry#getKey Method} * {@link Map.Entry#setValue(Object) Method} * - * {@link java.base/java.util.List Bad} + * {@link java.lang.String[] type-only:array} + * {@link java.lang.String[].length Bad} + * {@link java.lang.String[]#length type-only:int} + * {@link java.lang.String[]#length() Bad} + * + * {@link java.base/java.util.List Interface} * {@link java.base/java.util.List.add Bad} - * {@link java.base/java.util.List#add Bad} - * {@link java.base/java.util.List#add(Object) Bad} - * {@link java.base/java.util.Map.Entry Bad} - * {@link java.base/java.util.Map.Entry Bad} + * {@link java.base/java.util.List#add Method} + * {@link java.base/java.util.List#add(Object) Method} + * {@link java.base/java.util.Map.Entry Interface} + * {@link java.base/java.util.Map.Entry Interface} * {@link java.base/java.util.Map.Entry.getKey Bad} - * {@link java.base/java.util.Map.Entry#getKey Bad} - * {@link java.base/java.util.Map.Entry#setValue(Object) Bad} + * {@link java.base/java.util.Map.Entry#getKey Method} + * {@link java.base/java.util.Map.Entry#setValue(Object) Method} * * @see java.lang Package * @see java.lang.ERROR Bad @@ -127,6 +136,14 @@ import javax.tools.Diagnostic.Kind; * @see java.lang.String#ERROR Bad * @see java.lang.String#equals(Object) Method * + * @see java.lang.String[] type-only:array + * @see java.lang.String[].length Bad + * @see java.lang.String[]#length type-only:int + * @see java.lang.String[]#length() Bad + * + * @see jdk.javadoc/jdk.javadoc.doclet.Doclet Interface + * @see jdk.compiler/jdk.javadoc.doclet.Doclet Bad + * * @see AbstractProcessor Class * * @see List#add(Object) Method @@ -200,15 +217,23 @@ public class ReferenceTest extends AbstractProcessor { String sig = tree.getSignature(); Element found = trees.getElement(new DocTreePath(getCurrentPath(), tree)); + TypeMirror type = trees.getType(new DocTreePath(getCurrentPath(), tree)); + if (found == null) { System.err.println(sig + " NOT FOUND"); } else { System.err.println(sig + " found " + found.getKind() + " " + found); + if (type == null) { + error(tree, "Did not find type for element " + found); + } else if (!erasure(type).equals(erasure(found.asType()))) { + error(tree, "Type " + erasure(type) + " does not match element " + erasure(found.asType())); + } } String expect = "UNKNOWN"; - if (label.size() > 0 && label.get(0) instanceof TextTree) - expect = ((TextTree) label.get(0)).getBody(); + if (!label.isEmpty() && label.getFirst() instanceof TextTree) { + expect = ((TextTree) label.getFirst()).getBody(); + } if (expect.startsWith("signature:")) { expect = expect.substring("signature:".length()); @@ -216,12 +241,25 @@ public class ReferenceTest extends AbstractProcessor { String signature = found.getKind().name() + ":" + elementSignature(found); if (!expect.equalsIgnoreCase(signature)) { - error(tree, "Unexpected value found: " + signature +", expected: " + expect); + error(tree, "Unexpected value found: " + signature + ", expected: " + expect); + } + } else if (expect.startsWith("type-only:")) { + expect = expect.substring("type-only:".length()); + if (found != null) { + error(tree, "Found element for type-only reference: " + found); + } + if (type == null) { + error(tree, "Found no type, expected: " + expect); + } else if (!expect.equalsIgnoreCase(type.getKind().name())) { + error(tree, "Found unexpected type: " + type + ", expected: " + expect); } } else { if (!expect.equalsIgnoreCase(found == null ? "bad" : found.getKind().name())) { error(tree, "Unexpected value found: " + found +", expected: " + expect); } + if (expect.equalsIgnoreCase("bad") && type != null) { + error(tree, "Found unexpected type: " + type + ", expected none"); + } } } @@ -252,6 +290,12 @@ public class ReferenceTest extends AbstractProcessor { default -> throw new AssertionError("Unhandled type kind: " + type.getKind()); }; } + + TypeMirror erasure(TypeMirror type) { + return type.getKind() == TypeKind.DECLARED + ? processingEnv.getTypeUtils().erasure(type) + : type; + } } /** @@ -317,11 +361,17 @@ class ReferenceTestExtras { * @see #X Field * @see #X() Method * @see #m Method + * @see X Type_Parameter + * @see Y Type_Parameter + * @see X#wait Method + * @see X#wait() Method + * @see Y#getSupportedSourceVersion Method + * @see Y#init(ProcessingEnvironment) Method * @see Inner#X Bad * @see Inner#X() Bad * @see Inner#m Bad */ - interface Inner {} + interface Inner {} } diff --git a/test/langtools/tools/javac/processing/model/util/types/TestAsElement.java b/test/langtools/tools/javac/processing/model/util/types/TestAsElement.java index 6ac714752c3..cc82c5adddd 100644 --- a/test/langtools/tools/javac/processing/model/util/types/TestAsElement.java +++ b/test/langtools/tools/javac/processing/model/util/types/TestAsElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8300857 + * @bug 8300857 8379156 * @summary Test Types.asElement in cases specified to return null * @library /tools/javac/lib * @build JavacTestingAbstractProcessor TestAsElement @@ -55,18 +55,23 @@ public class TestAsElement extends JavacTestingAbstractProcessor { } private void testNullCases() { - // Test all primitive types + // Test all primitive types and arrays of primitive types for (TypeKind typeKind : TypeKind.values()) { if (typeKind.isPrimitive() ) { - expectNullAsElement(typeUtils.getPrimitiveType(typeKind)); + var primType = typeUtils.getPrimitiveType(typeKind); + expectNullAsElement(primType); + expectNullAsElement(typeUtils.getArrayType(primType)); } } expectNullAsElement(typeUtils.getNoType(TypeKind.VOID)); expectNullAsElement(typeUtils.getNoType(TypeKind.NONE)); expectNullAsElement(typeUtils.getNullType()); - Element objectElement = eltUtils.getTypeElement("java.lang.Object"); - expectNullAsElement(typeUtils.getWildcardType(objectElement.asType(), null)); + Element objectElement = eltUtils.getTypeElement("java.lang.Object"); + TypeMirror objectType = objectElement.asType(); + expectNullAsElement(typeUtils.getWildcardType(objectType, null)); + // check Object[] + expectNullAsElement(typeUtils.getArrayType(objectType)); // Loop over the ExecutableTypes for Object's methods for(var methodElt : ElementFilter.methodsIn(objectElement.getEnclosedElements())) { diff --git a/test/lib-test/TEST.ROOT b/test/lib-test/TEST.ROOT index f23d38c1e66..33c9a9c2a43 100644 --- a/test/lib-test/TEST.ROOT +++ b/test/lib-test/TEST.ROOT @@ -31,6 +31,9 @@ keys=randomness # Minimum jtreg version requiredVersion=8.2.1+1 +# Prevent TestNG-based tests under this root, use @run junit actions instead +disallowedActions=testng + # Allow querying of various System properties in @requires clauses requires.extraPropDefns = ../jtreg-ext/requires/VMProps.java requires.extraPropDefns.bootlibs = ../lib/jdk/test/whitebox diff --git a/test/lib-test/jdk/test/lib/jittester/MethodTemplateTest.java b/test/lib-test/jdk/test/lib/jittester/MethodTemplateTest.java index 3cee24b4684..69751bc281c 100644 --- a/test/lib-test/jdk/test/lib/jittester/MethodTemplateTest.java +++ b/test/lib-test/jdk/test/lib/jittester/MethodTemplateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, 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 @@ -25,8 +25,8 @@ package jdk.test.lib.jittester; import java.lang.reflect.Executable; -import org.testng.annotations.Test; -import static org.testng.Assert.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; /* * @test @@ -35,7 +35,7 @@ import static org.testng.Assert.*; * @library /test/lib * /test/hotspot/jtreg/testlibrary/jittester/src * - * @run testng jdk.test.lib.jittester.MethodTemplateTest + * @run junit jdk.test.lib.jittester.MethodTemplateTest */ public class MethodTemplateTest { diff --git a/test/lib/jdk/test/lib/SA/SATestUtils.java b/test/lib/jdk/test/lib/SA/SATestUtils.java index 50f5d71f1f1..754ef4c40dd 100644 --- a/test/lib/jdk/test/lib/SA/SATestUtils.java +++ b/test/lib/jdk/test/lib/SA/SATestUtils.java @@ -333,7 +333,7 @@ public class SATestUtils { .get(); String dir = buildID.substring(0, 2); String file = buildID.substring(2); - debuginfoPath = Path.of("/usr/lib/debug/.build_id", dir, file + ".debug"); + debuginfoPath = Path.of("/usr/lib/debug/.build-id", dir, file + ".debug"); exists = Files.exists(debuginfoPath); } catch (NoSuchElementException _) { // return null if vDSO not found. diff --git a/test/micro/org/openjdk/bench/java/util/Base64EncodeToString.java b/test/micro/org/openjdk/bench/java/util/Base64EncodeToString.java new file mode 100644 index 00000000000..5b259230341 --- /dev/null +++ b/test/micro/org/openjdk/bench/java/util/Base64EncodeToString.java @@ -0,0 +1,55 @@ +/* + * 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 org.openjdk.micro.bench.java.util; + +import org.openjdk.jmh.annotations.*; + +import java.util.Base64; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@State(Scope.Benchmark) +@Warmup(iterations = 5, time = 2) +@Measurement(iterations = 5, time = 2) +@Fork(value = 2) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class Base64EncodeToString { + + private byte[] input; + + @Param({"10", "100", "1000", "10000"}) + private int inputSize; + + @Setup + public void setup() { + Random r = new Random(1123); + input = new byte[inputSize]; + r.nextBytes(input); + } + + @Benchmark + public String testEncodeToString() { + return Base64.getEncoder().encodeToString(input); + } +} + diff --git a/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithms.java b/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithms.java index 911494cb022..f60dfcb2d7c 100644 --- a/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithms.java +++ b/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithms.java @@ -51,13 +51,20 @@ import org.openjdk.jmh.annotations.*; @State(Scope.Thread) @Warmup(iterations = 5, time = 1) @Measurement(iterations = 3, time = 1) -@Fork(value = 5, jvmArgs = {"--add-modules=jdk.incubator.vector", "-XX:CompileCommand=inline,*VectorAlgorithmsImpl*::*"}) +@Fork(value = 1, jvmArgs = {"--add-modules=jdk.incubator.vector", "-XX:CompileCommand=inline,*VectorAlgorithmsImpl*::*"}) public class VectorAlgorithms { @Param({"640000"}) public int SIZE; + // Specifies the length of the arrays / number of elements in the container. @Param({"10000"}) public int NUM_X_OBJECTS; + // Number of simulated "objects" in the "reduceAddIFieldsX4" benchmark. + + @Param({"0.5"}) + public float BRANCH_PROBABILITY; + // Branch probability for the following benchmarks: + // - filterI @Param({"0"}) public int SEED; @@ -66,7 +73,7 @@ public class VectorAlgorithms { @Setup public void init() { - d = new VectorAlgorithmsImpl.Data(SIZE, SEED, NUM_X_OBJECTS); + d = new VectorAlgorithmsImpl.Data(SIZE, SEED, NUM_X_OBJECTS, BRANCH_PROBABILITY); } // ------------------------------------------------------------------------------------------ @@ -208,15 +215,15 @@ public class VectorAlgorithms { // Every invocation should have a different value for e, so that // we don't get branch-prediction that is too good. And also so // that the position where we exit is more evenly distributed. - d.eI_idx = (d.eI_idx + 1) & 0xffff; - int e = d.eI[d.eI_idx]; + d.eI_findI_idx = (d.eI_findI_idx + 1) & 0xffff; + int e = d.eI_findI[d.eI_findI_idx]; return VectorAlgorithmsImpl.findI_loop(d.aI, e); } @Benchmark public int findI_VectorAPI() { - d.eI_idx = (d.eI_idx + 1) & 0xffff; - int e = d.eI[d.eI_idx]; + d.eI_findI_idx = (d.eI_findI_idx + 1) & 0xffff; + int e = d.eI_findI[d.eI_findI_idx]; return VectorAlgorithmsImpl.findI_VectorAPI(d.aI, e); } @@ -235,16 +242,27 @@ public class VectorAlgorithms { // Every invocation should have a different value for e, so that // we don't get branch-prediction that is too good. And also so // That the length of the resulting data is more evenly distributed. - d.eI_idx = (d.eI_idx + 1) & 0xffff; - int e = d.eI[d.eI_idx]; - return VectorAlgorithmsImpl.filterI_loop(d.aI, d.rI1, e); + return VectorAlgorithmsImpl.filterI_loop(d.aI_filterI, d.rI1, d.eI_filterI); } @Benchmark - public Object filterI_VectorAPI() { - d.eI_idx = (d.eI_idx + 1) & 0xffff; - int e = d.eI[d.eI_idx]; - return VectorAlgorithmsImpl.filterI_VectorAPI(d.aI, d.rI1, e); + public Object filterI_VectorAPI_v1() { + return VectorAlgorithmsImpl.filterI_VectorAPI_v1(d.aI_filterI, d.rI1, d.eI_filterI); + } + + @Benchmark + public Object filterI_VectorAPI_v2_l2() { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l2(d.aI_filterI, d.rI1, d.eI_filterI); + } + + @Benchmark + public Object filterI_VectorAPI_v2_l4() { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l4(d.aI_filterI, d.rI1, d.eI_filterI); + } + + @Benchmark + public Object filterI_VectorAPI_v2_l8() { + return VectorAlgorithmsImpl.filterI_VectorAPI_v2_l8(d.aI_filterI, d.rI1, d.eI_filterI); } @Benchmark @@ -271,4 +289,34 @@ public class VectorAlgorithms { public Object lowerCaseB_VectorAPI_v2() { return VectorAlgorithmsImpl.lowerCaseB_VectorAPI_v2(d.strB, d.rB1); } + + @Benchmark + public Object conditionalSumB_loop() { + return VectorAlgorithmsImpl.conditionalSumB_loop(d.strB); + } + + @Benchmark + public Object conditionalSumB_VectorAPI_v1() { + return VectorAlgorithmsImpl.conditionalSumB_VectorAPI_v1(d.strB); + } + + @Benchmark + public Object conditionalSumB_VectorAPI_v2() { + return VectorAlgorithmsImpl.conditionalSumB_VectorAPI_v2(d.strB); + } + + @Benchmark + public float[] pieceWise2FunctionF_loop() { + return VectorAlgorithmsImpl.pieceWise2FunctionF_loop(d.xF, d.rF1); + } + + @Benchmark + public float[] pieceWise2FunctionF_VectorAPI_v1() { + return VectorAlgorithmsImpl.pieceWise2FunctionF_VectorAPI_v1(d.xF, d.rF1); + } + + @Benchmark + public float[] pieceWise2FunctionF_VectorAPI_v2() { + return VectorAlgorithmsImpl.pieceWise2FunctionF_VectorAPI_v2(d.xF, d.rF1); + } } diff --git a/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithmsImpl.java b/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithmsImpl.java index 5ab057329d3..3ae4ed81634 100644 --- a/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithmsImpl.java +++ b/test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithmsImpl.java @@ -36,6 +36,8 @@ public class VectorAlgorithmsImpl { private static final VectorSpecies SPECIES_I = IntVector.SPECIES_PREFERRED; private static final VectorSpecies SPECIES_I512 = IntVector.SPECIES_512; private static final VectorSpecies SPECIES_I256 = IntVector.SPECIES_256; + private static final VectorSpecies SPECIES_I128 = IntVector.SPECIES_128; + private static final VectorSpecies SPECIES_I64 = IntVector.SPECIES_64; private static final VectorSpecies SPECIES_B = ByteVector.SPECIES_PREFERRED; private static final VectorSpecies SPECIES_B64 = ByteVector.SPECIES_64; private static final VectorSpecies SPECIES_F = FloatVector.SPECIES_PREFERRED; @@ -58,15 +60,31 @@ public class VectorAlgorithmsImpl { public int[] rI2; public int[] rI3; public int[] rI4; - public int[] eI; + public int[] rI5; + + // Search element for "findI" + public int[] eI_findI; // The test has to use the same index into eI for all implementations. But in the // benchmark, we'd like to use random indices, so we use the index to advance through // the array. - public int eI_idx = 0; + public int eI_findI_idx = 0; + + // Data and threshold eI value for "filterI". + // We create the data in a range, and then pick a threshold scaled to that range, + // so that the branch in the filter is branchProbability. + public int[] aI_filterI; + public int eI_filterI; public float[] aF; public float[] bF; + // Input for piece-wise functions. + // Uniform [0..1[ with probability p and Uniform [1..2[ with probability (1-p) + public float[] xF; + public float[] rF1; + public float[] rF2; + public float[] rF3; + public byte[] aB; public byte[] strB; public byte[] rB1; @@ -76,7 +94,7 @@ public class VectorAlgorithmsImpl { public int[] oopsX4; public int[] memX4; - public Data(int size, int seed, int numX4Objects) { + public Data(int size, int seed, int numX4Objects, float branchProbability) { Random random = new Random(seed); // int: one input array and multiple output arrays so different implementations can @@ -86,14 +104,20 @@ public class VectorAlgorithmsImpl { rI2 = new int[size]; rI3 = new int[size]; rI4 = new int[size]; + rI5 = new int[size]; Arrays.setAll(aI, i -> random.nextInt()); // Populate with some random values from aI, and some totally random values. - eI = new int[0x10000]; - for (int i = 0; i < eI.length; i++) { - eI[i] = (random.nextInt(10) == 0) ? random.nextInt() : aI[random.nextInt(size)]; + eI_findI = new int[0x10000]; + for (int i = 0; i < eI_findI.length; i++) { + eI_findI[i] = (random.nextInt(10) == 0) ? random.nextInt() : aI[random.nextInt(size)]; } + int filterI_range = 1000_000; + aI_filterI = new int[size]; + Arrays.setAll(aI_filterI, i -> random.nextInt(filterI_range)); + eI_filterI = (int)(filterI_range * (1.0f - branchProbability)); + // X4 oop setup. // oopsX4 holds "addresses" (i.e. indices), that point to the 16-byte objects in memX4. oopsX4 = new int[size]; @@ -117,14 +141,30 @@ public class VectorAlgorithmsImpl { bF[i] = random.nextInt(32) - 16; } + xF = new float[size]; + rF1 = new float[size]; + rF2 = new float[size]; + rF3 = new float[size]; + for (int i = 0; i < size; i++) { + xF[i] = (random.nextFloat() < branchProbability) + ? 0f + random.nextFloat() + : 1f + random.nextFloat(); + } + // byte: just random data. aB = new byte[size]; - strB = new byte[size]; rB1 = new byte[size]; rB2 = new byte[size]; rB3 = new byte[size]; random.nextBytes(aB); - random.nextBytes(strB); // TODO: special data! + + // byte string: for lowerCase benchmark. + strB = new byte[size]; + for (int i = 0; i < size; i++) { + strB[i] = (random.nextFloat() < branchProbability) + ? (byte)(random.nextInt(16) + 'A') + : (byte)(random.nextInt(16) + 'a'); + } } } @@ -651,13 +691,12 @@ public class VectorAlgorithmsImpl { return r; } - public static Object filterI_VectorAPI(int[] a, int[] r, int threshold) { - var thresholds = IntVector.broadcast(SPECIES_I, threshold); + public static Object filterI_VectorAPI_v1(int[] a, int[] r, int threshold) { int j = 0; int i = 0; for (; i < SPECIES_I.loopBound(a.length); i += SPECIES_I.length()) { IntVector v = IntVector.fromArray(SPECIES_I, a, i); - var mask = v.compare(VectorOperators.GE, thresholds); + var mask = v.compare(VectorOperators.GE, threshold); v = v.compress(mask); int trueCount = mask.trueCount(); var prefixMask = mask.compress(); @@ -676,6 +715,98 @@ public class VectorAlgorithmsImpl { return r; } + // Idea: on platforms that do not support the "v1" solution with "compress" and + // masked stores, we struggle to deal with the loop-carried dependency of j. + // But we can still use dynamic uniformity to enable some vectorized performance. + public static Object filterI_VectorAPI_v2_l2(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I64.loopBound(a.length); i += SPECIES_I64.length()) { + IntVector v = IntVector.fromArray(SPECIES_I64, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 2; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + + public static Object filterI_VectorAPI_v2_l4(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I128.loopBound(a.length); i += SPECIES_I128.length()) { + IntVector v = IntVector.fromArray(SPECIES_I128, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 4; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + if (mask.laneIsSet(2)) { r[j++] = v.lane(2); } + if (mask.laneIsSet(3)) { r[j++] = v.lane(3); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + + public static Object filterI_VectorAPI_v2_l8(int[] a, int[] r, int threshold) { + int j = 0; + int i = 0; + for (; i < SPECIES_I256.loopBound(a.length); i += SPECIES_I256.length()) { + IntVector v = IntVector.fromArray(SPECIES_I256, a, i); + var mask = v.compare(VectorOperators.GE, threshold); + if (mask.allTrue()) { + v.intoArray(r, j); + j += 8; + } else if (mask.anyTrue()) { + if (mask.laneIsSet(0)) { r[j++] = v.lane(0); } + if (mask.laneIsSet(1)) { r[j++] = v.lane(1); } + if (mask.laneIsSet(2)) { r[j++] = v.lane(2); } + if (mask.laneIsSet(3)) { r[j++] = v.lane(3); } + if (mask.laneIsSet(4)) { r[j++] = v.lane(4); } + if (mask.laneIsSet(5)) { r[j++] = v.lane(5); } + if (mask.laneIsSet(6)) { r[j++] = v.lane(6); } + if (mask.laneIsSet(7)) { r[j++] = v.lane(7); } + } else { + // nothing + } + } + for (; i < a.length; i++) { + int ai = a[i]; + if (ai >= threshold) { + r[j++] = ai; + } + } + // Just force the resulting length onto the same array. + r[r.length - 1] = j; + return r; + } + // X4: ints simulate 4-byte oops. // oops: if non-zero (= non-null), every entry simulates a 4-byte oop, pointing into mem. // mem: an int array that simulates the memory. @@ -771,5 +902,176 @@ public class VectorAlgorithmsImpl { } return r; } -} + public static int conditionalSumB_loop(byte[] a) { + int sum = 0; + for (int i = 0; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + + public static int conditionalSumB_VectorAPI_v1(byte[] a) { + return ConditionalSumB_VectorAPI_V1.compute(a); + } + + private static class ConditionalSumB_VectorAPI_V1 { + // Pick I species to be a full vector, and the B vector a quarter its bit length. + // However, we have to get at least 64bits for the B vector, so at least 256bits + // for the int vector - a sad restriction by the currently very narrow range of + // supported shapes. + private static final int BITS_I = Math.max(256, IntVector.SPECIES_PREFERRED.vectorBitSize()); + private static final int BITS_B = BITS_I / 4; + private static final VectorShape SHAPE_I = VectorShape.forBitSize(BITS_I); + private static final VectorShape SHAPE_B = VectorShape.forBitSize(BITS_B); + private static final VectorSpecies SPECIES_I = SHAPE_I.withLanes(int.class); + private static final VectorSpecies SPECIES_B = SHAPE_B.withLanes(byte.class); + + public static int compute(byte[] a) { + var zeroB = ByteVector.zero(SPECIES_B); + var accI = IntVector.zero(SPECIES_I); + int i; + for (i = 0; i < SPECIES_B.loopBound(a.length); i += SPECIES_B.length()) { + var vB = ByteVector.fromArray(SPECIES_B, a, i); + var maskA = vB.compare(VectorOperators.GE, (byte)'A'); + var maskZ = vB.compare(VectorOperators.LE, (byte)'Z'); + var mask = maskA.and(maskZ); + vB = zeroB.blend(vB, mask); + var vI = vB.castShape(SPECIES_I, 0); + accI = accI.add(vI); + } + int sum = accI.reduceLanes(VectorOperators.ADD); + for (; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + } + + public static int conditionalSumB_VectorAPI_v2(byte[] a) { + return ConditionalSumB_VectorAPI_V2.compute(a); + } + + private static class ConditionalSumB_VectorAPI_V2 { + // Pick B species to be a full vector, and use 4 I vectors of the same bit size. + private static final VectorSpecies SPECIES_B = ByteVector.SPECIES_PREFERRED; + private static final VectorSpecies SPECIES_I = SPECIES_B.vectorShape().withLanes(int.class); + + public static int compute(byte[] a) { + var zeroB = ByteVector.zero(SPECIES_B); + var accI = IntVector.zero(SPECIES_I); + int i; + for (i = 0; i < SPECIES_B.loopBound(a.length); i += SPECIES_B.length()) { + var vB = ByteVector.fromArray(SPECIES_B, a, i); + var maskA = vB.compare(VectorOperators.GE, (byte)'A'); + var maskZ = vB.compare(VectorOperators.LE, (byte)'Z'); + var mask = maskA.and(maskZ); + vB = zeroB.blend(vB, mask); + // When casting byte->int, we get 4x the bits, and split them into 4 parts. + var vI0 = vB.castShape(SPECIES_I, 0); + var vI1 = vB.castShape(SPECIES_I, 1); + var vI2 = vB.castShape(SPECIES_I, 2); + var vI3 = vB.castShape(SPECIES_I, 3); + accI = accI.add(vI0.add(vI1).add(vI2).add(vI3)); + } + int sum = accI.reduceLanes(VectorOperators.ADD); + for (; i < a.length; i++) { + byte c = a[i]; + if (c >= 'A' && c <= 'Z') { + sum += c; + } + } + return sum; + } + } + + public static float[] pieceWise2FunctionF_loop(float[] a, float[] r) { + for (int i = 0; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } + + public static float[] pieceWise2FunctionF_VectorAPI_v1(float[] a, float[] r) { + int i; + for (i = 0; i < SPECIES_F.loopBound(a.length); i += SPECIES_F.length()) { + var ai = FloatVector.fromArray(SPECIES_F, a, i); + var mask = ai.compare(VectorOperators.LT, 1f); + var a2 = ai.lanewise(VectorOperators.MUL, ai); + var a4 = a2.lanewise(VectorOperators.MUL, a2); + var a8 = a4.lanewise(VectorOperators.MUL, a4); + var s2 = ai.lanewise(VectorOperators.SQRT); + var s4 = s2.lanewise(VectorOperators.SQRT); + var s8 = s4.lanewise(VectorOperators.SQRT); + var v = s8.blend(a8, mask); + v.intoArray(r, i); + } + for (; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } + + public static float[] pieceWise2FunctionF_VectorAPI_v2(float[] a, float[] r) { + int i; + for (i = 0; i < SPECIES_F.loopBound(a.length); i += SPECIES_F.length()) { + var ai = FloatVector.fromArray(SPECIES_F, a, i); + var mask = ai.compare(VectorOperators.LT, 1f); + var a2 = ai.lanewise(VectorOperators.MUL, ai); + var a4 = a2.lanewise(VectorOperators.MUL, a2); + var a8 = a4.lanewise(VectorOperators.MUL, a4); + var v = a8; + // SQRT is expensive, so only call if it necessary + if (!mask.allTrue()) { + var s2 = ai.lanewise(VectorOperators.SQRT); + var s4 = s2.lanewise(VectorOperators.SQRT); + var s8 = s4.lanewise(VectorOperators.SQRT); + v = s8.blend(a8, mask); + } + v.intoArray(r, i); + } + for (; i < a.length; i++) { + float ai = a[i]; + if (ai < 1f) { + float a2 = ai * ai; + float a4 = a2 * a2; + float a8 = a4 * a4; + r[i] = a8; + } else { + float s2 = (float)Math.sqrt(ai); + float s4 = (float)Math.sqrt(s2); + float s8 = (float)Math.sqrt(s4); + r[i] = s8; + } + } + return r; + } +}