diff options
Diffstat (limited to 'llvm/lib/Target/X86')
-rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 18 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrMMX.td | 19 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrSSE.td | 30 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 18 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 17 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 12 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 21 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 27 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 2 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 20 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 2 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 2 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 48 |
13 files changed, 68 insertions, 168 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 1143056d008..f40c6b613ea 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -3617,7 +3617,7 @@ def VMOVDI2PDIZrr : AVX512BI<0x6E, MRMSrcReg, (outs VR128X:$dst), (ins GR32:$src "vmovd\t{$src, $dst|$dst, $src}", [(set VR128X:$dst, (v4i32 (scalar_to_vector GR32:$src)))]>, - EVEX, Sched<[WriteMove]>; + EVEX, Sched<[WriteVecMoveFromGpr]>; def VMOVDI2PDIZrm : AVX512BI<0x6E, MRMSrcMem, (outs VR128X:$dst), (ins i32mem:$src), "vmovd\t{$src, $dst|$dst, $src}", [(set VR128X:$dst, @@ -3627,7 +3627,7 @@ def VMOV64toPQIZrr : AVX512BI<0x6E, MRMSrcReg, (outs VR128X:$dst), (ins GR64:$sr "vmovq\t{$src, $dst|$dst, $src}", [(set VR128X:$dst, (v2i64 (scalar_to_vector GR64:$src)))]>, - EVEX, VEX_W, Sched<[WriteMove]>; + EVEX, VEX_W, Sched<[WriteVecMoveFromGpr]>; let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in def VMOV64toPQIZrm : AVX512BI<0x6E, MRMSrcMem, (outs VR128X:$dst), (ins i64mem:$src), @@ -3637,7 +3637,7 @@ let isCodeGenOnly = 1 in { def VMOV64toSDZrr : AVX512BI<0x6E, MRMSrcReg, (outs FR64X:$dst), (ins GR64:$src), "vmovq\t{$src, $dst|$dst, $src}", [(set FR64X:$dst, (bitconvert GR64:$src))]>, - EVEX, VEX_W, Sched<[WriteMove]>; + EVEX, VEX_W, Sched<[WriteVecMoveFromGpr]>; def VMOV64toSDZrm : AVX512XSI<0x7E, MRMSrcMem, (outs FR64X:$dst), (ins i64mem:$src), "vmovq\t{$src, $dst|$dst, $src}", [(set FR64X:$dst, (bitconvert (loadi64 addr:$src)))]>, @@ -3645,7 +3645,7 @@ def VMOV64toSDZrm : AVX512XSI<0x7E, MRMSrcMem, (outs FR64X:$dst), (ins i64mem:$s def VMOVSDto64Zrr : AVX512BI<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64X:$src), "vmovq\t{$src, $dst|$dst, $src}", [(set GR64:$dst, (bitconvert FR64X:$src))]>, - EVEX, VEX_W, Sched<[WriteMove]>; + EVEX, VEX_W, Sched<[WriteVecMoveFromGpr]>; def VMOVSDto64Zmr : AVX512BI<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64X:$src), "vmovq\t{$src, $dst|$dst, $src}", [(store (i64 (bitconvert FR64X:$src)), addr:$dst)]>, @@ -3660,7 +3660,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def VMOVDI2SSZrr : AVX512BI<0x6E, MRMSrcReg, (outs FR32X:$dst), (ins GR32:$src), "vmovd\t{$src, $dst|$dst, $src}", [(set FR32X:$dst, (bitconvert GR32:$src))]>, - EVEX, Sched<[WriteMove]>; + EVEX, Sched<[WriteVecMoveFromGpr]>; def VMOVDI2SSZrm : AVX512BI<0x6E, MRMSrcMem, (outs FR32X:$dst), (ins i32mem:$src), "vmovd\t{$src, $dst|$dst, $src}", @@ -3675,7 +3675,7 @@ def VMOVPDI2DIZrr : AVX512BI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128X:$s "vmovd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (extractelt (v4i32 VR128X:$src), (iPTR 0)))]>, - EVEX, Sched<[WriteMove]>; + EVEX, Sched<[WriteVecMoveToGpr]>; def VMOVPDI2DIZmr : AVX512BI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR128X:$src), "vmovd\t{$src, $dst|$dst, $src}", @@ -3691,7 +3691,7 @@ def VMOVPQIto64Zrr : I<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128X:$src), "vmovq\t{$src, $dst|$dst, $src}", [(set GR64:$dst, (extractelt (v2i64 VR128X:$src), (iPTR 0)))]>, - PD, EVEX, VEX_W, Sched<[WriteMove]>, + PD, EVEX, VEX_W, Sched<[WriteVecMoveToGpr]>, Requires<[HasAVX512, In64BitMode]>; let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayStore = 1 in @@ -3722,7 +3722,7 @@ def VMOVSS2DIZrr : AVX512BI<0x7E, MRMDestReg, (outs GR32:$dst), (ins FR32X:$src), "vmovd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (bitconvert FR32X:$src))]>, - EVEX, Sched<[WriteMove]>; + EVEX, Sched<[WriteVecMoveToGpr]>; def VMOVSS2DIZmr : AVX512BI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, FR32X:$src), "vmovd\t{$src, $dst|$dst, $src}", @@ -9089,7 +9089,7 @@ multiclass cvt_by_vec_width<bits<8> opc, X86VectorVTInfo Vec, string OpcodeStr > def rr : AVX512XS8I<opc, MRMSrcReg, (outs Vec.RC:$dst), (ins Vec.KRC:$src), !strconcat(OpcodeStr##Vec.Suffix, "\t{$src, $dst|$dst, $src}"), [(set Vec.RC:$dst, (Vec.VT (sext Vec.KRC:$src)))]>, - EVEX, Sched<[WriteMove]>; + EVEX, Sched<[WriteMove]>; // TODO - WriteVecTrunc? } multiclass cvt_mask_by_elt_width<bits<8> opc, AVX512VLVectorVTInfo VTInfo, diff --git a/llvm/lib/Target/X86/X86InstrMMX.td b/llvm/lib/Target/X86/X86InstrMMX.td index 75f35c2481a..91901e8d4b6 100644 --- a/llvm/lib/Target/X86/X86InstrMMX.td +++ b/llvm/lib/Target/X86/X86InstrMMX.td @@ -165,7 +165,7 @@ def MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR64:$dst, (x86mmx (scalar_to_vector GR32:$src)))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; def MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR64:$dst, @@ -193,13 +193,13 @@ def MMX_MOVD64grr : MMXI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR64:$src), "movd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (MMX_X86movd2w (x86mmx VR64:$src)))]>, - Sched<[WriteMove]>, FoldGenData<"MMX_MOVD64rr">; + Sched<[WriteVecMoveToGpr]>, FoldGenData<"MMX_MOVD64rr">; let isBitcast = 1 in def MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set VR64:$dst, (bitconvert GR64:$src))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in def MMX_MOVD64to64rm : MMXRI<0x6E, MRMSrcMem, (outs VR64:$dst), @@ -209,20 +209,21 @@ def MMX_MOVD64to64rm : MMXRI<0x6E, MRMSrcMem, (outs VR64:$dst), // These are 64 bit moves, but since the OS X assembler doesn't // recognize a register-register movq, we write them as // movd. -let SchedRW = [WriteMove], isBitcast = 1 in { +let isBitcast = 1 in { def MMX_MOVD64from64rr : MMXRI<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR64:$src), "movq\t{$src, $dst|$dst, $src}", - [(set GR64:$dst, (bitconvert VR64:$src))]>; -let hasSideEffects = 0 in + [(set GR64:$dst, (bitconvert VR64:$src))]>, + Sched<[WriteVecMoveToGpr]>; +let SchedRW = [WriteVecMove], hasSideEffects = 0 in { def MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src), "movq\t{$src, $dst|$dst, $src}", []>; -let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in { +let isCodeGenOnly = 1, ForceDisassemble = 1 in def MMX_MOVQ64rr_REV : MMXI<0x7F, MRMDestReg, (outs VR64:$dst), (ins VR64:$src), "movq\t{$src, $dst|$dst, $src}", []>, FoldGenData<"MMX_MOVQ64rr">; -} -} // SchedRW +} // SchedRW, hasSideEffects +} // isBitcast let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayStore = 1 in def MMX_MOVD64from64rm : MMXRI<0x7E, MRMDestMem, diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index ee414790629..85cdcbe7005 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/lib/Target/X86/X86InstrSSE.td @@ -3965,7 +3965,7 @@ def VMOVDI2PDIrr : VS2I<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (scalar_to_vector GR32:$src)))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveFromGpr]>; def VMOVDI2PDIrm : VS2I<0x6E, MRMSrcMem, (outs VR128:$dst), (ins i32mem:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, @@ -3975,7 +3975,7 @@ def VMOV64toPQIrr : VRS2I<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2i64 (scalar_to_vector GR64:$src)))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveFromGpr]>; let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in def VMOV64toPQIrm : VRS2I<0x6E, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src), "movq\t{$src, $dst|$dst, $src}", []>, @@ -3984,13 +3984,13 @@ let isCodeGenOnly = 1 in def VMOV64toSDrr : VRS2I<0x6E, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set FR64:$dst, (bitconvert GR64:$src))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveFromGpr]>; def MOVDI2PDIrr : S2I<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (scalar_to_vector GR32:$src)))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; def MOVDI2PDIrm : S2I<0x6E, MRMSrcMem, (outs VR128:$dst), (ins i32mem:$src), "movd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, @@ -4000,7 +4000,7 @@ def MOV64toPQIrr : RS2I<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2i64 (scalar_to_vector GR64:$src)))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in def MOV64toPQIrm : RS2I<0x6E, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src), "movq\t{$src, $dst|$dst, $src}", []>, @@ -4009,7 +4009,7 @@ let isCodeGenOnly = 1 in def MOV64toSDrr : RS2I<0x6E, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set FR64:$dst, (bitconvert GR64:$src))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; } // ExeDomain = SSEPackedInt //===---------------------------------------------------------------------===// @@ -4019,7 +4019,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def VMOVDI2SSrr : VS2I<0x6E, MRMSrcReg, (outs FR32:$dst), (ins GR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set FR32:$dst, (bitconvert GR32:$src))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveFromGpr]>; def VMOVDI2SSrm : VS2I<0x6E, MRMSrcMem, (outs FR32:$dst), (ins i32mem:$src), "movd\t{$src, $dst|$dst, $src}", @@ -4028,7 +4028,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def MOVDI2SSrr : S2I<0x6E, MRMSrcReg, (outs FR32:$dst), (ins GR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set FR32:$dst, (bitconvert GR32:$src))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveFromGpr]>; def MOVDI2SSrm : S2I<0x6E, MRMSrcMem, (outs FR32:$dst), (ins i32mem:$src), "movd\t{$src, $dst|$dst, $src}", @@ -4044,7 +4044,7 @@ def VMOVPDI2DIrr : VS2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128:$src), "movd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (extractelt (v4i32 VR128:$src), (iPTR 0)))]>, VEX, - Sched<[WriteMove]>; + Sched<[WriteVecMoveToGpr]>; def VMOVPDI2DImr : VS2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR128:$src), "movd\t{$src, $dst|$dst, $src}", @@ -4055,7 +4055,7 @@ def MOVPDI2DIrr : S2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128:$src), "movd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (extractelt (v4i32 VR128:$src), (iPTR 0)))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveToGpr]>; def MOVPDI2DImr : S2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR128:$src), "movd\t{$src, $dst|$dst, $src}", [(store (i32 (extractelt (v4i32 VR128:$src), @@ -4067,7 +4067,7 @@ def MOVPDI2DImr : S2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR128:$src), // Move Packed Doubleword Int first element to Doubleword Int // let ExeDomain = SSEPackedInt in { -let SchedRW = [WriteMove] in { +let SchedRW = [WriteVecMoveToGpr] in { def VMOVPQIto64rr : VRS2I<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128:$src), "movq\t{$src, $dst|$dst, $src}", [(set GR64:$dst, (extractelt (v2i64 VR128:$src), @@ -4103,7 +4103,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def VMOVSDto64rr : VRS2I<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set GR64:$dst, (bitconvert FR64:$src))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveToGpr]>; def VMOVSDto64mr : VRS2I<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64:$src), "movq\t{$src, $dst|$dst, $src}", [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>, @@ -4116,7 +4116,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def MOVSDto64rr : RS2I<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64:$src), "movq\t{$src, $dst|$dst, $src}", [(set GR64:$dst, (bitconvert FR64:$src))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveToGpr]>; def MOVSDto64mr : RS2I<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64:$src), "movq\t{$src, $dst|$dst, $src}", [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>, @@ -4130,7 +4130,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def VMOVSS2DIrr : VS2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins FR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (bitconvert FR32:$src))]>, - VEX, Sched<[WriteMove]>; + VEX, Sched<[WriteVecMoveToGpr]>; def VMOVSS2DImr : VS2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, FR32:$src), "movd\t{$src, $dst|$dst, $src}", [(store (i32 (bitconvert FR32:$src)), addr:$dst)]>, @@ -4138,7 +4138,7 @@ let ExeDomain = SSEPackedInt, isCodeGenOnly = 1 in { def MOVSS2DIrr : S2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins FR32:$src), "movd\t{$src, $dst|$dst, $src}", [(set GR32:$dst, (bitconvert FR32:$src))]>, - Sched<[WriteMove]>; + Sched<[WriteVecMoveToGpr]>; def MOVSS2DImr : S2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, FR32:$src), "movd\t{$src, $dst|$dst, $src}", [(store (i32 (bitconvert FR32:$src)), addr:$dst)]>, diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index 568cef7c8eb..35ae1008899 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -280,6 +280,9 @@ defm : X86WriteRes<WriteVecMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5 defm : X86WriteRes<WriteVecMove, [BWPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [BWPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveY, [BWPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveToGpr, [BWPort0], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [BWPort5], 1, [1], 1>; + defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>; defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals. @@ -508,11 +511,7 @@ def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr", - "MMX_MOVD64grr", - "(V?)MOVPDI2DIrr", - "(V?)MOVPQIto64rr", - "VPSLLVQ(Y?)rr", +def: InstRW<[BWWriteResGroup1], (instregex "VPSLLVQ(Y?)rr", "VPSRLVQ(Y?)rr")>; def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> { @@ -528,11 +527,7 @@ def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr", - "MMX_MOVD64to64rr", - "MMX_MOVQ2DQrr", - "(V?)MOV64toPQIrr", - "(V?)MOVDI2PDIrr")>; +def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVQ2DQrr")>; def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> { let Latency = 1; @@ -578,8 +573,7 @@ def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr", - "VPBLENDD(Y?)rri")>; +def: InstRW<[BWWriteResGroup8], (instregex "VPBLENDD(Y?)rri")>; def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> { let Latency = 1; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index 22af5ee0650..d400e977d7d 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -300,6 +300,8 @@ defm : X86WriteRes<WriteVecMaskedStoreY, [HWPort0,HWPort4,HWPort237,HWPort15], 5 defm : X86WriteRes<WriteVecMove, [HWPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [HWPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveY, [HWPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveToGpr, [HWPort0], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [HWPort5], 1, [1], 1>; defm : HWWriteResPair<WriteVecLogic, [HWPort015], 1, [1], 1, 5>; defm : HWWriteResPair<WriteVecLogicX,[HWPort015], 1, [1], 1, 6>; @@ -794,11 +796,7 @@ def HWWriteResGroup2 : SchedWriteRes<[HWPort0]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[HWWriteResGroup2], (instregex "MMX_MOVD64from64rr", - "MMX_MOVD64grr", - "(V?)MOVPDI2DIrr", - "(V?)MOVPQIto64rr", - "VPSLLVQ(Y?)rr", +def: InstRW<[HWWriteResGroup2], (instregex "VPSLLVQ(Y?)rr", "VPSRLVQ(Y?)rr")>; def HWWriteResGroup3 : SchedWriteRes<[HWPort1]> { @@ -814,11 +812,7 @@ def HWWriteResGroup4 : SchedWriteRes<[HWPort5]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[HWWriteResGroup4], (instregex "MMX_MOVD64rr", - "MMX_MOVD64to64rr", - "MMX_MOVQ2DQrr", - "(V?)MOV64toPQIrr", - "(V?)MOVDI2PDIrr")>; +def: InstRW<[HWWriteResGroup4], (instregex "MMX_MOVQ2DQrr")>; def HWWriteResGroup5 : SchedWriteRes<[HWPort6]> { let Latency = 1; @@ -864,8 +858,7 @@ def HWWriteResGroup9 : SchedWriteRes<[HWPort015]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[HWWriteResGroup9], (instregex "MMX_MOVQ64rr", - "VPBLENDD(Y?)rri")>; +def: InstRW<[HWWriteResGroup9], (instregex "VPBLENDD(Y?)rri")>; def HWWriteResGroup10 : SchedWriteRes<[HWPort0156]> { let Latency = 1; diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 6e7e2be2b60..8b457f91254 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -290,6 +290,8 @@ defm : X86WriteRes<WriteVecMaskedStoreY, [SBPort4,SBPort01,SBPort23], 5, [1,1,1] defm : X86WriteRes<WriteVecMove, [SBPort05], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [SBPort05], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveY, [SBPort05], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveToGpr, [SBPort0], 2, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [SBPort5], 1, [1], 1>; defm : SBWriteResPair<WriteVecLogic, [SBPort015], 1, [1], 1, 5>; defm : SBWriteResPair<WriteVecLogicX,[SBPort015], 1, [1], 1, 6>; @@ -497,8 +499,6 @@ def: InstRW<[SBWriteResGroup2], (instrs FDECSTP, FINCSTP, FFREE, FFREEP, FNOP, LD_Frr, ST_Frr, ST_FPrr)>; def: InstRW<[SBWriteResGroup2], (instrs LOOP, LOOPE, LOOPNE)>; // FIXME: This seems wrong compared to other Intel CPUs. def: InstRW<[SBWriteResGroup2], (instrs RETQ)>; -def: InstRW<[SBWriteResGroup2], (instregex "(V?)MOV64toPQIrr", - "(V?)MOVDI2PDIrr")>; def SBWriteResGroup4 : SchedWriteRes<[SBPort05]> { let Latency = 1; @@ -534,14 +534,6 @@ def SBWriteResGroup6 : SchedWriteRes<[SBPort015]> { def: InstRW<[SBWriteResGroup6], (instregex "MMX_MOVQ2DQrr", "MOVDQ(A|U)rr")>; // NOTE: Different port requirements to VEX equivalents -def SBWriteResGroup7 : SchedWriteRes<[SBPort0]> { - let Latency = 2; - let NumMicroOps = 1; - let ResourceCycles = [1]; -} -def: InstRW<[SBWriteResGroup7], (instregex "(V?)MOVPDI2DIrr", - "(V?)MOVPQIto64rr")>; - def SBWriteResGroup9 : SchedWriteRes<[SBPort05]> { let Latency = 2; let NumMicroOps = 2; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index 3d4e393d800..8d034aceab1 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -269,9 +269,11 @@ defm : X86WriteRes<WriteVecStoreNT, [SKLPort237,SKLPort4], 1, [1,1], 2>; defm : X86WriteRes<WriteVecStoreNTY, [SKLPort237,SKLPort4], 1, [1,1], 2>; defm : X86WriteRes<WriteVecMaskedStore, [SKLPort237,SKLPort0], 2, [1,1], 2>; defm : X86WriteRes<WriteVecMaskedStoreY, [SKLPort237,SKLPort0], 2, [1,1], 2>; -defm : X86WriteRes<WriteVecMove, [SKLPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMove, [SKLPort05], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [SKLPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveY, [SKLPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveToGpr, [SKLPort0], 2, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [SKLPort5], 1, [1], 1>; defm : SKLWriteResPair<WriteVecALU, [SKLPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals. defm : SKLWriteResPair<WriteVecALUX, [SKLPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (XMM). @@ -526,11 +528,7 @@ def SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> { let ResourceCycles = [1]; } def: InstRW<[SKLWriteResGroup3], (instregex "COM(P?)_FST0r", - "MMX_MOVD64rr", - "MMX_MOVD64to64rr", - "UCOM_F(P?)r", - "(V?)MOV64toPQIrr", - "(V?)MOVDI2PDIrr")>; + "UCOM_F(P?)r")>; def SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> { let Latency = 1; @@ -545,7 +543,6 @@ def SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> { let ResourceCycles = [1]; } def: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>; -def: InstRW<[SKLWriteResGroup6], (instregex "MMX_MOVQ64rr")>; def SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> { let Latency = 1; @@ -605,16 +602,6 @@ def: InstRW<[SKLWriteResGroup11], (instregex "FBSTPm", "ST_FP(32|64|80)m", "VMPTRSTm")>; -def SKLWriteResGroup12 : SchedWriteRes<[SKLPort0]> { - let Latency = 2; - let NumMicroOps = 1; - let ResourceCycles = [1]; -} -def: InstRW<[SKLWriteResGroup12], (instregex "MMX_MOVD64from64rr", - "MMX_MOVD64grr", - "(V?)MOVPDI2DIrr", - "(V?)MOVPQIto64rr")>; - def SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> { let Latency = 2; let NumMicroOps = 2; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index 36aa93b2e9e..fac38e7f91b 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -269,9 +269,11 @@ defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>; defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>; defm : X86WriteRes<WriteVecMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>; defm : X86WriteRes<WriteVecMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>; -defm : X86WriteRes<WriteVecMove, [SKXPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>; defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals. defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (XMM). @@ -538,13 +540,7 @@ def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> { } def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r", "KMOV(B|D|Q|W)kr", - "MMX_MOVD64rr", - "MMX_MOVD64to64rr", - "MOV64toPQIrr", - "MOVDI2PDIrr", - "UCOM_F(P?)r", - "VMOV64toPQI(Z?)rr", - "VMOVDI2PDI(Z?)rr")>; + "UCOM_F(P?)r")>; def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> { let Latency = 1; @@ -559,7 +555,6 @@ def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> { let ResourceCycles = [1]; } def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>; -def: InstRW<[SKXWriteResGroup6], (instregex "MMX_MOVQ64rr")>; def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> { let Latency = 1; @@ -630,20 +625,6 @@ def: InstRW<[SKXWriteResGroup11], (instregex "FBSTPm", "ST_FP(32|64|80)m", "VMPTRSTm")>; -def SKXWriteResGroup12 : SchedWriteRes<[SKXPort0]> { - let Latency = 2; - let NumMicroOps = 1; - let ResourceCycles = [1]; -} -def: InstRW<[SKXWriteResGroup12], (instregex "MMX_MOVD64from64rr", - "MMX_MOVD64grr", - "MOVPDI2DIrr", - "MOVPQIto64rr", - "VMOVPDI2DIZrr", - "VMOVPDI2DIrr", - "VMOVPQIto64Zrr", - "VMOVPQIto64rr")>; - def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> { let Latency = 2; let NumMicroOps = 2; diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index c8afbe688f9..b668f16a619 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -250,6 +250,8 @@ def WriteVecMaskedStoreY : SchedWrite; def WriteVecMove : SchedWrite; def WriteVecMoveX : SchedWrite; def WriteVecMoveY : SchedWrite; +def WriteVecMoveToGpr : SchedWrite; +def WriteVecMoveFromGpr : SchedWrite; defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals. defm WriteVecALUX : X86SchedWritePair; // Vector integer ALU op, no logicals (XMM). diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index 9549b7cfd71..427fad2f089 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -323,9 +323,11 @@ def : WriteRes<WriteVecStoreNTY, [AtomPort0]>; def : WriteRes<WriteVecMaskedStore, [AtomPort0]>; def : WriteRes<WriteVecMaskedStoreY, [AtomPort0]>; -def : WriteRes<WriteVecMove, [AtomPort01]>; +def : WriteRes<WriteVecMove, [AtomPort0]>; def : WriteRes<WriteVecMoveX, [AtomPort01]>; def : WriteRes<WriteVecMoveY, [AtomPort01]>; +defm : X86WriteRes<WriteVecMoveToGpr, [AtomPort0], 3, [3], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [AtomPort0], 1, [1], 1>; defm : AtomWriteResPair<WriteVecALU, [AtomPort01], [AtomPort0], 1, 1>; defm : AtomWriteResPair<WriteVecALUX, [AtomPort01], [AtomPort0], 1, 1>; @@ -435,26 +437,12 @@ def AtomWrite0_1 : SchedWriteRes<[AtomPort0]> { } def : InstRW<[AtomWrite0_1], (instrs FXAM, LD_Frr, BSWAP32r, BSWAP64r, - MOVSX64rr32, - MMX_MOVD64rr, - MMX_MOVD64to64rr, - MOVDI2PDIrr, - MOVDI2SSrr, - MOV64toPQIrr, - MOV64toSDrr)>; + MOVSX64rr32)>; def : SchedAlias<WriteALURMW, AtomWrite0_1>; def : SchedAlias<WriteADCRMW, AtomWrite0_1>; def : InstRW<[AtomWrite0_1], (instregex "(RCL|RCR|ROL|ROR|SAR|SHL|SHR)(8|16|32|64)m", "MOV(S|Z)X(32|64)rr(8|8_NOREX|16)")>; -def AtomWrite0_3 : SchedWriteRes<[AtomPort0]> { - let Latency = 3; - let ResourceCycles = [3]; -} -def : InstRW<[AtomWrite0_3], (instrs MMX_MOVD64from64rr, MMX_MOVD64grr, - MOVPDI2DIrr, MOVPQIto64rr, - MOVSDto64rr, MOVSS2DIrr)>; - def AtomWrite0_5 : SchedWriteRes<[AtomPort0]> { let Latency = 5; let ResourceCycles = [5]; diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 361ae95ce16..2d468299b8b 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -416,6 +416,8 @@ defm : X86WriteRes<WriteVecMaskedStoreY, [JSAGU, JFPU01, JVALU], 6, [2, 2, 4], defm : X86WriteRes<WriteVecMove, [JFPU01, JVALU], 1, [1, 1], 1>; defm : X86WriteRes<WriteVecMoveX, [JFPU01, JVALU], 1, [1, 1], 1>; defm : X86WriteRes<WriteVecMoveY, [JFPU01, JVALU], 1, [2, 2], 2>; +defm : X86WriteRes<WriteVecMoveToGpr, [JFPU0, JFPA, JALU0], 4, [1, 1, 1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [JFPU01, JFPX], 8, [1, 1], 2>; defm : JWriteResFpuPair<WriteVecALU, [JFPU01, JVALU], 1>; defm : JWriteResFpuPair<WriteVecALUX, [JFPU01, JVALU], 1>; diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index aaf62b11ef8..699479b791e 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -252,6 +252,8 @@ def : WriteRes<WriteVecMaskedStoreY, [SLM_MEC_RSV]>; def : WriteRes<WriteVecMove, [SLM_FPC_RSV01]>; def : WriteRes<WriteVecMoveX, [SLM_FPC_RSV01]>; def : WriteRes<WriteVecMoveY, [SLM_FPC_RSV01]>; +def : WriteRes<WriteVecMoveToGpr, [SLM_IEC_RSV01]>; +def : WriteRes<WriteVecMoveFromGpr, [SLM_IEC_RSV01]>; defm : SLMWriteResPair<WriteVecShift, [SLM_FPC_RSV0], 1>; defm : SLMWriteResPair<WriteVecShiftX, [SLM_FPC_RSV0], 1>; diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 324a54dbc54..b5c840db757 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -301,7 +301,9 @@ defm : X86WriteRes<WriteVecMaskedStore, [ZnAGU,ZnFPU01], 4, [1,1], 1>; defm : X86WriteRes<WriteVecMaskedStoreY, [ZnAGU,ZnFPU01], 5, [1,2], 2>; defm : X86WriteRes<WriteVecMove, [ZnFPU], 1, [1], 1>; defm : X86WriteRes<WriteVecMoveX, [ZnFPU], 1, [1], 1>; -defm : X86WriteRes<WriteVecMoveY, [ZnFPU], 1, [1], 1>; +defm : X86WriteRes<WriteVecMoveY, [ZnFPU], 2, [1], 2>; +defm : X86WriteRes<WriteVecMoveToGpr, [ZnFPU2], 2, [1], 1>; +defm : X86WriteRes<WriteVecMoveFromGpr, [ZnFPU2], 3, [1], 1>; defm : X86WriteRes<WriteEMMS, [ZnFPU], 2, [1], 1>; defm : ZnWriteResFpuPair<WriteVecShift, [ZnFPU], 1>; @@ -922,50 +924,6 @@ def : InstRW<[WriteMicrocoded], (instrs FNCLEX)>; def : InstRW<[WriteMicrocoded], (instrs FNINIT)>; //=== Integer MMX and XMM Instructions ===// -//-- Move instructions --// - -// Moves from GPR to FPR incurs a penalty -def ZnWriteFPU2 : SchedWriteRes<[ZnFPU2]> { - let Latency = 3; -} - -// Move to ALU doesn't incur penalty -def ZnWriteToALU2 : SchedWriteRes<[ZnFPU2]> { - let Latency = 2; -} - -def ZnWriteFPU : SchedWriteRes<[ZnFPU]>; -def ZnWriteFPUY : SchedWriteRes<[ZnFPU]> { - let NumMicroOps = 2; - let Latency=2; -} - -// MOVD. -// r32/64 <- (x)mm. -def : InstRW<[ZnWriteToALU2], (instrs MMX_MOVD64grr, - MMX_MOVD64from64rr, - MOVPDI2DIrr, - VMOVPDI2DIrr)>; - -// (x)mm <- r32/64. -def : InstRW<[ZnWriteFPU2], (instrs MMX_MOVD64rr, - MMX_MOVD64to64rr, - MOVDI2PDIrr, - VMOVDI2PDIrr)>; - -// MOVQ. -// r64 <- (x)mm. -def : InstRW<[ZnWriteToALU2], (instrs VMOVPQIto64rr)>; - -// (x)mm <- r64. -def : InstRW<[ZnWriteFPU2], (instrs VMOV64toPQIrr)>; - -// (x)mm <- (x)mm. -def : InstRW<[ZnWriteFPU], (instregex "MMX_MOVQ64rr")>; - -// (V)MOVDQA/U. -// y <- y. -def : InstRW<[ZnWriteFPUY], (instregex "VMOVDQ(A|U)Yrr")>; // PACKSSWB/DW. // mm <- mm. |