<div dir="ltr">Elena, what do you think? I don't think we should keep adding a Proc metafeature for every Intel CPU. I have a patch that just uses !listconcat to inherit features. I'll post it later tonight.</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 8, 2016 at 7:14 AM, Eric Christopher <span dir="ltr"><<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Wrapper subtracted features are definitely the wrong way to do this. A feature should be as atomic as possible. </p>
<br><div class="gmail_quote"><div dir="ltr">On Sun, Feb 7, 2016, 5:50 PM Craig Topper via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Sorry I'm a bit late to this. Is there a way we can inherit features from one project to the next without creating wrapper SubtargetFeatures? Can we just pass like an inherited list and new feature list and !listconcat them when creating each processor? I don't like the idea of these wrapper processor feature sets. I don't like the SLM and Atom ones we already had. It always felt like the checks that were based on Atom/SLM should be based on -mcpu or -march and not a "feature". I don't think its a good idea to encourage more of this.<div><br></div><div>PowerPC does something like this</div><div><br></div><div><div>def ProcessorFeatures {</div><div> list<SubtargetFeature> Power7FeatureList =</div><div> [DirectivePwr7, FeatureAltivec, FeatureVSX,</div><div> FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE,</div><div> FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES,</div><div> FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX,</div><div> FeatureFPRND, FeatureFPCVT, FeatureISEL,</div><div> FeaturePOPCNTD, FeatureCMPB, FeatureLDBRX,</div><div> Feature64Bit /*, Feature64BitRegs */,</div><div> FeatureBPERMD, FeatureExtDiv,</div><div> FeatureMFTB, DeprecatedDST];</div><div> list<SubtargetFeature> Power8SpecificFeatures =</div><div> [DirectivePwr8, FeatureP8Altivec, FeatureP8Vector, FeatureP8Crypto,</div><div> FeatureHTM, FeatureDirectMove, FeatureICBT, FeaturePartwordAtomic,</div><div> FeatureFusion];</div><div> list<SubtargetFeature> Power8FeatureList =</div><div> !listconcat(Power7FeatureList, Power8SpecificFeatures);</div><div>}</div></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 24, 2016 at 2:41 AM, Elena Demikhovsky via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: delena<br>
Date: Sun Jan 24 04:41:28 2016<br>
New Revision: 258659<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=258659&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=258659&view=rev</a><br>
Log:<br>
Added Skylake client to X86 targets and features<br>
<br>
Changes in X86.td:<br>
<br>
I set features of Intel processors in incremental form: IVB = SNB + X HSW = IVB + X ..<br>
I added Skylake client processor and defined it's features<br>
FeatureADX was missing on KNL<br>
Added some new features to appropriate processors SMAP, IFMA, PREFETCHWT1, VMFUNC and others<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D16357" rel="noreferrer" target="_blank">http://reviews.llvm.org/D16357</a><br>
<br>
<br>
Modified:<br>
llvm/trunk/lib/Support/Host.cpp<br>
llvm/trunk/lib/Target/X86/X86.td<br>
llvm/trunk/lib/Target/X86/X86InstrInfo.td<br>
llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br>
llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll<br>
<br>
Modified: llvm/trunk/lib/Support/Host.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/Host.cpp (original)<br>
+++ llvm/trunk/lib/Support/Host.cpp Sun Jan 24 04:41:28 2016<br>
@@ -805,25 +805,34 @@ bool sys::getHostCPUFeatures(StringMap<b<br>
Features["avx2"] = HasAVXSave && HasLeaf7 && ((EBX >> 5) & 1);<br>
<br>
Features["fsgsbase"] = HasLeaf7 && ((EBX >> 0) & 1);<br>
+ Features["sgx"] = HasLeaf7 && ((EBX >> 2) & 1);<br>
Features["bmi"] = HasLeaf7 && ((EBX >> 3) & 1);<br>
Features["hle"] = HasLeaf7 && ((EBX >> 4) & 1);<br>
Features["bmi2"] = HasLeaf7 && ((EBX >> 8) & 1);<br>
+ Features["invpcid"] = HasLeaf7 && ((EBX >> 10) & 1);<br>
Features["rtm"] = HasLeaf7 && ((EBX >> 11) & 1);<br>
Features["rdseed"] = HasLeaf7 && ((EBX >> 18) & 1);<br>
Features["adx"] = HasLeaf7 && ((EBX >> 19) & 1);<br>
+ Features["smap"] = HasLeaf7 && ((EBX >> 20) & 1);<br>
+ Features["pcommit"] = HasLeaf7 && ((EBX >> 22) & 1);<br>
+ Features["clflushopt"] = HasLeaf7 && ((EBX >> 23) & 1);<br>
+ Features["clwb"] = HasLeaf7 && ((EBX >> 24) & 1);<br>
Features["sha"] = HasLeaf7 && ((EBX >> 29) & 1);<br>
- // Enable protection keys<br>
- Features["pku"] = HasLeaf7 && ((ECX >> 4) & 1);<br>
<br>
// AVX512 is only supported if the OS supports the context save for it.<br>
Features["avx512f"] = HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save;<br>
Features["avx512dq"] = HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save;<br>
+ Features["avx512ifma"] = HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save;<br>
Features["avx512pf"] = HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save;<br>
Features["avx512er"] = HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save;<br>
Features["avx512cd"] = HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save;<br>
Features["avx512bw"] = HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save;<br>
Features["avx512vl"] = HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save;<br>
- Features["avx512vbmi"] = HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save;<br>
+<br>
+ Features["prefetchwt1"] = HasLeaf7 && (ECX & 1);<br>
+ Features["avx512vbmi"] = HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save;<br>
+ // Enable protection keys<br>
+ Features["pku"] = HasLeaf7 && ((ECX >> 4) & 1);<br>
<br>
bool HasLeafD = MaxLevel >= 0xd &&<br>
!GetX86CpuIDAndInfoEx(0xd, 0x1, &EAX, &EBX, &ECX, &EDX);<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86.td Sun Jan 24 04:41:28 2016<br>
@@ -125,6 +125,9 @@ def FeatureCDI : SubtargetFeature<"<br>
def FeaturePFI : SubtargetFeature<"avx512pf", "HasPFI", "true",<br>
"Enable AVX-512 PreFetch Instructions",<br>
[FeatureAVX512]>;<br>
+def FeaturePREFETCHWT1 : SubtargetFeature<"prefetchwt1", "HasPFPREFETCHWT1",<br>
+ "true",<br>
+ "Prefetch with Intent to Write and T1 Hint">;<br>
def FeatureDQI : SubtargetFeature<"avx512dq", "HasDQI", "true",<br>
"Enable AVX-512 Doubleword and Quadword Instructions",<br>
[FeatureAVX512]>;<br>
@@ -137,6 +140,9 @@ def FeatureVLX : SubtargetFeature<"a<br>
def FeatureVBMI : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",<br>
"Enable AVX-512 Vector Bit Manipulation Instructions",<br>
[FeatureAVX512]>;<br>
+def FeatureIFMA : SubtargetFeature<"ifma", "HasIFMA", "true",<br>
+ "Enable AVX-512 Integer Fused Multiple-Add",<br>
+ [FeatureAVX512]>;<br>
def FeaturePKU : SubtargetFeature<"pku", "HasPKU", "true",<br>
"Enable protection keys">;<br>
def FeaturePCLMUL : SubtargetFeature<"pclmul", "HasPCLMUL", "true",<br>
@@ -202,6 +208,20 @@ def FeatureSlowDivide64 : SubtargetFeatu<br>
def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",<br>
"PadShortFunctions", "true",<br>
"Pad short functions">;<br>
+def FeatureINVPCID : SubtargetFeature<"invpcid", "HasInvPCId", "true",<br>
+ "Invalidate Process-Context Identifier">;<br>
+def FeatureVMFUNC : SubtargetFeature<"vmfunc", "HasVMFUNC", "true",<br>
+ "VM Functions">;<br>
+def FeatureSMAP : SubtargetFeature<"smap", "HasSMAP", "true",<br>
+ "Supervisor Mode Access Protection">;<br>
+def FeatureSGX : SubtargetFeature<"sgx", "HasSGX", "true",<br>
+ "Enable Software Guard Extensions">;<br>
+def FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",<br>
+ "Flush A Cache Line Optimized">;<br>
+def FeaturePCOMMIT : SubtargetFeature<"pcommit", "HasPCOMMIT", "true",<br>
+ "Enable Persistent Commit">;<br>
+def FeatureCLWB : SubtargetFeature<"clwb", "HasCLWB", "true",<br>
+ "Cache Line Write Back">;<br>
// TODO: This feature ought to be renamed.<br>
// What it really refers to are CPUs for which certain instructions<br>
// (which ones besides the example below?) are microcoded.<br>
@@ -365,13 +385,12 @@ def : WestmereProc<"westmere">;<br>
<br>
// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,<br>
// rather than a superset.<br>
-class SandyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [<br>
+def ProcIntelSNB : SubtargetFeature<"snb", "X86ProcFamily", "IntelSNB",<br>
+ " Intel SandyBridge Processor", [<br>
FeatureMMX,<br>
FeatureAVX,<br>
FeatureFXSR,<br>
FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeatureSlowUAMem32,<br>
FeaturePOPCNT,<br>
FeatureAES,<br>
FeaturePCLMUL,<br>
@@ -379,187 +398,125 @@ class SandyBridgeProc<string Name> : Pro<br>
FeatureXSAVEOPT,<br>
FeatureLAHFSAHF<br>
]>;<br>
+<br>
+class SandyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [<br>
+ ProcIntelSNB,<br>
+ FeatureSlowBTMem,<br>
+ FeatureSlowUAMem32<br>
+]>;<br>
def : SandyBridgeProc<"sandybridge">;<br>
def : SandyBridgeProc<"corei7-avx">; // Legacy alias.<br>
<br>
-class IvyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [<br>
- FeatureMMX,<br>
- FeatureAVX,<br>
- FeatureFXSR,<br>
- FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeatureSlowUAMem32,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
+def ProcIntelIVB : SubtargetFeature<"ivb", "X86ProcFamily", "IntelIVB",<br>
+ " Intel IvyBridge Processor", [<br>
+ ProcIntelSNB,<br>
FeatureRDRAND,<br>
FeatureF16C,<br>
- FeatureFSGSBase,<br>
- FeatureLAHFSAHF<br>
+ FeatureFSGSBase<br>
+]>;<br>
+<br>
+class IvyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [<br>
+ ProcIntelIVB,<br>
+ FeatureSlowBTMem,<br>
+ FeatureSlowUAMem32<br>
]>;<br>
def : IvyBridgeProc<"ivybridge">;<br>
def : IvyBridgeProc<"core-avx-i">; // Legacy alias.<br>
<br>
-class HaswellProc<string Name> : ProcessorModel<Name, HaswellModel, [<br>
- FeatureMMX,<br>
+def ProcIntelHSW : SubtargetFeature<"hsw", "X86ProcFamily", "IntelHSW",<br>
+ " Intel Haswell Processor", [<br>
+ ProcIntelIVB,<br>
FeatureAVX2,<br>
- FeatureFXSR,<br>
- FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureRDRAND,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
- FeatureF16C,<br>
- FeatureFSGSBase,<br>
- FeatureMOVBE,<br>
- FeatureLZCNT,<br>
FeatureBMI,<br>
FeatureBMI2,<br>
FeatureFMA,<br>
+ FeatureLZCNT,<br>
+ FeatureMOVBE,<br>
+ FeatureINVPCID,<br>
+ FeatureVMFUNC,<br>
FeatureRTM,<br>
FeatureHLE,<br>
- FeatureSlowIncDec,<br>
- FeatureLAHFSAHF<br>
+ FeatureSlowIncDec<br>
]>;<br>
+<br>
+class HaswellProc<string Name> : ProcessorModel<Name, HaswellModel,<br>
+ [ProcIntelHSW]>;<br>
def : HaswellProc<"haswell">;<br>
def : HaswellProc<"core-avx2">; // Legacy alias.<br>
<br>
-class BroadwellProc<string Name> : ProcessorModel<Name, HaswellModel, [<br>
- FeatureMMX,<br>
- FeatureAVX2,<br>
- FeatureFXSR,<br>
- FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
- FeatureRDRAND,<br>
- FeatureF16C,<br>
- FeatureFSGSBase,<br>
- FeatureMOVBE,<br>
- FeatureLZCNT,<br>
- FeatureBMI,<br>
- FeatureBMI2,<br>
- FeatureFMA,<br>
- FeatureRTM,<br>
- FeatureHLE,<br>
+def ProcIntelBDW : SubtargetFeature<"bdw", "X86ProcFamily", "IntelBDW",<br>
+ " Intel Broadwell Processor", [<br>
+ ProcIntelHSW,<br>
FeatureADX,<br>
FeatureRDSEED,<br>
- FeatureSlowIncDec,<br>
- FeatureLAHFSAHF<br>
+ FeatureSMAP<br>
]>;<br>
+class BroadwellProc<string Name> : ProcessorModel<Name, HaswellModel,<br>
+ [ProcIntelBDW]>;<br>
def : BroadwellProc<"broadwell">;<br>
<br>
+def ProcIntelSKL : SubtargetFeature<"skl", "X86ProcFamily", "IntelSKL",<br>
+ " Intel Skylake Client Processor", [<br>
+ ProcIntelBDW,<br>
+ FeatureMPX,<br>
+ FeatureXSAVEC,<br>
+ FeatureXSAVES,<br>
+ FeatureSGX,<br>
+ FeatureCLFLUSHOPT<br>
+]>;<br>
+<br>
+// FIXME: define SKL model<br>
+class SkylakeClientProc<string Name> : ProcessorModel<Name, HaswellModel,<br>
+ [ProcIntelSKL]>;<br>
+def : SkylakeClientProc<"skl">;<br>
+<br>
// FIXME: define KNL model<br>
-class KnightsLandingProc<string Name> : ProcessorModel<Name, HaswellModel, [<br>
- FeatureMMX,<br>
+class KnightsLandingProc<string Name> : ProcessorModel<Name, HaswellModel,[<br>
+ ProcIntelIVB,<br>
FeatureAVX512,<br>
- FeatureFXSR,<br>
FeatureERI,<br>
FeatureCDI,<br>
FeaturePFI,<br>
- FeatureCMPXCHG16B,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
- FeatureRDRAND,<br>
- FeatureF16C,<br>
- FeatureFSGSBase,<br>
+ FeaturePREFETCHWT1,<br>
+ FeatureADX,<br>
+ FeatureRDSEED,<br>
FeatureMOVBE,<br>
FeatureLZCNT,<br>
FeatureBMI,<br>
FeatureBMI2,<br>
- FeatureFMA,<br>
- FeatureRTM,<br>
- FeatureHLE,<br>
- FeatureSlowIncDec,<br>
- FeatureMPX,<br>
- FeatureLAHFSAHF<br>
+ FeatureFMA<br>
]>;<br>
def : KnightsLandingProc<"knl">;<br>
<br>
-// FIXME: define SKX model<br>
-class SkylakeProc<string Name> : ProcessorModel<Name, HaswellModel, [<br>
- FeatureMMX,<br>
+def ProcIntelSKX : SubtargetFeature<"skx", "X86ProcFamily", "IntelSKX",<br>
+ " Intel Skylake Server Processor", [<br>
+ ProcIntelSKL,<br>
FeatureAVX512,<br>
- FeatureFXSR,<br>
FeatureCDI,<br>
FeatureDQI,<br>
FeatureBWI,<br>
FeatureVLX,<br>
FeaturePKU,<br>
- FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
- FeatureRDRAND,<br>
- FeatureF16C,<br>
- FeatureFSGSBase,<br>
- FeatureMOVBE,<br>
- FeatureLZCNT,<br>
- FeatureBMI,<br>
- FeatureBMI2,<br>
- FeatureFMA,<br>
- FeatureRTM,<br>
- FeatureHLE,<br>
- FeatureADX,<br>
- FeatureRDSEED,<br>
- FeatureSlowIncDec,<br>
- FeatureMPX,<br>
- FeatureXSAVEC,<br>
- FeatureXSAVES,<br>
- FeatureLAHFSAHF<br>
+ FeaturePCOMMIT,<br>
+ FeatureCLWB<br>
]>;<br>
-def : SkylakeProc<"skylake">;<br>
-def : SkylakeProc<"skx">; // Legacy alias.<br>
<br>
-class CannonlakeProc<string Name> : ProcessorModel<Name, HaswellModel, [<br>
- FeatureMMX,<br>
- FeatureAVX512,<br>
- FeatureFXSR,<br>
- FeatureCDI,<br>
- FeatureDQI,<br>
- FeatureBWI,<br>
- FeatureVLX,<br>
- FeaturePKU,<br>
- FeatureCMPXCHG16B,<br>
- FeatureSlowBTMem,<br>
- FeaturePOPCNT,<br>
- FeatureAES,<br>
- FeaturePCLMUL,<br>
- FeatureXSAVE,<br>
- FeatureXSAVEOPT,<br>
- FeatureRDRAND,<br>
- FeatureF16C,<br>
- FeatureFSGSBase,<br>
- FeatureMOVBE,<br>
- FeatureLZCNT,<br>
- FeatureBMI,<br>
- FeatureBMI2,<br>
+// FIXME: define SKX model<br>
+class SkylakeServerProc<string Name> : ProcessorModel<Name, HaswellModel,<br>
+ [ ProcIntelSKX]>;<br>
+def : SkylakeServerProc<"skylake">;<br>
+def : SkylakeServerProc<"skx">; // Legacy alias.<br>
+<br>
+def ProcIntelCNL : SubtargetFeature<"cnl", "X86ProcFamily", "IntelCNL",<br>
+ " Intel Cannonlake Processor", [<br>
+ ProcIntelSKX,<br>
FeatureVBMI,<br>
- FeatureFMA,<br>
- FeatureRTM,<br>
- FeatureHLE,<br>
- FeatureADX,<br>
- FeatureRDSEED,<br>
- FeatureSlowIncDec,<br>
- FeatureMPX,<br>
- FeatureXSAVEC,<br>
- FeatureXSAVES,<br>
- FeatureLAHFSAHF<br>
+ FeatureIFMA,<br>
+ FeatureSHA<br>
]>;<br>
+<br>
+class CannonlakeProc<string Name> : ProcessorModel<Name, HaswellModel,<br>
+ [ ProcIntelCNL ]>;<br>
def : CannonlakeProc<"cannonlake">;<br>
def : CannonlakeProc<"cnl">;<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Sun Jan 24 04:41:28 2016<br>
@@ -797,6 +797,8 @@ def HasBMI : Predicate<"Subtarget-<br>
def HasBMI2 : Predicate<"Subtarget->hasBMI2()">;<br>
def HasVBMI : Predicate<"Subtarget->hasVBMI()">,<br>
AssemblerPredicate<"FeatureVBMI", "AVX-512 VBMI ISA">;<br>
+def HasIFMA : Predicate<"Subtarget->hasIFMA()">,<br>
+ AssemblerPredicate<"FeatureIFMA", "AVX-512 IFMA ISA">;<br>
def HasRTM : Predicate<"Subtarget->hasRTM()">;<br>
def HasHLE : Predicate<"Subtarget->hasHLE()">;<br>
def HasTSX : Predicate<"Subtarget->hasRTM() || Subtarget->hasHLE()">;<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Sun Jan 24 04:41:28 2016<br>
@@ -262,6 +262,7 @@ void X86Subtarget::initializeEnvironment<br>
HasBMI = false;<br>
HasBMI2 = false;<br>
HasVBMI = false;<br>
+ HasIFMA = false;<br>
HasRTM = false;<br>
HasHLE = false;<br>
HasERI = false;<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)<br>
+++ llvm/trunk/lib/Target/X86/X86Subtarget.h Sun Jan 24 04:41:28 2016<br>
@@ -55,7 +55,8 @@ protected:<br>
};<br>
<br>
enum X86ProcFamilyEnum {<br>
- Others, IntelAtom, IntelSLM<br>
+ Others, IntelAtom, IntelSLM, IntelSNB, IntelIVB, IntelHSW, IntelBDW,<br>
+ IntelKNL, IntelSKL, IntelSKX, IntelCNL<br>
};<br>
<br>
/// X86 processor family: Intel Atom, and others<br>
@@ -137,6 +138,9 @@ protected:<br>
/// Processor has VBMI instructions.<br>
bool HasVBMI;<br>
<br>
+ /// Processor has Integer Fused Multiply Add<br>
+ bool HasIFMA;<br>
+<br>
/// Processor has RTM instructions.<br>
bool HasRTM;<br>
<br>
@@ -158,6 +162,9 @@ protected:<br>
/// Processor has LAHF/SAHF instructions.<br>
bool HasLAHFSAHF;<br>
<br>
+ /// Processor has Prefetch with intent to Write instruction<br>
+ bool HasPFPREFETCHWT1;<br>
+<br>
/// True if BT (bit test) of memory instructions are slow.<br>
bool IsBTMemSlow;<br>
<br>
@@ -229,9 +236,30 @@ protected:<br>
/// Processor has PKU extenstions<br>
bool HasPKU;<br>
<br>
- /// Processot supports MPX - Memory Protection Extensions<br>
+ /// Processor supports MPX - Memory Protection Extensions<br>
bool HasMPX;<br>
<br>
+ /// Processor supports Invalidate Process-Context Identifier<br>
+ bool HasInvPCId;<br>
+<br>
+ /// Processor has VM Functions<br>
+ bool HasVMFUNC;<br>
+<br>
+ /// Processor has Supervisor Mode Access Protection<br>
+ bool HasSMAP;<br>
+<br>
+ /// Processor has Software Guard Extensions<br>
+ bool HasSGX;<br>
+<br>
+ /// Processor supports Flush Cache Line instruction<br>
+ bool HasCLFLUSHOPT;<br>
+<br>
+ /// Processor has Persistent Commit feature<br>
+ bool HasPCOMMIT;<br>
+<br>
+ /// Processor supports Cache Line Write Back instruction<br>
+ bool HasCLWB;<br>
+<br>
/// Use software floating point for code generation.<br>
bool UseSoftFloat;<br>
<br>
@@ -378,6 +406,7 @@ public:<br>
bool hasBMI() const { return HasBMI; }<br>
bool hasBMI2() const { return HasBMI2; }<br>
bool hasVBMI() const { return HasVBMI; }<br>
+ bool hasIFMA() const { return HasIFMA; }<br>
bool hasRTM() const { return HasRTM; }<br>
bool hasHLE() const { return HasHLE; }<br>
bool hasADX() const { return HasADX; }<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll?rev=258659&r1=258658&r2=258659&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll?rev=258659&r1=258658&r2=258659&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics.ll Sun Jan 24 04:41:28 2016<br>
@@ -214,31 +214,31 @@ define i64 @test_cmp_b_512(<64 x i8> %a0<br>
; AVX512F-32-NEXT: vpcmpltb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpleb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpunordb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpneqb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnltb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnleb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpordb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, (%esp)<br>
; AVX512F-32-NEXT: addl (%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: addl $68, %esp<br>
; AVX512F-32-NEXT: retl<br>
%res0 = call i64 @llvm.x86.avx512.mask.cmp.b.512(<64 x i8> %a0, <64 x i8> %a1, i32 0, i64 -1)<br>
@@ -303,31 +303,31 @@ define i64 @test_mask_cmp_b_512(<64 x i8<br>
; AVX512F-32-NEXT: vpcmpltb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpleb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpunordb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpneqb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnltb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnleb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpordb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: addl $68, %esp<br>
; AVX512F-32-NEXT: retl<br>
%res0 = call i64 @llvm.x86.avx512.mask.cmp.b.512(<64 x i8> %a0, <64 x i8> %a1, i32 0, i64 %mask)<br>
@@ -390,31 +390,31 @@ define i64 @test_ucmp_b_512(<64 x i8> %a<br>
; AVX512F-32-NEXT: vpcmpltub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpleub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpunordub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnequb %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnltub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnleub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpordub %zmm1, %zmm0, %k0<br>
; AVX512F-32-NEXT: kmovq %k0, (%esp)<br>
; AVX512F-32-NEXT: addl (%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: addl $68, %esp<br>
; AVX512F-32-NEXT: retl<br>
%res0 = call i64 @llvm.x86.avx512.mask.ucmp.b.512(<64 x i8> %a0, <64 x i8> %a1, i32 0, i64 -1)<br>
@@ -479,31 +479,31 @@ define i64 @test_mask_x86_avx512_ucmp_b_<br>
; AVX512F-32-NEXT: vpcmpltub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpleub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpunordub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnequb %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnltub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpnleub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: vpcmpordub %zmm1, %zmm0, %k0 {%k1}<br>
; AVX512F-32-NEXT: kmovq %k0, {{[0-9]+}}(%esp)<br>
; AVX512F-32-NEXT: addl {{[0-9]+}}(%esp), %eax<br>
-; AVX512F-32-NEXT: adcl {{[0-9]+}}(%esp), %edx<br>
+; AVX512F-32-NEXT: adcxl {{[0-9]+}}(%esp), %edx<br>
; AVX512F-32-NEXT: addl $68, %esp<br>
; AVX512F-32-NEXT: retl<br>
%res0 = call i64 @llvm.x86.avx512.mask.ucmp.b.512(<64 x i8> %a0, <64 x i8> %a1, i32 0, i64 %mask)<br>
@@ -2879,6 +2879,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm2, %zmm0<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm0, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psrl_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsrlw %xmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsrlw %xmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsrlw %xmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm2, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psrl.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psrl.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psrl.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
@@ -2899,6 +2909,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: vpaddw %zmm2, %zmm0, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psrl_wi_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsrlw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpsrlw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsrlw $3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psrl.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psrl.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 -1)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psrl.wi.512(<32 x i16> %x0, i8 3, <32 x i16> zeroinitializer, i32 %x3)<br>
@@ -2919,6 +2939,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psrlv32hi:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsrlvw %zmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsrlvw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psrlv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psrlv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psrlv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
@@ -2939,6 +2969,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psra_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsraw %xmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsraw %xmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsraw %xmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psra.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psra.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psra.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
@@ -2959,6 +2999,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psra_wi_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsraw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpsraw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsraw $3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psra.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psra.wi.512(<32 x i16> %x0, i8 3, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psra.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 -1)<br>
@@ -2979,6 +3029,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_pshufh_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpshufhw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpshufhw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpshufhw $3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.pshufh.w.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.pshufh.w.512(<32 x i16> %x0, i8 3, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.pshufh.w.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 -1)<br>
@@ -2992,13 +3052,23 @@ declare <32 x i16> @llvm.x86.avx512.mask<br>
define <32 x i16>@test_int_x86_avx512_mask_pshufl_w_512(<32 x i16> %x0, i8 %x1, <32 x i16> %x2, i32 %x3) {<br>
; AVX512BW-LABEL: test_int_x86_avx512_mask_pshufl_w_512:<br>
; AVX512BW: ## BB#0:<br>
-; AVX512BW-NEXT: kmovd %esi, %k1<br>
-; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm1 {%k1}<br>
-; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm2 {%k1} {z}<br>
-; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm0<br>
-; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
-; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
-; AVX512BW-NEXT: retq<br>
+; AVX512BW-NEXT: kmovd %esi, %k1<br>
+; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512BW-NEXT: vpshuflw $3, %zmm0, %zmm0<br>
+; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_pshufl_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpshuflw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpshuflw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpshuflw $3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.pshufl.w.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.pshufl.w.512(<32 x i16> %x0, i8 3, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.pshufl.w.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 -1)<br>
@@ -3019,6 +3089,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psrav32_hi:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsravw %zmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsravw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsravw %zmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psrav32.hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psrav32.hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psrav32.hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
@@ -3039,6 +3119,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psll_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsllw %xmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsllw %xmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsllw %xmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psll.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psll.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psll.w.512(<32 x i16> %x0, <8 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
@@ -3059,6 +3149,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psll_wi_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsllw $3, %zmm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpsllw $3, %zmm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsllw $3, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psll.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psll.wi.512(<32 x i16> %x0, i8 3, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psll.wi.512(<32 x i16> %x0, i8 3, <32 x i16> %x2, i32 -1)<br>
@@ -3079,6 +3179,16 @@ define <32 x i16>@test_int_x86_avx512_ma<br>
; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_psllv32hi:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpsllvw %zmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpsllvw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpsllvw %zmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.psllv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.psllv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.psllv32hi(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
@@ -3152,13 +3262,23 @@ declare <32 x i16> @llvm.x86.avx512.mask<br>
define <32 x i16>@test_int_x86_avx512_mask_pmovzxb_w_512(<32 x i8> %x0, <32 x i16> %x1, i32 %x2) {<br>
; AVX512BW-LABEL: test_int_x86_avx512_mask_pmovzxb_w_512:<br>
; AVX512BW: ## BB#0:<br>
-; AVX512BW-NEXT: kmovd %edi, %k1<br>
-; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm1 {%k1}<br>
-; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm2 {%k1} {z}<br>
-; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm0<br>
-; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
-; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
-; AVX512BW-NEXT: retq<br>
+; AVX512BW-NEXT: kmovd %edi, %k1<br>
+; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm1 {%k1}<br>
+; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm2 {%k1} {z}<br>
+; AVX512BW-NEXT: vpmovzxbw %ymm0, %zmm0<br>
+; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_pmovzxb_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpmovzxbw %ymm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpmovzxbw %ymm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpmovzxbw %ymm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.pmovzxb.w.512(<32 x i8> %x0, <32 x i16> %x1, i32 %x2)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.pmovzxb.w.512(<32 x i8> %x0, <32 x i16> zeroinitializer, i32 %x2)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.pmovzxb.w.512(<32 x i8> %x0, <32 x i16> %x1, i32 -1)<br>
@@ -3172,13 +3292,23 @@ declare <32 x i16> @llvm.x86.avx512.mask<br>
define <32 x i16>@test_int_x86_avx512_mask_pmovsxb_w_512(<32 x i8> %x0, <32 x i16> %x1, i32 %x2) {<br>
; AVX512BW-LABEL: test_int_x86_avx512_mask_pmovsxb_w_512:<br>
; AVX512BW: ## BB#0:<br>
-; AVX512BW-NEXT: kmovd %edi, %k1<br>
-; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm1 {%k1}<br>
-; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm2 {%k1} {z}<br>
-; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0<br>
-; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
-; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
-; AVX512BW-NEXT: retq<br>
+; AVX512BW-NEXT: kmovd %edi, %k1<br>
+; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm1 {%k1}<br>
+; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm2 {%k1} {z}<br>
+; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0<br>
+; AVX512BW-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_pmovsxb_w_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpmovsxbw %ymm0, %zmm1 {%k1}<br>
+; AVX512F-32-NEXT: vpmovsxbw %ymm0, %zmm2 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpmovsxbw %ymm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm2, %zmm1, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.pmovsxb.w.512(<32 x i8> %x0, <32 x i16> %x1, i32 %x2)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.pmovsxb.w.512(<32 x i8> %x0, <32 x i16> zeroinitializer, i32 %x2)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.pmovsxb.w.512(<32 x i8> %x0, <32 x i16> %x1, i32 -1)<br>
@@ -3192,13 +3322,23 @@ declare <32 x i16> @llvm.x86.avx512.mask<br>
define <32 x i16>@test_int_x86_avx512_mask_permvar_hi_512(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 %x3) {<br>
; AVX512BW-LABEL: test_int_x86_avx512_mask_permvar_hi_512:<br>
; AVX512BW: ## BB#0:<br>
-; AVX512BW-NEXT: kmovd %edi, %k1<br>
-; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm2 {%k1}<br>
-; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
-; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm0<br>
-; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
-; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
-; AVX512BW-NEXT: retq<br>
+; AVX512BW-NEXT: kmovd %edi, %k1<br>
+; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512BW-NEXT: vpermw %zmm1, %zmm0, %zmm0<br>
+; AVX512BW-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512BW-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512BW-NEXT: retq<br>
+;<br>
+; AVX512F-32-LABEL: test_int_x86_avx512_mask_permvar_hi_512:<br>
+; AVX512F-32: # BB#0:<br>
+; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1<br>
+; AVX512F-32-NEXT: vpermw %zmm1, %zmm0, %zmm2 {%k1}<br>
+; AVX512F-32-NEXT: vpermw %zmm1, %zmm0, %zmm3 {%k1} {z}<br>
+; AVX512F-32-NEXT: vpermw %zmm1, %zmm0, %zmm0<br>
+; AVX512F-32-NEXT: vpaddw %zmm3, %zmm2, %zmm1<br>
+; AVX512F-32-NEXT: vpaddw %zmm0, %zmm1, %zmm0<br>
+; AVX512F-32-NEXT: retl<br>
%res = call <32 x i16> @llvm.x86.avx512.mask.permvar.hi.512(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 %x3)<br>
%res1 = call <32 x i16> @llvm.x86.avx512.mask.permvar.hi.512(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> zeroinitializer, i32 %x3)<br>
%res2 = call <32 x i16> @llvm.x86.avx512.mask.permvar.hi.512(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, i32 -1)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><span class="HOEnZb"><font color="#888888"><div><br></div></font></span></div><span class="HOEnZb"><font color="#888888"><div class="gmail_extra">-- <br><div>~Craig</div>
</div>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</font></span></blockquote></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">~Craig</div>
</div>