diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 911fa5073c36d..9d91a597b2357 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -1997,9 +1997,14 @@ void CallArgs::Remove(CallArg* arg) // bool GenTreeCall::NeedsVzeroupper(Compiler* comp) { + if (!comp->canUseVexEncoding()) + { + return false; + } + bool needsVzeroupper = false; - if (IsPInvoke() && comp->canUseVexEncoding()) + if (IsPInvoke()) { // The Intel optimization manual guidance in `3.11.5.3 Fixing Instruction Slowdowns` states: // Insert a VZEROUPPER to tell the hardware that the state of the higher registers is clean @@ -2028,6 +2033,7 @@ bool GenTreeCall::NeedsVzeroupper(Compiler* comp) if (varTypeUsesFloatReg(this)) { needsVzeroupper = true; + break; } else { @@ -2050,6 +2056,13 @@ bool GenTreeCall::NeedsVzeroupper(Compiler* comp) } } + // Other special cases + // + if (!needsVzeroupper && IsHelperCall(comp, CORINFO_HELP_BULK_WRITEBARRIER)) + { + needsVzeroupper = true; + } + return needsVzeroupper; } #endif // TARGET_XARCH