diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp b/src/hotspot/cpu/x86/assembler_x86.cpp index 9482537d84f..920b3e32fe2 100644 --- a/src/hotspot/cpu/x86/assembler_x86.cpp +++ b/src/hotspot/cpu/x86/assembler_x86.cpp @@ -6135,7 +6135,7 @@ void Assembler::smovl() { void Assembler::roundsd(XMMRegister dst, XMMRegister src, int32_t rmode) { assert(VM_Version::supports_sse4_1(), ""); InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false); - int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes); + int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes); emit_int24(0x0B, (0xC0 | encode), (unsigned char)rmode); } diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index 6df02d280bc..eb6701f82a7 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -3874,22 +3874,14 @@ instruct roundD_reg(legRegD dst, legRegD src, immU8 rmode) %{ ins_cost(150); ins_encode %{ assert(UseSSE >= 4, "required"); + if ((UseAVX == 0) && ($dst$$XMMRegister != $src$$XMMRegister)) { + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + } __ roundsd($dst$$XMMRegister, $src$$XMMRegister, $rmode$$constant); %} ins_pipe(pipe_slow); %} -instruct roundD_mem(legRegD dst, memory src, immU8 rmode) %{ - match(Set dst (RoundDoubleMode (LoadD src) rmode)); - format %{ "roundsd $dst,$src" %} - ins_cost(150); - ins_encode %{ - assert(UseSSE >= 4, "required"); - __ roundsd($dst$$XMMRegister, $src$$Address, $rmode$$constant); - %} - ins_pipe(pipe_slow); -%} - instruct roundD_imm(legRegD dst, immD con, immU8 rmode) %{ match(Set dst (RoundDoubleMode con rmode)); format %{ "roundsd $dst,[$constantaddress]\t# load from constant table: double=$con" %} diff --git a/test/micro/org/openjdk/bench/java/lang/MathBench.java b/test/micro/org/openjdk/bench/java/lang/MathBench.java index c7dde019154..fe461ee3f9c 100644 --- a/test/micro/org/openjdk/bench/java/lang/MathBench.java +++ b/test/micro/org/openjdk/bench/java/lang/MathBench.java @@ -141,6 +141,11 @@ public class MathBench { return Math.ceil(double4Dot1); } + @Benchmark + public double addCeilFloorDouble() { + return Math.ceil(double4Dot1) + Math.floor(double4Dot1); + } + @Benchmark public double copySignDouble() { return Math.copySign(double81, doubleNegative12);