From: Craig Topper Date: Thu, 9 Nov 2017 08:26:26 +0000 (+0000) Subject: [X86] Give priority to EVEX FMA instructions over FMA4 instructions. X-Git-Tag: llvmorg-6.0.0-rc1~3809 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5bfa5ffe5ebe515caa22ad65f62df124ed2a7c7c;p=platform%2Fupstream%2Fllvm.git [X86] Give priority to EVEX FMA instructions over FMA4 instructions. No existing processor has both so it doesn't really matter what we do here. But we were previously just relying on pattern order which gave FMA4 priority. llvm-svn: 317775 --- diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 84b44ac..e106084 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -6002,12 +6002,12 @@ let Constraints = "$src1 = $dst", hasSideEffects = 0 in { AVX512FMA3Base, EVEX_B, EVEX_RC; let isCodeGenOnly = 1, isCommutable = 1 in { - def r : AVX512FMA3; - def m : AVX512FMA3 opc, string OpcodeStr, X86MemOperand x86memop, RegisterClass RC, SDPatternOperator OpNode> { - def r : FMA3; + def r : FMA3S; let mayLoad = 1 in - def m : FMA3; + def m : FMA3S; } multiclass fma3s_rm_231 opc, string OpcodeStr, X86MemOperand x86memop, RegisterClass RC, SDPatternOperator OpNode> { let hasSideEffects = 0 in - def r : FMA3; + def r : FMA3S; let mayLoad = 1 in - def m : FMA3; + def m : FMA3S; } multiclass fma3s_rm_132 opc, string OpcodeStr, X86MemOperand x86memop, RegisterClass RC, SDPatternOperator OpNode> { let hasSideEffects = 0 in - def r : FMA3; + def r : FMA3S; // Pattern is 312 order so that the load is in a different place from the // 213 and 231 patterns this helps tablegen's duplicate pattern detection. let mayLoad = 1 in - def m : FMA3; + def m : FMA3S; } let Constraints = "$src1 = $dst", isCommutable = 1, hasSideEffects = 0 in @@ -228,14 +228,12 @@ multiclass fma3s_forms opc132, bits<8> opc213, bits<8> opc231, string OpStr, string PackTy, string Suff, SDNode OpNode, RegisterClass RC, X86MemOperand x86memop> { - let Predicates = [HasFMA, NoAVX512] in { - defm NAME#213#Suff : fma3s_rm_213; - defm NAME#231#Suff : fma3s_rm_231; - defm NAME#132#Suff : fma3s_rm_132; - } + defm NAME#213#Suff : fma3s_rm_213; + defm NAME#231#Suff : fma3s_rm_231; + defm NAME#132#Suff : fma3s_rm_132; } // These FMA*_Int instructions are defined specially for being used when @@ -255,18 +253,18 @@ let Constraints = "$src1 = $dst", isCommutable = 1, isCodeGenOnly = 1, hasSideEffects = 0 in multiclass fma3s_rm_int opc, string OpcodeStr, Operand memopr, RegisterClass RC> { - def r_Int : FMA3; + def r_Int : FMA3S; let mayLoad = 1 in - def m_Int : FMA3; + def m_Int : FMA3S; } // The FMA 213 form is created for lowering of scalar FMA intrinscis @@ -357,19 +355,19 @@ multiclass fma4s opc, string OpcodeStr, RegisterClass RC, X86MemOperand x86memop, ValueType OpVT, SDNode OpNode, PatFrag mem_frag> { let isCommutable = 1 in - def rr : FMA4, VEX_W, VEX_LIG; - def rm : FMA4, VEX_W, VEX_LIG; - def mr : FMA4 opc, string OpcodeStr, RegisterClass RC, (OpNode RC:$src1, (mem_frag addr:$src2), RC:$src3))]>, VEX_LIG; // For disassembler let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in - def rr_REV : FMA4, @@ -387,20 +385,20 @@ let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in multiclass fma4s_int opc, string OpcodeStr, Operand memop, ValueType VT, ComplexPattern mem_cpat, SDNode OpNode> { let isCodeGenOnly = 1 in { - def rr_Int : FMA4, VEX_W, VEX_LIG; - def rm_Int : FMA4, VEX_W, VEX_LIG; - def mr_Int : FMA4, VEX_LIG; let hasSideEffects = 0 in - def rr_Int_REV : FMA4 o, Format F, dag outs, dag ins, string asm, class AVX512PI o, Format F, dag outs, dag ins, string asm, list pattern, Domain d, InstrItinClass itin = NoItinerary> : I, Requires<[HasAVX512]>; -class AVX512FMA3 o, Format F, dag outs, dag ins, string asm, +class AVX512FMA3S o, Format F, dag outs, dag ins, string asm, listpattern, InstrItinClass itin = NoItinerary> : I, T8PD, EVEX_4V, Requires<[HasAVX512]>; @@ -867,12 +867,20 @@ class FMA3 o, Format F, dag outs, dag ins, string asm, listpattern, InstrItinClass itin = NoItinerary> : I, T8PD, VEX_4V, FMASC, Requires<[HasFMA, NoVLX]>; +class FMA3S o, Format F, dag outs, dag ins, string asm, + listpattern, InstrItinClass itin = NoItinerary> + : I, T8PD, + VEX_4V, FMASC, Requires<[HasFMA, NoAVX512]>; // FMA4 Instruction Templates class FMA4 o, Format F, dag outs, dag ins, string asm, listpattern, InstrItinClass itin = NoItinerary> : Ii8Reg, TAPD, - VEX_4V, FMASC, Requires<[HasFMA4]>; + VEX_4V, FMASC, Requires<[HasFMA4, NoVLX]>; +class FMA4S o, Format F, dag outs, dag ins, string asm, + listpattern, InstrItinClass itin = NoItinerary> + : Ii8Reg, TAPD, + VEX_4V, FMASC, Requires<[HasFMA4, NoAVX512]>; // XOP 2, 3 and 4 Operand Instruction Template class IXOP o, Format F, dag outs, dag ins, string asm,