Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/hotspot/cpu/x86/macroAssembler_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2897,7 +2897,8 @@ void MacroAssembler::vbroadcastss(XMMRegister dst, AddressLiteral src, int vecto
// vblendvps(XMMRegister dst, XMMRegister nds, XMMRegister src, XMMRegister mask, int vector_len, bool compute_mask = true, XMMRegister scratch = xnoreg)
void MacroAssembler::vblendvps(XMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister mask, int vector_len, bool compute_mask, XMMRegister scratch) {
// WARN: Allow dst == (src1|src2), mask == scratch
bool blend_emulation = EnableX86ECoreOpts && UseAVX > 1;
bool blend_emulation = EnableX86ECoreOpts && UseAVX > 1 &&
!(VM_Version::is_intel_darkmont() && (dst == src1)); // partially fixed on Darkmont
bool scratch_available = scratch != xnoreg && scratch != src1 && scratch != src2 && scratch != dst;
bool dst_available = dst != mask && (dst != src1 || dst != src2);
if (blend_emulation && scratch_available && dst_available) {
Expand All @@ -2921,7 +2922,8 @@ void MacroAssembler::vblendvps(XMMRegister dst, XMMRegister src1, XMMRegister sr
// vblendvpd(XMMRegister dst, XMMRegister nds, XMMRegister src, XMMRegister mask, int vector_len, bool compute_mask = true, XMMRegister scratch = xnoreg)
void MacroAssembler::vblendvpd(XMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister mask, int vector_len, bool compute_mask, XMMRegister scratch) {
// WARN: Allow dst == (src1|src2), mask == scratch
bool blend_emulation = EnableX86ECoreOpts && UseAVX > 1;
bool blend_emulation = EnableX86ECoreOpts && UseAVX > 1 &&
!(VM_Version::is_intel_darkmont() && (dst == src1)); // partially fixed on Darkmont
bool scratch_available = scratch != xnoreg && scratch != src1 && scratch != src2 && scratch != dst && (!compute_mask || scratch != mask);
bool dst_available = dst != mask && (dst != src1 || dst != src2);
if (blend_emulation && scratch_available && dst_available) {
Expand Down
4 changes: 4 additions & 0 deletions src/hotspot/cpu/x86/vm_version_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2081,6 +2081,10 @@ bool VM_Version::is_intel_cascade_lake() {
return is_intel_skylake() && _stepping >= 5;
}

bool VM_Version::is_intel_darkmont() {
return is_intel() && is_intel_server_family() && (_model == 0xCC || _model == 0xDD);
}

// avx3_threshold() sets the threshold at which 64-byte instructions are used
// for implementing the array copy and clear operations.
// The Intel platforms that supports the serialize instruction
Expand Down
2 changes: 2 additions & 0 deletions src/hotspot/cpu/x86/vm_version_x86.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,8 @@ class VM_Version : public Abstract_VM_Version {

static bool is_intel_cascade_lake();

static bool is_intel_darkmont();

static int avx3_threshold();

static bool is_intel_tsc_synched_at_init();
Expand Down