Skip to content

Commit 361d538

Browse files
author
duke
committed
Automatic merge of jdk:master into master
2 parents fac723a + 0df8c96 commit 361d538

27 files changed

+648
-12
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,6 +2867,17 @@ void Assembler::mov(Register dst, Register src) {
28672867
movq(dst, src);
28682868
}
28692869

2870+
void Assembler::movapd(XMMRegister dst, Address src) {
2871+
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2872+
InstructionMark im(this);
2873+
InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
2874+
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
2875+
attributes.set_rex_vex_w_reverted();
2876+
simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
2877+
emit_int8(0x28);
2878+
emit_operand(dst, src, 0);
2879+
}
2880+
28702881
void Assembler::movapd(XMMRegister dst, XMMRegister src) {
28712882
int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;
28722883
InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -8072,6 +8083,14 @@ void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, int vector
80728083
emit_operand(dst, src, 0);
80738084
}
80748085

8086+
void Assembler::orpd(XMMRegister dst, XMMRegister src) {
8087+
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
8088+
InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
8089+
attributes.set_rex_vex_w_reverted();
8090+
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
8091+
emit_int16(0x56, (0xC0 | encode));
8092+
}
8093+
80758094
void Assembler::unpckhpd(XMMRegister dst, XMMRegister src) {
80768095
InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
80778096
attributes.set_rex_vex_w_reverted();

src/hotspot/cpu/x86/assembler_x86.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,7 @@ class Assembler : public AbstractAssembler {
950950
// New cpus require use of movaps and movapd to avoid partial register stall
951951
// when moving between registers.
952952
void movaps(XMMRegister dst, XMMRegister src);
953+
void movapd(XMMRegister dst, Address src);
953954
void movapd(XMMRegister dst, XMMRegister src);
954955

955956
// End avoid using directly
@@ -2450,6 +2451,9 @@ class Assembler : public AbstractAssembler {
24502451
void vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
24512452
void vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
24522453

2454+
// Bitwise Logical OR of Packed Floating-Point Values
2455+
void orpd(XMMRegister dst, XMMRegister src);
2456+
24532457
void unpckhpd(XMMRegister dst, XMMRegister src);
24542458
void unpcklpd(XMMRegister dst, XMMRegister src);
24552459

src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,8 @@ void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
720720
if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog ||
721721
x->id() == vmIntrinsics::_dpow || x->id() == vmIntrinsics::_dcos ||
722722
x->id() == vmIntrinsics::_dsin || x->id() == vmIntrinsics::_dtan ||
723-
x->id() == vmIntrinsics::_dlog10 || x->id() == vmIntrinsics::_dtanh
723+
x->id() == vmIntrinsics::_dlog10 || x->id() == vmIntrinsics::_dtanh ||
724+
x->id() == vmIntrinsics::_dcbrt
724725
) {
725726
do_LibmIntrinsic(x);
726727
return;
@@ -807,7 +808,7 @@ void LIRGenerator::do_LibmIntrinsic(Intrinsic* x) {
807808
}
808809
break;
809810
case vmIntrinsics::_dpow:
810-
if (StubRoutines::dpow() != nullptr) {
811+
if (StubRoutines::dpow() != nullptr) {
811812
__ call_runtime_leaf(StubRoutines::dpow(), getThreadTemp(), result_reg, cc->args());
812813
} else {
813814
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dpow), getThreadTemp(), result_reg, cc->args());
@@ -828,18 +829,24 @@ void LIRGenerator::do_LibmIntrinsic(Intrinsic* x) {
828829
}
829830
break;
830831
case vmIntrinsics::_dtan:
831-
if (StubRoutines::dtan() != nullptr) {
832+
if (StubRoutines::dtan() != nullptr) {
832833
__ call_runtime_leaf(StubRoutines::dtan(), getThreadTemp(), result_reg, cc->args());
833834
} else {
834835
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), getThreadTemp(), result_reg, cc->args());
835836
}
836837
break;
837838
case vmIntrinsics::_dtanh:
838-
assert(StubRoutines::dtanh() != nullptr, "tanh intrinsic not found");
839-
if (StubRoutines::dtanh() != nullptr) {
839+
assert(StubRoutines::dtanh() != nullptr, "tanh intrinsic not found");
840+
if (StubRoutines::dtanh() != nullptr) {
840841
__ call_runtime_leaf(StubRoutines::dtanh(), getThreadTemp(), result_reg, cc->args());
841842
}
842843
break;
844+
case vmIntrinsics::_dcbrt:
845+
assert(StubRoutines::dcbrt() != nullptr, "cbrt intrinsic not found");
846+
if (StubRoutines::dcbrt() != nullptr) {
847+
__ call_runtime_leaf(StubRoutines::dcbrt(), getThreadTemp(), result_reg, cc->args());
848+
}
849+
break;
843850
default: ShouldNotReachHere();
844851
}
845852

src/hotspot/cpu/x86/macroAssembler_x86.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,6 +2250,16 @@ void MacroAssembler::evmovdqaq(XMMRegister dst, AddressLiteral src, int vector_l
22502250
}
22512251
}
22522252

2253+
void MacroAssembler::movapd(XMMRegister dst, AddressLiteral src, Register rscratch) {
2254+
assert(rscratch != noreg || always_reachable(src), "missing");
2255+
2256+
if (reachable(src)) {
2257+
Assembler::movapd(dst, as_Address(src));
2258+
} else {
2259+
lea(rscratch, src);
2260+
Assembler::movapd(dst, Address(rscratch, 0));
2261+
}
2262+
}
22532263

22542264
void MacroAssembler::movdqa(XMMRegister dst, AddressLiteral src, Register rscratch) {
22552265
assert(rscratch != noreg || always_reachable(src), "missing");

src/hotspot/cpu/x86/macroAssembler_x86.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -995,6 +995,8 @@ class MacroAssembler: public Assembler {
995995
void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
996996
void andpd(XMMRegister dst, AddressLiteral src, Register rscratch = noreg);
997997

998+
void andnpd(XMMRegister dst, XMMRegister src) { Assembler::andnpd(dst, src); }
999+
9981000
void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); }
9991001
void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); }
10001002
void andps(XMMRegister dst, AddressLiteral src, Register rscratch = noreg);
@@ -1007,6 +1009,8 @@ class MacroAssembler: public Assembler {
10071009
void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
10081010
void comisd(XMMRegister dst, AddressLiteral src, Register rscratch = noreg);
10091011

1012+
void orpd(XMMRegister dst, XMMRegister src) { Assembler::orpd(dst, src); }
1013+
10101014
void cmp32_mxcsr_std(Address mxcsr_save, Register tmp, Register rscratch = noreg);
10111015
void ldmxcsr(Address src) { Assembler::ldmxcsr(src); }
10121016
void ldmxcsr(AddressLiteral src, Register rscratch = noreg);
@@ -1241,6 +1245,9 @@ class MacroAssembler: public Assembler {
12411245
void evmovdquq(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register rscratch = noreg);
12421246
void evmovdqaq(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register rscratch = noreg);
12431247

1248+
using Assembler::movapd;
1249+
void movapd(XMMRegister dst, AddressLiteral src, Register rscratch = noreg);
1250+
12441251
// Move Aligned Double Quadword
12451252
void movdqa(XMMRegister dst, XMMRegister src) { Assembler::movdqa(dst, src); }
12461253
void movdqa(XMMRegister dst, Address src) { Assembler::movdqa(dst, src); }

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3692,6 +3692,9 @@ void StubGenerator::generate_libm_stubs() {
36923692
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtanh)) {
36933693
StubRoutines::_dtanh = generate_libmTanh(); // from stubGenerator_x86_64_tanh.cpp
36943694
}
3695+
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dcbrt)) {
3696+
StubRoutines::_dcbrt = generate_libmCbrt(); // from stubGenerator_x86_64_cbrt.cpp
3697+
}
36953698
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dexp)) {
36963699
StubRoutines::_dexp = generate_libmExp(); // from stubGenerator_x86_64_exp.cpp
36973700
}

src/hotspot/cpu/x86/stubGenerator_x86_64.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,7 @@ class StubGenerator: public StubCodeGenerator {
556556
address generate_libmCos();
557557
address generate_libmTan();
558558
address generate_libmTanh();
559+
address generate_libmCbrt();
559560
address generate_libmExp();
560561
address generate_libmPow();
561562
address generate_libmLog();

0 commit comments

Comments
 (0)