diff options
-rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 181 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrFormats.td | 310 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrSSE.td | 111 |
3 files changed, 284 insertions, 318 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index af03c3fc0ce..532b5a2cbf4 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -212,7 +212,6 @@ multiclass AVX512_maskable_custom<bits<8> O, Format F, list<dag> Pattern, list<dag> MaskingPattern, list<dag> ZeroMaskingPattern, - InstrItinClass itin = NoItinerary, string MaskingConstraint = "", bit IsCommutable = 0, bit IsKCommutable = 0> { @@ -220,14 +219,14 @@ multiclass AVX512_maskable_custom<bits<8> O, Format F, def NAME: AVX512<O, F, Outs, Ins, OpcodeStr#"\t{"#AttSrcAsm#", $dst|"# "$dst, "#IntelSrcAsm#"}", - Pattern, itin>; + Pattern>; // Prefer over VMOV*rrk Pat<> let isCommutable = IsKCommutable in def NAME#k: AVX512<O, F, Outs, MaskingIns, OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}}|"# "$dst {${mask}}, "#IntelSrcAsm#"}", - MaskingPattern, itin>, + MaskingPattern>, EVEX_K { // In case of the 3src subclass this is overridden with a let. string Constraints = MaskingConstraint; @@ -239,8 +238,7 @@ multiclass AVX512_maskable_custom<bits<8> O, Format F, def NAME#kz: AVX512<O, F, Outs, ZeroMaskingIns, OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}} {z}|"# "$dst {${mask}} {z}, "#IntelSrcAsm#"}", - ZeroMaskingPattern, - itin>, + ZeroMaskingPattern>, EVEX_KZ; } @@ -252,7 +250,6 @@ multiclass AVX512_maskable_common<bits<8> O, Format F, X86VectorVTInfo _, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, dag MaskingRHS, - InstrItinClass itin = NoItinerary, SDNode Select = vselect, string MaskingConstraint = "", bit IsCommutable = 0, @@ -263,7 +260,7 @@ multiclass AVX512_maskable_common<bits<8> O, Format F, X86VectorVTInfo _, [(set _.RC:$dst, MaskingRHS)], [(set _.RC:$dst, (Select _.KRCWM:$mask, RHS, _.ImmAllZerosV))], - itin, MaskingConstraint, IsCommutable, + MaskingConstraint, IsCommutable, IsKCommutable>; // This multiclass generates the unconditional/non-masking, the masking and @@ -274,7 +271,6 @@ multiclass AVX512_maskable_split<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, dag MaskRHS, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0, bit IsKCommutable = 0, SDNode Select = vselect> : AVX512_maskable_custom<O, F, Outs, Ins, @@ -286,7 +282,7 @@ multiclass AVX512_maskable_split<bits<8> O, Format F, X86VectorVTInfo _, (Select _.KRCWM:$mask, MaskRHS, _.RC:$src0))], [(set _.RC:$dst, (Select _.KRCWM:$mask, MaskRHS, _.ImmAllZerosV))], - itin, "$src0 = $dst", IsCommutable, IsKCommutable>; + "$src0 = $dst", IsCommutable, IsKCommutable>; // This multiclass generates the unconditional/non-masking, the masking and // the zero-masking variant of the vector instruction. In the masking case, the @@ -295,14 +291,13 @@ multiclass AVX512_maskable<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0, bit IsKCommutable = 0, SDNode Select = vselect> : AVX512_maskable_common<O, F, _, Outs, Ins, !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), !con((ins _.KRCWM:$mask), Ins), OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, - (Select _.KRCWM:$mask, RHS, _.RC:$src0), itin, + (Select _.KRCWM:$mask, RHS, _.RC:$src0), Select, "$src0 = $dst", IsCommutable, IsKCommutable>; // This multiclass generates the unconditional/non-masking, the masking and @@ -311,10 +306,9 @@ multiclass AVX512_maskable_scalar<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0> : AVX512_maskable<O, F, _, Outs, Ins, OpcodeStr, AttSrcAsm, IntelSrcAsm, - RHS, itin, IsCommutable, 0, X86selects>; + RHS, IsCommutable, 0, X86selects>; // Similar to AVX512_maskable but in this case one of the source operands // ($src1) is already tied to $dst so we just use that for the preserved @@ -323,7 +317,7 @@ multiclass AVX512_maskable_scalar<bits<8> O, Format F, X86VectorVTInfo _, multiclass AVX512_maskable_3src<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag NonTiedIns, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, - dag RHS, InstrItinClass itin = NoItinerary, + dag RHS, bit IsCommutable = 0, bit IsKCommutable = 0, SDNode Select = vselect, @@ -334,31 +328,30 @@ multiclass AVX512_maskable_3src<bits<8> O, Format F, X86VectorVTInfo _, !con((ins _.RC:$src1, _.KRCWM:$mask), NonTiedIns), OpcodeStr, AttSrcAsm, IntelSrcAsm, !if(MaskOnly, (null_frag), RHS), - (Select _.KRCWM:$mask, RHS, _.RC:$src1), itin, + (Select _.KRCWM:$mask, RHS, _.RC:$src1), Select, "", IsCommutable, IsKCommutable>; multiclass AVX512_maskable_3src_scalar<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag NonTiedIns, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, - dag RHS, InstrItinClass itin = NoItinerary, + dag RHS, bit IsCommutable = 0, bit IsKCommutable = 0, bit MaskOnly = 0> : AVX512_maskable_3src<O, F, _, Outs, NonTiedIns, OpcodeStr, AttSrcAsm, - IntelSrcAsm, RHS, itin, IsCommutable, IsKCommutable, + IntelSrcAsm, RHS, IsCommutable, IsKCommutable, X86selects, MaskOnly>; multiclass AVX512_maskable_in_asm<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, - list<dag> Pattern, - InstrItinClass itin = NoItinerary> : + list<dag> Pattern> : AVX512_maskable_custom<O, F, Outs, Ins, !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), !con((ins _.KRCWM:$mask), Ins), OpcodeStr, AttSrcAsm, IntelSrcAsm, Pattern, [], [], - itin, "$src0 = $dst">; + "$src0 = $dst">; // Instruction with mask that puts result in mask register, @@ -370,18 +363,17 @@ multiclass AVX512_maskable_custom_cmp<bits<8> O, Format F, string AttSrcAsm, string IntelSrcAsm, list<dag> Pattern, list<dag> MaskingPattern, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0> { let isCommutable = IsCommutable in def NAME: AVX512<O, F, Outs, Ins, OpcodeStr#"\t{"#AttSrcAsm#", $dst|"# "$dst, "#IntelSrcAsm#"}", - Pattern, itin>; + Pattern>; def NAME#k: AVX512<O, F, Outs, MaskingIns, OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}}|"# "$dst {${mask}}, "#IntelSrcAsm#"}", - MaskingPattern, itin>, EVEX_K; + MaskingPattern>, EVEX_K; } multiclass AVX512_maskable_common_cmp<bits<8> O, Format F, X86VectorVTInfo _, @@ -390,30 +382,27 @@ multiclass AVX512_maskable_common_cmp<bits<8> O, Format F, X86VectorVTInfo _, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, dag MaskingRHS, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0> : AVX512_maskable_custom_cmp<O, F, Outs, Ins, MaskingIns, OpcodeStr, AttSrcAsm, IntelSrcAsm, [(set _.KRC:$dst, RHS)], - [(set _.KRC:$dst, MaskingRHS)], itin, IsCommutable>; + [(set _.KRC:$dst, MaskingRHS)], IsCommutable>; multiclass AVX512_maskable_cmp<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, - dag RHS, InstrItinClass itin = NoItinerary, - bit IsCommutable = 0> : + dag RHS, bit IsCommutable = 0> : AVX512_maskable_common_cmp<O, F, _, Outs, Ins, !con((ins _.KRCWM:$mask), Ins), OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, - (and _.KRCWM:$mask, RHS), itin, IsCommutable>; + (and _.KRCWM:$mask, RHS), IsCommutable>; multiclass AVX512_maskable_cmp_alt<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, - string AttSrcAsm, string IntelSrcAsm, - InstrItinClass itin = NoItinerary> : + string AttSrcAsm, string IntelSrcAsm> : AVX512_maskable_custom_cmp<O, F, Outs, Ins, !con((ins _.KRCWM:$mask),Ins), OpcodeStr, - AttSrcAsm, IntelSrcAsm, [],[], itin>; + AttSrcAsm, IntelSrcAsm, [], []>; // This multiclass generates the unconditional/non-masking, the masking and // the zero-masking variant of the vector instruction. In the masking case, the @@ -422,7 +411,6 @@ multiclass AVX512_maskable_logic<bits<8> O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, dag MaskedRHS, - InstrItinClass itin = NoItinerary, bit IsCommutable = 0, SDNode Select = vselect> : AVX512_maskable_custom<O, F, Outs, Ins, !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), @@ -434,7 +422,7 @@ multiclass AVX512_maskable_logic<bits<8> O, Format F, X86VectorVTInfo _, [(set _.RC:$dst, (Select _.KRCWM:$mask, MaskedRHS, _.ImmAllZerosV))], - itin, "$src0 = $dst", IsCommutable>; + "$src0 = $dst", IsCommutable>; // Alias instruction that maps zero vector to pxor / xorp* for AVX-512. @@ -807,8 +795,8 @@ multiclass vextract_for_size_split<int Opcode, "vextract" # To.EltTypeName # "x" # To.NumElts, "$idx, $src1", "$src1, $idx", (vextract_extract:$idx (From.VT From.RC:$src1), (iPTR imm)), - (vextract_for_mask:$idx (From.VT From.RC:$src1), (iPTR imm)), - NoItinerary>, AVX512AIi8Base, EVEX, Sched<[SchedRR]>; + (vextract_for_mask:$idx (From.VT From.RC:$src1), (iPTR imm))>, + AVX512AIi8Base, EVEX, Sched<[SchedRR]>; def mr : AVX512AIi8<Opcode, MRMDestMem, (outs), (ins To.MemOp:$dst, From.RC:$src1, u8imm:$idx), @@ -816,7 +804,7 @@ multiclass vextract_for_size_split<int Opcode, "\t{$idx, $src1, $dst|$dst, $src1, $idx}", [(store (To.VT (vextract_extract:$idx (From.VT From.RC:$src1), (iPTR imm))), - addr:$dst)], NoItinerary>, EVEX, + addr:$dst)]>, EVEX, Sched<[SchedMR]>; let mayStore = 1, hasSideEffects = 0 in @@ -825,9 +813,8 @@ multiclass vextract_for_size_split<int Opcode, From.RC:$src1, u8imm:$idx), "vextract" # To.EltTypeName # "x" # To.NumElts # "\t{$idx, $src1, $dst {${mask}}|" - "$dst {${mask}}, $src1, $idx}", - [], NoItinerary>, EVEX_K, EVEX, - Sched<[SchedMR]>; + "$dst {${mask}}, $src1, $idx}", []>, + EVEX_K, EVEX, Sched<[SchedMR]>; } } @@ -1157,8 +1144,8 @@ multiclass avx512_broadcast_rm_split<bits<8> opc, string OpcodeStr, (MaskInfo.VT (bitconvert (DestInfo.VT - (X86VBroadcast (SrcInfo.VT SrcInfo.RC:$src))))), - NoItinerary>, T8PD, EVEX, Sched<[SchedRR]>; + (X86VBroadcast (SrcInfo.VT SrcInfo.RC:$src)))))>, + T8PD, EVEX, Sched<[SchedRR]>; let mayLoad = 1 in defm m : AVX512_maskable_split<opc, MRMSrcMem, MaskInfo, (outs MaskInfo.RC:$dst), @@ -1170,8 +1157,8 @@ multiclass avx512_broadcast_rm_split<bits<8> opc, string OpcodeStr, (MaskInfo.VT (bitconvert (DestInfo.VT (X86VBroadcast - (SrcInfo.ScalarLdFrag addr:$src))))), - NoItinerary>, T8PD, EVEX, EVEX_CD8<SrcInfo.EltSize, CD8VT1>, + (SrcInfo.ScalarLdFrag addr:$src)))))>, + T8PD, EVEX, EVEX_CD8<SrcInfo.EltSize, CD8VT1>, Sched<[SchedRM]>; } @@ -1263,7 +1250,7 @@ multiclass avx512_int_broadcast_reg<bits<8> opc, SchedWrite SchedRR, defm r : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins SrcRC:$src), "vpbroadcast"##_.Suffix, "$src", "$src", - (_.VT (OpNode SrcRC:$src)), NoItinerary>, T8PD, EVEX, + (_.VT (OpNode SrcRC:$src))>, T8PD, EVEX, Sched<[SchedRR]>; } @@ -1276,7 +1263,7 @@ multiclass avx512_int_broadcastbw_reg<bits<8> opc, string Name, SchedWrite Sched !con((ins _.RC:$src0, _.KRCWM:$mask), (ins GR32:$src)), !con((ins _.KRCWM:$mask), (ins GR32:$src)), "vpbroadcast"##_.Suffix, "$src", "$src", [], [], [], - NoItinerary, "$src0 = $dst">, T8PD, EVEX, Sched<[SchedRR]>; + "$src0 = $dst">, T8PD, EVEX, Sched<[SchedRR]>; def : Pat <(_.VT (OpNode SrcRC:$src)), (!cast<Instruction>(Name#r) @@ -1373,9 +1360,8 @@ multiclass avx512_subvec_broadcast_rm<bits<8> opc, string OpcodeStr, defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), (ins _Src.MemOp:$src), OpcodeStr, "$src", "$src", (_Dst.VT (X86SubVBroadcast - (_Src.VT (bitconvert (_Src.LdFrag addr:$src))))), - NoItinerary>, AVX5128IBase, EVEX, - Sched<[WriteShuffleLd]>; + (_Src.VT (bitconvert (_Src.LdFrag addr:$src)))))>, + AVX5128IBase, EVEX, Sched<[WriteShuffleLd]>; } // This should be used for the AVX512DQ broadcast instructions. It disables @@ -1388,9 +1374,8 @@ multiclass avx512_subvec_broadcast_rm_dq<bits<8> opc, string OpcodeStr, (ins _Src.MemOp:$src), OpcodeStr, "$src", "$src", (null_frag), (_Dst.VT (X86SubVBroadcast - (_Src.VT (bitconvert (_Src.LdFrag addr:$src))))), - NoItinerary>, AVX5128IBase, EVEX, - Sched<[WriteShuffleLd]>; + (_Src.VT (bitconvert (_Src.LdFrag addr:$src)))))>, + AVX5128IBase, EVEX, Sched<[WriteShuffleLd]>; } let Predicates = [HasAVX512] in { @@ -1746,14 +1731,14 @@ let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in { defm rr: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (X86VPermi2X _.RC:$src1, _.RC:$src2, _.RC:$src3)), - NoItinerary, 1>, EVEX_4V, AVX5128IBase, Sched<[itins.Sched]>; + (_.VT (X86VPermi2X _.RC:$src1, _.RC:$src2, _.RC:$src3)), 1>, + EVEX_4V, AVX5128IBase, Sched<[itins.Sched]>; defm rm: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.MemOp:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", (_.VT (X86VPermi2X _.RC:$src1, _.RC:$src2, - (_.VT (bitconvert (_.LdFrag addr:$src3))))), NoItinerary, 1>, + (_.VT (bitconvert (_.LdFrag addr:$src3))))), 1>, EVEX_4V, AVX5128IBase, Sched<[itins.Sched.Folded, ReadAfterLd]>; } } @@ -1766,8 +1751,8 @@ multiclass avx512_perm_i_mb<bits<8> opc, string OpcodeStr, OpndItins itins, OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), !strconcat("$src2, ${src3}", _.BroadcastStr ), (_.VT (X86VPermi2X _.RC:$src1, - _.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))), - NoItinerary, 1>, AVX5128IBase, EVEX_4V, EVEX_B, + _.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))), 1>, + AVX5128IBase, EVEX_4V, EVEX_B, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -1817,14 +1802,14 @@ let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in { defm rr: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins IdxVT.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (X86VPermt2 _.RC:$src1, IdxVT.RC:$src2, _.RC:$src3)), - NoItinerary, 1>, EVEX_4V, AVX5128IBase, Sched<[itins.Sched]>; + (_.VT (X86VPermt2 _.RC:$src1, IdxVT.RC:$src2, _.RC:$src3)), 1>, + EVEX_4V, AVX5128IBase, Sched<[itins.Sched]>; defm rm: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins IdxVT.RC:$src2, _.MemOp:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", (_.VT (X86VPermt2 _.RC:$src1, IdxVT.RC:$src2, - (bitconvert (_.LdFrag addr:$src3)))), NoItinerary, 1>, + (bitconvert (_.LdFrag addr:$src3)))), 1>, EVEX_4V, AVX5128IBase, Sched<[itins.Sched.Folded, ReadAfterLd]>; } } @@ -1836,8 +1821,8 @@ multiclass avx512_perm_t_mb<bits<8> opc, string OpcodeStr, OpndItins itins, OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), !strconcat("$src2, ${src3}", _.BroadcastStr ), (_.VT (X86VPermt2 _.RC:$src1, - IdxVT.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))), - NoItinerary, 1>, AVX5128IBase, EVEX_4V, EVEX_B, + IdxVT.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))), 1>, + AVX5128IBase, EVEX_4V, EVEX_B, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -2439,7 +2424,7 @@ multiclass avx512_vcmp_common<OpndItins itins, X86VectorVTInfo _> { "$src2, $src1", "$src1, $src2", (X86cmpm (_.VT _.RC:$src1), (_.VT _.RC:$src2), - imm:$cc), NoItinerary, 1>, + imm:$cc), 1>, Sched<[itins.Sched]>; defm rmi : AVX512_maskable_cmp<0xC2, MRMSrcMem, _, @@ -4340,7 +4325,7 @@ multiclass avx512_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, (ins _.RC:$src1, _.RC:$src2), OpcodeStr, "$src2, $src1", "$src1, $src2", (_.VT (OpNode _.RC:$src1, _.RC:$src2)), - NoItinerary, IsCommutable>, AVX512BIBase, EVEX_4V, + IsCommutable>, AVX512BIBase, EVEX_4V, Sched<[itins.Sched]>; defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), @@ -4468,7 +4453,7 @@ multiclass avx512_binop_rm2<bits<8> opc, string OpcodeStr, OpndItins itins, (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), (_Src.VT _Src.RC:$src2))), - NoItinerary, IsCommutable>, + IsCommutable>, AVX512BIBase, EVEX_4V, Sched<[itins.Sched]>; defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), (ins _Src.RC:$src1, _Src.MemOp:$src2), OpcodeStr, @@ -4570,7 +4555,7 @@ multiclass avx512_packs_rm<bits<8> opc, string OpcodeStr, (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), (_Src.VT _Src.RC:$src2))), - NoItinerary, IsCommutable>, + IsCommutable>, EVEX_CD8<_Src.EltSize, CD8VF>, EVEX_4V, Sched<[itins.Sched]>; defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), (ins _Src.RC:$src1, _Src.MemOp:$src2), OpcodeStr, @@ -4739,7 +4724,7 @@ multiclass avx512_logic_rm<bits<8> opc, string OpcodeStr, (bitconvert (_.VT _.RC:$src2)))), (_.VT (bitconvert (_.i64VT (OpNodeMsk _.RC:$src1, _.RC:$src2)))), - NoItinerary, IsCommutable>, AVX512BIBase, EVEX_4V, + IsCommutable>, AVX512BIBase, EVEX_4V, Sched<[itins.Sched]>; let hasSideEffects = 0, mayLoad = 1 in @@ -4857,7 +4842,7 @@ multiclass avx512_fp_scalar_round<bits<8> opc, string OpcodeStr,X86VectorVTInfo (ins _.RC:$src1, _.RC:$src2, AVX512RC:$rc), OpcodeStr, "$rc, $src2, $src1", "$src1, $src2, $rc", (VecNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), - (i32 imm:$rc)), NoItinerary, IsCommutable>, + (i32 imm:$rc)), IsCommutable>, EVEX_B, EVEX_RC, Sched<[itins.Sched]>; } multiclass avx512_fp_scalar_sae<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, @@ -4979,8 +4964,8 @@ multiclass avx512_fp_packed<bits<8> opc, string OpcodeStr, SDPatternOperator OpN defm rr: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix, "$src2, $src1", "$src1, $src2", - (_.VT (OpNode _.RC:$src1, _.RC:$src2)), NoItinerary, - IsCommutable>, EVEX_4V, Sched<[itins.Sched]>; + (_.VT (OpNode _.RC:$src1, _.RC:$src2)), IsCommutable>, + EVEX_4V, Sched<[itins.Sched]>; let mayLoad = 1 in { defm rm: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr##_.Suffix, @@ -6161,23 +6146,22 @@ multiclass avx512_fma3p_213_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3)), NoItinerary, 1, 1>, + (_.VT (OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3)), 1, 1>, AVX512FMA3Base, Sched<[WriteFMA]>; defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.MemOp:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src2, _.RC:$src1, (_.LdFrag addr:$src3))), - NoItinerary, 1, 0>, AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; + (_.VT (OpNode _.RC:$src2, _.RC:$src1, (_.LdFrag addr:$src3))), 1, 0>, + AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.ScalarMemOp:$src3), OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), !strconcat("$src2, ${src3}", _.BroadcastStr ), (OpNode _.RC:$src2, - _.RC:$src1,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3)))), - NoItinerary, 1, 0>, AVX512FMA3Base, EVEX_B, - Sched<[WriteFMALd, ReadAfterLd]>; + _.RC:$src1,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3)))), 1, 0>, + AVX512FMA3Base, EVEX_B, Sched<[WriteFMALd, ReadAfterLd]>; } } @@ -6187,8 +6171,8 @@ multiclass avx512_fma3_213_round<bits<8> opc, string OpcodeStr, SDNode OpNode, defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", - (_.VT ( OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3, (i32 imm:$rc))), - NoItinerary, 1, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; + (_.VT ( OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3, (i32 imm:$rc))), 1, 1>, + AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; } multiclass avx512_fma3p_213_common<bits<8> opc, string OpcodeStr, SDNode OpNode, @@ -6229,14 +6213,14 @@ multiclass avx512_fma3p_231_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), NoItinerary, 1, 1, + (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), 1, 1, vselect, 1>, AVX512FMA3Base, Sched<[WriteFMA]>; defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.MemOp:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src2, (_.LdFrag addr:$src3), _.RC:$src1)), - NoItinerary, 1, 0>, AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; + (_.VT (OpNode _.RC:$src2, (_.LdFrag addr:$src3), _.RC:$src1)), 1, 0>, + AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.ScalarMemOp:$src3), @@ -6244,7 +6228,7 @@ multiclass avx512_fma3p_231_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, "$src2, ${src3}"##_.BroadcastStr, (_.VT (OpNode _.RC:$src2, (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), - _.RC:$src1)), NoItinerary, 1, 0>, AVX512FMA3Base, EVEX_B, + _.RC:$src1)), 1, 0>, AVX512FMA3Base, EVEX_B, Sched<[WriteFMALd, ReadAfterLd]>; } } @@ -6256,7 +6240,7 @@ multiclass avx512_fma3_231_round<bits<8> opc, string OpcodeStr, SDNode OpNode, (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", (_.VT ( OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1, (i32 imm:$rc))), - NoItinerary, 1, 1, vselect, 1>, + 1, 1, vselect, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; } @@ -6297,16 +6281,16 @@ multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2)), NoItinerary, - 1, 1, vselect, 1>, AVX512FMA3Base, Sched<[WriteFMA]>; + (_.VT (OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2)), 1, 1, vselect, 1>, + AVX512FMA3Base, Sched<[WriteFMA]>; // 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. defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.MemOp:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode (_.LdFrag addr:$src3), _.RC:$src1, _.RC:$src2)), - NoItinerary, 1, 0>, AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; + (_.VT (OpNode (_.LdFrag addr:$src3), _.RC:$src1, _.RC:$src2)), 1, 0>, + AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; // 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. @@ -6315,7 +6299,7 @@ multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, OpcodeStr, "${src3}"##_.BroadcastStr##", $src2", "$src2, ${src3}"##_.BroadcastStr, (_.VT (OpNode (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), - _.RC:$src1, _.RC:$src2)), NoItinerary, 1, 0>, + _.RC:$src1, _.RC:$src2)), 1, 0>, AVX512FMA3Base, EVEX_B, Sched<[WriteFMALd, ReadAfterLd]>; } } @@ -6327,7 +6311,7 @@ multiclass avx512_fma3_132_round<bits<8> opc, string OpcodeStr, SDNode OpNode, (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", (_.VT ( OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2, (i32 imm:$rc))), - NoItinerary, 1, 1, vselect, 1>, + 1, 1, vselect, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; } @@ -6369,19 +6353,18 @@ multiclass avx512_fma3s_common<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, let Constraints = "$src1 = $dst", hasSideEffects = 0 in { defm r_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, - "$src3, $src2", "$src2, $src3", RHS_VEC_r, NoItinerary, 1, 1>, + "$src3, $src2", "$src2, $src3", RHS_VEC_r, 1, 1>, AVX512FMA3Base, Sched<[WriteFMA]>; defm m_Int: AVX512_maskable_3src_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.IntScalarMemOp:$src3), OpcodeStr, - "$src3, $src2", "$src2, $src3", RHS_VEC_m, NoItinerary, 1, 1>, + "$src3, $src2", "$src2, $src3", RHS_VEC_m, 1, 1>, AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; defm rb_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), - OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, - NoItinerary, 1, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC, - Sched<[WriteFMA]>; + OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, 1, 1>, + AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; let isCodeGenOnly = 1, isCommutable = 1 in { def r : AVX512FMA3S<opc, MRMSrcReg, (outs _.FRC:$dst), @@ -6479,7 +6462,7 @@ multiclass avx512_pmadd52_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), (ins _.RC:$src2, _.RC:$src3), OpcodeStr, "$src3, $src2", "$src2, $src3", - (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), NoItinerary, 1, 1>, + (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), 1, 1>, AVX512FMA3Base, Sched<[itins.Sched]>; defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), @@ -7679,8 +7662,8 @@ multiclass avx512_cvtps2ph<X86VectorVTInfo _dest, X86VectorVTInfo _src, (ins _src.RC:$src1, i32u8imm:$src2), "vcvtps2ph", "$src2, $src1", "$src1, $src2", (X86cvtps2ph (_src.VT _src.RC:$src1), - (i32 imm:$src2)), - NoItinerary, 0, 0>, AVX512AIi8Base, Sched<[itins.Sched]>; + (i32 imm:$src2)), 0, 0>, + AVX512AIi8Base, Sched<[itins.Sched]>; let hasSideEffects = 0, mayStore = 1 in { def mr : AVX512AIi8<0x1D, MRMDestMem, (outs), (ins x86memop:$dst, _src.RC:$src1, i32u8imm:$src2), @@ -10201,7 +10184,7 @@ multiclass avx512_ternlog<bits<8> opc, string OpcodeStr, SDNode OpNode, (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), (_.VT _.RC:$src3), - (i8 imm:$src4)), NoItinerary, 1, 1>, + (i8 imm:$src4)), 1, 1>, AVX512AIi8Base, EVEX_4V, Sched<[itins.Sched]>; defm rmi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), (ins _.RC:$src2, _.MemOp:$src3, u8imm:$src4), @@ -10209,7 +10192,7 @@ multiclass avx512_ternlog<bits<8> opc, string OpcodeStr, SDNode OpNode, (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), (_.VT (bitconvert (_.LdFrag addr:$src3))), - (i8 imm:$src4)), NoItinerary, 1, 0>, + (i8 imm:$src4)), 1, 0>, AVX512AIi8Base, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>, Sched<[itins.Sched.Folded, ReadAfterLd]>; defm rmbi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), @@ -10219,7 +10202,7 @@ multiclass avx512_ternlog<bits<8> opc, string OpcodeStr, SDNode OpNode, (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), - (i8 imm:$src4)), NoItinerary, 1, 0>, EVEX_B, + (i8 imm:$src4)), 1, 0>, EVEX_B, AVX512AIi8Base, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>, Sched<[itins.Sched.Folded, ReadAfterLd]>; }// Constraints = "$src1 = $dst" diff --git a/llvm/lib/Target/X86/X86InstrFormats.td b/llvm/lib/Target/X86/X86InstrFormats.td index eb52275f758..56d9f0229e4 100644 --- a/llvm/lib/Target/X86/X86InstrFormats.td +++ b/llvm/lib/Target/X86/X86InstrFormats.td @@ -244,9 +244,7 @@ class FoldGenData<string _RegisterForm> { class NotMemoryFoldable { bit isMemoryFoldable = 0; } class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins, - string AsmStr, - InstrItinClass itin, - Domain d = GenericDomain> + string AsmStr, Domain d = GenericDomain> : Instruction { let Namespace = "X86"; @@ -262,7 +260,7 @@ class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins, // If this is a pseudo instruction, mark it isCodeGenOnly. let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo"); - let Itinerary = itin; + let Itinerary = NoItinerary; // // Attributes specific to X86 instructions... @@ -357,75 +355,71 @@ class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins, let TSFlags{53} = hasNoTrackPrefix; } -class PseudoI<dag oops, dag iops, list<dag> pattern, - InstrItinClass itin = NoItinerary> - : X86Inst<0, Pseudo, NoImm, oops, iops, "", itin> { +class PseudoI<dag oops, dag iops, list<dag> pattern> + : X86Inst<0, Pseudo, NoImm, oops, iops, ""> { let Pattern = pattern; } class I<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary, - Domain d = GenericDomain> - : X86Inst<o, f, NoImm, outs, ins, asm, itin, d> { + list<dag> pattern, Domain d = GenericDomain> + : X86Inst<o, f, NoImm, outs, ins, asm, d> { let Pattern = pattern; let CodeSize = 3; } -class Ii8 <bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary, - Domain d = GenericDomain> - : X86Inst<o, f, Imm8, outs, ins, asm, itin, d> { +class Ii8<bits<8> o, Format f, dag outs, dag ins, string asm, + list<dag> pattern, Domain d = GenericDomain> + : X86Inst<o, f, Imm8, outs, ins, asm, d> { let Pattern = pattern; let CodeSize = 3; } class Ii8Reg<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary, - Domain d = GenericDomain> - : X86Inst<o, f, Imm8Reg, outs, ins, asm, itin, d> { + list<dag> pattern, Domain d = GenericDomain> + : X86Inst<o, f, Imm8Reg, outs, ins, asm, d> { let Pattern = pattern; let CodeSize = 3; } class Ii8PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm8PCRel, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm8PCRel, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm16, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm16, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm32, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm32, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii32S<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm32S, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm32S, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii64<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm64, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm64, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii16PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm16PCRel, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm16PCRel, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Ii32PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm32PCRel, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm32PCRel, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } @@ -448,24 +442,23 @@ class FpI_<dag outs, dag ins, FPFormat fp, list<dag> pattern> // Iseg32 - 16-bit segment selector, 32-bit offset class Iseg16 <bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm16, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm16, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } class Iseg32 <bits<8> o, Format f, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : X86Inst<o, f, Imm32, outs, ins, asm, itin> { + list<dag> pattern> + : X86Inst<o, f, Imm32, outs, ins, asm> { let Pattern = pattern; let CodeSize = 3; } // SI - SSE 1 & 2 scalar instructions class SI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary, - Domain d = GenericDomain> - : I<o, F, outs, ins, asm, pattern, itin, d> { + list<dag> pattern, Domain d = GenericDomain> + : I<o, F, outs, ins, asm, pattern, d> { let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX], !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], @@ -481,9 +474,8 @@ class SI<bits<8> o, Format F, dag outs, dag ins, string asm, // SI - SSE 1 & 2 scalar intrinsics - vex form available on AVX512 class SI_Int<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary, - Domain d = GenericDomain> - : I<o, F, outs, ins, asm, pattern, itin, d> { + list<dag> pattern, Domain d = GenericDomain> + : I<o, F, outs, ins, asm, pattern, d> { let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX], !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], @@ -498,8 +490,8 @@ class SI_Int<bits<8> o, Format F, dag outs, dag ins, string asm, } // SIi8 - SSE 1 & 2 scalar instructions - vex form available on AVX512 class SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin> { + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern> { let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], @@ -513,8 +505,8 @@ class SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, // PI - SSE 1 & 2 packed instructions class PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, - InstrItinClass itin, Domain d> - : I<o, F, outs, ins, asm, pattern, itin, d> { + Domain d> + : I<o, F, outs, ins, asm, pattern, d> { let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], @@ -529,15 +521,15 @@ class PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, // MMXPI - SSE 1 & 2 packed instructions with MMX operands class MMXPI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, Domain d> - : I<o, F, outs, ins, asm, pattern, NoItinerary, d> { + : I<o, F, outs, ins, asm, pattern, d> { let Predicates = !if(!eq(OpPrefix.Value, PD.Value), [HasSSE2], [HasSSE1]); } // PIi8 - SSE 1 & 2 packed instructions with immediate class PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin, Domain d> - : Ii8<o, F, outs, ins, asm, pattern, itin, d> { + list<dag> pattern, Domain d> + : Ii8<o, F, outs, ins, asm, pattern, d> { let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], @@ -558,26 +550,26 @@ class PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, // VPSI - SSE1 instructions with PS prefix in AVX form, packed single. class SSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>; + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE1]>; class SSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>; + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE1]>; class PSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, PS, Requires<[UseSSE1]>; class PSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedSingle>, PS, Requires<[UseSSE1]>; class VSSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern>, XS, Requires<[HasAVX]>; class VPSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedSingle>, PS, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedSingle>, PS, Requires<[HasAVX]>; // SSE2 Instruction Templates: @@ -599,44 +591,44 @@ class VPSI<bits<8> o, Format F, dag outs, dag ins, string asm, // MMX operands. class SDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>; + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, XD, Requires<[UseSSE2]>; class SDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>; + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern>, XD, Requires<[UseSSE2]>; class S2SI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE2]>; + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE2]>; class S2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> + list<dag> pattern> : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE2]>; class PDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, PD, Requires<[UseSSE2]>; class PDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedDouble>, PD, Requires<[UseSSE2]>; class VSDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XD, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern>, XD, Requires<[UseAVX]>; class VS2SI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern>, XS, Requires<[HasAVX]>; class VPDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedDouble>, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedDouble>, PD, Requires<[HasAVX]>; class VS2I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, PD, + list<dag> pattern> + : I<o, F, outs, ins, !strconcat("v", asm), pattern>, PD, Requires<[UseAVX]>; class S2I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, PD, Requires<[UseSSE2]>; + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, PD, Requires<[UseSSE2]>; class MMXSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> : Ii8<o, F, outs, ins, asm, pattern>, XD, Requires<[HasSSE2]>; @@ -651,16 +643,16 @@ class MMXS2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, // S3DI - SSE3 instructions with XD prefix. class S3SI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, XS, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, XS, Requires<[UseSSE3]>; class S3DI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, XD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, XD, Requires<[UseSSE3]>; class S3I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, PD, Requires<[UseSSE3]>; @@ -676,20 +668,20 @@ class S3I<bits<8> o, Format F, dag outs, dag ins, string asm, // classes. They need to be enabled even if AVX is enabled. class SS38I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[UseSSSE3]>; class SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[UseSSSE3]>; class MMXSS38I<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : I<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, T8PS, + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PS, Requires<[HasSSSE3]>; class MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : Ii8<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, TAPS, + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPS, Requires<[HasSSSE3]>; // SSE4.1 Instruction Templates: @@ -698,20 +690,20 @@ class MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, // SS41AIi8 - SSE 4.1 instructions with TA prefix and ImmT == Imm8. // class SS48I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[UseSSE41]>; class SS4AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[UseSSE41]>; // SSE4.2 Instruction Templates: // // SS428I - SSE 4.2 instructions with T8 prefix. class SS428I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[UseSSE42]>; // SS42FI - SSE 4.2 instructions with T8XD prefix. @@ -723,7 +715,7 @@ class SS42FI<bits<8> o, Format F, dag outs, dag ins, string asm, // SS42AI = SSE 4.2 instructions with TA prefix class SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : Ii8<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, TAPD, + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[UseSSE42]>; // AVX Instruction Templates: @@ -732,12 +724,12 @@ class SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm, // AVX8I - AVX instructions with T8PD prefix. // AVXAIi8 - AVX instructions with TAPD prefix and ImmT = Imm8. class AVX8I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[HasAVX]>; class AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[HasAVX]>; // AVX2 Instruction Templates: @@ -746,12 +738,12 @@ class AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm, // AVX28I - AVX2 instructions with T8PD prefix. // AVX2AIi8 - AVX2 instructions with TAPD prefix and ImmT = Imm8. class AVX28I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[HasAVX2]>; class AVX2AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[HasAVX2]>; @@ -768,34 +760,34 @@ class AVX2AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, // AVX512SI - AVX-512 scalar instructions with PD prefix. class AVX5128I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[HasAVX512]>; class AVX5128IBase : T8PD { Domain ExeDomain = SSEPackedInt; } class AVX512XS8I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8XS, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8XS, Requires<[HasAVX512]>; class AVX512XSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, XS, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, XS, Requires<[HasAVX512]>; class AVX512XDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, XD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, XD, Requires<[HasAVX512]>; class AVX512BI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, PD, Requires<[HasAVX512]>; class AVX512BIBase : PD { Domain ExeDomain = SSEPackedInt; } class AVX512BIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, PD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, PD, Requires<[HasAVX512]>; class AVX512BIi8Base : PD { Domain ExeDomain = SSEPackedInt; @@ -818,39 +810,39 @@ class AVX512PDIi8Base : PD { ImmType ImmT = Imm8; } class AVX512AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[HasAVX512]>; class AVX512AIi8Base : TAPD { ImmType ImmT = Imm8; } class AVX512Ii8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, Requires<[HasAVX512]>; class AVX512PDI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, PD, Requires<[HasAVX512]>; class AVX512PSI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS, + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, PS, Requires<[HasAVX512]>; class AVX512PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, Domain d, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin, d>, Requires<[HasAVX512]>; + list<dag> pattern, Domain d> + : Ii8<o, F, outs, ins, asm, pattern, d>, Requires<[HasAVX512]>; class AVX512PI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, Domain d, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin, d>, Requires<[HasAVX512]>; + list<dag> pattern, Domain d> + : I<o, F, outs, ins, asm, pattern, d>, Requires<[HasAVX512]>; class AVX512FMA3S<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag>pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, T8PD, + list<dag>pattern> + : I<o, F, outs, ins, asm, pattern>, T8PD, EVEX_4V, Requires<[HasAVX512]>; class AVX512FMA3Base : T8PD, EVEX_4V; class AVX512<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag>pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, Requires<[HasAVX512]>; + list<dag>pattern> + : I<o, F, outs, ins, asm, pattern>, Requires<[HasAVX512]>; // AES Instruction Templates: // @@ -858,18 +850,18 @@ class AVX512<bits<8> o, Format F, dag outs, dag ins, string asm, // These use the same encoding as the SSE4.2 T8 and TA encodings. class AES8I<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag>pattern> - : I<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, T8PD, + : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8PD, Requires<[NoAVX, HasAES]>; class AESAI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : Ii8<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, TAPD, + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, Requires<[NoAVX, HasAES]>; // PCLMUL Instruction Templates class PCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag>pattern> - : Ii8<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, TAPD; + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD; // FMA3 Instruction Templates class FMA3<bits<8> o, Format F, dag outs, dag ins, string asm, @@ -902,54 +894,54 @@ class FMA4S_Int<bits<8> o, Format F, dag outs, dag ins, string asm, // XOP 2, 3 and 4 Operand Instruction Template class IXOP<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : I<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedDouble>, + : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, XOP9, Requires<[HasXOP]>; // XOP 2 and 3 Operand Instruction Templates with imm byte class IXOPi8<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : Ii8<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedDouble>, + : Ii8<o, F, outs, ins, asm, pattern, SSEPackedDouble>, XOP8, Requires<[HasXOP]>; // XOP 4 Operand Instruction Templates with imm byte class IXOPi8Reg<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern> - : Ii8Reg<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedDouble>, + : Ii8Reg<o, F, outs, ins, asm, pattern, SSEPackedDouble>, XOP8, Requires<[HasXOP]>; // XOP 5 operand instruction (VEX encoding!) class IXOP5<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag>pattern> - : Ii8Reg<o, F, outs, ins, asm, pattern, NoItinerary, SSEPackedInt>, TAPD, + : Ii8Reg<o, F, outs, ins, asm, pattern, SSEPackedInt>, TAPD, VEX_4V, Requires<[HasXOP]>; // X86-64 Instruction templates... // class RI<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : I<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : I<o, F, outs, ins, asm, pattern>, REX_W; class RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii8<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : Ii8<o, F, outs, ins, asm, pattern>, REX_W; class RIi16 <bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii16<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : Ii16<o, F, outs, ins, asm, pattern>, REX_W; class RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii32<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : Ii32<o, F, outs, ins, asm, pattern>, REX_W; class RIi32S <bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii32S<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : Ii32S<o, F, outs, ins, asm, pattern>, REX_W; class RIi64<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : Ii64<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : Ii64<o, F, outs, ins, asm, pattern>, REX_W; class RS2I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : S2I<o, F, outs, ins, asm, pattern, itin>, REX_W; + list<dag> pattern> + : S2I<o, F, outs, ins, asm, pattern>, REX_W; class VRS2I<bits<8> o, Format F, dag outs, dag ins, string asm, - list<dag> pattern, InstrItinClass itin = NoItinerary> - : VS2I<o, F, outs, ins, asm, pattern, itin>, VEX_W; + list<dag> pattern> + : VS2I<o, F, outs, ins, asm, pattern>, VEX_W; // MMX Instruction templates // diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index af51fcd3365..7e4b6a19537 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/lib/Target/X86/X86InstrSSE.td @@ -257,14 +257,14 @@ multiclass sse12_fp_scalar<bits<8> opc, string OpcodeStr, SDNode OpNode, !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (OpNode RC:$src1, RC:$src2))], NoItinerary, d>, + [(set RC:$dst, (OpNode RC:$src1, RC:$src2))], d>, Sched<[itins.Sched]>; } def rm : SI<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (OpNode RC:$src1, (load addr:$src2)))], NoItinerary, d>, + [(set RC:$dst, (OpNode RC:$src1, (load addr:$src2)))], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -279,14 +279,14 @@ let isCodeGenOnly = 1, hasSideEffects = 0 in { !if(Is2Addr, !strconcat(asm, "\t{$src2, $dst|$dst, $src2}"), !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (VT (OpNode RC:$src1, RC:$src2)))], NoItinerary, d>, + [(set RC:$dst, (VT (OpNode RC:$src1, RC:$src2)))], d>, Sched<[itins.Sched]>; let mayLoad = 1 in def rm_Int : SI_Int<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, memopr:$src2), !if(Is2Addr, !strconcat(asm, "\t{$src2, $dst|$dst, $src2}"), !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (VT (OpNode RC:$src1, mem_cpat:$src2)))], NoItinerary, d>, + [(set RC:$dst, (VT (OpNode RC:$src1, mem_cpat:$src2)))], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } } @@ -301,7 +301,7 @@ multiclass sse12_fp_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (vt (OpNode RC:$src1, RC:$src2)))], NoItinerary, d>, + [(set RC:$dst, (vt (OpNode RC:$src1, RC:$src2)))], d>, Sched<[itins.Sched]>; let mayLoad = 1 in def rm : PI<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2), @@ -309,7 +309,7 @@ multiclass sse12_fp_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), [(set RC:$dst, (OpNode RC:$src1, (mem_frag addr:$src2)))], - NoItinerary, d>, + d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -323,14 +323,14 @@ multiclass sse12_fp_packed_logical_rm<bits<8> opc, RegisterClass RC, Domain d, !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - pat_rr, NoItinerary, d>, + pat_rr, d>, Sched<[WriteVecLogic]>; let hasSideEffects = 0, mayLoad = 1 in def rm : PI<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - pat_rm, NoItinerary, d>, + pat_rm, d>, Sched<[WriteVecLogicLd, ReadAfterLd]>; } @@ -406,8 +406,8 @@ multiclass sse12_move_rr<SDNode OpNode, ValueType vt, def rr : SI<0x10, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2), !strconcat(base_opc, asm_opr), - [(set VR128:$dst, (vt (OpNode VR128:$src1, VR128:$src2)))], - NoItinerary, d>, Sched<[WriteFShuffle]>; + [(set VR128:$dst, (vt (OpNode VR128:$src1, VR128:$src2)))], d>, + Sched<[WriteFShuffle]>; // For the disassembler let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in @@ -428,7 +428,7 @@ multiclass sse12_move<RegisterClass RC, SDNode OpNode, ValueType vt, def V#NAME#mr : SI<0x11, MRMDestMem, (outs), (ins x86memop:$dst, RC:$src), !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), - [(store RC:$src, addr:$dst)], NoItinerary, d>, + [(store RC:$src, addr:$dst)], d>, VEX, VEX_LIG, Sched<[WriteStore]>, VEX_WIG; // SSE1 & 2 let Constraints = "$src1 = $dst" in { @@ -438,8 +438,8 @@ multiclass sse12_move<RegisterClass RC, SDNode OpNode, ValueType vt, def NAME#mr : SI<0x11, MRMDestMem, (outs), (ins x86memop:$dst, RC:$src), !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), - [(store RC:$src, addr:$dst)], NoItinerary, d>, - Sched<[WriteStore]>; + [(store RC:$src, addr:$dst)], d>, + Sched<[WriteStore]>; } // Loading from memory automatically zeroing upper bits. @@ -447,12 +447,12 @@ multiclass sse12_move_rm<RegisterClass RC, X86MemOperand x86memop, PatFrag mem_pat, string OpcodeStr, Domain d> { def V#NAME#rm : SI<0x10, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src), !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), - [(set RC:$dst, (mem_pat addr:$src))], - NoItinerary, d>, VEX, VEX_LIG, Sched<[WriteLoad]>, VEX_WIG; + [(set RC:$dst, (mem_pat addr:$src))], d>, + VEX, VEX_LIG, Sched<[WriteLoad]>, VEX_WIG; def NAME#rm : SI<0x10, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src), !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), - [(set RC:$dst, (mem_pat addr:$src))], - NoItinerary, d>, Sched<[WriteLoad]>; + [(set RC:$dst, (mem_pat addr:$src))], d>, + Sched<[WriteLoad]>; } defm MOVSS : sse12_move<FR32, X86Movss, v4f32, f32mem, "movss", @@ -638,12 +638,12 @@ multiclass sse12_mov_packed<bits<8> opc, RegisterClass RC, OpndItins itins> { let hasSideEffects = 0 in def rr : PI<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src), - !strconcat(asm, "\t{$src, $dst|$dst, $src}"), [], NoItinerary, d>, + !strconcat(asm, "\t{$src, $dst|$dst, $src}"), [], d>, Sched<[WriteFMove]>; let canFoldAsLoad = 1, isReMaterializable = 1 in def rm : PI<opc, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src), !strconcat(asm, "\t{$src, $dst|$dst, $src}"), - [(set RC:$dst, (ld_frag addr:$src))], NoItinerary, d>, + [(set RC:$dst, (ld_frag addr:$src))], d>, Sched<[WriteFLoad]>; } @@ -880,7 +880,7 @@ multiclass sse12_mov_hilo_packed_base<bits<8>opc, SDNode psnode, SDNode pdnode, [(set VR128:$dst, (psnode VR128:$src1, (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2))))))], - NoItinerary, SSEPackedSingle>, PS, + SSEPackedSingle>, PS, Sched<[WriteFShuffleLd, ReadAfterLd]>; def PDrm : PI<opc, MRMSrcMem, @@ -888,7 +888,7 @@ multiclass sse12_mov_hilo_packed_base<bits<8>opc, SDNode psnode, SDNode pdnode, !strconcat(base_opc, "d", asm_opr), [(set VR128:$dst, (v2f64 (pdnode VR128:$src1, (scalar_to_vector (loadf64 addr:$src2)))))], - NoItinerary, SSEPackedDouble>, PD, + SSEPackedDouble>, PD, Sched<[WriteFShuffleLd, ReadAfterLd]>; } @@ -1202,13 +1202,13 @@ multiclass sse12_cvt_p<bits<8> opc, RegisterClass RC, X86MemOperand x86memop, string asm, Domain d, OpndItins itins> { let hasSideEffects = 0 in { def rr : I<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src), asm, - [(set RC:$dst, (DstTy (sint_to_fp (SrcTy RC:$src))))], - NoItinerary, d>, Sched<[itins.Sched]>; + [(set RC:$dst, (DstTy (sint_to_fp (SrcTy RC:$src))))], d>, + Sched<[itins.Sched]>; let mayLoad = 1 in def rm : I<opc, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src), asm, [(set RC:$dst, (DstTy (sint_to_fp - (SrcTy (bitconvert (ld_frag addr:$src))))))], - NoItinerary, d>, Sched<[itins.Sched.Folded]>; + (SrcTy (bitconvert (ld_frag addr:$src))))))], d>, + Sched<[itins.Sched.Folded]>; } } @@ -2308,26 +2308,23 @@ multiclass sse12_cmp_packed<RegisterClass RC, X86MemOperand x86memop, let isCommutable = 1 in def rri : PIi8<0xC2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, CC:$cc), asm, - [(set RC:$dst, (VT (X86cmpp RC:$src1, RC:$src2, imm:$cc)))], - NoItinerary, d>, + [(set RC:$dst, (VT (X86cmpp RC:$src1, RC:$src2, imm:$cc)))], d>, Sched<[WriteFAdd]>; def rmi : PIi8<0xC2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2, CC:$cc), asm, [(set RC:$dst, - (VT (X86cmpp RC:$src1, (ld_frag addr:$src2), imm:$cc)))], - NoItinerary, d>, + (VT (X86cmpp RC:$src1, (ld_frag addr:$src2), imm:$cc)))], d>, Sched<[WriteFAddLd, ReadAfterLd]>; // Accept explicit immediate argument form instead of comparison code. let isAsmParserOnly = 1, hasSideEffects = 0 in { def rri_alt : PIi8<0xC2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, u8imm:$cc), - asm_alt, [], NoItinerary, d>, Sched<[WriteFAdd]>; + asm_alt, [], d>, Sched<[WriteFAdd]>; let mayLoad = 1 in def rmi_alt : PIi8<0xC2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2, u8imm:$cc), - asm_alt, [], NoItinerary, d>, - Sched<[WriteFAddLd, ReadAfterLd]>; + asm_alt, [], d>, Sched<[WriteFAddLd, ReadAfterLd]>; } } @@ -2426,12 +2423,12 @@ multiclass sse12_shuffle<RegisterClass RC, X86MemOperand x86memop, def rmi : PIi8<0xC6, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2, u8imm:$src3), asm, [(set RC:$dst, (vt (X86Shufp RC:$src1, (mem_frag addr:$src2), - (i8 imm:$src3))))], NoItinerary, d>, + (i8 imm:$src3))))], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; def rri : PIi8<0xC6, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, u8imm:$src3), asm, [(set RC:$dst, (vt (X86Shufp RC:$src1, RC:$src2, - (i8 imm:$src3))))], NoItinerary, d>, + (i8 imm:$src3))))], d>, Sched<[itins.Sched]>; } @@ -2476,14 +2473,13 @@ multiclass sse12_unpack_interleave<bits<8> opc, SDNode OpNode, ValueType vt, def rr : PI<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2), asm, [(set RC:$dst, - (vt (OpNode RC:$src1, RC:$src2)))], - NoItinerary, d>, Sched<[itins.Sched]>; + (vt (OpNode RC:$src1, RC:$src2)))], d>, + Sched<[itins.Sched]>; def rm : PI<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2), asm, [(set RC:$dst, (vt (OpNode RC:$src1, - (mem_frag addr:$src2))))], - NoItinerary, d>, + (mem_frag addr:$src2))))], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -2559,7 +2555,7 @@ multiclass sse12_extr_sign_mask<RegisterClass RC, ValueType vt, string asm, Domain d> { def rr : PI<0x50, MRMSrcReg, (outs GR32orGR64:$dst), (ins RC:$src), !strconcat(asm, "\t{$src, $dst|$dst, $src}"), - [(set GR32orGR64:$dst, (X86movmsk (vt RC:$src)))], NoItinerary, d>, + [(set GR32orGR64:$dst, (X86movmsk (vt RC:$src)))], d>, Sched<[WriteFMOVMSK]>; } @@ -3103,12 +3099,12 @@ multiclass sse_fp_unop_s<bits<8> opc, string OpcodeStr, RegisterClass RC, let hasSideEffects = 0 in { def r : I<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src1), !strconcat(OpcodeStr, "\t{$src1, $dst|$dst, $src1}"), - [(set RC:$dst, (OpNode RC:$src1))], NoItinerary, d>, Sched<[itins.Sched]>, + [(set RC:$dst, (OpNode RC:$src1))], d>, Sched<[itins.Sched]>, Requires<[target]>; let mayLoad = 1 in def m : I<opc, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src1), !strconcat(OpcodeStr, "\t{$src1, $dst|$dst, $src1}"), - [(set RC:$dst, (OpNode (load addr:$src1)))], NoItinerary, d>, + [(set RC:$dst, (OpNode (load addr:$src1)))], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>, Requires<[target, OptForSize]>; @@ -3152,11 +3148,11 @@ multiclass avx_fp_unop_s<bits<8> opc, string OpcodeStr, RegisterClass RC, let hasSideEffects = 0 in { def r : I<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), - [], NoItinerary, d>, Sched<[itins.Sched]>; + [], d>, Sched<[itins.Sched]>; let mayLoad = 1 in def m : I<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), - [], NoItinerary, d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; + [], d>, Sched<[itins.Sched.Folded, ReadAfterLd]>; let isCodeGenOnly = 1, ExeDomain = d in { def r_Int : I<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2), @@ -3769,23 +3765,23 @@ multiclass PDI_binop_rmi<bits<8> opc, bits<8> opc2, Format ImmForm, !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (DstVT (OpNode RC:$src1, (SrcVT VR128:$src2))))], - SSE_INTSHIFT_ITINS_P.rr>, Sched<[WriteVecShift]>; + [(set RC:$dst, (DstVT (OpNode RC:$src1, (SrcVT VR128:$src2))))]>, + Sched<[WriteVecShift]>; def rm : PDI<opc, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, i128mem:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), [(set RC:$dst, (DstVT (OpNode RC:$src1, - (SrcVT (bitconvert (ld_frag addr:$src2))))))], - SSE_INTSHIFT_ITINS_P.rm>, Sched<[WriteVecShiftLd, ReadAfterLd]>; + (SrcVT (bitconvert (ld_frag addr:$src2))))))]>, + Sched<[WriteVecShiftLd, ReadAfterLd]>; def ri : PDIi8<opc2, ImmForm, (outs RC:$dst), (ins RC:$src1, u8imm:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set RC:$dst, (DstVT (OpNode2 RC:$src1, (i8 imm:$src2))))], - SSE_INTSHIFT_ITINS_P.ri>, Sched<[WriteVecShift]>; + [(set RC:$dst, (DstVT (OpNode2 RC:$src1, (i8 imm:$src2))))]>, + Sched<[WriteVecShift]>; } multiclass PDI_binop_rmi_all<bits<8> opc, bits<8> opc2, Format ImmForm, @@ -6552,7 +6548,7 @@ multiclass SS41I_quaternary_int_avx<bits<8> opc, string OpcodeStr, !strconcat(OpcodeStr, "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"), [(set RC:$dst, (IntId RC:$src1, RC:$src2, RC:$src3))], - NoItinerary, SSEPackedInt>, TAPD, VEX_4V, + SSEPackedInt>, TAPD, VEX_4V, Sched<[itins.Sched]>; def rm : Ii8Reg<opc, MRMSrcMem, (outs RC:$dst), @@ -6561,8 +6557,7 @@ multiclass SS41I_quaternary_int_avx<bits<8> opc, string OpcodeStr, "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"), [(set RC:$dst, (IntId RC:$src1, (bitconvert (mem_frag addr:$src2)), - RC:$src3))], - NoItinerary, SSEPackedInt>, TAPD, VEX_4V, + RC:$src3))], SSEPackedInt>, TAPD, VEX_4V, Sched<[itins.Sched.Folded, ReadAfterLd, // x86memop:$src2 ReadDefault, ReadDefault, ReadDefault, ReadDefault, @@ -8500,14 +8495,12 @@ multiclass GF2P8MULB_rm<string OpcodeStr, ValueType OpVT, OpcodeStr##"\t{$src2, $src1, $dst|$dst, $src1, $src2}") in { let isCommutable = 1 in def rr : PDI<0xCF, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2), "", - [(set RC:$dst, (OpVT (X86GF2P8mulb RC:$src1, RC:$src2)))], - SSE_INTALU_ITINS_P.rr>, + [(set RC:$dst, (OpVT (X86GF2P8mulb RC:$src1, RC:$src2)))]>, Sched<[SSE_INTALU_ITINS_P.Sched]>, T8PD; def rm : PDI<0xCF, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, X86MemOp:$src2), "", [(set RC:$dst, (OpVT (X86GF2P8mulb RC:$src1, - (bitconvert (MemOpFrag addr:$src2)))))], - SSE_INTALU_ITINS_P.rm>, + (bitconvert (MemOpFrag addr:$src2)))))]>, Sched<[SSE_INTALU_ITINS_P.Sched.Folded, ReadAfterLd]>, T8PD; } } @@ -8521,14 +8514,12 @@ multiclass GF2P8AFFINE_rmi<bits<8> Op, string OpStr, ValueType OpVT, def rri : Ii8<Op, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, u8imm:$src3), "", [(set RC:$dst, (OpVT (OpNode RC:$src1, RC:$src2, imm:$src3)))], - SSE_INTALU_ITINS_P.rr, SSEPackedInt>, - Sched<[WriteVecALU]>; + SSEPackedInt>, Sched<[WriteVecALU]>; def rmi : Ii8<Op, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, X86MemOp:$src2, u8imm:$src3), "", [(set RC:$dst, (OpVT (OpNode RC:$src1, (bitconvert (MemOpFrag addr:$src2)), - imm:$src3)))], - SSE_INTALU_ITINS_P.rm, SSEPackedInt>, + imm:$src3)))], SSEPackedInt>, Sched<[WriteVecALU.Folded, ReadAfterLd]>; } } |