diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td --- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td +++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td @@ -1706,7 +1706,7 @@ let mayLoad = 1 in class BaseAuthLoad + string operands, string cstr> : I, Sched<[]> { bits<10> offset; bits<5> Rn; @@ -1728,11 +1728,11 @@ multiclass AuthLoad { def indexed : BaseAuthLoad; + asm, "\t$Rt, [$Rn, $offset]", "">; def writeback : BaseAuthLoad; + "$Rn = $wback,@earlyclobber $wback">; def : InstAlias(NAME # "indexed") GPR64:$Rt, GPR64sp:$Rn, 0)>; @@ -2196,16 +2196,14 @@ let Inst{4-0} = Rd; } -multiclass MulAccum { +multiclass MulAccum { // MADD/MSUB generation is decided by MachineCombiner.cpp - def Wrrr : BaseMulAccum, + def Wrrr : BaseMulAccum, Sched<[WriteIM32, ReadIM, ReadIM, ReadIMA]> { let Inst{31} = 0; } - def Xrrr : BaseMulAccum, + def Xrrr : BaseMulAccum, Sched<[WriteIM64, ReadIM, ReadIM, ReadIMA]> { let Inst{31} = 1; } @@ -3424,8 +3422,8 @@ def ro128 : ROAddrMode; -class LoadStore8RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list pat> +class LoadStore8RO sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list pat> : I { bits<5> Rt; bits<5> Rn; @@ -3453,7 +3451,7 @@ multiclass Load8RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore8RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore8RO(NAME # "roX")>; } -class LoadStore16RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list pat> +class LoadStore16RO sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list pat> : I { bits<5> Rt; bits<5> Rn; @@ -3527,7 +3525,7 @@ multiclass Load16RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore16RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore16RO(NAME # "roX")>; } -class LoadStore32RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list pat> +class LoadStore32RO sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list pat> : I { bits<5> Rt; bits<5> Rn; @@ -3599,7 +3597,7 @@ multiclass Load32RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore32RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore32RO(NAME # "roX")>; } -class LoadStore64RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list pat> +class LoadStore64RO sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list pat> : I { bits<5> Rt; bits<5> Rn; @@ -3671,7 +3669,7 @@ multiclass Load64RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in - def roW : LoadStore64RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in - def roW : LoadStore64RO(NAME # "roX")>; } -class LoadStore128RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list pat> +class LoadStore128RO sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list pat> : I { bits<5> Rt; bits<5> Rn; @@ -3743,7 +3741,7 @@ multiclass Load128RO sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in - def roW : LoadStore128RO sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, ValueType Ty, SDPatternOperator storeop> { + string asm> { let mayLoad = 0, mayStore = 1, hasSideEffects = 0 in - def roW : LoadStore128RO, Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { @@ -3776,7 +3774,7 @@ } let mayLoad = 0, mayStore = 1, hasSideEffects = 0 in - def roX : LoadStore128RO, Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { @@ -6820,8 +6818,7 @@ def v1i16 : BaseSIMDThreeScalar; } -multiclass SIMDThreeScalarHSTied opc, string asm, - SDPatternOperator OpNode = null_frag> { +multiclass SIMDThreeScalarHSTied opc, string asm> { def v1i32: BaseSIMDThreeScalarTied; @@ -7239,7 +7236,7 @@ class SIMDDupFromElement + SDNode OpNode> : BaseSIMDInsDup { + VectorIndexD, AArch64duplane64> { bits<1> idx; let Inst{20} = idx; let Inst{19-16} = 0b1000; @@ -7259,7 +7256,7 @@ class SIMDDup32FromElement : SIMDDupFromElement { + VectorIndexS, AArch64duplane32> { bits<2> idx; let Inst{20-19} = idx; let Inst{18-16} = 0b100; @@ -7268,7 +7265,7 @@ class SIMDDup16FromElement : SIMDDupFromElement { + VectorIndexH, AArch64duplane16> { bits<3> idx; let Inst{20-18} = idx; let Inst{17-16} = 0b10; @@ -7277,7 +7274,7 @@ class SIMDDup8FromElement : SIMDDupFromElement { + VectorIndexB, AArch64duplane8> { bits<4> idx; let Inst{20-17} = idx; let Inst{16} = 1; @@ -10874,8 +10871,8 @@ // The complex instructions index by pairs of elements, so the VectorIndexes // don't match the lane types, and the index bits are different to the other // classes. -multiclass SIMDIndexedTiedComplexHSD { +multiclass SIMDIndexedTiedComplexHSD { let Predicates = [HasComplxNum, HasNEON, HasFullFP16] in { def v4f16_indexed : BaseSIMDIndexedTiedComplex<0, 1, 0, 0b01, opc1, opc2, V64, V64, V128, VectorIndexD, rottype, asm, ".4h", ".4h", diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -1061,8 +1061,7 @@ "fcmla", null_frag>; defm FCADD : SIMDThreeSameVectorComplexHSD<1, 0b111, complexrotateopodd, "fcadd", null_frag>; -defm FCMLA : SIMDIndexedTiedComplexHSD<1, 0, 1, complexrotateop, "fcmla", - null_frag>; +defm FCMLA : SIMDIndexedTiedComplexHSD<0, 1, complexrotateop, "fcmla">; let Predicates = [HasComplxNum, HasNEON, HasFullFP16] in { def : Pat<(v4f16 (int_aarch64_neon_vcadd_rot90 (v4f16 V64:$Rn), (v4f16 V64:$Rm))), @@ -1647,8 +1646,8 @@ // Multiply-add let AddedComplexity = 5 in { -defm MADD : MulAccum<0, "madd", add>; -defm MSUB : MulAccum<1, "msub", sub>; +defm MADD : MulAccum<0, "madd">; +defm MSUB : MulAccum<1, "msub">; def : Pat<(i32 (mul GPR32:$Rn, GPR32:$Rm)), (MADDWrrr GPR32:$Rn, GPR32:$Rm, WZR)>; @@ -3141,7 +3140,7 @@ defm STRH : Store16RO<0b01, 1, 0b00, FPR16Op, "str", f16, store>; defm STRS : Store32RO<0b10, 1, 0b00, FPR32Op, "str", f32, store>; defm STRD : Store64RO<0b11, 1, 0b00, FPR64Op, "str", f64, store>; -defm STRQ : Store128RO<0b00, 1, 0b10, FPR128Op, "str", f128, store>; +defm STRQ : Store128RO<0b00, 1, 0b10, FPR128Op, "str">; let Predicates = [UseSTRQro], AddedComplexity = 10 in { def : Pat<(store (f128 FPR128:$Rt),