diff --git a/lib/Target/X86/X86InstrSSE.td b/lib/Target/X86/X86InstrSSE.td index 3857dcd58ba..10b8cac81f8 100644 --- a/lib/Target/X86/X86InstrSSE.td +++ b/lib/Target/X86/X86InstrSSE.td @@ -3855,25 +3855,26 @@ defm PINSRW : sse2_pinsrw, PD; // SSE2 - Packed Mask Creation //===---------------------------------------------------------------------===// -let ExeDomain = SSEPackedInt, SchedRW = [WriteVecMOVMSK] in { +let ExeDomain = SSEPackedInt in { def VPMOVMSKBrr : VPDI<0xD7, MRMSrcReg, (outs GR32orGR64:$dst), (ins VR128:$src), "pmovmskb\t{$src, $dst|$dst, $src}", [(set GR32orGR64:$dst, (X86movmsk (v16i8 VR128:$src)))]>, - VEX, VEX_WIG; + Sched<[WriteVecMOVMSK]>, VEX, VEX_WIG; let Predicates = [HasAVX2] in { def VPMOVMSKBYrr : VPDI<0xD7, MRMSrcReg, (outs GR32orGR64:$dst), (ins VR256:$src), "pmovmskb\t{$src, $dst|$dst, $src}", [(set GR32orGR64:$dst, (X86movmsk (v32i8 VR256:$src)))]>, - VEX, VEX_L, VEX_WIG; + Sched<[WriteVecMOVMSKY]>, VEX, VEX_L, VEX_WIG; } def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (outs GR32orGR64:$dst), (ins VR128:$src), "pmovmskb\t{$src, $dst|$dst, $src}", - [(set GR32orGR64:$dst, (X86movmsk (v16i8 VR128:$src)))]>; + [(set GR32orGR64:$dst, (X86movmsk (v16i8 VR128:$src)))]>, + Sched<[WriteVecMOVMSK]>; } // ExeDomain = SSEPackedInt diff --git a/lib/Target/X86/X86SchedBroadwell.td b/lib/Target/X86/X86SchedBroadwell.td index 593fb6e819b..5aac5957b22 100755 --- a/lib/Target/X86/X86SchedBroadwell.td +++ b/lib/Target/X86/X86SchedBroadwell.td @@ -315,9 +315,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 3; } -def : WriteRes { let Latency = 3; } -def : WriteRes { let Latency = 1; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 1; } // AES instructions. def : WriteRes { // Decryption, encryption. diff --git a/lib/Target/X86/X86SchedHaswell.td b/lib/Target/X86/X86SchedHaswell.td index f4651de1608..79a8f9ee1e9 100644 --- a/lib/Target/X86/X86SchedHaswell.td +++ b/lib/Target/X86/X86SchedHaswell.td @@ -308,9 +308,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 3; } -def : WriteRes { let Latency = 3; } -def : WriteRes { let Latency = 1; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 1; } // AES Instructions. def : WriteRes { diff --git a/lib/Target/X86/X86SchedSandyBridge.td b/lib/Target/X86/X86SchedSandyBridge.td index c5ef8835d5e..fe8de448872 100644 --- a/lib/Target/X86/X86SchedSandyBridge.td +++ b/lib/Target/X86/X86SchedSandyBridge.td @@ -287,9 +287,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 1; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 1; } // AES Instructions. def : WriteRes { diff --git a/lib/Target/X86/X86SchedSkylakeClient.td b/lib/Target/X86/X86SchedSkylakeClient.td index 7aa93195d4a..36675a060e3 100644 --- a/lib/Target/X86/X86SchedSkylakeClient.td +++ b/lib/Target/X86/X86SchedSkylakeClient.td @@ -310,9 +310,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } // AES instructions. def : WriteRes { // Decryption, encryption. diff --git a/lib/Target/X86/X86SchedSkylakeServer.td b/lib/Target/X86/X86SchedSkylakeServer.td index 52629e53707..7ab6d4f0952 100755 --- a/lib/Target/X86/X86SchedSkylakeServer.td +++ b/lib/Target/X86/X86SchedSkylakeServer.td @@ -311,9 +311,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 2; } -def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } +def : WriteRes { let Latency = 2; } // AES instructions. def : WriteRes { // Decryption, encryption. diff --git a/lib/Target/X86/X86Schedule.td b/lib/Target/X86/X86Schedule.td index 8c2578b5d3f..c3bea9c048c 100644 --- a/lib/Target/X86/X86Schedule.td +++ b/lib/Target/X86/X86Schedule.td @@ -182,9 +182,10 @@ def WriteVecExtract : SchedWrite; // Extract vector element to gpr. def WriteVecExtractSt : SchedWrite; // Extract vector element and store. // MOVMSK operations. -def WriteFMOVMSK : SchedWrite; -def WriteVecMOVMSK : SchedWrite; -def WriteMMXMOVMSK : SchedWrite; +def WriteFMOVMSK : SchedWrite; +def WriteVecMOVMSK : SchedWrite; +def WriteVecMOVMSKY : SchedWrite; +def WriteMMXMOVMSK : SchedWrite; // Conversion between integer and float. defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer. diff --git a/lib/Target/X86/X86ScheduleAtom.td b/lib/Target/X86/X86ScheduleAtom.td index 42ba131cce0..6c175d06519 100644 --- a/lib/Target/X86/X86ScheduleAtom.td +++ b/lib/Target/X86/X86ScheduleAtom.td @@ -308,9 +308,10 @@ defm : AtomWriteResPair; // NOTE: Do // MOVMSK Instructions. //////////////////////////////////////////////////////////////////////////////// -def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } -def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } -def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } +def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } +def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } +def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } +def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } //////////////////////////////////////////////////////////////////////////////// // AES Instructions. diff --git a/lib/Target/X86/X86ScheduleBtVer2.td b/lib/Target/X86/X86ScheduleBtVer2.td index d6be3199500..2f11ead4d8e 100644 --- a/lib/Target/X86/X86ScheduleBtVer2.td +++ b/lib/Target/X86/X86ScheduleBtVer2.td @@ -460,9 +460,10 @@ defm : JWriteResFpuPair { let Latency = 3; } -def : WriteRes { let Latency = 3; } -def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } +def : WriteRes { let Latency = 3; } //////////////////////////////////////////////////////////////////////////////// // AES Instructions. diff --git a/lib/Target/X86/X86ScheduleSLM.td b/lib/Target/X86/X86ScheduleSLM.td index fa3a63a3eb8..300427df6f8 100644 --- a/lib/Target/X86/X86ScheduleSLM.td +++ b/lib/Target/X86/X86ScheduleSLM.td @@ -255,9 +255,10 @@ def : WriteRes { } // MOVMSK Instructions. -def : WriteRes { let Latency = 4; } -def : WriteRes { let Latency = 4; } -def : WriteRes { let Latency = 4; } +def : WriteRes { let Latency = 4; } +def : WriteRes { let Latency = 4; } +def : WriteRes { let Latency = 4; } +def : WriteRes { let Latency = 4; } // AES Instructions. def : WriteRes { diff --git a/lib/Target/X86/X86ScheduleZnver1.td b/lib/Target/X86/X86ScheduleZnver1.td index 8e0cf431be2..fd863a1c1a7 100644 --- a/lib/Target/X86/X86ScheduleZnver1.td +++ b/lib/Target/X86/X86ScheduleZnver1.td @@ -279,8 +279,14 @@ def : WriteRes { // MOVMSK Instructions. def : WriteRes; -def : WriteRes; def : WriteRes; +def : WriteRes; + +def : WriteRes { + let NumMicroOps = 2; + let Latency = 2; + let ResourceCycles = [2]; +} // AES Instructions. defm : ZnWriteResFpuPair; @@ -995,14 +1001,6 @@ def : InstRW<[WriteMicrocoded], // m, v,v. def : InstRW<[WriteMicrocoded], (instregex "VPMASKMOV(D|Q)(Y?)mr")>; -// PMOVMSKBY. -def ZnWritePMOVMSKBY : SchedWriteRes<[ZnFPU2]> { - let NumMicroOps = 2; - let Latency = 2; - let ResourceCycles = [2]; -} -def : InstRW<[ZnWritePMOVMSKBY], (instregex "(V|MMX_)?PMOVMSKBYrr")>; - // VPBROADCAST B/W. // x, m8/16. def ZnWriteVPBROADCAST128Ld : SchedWriteRes<[ZnAGU, ZnFPU12]> {