diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td | 349 |
1 files changed, 222 insertions, 127 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td index 9bc2539e95f0..cd4bc8a61a8a 100644 --- a/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td +++ b/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrFormats.td @@ -721,6 +721,7 @@ def tvecshiftR64 : Operand<i32>, TImmLeaf<i32, [{ let ParserMatchClass = Imm1_64Operand; } +def Imm0_0Operand : AsmImmRange<0, 0>; def Imm0_1Operand : AsmImmRange<0, 1>; def Imm0_3Operand : AsmImmRange<0, 3>; def Imm0_7Operand : AsmImmRange<0, 7>; @@ -845,13 +846,13 @@ def logical_imm64_not : Operand<i64> { let ParserMatchClass = LogicalImm64NotOperand; } -// iXX_imm0_65535 predicates - True if the immediate is in the range [0,65535]. +// immXX_0_65535 predicates - True if the immediate is in the range [0,65535]. let ParserMatchClass = AsmImmRange<0, 65535>, PrintMethod = "printImmHex" in { -def i32_imm0_65535 : Operand<i32>, TImmLeaf<i32, [{ +def timm32_0_65535 : Operand<i32>, TImmLeaf<i32, [{ return ((uint32_t)Imm) < 65536; }]>; -def i64_imm0_65535 : Operand<i64>, TImmLeaf<i64, [{ +def timm64_0_65535 : Operand<i64>, TImmLeaf<i64, [{ return ((uint64_t)Imm) < 65536; }]>; } @@ -955,8 +956,8 @@ def imm0_3 : Operand<i64>, ImmLeaf<i64, [{ let ParserMatchClass = Imm0_3Operand; } -// imm32_0_7 predicate - True if the 32-bit immediate is in the range [0,7] -def imm32_0_7 : Operand<i32>, TImmLeaf<i32, [{ +// timm32_0_7 predicate - True if the 32-bit immediate is in the range [0,7] +def timm32_0_7 : Operand<i32>, TImmLeaf<i32, [{ return ((uint32_t)Imm) < 8; }]> { let ParserMatchClass = Imm0_7Operand; @@ -1215,6 +1216,18 @@ def fpimm0 : FPImmLeaf<fAny, [{ return Imm.isExactlyValue(+0.0); }]>; +def fpimm_half : FPImmLeaf<fAny, [{ + return Imm.isExactlyValue(+0.5); +}]>; + +def fpimm_one : FPImmLeaf<fAny, [{ + return Imm.isExactlyValue(+1.0); +}]>; + +def fpimm_two : FPImmLeaf<fAny, [{ + return Imm.isExactlyValue(+2.0); +}]>; + def gi_fpimm16 : GICustomOperandRenderer<"renderFPImm16">, GISDNodeXFormEquiv<fpimm16XForm>; def gi_fpimm32 : GICustomOperandRenderer<"renderFPImm32">, @@ -1241,12 +1254,15 @@ multiclass VectorIndex<ValueType ty, AsmOperandClass mc, code pred> { def _timm : AsmVectorIndexOpnd<ty, mc>, TImmLeaf<ty, pred>; } +def VectorIndex0Operand : AsmVectorIndex<0, 0>; def VectorIndex1Operand : AsmVectorIndex<1, 1>; def VectorIndexBOperand : AsmVectorIndex<0, 15>; def VectorIndexHOperand : AsmVectorIndex<0, 7>; def VectorIndexSOperand : AsmVectorIndex<0, 3>; def VectorIndexDOperand : AsmVectorIndex<0, 1>; +defm VectorIndex0 : VectorIndex<i64, VectorIndex0Operand, + [{ return ((uint64_t)Imm) == 0; }]>; defm VectorIndex1 : VectorIndex<i64, VectorIndex1Operand, [{ return ((uint64_t)Imm) == 1; }]>; defm VectorIndexB : VectorIndex<i64, VectorIndexBOperand, @@ -1291,6 +1307,37 @@ defm sve_elm_idx_extdup_q : VectorIndex<i64, SVEVectorIndexExtDupQOperand, [{ return ((uint64_t)Imm) < 4; }]>; +def sme_elm_idx0_0 : Operand<i64>, ImmLeaf<i64, [{ + return ((uint64_t)Imm) == 0; +}]> { + let ParserMatchClass = Imm0_0Operand; + let PrintMethod = "printMatrixIndex"; +} +def sme_elm_idx0_1 : Operand<i64>, ImmLeaf<i64, [{ + return ((uint64_t)Imm) <= 1; +}]> { + let ParserMatchClass = Imm0_1Operand; + let PrintMethod = "printMatrixIndex"; +} +def sme_elm_idx0_3 : Operand<i64>, ImmLeaf<i64, [{ + return ((uint64_t)Imm) <= 3; +}]> { + let ParserMatchClass = Imm0_3Operand; + let PrintMethod = "printMatrixIndex"; +} +def sme_elm_idx0_7 : Operand<i64>, ImmLeaf<i64, [{ + return ((uint64_t)Imm) <= 7; +}]> { + let ParserMatchClass = Imm0_7Operand; + let PrintMethod = "printMatrixIndex"; +} +def sme_elm_idx0_15 : Operand<i64>, ImmLeaf<i64, [{ + return ((uint64_t)Imm) <= 15; +}]> { + let ParserMatchClass = Imm0_15Operand; + let PrintMethod = "printMatrixIndex"; +} + // 8-bit immediate for AdvSIMD where 64-bit values of the form: // aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh // are encoded as the eight bit value 'abcdefgh'. @@ -1379,7 +1426,7 @@ class TMSystemINoOperand<bits<4> CRm, string asm, list<dag> pattern> // System instructions for exit from transactions class TMSystemException<bits<3> op1, string asm, list<dag> pattern> - : I<(outs), (ins i64_imm0_65535:$imm), asm, "\t$imm", "", pattern>, + : I<(outs), (ins timm64_0_65535:$imm), asm, "\t$imm", "", pattern>, Sched<[WriteSys]> { bits<16> imm; let Inst{31-24} = 0b11010100; @@ -1703,7 +1750,7 @@ class AuthReturn<bits<3> op, bits<1> M, string asm> let mayLoad = 1 in class BaseAuthLoad<bit M, bit W, dag oops, dag iops, string asm, - string operands, string cstr, Operand opr> + string operands, string cstr> : I<oops, iops, asm, operands, cstr, []>, Sched<[]> { bits<10> offset; bits<5> Rn; @@ -1725,11 +1772,11 @@ class BaseAuthLoad<bit M, bit W, dag oops, dag iops, string asm, multiclass AuthLoad<bit M, string asm, Operand opr> { def indexed : BaseAuthLoad<M, 0, (outs GPR64:$Rt), (ins GPR64sp:$Rn, opr:$offset), - asm, "\t$Rt, [$Rn, $offset]", "", opr>; + asm, "\t$Rt, [$Rn, $offset]", "">; def writeback : BaseAuthLoad<M, 1, (outs GPR64sp:$wback, GPR64:$Rt), (ins GPR64sp:$Rn, opr:$offset), asm, "\t$Rt, [$Rn, $offset]!", - "$Rn = $wback,@earlyclobber $wback", opr>; + "$Rn = $wback,@earlyclobber $wback">; def : InstAlias<asm # "\t$Rt, [$Rn]", (!cast<Instruction>(NAME # "indexed") GPR64:$Rt, GPR64sp:$Rn, 0)>; @@ -1965,10 +2012,10 @@ class OneXRegData<bits<3> opc, string asm, SDPatternOperator node> let Inst{31} = 1; } -class SignAuthOneData<bits<3> opcode_prefix, bits<2> opcode, string asm> - : I<(outs GPR64:$Rd), (ins GPR64:$src, GPR64sp:$Rn), asm, "\t$Rd, $Rn", - "$Rd = $src", - []>, +class SignAuthOneData<bits<3> opcode_prefix, bits<2> opcode, string asm, + SDPatternOperator op> + : I<(outs GPR64:$dst), (ins GPR64:$Rd, GPR64sp:$Rn), asm, "\t$Rd, $Rn", + "$dst = $Rd", [(set GPR64:$dst, (op GPR64:$Rd, opcode, GPR64sp:$Rn))]>, Sched<[WriteI, ReadI]> { bits<5> Rd; bits<5> Rn; @@ -1979,9 +2026,11 @@ class SignAuthOneData<bits<3> opcode_prefix, bits<2> opcode, string asm> let Inst{4-0} = Rd; } -class SignAuthZero<bits<3> opcode_prefix, bits<2> opcode, string asm> - : I<(outs GPR64:$Rd), (ins GPR64:$src), asm, "\t$Rd", "$Rd = $src", - []>, Sched<[]> { +class SignAuthZero<bits<3> opcode_prefix, bits<2> opcode, string asm, + SDPatternOperator op> + : I<(outs GPR64:$dst), (ins GPR64:$Rd), asm, "\t$Rd", "$dst = $Rd", + [(set GPR64:$dst, (op GPR64:$Rd, opcode, (i64 0)))]>, + Sched<[]> { bits<5> Rd; let Inst{31-15} = 0b11011010110000010; let Inst{14-12} = opcode_prefix; @@ -2193,16 +2242,14 @@ class BaseMulAccum<bit isSub, bits<3> opc, RegisterClass multype, let Inst{4-0} = Rd; } -multiclass MulAccum<bit isSub, string asm, SDNode AccNode> { +multiclass MulAccum<bit isSub, string asm> { // MADD/MSUB generation is decided by MachineCombiner.cpp - def Wrrr : BaseMulAccum<isSub, 0b000, GPR32, GPR32, asm, - [/*(set GPR32:$Rd, (AccNode GPR32:$Ra, (mul GPR32:$Rn, GPR32:$Rm)))*/]>, + def Wrrr : BaseMulAccum<isSub, 0b000, GPR32, GPR32, asm, []>, Sched<[WriteIM32, ReadIM, ReadIM, ReadIMA]> { let Inst{31} = 0; } - def Xrrr : BaseMulAccum<isSub, 0b000, GPR64, GPR64, asm, - [/*(set GPR64:$Rd, (AccNode GPR64:$Ra, (mul GPR64:$Rn, GPR64:$Rm)))*/]>, + def Xrrr : BaseMulAccum<isSub, 0b000, GPR64, GPR64, asm, []>, Sched<[WriteIM64, ReadIM, ReadIM, ReadIMA]> { let Inst{31} = 1; } @@ -3421,8 +3468,8 @@ def ro64 : ROAddrMode<ro_Windexed64, ro_Xindexed64, ro_Wextend64, ro_Xextend64>; def ro128 : ROAddrMode<ro_Windexed128, ro_Xindexed128, ro_Wextend128, ro_Xextend128>; -class LoadStore8RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list<dag> pat> +class LoadStore8RO<bits<2> sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list<dag> pat> : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { bits<5> Rt; bits<5> Rn; @@ -3450,7 +3497,7 @@ class ROInstAlias<string asm, DAGOperand regtype, Instruction INST> multiclass Load8RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore8RO<sz, V, opc, regtype, asm, + def roW : LoadStore8RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend8:$extend), [(set (Ty regtype:$Rt), @@ -3461,7 +3508,7 @@ multiclass Load8RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } let AddedComplexity = 10 in - def roX : LoadStore8RO<sz, V, opc, regtype, asm, + def roX : LoadStore8RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend8:$extend), [(set (Ty regtype:$Rt), @@ -3477,30 +3524,30 @@ multiclass Load8RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Store8RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore8RO<sz, V, opc, regtype, asm, (outs), + def roW : LoadStore8RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend8:$extend), [(storeop (Ty regtype:$Rt), (ro_Windexed8 GPR64sp:$Rn, GPR32:$Rm, ro_Wextend8:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b0; } let AddedComplexity = 10 in - def roX : LoadStore8RO<sz, V, opc, regtype, asm, (outs), + def roX : LoadStore8RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend8:$extend), [(storeop (Ty regtype:$Rt), (ro_Xindexed8 GPR64sp:$Rn, GPR64:$Rm, ro_Xextend8:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b1; } def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; } -class LoadStore16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list<dag> pat> +class LoadStore16RO<bits<2> sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list<dag> pat> : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { bits<5> Rt; bits<5> Rn; @@ -3524,7 +3571,7 @@ class LoadStore16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Load16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore16RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roW : LoadStore16RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend16:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Windexed16 GPR64sp:$Rn, GPR32:$Rm, @@ -3534,7 +3581,7 @@ multiclass Load16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } let AddedComplexity = 10 in - def roX : LoadStore16RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roX : LoadStore16RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend16:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Xindexed16 GPR64sp:$Rn, GPR64:$Rm, @@ -3549,30 +3596,30 @@ multiclass Load16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Store16RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore16RO<sz, V, opc, regtype, asm, (outs), + def roW : LoadStore16RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend16:$extend), [(storeop (Ty regtype:$Rt), (ro_Windexed16 GPR64sp:$Rn, GPR32:$Rm, ro_Wextend16:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b0; } let AddedComplexity = 10 in - def roX : LoadStore16RO<sz, V, opc, regtype, asm, (outs), + def roX : LoadStore16RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend16:$extend), [(storeop (Ty regtype:$Rt), (ro_Xindexed16 GPR64sp:$Rn, GPR64:$Rm, ro_Xextend16:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b1; } def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; } -class LoadStore32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list<dag> pat> +class LoadStore32RO<bits<2> sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list<dag> pat> : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { bits<5> Rt; bits<5> Rn; @@ -3596,7 +3643,7 @@ class LoadStore32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Load32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator loadop> { let AddedComplexity = 10 in - def roW : LoadStore32RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roW : LoadStore32RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend32:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Windexed32 GPR64sp:$Rn, GPR32:$Rm, @@ -3606,7 +3653,7 @@ multiclass Load32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } let AddedComplexity = 10 in - def roX : LoadStore32RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roX : LoadStore32RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend32:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Xindexed32 GPR64sp:$Rn, GPR64:$Rm, @@ -3621,30 +3668,30 @@ multiclass Load32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Store32RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, string asm, ValueType Ty, SDPatternOperator storeop> { let AddedComplexity = 10 in - def roW : LoadStore32RO<sz, V, opc, regtype, asm, (outs), + def roW : LoadStore32RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend32:$extend), [(storeop (Ty regtype:$Rt), (ro_Windexed32 GPR64sp:$Rn, GPR32:$Rm, ro_Wextend32:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b0; } let AddedComplexity = 10 in - def roX : LoadStore32RO<sz, V, opc, regtype, asm, (outs), + def roX : LoadStore32RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend32:$extend), [(storeop (Ty regtype:$Rt), (ro_Xindexed32 GPR64sp:$Rn, GPR64:$Rm, ro_Xextend32:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b1; } def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; } -class LoadStore64RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list<dag> pat> +class LoadStore64RO<bits<2> sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list<dag> pat> : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { bits<5> Rt; bits<5> Rn; @@ -3668,7 +3715,7 @@ class LoadStore64RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Load64RO<bits<2> 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, V, opc, regtype, asm, (outs regtype:$Rt), + def roW : LoadStore64RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, @@ -3678,7 +3725,7 @@ multiclass Load64RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in - def roX : LoadStore64RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roX : LoadStore64RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, @@ -3693,30 +3740,30 @@ multiclass Load64RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Store64RO<bits<2> 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<sz, V, opc, regtype, asm, (outs), + def roW : LoadStore64RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend), [(storeop (Ty regtype:$Rt), (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b0; } let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in - def roX : LoadStore64RO<sz, V, opc, regtype, asm, (outs), + def roX : LoadStore64RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend), [(storeop (Ty regtype:$Rt), (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend))]>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b1; } def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; } -class LoadStore128RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, - string asm, dag ins, dag outs, list<dag> pat> +class LoadStore128RO<bits<2> sz, bit V, bits<2> opc, string asm, dag ins, + dag outs, list<dag> pat> : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { bits<5> Rt; bits<5> Rn; @@ -3740,7 +3787,7 @@ class LoadStore128RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, multiclass Load128RO<bits<2> 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, V, opc, regtype, asm, (outs regtype:$Rt), + def roW : LoadStore128RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend128:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Windexed128 GPR64sp:$Rn, GPR32:$Rm, @@ -3750,7 +3797,7 @@ multiclass Load128RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in - def roX : LoadStore128RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), + def roX : LoadStore128RO<sz, V, opc, asm, (outs regtype:$Rt), (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend128:$extend), [(set (Ty regtype:$Rt), (loadop (ro_Xindexed128 GPR64sp:$Rn, GPR64:$Rm, @@ -3763,20 +3810,20 @@ multiclass Load128RO<bits<2> sz, bit V, bits<2> opc, DAGOperand regtype, } multiclass Store128RO<bits<2> 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<sz, V, opc, regtype, asm, (outs), + def roW : LoadStore128RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend128:$extend), []>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b0; } let mayLoad = 0, mayStore = 1, hasSideEffects = 0 in - def roX : LoadStore128RO<sz, V, opc, regtype, asm, (outs), + def roX : LoadStore128RO<sz, V, opc, asm, (outs), (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend128:$extend), []>, - Sched<[WriteSTIdx, ReadAdrBase]> { + Sched<[WriteSTIdx, ReadST, ReadAdrBase]> { let Inst{13} = 0b1; } @@ -4466,7 +4513,7 @@ multiclass MemTagStore<bits<2> opc1, string insn> { let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in class ExceptionGeneration<bits<3> op1, bits<2> ll, string asm> - : I<(outs), (ins i32_imm0_65535:$imm), asm, "\t$imm", "", []>, + : I<(outs), (ins timm32_0_65535:$imm), asm, "\t$imm", "", []>, Sched<[WriteSys]> { bits<16> imm; let Inst{31-24} = 0b11010100; @@ -5309,7 +5356,7 @@ class BaseSIMDThreeSameVector<bit Q, bit U, bits<3> size, bits<5> opcode, : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # "|" # kind # "\t$Rd, $Rn, $Rm|}", "", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -5332,7 +5379,7 @@ class BaseSIMDThreeSameVectorTied<bit Q, bit U, bits<3> size, bits<5> opcode, : I<(outs regtype:$dst), (ins regtype:$Rd, regtype:$Rn, regtype:$Rm), asm, "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # "|" # kind # "\t$Rd, $Rn, $Rm}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -5351,7 +5398,7 @@ class BaseSIMDThreeSameVectorTied<bit Q, bit U, bits<3> size, bits<5> opcode, let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class BaseSIMDThreeSameVectorPseudo<RegisterOperand regtype, list<dag> pattern> : Pseudo<(outs regtype:$dst), (ins regtype:$Rd, regtype:$Rn, regtype:$Rm), pattern>, - Sched<[WriteV]>; + Sched<[!if(!eq(regtype, V128), WriteVq, WriteVd)]>; multiclass SIMDLogicalThreeVectorPseudo<SDPatternOperator OpNode> { def v8i8 : BaseSIMDThreeSameVectorPseudo<V64, @@ -5704,7 +5751,7 @@ class BaseSIMDTwoSameVector<bit Q, bit U, bits<2> size, bits<5> opcode, : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, "{\t$Rd" # dstkind # ", $Rn" # srckind # "|" # dstkind # "\t$Rd, $Rn}", "", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -5729,7 +5776,7 @@ class BaseSIMDTwoSameVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, : I<(outs regtype:$dst), (ins regtype:$Rd, regtype:$Rn), asm, "{\t$Rd" # dstkind # ", $Rn" # srckind # "|" # dstkind # "\t$Rd, $Rn}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -5775,7 +5822,7 @@ class BaseSIMDVectorLShiftLongBySize<bit Q, bits<2> size, : I<(outs V128:$Rd), (ins regtype:$Rn), asm, "{\t$Rd" # dstkind # ", $Rn" # srckind # ", #" # amount # "|" # dstkind # "\t$Rd, $Rn, #" # amount # "}", "", []>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6032,7 +6079,7 @@ multiclass SIMDTwoVectorIntToFP<bit U, bit S, bits<5> opc, string asm, [(set (v2f64 V128:$Rd), (OpNode (v2i64 V128:$Rn)))]>; } - +let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class BaseSIMDMixedTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, RegisterOperand inreg, RegisterOperand outreg, string asm, string outkind, string inkind, @@ -6040,7 +6087,7 @@ class BaseSIMDMixedTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, : I<(outs outreg:$Rd), (ins inreg:$Rn), asm, "{\t$Rd" # outkind # ", $Rn" # inkind # "|" # outkind # "\t$Rd, $Rn}", "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6055,6 +6102,7 @@ class BaseSIMDMixedTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, let Inst{4-0} = Rd; } +let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class BaseSIMDMixedTwoVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, RegisterOperand inreg, RegisterOperand outreg, string asm, string outkind, string inkind, @@ -6062,7 +6110,7 @@ class BaseSIMDMixedTwoVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, : I<(outs outreg:$dst), (ins outreg:$Rd, inreg:$Rn), asm, "{\t$Rd" # outkind # ", $Rn" # inkind # "|" # outkind # "\t$Rd, $Rn}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6114,7 +6162,7 @@ class BaseSIMDCmpTwoVector<bit Q, bit U, bits<2> size, bits<2> size2, "{\t$Rd" # kind # ", $Rn" # kind # ", #" # zero # "|" # kind # "\t$Rd, $Rn, #" # zero # "}", "", [(set (dty regtype:$Rd), (OpNode (sty regtype:$Rn)))]>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6212,7 +6260,7 @@ class BaseSIMDFPCvtTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, list<dag> pattern> : I<(outs outtype:$Rd), (ins intype:$Rn), asm, !strconcat("\t$Rd", VdTy, ", $Rn", VnTy), "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6227,13 +6275,14 @@ class BaseSIMDFPCvtTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, let Inst{4-0} = Rd; } +let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class BaseSIMDFPCvtTwoVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, RegisterOperand outtype, RegisterOperand intype, string asm, string VdTy, string VnTy, list<dag> pattern> : I<(outs outtype:$dst), (ins outtype:$Rd, intype:$Rn), asm, !strconcat("\t$Rd", VdTy, ", $Rn", VnTy), "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -6296,7 +6345,7 @@ class BaseSIMDDifferentThreeVector<bit U, bits<3> size, bits<4> opcode, : I<(outs outtype:$Rd), (ins intype1:$Rn, intype2:$Rm), asm, "{\t$Rd" # outkind # ", $Rn" # inkind1 # ", $Rm" # inkind2 # "|" # outkind # "\t$Rd, $Rn, $Rm}", "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6322,7 +6371,7 @@ class BaseSIMDDifferentThreeVectorTied<bit U, bits<3> size, bits<4> opcode, : I<(outs outtype:$dst), (ins outtype:$Rd, intype1:$Rn, intype2:$Rm), asm, "{\t$Rd" # outkind # ", $Rn" # inkind1 # ", $Rm" # inkind2 # "|" # outkind # "\t$Rd, $Rn, $Rm}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6662,7 +6711,7 @@ class BaseSIMDBitwiseExtract<bit size, RegisterOperand regtype, ValueType vty, "|" # kind # "\t$Rd, $Rn, $Rm, $imm}", "", [(set (vty regtype:$Rd), (AArch64ext regtype:$Rn, regtype:$Rm, (i32 imm:$imm)))]>, - Sched<[WriteV]> { + Sched<[!if(size, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6696,7 +6745,7 @@ class BaseSIMDZipVector<bits<3> size, bits<3> opc, RegisterOperand regtype, "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # "|" # kind # "\t$Rd, $Rn, $Rm}", "", [(set (valty regtype:$Rd), (OpNode regtype:$Rn, regtype:$Rm))]>, - Sched<[WriteV]> { + Sched<[!if(!eq(regtype, V128), WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6752,7 +6801,7 @@ class BaseSIMDThreeScalar<bit U, bits<3> size, bits<5> opcode, list<dag> pattern> : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, "\t$Rd, $Rn, $Rm", "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6772,7 +6821,7 @@ class BaseSIMDThreeScalarTied<bit U, bits<2> size, bit R, bits<5> opcode, dag oops, dag iops, string asm, list<dag> pattern> : I<oops, iops, asm, "\t$Rd, $Rn, $Rm", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6815,8 +6864,7 @@ multiclass SIMDThreeScalarHS<bit U, bits<5> opc, string asm, def v1i16 : BaseSIMDThreeScalar<U, 0b011, opc, FPR16, asm, []>; } -multiclass SIMDThreeScalarHSTied<bit U, bit R, bits<5> opc, string asm, - SDPatternOperator OpNode = null_frag> { +multiclass SIMDThreeScalarHSTied<bit U, bit R, bits<5> opc, string asm> { def v1i32: BaseSIMDThreeScalarTied<U, 0b10, R, opc, (outs FPR32:$dst), (ins FPR32:$Rd, FPR32:$Rn, FPR32:$Rm), asm, []>; @@ -6826,16 +6874,19 @@ multiclass SIMDThreeScalarHSTied<bit U, bit R, bits<5> opc, string asm, } multiclass SIMDFPThreeScalar<bit U, bit S, bits<3> opc, string asm, - SDPatternOperator OpNode = null_frag> { + SDPatternOperator OpNode = null_frag, + Predicate pred = HasNEON> { let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { + let Predicates = [pred] in { def NAME#64 : BaseSIMDThreeScalar<U, {S,0b11}, {0b11,opc}, FPR64, asm, [(set (f64 FPR64:$Rd), (OpNode (f64 FPR64:$Rn), (f64 FPR64:$Rm)))]>; def NAME#32 : BaseSIMDThreeScalar<U, {S,0b01}, {0b11,opc}, FPR32, asm, [(set FPR32:$Rd, (OpNode FPR32:$Rn, FPR32:$Rm))]>; - let Predicates = [HasNEON, HasFullFP16] in { + } + let Predicates = [pred, HasFullFP16] in { def NAME#16 : BaseSIMDThreeScalar<U, {S,0b10}, {0b00,opc}, FPR16, asm, [(set (f16 FPR16:$Rd), (OpNode (f16 FPR16:$Rn), (f16 FPR16:$Rm)))]>; - } // Predicates = [HasNEON, HasFullFP16] + } } def : Pat<(v1f64 (OpNode (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), @@ -6863,7 +6914,7 @@ class BaseSIMDThreeScalarMixed<bit U, bits<2> size, bits<5> opcode, dag oops, dag iops, string asm, string cstr, list<dag> pat> : I<oops, iops, asm, "\t$Rd, $Rn, $Rm", cstr, pat>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -6916,7 +6967,7 @@ class BaseSIMDTwoScalar<bit U, bits<2> size, bits<2> size2, bits<5> opcode, string asm, list<dag> pat> : I<(outs regtype:$Rd), (ins regtype2:$Rn), asm, "\t$Rd, $Rn", "", pat>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; let Inst{31-30} = 0b01; @@ -6938,7 +6989,7 @@ class BaseSIMDTwoScalarTied<bit U, bits<2> size, bits<5> opcode, string asm, list<dag> pat> : I<(outs regtype:$dst), (ins regtype:$Rd, regtype2:$Rn), asm, "\t$Rd, $Rn", "$Rd = $dst", pat>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; let Inst{31-30} = 0b01; @@ -6958,7 +7009,7 @@ class BaseSIMDCmpTwoScalar<bit U, bits<2> size, bits<2> size2, bits<5> opcode, RegisterClass regtype, string asm, string zero> : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, "\t$Rd, $Rn, #" # zero, "", []>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; let Inst{31-30} = 0b01; @@ -6977,7 +7028,7 @@ class BaseSIMDCmpTwoScalar<bit U, bits<2> size, bits<2> size2, bits<5> opcode, class SIMDInexactCvtTwoScalar<bits<5> opcode, string asm> : I<(outs FPR32:$Rd), (ins FPR64:$Rn), asm, "\t$Rd, $Rn", "", [(set (f32 FPR32:$Rd), (int_aarch64_sisd_fcvtxn (f64 FPR64:$Rn)))]>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; let Inst{31-17} = 0b011111100110000; @@ -7025,10 +7076,13 @@ multiclass SIMDTwoScalarD<bit U, bits<5> opc, string asm, (!cast<Instruction>(NAME # "v1i64") FPR64:$Rn)>; } -multiclass SIMDFPTwoScalar<bit U, bit S, bits<5> opc, string asm> { +multiclass SIMDFPTwoScalar<bit U, bit S, bits<5> opc, string asm, + Predicate pred = HasNEON> { + let Predicates = [pred] in { def v1i64 : BaseSIMDTwoScalar<U, {S,1}, 0b00, opc, FPR64, FPR64, asm,[]>; def v1i32 : BaseSIMDTwoScalar<U, {S,0}, 0b00, opc, FPR32, FPR32, asm,[]>; - let Predicates = [HasNEON, HasFullFP16] in { + } + let Predicates = [pred, HasFullFP16] in { def v1f16 : BaseSIMDTwoScalar<U, {S,1}, 0b11, opc, FPR16, FPR16, asm,[]>; } } @@ -7096,7 +7150,7 @@ class BaseSIMDPairwiseScalar<bit U, bits<2> size, bits<5> opcode, string asm, string kind> : I<(outs regtype:$Rd), (ins vectype:$Rn), asm, "{\t$Rd, $Rn" # kind # "|" # kind # "\t$Rd, $Rn}", "", []>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; let Inst{31-30} = 0b01; @@ -7136,7 +7190,7 @@ class BaseSIMDAcrossLanes<bit Q, bit U, bits<2> size, bits<5> opcode, string asm, string kind, list<dag> pattern> : I<(outs regtype:$Rd), (ins vectype:$Rn), asm, "{\t$Rd, $Rn" # kind # "|" # kind # "\t$Rd, $Rn}", "", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -7202,7 +7256,7 @@ multiclass SIMDFPAcrossLanes<bits<5> opcode, bit sz1, string asm, class BaseSIMDInsDup<bit Q, bit op, dag outs, dag ins, string asm, string operands, string constraints, list<dag> pattern> : I<outs, ins, asm, operands, constraints, pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -7228,7 +7282,7 @@ class SIMDDupFromMain<bit Q, bits<5> imm5, string size, ValueType vectype, class SIMDDupFromElement<bit Q, string dstkind, string srckind, ValueType vectype, ValueType insreg, RegisterOperand vecreg, Operand idxtype, - ValueType elttype, SDNode OpNode> + SDNode OpNode> : BaseSIMDInsDup<Q, 0, (outs vecreg:$Rd), (ins V128:$Rn, idxtype:$idx), "dup", "{\t$Rd" # dstkind # ", $Rn" # srckind # "$idx" # "|" # dstkind # "\t$Rd, $Rn$idx}", "", @@ -7239,7 +7293,7 @@ class SIMDDupFromElement<bit Q, string dstkind, string srckind, class SIMDDup64FromElement : SIMDDupFromElement<1, ".2d", ".d", v2i64, v2i64, V128, - VectorIndexD, i64, AArch64duplane64> { + VectorIndexD, AArch64duplane64> { bits<1> idx; let Inst{20} = idx; let Inst{19-16} = 0b1000; @@ -7248,7 +7302,7 @@ class SIMDDup64FromElement class SIMDDup32FromElement<bit Q, string size, ValueType vectype, RegisterOperand vecreg> : SIMDDupFromElement<Q, size, ".s", vectype, v4i32, vecreg, - VectorIndexS, i64, AArch64duplane32> { + VectorIndexS, AArch64duplane32> { bits<2> idx; let Inst{20-19} = idx; let Inst{18-16} = 0b100; @@ -7257,7 +7311,7 @@ class SIMDDup32FromElement<bit Q, string size, ValueType vectype, class SIMDDup16FromElement<bit Q, string size, ValueType vectype, RegisterOperand vecreg> : SIMDDupFromElement<Q, size, ".h", vectype, v8i16, vecreg, - VectorIndexH, i64, AArch64duplane16> { + VectorIndexH, AArch64duplane16> { bits<3> idx; let Inst{20-18} = idx; let Inst{17-16} = 0b10; @@ -7266,7 +7320,7 @@ class SIMDDup16FromElement<bit Q, string size, ValueType vectype, class SIMDDup8FromElement<bit Q, string size, ValueType vectype, RegisterOperand vecreg> : SIMDDupFromElement<Q, size, ".b", vectype, v16i8, vecreg, - VectorIndexB, i64, AArch64duplane8> { + VectorIndexB, AArch64duplane8> { bits<4> idx; let Inst{20-17} = idx; let Inst{16} = 1; @@ -7295,6 +7349,25 @@ class SIMDMovAlias<string asm, string size, Instruction inst, (inst regtype:$dst, V128:$src, idxtype:$idx)>; multiclass SMov { + // SMOV with vector index of 0 are legal in Scalable Matrix Extension (SME) + // streaming mode. + let Predicates = [HasNEONorStreamingSVE] in { + def vi8to32_idx0 : SIMDSMov<0, ".b", GPR32, VectorIndex0> { + let Inst{20-16} = 0b00001; + } + def vi8to64_idx0 : SIMDSMov<1, ".b", GPR64, VectorIndex0> { + let Inst{20-16} = 0b00001; + } + def vi16to32_idx0 : SIMDSMov<0, ".h", GPR32, VectorIndex0> { + let Inst{20-16} = 0b00010; + } + def vi16to64_idx0 : SIMDSMov<1, ".h", GPR64, VectorIndex0> { + let Inst{20-16} = 0b00010; + } + def vi32to64_idx0 : SIMDSMov<1, ".s", GPR64, VectorIndex0> { + let Inst{20-16} = 0b00100; + } + } def vi8to32 : SIMDSMov<0, ".b", GPR32, VectorIndexB> { bits<4> idx; let Inst{20-17} = idx; @@ -7323,6 +7396,28 @@ multiclass SMov { } multiclass UMov { + // UMOV with vector index of 0 are legal in Scalable Matrix Extension (SME) + // streaming mode. + let Predicates = [HasNEONorStreamingSVE] in { + def vi8_idx0 : SIMDUMov<0, ".b", v16i8, GPR32, VectorIndex0> { + let Inst{20-16} = 0b00001; + } + def vi16_idx0 : SIMDUMov<0, ".h", v8i16, GPR32, VectorIndex0> { + let Inst{20-16} = 0b00010; + } + def vi32_idx0 : SIMDUMov<0, ".s", v4i32, GPR32, VectorIndex0> { + let Inst{20-16} = 0b00100; + } + def vi64_idx0 : SIMDUMov<1, ".d", v2i64, GPR64, VectorIndex0> { + let Inst{20-16} = 0b01000; + } + def : SIMDMovAlias<"mov", ".s", + !cast<Instruction>(NAME # vi32_idx0), + GPR32, VectorIndex0>; + def : SIMDMovAlias<"mov", ".d", + !cast<Instruction>(NAME # vi64_idx0), + GPR64, VectorIndex0>; + } def vi8 : SIMDUMov<0, ".b", v16i8, GPR32, VectorIndexB> { bits<4> idx; let Inst{20-17} = idx; @@ -7473,7 +7568,7 @@ class BaseSIMDTableLookup<bit Q, bits<2> len, bit op, RegisterOperand vectype, RegisterOperand listtype, string asm, string kind> : I<(outs vectype:$Vd), (ins listtype:$Vn, vectype:$Vm), asm, "\t$Vd" # kind # ", $Vn, $Vm" # kind, "", []>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Vd; bits<5> Vn; bits<5> Vm; @@ -7494,7 +7589,7 @@ class BaseSIMDTableLookupTied<bit Q, bits<2> len, bit op, RegisterOperand vectyp RegisterOperand listtype, string asm, string kind> : I<(outs vectype:$dst), (ins vectype:$Vd, listtype:$Vn, vectype:$Vm), asm, "\t$Vd" # kind # ", $Vn, $Vm" # kind, "$Vd = $dst", []>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Vd; bits<5> Vn; bits<5> Vm; @@ -7609,11 +7704,11 @@ multiclass SIMDTableLookupTied<bit op, string asm> { //---------------------------------------------------------------------------- let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class BaseSIMDScalarCPY<RegisterClass regtype, RegisterOperand vectype, - string kind, Operand idxtype> - : I<(outs regtype:$dst), (ins vectype:$src, idxtype:$idx), "mov", + string asm, string kind, Operand idxtype> + : I<(outs regtype:$dst), (ins vectype:$src, idxtype:$idx), asm, "{\t$dst, $src" # kind # "$idx" # "|\t$dst, $src$idx}", "", []>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> dst; bits<5> src; let Inst{31-21} = 0b01011110000; @@ -7630,22 +7725,22 @@ class SIMDScalarCPYAlias<string asm, string size, Instruction inst, multiclass SIMDScalarCPY<string asm> { - def i8 : BaseSIMDScalarCPY<FPR8, V128, ".b", VectorIndexB> { + def i8 : BaseSIMDScalarCPY<FPR8, V128, asm, ".b", VectorIndexB> { bits<4> idx; let Inst{20-17} = idx; let Inst{16} = 1; } - def i16 : BaseSIMDScalarCPY<FPR16, V128, ".h", VectorIndexH> { + def i16 : BaseSIMDScalarCPY<FPR16, V128, asm, ".h", VectorIndexH> { bits<3> idx; let Inst{20-18} = idx; let Inst{17-16} = 0b10; } - def i32 : BaseSIMDScalarCPY<FPR32, V128, ".s", VectorIndexS> { + def i32 : BaseSIMDScalarCPY<FPR32, V128, asm, ".s", VectorIndexS> { bits<2> idx; let Inst{20-19} = idx; let Inst{18-16} = 0b100; } - def i64 : BaseSIMDScalarCPY<FPR64, V128, ".d", VectorIndexD> { + def i64 : BaseSIMDScalarCPY<FPR64, V128, asm, ".d", VectorIndexD> { bits<1> idx; let Inst{20} = idx; let Inst{19-16} = 0b1000; @@ -7678,7 +7773,7 @@ class BaseSIMDModifiedImm<bit Q, bit op, bit op2, dag oops, dag iops, string asm, string op_string, string cstr, list<dag> pattern> : I<oops, iops, asm, op_string, cstr, pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<8> imm8; let Inst{31} = 0; @@ -7848,7 +7943,7 @@ class BaseSIMDIndexed<bit Q, bit U, bit Scalar, bits<2> size, bits<4> opc, asm, "{\t$Rd" # dst_kind # ", $Rn" # lhs_kind # ", $Rm" # rhs_kind # "$idx" # "|" # apple_kind # "\t$Rd, $Rn, $Rm$idx}", "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -7878,7 +7973,7 @@ class BaseSIMDIndexedTied<bit Q, bit U, bit Scalar, bits<2> size, bits<4> opc, (ins dst_reg:$Rd, lhs_reg:$Rn, rhs_reg:$Rm, vec_idx:$idx), asm, "{\t$Rd" # dst_kind # ", $Rn" # lhs_kind # ", $Rm" # rhs_kind # "$idx" # "|" # apple_kind # "\t$Rd, $Rn, $Rm$idx}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -7971,7 +8066,7 @@ class SIMDBF16MLALIndex<bit Q, string asm, SDPatternOperator OpNode> (v8bf16 (AArch64duplane16 (v8bf16 V128_lo:$Rm), VectorIndexH:$idx)))))]>, - Sched<[WriteV]> { + Sched<[WriteVq]> { bits<5> Rd; bits<5> Rn; bits<4> Rm; @@ -8892,7 +8987,7 @@ class BaseSIMDScalarShift<bit U, bits<5> opc, bits<7> fixed_imm, Operand immtype, string asm, list<dag> pattern> : I<(outs regtype1:$Rd), (ins regtype2:$Rn, immtype:$imm), asm, "\t$Rd, $Rn, $imm", "", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<7> imm; @@ -8912,7 +9007,7 @@ class BaseSIMDScalarShiftTied<bit U, bits<5> opc, bits<7> fixed_imm, Operand immtype, string asm, list<dag> pattern> : I<(outs regtype1:$dst), (ins regtype1:$Rd, regtype2:$Rn, immtype:$imm), asm, "\t$Rd, $Rn, $imm", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[WriteVd]> { bits<5> Rd; bits<5> Rn; bits<7> imm; @@ -9076,7 +9171,7 @@ class BaseSIMDVectorShift<bit Q, bit U, bits<5> opc, bits<7> fixed_imm, : I<(outs dst_reg:$Rd), (ins src_reg:$Rn, immtype:$imm), asm, "{\t$Rd" # dst_kind # ", $Rn" # src_kind # ", $imm" # "|" # dst_kind # "\t$Rd, $Rn, $imm}", "", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -9099,7 +9194,7 @@ class BaseSIMDVectorShiftTied<bit Q, bit U, bits<5> opc, bits<7> fixed_imm, : I<(outs vectype1:$dst), (ins vectype1:$Rd, vectype2:$Rn, immtype:$imm), asm, "{\t$Rd" # dst_kind # ", $Rn" # src_kind # ", $imm" # "|" # dst_kind # "\t$Rd, $Rn, $imm}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; let Inst{31} = 0; @@ -10646,7 +10741,7 @@ class BaseSIMDThreeSameVectorComplex<bit Q, bit U, bits<2> size, bits<3> opcode, : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, rottype:$rot), asm, "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # ", $rot" "|" # kind # "\t$Rd, $Rn, $Rm, $rot}", "", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -10720,7 +10815,7 @@ class BaseSIMDThreeSameVectorTiedComplex<bit Q, bit U, bits<2> size, (ins regtype:$Rd, regtype:$Rn, regtype:$Rm, rottype:$rot), asm, "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # ", $rot" "|" # kind # "\t$Rd, $Rn, $Rm, $rot}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -10796,7 +10891,7 @@ class BaseSIMDIndexedTiedComplex<bit Q, bit U, bit Scalar, bits<2> size, "{\t$Rd" # dst_kind # ", $Rn" # lhs_kind # ", $Rm" # rhs_kind # "$idx, $rot" # "|" # apple_kind # "\t$Rd, $Rn, $Rm$idx, $rot}", "$Rd = $dst", pattern>, - Sched<[WriteV]> { + Sched<[!if(Q, WriteVq, WriteVd)]> { bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -10822,8 +10917,8 @@ class BaseSIMDIndexedTiedComplex<bit Q, bit U, bit Scalar, bits<2> size, // 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<bit U, bit opc1, bit opc2, Operand rottype, - string asm, SDPatternOperator OpNode> { +multiclass SIMDIndexedTiedComplexHSD<bit opc1, bit opc2, Operand rottype, + string asm> { let Predicates = [HasComplxNum, HasNEON, HasFullFP16] in { def v4f16_indexed : BaseSIMDIndexedTiedComplex<0, 1, 0, 0b01, opc1, opc2, V64, V64, V128, VectorIndexD, rottype, asm, ".4h", ".4h", @@ -10861,7 +10956,7 @@ let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in class AESBase<bits<4> opc, string asm, dag outs, dag ins, string cstr, list<dag> pat> : I<outs, ins, asm, "{\t$Rd.16b, $Rn.16b|.16b\t$Rd, $Rn}", cstr, pat>, - Sched<[WriteV]>{ + Sched<[WriteVq]>{ bits<5> Rd; bits<5> Rn; let Inst{31-16} = 0b0100111000101000; @@ -10887,7 +10982,7 @@ class SHA3OpTiedInst<bits<3> opc, string asm, string dst_lhs_kind, : I<oops, iops, asm, "{\t$Rd" # dst_lhs_kind # ", $Rn" # dst_lhs_kind # ", $Rm.4s" # "|.4s\t$Rd, $Rn, $Rm}", "$Rd = $dst", pat>, - Sched<[WriteV]>{ + Sched<[WriteVq]>{ bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -10927,7 +11022,7 @@ class SHA2OpInst<bits<4> opc, string asm, string kind, list<dag> pat> : I<oops, iops, asm, "{\t$Rd" # kind # ", $Rn" # kind # "|" # kind # "\t$Rd, $Rn}", cstr, pat>, - Sched<[WriteV]>{ + Sched<[WriteVq]>{ bits<5> Rd; bits<5> Rn; let Inst{31-16} = 0b0101111000101000; @@ -10950,7 +11045,7 @@ class SHAInstSS<bits<4> opc, string asm, Intrinsic OpNode> // Armv8.2-A Crypto extensions class BaseCryptoV82<dag oops, dag iops, string asm, string asmops, string cst, list<dag> pattern> - : I <oops, iops, asm, asmops, cst, pattern>, Sched<[WriteV]> { + : I <oops, iops, asm, asmops, cst, pattern>, Sched<[WriteVq]> { bits<5> Vd; bits<5> Vn; let Inst{31-25} = 0b1100111; |