1*9880d681SAndroid Build Coastguard Worker//===- AArch64InstrFormats.td - AArch64 Instruction Formats --*- tblgen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker// Describe AArch64 instructions format here 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// Format specifies the encoding used by the instruction. This is part of the 15*9880d681SAndroid Build Coastguard Worker// ad-hoc solution used to emit machine instruction encodings by our machine 16*9880d681SAndroid Build Coastguard Worker// code emitter. 17*9880d681SAndroid Build Coastguard Workerclass Format<bits<2> val> { 18*9880d681SAndroid Build Coastguard Worker bits<2> Value = val; 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdef PseudoFrm : Format<0>; 22*9880d681SAndroid Build Coastguard Workerdef NormalFrm : Format<1>; // Do we need any others? 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker// AArch64 Instruction Format 25*9880d681SAndroid Build Coastguard Workerclass AArch64Inst<Format f, string cstr> : Instruction { 26*9880d681SAndroid Build Coastguard Worker field bits<32> Inst; // Instruction encoding. 27*9880d681SAndroid Build Coastguard Worker // Mask of bits that cause an encoding to be UNPREDICTABLE. 28*9880d681SAndroid Build Coastguard Worker // If a bit is set, then if the corresponding bit in the 29*9880d681SAndroid Build Coastguard Worker // target encoding differs from its value in the "Inst" field, 30*9880d681SAndroid Build Coastguard Worker // the instruction is UNPREDICTABLE (SoftFail in abstract parlance). 31*9880d681SAndroid Build Coastguard Worker field bits<32> Unpredictable = 0; 32*9880d681SAndroid Build Coastguard Worker // SoftFail is the generic name for this field, but we alias it so 33*9880d681SAndroid Build Coastguard Worker // as to make it more obvious what it means in ARM-land. 34*9880d681SAndroid Build Coastguard Worker field bits<32> SoftFail = Unpredictable; 35*9880d681SAndroid Build Coastguard Worker let Namespace = "AArch64"; 36*9880d681SAndroid Build Coastguard Worker Format F = f; 37*9880d681SAndroid Build Coastguard Worker bits<2> Form = F.Value; 38*9880d681SAndroid Build Coastguard Worker let Pattern = []; 39*9880d681SAndroid Build Coastguard Worker let Constraints = cstr; 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker// Pseudo instructions (don't have encoding information) 43*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag oops, dag iops, list<dag> pattern, string cstr = ""> 44*9880d681SAndroid Build Coastguard Worker : AArch64Inst<PseudoFrm, cstr> { 45*9880d681SAndroid Build Coastguard Worker dag OutOperandList = oops; 46*9880d681SAndroid Build Coastguard Worker dag InOperandList = iops; 47*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 48*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker// Real instructions (have encoding information) 52*9880d681SAndroid Build Coastguard Workerclass EncodedI<string cstr, list<dag> pattern> : AArch64Inst<NormalFrm, cstr> { 53*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 54*9880d681SAndroid Build Coastguard Worker let Size = 4; 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker// Normal instructions 58*9880d681SAndroid Build Coastguard Workerclass I<dag oops, dag iops, string asm, string operands, string cstr, 59*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 60*9880d681SAndroid Build Coastguard Worker : EncodedI<cstr, pattern> { 61*9880d681SAndroid Build Coastguard Worker dag OutOperandList = oops; 62*9880d681SAndroid Build Coastguard Worker dag InOperandList = iops; 63*9880d681SAndroid Build Coastguard Worker let AsmString = !strconcat(asm, operands); 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerclass TriOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$MHS, node:$RHS), res>; 67*9880d681SAndroid Build Coastguard Workerclass BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>; 68*9880d681SAndroid Build Coastguard Workerclass UnOpFrag<dag res> : PatFrag<(ops node:$LHS), res>; 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker// Helper fragment for an extract of the high portion of a 128-bit vector. 71*9880d681SAndroid Build Coastguard Workerdef extract_high_v16i8 : 72*9880d681SAndroid Build Coastguard Worker UnOpFrag<(extract_subvector (v16i8 node:$LHS), (i64 8))>; 73*9880d681SAndroid Build Coastguard Workerdef extract_high_v8i16 : 74*9880d681SAndroid Build Coastguard Worker UnOpFrag<(extract_subvector (v8i16 node:$LHS), (i64 4))>; 75*9880d681SAndroid Build Coastguard Workerdef extract_high_v4i32 : 76*9880d681SAndroid Build Coastguard Worker UnOpFrag<(extract_subvector (v4i32 node:$LHS), (i64 2))>; 77*9880d681SAndroid Build Coastguard Workerdef extract_high_v2i64 : 78*9880d681SAndroid Build Coastguard Worker UnOpFrag<(extract_subvector (v2i64 node:$LHS), (i64 1))>; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 81*9880d681SAndroid Build Coastguard Worker// Asm Operand Classes. 82*9880d681SAndroid Build Coastguard Worker// 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker// Shifter operand for arithmetic shifted encodings. 85*9880d681SAndroid Build Coastguard Workerdef ShifterOperand : AsmOperandClass { 86*9880d681SAndroid Build Coastguard Worker let Name = "Shifter"; 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker// Shifter operand for mov immediate encodings. 90*9880d681SAndroid Build Coastguard Workerdef MovImm32ShifterOperand : AsmOperandClass { 91*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 92*9880d681SAndroid Build Coastguard Worker let Name = "MovImm32Shifter"; 93*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 94*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMovImm32Shift"; 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Workerdef MovImm64ShifterOperand : AsmOperandClass { 97*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 98*9880d681SAndroid Build Coastguard Worker let Name = "MovImm64Shifter"; 99*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 100*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMovImm64Shift"; 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker// Shifter operand for arithmetic register shifted encodings. 104*9880d681SAndroid Build Coastguard Workerclass ArithmeticShifterOperand<int width> : AsmOperandClass { 105*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 106*9880d681SAndroid Build Coastguard Worker let Name = "ArithmeticShifter" # width; 107*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isArithmeticShifter<" # width # ">"; 108*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 109*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "AddSubRegShift" # width; 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdef ArithmeticShifterOperand32 : ArithmeticShifterOperand<32>; 113*9880d681SAndroid Build Coastguard Workerdef ArithmeticShifterOperand64 : ArithmeticShifterOperand<64>; 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker// Shifter operand for logical register shifted encodings. 116*9880d681SAndroid Build Coastguard Workerclass LogicalShifterOperand<int width> : AsmOperandClass { 117*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 118*9880d681SAndroid Build Coastguard Worker let Name = "LogicalShifter" # width; 119*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isLogicalShifter<" # width # ">"; 120*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 121*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "AddSubRegShift" # width; 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdef LogicalShifterOperand32 : LogicalShifterOperand<32>; 125*9880d681SAndroid Build Coastguard Workerdef LogicalShifterOperand64 : LogicalShifterOperand<64>; 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker// Shifter operand for logical vector 128/64-bit shifted encodings. 128*9880d681SAndroid Build Coastguard Workerdef LogicalVecShifterOperand : AsmOperandClass { 129*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 130*9880d681SAndroid Build Coastguard Worker let Name = "LogicalVecShifter"; 131*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Workerdef LogicalVecHalfWordShifterOperand : AsmOperandClass { 134*9880d681SAndroid Build Coastguard Worker let SuperClasses = [LogicalVecShifterOperand]; 135*9880d681SAndroid Build Coastguard Worker let Name = "LogicalVecHalfWordShifter"; 136*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker// The "MSL" shifter on the vector MOVI instruction. 140*9880d681SAndroid Build Coastguard Workerdef MoveVecShifterOperand : AsmOperandClass { 141*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ShifterOperand]; 142*9880d681SAndroid Build Coastguard Worker let Name = "MoveVecShifter"; 143*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addShifterOperands"; 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker// Extend operand for arithmetic encodings. 147*9880d681SAndroid Build Coastguard Workerdef ExtendOperand : AsmOperandClass { 148*9880d681SAndroid Build Coastguard Worker let Name = "Extend"; 149*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "AddSubRegExtendLarge"; 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Workerdef ExtendOperand64 : AsmOperandClass { 152*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ExtendOperand]; 153*9880d681SAndroid Build Coastguard Worker let Name = "Extend64"; 154*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "AddSubRegExtendSmall"; 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker// 'extend' that's a lsl of a 64-bit register. 157*9880d681SAndroid Build Coastguard Workerdef ExtendOperandLSL64 : AsmOperandClass { 158*9880d681SAndroid Build Coastguard Worker let SuperClasses = [ExtendOperand]; 159*9880d681SAndroid Build Coastguard Worker let Name = "ExtendLSL64"; 160*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addExtend64Operands"; 161*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "AddSubRegExtendLarge"; 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker// 8-bit floating-point immediate encodings. 165*9880d681SAndroid Build Coastguard Workerdef FPImmOperand : AsmOperandClass { 166*9880d681SAndroid Build Coastguard Worker let Name = "FPImm"; 167*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseFPImm"; 168*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidFPImm"; 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdef CondCode : AsmOperandClass { 172*9880d681SAndroid Build Coastguard Worker let Name = "CondCode"; 173*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidCondCode"; 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker// A 32-bit register pasrsed as 64-bit 177*9880d681SAndroid Build Coastguard Workerdef GPR32as64Operand : AsmOperandClass { 178*9880d681SAndroid Build Coastguard Worker let Name = "GPR32as64"; 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Workerdef GPR32as64 : RegisterOperand<GPR32> { 181*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = GPR32as64Operand; 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker// 8-bit immediate for AdvSIMD where 64-bit values of the form: 185*9880d681SAndroid Build Coastguard Worker// aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh 186*9880d681SAndroid Build Coastguard Worker// are encoded as the eight bit value 'abcdefgh'. 187*9880d681SAndroid Build Coastguard Workerdef SIMDImmType10Operand : AsmOperandClass { let Name = "SIMDImmType10"; } 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 191*9880d681SAndroid Build Coastguard Worker// Operand Definitions. 192*9880d681SAndroid Build Coastguard Worker// 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker// ADR[P] instruction labels. 195*9880d681SAndroid Build Coastguard Workerdef AdrpOperand : AsmOperandClass { 196*9880d681SAndroid Build Coastguard Worker let Name = "AdrpLabel"; 197*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseAdrpLabel"; 198*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidLabel"; 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Workerdef adrplabel : Operand<i64> { 201*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getAdrLabelOpValue"; 202*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAdrpLabel"; 203*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = AdrpOperand; 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdef AdrOperand : AsmOperandClass { 207*9880d681SAndroid Build Coastguard Worker let Name = "AdrLabel"; 208*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseAdrLabel"; 209*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidLabel"; 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Workerdef adrlabel : Operand<i64> { 212*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getAdrLabelOpValue"; 213*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = AdrOperand; 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// simm9 predicate - True if the immediate is in the range [-256, 255]. 217*9880d681SAndroid Build Coastguard Workerdef SImm9Operand : AsmOperandClass { 218*9880d681SAndroid Build Coastguard Worker let Name = "SImm9"; 219*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMemoryIndexedSImm9"; 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Workerdef simm9 : Operand<i64>, ImmLeaf<i64, [{ return Imm >= -256 && Imm < 256; }]> { 222*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9Operand; 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker// simm7sN predicate - True if the immediate is a multiple of N in the range 226*9880d681SAndroid Build Coastguard Worker// [-64 * N, 63 * N]. 227*9880d681SAndroid Build Coastguard Workerclass SImm7Scaled<int Scale> : AsmOperandClass { 228*9880d681SAndroid Build Coastguard Worker let Name = "SImm7s" # Scale; 229*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMemoryIndexed" # Scale # "SImm7"; 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdef SImm7s4Operand : SImm7Scaled<4>; 233*9880d681SAndroid Build Coastguard Workerdef SImm7s8Operand : SImm7Scaled<8>; 234*9880d681SAndroid Build Coastguard Workerdef SImm7s16Operand : SImm7Scaled<16>; 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdef simm7s4 : Operand<i32> { 237*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm7s4Operand; 238*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImmScale<4>"; 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdef simm7s8 : Operand<i32> { 242*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm7s8Operand; 243*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImmScale<8>"; 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerdef simm7s16 : Operand<i32> { 247*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm7s16Operand; 248*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImmScale<16>"; 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdef am_indexed7s8 : ComplexPattern<i64, 2, "SelectAddrModeIndexed7S8", []>; 252*9880d681SAndroid Build Coastguard Workerdef am_indexed7s16 : ComplexPattern<i64, 2, "SelectAddrModeIndexed7S16", []>; 253*9880d681SAndroid Build Coastguard Workerdef am_indexed7s32 : ComplexPattern<i64, 2, "SelectAddrModeIndexed7S32", []>; 254*9880d681SAndroid Build Coastguard Workerdef am_indexed7s64 : ComplexPattern<i64, 2, "SelectAddrModeIndexed7S64", []>; 255*9880d681SAndroid Build Coastguard Workerdef am_indexed7s128 : ComplexPattern<i64, 2, "SelectAddrModeIndexed7S128", []>; 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerclass AsmImmRange<int Low, int High> : AsmOperandClass { 258*9880d681SAndroid Build Coastguard Worker let Name = "Imm" # Low # "_" # High; 259*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidImm" # Low # "_" # High; 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdef Imm1_8Operand : AsmImmRange<1, 8>; 263*9880d681SAndroid Build Coastguard Workerdef Imm1_16Operand : AsmImmRange<1, 16>; 264*9880d681SAndroid Build Coastguard Workerdef Imm1_32Operand : AsmImmRange<1, 32>; 265*9880d681SAndroid Build Coastguard Workerdef Imm1_64Operand : AsmImmRange<1, 64>; 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerdef MovZSymbolG3AsmOperand : AsmOperandClass { 268*9880d681SAndroid Build Coastguard Worker let Name = "MovZSymbolG3"; 269*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 270*9880d681SAndroid Build Coastguard Worker} 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Workerdef movz_symbol_g3 : Operand<i32> { 273*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovZSymbolG3AsmOperand; 274*9880d681SAndroid Build Coastguard Worker} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerdef MovZSymbolG2AsmOperand : AsmOperandClass { 277*9880d681SAndroid Build Coastguard Worker let Name = "MovZSymbolG2"; 278*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerdef movz_symbol_g2 : Operand<i32> { 282*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovZSymbolG2AsmOperand; 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdef MovZSymbolG1AsmOperand : AsmOperandClass { 286*9880d681SAndroid Build Coastguard Worker let Name = "MovZSymbolG1"; 287*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdef movz_symbol_g1 : Operand<i32> { 291*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovZSymbolG1AsmOperand; 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerdef MovZSymbolG0AsmOperand : AsmOperandClass { 295*9880d681SAndroid Build Coastguard Worker let Name = "MovZSymbolG0"; 296*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerdef movz_symbol_g0 : Operand<i32> { 300*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovZSymbolG0AsmOperand; 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerdef MovKSymbolG3AsmOperand : AsmOperandClass { 304*9880d681SAndroid Build Coastguard Worker let Name = "MovKSymbolG3"; 305*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 306*9880d681SAndroid Build Coastguard Worker} 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Workerdef movk_symbol_g3 : Operand<i32> { 309*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovKSymbolG3AsmOperand; 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerdef MovKSymbolG2AsmOperand : AsmOperandClass { 313*9880d681SAndroid Build Coastguard Worker let Name = "MovKSymbolG2"; 314*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerdef movk_symbol_g2 : Operand<i32> { 318*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovKSymbolG2AsmOperand; 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdef MovKSymbolG1AsmOperand : AsmOperandClass { 322*9880d681SAndroid Build Coastguard Worker let Name = "MovKSymbolG1"; 323*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerdef movk_symbol_g1 : Operand<i32> { 327*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovKSymbolG1AsmOperand; 328*9880d681SAndroid Build Coastguard Worker} 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerdef MovKSymbolG0AsmOperand : AsmOperandClass { 331*9880d681SAndroid Build Coastguard Worker let Name = "MovKSymbolG0"; 332*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdef movk_symbol_g0 : Operand<i32> { 336*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovKSymbolG0AsmOperand; 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerclass fixedpoint_i32<ValueType FloatVT> 340*9880d681SAndroid Build Coastguard Worker : Operand<FloatVT>, 341*9880d681SAndroid Build Coastguard Worker ComplexPattern<FloatVT, 1, "SelectCVTFixedPosOperand<32>", [fpimm, ld]> { 342*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getFixedPointScaleOpValue"; 343*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeFixedPointScaleImm32"; 344*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_32Operand; 345*9880d681SAndroid Build Coastguard Worker} 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerclass fixedpoint_i64<ValueType FloatVT> 348*9880d681SAndroid Build Coastguard Worker : Operand<FloatVT>, 349*9880d681SAndroid Build Coastguard Worker ComplexPattern<FloatVT, 1, "SelectCVTFixedPosOperand<64>", [fpimm, ld]> { 350*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getFixedPointScaleOpValue"; 351*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeFixedPointScaleImm64"; 352*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_64Operand; 353*9880d681SAndroid Build Coastguard Worker} 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f16_i32 : fixedpoint_i32<f16>; 356*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f32_i32 : fixedpoint_i32<f32>; 357*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f64_i32 : fixedpoint_i32<f64>; 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f16_i64 : fixedpoint_i64<f16>; 360*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f32_i64 : fixedpoint_i64<f32>; 361*9880d681SAndroid Build Coastguard Workerdef fixedpoint_f64_i64 : fixedpoint_i64<f64>; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerdef vecshiftR8 : Operand<i32>, ImmLeaf<i32, [{ 364*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 9); 365*9880d681SAndroid Build Coastguard Worker}]> { 366*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR8OpValue"; 367*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR8Imm"; 368*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_8Operand; 369*9880d681SAndroid Build Coastguard Worker} 370*9880d681SAndroid Build Coastguard Workerdef vecshiftR16 : Operand<i32>, ImmLeaf<i32, [{ 371*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17); 372*9880d681SAndroid Build Coastguard Worker}]> { 373*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR16OpValue"; 374*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR16Imm"; 375*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_16Operand; 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Workerdef vecshiftR16Narrow : Operand<i32>, ImmLeaf<i32, [{ 378*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 9); 379*9880d681SAndroid Build Coastguard Worker}]> { 380*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR16OpValue"; 381*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR16ImmNarrow"; 382*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_8Operand; 383*9880d681SAndroid Build Coastguard Worker} 384*9880d681SAndroid Build Coastguard Workerdef vecshiftR32 : Operand<i32>, ImmLeaf<i32, [{ 385*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 33); 386*9880d681SAndroid Build Coastguard Worker}]> { 387*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR32OpValue"; 388*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR32Imm"; 389*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_32Operand; 390*9880d681SAndroid Build Coastguard Worker} 391*9880d681SAndroid Build Coastguard Workerdef vecshiftR32Narrow : Operand<i32>, ImmLeaf<i32, [{ 392*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17); 393*9880d681SAndroid Build Coastguard Worker}]> { 394*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR32OpValue"; 395*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR32ImmNarrow"; 396*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_16Operand; 397*9880d681SAndroid Build Coastguard Worker} 398*9880d681SAndroid Build Coastguard Workerdef vecshiftR64 : Operand<i32>, ImmLeaf<i32, [{ 399*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 65); 400*9880d681SAndroid Build Coastguard Worker}]> { 401*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR64OpValue"; 402*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR64Imm"; 403*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_64Operand; 404*9880d681SAndroid Build Coastguard Worker} 405*9880d681SAndroid Build Coastguard Workerdef vecshiftR64Narrow : Operand<i32>, ImmLeaf<i32, [{ 406*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 33); 407*9880d681SAndroid Build Coastguard Worker}]> { 408*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftR64OpValue"; 409*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftR64ImmNarrow"; 410*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm1_32Operand; 411*9880d681SAndroid Build Coastguard Worker} 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerdef Imm0_1Operand : AsmImmRange<0, 1>; 414*9880d681SAndroid Build Coastguard Workerdef Imm0_7Operand : AsmImmRange<0, 7>; 415*9880d681SAndroid Build Coastguard Workerdef Imm0_15Operand : AsmImmRange<0, 15>; 416*9880d681SAndroid Build Coastguard Workerdef Imm0_31Operand : AsmImmRange<0, 31>; 417*9880d681SAndroid Build Coastguard Workerdef Imm0_63Operand : AsmImmRange<0, 63>; 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Workerdef vecshiftL8 : Operand<i32>, ImmLeaf<i32, [{ 420*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) < 8); 421*9880d681SAndroid Build Coastguard Worker}]> { 422*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftL8OpValue"; 423*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftL8Imm"; 424*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_7Operand; 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Workerdef vecshiftL16 : Operand<i32>, ImmLeaf<i32, [{ 427*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) < 16); 428*9880d681SAndroid Build Coastguard Worker}]> { 429*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftL16OpValue"; 430*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftL16Imm"; 431*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_15Operand; 432*9880d681SAndroid Build Coastguard Worker} 433*9880d681SAndroid Build Coastguard Workerdef vecshiftL32 : Operand<i32>, ImmLeaf<i32, [{ 434*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) < 32); 435*9880d681SAndroid Build Coastguard Worker}]> { 436*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftL32OpValue"; 437*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftL32Imm"; 438*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_31Operand; 439*9880d681SAndroid Build Coastguard Worker} 440*9880d681SAndroid Build Coastguard Workerdef vecshiftL64 : Operand<i32>, ImmLeaf<i32, [{ 441*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) < 64); 442*9880d681SAndroid Build Coastguard Worker}]> { 443*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShiftL64OpValue"; 444*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVecShiftL64Imm"; 445*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_63Operand; 446*9880d681SAndroid Build Coastguard Worker} 447*9880d681SAndroid Build Coastguard Worker 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker// Crazy immediate formats used by 32-bit and 64-bit logical immediate 450*9880d681SAndroid Build Coastguard Worker// instructions for splatting repeating bit patterns across the immediate. 451*9880d681SAndroid Build Coastguard Workerdef logical_imm32_XFORM : SDNodeXForm<imm, [{ 452*9880d681SAndroid Build Coastguard Worker uint64_t enc = AArch64_AM::encodeLogicalImmediate(N->getZExtValue(), 32); 453*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 454*9880d681SAndroid Build Coastguard Worker}]>; 455*9880d681SAndroid Build Coastguard Workerdef logical_imm64_XFORM : SDNodeXForm<imm, [{ 456*9880d681SAndroid Build Coastguard Worker uint64_t enc = AArch64_AM::encodeLogicalImmediate(N->getZExtValue(), 64); 457*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 458*9880d681SAndroid Build Coastguard Worker}]>; 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Workerlet DiagnosticType = "LogicalSecondSource" in { 461*9880d681SAndroid Build Coastguard Worker def LogicalImm32Operand : AsmOperandClass { 462*9880d681SAndroid Build Coastguard Worker let Name = "LogicalImm32"; 463*9880d681SAndroid Build Coastguard Worker } 464*9880d681SAndroid Build Coastguard Worker def LogicalImm64Operand : AsmOperandClass { 465*9880d681SAndroid Build Coastguard Worker let Name = "LogicalImm64"; 466*9880d681SAndroid Build Coastguard Worker } 467*9880d681SAndroid Build Coastguard Worker def LogicalImm32NotOperand : AsmOperandClass { 468*9880d681SAndroid Build Coastguard Worker let Name = "LogicalImm32Not"; 469*9880d681SAndroid Build Coastguard Worker } 470*9880d681SAndroid Build Coastguard Worker def LogicalImm64NotOperand : AsmOperandClass { 471*9880d681SAndroid Build Coastguard Worker let Name = "LogicalImm64Not"; 472*9880d681SAndroid Build Coastguard Worker } 473*9880d681SAndroid Build Coastguard Worker} 474*9880d681SAndroid Build Coastguard Workerdef logical_imm32 : Operand<i32>, PatLeaf<(imm), [{ 475*9880d681SAndroid Build Coastguard Worker return AArch64_AM::isLogicalImmediate(N->getZExtValue(), 32); 476*9880d681SAndroid Build Coastguard Worker}], logical_imm32_XFORM> { 477*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printLogicalImm32"; 478*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalImm32Operand; 479*9880d681SAndroid Build Coastguard Worker} 480*9880d681SAndroid Build Coastguard Workerdef logical_imm64 : Operand<i64>, PatLeaf<(imm), [{ 481*9880d681SAndroid Build Coastguard Worker return AArch64_AM::isLogicalImmediate(N->getZExtValue(), 64); 482*9880d681SAndroid Build Coastguard Worker}], logical_imm64_XFORM> { 483*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printLogicalImm64"; 484*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalImm64Operand; 485*9880d681SAndroid Build Coastguard Worker} 486*9880d681SAndroid Build Coastguard Workerdef logical_imm32_not : Operand<i32> { 487*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalImm32NotOperand; 488*9880d681SAndroid Build Coastguard Worker} 489*9880d681SAndroid Build Coastguard Workerdef logical_imm64_not : Operand<i64> { 490*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalImm64NotOperand; 491*9880d681SAndroid Build Coastguard Worker} 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Worker// imm0_65535 predicate - True if the immediate is in the range [0,65535]. 494*9880d681SAndroid Build Coastguard Workerdef Imm0_65535Operand : AsmImmRange<0, 65535>; 495*9880d681SAndroid Build Coastguard Workerdef imm0_65535 : Operand<i32>, ImmLeaf<i32, [{ 496*9880d681SAndroid Build Coastguard Worker return ((uint32_t)Imm) < 65536; 497*9880d681SAndroid Build Coastguard Worker}]> { 498*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_65535Operand; 499*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImmHex"; 500*9880d681SAndroid Build Coastguard Worker} 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Worker// imm0_255 predicate - True if the immediate is in the range [0,255]. 503*9880d681SAndroid Build Coastguard Workerdef Imm0_255Operand : AsmOperandClass { let Name = "Imm0_255"; } 504*9880d681SAndroid Build Coastguard Workerdef imm0_255 : Operand<i32>, ImmLeaf<i32, [{ 505*9880d681SAndroid Build Coastguard Worker return ((uint32_t)Imm) < 256; 506*9880d681SAndroid Build Coastguard Worker}]> { 507*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_255Operand; 508*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImm"; 509*9880d681SAndroid Build Coastguard Worker} 510*9880d681SAndroid Build Coastguard Worker 511*9880d681SAndroid Build Coastguard Worker// imm0_127 predicate - True if the immediate is in the range [0,127] 512*9880d681SAndroid Build Coastguard Workerdef Imm0_127Operand : AsmImmRange<0, 127>; 513*9880d681SAndroid Build Coastguard Workerdef imm0_127 : Operand<i32>, ImmLeaf<i32, [{ 514*9880d681SAndroid Build Coastguard Worker return ((uint32_t)Imm) < 128; 515*9880d681SAndroid Build Coastguard Worker}]> { 516*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_127Operand; 517*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImm"; 518*9880d681SAndroid Build Coastguard Worker} 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Worker// NOTE: These imm0_N operands have to be of type i64 because i64 is the size 521*9880d681SAndroid Build Coastguard Worker// for all shift-amounts. 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker// imm0_63 predicate - True if the immediate is in the range [0,63] 524*9880d681SAndroid Build Coastguard Workerdef imm0_63 : Operand<i64>, ImmLeaf<i64, [{ 525*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 64; 526*9880d681SAndroid Build Coastguard Worker}]> { 527*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_63Operand; 528*9880d681SAndroid Build Coastguard Worker} 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Worker// imm0_31 predicate - True if the immediate is in the range [0,31] 531*9880d681SAndroid Build Coastguard Workerdef imm0_31 : Operand<i64>, ImmLeaf<i64, [{ 532*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 32; 533*9880d681SAndroid Build Coastguard Worker}]> { 534*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_31Operand; 535*9880d681SAndroid Build Coastguard Worker} 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Worker// True if the 32-bit immediate is in the range [0,31] 538*9880d681SAndroid Build Coastguard Workerdef imm32_0_31 : Operand<i32>, ImmLeaf<i32, [{ 539*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 32; 540*9880d681SAndroid Build Coastguard Worker}]> { 541*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_31Operand; 542*9880d681SAndroid Build Coastguard Worker} 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Worker// imm0_1 predicate - True if the immediate is in the range [0,1] 545*9880d681SAndroid Build Coastguard Workerdef imm0_1 : Operand<i64>, ImmLeaf<i64, [{ 546*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 2; 547*9880d681SAndroid Build Coastguard Worker}]> { 548*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_1Operand; 549*9880d681SAndroid Build Coastguard Worker} 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker// imm0_15 predicate - True if the immediate is in the range [0,15] 552*9880d681SAndroid Build Coastguard Workerdef imm0_15 : Operand<i64>, ImmLeaf<i64, [{ 553*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 16; 554*9880d681SAndroid Build Coastguard Worker}]> { 555*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_15Operand; 556*9880d681SAndroid Build Coastguard Worker} 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker// imm0_7 predicate - True if the immediate is in the range [0,7] 559*9880d681SAndroid Build Coastguard Workerdef imm0_7 : Operand<i64>, ImmLeaf<i64, [{ 560*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 8; 561*9880d681SAndroid Build Coastguard Worker}]> { 562*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_7Operand; 563*9880d681SAndroid Build Coastguard Worker} 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Worker// imm32_0_15 predicate - True if the 32-bit immediate is in the range [0,15] 566*9880d681SAndroid Build Coastguard Workerdef imm32_0_15 : Operand<i32>, ImmLeaf<i32, [{ 567*9880d681SAndroid Build Coastguard Worker return ((uint32_t)Imm) < 16; 568*9880d681SAndroid Build Coastguard Worker}]> { 569*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_15Operand; 570*9880d681SAndroid Build Coastguard Worker} 571*9880d681SAndroid Build Coastguard Worker 572*9880d681SAndroid Build Coastguard Worker// An arithmetic shifter operand: 573*9880d681SAndroid Build Coastguard Worker// {7-6} - shift type: 00 = lsl, 01 = lsr, 10 = asr 574*9880d681SAndroid Build Coastguard Worker// {5-0} - imm6 575*9880d681SAndroid Build Coastguard Workerclass arith_shift<ValueType Ty, int width> : Operand<Ty> { 576*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 577*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = !cast<AsmOperandClass>( 578*9880d681SAndroid Build Coastguard Worker "ArithmeticShifterOperand" # width); 579*9880d681SAndroid Build Coastguard Worker} 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Workerdef arith_shift32 : arith_shift<i32, 32>; 582*9880d681SAndroid Build Coastguard Workerdef arith_shift64 : arith_shift<i64, 64>; 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Workerclass arith_shifted_reg<ValueType Ty, RegisterClass regclass, int width> 585*9880d681SAndroid Build Coastguard Worker : Operand<Ty>, 586*9880d681SAndroid Build Coastguard Worker ComplexPattern<Ty, 2, "SelectArithShiftedRegister", []> { 587*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShiftedRegister"; 588*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops regclass, !cast<Operand>("arith_shift" # width)); 589*9880d681SAndroid Build Coastguard Worker} 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard Workerdef arith_shifted_reg32 : arith_shifted_reg<i32, GPR32, 32>; 592*9880d681SAndroid Build Coastguard Workerdef arith_shifted_reg64 : arith_shifted_reg<i64, GPR64, 64>; 593*9880d681SAndroid Build Coastguard Worker 594*9880d681SAndroid Build Coastguard Worker// An arithmetic shifter operand: 595*9880d681SAndroid Build Coastguard Worker// {7-6} - shift type: 00 = lsl, 01 = lsr, 10 = asr, 11 = ror 596*9880d681SAndroid Build Coastguard Worker// {5-0} - imm6 597*9880d681SAndroid Build Coastguard Workerclass logical_shift<int width> : Operand<i32> { 598*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 599*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = !cast<AsmOperandClass>( 600*9880d681SAndroid Build Coastguard Worker "LogicalShifterOperand" # width); 601*9880d681SAndroid Build Coastguard Worker} 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Workerdef logical_shift32 : logical_shift<32>; 604*9880d681SAndroid Build Coastguard Workerdef logical_shift64 : logical_shift<64>; 605*9880d681SAndroid Build Coastguard Worker 606*9880d681SAndroid Build Coastguard Workerclass logical_shifted_reg<ValueType Ty, RegisterClass regclass, Operand shiftop> 607*9880d681SAndroid Build Coastguard Worker : Operand<Ty>, 608*9880d681SAndroid Build Coastguard Worker ComplexPattern<Ty, 2, "SelectLogicalShiftedRegister", []> { 609*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShiftedRegister"; 610*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops regclass, shiftop); 611*9880d681SAndroid Build Coastguard Worker} 612*9880d681SAndroid Build Coastguard Worker 613*9880d681SAndroid Build Coastguard Workerdef logical_shifted_reg32 : logical_shifted_reg<i32, GPR32, logical_shift32>; 614*9880d681SAndroid Build Coastguard Workerdef logical_shifted_reg64 : logical_shifted_reg<i64, GPR64, logical_shift64>; 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Worker// A logical vector shifter operand: 617*9880d681SAndroid Build Coastguard Worker// {7-6} - shift type: 00 = lsl 618*9880d681SAndroid Build Coastguard Worker// {5-0} - imm6: #0, #8, #16, or #24 619*9880d681SAndroid Build Coastguard Workerdef logical_vec_shift : Operand<i32> { 620*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 621*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShifterOpValue"; 622*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalVecShifterOperand; 623*9880d681SAndroid Build Coastguard Worker} 624*9880d681SAndroid Build Coastguard Worker 625*9880d681SAndroid Build Coastguard Worker// A logical vector half-word shifter operand: 626*9880d681SAndroid Build Coastguard Worker// {7-6} - shift type: 00 = lsl 627*9880d681SAndroid Build Coastguard Worker// {5-0} - imm6: #0 or #8 628*9880d681SAndroid Build Coastguard Workerdef logical_vec_hw_shift : Operand<i32> { 629*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 630*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getVecShifterOpValue"; 631*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = LogicalVecHalfWordShifterOperand; 632*9880d681SAndroid Build Coastguard Worker} 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Worker// A vector move shifter operand: 635*9880d681SAndroid Build Coastguard Worker// {0} - imm1: #8 or #16 636*9880d681SAndroid Build Coastguard Workerdef move_vec_shift : Operand<i32> { 637*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 638*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getMoveVecShifterOpValue"; 639*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MoveVecShifterOperand; 640*9880d681SAndroid Build Coastguard Worker} 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Workerlet DiagnosticType = "AddSubSecondSource" in { 643*9880d681SAndroid Build Coastguard Worker def AddSubImmOperand : AsmOperandClass { 644*9880d681SAndroid Build Coastguard Worker let Name = "AddSubImm"; 645*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseAddSubImm"; 646*9880d681SAndroid Build Coastguard Worker } 647*9880d681SAndroid Build Coastguard Worker def AddSubImmNegOperand : AsmOperandClass { 648*9880d681SAndroid Build Coastguard Worker let Name = "AddSubImmNeg"; 649*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseAddSubImm"; 650*9880d681SAndroid Build Coastguard Worker } 651*9880d681SAndroid Build Coastguard Worker} 652*9880d681SAndroid Build Coastguard Worker// An ADD/SUB immediate shifter operand: 653*9880d681SAndroid Build Coastguard Worker// second operand: 654*9880d681SAndroid Build Coastguard Worker// {7-6} - shift type: 00 = lsl 655*9880d681SAndroid Build Coastguard Worker// {5-0} - imm6: #0 or #12 656*9880d681SAndroid Build Coastguard Workerclass addsub_shifted_imm<ValueType Ty> 657*9880d681SAndroid Build Coastguard Worker : Operand<Ty>, ComplexPattern<Ty, 2, "SelectArithImmed", [imm]> { 658*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAddSubImm"; 659*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getAddSubImmOpValue"; 660*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = AddSubImmOperand; 661*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i32imm, i32imm); 662*9880d681SAndroid Build Coastguard Worker} 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Workerclass addsub_shifted_imm_neg<ValueType Ty> 665*9880d681SAndroid Build Coastguard Worker : Operand<Ty> { 666*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getAddSubImmOpValue"; 667*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = AddSubImmNegOperand; 668*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i32imm, i32imm); 669*9880d681SAndroid Build Coastguard Worker} 670*9880d681SAndroid Build Coastguard Worker 671*9880d681SAndroid Build Coastguard Workerdef addsub_shifted_imm32 : addsub_shifted_imm<i32>; 672*9880d681SAndroid Build Coastguard Workerdef addsub_shifted_imm64 : addsub_shifted_imm<i64>; 673*9880d681SAndroid Build Coastguard Workerdef addsub_shifted_imm32_neg : addsub_shifted_imm_neg<i32>; 674*9880d681SAndroid Build Coastguard Workerdef addsub_shifted_imm64_neg : addsub_shifted_imm_neg<i64>; 675*9880d681SAndroid Build Coastguard Worker 676*9880d681SAndroid Build Coastguard Workerclass neg_addsub_shifted_imm<ValueType Ty> 677*9880d681SAndroid Build Coastguard Worker : Operand<Ty>, ComplexPattern<Ty, 2, "SelectNegArithImmed", [imm]> { 678*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAddSubImm"; 679*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getAddSubImmOpValue"; 680*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = AddSubImmOperand; 681*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i32imm, i32imm); 682*9880d681SAndroid Build Coastguard Worker} 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdef neg_addsub_shifted_imm32 : neg_addsub_shifted_imm<i32>; 685*9880d681SAndroid Build Coastguard Workerdef neg_addsub_shifted_imm64 : neg_addsub_shifted_imm<i64>; 686*9880d681SAndroid Build Coastguard Worker 687*9880d681SAndroid Build Coastguard Worker// An extend operand: 688*9880d681SAndroid Build Coastguard Worker// {5-3} - extend type 689*9880d681SAndroid Build Coastguard Worker// {2-0} - imm3 690*9880d681SAndroid Build Coastguard Workerdef arith_extend : Operand<i32> { 691*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printArithExtend"; 692*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = ExtendOperand; 693*9880d681SAndroid Build Coastguard Worker} 694*9880d681SAndroid Build Coastguard Workerdef arith_extend64 : Operand<i32> { 695*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printArithExtend"; 696*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = ExtendOperand64; 697*9880d681SAndroid Build Coastguard Worker} 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Worker// 'extend' that's a lsl of a 64-bit register. 700*9880d681SAndroid Build Coastguard Workerdef arith_extendlsl64 : Operand<i32> { 701*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printArithExtend"; 702*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = ExtendOperandLSL64; 703*9880d681SAndroid Build Coastguard Worker} 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerclass arith_extended_reg32<ValueType Ty> : Operand<Ty>, 706*9880d681SAndroid Build Coastguard Worker ComplexPattern<Ty, 2, "SelectArithExtendedRegister", []> { 707*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printExtendedRegister"; 708*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops GPR32, arith_extend); 709*9880d681SAndroid Build Coastguard Worker} 710*9880d681SAndroid Build Coastguard Worker 711*9880d681SAndroid Build Coastguard Workerclass arith_extended_reg32to64<ValueType Ty> : Operand<Ty>, 712*9880d681SAndroid Build Coastguard Worker ComplexPattern<Ty, 2, "SelectArithExtendedRegister", []> { 713*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printExtendedRegister"; 714*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops GPR32, arith_extend64); 715*9880d681SAndroid Build Coastguard Worker} 716*9880d681SAndroid Build Coastguard Worker 717*9880d681SAndroid Build Coastguard Worker// Floating-point immediate. 718*9880d681SAndroid Build Coastguard Workerdef fpimm16 : Operand<f16>, 719*9880d681SAndroid Build Coastguard Worker PatLeaf<(f16 fpimm), [{ 720*9880d681SAndroid Build Coastguard Worker return AArch64_AM::getFP16Imm(N->getValueAPF()) != -1; 721*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 722*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 723*9880d681SAndroid Build Coastguard Worker uint32_t enc = AArch64_AM::getFP16Imm(InVal); 724*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 725*9880d681SAndroid Build Coastguard Worker }]>> { 726*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 727*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 728*9880d681SAndroid Build Coastguard Worker} 729*9880d681SAndroid Build Coastguard Workerdef fpimm32 : Operand<f32>, 730*9880d681SAndroid Build Coastguard Worker PatLeaf<(f32 fpimm), [{ 731*9880d681SAndroid Build Coastguard Worker return AArch64_AM::getFP32Imm(N->getValueAPF()) != -1; 732*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 733*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 734*9880d681SAndroid Build Coastguard Worker uint32_t enc = AArch64_AM::getFP32Imm(InVal); 735*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 736*9880d681SAndroid Build Coastguard Worker }]>> { 737*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 738*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 739*9880d681SAndroid Build Coastguard Worker} 740*9880d681SAndroid Build Coastguard Workerdef fpimm64 : Operand<f64>, 741*9880d681SAndroid Build Coastguard Worker PatLeaf<(f64 fpimm), [{ 742*9880d681SAndroid Build Coastguard Worker return AArch64_AM::getFP64Imm(N->getValueAPF()) != -1; 743*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 744*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 745*9880d681SAndroid Build Coastguard Worker uint32_t enc = AArch64_AM::getFP64Imm(InVal); 746*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 747*9880d681SAndroid Build Coastguard Worker }]>> { 748*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 749*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 750*9880d681SAndroid Build Coastguard Worker} 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard Workerdef fpimm8 : Operand<i32> { 753*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 754*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 755*9880d681SAndroid Build Coastguard Worker} 756*9880d681SAndroid Build Coastguard Worker 757*9880d681SAndroid Build Coastguard Workerdef fpimm0 : PatLeaf<(fpimm), [{ 758*9880d681SAndroid Build Coastguard Worker return N->isExactlyValue(+0.0); 759*9880d681SAndroid Build Coastguard Worker}]>; 760*9880d681SAndroid Build Coastguard Worker 761*9880d681SAndroid Build Coastguard Worker// Vector lane operands 762*9880d681SAndroid Build Coastguard Workerclass AsmVectorIndex<string Suffix> : AsmOperandClass { 763*9880d681SAndroid Build Coastguard Worker let Name = "VectorIndex" # Suffix; 764*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidIndex" # Suffix; 765*9880d681SAndroid Build Coastguard Worker} 766*9880d681SAndroid Build Coastguard Workerdef VectorIndex1Operand : AsmVectorIndex<"1">; 767*9880d681SAndroid Build Coastguard Workerdef VectorIndexBOperand : AsmVectorIndex<"B">; 768*9880d681SAndroid Build Coastguard Workerdef VectorIndexHOperand : AsmVectorIndex<"H">; 769*9880d681SAndroid Build Coastguard Workerdef VectorIndexSOperand : AsmVectorIndex<"S">; 770*9880d681SAndroid Build Coastguard Workerdef VectorIndexDOperand : AsmVectorIndex<"D">; 771*9880d681SAndroid Build Coastguard Worker 772*9880d681SAndroid Build Coastguard Workerdef VectorIndex1 : Operand<i64>, ImmLeaf<i64, [{ 773*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) == 1; 774*9880d681SAndroid Build Coastguard Worker}]> { 775*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = VectorIndex1Operand; 776*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printVectorIndex"; 777*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i64imm); 778*9880d681SAndroid Build Coastguard Worker} 779*9880d681SAndroid Build Coastguard Workerdef VectorIndexB : Operand<i64>, ImmLeaf<i64, [{ 780*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 16; 781*9880d681SAndroid Build Coastguard Worker}]> { 782*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = VectorIndexBOperand; 783*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printVectorIndex"; 784*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i64imm); 785*9880d681SAndroid Build Coastguard Worker} 786*9880d681SAndroid Build Coastguard Workerdef VectorIndexH : Operand<i64>, ImmLeaf<i64, [{ 787*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 8; 788*9880d681SAndroid Build Coastguard Worker}]> { 789*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = VectorIndexHOperand; 790*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printVectorIndex"; 791*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i64imm); 792*9880d681SAndroid Build Coastguard Worker} 793*9880d681SAndroid Build Coastguard Workerdef VectorIndexS : Operand<i64>, ImmLeaf<i64, [{ 794*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 4; 795*9880d681SAndroid Build Coastguard Worker}]> { 796*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = VectorIndexSOperand; 797*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printVectorIndex"; 798*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i64imm); 799*9880d681SAndroid Build Coastguard Worker} 800*9880d681SAndroid Build Coastguard Workerdef VectorIndexD : Operand<i64>, ImmLeaf<i64, [{ 801*9880d681SAndroid Build Coastguard Worker return ((uint64_t)Imm) < 2; 802*9880d681SAndroid Build Coastguard Worker}]> { 803*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = VectorIndexDOperand; 804*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printVectorIndex"; 805*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i64imm); 806*9880d681SAndroid Build Coastguard Worker} 807*9880d681SAndroid Build Coastguard Worker 808*9880d681SAndroid Build Coastguard Worker// 8-bit immediate for AdvSIMD where 64-bit values of the form: 809*9880d681SAndroid Build Coastguard Worker// aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh 810*9880d681SAndroid Build Coastguard Worker// are encoded as the eight bit value 'abcdefgh'. 811*9880d681SAndroid Build Coastguard Workerdef simdimmtype10 : Operand<i32>, 812*9880d681SAndroid Build Coastguard Worker PatLeaf<(f64 fpimm), [{ 813*9880d681SAndroid Build Coastguard Worker return AArch64_AM::isAdvSIMDModImmType10(N->getValueAPF() 814*9880d681SAndroid Build Coastguard Worker .bitcastToAPInt() 815*9880d681SAndroid Build Coastguard Worker .getZExtValue()); 816*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 817*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 818*9880d681SAndroid Build Coastguard Worker uint32_t enc = AArch64_AM::encodeAdvSIMDModImmType10(N->getValueAPF() 819*9880d681SAndroid Build Coastguard Worker .bitcastToAPInt() 820*9880d681SAndroid Build Coastguard Worker .getZExtValue()); 821*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 822*9880d681SAndroid Build Coastguard Worker }]>> { 823*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SIMDImmType10Operand; 824*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printSIMDType10Operand"; 825*9880d681SAndroid Build Coastguard Worker} 826*9880d681SAndroid Build Coastguard Worker 827*9880d681SAndroid Build Coastguard Worker 828*9880d681SAndroid Build Coastguard Worker//--- 829*9880d681SAndroid Build Coastguard Worker// System management 830*9880d681SAndroid Build Coastguard Worker//--- 831*9880d681SAndroid Build Coastguard Worker 832*9880d681SAndroid Build Coastguard Worker// Base encoding for system instruction operands. 833*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 834*9880d681SAndroid Build Coastguard Workerclass BaseSystemI<bit L, dag oops, dag iops, string asm, string operands, 835*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> 836*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, "", pattern> { 837*9880d681SAndroid Build Coastguard Worker let Inst{31-22} = 0b1101010100; 838*9880d681SAndroid Build Coastguard Worker let Inst{21} = L; 839*9880d681SAndroid Build Coastguard Worker} 840*9880d681SAndroid Build Coastguard Worker 841*9880d681SAndroid Build Coastguard Worker// System instructions which do not have an Rt register. 842*9880d681SAndroid Build Coastguard Workerclass SimpleSystemI<bit L, dag iops, string asm, string operands, 843*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> 844*9880d681SAndroid Build Coastguard Worker : BaseSystemI<L, (outs), iops, asm, operands, pattern> { 845*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = 0b11111; 846*9880d681SAndroid Build Coastguard Worker} 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Worker// System instructions which have an Rt register. 849*9880d681SAndroid Build Coastguard Workerclass RtSystemI<bit L, dag oops, dag iops, string asm, string operands> 850*9880d681SAndroid Build Coastguard Worker : BaseSystemI<L, oops, iops, asm, operands>, 851*9880d681SAndroid Build Coastguard Worker Sched<[WriteSys]> { 852*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 853*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 854*9880d681SAndroid Build Coastguard Worker} 855*9880d681SAndroid Build Coastguard Worker 856*9880d681SAndroid Build Coastguard Worker// Hint instructions that take both a CRm and a 3-bit immediate. 857*9880d681SAndroid Build Coastguard Worker// NOTE: ideally, this would have mayStore = 0, mayLoad = 0, but we cannot 858*9880d681SAndroid Build Coastguard Worker// model patterns with sufficiently fine granularity 859*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 1, hasSideEffects = 1 in 860*9880d681SAndroid Build Coastguard Worker class HintI<string mnemonic> 861*9880d681SAndroid Build Coastguard Worker : SimpleSystemI<0, (ins imm0_127:$imm), mnemonic#"\t$imm", "", 862*9880d681SAndroid Build Coastguard Worker [(int_aarch64_hint imm0_127:$imm)]>, 863*9880d681SAndroid Build Coastguard Worker Sched<[WriteHint]> { 864*9880d681SAndroid Build Coastguard Worker bits <7> imm; 865*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = 0b000110010; 866*9880d681SAndroid Build Coastguard Worker let Inst{11-5} = imm; 867*9880d681SAndroid Build Coastguard Worker } 868*9880d681SAndroid Build Coastguard Worker 869*9880d681SAndroid Build Coastguard Worker// System instructions taking a single literal operand which encodes into 870*9880d681SAndroid Build Coastguard Worker// CRm. op2 differentiates the opcodes. 871*9880d681SAndroid Build Coastguard Workerdef BarrierAsmOperand : AsmOperandClass { 872*9880d681SAndroid Build Coastguard Worker let Name = "Barrier"; 873*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseBarrierOperand"; 874*9880d681SAndroid Build Coastguard Worker} 875*9880d681SAndroid Build Coastguard Workerdef barrier_op : Operand<i32> { 876*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printBarrierOption"; 877*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = BarrierAsmOperand; 878*9880d681SAndroid Build Coastguard Worker} 879*9880d681SAndroid Build Coastguard Workerclass CRmSystemI<Operand crmtype, bits<3> opc, string asm, 880*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> 881*9880d681SAndroid Build Coastguard Worker : SimpleSystemI<0, (ins crmtype:$CRm), asm, "\t$CRm", pattern>, 882*9880d681SAndroid Build Coastguard Worker Sched<[WriteBarrier]> { 883*9880d681SAndroid Build Coastguard Worker bits<4> CRm; 884*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = 0b000110011; 885*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = CRm; 886*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = opc; 887*9880d681SAndroid Build Coastguard Worker} 888*9880d681SAndroid Build Coastguard Worker 889*9880d681SAndroid Build Coastguard Worker// MRS/MSR system instructions. These have different operand classes because 890*9880d681SAndroid Build Coastguard Worker// a different subset of registers can be accessed through each instruction. 891*9880d681SAndroid Build Coastguard Workerdef MRSSystemRegisterOperand : AsmOperandClass { 892*9880d681SAndroid Build Coastguard Worker let Name = "MRSSystemRegister"; 893*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseSysReg"; 894*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "MRS"; 895*9880d681SAndroid Build Coastguard Worker} 896*9880d681SAndroid Build Coastguard Worker// concatenation of op0, op1, CRn, CRm, op2. 16-bit immediate. 897*9880d681SAndroid Build Coastguard Workerdef mrs_sysreg_op : Operand<i32> { 898*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MRSSystemRegisterOperand; 899*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeMRSSystemRegister"; 900*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printMRSSystemRegister"; 901*9880d681SAndroid Build Coastguard Worker} 902*9880d681SAndroid Build Coastguard Worker 903*9880d681SAndroid Build Coastguard Workerdef MSRSystemRegisterOperand : AsmOperandClass { 904*9880d681SAndroid Build Coastguard Worker let Name = "MSRSystemRegister"; 905*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseSysReg"; 906*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "MSR"; 907*9880d681SAndroid Build Coastguard Worker} 908*9880d681SAndroid Build Coastguard Workerdef msr_sysreg_op : Operand<i32> { 909*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MSRSystemRegisterOperand; 910*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeMSRSystemRegister"; 911*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printMSRSystemRegister"; 912*9880d681SAndroid Build Coastguard Worker} 913*9880d681SAndroid Build Coastguard Worker 914*9880d681SAndroid Build Coastguard Workerdef PSBHintOperand : AsmOperandClass { 915*9880d681SAndroid Build Coastguard Worker let Name = "PSBHint"; 916*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParsePSBHint"; 917*9880d681SAndroid Build Coastguard Worker} 918*9880d681SAndroid Build Coastguard Workerdef psbhint_op : Operand<i32> { 919*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PSBHintOperand; 920*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printPSBHintOp"; 921*9880d681SAndroid Build Coastguard Worker let MCOperandPredicate = [{ 922*9880d681SAndroid Build Coastguard Worker // Check, if operand is valid, to fix exhaustive aliasing in disassembly. 923*9880d681SAndroid Build Coastguard Worker // "psb" is an alias to "hint" only for certain values of CRm:Op2 fields. 924*9880d681SAndroid Build Coastguard Worker if (!MCOp.isImm()) 925*9880d681SAndroid Build Coastguard Worker return false; 926*9880d681SAndroid Build Coastguard Worker return AArch64PSBHint::lookupPSBByEncoding(MCOp.getImm()) != nullptr; 927*9880d681SAndroid Build Coastguard Worker }]; 928*9880d681SAndroid Build Coastguard Worker} 929*9880d681SAndroid Build Coastguard Worker 930*9880d681SAndroid Build Coastguard Workerclass MRSI : RtSystemI<1, (outs GPR64:$Rt), (ins mrs_sysreg_op:$systemreg), 931*9880d681SAndroid Build Coastguard Worker "mrs", "\t$Rt, $systemreg"> { 932*9880d681SAndroid Build Coastguard Worker bits<16> systemreg; 933*9880d681SAndroid Build Coastguard Worker let Inst{20-5} = systemreg; 934*9880d681SAndroid Build Coastguard Worker} 935*9880d681SAndroid Build Coastguard Worker 936*9880d681SAndroid Build Coastguard Worker// FIXME: Some of these def NZCV, others don't. Best way to model that? 937*9880d681SAndroid Build Coastguard Worker// Explicitly modeling each of the system register as a register class 938*9880d681SAndroid Build Coastguard Worker// would do it, but feels like overkill at this point. 939*9880d681SAndroid Build Coastguard Workerclass MSRI : RtSystemI<0, (outs), (ins msr_sysreg_op:$systemreg, GPR64:$Rt), 940*9880d681SAndroid Build Coastguard Worker "msr", "\t$systemreg, $Rt"> { 941*9880d681SAndroid Build Coastguard Worker bits<16> systemreg; 942*9880d681SAndroid Build Coastguard Worker let Inst{20-5} = systemreg; 943*9880d681SAndroid Build Coastguard Worker} 944*9880d681SAndroid Build Coastguard Worker 945*9880d681SAndroid Build Coastguard Workerdef SystemPStateFieldWithImm0_15Operand : AsmOperandClass { 946*9880d681SAndroid Build Coastguard Worker let Name = "SystemPStateFieldWithImm0_15"; 947*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseSysReg"; 948*9880d681SAndroid Build Coastguard Worker} 949*9880d681SAndroid Build Coastguard Workerdef pstatefield4_op : Operand<i32> { 950*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SystemPStateFieldWithImm0_15Operand; 951*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printSystemPStateField"; 952*9880d681SAndroid Build Coastguard Worker} 953*9880d681SAndroid Build Coastguard Worker 954*9880d681SAndroid Build Coastguard Workerlet Defs = [NZCV] in 955*9880d681SAndroid Build Coastguard Workerclass MSRpstateImm0_15 956*9880d681SAndroid Build Coastguard Worker : SimpleSystemI<0, (ins pstatefield4_op:$pstatefield, imm0_15:$imm), 957*9880d681SAndroid Build Coastguard Worker "msr", "\t$pstatefield, $imm">, 958*9880d681SAndroid Build Coastguard Worker Sched<[WriteSys]> { 959*9880d681SAndroid Build Coastguard Worker bits<6> pstatefield; 960*9880d681SAndroid Build Coastguard Worker bits<4> imm; 961*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = 0b00; 962*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = pstatefield{5-3}; 963*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b0100; 964*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = imm; 965*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = pstatefield{2-0}; 966*9880d681SAndroid Build Coastguard Worker 967*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSystemPStateInstruction"; 968*9880d681SAndroid Build Coastguard Worker // MSRpstateI aliases with MSRI. When the MSRpstateI decoder method returns 969*9880d681SAndroid Build Coastguard Worker // Fail the decoder should attempt to decode the instruction as MSRI. 970*9880d681SAndroid Build Coastguard Worker let hasCompleteDecoder = 0; 971*9880d681SAndroid Build Coastguard Worker} 972*9880d681SAndroid Build Coastguard Worker 973*9880d681SAndroid Build Coastguard Workerdef SystemPStateFieldWithImm0_1Operand : AsmOperandClass { 974*9880d681SAndroid Build Coastguard Worker let Name = "SystemPStateFieldWithImm0_1"; 975*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseSysReg"; 976*9880d681SAndroid Build Coastguard Worker} 977*9880d681SAndroid Build Coastguard Workerdef pstatefield1_op : Operand<i32> { 978*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SystemPStateFieldWithImm0_1Operand; 979*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printSystemPStateField"; 980*9880d681SAndroid Build Coastguard Worker} 981*9880d681SAndroid Build Coastguard Worker 982*9880d681SAndroid Build Coastguard Workerlet Defs = [NZCV] in 983*9880d681SAndroid Build Coastguard Workerclass MSRpstateImm0_1 984*9880d681SAndroid Build Coastguard Worker : SimpleSystemI<0, (ins pstatefield1_op:$pstatefield, imm0_1:$imm), 985*9880d681SAndroid Build Coastguard Worker "msr", "\t$pstatefield, $imm">, 986*9880d681SAndroid Build Coastguard Worker Sched<[WriteSys]> { 987*9880d681SAndroid Build Coastguard Worker bits<6> pstatefield; 988*9880d681SAndroid Build Coastguard Worker bit imm; 989*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = 0b00; 990*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = pstatefield{5-3}; 991*9880d681SAndroid Build Coastguard Worker let Inst{15-9} = 0b0100000; 992*9880d681SAndroid Build Coastguard Worker let Inst{8} = imm; 993*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = pstatefield{2-0}; 994*9880d681SAndroid Build Coastguard Worker 995*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSystemPStateInstruction"; 996*9880d681SAndroid Build Coastguard Worker // MSRpstateI aliases with MSRI. When the MSRpstateI decoder method returns 997*9880d681SAndroid Build Coastguard Worker // Fail the decoder should attempt to decode the instruction as MSRI. 998*9880d681SAndroid Build Coastguard Worker let hasCompleteDecoder = 0; 999*9880d681SAndroid Build Coastguard Worker} 1000*9880d681SAndroid Build Coastguard Worker 1001*9880d681SAndroid Build Coastguard Worker// SYS and SYSL generic system instructions. 1002*9880d681SAndroid Build Coastguard Workerdef SysCRAsmOperand : AsmOperandClass { 1003*9880d681SAndroid Build Coastguard Worker let Name = "SysCR"; 1004*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParseSysCROperand"; 1005*9880d681SAndroid Build Coastguard Worker} 1006*9880d681SAndroid Build Coastguard Worker 1007*9880d681SAndroid Build Coastguard Workerdef sys_cr_op : Operand<i32> { 1008*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printSysCROperand"; 1009*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SysCRAsmOperand; 1010*9880d681SAndroid Build Coastguard Worker} 1011*9880d681SAndroid Build Coastguard Worker 1012*9880d681SAndroid Build Coastguard Workerclass SystemXtI<bit L, string asm> 1013*9880d681SAndroid Build Coastguard Worker : RtSystemI<L, (outs), 1014*9880d681SAndroid Build Coastguard Worker (ins imm0_7:$op1, sys_cr_op:$Cn, sys_cr_op:$Cm, imm0_7:$op2, GPR64:$Rt), 1015*9880d681SAndroid Build Coastguard Worker asm, "\t$op1, $Cn, $Cm, $op2, $Rt"> { 1016*9880d681SAndroid Build Coastguard Worker bits<3> op1; 1017*9880d681SAndroid Build Coastguard Worker bits<4> Cn; 1018*9880d681SAndroid Build Coastguard Worker bits<4> Cm; 1019*9880d681SAndroid Build Coastguard Worker bits<3> op2; 1020*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = 0b01; 1021*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = op1; 1022*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Cn; 1023*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = Cm; 1024*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = op2; 1025*9880d681SAndroid Build Coastguard Worker} 1026*9880d681SAndroid Build Coastguard Worker 1027*9880d681SAndroid Build Coastguard Workerclass SystemLXtI<bit L, string asm> 1028*9880d681SAndroid Build Coastguard Worker : RtSystemI<L, (outs), 1029*9880d681SAndroid Build Coastguard Worker (ins GPR64:$Rt, imm0_7:$op1, sys_cr_op:$Cn, sys_cr_op:$Cm, imm0_7:$op2), 1030*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, $op1, $Cn, $Cm, $op2"> { 1031*9880d681SAndroid Build Coastguard Worker bits<3> op1; 1032*9880d681SAndroid Build Coastguard Worker bits<4> Cn; 1033*9880d681SAndroid Build Coastguard Worker bits<4> Cm; 1034*9880d681SAndroid Build Coastguard Worker bits<3> op2; 1035*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = 0b01; 1036*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = op1; 1037*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Cn; 1038*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = Cm; 1039*9880d681SAndroid Build Coastguard Worker let Inst{7-5} = op2; 1040*9880d681SAndroid Build Coastguard Worker} 1041*9880d681SAndroid Build Coastguard Worker 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker// Branch (register) instructions: 1044*9880d681SAndroid Build Coastguard Worker// 1045*9880d681SAndroid Build Coastguard Worker// case opc of 1046*9880d681SAndroid Build Coastguard Worker// 0001 blr 1047*9880d681SAndroid Build Coastguard Worker// 0000 br 1048*9880d681SAndroid Build Coastguard Worker// 0101 dret 1049*9880d681SAndroid Build Coastguard Worker// 0100 eret 1050*9880d681SAndroid Build Coastguard Worker// 0010 ret 1051*9880d681SAndroid Build Coastguard Worker// otherwise UNDEFINED 1052*9880d681SAndroid Build Coastguard Workerclass BaseBranchReg<bits<4> opc, dag oops, dag iops, string asm, 1053*9880d681SAndroid Build Coastguard Worker string operands, list<dag> pattern> 1054*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, "", pattern>, Sched<[WriteBrReg]> { 1055*9880d681SAndroid Build Coastguard Worker let Inst{31-25} = 0b1101011; 1056*9880d681SAndroid Build Coastguard Worker let Inst{24-21} = opc; 1057*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b11111; 1058*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000000; 1059*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = 0b00000; 1060*9880d681SAndroid Build Coastguard Worker} 1061*9880d681SAndroid Build Coastguard Worker 1062*9880d681SAndroid Build Coastguard Workerclass BranchReg<bits<4> opc, string asm, list<dag> pattern> 1063*9880d681SAndroid Build Coastguard Worker : BaseBranchReg<opc, (outs), (ins GPR64:$Rn), asm, "\t$Rn", pattern> { 1064*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1065*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1066*9880d681SAndroid Build Coastguard Worker} 1067*9880d681SAndroid Build Coastguard Worker 1068*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1, isReturn = 1 in 1069*9880d681SAndroid Build Coastguard Workerclass SpecialReturn<bits<4> opc, string asm> 1070*9880d681SAndroid Build Coastguard Worker : BaseBranchReg<opc, (outs), (ins), asm, "", []> { 1071*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = 0b11111; 1072*9880d681SAndroid Build Coastguard Worker} 1073*9880d681SAndroid Build Coastguard Worker 1074*9880d681SAndroid Build Coastguard Worker//--- 1075*9880d681SAndroid Build Coastguard Worker// Conditional branch instruction. 1076*9880d681SAndroid Build Coastguard Worker//--- 1077*9880d681SAndroid Build Coastguard Worker 1078*9880d681SAndroid Build Coastguard Worker// Condition code. 1079*9880d681SAndroid Build Coastguard Worker// 4-bit immediate. Pretty-printed as <cc> 1080*9880d681SAndroid Build Coastguard Workerdef ccode : Operand<i32> { 1081*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printCondCode"; 1082*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = CondCode; 1083*9880d681SAndroid Build Coastguard Worker} 1084*9880d681SAndroid Build Coastguard Workerdef inv_ccode : Operand<i32> { 1085*9880d681SAndroid Build Coastguard Worker // AL and NV are invalid in the aliases which use inv_ccode 1086*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printInverseCondCode"; 1087*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = CondCode; 1088*9880d681SAndroid Build Coastguard Worker let MCOperandPredicate = [{ 1089*9880d681SAndroid Build Coastguard Worker return MCOp.isImm() && 1090*9880d681SAndroid Build Coastguard Worker MCOp.getImm() != AArch64CC::AL && 1091*9880d681SAndroid Build Coastguard Worker MCOp.getImm() != AArch64CC::NV; 1092*9880d681SAndroid Build Coastguard Worker }]; 1093*9880d681SAndroid Build Coastguard Worker} 1094*9880d681SAndroid Build Coastguard Worker 1095*9880d681SAndroid Build Coastguard Worker// Conditional branch target. 19-bit immediate. The low two bits of the target 1096*9880d681SAndroid Build Coastguard Worker// offset are implied zero and so are not part of the immediate. 1097*9880d681SAndroid Build Coastguard Workerdef PCRelLabel19Operand : AsmOperandClass { 1098*9880d681SAndroid Build Coastguard Worker let Name = "PCRelLabel19"; 1099*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidLabel"; 1100*9880d681SAndroid Build Coastguard Worker} 1101*9880d681SAndroid Build Coastguard Workerdef am_brcond : Operand<OtherVT> { 1102*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getCondBranchTargetOpValue"; 1103*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePCRelLabel19"; 1104*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAlignedLabel"; 1105*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PCRelLabel19Operand; 1106*9880d681SAndroid Build Coastguard Worker} 1107*9880d681SAndroid Build Coastguard Worker 1108*9880d681SAndroid Build Coastguard Workerclass BranchCond : I<(outs), (ins ccode:$cond, am_brcond:$target), 1109*9880d681SAndroid Build Coastguard Worker "b", ".$cond\t$target", "", 1110*9880d681SAndroid Build Coastguard Worker [(AArch64brcond bb:$target, imm:$cond, NZCV)]>, 1111*9880d681SAndroid Build Coastguard Worker Sched<[WriteBr]> { 1112*9880d681SAndroid Build Coastguard Worker let isBranch = 1; 1113*9880d681SAndroid Build Coastguard Worker let isTerminator = 1; 1114*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 1115*9880d681SAndroid Build Coastguard Worker 1116*9880d681SAndroid Build Coastguard Worker bits<4> cond; 1117*9880d681SAndroid Build Coastguard Worker bits<19> target; 1118*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b01010100; 1119*9880d681SAndroid Build Coastguard Worker let Inst{23-5} = target; 1120*9880d681SAndroid Build Coastguard Worker let Inst{4} = 0; 1121*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = cond; 1122*9880d681SAndroid Build Coastguard Worker} 1123*9880d681SAndroid Build Coastguard Worker 1124*9880d681SAndroid Build Coastguard Worker//--- 1125*9880d681SAndroid Build Coastguard Worker// Compare-and-branch instructions. 1126*9880d681SAndroid Build Coastguard Worker//--- 1127*9880d681SAndroid Build Coastguard Workerclass BaseCmpBranch<RegisterClass regtype, bit op, string asm, SDNode node> 1128*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rt, am_brcond:$target), 1129*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, $target", "", 1130*9880d681SAndroid Build Coastguard Worker [(node regtype:$Rt, bb:$target)]>, 1131*9880d681SAndroid Build Coastguard Worker Sched<[WriteBr]> { 1132*9880d681SAndroid Build Coastguard Worker let isBranch = 1; 1133*9880d681SAndroid Build Coastguard Worker let isTerminator = 1; 1134*9880d681SAndroid Build Coastguard Worker 1135*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1136*9880d681SAndroid Build Coastguard Worker bits<19> target; 1137*9880d681SAndroid Build Coastguard Worker let Inst{30-25} = 0b011010; 1138*9880d681SAndroid Build Coastguard Worker let Inst{24} = op; 1139*9880d681SAndroid Build Coastguard Worker let Inst{23-5} = target; 1140*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 1141*9880d681SAndroid Build Coastguard Worker} 1142*9880d681SAndroid Build Coastguard Worker 1143*9880d681SAndroid Build Coastguard Workermulticlass CmpBranch<bit op, string asm, SDNode node> { 1144*9880d681SAndroid Build Coastguard Worker def W : BaseCmpBranch<GPR32, op, asm, node> { 1145*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1146*9880d681SAndroid Build Coastguard Worker } 1147*9880d681SAndroid Build Coastguard Worker def X : BaseCmpBranch<GPR64, op, asm, node> { 1148*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1149*9880d681SAndroid Build Coastguard Worker } 1150*9880d681SAndroid Build Coastguard Worker} 1151*9880d681SAndroid Build Coastguard Worker 1152*9880d681SAndroid Build Coastguard Worker//--- 1153*9880d681SAndroid Build Coastguard Worker// Test-bit-and-branch instructions. 1154*9880d681SAndroid Build Coastguard Worker//--- 1155*9880d681SAndroid Build Coastguard Worker// Test-and-branch target. 14-bit sign-extended immediate. The low two bits of 1156*9880d681SAndroid Build Coastguard Worker// the target offset are implied zero and so are not part of the immediate. 1157*9880d681SAndroid Build Coastguard Workerdef BranchTarget14Operand : AsmOperandClass { 1158*9880d681SAndroid Build Coastguard Worker let Name = "BranchTarget14"; 1159*9880d681SAndroid Build Coastguard Worker} 1160*9880d681SAndroid Build Coastguard Workerdef am_tbrcond : Operand<OtherVT> { 1161*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getTestBranchTargetOpValue"; 1162*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAlignedLabel"; 1163*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = BranchTarget14Operand; 1164*9880d681SAndroid Build Coastguard Worker} 1165*9880d681SAndroid Build Coastguard Worker 1166*9880d681SAndroid Build Coastguard Worker// AsmOperand classes to emit (or not) special diagnostics 1167*9880d681SAndroid Build Coastguard Workerdef TBZImm0_31Operand : AsmOperandClass { 1168*9880d681SAndroid Build Coastguard Worker let Name = "TBZImm0_31"; 1169*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isImm0_31"; 1170*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImm0_31Operands"; 1171*9880d681SAndroid Build Coastguard Worker} 1172*9880d681SAndroid Build Coastguard Workerdef TBZImm32_63Operand : AsmOperandClass { 1173*9880d681SAndroid Build Coastguard Worker let Name = "Imm32_63"; 1174*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidImm0_63"; 1175*9880d681SAndroid Build Coastguard Worker} 1176*9880d681SAndroid Build Coastguard Worker 1177*9880d681SAndroid Build Coastguard Workerclass tbz_imm0_31<AsmOperandClass matcher> : Operand<i64>, ImmLeaf<i64, [{ 1178*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) < 32); 1179*9880d681SAndroid Build Coastguard Worker}]> { 1180*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = matcher; 1181*9880d681SAndroid Build Coastguard Worker} 1182*9880d681SAndroid Build Coastguard Worker 1183*9880d681SAndroid Build Coastguard Workerdef tbz_imm0_31_diag : tbz_imm0_31<Imm0_31Operand>; 1184*9880d681SAndroid Build Coastguard Workerdef tbz_imm0_31_nodiag : tbz_imm0_31<TBZImm0_31Operand>; 1185*9880d681SAndroid Build Coastguard Worker 1186*9880d681SAndroid Build Coastguard Workerdef tbz_imm32_63 : Operand<i64>, ImmLeaf<i64, [{ 1187*9880d681SAndroid Build Coastguard Worker return (((uint32_t)Imm) > 31) && (((uint32_t)Imm) < 64); 1188*9880d681SAndroid Build Coastguard Worker}]> { 1189*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = TBZImm32_63Operand; 1190*9880d681SAndroid Build Coastguard Worker} 1191*9880d681SAndroid Build Coastguard Worker 1192*9880d681SAndroid Build Coastguard Workerclass BaseTestBranch<RegisterClass regtype, Operand immtype, 1193*9880d681SAndroid Build Coastguard Worker bit op, string asm, SDNode node> 1194*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rt, immtype:$bit_off, am_tbrcond:$target), 1195*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, $bit_off, $target", "", 1196*9880d681SAndroid Build Coastguard Worker [(node regtype:$Rt, immtype:$bit_off, bb:$target)]>, 1197*9880d681SAndroid Build Coastguard Worker Sched<[WriteBr]> { 1198*9880d681SAndroid Build Coastguard Worker let isBranch = 1; 1199*9880d681SAndroid Build Coastguard Worker let isTerminator = 1; 1200*9880d681SAndroid Build Coastguard Worker 1201*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 1202*9880d681SAndroid Build Coastguard Worker bits<6> bit_off; 1203*9880d681SAndroid Build Coastguard Worker bits<14> target; 1204*9880d681SAndroid Build Coastguard Worker 1205*9880d681SAndroid Build Coastguard Worker let Inst{30-25} = 0b011011; 1206*9880d681SAndroid Build Coastguard Worker let Inst{24} = op; 1207*9880d681SAndroid Build Coastguard Worker let Inst{23-19} = bit_off{4-0}; 1208*9880d681SAndroid Build Coastguard Worker let Inst{18-5} = target; 1209*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 1210*9880d681SAndroid Build Coastguard Worker 1211*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeTestAndBranch"; 1212*9880d681SAndroid Build Coastguard Worker} 1213*9880d681SAndroid Build Coastguard Worker 1214*9880d681SAndroid Build Coastguard Workermulticlass TestBranch<bit op, string asm, SDNode node> { 1215*9880d681SAndroid Build Coastguard Worker def W : BaseTestBranch<GPR32, tbz_imm0_31_diag, op, asm, node> { 1216*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1217*9880d681SAndroid Build Coastguard Worker } 1218*9880d681SAndroid Build Coastguard Worker 1219*9880d681SAndroid Build Coastguard Worker def X : BaseTestBranch<GPR64, tbz_imm32_63, op, asm, node> { 1220*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1221*9880d681SAndroid Build Coastguard Worker } 1222*9880d681SAndroid Build Coastguard Worker 1223*9880d681SAndroid Build Coastguard Worker // Alias X-reg with 0-31 imm to W-Reg. 1224*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rd, $imm, $target", 1225*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"W") GPR32as64:$Rd, 1226*9880d681SAndroid Build Coastguard Worker tbz_imm0_31_nodiag:$imm, am_tbrcond:$target), 0>; 1227*9880d681SAndroid Build Coastguard Worker def : Pat<(node GPR64:$Rn, tbz_imm0_31_diag:$imm, bb:$target), 1228*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"W") (EXTRACT_SUBREG GPR64:$Rn, sub_32), 1229*9880d681SAndroid Build Coastguard Worker tbz_imm0_31_diag:$imm, bb:$target)>; 1230*9880d681SAndroid Build Coastguard Worker} 1231*9880d681SAndroid Build Coastguard Worker 1232*9880d681SAndroid Build Coastguard Worker//--- 1233*9880d681SAndroid Build Coastguard Worker// Unconditional branch (immediate) instructions. 1234*9880d681SAndroid Build Coastguard Worker//--- 1235*9880d681SAndroid Build Coastguard Workerdef BranchTarget26Operand : AsmOperandClass { 1236*9880d681SAndroid Build Coastguard Worker let Name = "BranchTarget26"; 1237*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidLabel"; 1238*9880d681SAndroid Build Coastguard Worker} 1239*9880d681SAndroid Build Coastguard Workerdef am_b_target : Operand<OtherVT> { 1240*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getBranchTargetOpValue"; 1241*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAlignedLabel"; 1242*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = BranchTarget26Operand; 1243*9880d681SAndroid Build Coastguard Worker} 1244*9880d681SAndroid Build Coastguard Workerdef am_bl_target : Operand<i64> { 1245*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getBranchTargetOpValue"; 1246*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAlignedLabel"; 1247*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = BranchTarget26Operand; 1248*9880d681SAndroid Build Coastguard Worker} 1249*9880d681SAndroid Build Coastguard Worker 1250*9880d681SAndroid Build Coastguard Workerclass BImm<bit op, dag iops, string asm, list<dag> pattern> 1251*9880d681SAndroid Build Coastguard Worker : I<(outs), iops, asm, "\t$addr", "", pattern>, Sched<[WriteBr]> { 1252*9880d681SAndroid Build Coastguard Worker bits<26> addr; 1253*9880d681SAndroid Build Coastguard Worker let Inst{31} = op; 1254*9880d681SAndroid Build Coastguard Worker let Inst{30-26} = 0b00101; 1255*9880d681SAndroid Build Coastguard Worker let Inst{25-0} = addr; 1256*9880d681SAndroid Build Coastguard Worker 1257*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeUnconditionalBranch"; 1258*9880d681SAndroid Build Coastguard Worker} 1259*9880d681SAndroid Build Coastguard Worker 1260*9880d681SAndroid Build Coastguard Workerclass BranchImm<bit op, string asm, list<dag> pattern> 1261*9880d681SAndroid Build Coastguard Worker : BImm<op, (ins am_b_target:$addr), asm, pattern>; 1262*9880d681SAndroid Build Coastguard Workerclass CallImm<bit op, string asm, list<dag> pattern> 1263*9880d681SAndroid Build Coastguard Worker : BImm<op, (ins am_bl_target:$addr), asm, pattern>; 1264*9880d681SAndroid Build Coastguard Worker 1265*9880d681SAndroid Build Coastguard Worker//--- 1266*9880d681SAndroid Build Coastguard Worker// Basic one-operand data processing instructions. 1267*9880d681SAndroid Build Coastguard Worker//--- 1268*9880d681SAndroid Build Coastguard Worker 1269*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1270*9880d681SAndroid Build Coastguard Workerclass BaseOneOperandData<bits<3> opc, RegisterClass regtype, string asm, 1271*9880d681SAndroid Build Coastguard Worker SDPatternOperator node> 1272*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, "\t$Rd, $Rn", "", 1273*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (node regtype:$Rn))]>, 1274*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI]> { 1275*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1276*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1277*9880d681SAndroid Build Coastguard Worker 1278*9880d681SAndroid Build Coastguard Worker let Inst{30-13} = 0b101101011000000000; 1279*9880d681SAndroid Build Coastguard Worker let Inst{12-10} = opc; 1280*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1281*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1282*9880d681SAndroid Build Coastguard Worker} 1283*9880d681SAndroid Build Coastguard Worker 1284*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1285*9880d681SAndroid Build Coastguard Workermulticlass OneOperandData<bits<3> opc, string asm, 1286*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 1287*9880d681SAndroid Build Coastguard Worker def Wr : BaseOneOperandData<opc, GPR32, asm, node> { 1288*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1289*9880d681SAndroid Build Coastguard Worker } 1290*9880d681SAndroid Build Coastguard Worker 1291*9880d681SAndroid Build Coastguard Worker def Xr : BaseOneOperandData<opc, GPR64, asm, node> { 1292*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1293*9880d681SAndroid Build Coastguard Worker } 1294*9880d681SAndroid Build Coastguard Worker} 1295*9880d681SAndroid Build Coastguard Worker 1296*9880d681SAndroid Build Coastguard Workerclass OneWRegData<bits<3> opc, string asm, SDPatternOperator node> 1297*9880d681SAndroid Build Coastguard Worker : BaseOneOperandData<opc, GPR32, asm, node> { 1298*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1299*9880d681SAndroid Build Coastguard Worker} 1300*9880d681SAndroid Build Coastguard Worker 1301*9880d681SAndroid Build Coastguard Workerclass OneXRegData<bits<3> opc, string asm, SDPatternOperator node> 1302*9880d681SAndroid Build Coastguard Worker : BaseOneOperandData<opc, GPR64, asm, node> { 1303*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1304*9880d681SAndroid Build Coastguard Worker} 1305*9880d681SAndroid Build Coastguard Worker 1306*9880d681SAndroid Build Coastguard Worker//--- 1307*9880d681SAndroid Build Coastguard Worker// Basic two-operand data processing instructions. 1308*9880d681SAndroid Build Coastguard Worker//--- 1309*9880d681SAndroid Build Coastguard Workerclass BaseBaseAddSubCarry<bit isSub, RegisterClass regtype, string asm, 1310*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1311*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), 1312*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", pattern>, 1313*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]> { 1314*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 1315*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1316*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1317*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1318*9880d681SAndroid Build Coastguard Worker let Inst{30} = isSub; 1319*9880d681SAndroid Build Coastguard Worker let Inst{28-21} = 0b11010000; 1320*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1321*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0; 1322*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1323*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1324*9880d681SAndroid Build Coastguard Worker} 1325*9880d681SAndroid Build Coastguard Worker 1326*9880d681SAndroid Build Coastguard Workerclass BaseAddSubCarry<bit isSub, RegisterClass regtype, string asm, 1327*9880d681SAndroid Build Coastguard Worker SDNode OpNode> 1328*9880d681SAndroid Build Coastguard Worker : BaseBaseAddSubCarry<isSub, regtype, asm, 1329*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, NZCV))]>; 1330*9880d681SAndroid Build Coastguard Worker 1331*9880d681SAndroid Build Coastguard Workerclass BaseAddSubCarrySetFlags<bit isSub, RegisterClass regtype, string asm, 1332*9880d681SAndroid Build Coastguard Worker SDNode OpNode> 1333*9880d681SAndroid Build Coastguard Worker : BaseBaseAddSubCarry<isSub, regtype, asm, 1334*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, NZCV)), 1335*9880d681SAndroid Build Coastguard Worker (implicit NZCV)]> { 1336*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV]; 1337*9880d681SAndroid Build Coastguard Worker} 1338*9880d681SAndroid Build Coastguard Worker 1339*9880d681SAndroid Build Coastguard Workermulticlass AddSubCarry<bit isSub, string asm, string asm_setflags, 1340*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNode_setflags> { 1341*9880d681SAndroid Build Coastguard Worker def Wr : BaseAddSubCarry<isSub, GPR32, asm, OpNode> { 1342*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1343*9880d681SAndroid Build Coastguard Worker let Inst{29} = 0; 1344*9880d681SAndroid Build Coastguard Worker } 1345*9880d681SAndroid Build Coastguard Worker def Xr : BaseAddSubCarry<isSub, GPR64, asm, OpNode> { 1346*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1347*9880d681SAndroid Build Coastguard Worker let Inst{29} = 0; 1348*9880d681SAndroid Build Coastguard Worker } 1349*9880d681SAndroid Build Coastguard Worker 1350*9880d681SAndroid Build Coastguard Worker // Sets flags. 1351*9880d681SAndroid Build Coastguard Worker def SWr : BaseAddSubCarrySetFlags<isSub, GPR32, asm_setflags, 1352*9880d681SAndroid Build Coastguard Worker OpNode_setflags> { 1353*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1354*9880d681SAndroid Build Coastguard Worker let Inst{29} = 1; 1355*9880d681SAndroid Build Coastguard Worker } 1356*9880d681SAndroid Build Coastguard Worker def SXr : BaseAddSubCarrySetFlags<isSub, GPR64, asm_setflags, 1357*9880d681SAndroid Build Coastguard Worker OpNode_setflags> { 1358*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1359*9880d681SAndroid Build Coastguard Worker let Inst{29} = 1; 1360*9880d681SAndroid Build Coastguard Worker } 1361*9880d681SAndroid Build Coastguard Worker} 1362*9880d681SAndroid Build Coastguard Worker 1363*9880d681SAndroid Build Coastguard Workerclass BaseTwoOperand<bits<4> opc, RegisterClass regtype, string asm, 1364*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> 1365*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), 1366*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", 1367*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm))]> { 1368*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1369*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1370*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1371*9880d681SAndroid Build Coastguard Worker let Inst{30-21} = 0b0011010110; 1372*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1373*9880d681SAndroid Build Coastguard Worker let Inst{15-14} = 0b00; 1374*9880d681SAndroid Build Coastguard Worker let Inst{13-10} = opc; 1375*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1376*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1377*9880d681SAndroid Build Coastguard Worker} 1378*9880d681SAndroid Build Coastguard Worker 1379*9880d681SAndroid Build Coastguard Workerclass BaseDiv<bit isSigned, RegisterClass regtype, string asm, 1380*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> 1381*9880d681SAndroid Build Coastguard Worker : BaseTwoOperand<{0,0,1,?}, regtype, asm, OpNode> { 1382*9880d681SAndroid Build Coastguard Worker let Inst{10} = isSigned; 1383*9880d681SAndroid Build Coastguard Worker} 1384*9880d681SAndroid Build Coastguard Worker 1385*9880d681SAndroid Build Coastguard Workermulticlass Div<bit isSigned, string asm, SDPatternOperator OpNode> { 1386*9880d681SAndroid Build Coastguard Worker def Wr : BaseDiv<isSigned, GPR32, asm, OpNode>, 1387*9880d681SAndroid Build Coastguard Worker Sched<[WriteID32, ReadID, ReadID]> { 1388*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1389*9880d681SAndroid Build Coastguard Worker } 1390*9880d681SAndroid Build Coastguard Worker def Xr : BaseDiv<isSigned, GPR64, asm, OpNode>, 1391*9880d681SAndroid Build Coastguard Worker Sched<[WriteID64, ReadID, ReadID]> { 1392*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1393*9880d681SAndroid Build Coastguard Worker } 1394*9880d681SAndroid Build Coastguard Worker} 1395*9880d681SAndroid Build Coastguard Worker 1396*9880d681SAndroid Build Coastguard Workerclass BaseShift<bits<2> shift_type, RegisterClass regtype, string asm, 1397*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> 1398*9880d681SAndroid Build Coastguard Worker : BaseTwoOperand<{1,0,?,?}, regtype, asm, OpNode>, 1399*9880d681SAndroid Build Coastguard Worker Sched<[WriteIS, ReadI]> { 1400*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = shift_type; 1401*9880d681SAndroid Build Coastguard Worker} 1402*9880d681SAndroid Build Coastguard Worker 1403*9880d681SAndroid Build Coastguard Workermulticlass Shift<bits<2> shift_type, string asm, SDNode OpNode> { 1404*9880d681SAndroid Build Coastguard Worker def Wr : BaseShift<shift_type, GPR32, asm> { 1405*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1406*9880d681SAndroid Build Coastguard Worker } 1407*9880d681SAndroid Build Coastguard Worker 1408*9880d681SAndroid Build Coastguard Worker def Xr : BaseShift<shift_type, GPR64, asm, OpNode> { 1409*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1410*9880d681SAndroid Build Coastguard Worker } 1411*9880d681SAndroid Build Coastguard Worker 1412*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (OpNode GPR32:$Rn, i64:$Rm)), 1413*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wr") GPR32:$Rn, 1414*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG i64:$Rm, sub_32))>; 1415*9880d681SAndroid Build Coastguard Worker 1416*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (OpNode GPR32:$Rn, (i64 (zext GPR32:$Rm)))), 1417*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wr") GPR32:$Rn, GPR32:$Rm)>; 1418*9880d681SAndroid Build Coastguard Worker 1419*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (OpNode GPR32:$Rn, (i64 (anyext GPR32:$Rm)))), 1420*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wr") GPR32:$Rn, GPR32:$Rm)>; 1421*9880d681SAndroid Build Coastguard Worker 1422*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (OpNode GPR32:$Rn, (i64 (sext GPR32:$Rm)))), 1423*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wr") GPR32:$Rn, GPR32:$Rm)>; 1424*9880d681SAndroid Build Coastguard Worker} 1425*9880d681SAndroid Build Coastguard Worker 1426*9880d681SAndroid Build Coastguard Workerclass ShiftAlias<string asm, Instruction inst, RegisterClass regtype> 1427*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 1428*9880d681SAndroid Build Coastguard Worker (inst regtype:$dst, regtype:$src1, regtype:$src2), 0>; 1429*9880d681SAndroid Build Coastguard Worker 1430*9880d681SAndroid Build Coastguard Workerclass BaseMulAccum<bit isSub, bits<3> opc, RegisterClass multype, 1431*9880d681SAndroid Build Coastguard Worker RegisterClass addtype, string asm, 1432*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1433*9880d681SAndroid Build Coastguard Worker : I<(outs addtype:$Rd), (ins multype:$Rn, multype:$Rm, addtype:$Ra), 1434*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $Ra", "", pattern> { 1435*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1436*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1437*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1438*9880d681SAndroid Build Coastguard Worker bits<5> Ra; 1439*9880d681SAndroid Build Coastguard Worker let Inst{30-24} = 0b0011011; 1440*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = opc; 1441*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1442*9880d681SAndroid Build Coastguard Worker let Inst{15} = isSub; 1443*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Ra; 1444*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1445*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1446*9880d681SAndroid Build Coastguard Worker} 1447*9880d681SAndroid Build Coastguard Worker 1448*9880d681SAndroid Build Coastguard Workermulticlass MulAccum<bit isSub, string asm, SDNode AccNode> { 1449*9880d681SAndroid Build Coastguard Worker // MADD/MSUB generation is decided by MachineCombiner.cpp 1450*9880d681SAndroid Build Coastguard Worker def Wrrr : BaseMulAccum<isSub, 0b000, GPR32, GPR32, asm, 1451*9880d681SAndroid Build Coastguard Worker [/*(set GPR32:$Rd, (AccNode GPR32:$Ra, (mul GPR32:$Rn, GPR32:$Rm)))*/]>, 1452*9880d681SAndroid Build Coastguard Worker Sched<[WriteIM32, ReadIM, ReadIM, ReadIMA]> { 1453*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1454*9880d681SAndroid Build Coastguard Worker } 1455*9880d681SAndroid Build Coastguard Worker 1456*9880d681SAndroid Build Coastguard Worker def Xrrr : BaseMulAccum<isSub, 0b000, GPR64, GPR64, asm, 1457*9880d681SAndroid Build Coastguard Worker [/*(set GPR64:$Rd, (AccNode GPR64:$Ra, (mul GPR64:$Rn, GPR64:$Rm)))*/]>, 1458*9880d681SAndroid Build Coastguard Worker Sched<[WriteIM64, ReadIM, ReadIM, ReadIMA]> { 1459*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1460*9880d681SAndroid Build Coastguard Worker } 1461*9880d681SAndroid Build Coastguard Worker} 1462*9880d681SAndroid Build Coastguard Worker 1463*9880d681SAndroid Build Coastguard Workerclass WideMulAccum<bit isSub, bits<3> opc, string asm, 1464*9880d681SAndroid Build Coastguard Worker SDNode AccNode, SDNode ExtNode> 1465*9880d681SAndroid Build Coastguard Worker : BaseMulAccum<isSub, opc, GPR32, GPR64, asm, 1466*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (AccNode GPR64:$Ra, 1467*9880d681SAndroid Build Coastguard Worker (mul (ExtNode GPR32:$Rn), (ExtNode GPR32:$Rm))))]>, 1468*9880d681SAndroid Build Coastguard Worker Sched<[WriteIM32, ReadIM, ReadIM, ReadIMA]> { 1469*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1470*9880d681SAndroid Build Coastguard Worker} 1471*9880d681SAndroid Build Coastguard Worker 1472*9880d681SAndroid Build Coastguard Workerclass MulHi<bits<3> opc, string asm, SDNode OpNode> 1473*9880d681SAndroid Build Coastguard Worker : I<(outs GPR64:$Rd), (ins GPR64:$Rn, GPR64:$Rm), 1474*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", 1475*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpNode GPR64:$Rn, GPR64:$Rm))]>, 1476*9880d681SAndroid Build Coastguard Worker Sched<[WriteIM64, ReadIM, ReadIM]> { 1477*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1478*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1479*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1480*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b10011011; 1481*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = opc; 1482*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1483*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 1484*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1485*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1486*9880d681SAndroid Build Coastguard Worker 1487*9880d681SAndroid Build Coastguard Worker // The Ra field of SMULH and UMULH is unused: it should be assembled as 31 1488*9880d681SAndroid Build Coastguard Worker // (i.e. all bits 1) but is ignored by the processor. 1489*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "fixMulHigh"; 1490*9880d681SAndroid Build Coastguard Worker} 1491*9880d681SAndroid Build Coastguard Worker 1492*9880d681SAndroid Build Coastguard Workerclass MulAccumWAlias<string asm, Instruction inst> 1493*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 1494*9880d681SAndroid Build Coastguard Worker (inst GPR32:$dst, GPR32:$src1, GPR32:$src2, WZR)>; 1495*9880d681SAndroid Build Coastguard Workerclass MulAccumXAlias<string asm, Instruction inst> 1496*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 1497*9880d681SAndroid Build Coastguard Worker (inst GPR64:$dst, GPR64:$src1, GPR64:$src2, XZR)>; 1498*9880d681SAndroid Build Coastguard Workerclass WideMulAccumAlias<string asm, Instruction inst> 1499*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 1500*9880d681SAndroid Build Coastguard Worker (inst GPR64:$dst, GPR32:$src1, GPR32:$src2, XZR)>; 1501*9880d681SAndroid Build Coastguard Worker 1502*9880d681SAndroid Build Coastguard Workerclass BaseCRC32<bit sf, bits<2> sz, bit C, RegisterClass StreamReg, 1503*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, string asm> 1504*9880d681SAndroid Build Coastguard Worker : I<(outs GPR32:$Rd), (ins GPR32:$Rn, StreamReg:$Rm), 1505*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", 1506*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpNode GPR32:$Rn, StreamReg:$Rm))]>, 1507*9880d681SAndroid Build Coastguard Worker Sched<[WriteISReg, ReadI, ReadISReg]> { 1508*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1509*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1510*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1511*9880d681SAndroid Build Coastguard Worker 1512*9880d681SAndroid Build Coastguard Worker let Inst{31} = sf; 1513*9880d681SAndroid Build Coastguard Worker let Inst{30-21} = 0b0011010110; 1514*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1515*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = 0b010; 1516*9880d681SAndroid Build Coastguard Worker let Inst{12} = C; 1517*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = sz; 1518*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1519*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1520*9880d681SAndroid Build Coastguard Worker let Predicates = [HasCRC]; 1521*9880d681SAndroid Build Coastguard Worker} 1522*9880d681SAndroid Build Coastguard Worker 1523*9880d681SAndroid Build Coastguard Worker//--- 1524*9880d681SAndroid Build Coastguard Worker// Address generation. 1525*9880d681SAndroid Build Coastguard Worker//--- 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Workerclass ADRI<bit page, string asm, Operand adr, list<dag> pattern> 1528*9880d681SAndroid Build Coastguard Worker : I<(outs GPR64:$Xd), (ins adr:$label), asm, "\t$Xd, $label", "", 1529*9880d681SAndroid Build Coastguard Worker pattern>, 1530*9880d681SAndroid Build Coastguard Worker Sched<[WriteI]> { 1531*9880d681SAndroid Build Coastguard Worker bits<5> Xd; 1532*9880d681SAndroid Build Coastguard Worker bits<21> label; 1533*9880d681SAndroid Build Coastguard Worker let Inst{31} = page; 1534*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = label{1-0}; 1535*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b10000; 1536*9880d681SAndroid Build Coastguard Worker let Inst{23-5} = label{20-2}; 1537*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Xd; 1538*9880d681SAndroid Build Coastguard Worker 1539*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeAdrInstruction"; 1540*9880d681SAndroid Build Coastguard Worker} 1541*9880d681SAndroid Build Coastguard Worker 1542*9880d681SAndroid Build Coastguard Worker//--- 1543*9880d681SAndroid Build Coastguard Worker// Move immediate. 1544*9880d681SAndroid Build Coastguard Worker//--- 1545*9880d681SAndroid Build Coastguard Worker 1546*9880d681SAndroid Build Coastguard Workerdef movimm32_imm : Operand<i32> { 1547*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = Imm0_65535Operand; 1548*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getMoveWideImmOpValue"; 1549*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printImm"; 1550*9880d681SAndroid Build Coastguard Worker} 1551*9880d681SAndroid Build Coastguard Workerdef movimm32_shift : Operand<i32> { 1552*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 1553*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovImm32ShifterOperand; 1554*9880d681SAndroid Build Coastguard Worker} 1555*9880d681SAndroid Build Coastguard Workerdef movimm64_shift : Operand<i32> { 1556*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printShifter"; 1557*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MovImm64ShifterOperand; 1558*9880d681SAndroid Build Coastguard Worker} 1559*9880d681SAndroid Build Coastguard Worker 1560*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1561*9880d681SAndroid Build Coastguard Workerclass BaseMoveImmediate<bits<2> opc, RegisterClass regtype, Operand shifter, 1562*9880d681SAndroid Build Coastguard Worker string asm> 1563*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins movimm32_imm:$imm, shifter:$shift), 1564*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $imm$shift", "", []>, 1565*9880d681SAndroid Build Coastguard Worker Sched<[WriteImm]> { 1566*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1567*9880d681SAndroid Build Coastguard Worker bits<16> imm; 1568*9880d681SAndroid Build Coastguard Worker bits<6> shift; 1569*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 1570*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b100101; 1571*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = shift{5-4}; 1572*9880d681SAndroid Build Coastguard Worker let Inst{20-5} = imm; 1573*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1574*9880d681SAndroid Build Coastguard Worker 1575*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeMoveImmInstruction"; 1576*9880d681SAndroid Build Coastguard Worker} 1577*9880d681SAndroid Build Coastguard Worker 1578*9880d681SAndroid Build Coastguard Workermulticlass MoveImmediate<bits<2> opc, string asm> { 1579*9880d681SAndroid Build Coastguard Worker def Wi : BaseMoveImmediate<opc, GPR32, movimm32_shift, asm> { 1580*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1581*9880d681SAndroid Build Coastguard Worker } 1582*9880d681SAndroid Build Coastguard Worker 1583*9880d681SAndroid Build Coastguard Worker def Xi : BaseMoveImmediate<opc, GPR64, movimm64_shift, asm> { 1584*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1585*9880d681SAndroid Build Coastguard Worker } 1586*9880d681SAndroid Build Coastguard Worker} 1587*9880d681SAndroid Build Coastguard Worker 1588*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1589*9880d681SAndroid Build Coastguard Workerclass BaseInsertImmediate<bits<2> opc, RegisterClass regtype, Operand shifter, 1590*9880d681SAndroid Build Coastguard Worker string asm> 1591*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), 1592*9880d681SAndroid Build Coastguard Worker (ins regtype:$src, movimm32_imm:$imm, shifter:$shift), 1593*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $imm$shift", "$src = $Rd", []>, 1594*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI]> { 1595*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1596*9880d681SAndroid Build Coastguard Worker bits<16> imm; 1597*9880d681SAndroid Build Coastguard Worker bits<6> shift; 1598*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 1599*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b100101; 1600*9880d681SAndroid Build Coastguard Worker let Inst{22-21} = shift{5-4}; 1601*9880d681SAndroid Build Coastguard Worker let Inst{20-5} = imm; 1602*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1603*9880d681SAndroid Build Coastguard Worker 1604*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeMoveImmInstruction"; 1605*9880d681SAndroid Build Coastguard Worker} 1606*9880d681SAndroid Build Coastguard Worker 1607*9880d681SAndroid Build Coastguard Workermulticlass InsertImmediate<bits<2> opc, string asm> { 1608*9880d681SAndroid Build Coastguard Worker def Wi : BaseInsertImmediate<opc, GPR32, movimm32_shift, asm> { 1609*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1610*9880d681SAndroid Build Coastguard Worker } 1611*9880d681SAndroid Build Coastguard Worker 1612*9880d681SAndroid Build Coastguard Worker def Xi : BaseInsertImmediate<opc, GPR64, movimm64_shift, asm> { 1613*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1614*9880d681SAndroid Build Coastguard Worker } 1615*9880d681SAndroid Build Coastguard Worker} 1616*9880d681SAndroid Build Coastguard Worker 1617*9880d681SAndroid Build Coastguard Worker//--- 1618*9880d681SAndroid Build Coastguard Worker// Add/Subtract 1619*9880d681SAndroid Build Coastguard Worker//--- 1620*9880d681SAndroid Build Coastguard Worker 1621*9880d681SAndroid Build Coastguard Workerclass BaseAddSubImm<bit isSub, bit setFlags, RegisterClass dstRegtype, 1622*9880d681SAndroid Build Coastguard Worker RegisterClass srcRegtype, addsub_shifted_imm immtype, 1623*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator OpNode> 1624*9880d681SAndroid Build Coastguard Worker : I<(outs dstRegtype:$Rd), (ins srcRegtype:$Rn, immtype:$imm), 1625*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $imm", "", 1626*9880d681SAndroid Build Coastguard Worker [(set dstRegtype:$Rd, (OpNode srcRegtype:$Rn, immtype:$imm))]>, 1627*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI]> { 1628*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1629*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1630*9880d681SAndroid Build Coastguard Worker bits<14> imm; 1631*9880d681SAndroid Build Coastguard Worker let Inst{30} = isSub; 1632*9880d681SAndroid Build Coastguard Worker let Inst{29} = setFlags; 1633*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b10001; 1634*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = imm{13-12}; // '00' => lsl #0, '01' => lsl #12 1635*9880d681SAndroid Build Coastguard Worker let Inst{21-10} = imm{11-0}; 1636*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1637*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1638*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeBaseAddSubImm"; 1639*9880d681SAndroid Build Coastguard Worker} 1640*9880d681SAndroid Build Coastguard Worker 1641*9880d681SAndroid Build Coastguard Workerclass BaseAddSubRegPseudo<RegisterClass regtype, 1642*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> 1643*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), 1644*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm))]>, 1645*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]>; 1646*9880d681SAndroid Build Coastguard Worker 1647*9880d681SAndroid Build Coastguard Workerclass BaseAddSubSReg<bit isSub, bit setFlags, RegisterClass regtype, 1648*9880d681SAndroid Build Coastguard Worker arith_shifted_reg shifted_regtype, string asm, 1649*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> 1650*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, shifted_regtype:$Rm), 1651*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", 1652*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, shifted_regtype:$Rm))]>, 1653*9880d681SAndroid Build Coastguard Worker Sched<[WriteISReg, ReadI, ReadISReg]> { 1654*9880d681SAndroid Build Coastguard Worker // The operands are in order to match the 'addr' MI operands, so we 1655*9880d681SAndroid Build Coastguard Worker // don't need an encoder method and by-name matching. Just use the default 1656*9880d681SAndroid Build Coastguard Worker // in-order handling. Since we're using by-order, make sure the names 1657*9880d681SAndroid Build Coastguard Worker // do not match. 1658*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1659*9880d681SAndroid Build Coastguard Worker bits<5> src1; 1660*9880d681SAndroid Build Coastguard Worker bits<5> src2; 1661*9880d681SAndroid Build Coastguard Worker bits<8> shift; 1662*9880d681SAndroid Build Coastguard Worker let Inst{30} = isSub; 1663*9880d681SAndroid Build Coastguard Worker let Inst{29} = setFlags; 1664*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01011; 1665*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = shift{7-6}; 1666*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 1667*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 1668*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = shift{5-0}; 1669*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = src1; 1670*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 1671*9880d681SAndroid Build Coastguard Worker 1672*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeThreeAddrSRegInstruction"; 1673*9880d681SAndroid Build Coastguard Worker} 1674*9880d681SAndroid Build Coastguard Worker 1675*9880d681SAndroid Build Coastguard Workerclass BaseAddSubEReg<bit isSub, bit setFlags, RegisterClass dstRegtype, 1676*9880d681SAndroid Build Coastguard Worker RegisterClass src1Regtype, Operand src2Regtype, 1677*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator OpNode> 1678*9880d681SAndroid Build Coastguard Worker : I<(outs dstRegtype:$R1), 1679*9880d681SAndroid Build Coastguard Worker (ins src1Regtype:$R2, src2Regtype:$R3), 1680*9880d681SAndroid Build Coastguard Worker asm, "\t$R1, $R2, $R3", "", 1681*9880d681SAndroid Build Coastguard Worker [(set dstRegtype:$R1, (OpNode src1Regtype:$R2, src2Regtype:$R3))]>, 1682*9880d681SAndroid Build Coastguard Worker Sched<[WriteIEReg, ReadI, ReadIEReg]> { 1683*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1684*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1685*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1686*9880d681SAndroid Build Coastguard Worker bits<6> ext; 1687*9880d681SAndroid Build Coastguard Worker let Inst{30} = isSub; 1688*9880d681SAndroid Build Coastguard Worker let Inst{29} = setFlags; 1689*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01011; 1690*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = 0b001; 1691*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1692*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = ext{5-3}; 1693*9880d681SAndroid Build Coastguard Worker let Inst{12-10} = ext{2-0}; 1694*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1695*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1696*9880d681SAndroid Build Coastguard Worker 1697*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeAddSubERegInstruction"; 1698*9880d681SAndroid Build Coastguard Worker} 1699*9880d681SAndroid Build Coastguard Worker 1700*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1701*9880d681SAndroid Build Coastguard Workerclass BaseAddSubEReg64<bit isSub, bit setFlags, RegisterClass dstRegtype, 1702*9880d681SAndroid Build Coastguard Worker RegisterClass src1Regtype, RegisterClass src2Regtype, 1703*9880d681SAndroid Build Coastguard Worker Operand ext_op, string asm> 1704*9880d681SAndroid Build Coastguard Worker : I<(outs dstRegtype:$Rd), 1705*9880d681SAndroid Build Coastguard Worker (ins src1Regtype:$Rn, src2Regtype:$Rm, ext_op:$ext), 1706*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm$ext", "", []>, 1707*9880d681SAndroid Build Coastguard Worker Sched<[WriteIEReg, ReadI, ReadIEReg]> { 1708*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1709*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1710*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1711*9880d681SAndroid Build Coastguard Worker bits<6> ext; 1712*9880d681SAndroid Build Coastguard Worker let Inst{30} = isSub; 1713*9880d681SAndroid Build Coastguard Worker let Inst{29} = setFlags; 1714*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01011; 1715*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = 0b001; 1716*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1717*9880d681SAndroid Build Coastguard Worker let Inst{15} = ext{5}; 1718*9880d681SAndroid Build Coastguard Worker let Inst{12-10} = ext{2-0}; 1719*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1720*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1721*9880d681SAndroid Build Coastguard Worker 1722*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeAddSubERegInstruction"; 1723*9880d681SAndroid Build Coastguard Worker} 1724*9880d681SAndroid Build Coastguard Worker 1725*9880d681SAndroid Build Coastguard Worker// Aliases for register+register add/subtract. 1726*9880d681SAndroid Build Coastguard Workerclass AddSubRegAlias<string asm, Instruction inst, RegisterClass dstRegtype, 1727*9880d681SAndroid Build Coastguard Worker RegisterClass src1Regtype, RegisterClass src2Regtype, 1728*9880d681SAndroid Build Coastguard Worker int shiftExt> 1729*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 1730*9880d681SAndroid Build Coastguard Worker (inst dstRegtype:$dst, src1Regtype:$src1, src2Regtype:$src2, 1731*9880d681SAndroid Build Coastguard Worker shiftExt)>; 1732*9880d681SAndroid Build Coastguard Worker 1733*9880d681SAndroid Build Coastguard Workermulticlass AddSub<bit isSub, string mnemonic, string alias, 1734*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 1735*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, isReMaterializable = 1, isAsCheapAsAMove = 1 in { 1736*9880d681SAndroid Build Coastguard Worker // Add/Subtract immediate 1737*9880d681SAndroid Build Coastguard Worker // Increase the weight of the immediate variant to try to match it before 1738*9880d681SAndroid Build Coastguard Worker // the extended register variant. 1739*9880d681SAndroid Build Coastguard Worker // We used to match the register variant before the immediate when the 1740*9880d681SAndroid Build Coastguard Worker // register argument could be implicitly zero-extended. 1741*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 6 in 1742*9880d681SAndroid Build Coastguard Worker def Wri : BaseAddSubImm<isSub, 0, GPR32sp, GPR32sp, addsub_shifted_imm32, 1743*9880d681SAndroid Build Coastguard Worker mnemonic, OpNode> { 1744*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1745*9880d681SAndroid Build Coastguard Worker } 1746*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 6 in 1747*9880d681SAndroid Build Coastguard Worker def Xri : BaseAddSubImm<isSub, 0, GPR64sp, GPR64sp, addsub_shifted_imm64, 1748*9880d681SAndroid Build Coastguard Worker mnemonic, OpNode> { 1749*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1750*9880d681SAndroid Build Coastguard Worker } 1751*9880d681SAndroid Build Coastguard Worker 1752*9880d681SAndroid Build Coastguard Worker // Add/Subtract register - Only used for CodeGen 1753*9880d681SAndroid Build Coastguard Worker def Wrr : BaseAddSubRegPseudo<GPR32, OpNode>; 1754*9880d681SAndroid Build Coastguard Worker def Xrr : BaseAddSubRegPseudo<GPR64, OpNode>; 1755*9880d681SAndroid Build Coastguard Worker 1756*9880d681SAndroid Build Coastguard Worker // Add/Subtract shifted register 1757*9880d681SAndroid Build Coastguard Worker def Wrs : BaseAddSubSReg<isSub, 0, GPR32, arith_shifted_reg32, mnemonic, 1758*9880d681SAndroid Build Coastguard Worker OpNode> { 1759*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1760*9880d681SAndroid Build Coastguard Worker } 1761*9880d681SAndroid Build Coastguard Worker def Xrs : BaseAddSubSReg<isSub, 0, GPR64, arith_shifted_reg64, mnemonic, 1762*9880d681SAndroid Build Coastguard Worker OpNode> { 1763*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1764*9880d681SAndroid Build Coastguard Worker } 1765*9880d681SAndroid Build Coastguard Worker } 1766*9880d681SAndroid Build Coastguard Worker 1767*9880d681SAndroid Build Coastguard Worker // Add/Subtract extended register 1768*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 1, hasSideEffects = 0 in { 1769*9880d681SAndroid Build Coastguard Worker def Wrx : BaseAddSubEReg<isSub, 0, GPR32sp, GPR32sp, 1770*9880d681SAndroid Build Coastguard Worker arith_extended_reg32<i32>, mnemonic, OpNode> { 1771*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1772*9880d681SAndroid Build Coastguard Worker } 1773*9880d681SAndroid Build Coastguard Worker def Xrx : BaseAddSubEReg<isSub, 0, GPR64sp, GPR64sp, 1774*9880d681SAndroid Build Coastguard Worker arith_extended_reg32to64<i64>, mnemonic, OpNode> { 1775*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1776*9880d681SAndroid Build Coastguard Worker } 1777*9880d681SAndroid Build Coastguard Worker } 1778*9880d681SAndroid Build Coastguard Worker 1779*9880d681SAndroid Build Coastguard Worker def Xrx64 : BaseAddSubEReg64<isSub, 0, GPR64sp, GPR64sp, GPR64, 1780*9880d681SAndroid Build Coastguard Worker arith_extendlsl64, mnemonic> { 1781*9880d681SAndroid Build Coastguard Worker // UXTX and SXTX only. 1782*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = 0b11; 1783*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1784*9880d681SAndroid Build Coastguard Worker } 1785*9880d681SAndroid Build Coastguard Worker 1786*9880d681SAndroid Build Coastguard Worker // add Rd, Rb, -imm -> sub Rd, Rn, imm 1787*9880d681SAndroid Build Coastguard Worker def : InstAlias<alias#"\t$Rd, $Rn, $imm", 1788*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wri") GPR32sp:$Rd, GPR32sp:$Rn, 1789*9880d681SAndroid Build Coastguard Worker addsub_shifted_imm32_neg:$imm), 0>; 1790*9880d681SAndroid Build Coastguard Worker def : InstAlias<alias#"\t$Rd, $Rn, $imm", 1791*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Xri") GPR64sp:$Rd, GPR64sp:$Rn, 1792*9880d681SAndroid Build Coastguard Worker addsub_shifted_imm64_neg:$imm), 0>; 1793*9880d681SAndroid Build Coastguard Worker 1794*9880d681SAndroid Build Coastguard Worker // Register/register aliases with no shift when SP is not used. 1795*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrs"), 1796*9880d681SAndroid Build Coastguard Worker GPR32, GPR32, GPR32, 0>; 1797*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Xrs"), 1798*9880d681SAndroid Build Coastguard Worker GPR64, GPR64, GPR64, 0>; 1799*9880d681SAndroid Build Coastguard Worker 1800*9880d681SAndroid Build Coastguard Worker // Register/register aliases with no shift when either the destination or 1801*9880d681SAndroid Build Coastguard Worker // first source register is SP. 1802*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrx"), 1803*9880d681SAndroid Build Coastguard Worker GPR32sponly, GPR32sp, GPR32, 16>; // UXTW #0 1804*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrx"), 1805*9880d681SAndroid Build Coastguard Worker GPR32sp, GPR32sponly, GPR32, 16>; // UXTW #0 1806*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, 1807*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Xrx64"), 1808*9880d681SAndroid Build Coastguard Worker GPR64sponly, GPR64sp, GPR64, 24>; // UXTX #0 1809*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, 1810*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Xrx64"), 1811*9880d681SAndroid Build Coastguard Worker GPR64sp, GPR64sponly, GPR64, 24>; // UXTX #0 1812*9880d681SAndroid Build Coastguard Worker} 1813*9880d681SAndroid Build Coastguard Worker 1814*9880d681SAndroid Build Coastguard Workermulticlass AddSubS<bit isSub, string mnemonic, SDNode OpNode, string cmp, 1815*9880d681SAndroid Build Coastguard Worker string alias, string cmpAlias> { 1816*9880d681SAndroid Build Coastguard Worker let isCompare = 1, Defs = [NZCV] in { 1817*9880d681SAndroid Build Coastguard Worker // Add/Subtract immediate 1818*9880d681SAndroid Build Coastguard Worker def Wri : BaseAddSubImm<isSub, 1, GPR32, GPR32sp, addsub_shifted_imm32, 1819*9880d681SAndroid Build Coastguard Worker mnemonic, OpNode> { 1820*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1821*9880d681SAndroid Build Coastguard Worker } 1822*9880d681SAndroid Build Coastguard Worker def Xri : BaseAddSubImm<isSub, 1, GPR64, GPR64sp, addsub_shifted_imm64, 1823*9880d681SAndroid Build Coastguard Worker mnemonic, OpNode> { 1824*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1825*9880d681SAndroid Build Coastguard Worker } 1826*9880d681SAndroid Build Coastguard Worker 1827*9880d681SAndroid Build Coastguard Worker // Add/Subtract register 1828*9880d681SAndroid Build Coastguard Worker def Wrr : BaseAddSubRegPseudo<GPR32, OpNode>; 1829*9880d681SAndroid Build Coastguard Worker def Xrr : BaseAddSubRegPseudo<GPR64, OpNode>; 1830*9880d681SAndroid Build Coastguard Worker 1831*9880d681SAndroid Build Coastguard Worker // Add/Subtract shifted register 1832*9880d681SAndroid Build Coastguard Worker def Wrs : BaseAddSubSReg<isSub, 1, GPR32, arith_shifted_reg32, mnemonic, 1833*9880d681SAndroid Build Coastguard Worker OpNode> { 1834*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1835*9880d681SAndroid Build Coastguard Worker } 1836*9880d681SAndroid Build Coastguard Worker def Xrs : BaseAddSubSReg<isSub, 1, GPR64, arith_shifted_reg64, mnemonic, 1837*9880d681SAndroid Build Coastguard Worker OpNode> { 1838*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1839*9880d681SAndroid Build Coastguard Worker } 1840*9880d681SAndroid Build Coastguard Worker 1841*9880d681SAndroid Build Coastguard Worker // Add/Subtract extended register 1842*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 1 in { 1843*9880d681SAndroid Build Coastguard Worker def Wrx : BaseAddSubEReg<isSub, 1, GPR32, GPR32sp, 1844*9880d681SAndroid Build Coastguard Worker arith_extended_reg32<i32>, mnemonic, OpNode> { 1845*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1846*9880d681SAndroid Build Coastguard Worker } 1847*9880d681SAndroid Build Coastguard Worker def Xrx : BaseAddSubEReg<isSub, 1, GPR64, GPR64sp, 1848*9880d681SAndroid Build Coastguard Worker arith_extended_reg32<i64>, mnemonic, OpNode> { 1849*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1850*9880d681SAndroid Build Coastguard Worker } 1851*9880d681SAndroid Build Coastguard Worker } 1852*9880d681SAndroid Build Coastguard Worker 1853*9880d681SAndroid Build Coastguard Worker def Xrx64 : BaseAddSubEReg64<isSub, 1, GPR64, GPR64sp, GPR64, 1854*9880d681SAndroid Build Coastguard Worker arith_extendlsl64, mnemonic> { 1855*9880d681SAndroid Build Coastguard Worker // UXTX and SXTX only. 1856*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = 0b11; 1857*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1858*9880d681SAndroid Build Coastguard Worker } 1859*9880d681SAndroid Build Coastguard Worker } // Defs = [NZCV] 1860*9880d681SAndroid Build Coastguard Worker 1861*9880d681SAndroid Build Coastguard Worker // Support negative immediates, e.g. adds Rd, Rn, -imm -> subs Rd, Rn, imm 1862*9880d681SAndroid Build Coastguard Worker def : InstAlias<alias#"\t$Rd, $Rn, $imm", 1863*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wri") GPR32:$Rd, GPR32sp:$Rn, 1864*9880d681SAndroid Build Coastguard Worker addsub_shifted_imm32_neg:$imm), 0>; 1865*9880d681SAndroid Build Coastguard Worker def : InstAlias<alias#"\t$Rd, $Rn, $imm", 1866*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Xri") GPR64:$Rd, GPR64sp:$Rn, 1867*9880d681SAndroid Build Coastguard Worker addsub_shifted_imm64_neg:$imm), 0>; 1868*9880d681SAndroid Build Coastguard Worker 1869*9880d681SAndroid Build Coastguard Worker // Compare aliases 1870*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src, $imm", (!cast<Instruction>(NAME#"Wri") 1871*9880d681SAndroid Build Coastguard Worker WZR, GPR32sp:$src, addsub_shifted_imm32:$imm), 5>; 1872*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src, $imm", (!cast<Instruction>(NAME#"Xri") 1873*9880d681SAndroid Build Coastguard Worker XZR, GPR64sp:$src, addsub_shifted_imm64:$imm), 5>; 1874*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2$sh", (!cast<Instruction>(NAME#"Wrx") 1875*9880d681SAndroid Build Coastguard Worker WZR, GPR32sp:$src1, GPR32:$src2, arith_extend:$sh), 4>; 1876*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2$sh", (!cast<Instruction>(NAME#"Xrx") 1877*9880d681SAndroid Build Coastguard Worker XZR, GPR64sp:$src1, GPR32:$src2, arith_extend:$sh), 4>; 1878*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2$sh", (!cast<Instruction>(NAME#"Xrx64") 1879*9880d681SAndroid Build Coastguard Worker XZR, GPR64sp:$src1, GPR64:$src2, arith_extendlsl64:$sh), 4>; 1880*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2$sh", (!cast<Instruction>(NAME#"Wrs") 1881*9880d681SAndroid Build Coastguard Worker WZR, GPR32:$src1, GPR32:$src2, arith_shift32:$sh), 4>; 1882*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2$sh", (!cast<Instruction>(NAME#"Xrs") 1883*9880d681SAndroid Build Coastguard Worker XZR, GPR64:$src1, GPR64:$src2, arith_shift64:$sh), 4>; 1884*9880d681SAndroid Build Coastguard Worker 1885*9880d681SAndroid Build Coastguard Worker // Support negative immediates, e.g. cmp Rn, -imm -> cmn Rn, imm 1886*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmpAlias#"\t$src, $imm", (!cast<Instruction>(NAME#"Wri") 1887*9880d681SAndroid Build Coastguard Worker WZR, GPR32sp:$src, addsub_shifted_imm32_neg:$imm), 0>; 1888*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmpAlias#"\t$src, $imm", (!cast<Instruction>(NAME#"Xri") 1889*9880d681SAndroid Build Coastguard Worker XZR, GPR64sp:$src, addsub_shifted_imm64_neg:$imm), 0>; 1890*9880d681SAndroid Build Coastguard Worker 1891*9880d681SAndroid Build Coastguard Worker // Compare shorthands 1892*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2", (!cast<Instruction>(NAME#"Wrs") 1893*9880d681SAndroid Build Coastguard Worker WZR, GPR32:$src1, GPR32:$src2, 0), 5>; 1894*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2", (!cast<Instruction>(NAME#"Xrs") 1895*9880d681SAndroid Build Coastguard Worker XZR, GPR64:$src1, GPR64:$src2, 0), 5>; 1896*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2", (!cast<Instruction>(NAME#"Wrx") 1897*9880d681SAndroid Build Coastguard Worker WZR, GPR32sponly:$src1, GPR32:$src2, 16), 5>; 1898*9880d681SAndroid Build Coastguard Worker def : InstAlias<cmp#"\t$src1, $src2", (!cast<Instruction>(NAME#"Xrx64") 1899*9880d681SAndroid Build Coastguard Worker XZR, GPR64sponly:$src1, GPR64:$src2, 24), 5>; 1900*9880d681SAndroid Build Coastguard Worker 1901*9880d681SAndroid Build Coastguard Worker // Register/register aliases with no shift when SP is not used. 1902*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrs"), 1903*9880d681SAndroid Build Coastguard Worker GPR32, GPR32, GPR32, 0>; 1904*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Xrs"), 1905*9880d681SAndroid Build Coastguard Worker GPR64, GPR64, GPR64, 0>; 1906*9880d681SAndroid Build Coastguard Worker 1907*9880d681SAndroid Build Coastguard Worker // Register/register aliases with no shift when the first source register 1908*9880d681SAndroid Build Coastguard Worker // is SP. 1909*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrx"), 1910*9880d681SAndroid Build Coastguard Worker GPR32, GPR32sponly, GPR32, 16>; // UXTW #0 1911*9880d681SAndroid Build Coastguard Worker def : AddSubRegAlias<mnemonic, 1912*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Xrx64"), 1913*9880d681SAndroid Build Coastguard Worker GPR64, GPR64sponly, GPR64, 24>; // UXTX #0 1914*9880d681SAndroid Build Coastguard Worker} 1915*9880d681SAndroid Build Coastguard Worker 1916*9880d681SAndroid Build Coastguard Worker//--- 1917*9880d681SAndroid Build Coastguard Worker// Extract 1918*9880d681SAndroid Build Coastguard Worker//--- 1919*9880d681SAndroid Build Coastguard Workerdef SDTA64EXTR : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, 1920*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<3>]>; 1921*9880d681SAndroid Build Coastguard Workerdef AArch64Extr : SDNode<"AArch64ISD::EXTR", SDTA64EXTR>; 1922*9880d681SAndroid Build Coastguard Worker 1923*9880d681SAndroid Build Coastguard Workerclass BaseExtractImm<RegisterClass regtype, Operand imm_type, string asm, 1924*9880d681SAndroid Build Coastguard Worker list<dag> patterns> 1925*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, imm_type:$imm), 1926*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $imm", "", patterns>, 1927*9880d681SAndroid Build Coastguard Worker Sched<[WriteExtr, ReadExtrHi]> { 1928*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1929*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1930*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 1931*9880d681SAndroid Build Coastguard Worker bits<6> imm; 1932*9880d681SAndroid Build Coastguard Worker 1933*9880d681SAndroid Build Coastguard Worker let Inst{30-23} = 0b00100111; 1934*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 1935*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 1936*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = imm; 1937*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1938*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1939*9880d681SAndroid Build Coastguard Worker} 1940*9880d681SAndroid Build Coastguard Worker 1941*9880d681SAndroid Build Coastguard Workermulticlass ExtractImm<string asm> { 1942*9880d681SAndroid Build Coastguard Worker def Wrri : BaseExtractImm<GPR32, imm0_31, asm, 1943*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, 1944*9880d681SAndroid Build Coastguard Worker (AArch64Extr GPR32:$Rn, GPR32:$Rm, imm0_31:$imm))]> { 1945*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1946*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 1947*9880d681SAndroid Build Coastguard Worker // imm<5> must be zero. 1948*9880d681SAndroid Build Coastguard Worker let imm{5} = 0; 1949*9880d681SAndroid Build Coastguard Worker } 1950*9880d681SAndroid Build Coastguard Worker def Xrri : BaseExtractImm<GPR64, imm0_63, asm, 1951*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, 1952*9880d681SAndroid Build Coastguard Worker (AArch64Extr GPR64:$Rn, GPR64:$Rm, imm0_63:$imm))]> { 1953*9880d681SAndroid Build Coastguard Worker 1954*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1955*9880d681SAndroid Build Coastguard Worker let Inst{22} = 1; 1956*9880d681SAndroid Build Coastguard Worker } 1957*9880d681SAndroid Build Coastguard Worker} 1958*9880d681SAndroid Build Coastguard Worker 1959*9880d681SAndroid Build Coastguard Worker//--- 1960*9880d681SAndroid Build Coastguard Worker// Bitfield 1961*9880d681SAndroid Build Coastguard Worker//--- 1962*9880d681SAndroid Build Coastguard Worker 1963*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1964*9880d681SAndroid Build Coastguard Workerclass BaseBitfieldImm<bits<2> opc, 1965*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, Operand imm_type, string asm> 1966*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, imm_type:$immr, imm_type:$imms), 1967*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $immr, $imms", "", []>, 1968*9880d681SAndroid Build Coastguard Worker Sched<[WriteIS, ReadI]> { 1969*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 1970*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 1971*9880d681SAndroid Build Coastguard Worker bits<6> immr; 1972*9880d681SAndroid Build Coastguard Worker bits<6> imms; 1973*9880d681SAndroid Build Coastguard Worker 1974*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 1975*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b100110; 1976*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = immr; 1977*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = imms; 1978*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 1979*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 1980*9880d681SAndroid Build Coastguard Worker} 1981*9880d681SAndroid Build Coastguard Worker 1982*9880d681SAndroid Build Coastguard Workermulticlass BitfieldImm<bits<2> opc, string asm> { 1983*9880d681SAndroid Build Coastguard Worker def Wri : BaseBitfieldImm<opc, GPR32, imm0_31, asm> { 1984*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 1985*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 1986*9880d681SAndroid Build Coastguard Worker // imms<5> and immr<5> must be zero, else ReservedValue(). 1987*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 1988*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 1989*9880d681SAndroid Build Coastguard Worker } 1990*9880d681SAndroid Build Coastguard Worker def Xri : BaseBitfieldImm<opc, GPR64, imm0_63, asm> { 1991*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 1992*9880d681SAndroid Build Coastguard Worker let Inst{22} = 1; 1993*9880d681SAndroid Build Coastguard Worker } 1994*9880d681SAndroid Build Coastguard Worker} 1995*9880d681SAndroid Build Coastguard Worker 1996*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 1997*9880d681SAndroid Build Coastguard Workerclass BaseBitfieldImmWith2RegArgs<bits<2> opc, 1998*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, Operand imm_type, string asm> 1999*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$src, regtype:$Rn, imm_type:$immr, 2000*9880d681SAndroid Build Coastguard Worker imm_type:$imms), 2001*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $immr, $imms", "$src = $Rd", []>, 2002*9880d681SAndroid Build Coastguard Worker Sched<[WriteIS, ReadI]> { 2003*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2004*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2005*9880d681SAndroid Build Coastguard Worker bits<6> immr; 2006*9880d681SAndroid Build Coastguard Worker bits<6> imms; 2007*9880d681SAndroid Build Coastguard Worker 2008*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 2009*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b100110; 2010*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = immr; 2011*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = imms; 2012*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2013*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2014*9880d681SAndroid Build Coastguard Worker} 2015*9880d681SAndroid Build Coastguard Worker 2016*9880d681SAndroid Build Coastguard Workermulticlass BitfieldImmWith2RegArgs<bits<2> opc, string asm> { 2017*9880d681SAndroid Build Coastguard Worker def Wri : BaseBitfieldImmWith2RegArgs<opc, GPR32, imm0_31, asm> { 2018*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2019*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 2020*9880d681SAndroid Build Coastguard Worker // imms<5> and immr<5> must be zero, else ReservedValue(). 2021*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 2022*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 2023*9880d681SAndroid Build Coastguard Worker } 2024*9880d681SAndroid Build Coastguard Worker def Xri : BaseBitfieldImmWith2RegArgs<opc, GPR64, imm0_63, asm> { 2025*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2026*9880d681SAndroid Build Coastguard Worker let Inst{22} = 1; 2027*9880d681SAndroid Build Coastguard Worker } 2028*9880d681SAndroid Build Coastguard Worker} 2029*9880d681SAndroid Build Coastguard Worker 2030*9880d681SAndroid Build Coastguard Worker//--- 2031*9880d681SAndroid Build Coastguard Worker// Logical 2032*9880d681SAndroid Build Coastguard Worker//--- 2033*9880d681SAndroid Build Coastguard Worker 2034*9880d681SAndroid Build Coastguard Worker// Logical (immediate) 2035*9880d681SAndroid Build Coastguard Workerclass BaseLogicalImm<bits<2> opc, RegisterClass dregtype, 2036*9880d681SAndroid Build Coastguard Worker RegisterClass sregtype, Operand imm_type, string asm, 2037*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 2038*9880d681SAndroid Build Coastguard Worker : I<(outs dregtype:$Rd), (ins sregtype:$Rn, imm_type:$imm), 2039*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $imm", "", pattern>, 2040*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI]> { 2041*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2042*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2043*9880d681SAndroid Build Coastguard Worker bits<13> imm; 2044*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 2045*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b100100; 2046*9880d681SAndroid Build Coastguard Worker let Inst{22} = imm{12}; 2047*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{11-6}; 2048*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = imm{5-0}; 2049*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2050*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2051*9880d681SAndroid Build Coastguard Worker 2052*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeLogicalImmInstruction"; 2053*9880d681SAndroid Build Coastguard Worker} 2054*9880d681SAndroid Build Coastguard Worker 2055*9880d681SAndroid Build Coastguard Worker// Logical (shifted register) 2056*9880d681SAndroid Build Coastguard Workerclass BaseLogicalSReg<bits<2> opc, bit N, RegisterClass regtype, 2057*9880d681SAndroid Build Coastguard Worker logical_shifted_reg shifted_regtype, string asm, 2058*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 2059*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, shifted_regtype:$Rm), 2060*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", pattern>, 2061*9880d681SAndroid Build Coastguard Worker Sched<[WriteISReg, ReadI, ReadISReg]> { 2062*9880d681SAndroid Build Coastguard Worker // The operands are in order to match the 'addr' MI operands, so we 2063*9880d681SAndroid Build Coastguard Worker // don't need an encoder method and by-name matching. Just use the default 2064*9880d681SAndroid Build Coastguard Worker // in-order handling. Since we're using by-order, make sure the names 2065*9880d681SAndroid Build Coastguard Worker // do not match. 2066*9880d681SAndroid Build Coastguard Worker bits<5> dst; 2067*9880d681SAndroid Build Coastguard Worker bits<5> src1; 2068*9880d681SAndroid Build Coastguard Worker bits<5> src2; 2069*9880d681SAndroid Build Coastguard Worker bits<8> shift; 2070*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = opc; 2071*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01010; 2072*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = shift{7-6}; 2073*9880d681SAndroid Build Coastguard Worker let Inst{21} = N; 2074*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = src2; 2075*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = shift{5-0}; 2076*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = src1; 2077*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 2078*9880d681SAndroid Build Coastguard Worker 2079*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeThreeAddrSRegInstruction"; 2080*9880d681SAndroid Build Coastguard Worker} 2081*9880d681SAndroid Build Coastguard Worker 2082*9880d681SAndroid Build Coastguard Worker// Aliases for register+register logical instructions. 2083*9880d681SAndroid Build Coastguard Workerclass LogicalRegAlias<string asm, Instruction inst, RegisterClass regtype> 2084*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"\t$dst, $src1, $src2", 2085*9880d681SAndroid Build Coastguard Worker (inst regtype:$dst, regtype:$src1, regtype:$src2, 0)>; 2086*9880d681SAndroid Build Coastguard Worker 2087*9880d681SAndroid Build Coastguard Workermulticlass LogicalImm<bits<2> opc, string mnemonic, SDNode OpNode, 2088*9880d681SAndroid Build Coastguard Worker string Alias> { 2089*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 6, isReMaterializable = 1, isAsCheapAsAMove = 1 in 2090*9880d681SAndroid Build Coastguard Worker def Wri : BaseLogicalImm<opc, GPR32sp, GPR32, logical_imm32, mnemonic, 2091*9880d681SAndroid Build Coastguard Worker [(set GPR32sp:$Rd, (OpNode GPR32:$Rn, 2092*9880d681SAndroid Build Coastguard Worker logical_imm32:$imm))]> { 2093*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2094*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; // 64-bit version has an additional bit of immediate. 2095*9880d681SAndroid Build Coastguard Worker } 2096*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 6, isReMaterializable = 1, isAsCheapAsAMove = 1 in 2097*9880d681SAndroid Build Coastguard Worker def Xri : BaseLogicalImm<opc, GPR64sp, GPR64, logical_imm64, mnemonic, 2098*9880d681SAndroid Build Coastguard Worker [(set GPR64sp:$Rd, (OpNode GPR64:$Rn, 2099*9880d681SAndroid Build Coastguard Worker logical_imm64:$imm))]> { 2100*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2101*9880d681SAndroid Build Coastguard Worker } 2102*9880d681SAndroid Build Coastguard Worker 2103*9880d681SAndroid Build Coastguard Worker def : InstAlias<Alias # "\t$Rd, $Rn, $imm", 2104*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wri") GPR32sp:$Rd, GPR32:$Rn, 2105*9880d681SAndroid Build Coastguard Worker logical_imm32_not:$imm), 0>; 2106*9880d681SAndroid Build Coastguard Worker def : InstAlias<Alias # "\t$Rd, $Rn, $imm", 2107*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Xri") GPR64sp:$Rd, GPR64:$Rn, 2108*9880d681SAndroid Build Coastguard Worker logical_imm64_not:$imm), 0>; 2109*9880d681SAndroid Build Coastguard Worker} 2110*9880d681SAndroid Build Coastguard Worker 2111*9880d681SAndroid Build Coastguard Workermulticlass LogicalImmS<bits<2> opc, string mnemonic, SDNode OpNode, 2112*9880d681SAndroid Build Coastguard Worker string Alias> { 2113*9880d681SAndroid Build Coastguard Worker let isCompare = 1, Defs = [NZCV] in { 2114*9880d681SAndroid Build Coastguard Worker def Wri : BaseLogicalImm<opc, GPR32, GPR32, logical_imm32, mnemonic, 2115*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpNode GPR32:$Rn, logical_imm32:$imm))]> { 2116*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2117*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; // 64-bit version has an additional bit of immediate. 2118*9880d681SAndroid Build Coastguard Worker } 2119*9880d681SAndroid Build Coastguard Worker def Xri : BaseLogicalImm<opc, GPR64, GPR64, logical_imm64, mnemonic, 2120*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpNode GPR64:$Rn, logical_imm64:$imm))]> { 2121*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2122*9880d681SAndroid Build Coastguard Worker } 2123*9880d681SAndroid Build Coastguard Worker } // end Defs = [NZCV] 2124*9880d681SAndroid Build Coastguard Worker 2125*9880d681SAndroid Build Coastguard Worker def : InstAlias<Alias # "\t$Rd, $Rn, $imm", 2126*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Wri") GPR32:$Rd, GPR32:$Rn, 2127*9880d681SAndroid Build Coastguard Worker logical_imm32_not:$imm), 0>; 2128*9880d681SAndroid Build Coastguard Worker def : InstAlias<Alias # "\t$Rd, $Rn, $imm", 2129*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "Xri") GPR64:$Rd, GPR64:$Rn, 2130*9880d681SAndroid Build Coastguard Worker logical_imm64_not:$imm), 0>; 2131*9880d681SAndroid Build Coastguard Worker} 2132*9880d681SAndroid Build Coastguard Worker 2133*9880d681SAndroid Build Coastguard Workerclass BaseLogicalRegPseudo<RegisterClass regtype, SDPatternOperator OpNode> 2134*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), 2135*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm))]>, 2136*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]>; 2137*9880d681SAndroid Build Coastguard Worker 2138*9880d681SAndroid Build Coastguard Worker// Split from LogicalImm as not all instructions have both. 2139*9880d681SAndroid Build Coastguard Workermulticlass LogicalReg<bits<2> opc, bit N, string mnemonic, 2140*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 2141*9880d681SAndroid Build Coastguard Worker let isReMaterializable = 1, isAsCheapAsAMove = 1 in { 2142*9880d681SAndroid Build Coastguard Worker def Wrr : BaseLogicalRegPseudo<GPR32, OpNode>; 2143*9880d681SAndroid Build Coastguard Worker def Xrr : BaseLogicalRegPseudo<GPR64, OpNode>; 2144*9880d681SAndroid Build Coastguard Worker } 2145*9880d681SAndroid Build Coastguard Worker 2146*9880d681SAndroid Build Coastguard Worker def Wrs : BaseLogicalSReg<opc, N, GPR32, logical_shifted_reg32, mnemonic, 2147*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpNode GPR32:$Rn, 2148*9880d681SAndroid Build Coastguard Worker logical_shifted_reg32:$Rm))]> { 2149*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2150*9880d681SAndroid Build Coastguard Worker } 2151*9880d681SAndroid Build Coastguard Worker def Xrs : BaseLogicalSReg<opc, N, GPR64, logical_shifted_reg64, mnemonic, 2152*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpNode GPR64:$Rn, 2153*9880d681SAndroid Build Coastguard Worker logical_shifted_reg64:$Rm))]> { 2154*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2155*9880d681SAndroid Build Coastguard Worker } 2156*9880d681SAndroid Build Coastguard Worker 2157*9880d681SAndroid Build Coastguard Worker def : LogicalRegAlias<mnemonic, 2158*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Wrs"), GPR32>; 2159*9880d681SAndroid Build Coastguard Worker def : LogicalRegAlias<mnemonic, 2160*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Xrs"), GPR64>; 2161*9880d681SAndroid Build Coastguard Worker} 2162*9880d681SAndroid Build Coastguard Worker 2163*9880d681SAndroid Build Coastguard Worker// Split from LogicalReg to allow setting NZCV Defs 2164*9880d681SAndroid Build Coastguard Workermulticlass LogicalRegS<bits<2> opc, bit N, string mnemonic, 2165*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 2166*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV], mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 2167*9880d681SAndroid Build Coastguard Worker def Wrr : BaseLogicalRegPseudo<GPR32, OpNode>; 2168*9880d681SAndroid Build Coastguard Worker def Xrr : BaseLogicalRegPseudo<GPR64, OpNode>; 2169*9880d681SAndroid Build Coastguard Worker 2170*9880d681SAndroid Build Coastguard Worker def Wrs : BaseLogicalSReg<opc, N, GPR32, logical_shifted_reg32, mnemonic, 2171*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpNode GPR32:$Rn, logical_shifted_reg32:$Rm))]> { 2172*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2173*9880d681SAndroid Build Coastguard Worker } 2174*9880d681SAndroid Build Coastguard Worker def Xrs : BaseLogicalSReg<opc, N, GPR64, logical_shifted_reg64, mnemonic, 2175*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpNode GPR64:$Rn, logical_shifted_reg64:$Rm))]> { 2176*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2177*9880d681SAndroid Build Coastguard Worker } 2178*9880d681SAndroid Build Coastguard Worker } // Defs = [NZCV] 2179*9880d681SAndroid Build Coastguard Worker 2180*9880d681SAndroid Build Coastguard Worker def : LogicalRegAlias<mnemonic, 2181*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Wrs"), GPR32>; 2182*9880d681SAndroid Build Coastguard Worker def : LogicalRegAlias<mnemonic, 2183*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"Xrs"), GPR64>; 2184*9880d681SAndroid Build Coastguard Worker} 2185*9880d681SAndroid Build Coastguard Worker 2186*9880d681SAndroid Build Coastguard Worker//--- 2187*9880d681SAndroid Build Coastguard Worker// Conditionally set flags 2188*9880d681SAndroid Build Coastguard Worker//--- 2189*9880d681SAndroid Build Coastguard Worker 2190*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 2191*9880d681SAndroid Build Coastguard Workerclass BaseCondComparisonImm<bit op, RegisterClass regtype, ImmLeaf immtype, 2192*9880d681SAndroid Build Coastguard Worker string mnemonic, SDNode OpNode> 2193*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rn, immtype:$imm, imm32_0_15:$nzcv, ccode:$cond), 2194*9880d681SAndroid Build Coastguard Worker mnemonic, "\t$Rn, $imm, $nzcv, $cond", "", 2195*9880d681SAndroid Build Coastguard Worker [(set NZCV, (OpNode regtype:$Rn, immtype:$imm, (i32 imm:$nzcv), 2196*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]>, 2197*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI]> { 2198*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 2199*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV]; 2200*9880d681SAndroid Build Coastguard Worker 2201*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2202*9880d681SAndroid Build Coastguard Worker bits<5> imm; 2203*9880d681SAndroid Build Coastguard Worker bits<4> nzcv; 2204*9880d681SAndroid Build Coastguard Worker bits<4> cond; 2205*9880d681SAndroid Build Coastguard Worker 2206*9880d681SAndroid Build Coastguard Worker let Inst{30} = op; 2207*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b111010010; 2208*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 2209*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 2210*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2211*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2212*9880d681SAndroid Build Coastguard Worker let Inst{4} = 0b0; 2213*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = nzcv; 2214*9880d681SAndroid Build Coastguard Worker} 2215*9880d681SAndroid Build Coastguard Worker 2216*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 2217*9880d681SAndroid Build Coastguard Workerclass BaseCondComparisonReg<bit op, RegisterClass regtype, string mnemonic, 2218*9880d681SAndroid Build Coastguard Worker SDNode OpNode> 2219*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rn, regtype:$Rm, imm32_0_15:$nzcv, ccode:$cond), 2220*9880d681SAndroid Build Coastguard Worker mnemonic, "\t$Rn, $Rm, $nzcv, $cond", "", 2221*9880d681SAndroid Build Coastguard Worker [(set NZCV, (OpNode regtype:$Rn, regtype:$Rm, (i32 imm:$nzcv), 2222*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]>, 2223*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]> { 2224*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 2225*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV]; 2226*9880d681SAndroid Build Coastguard Worker 2227*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2228*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2229*9880d681SAndroid Build Coastguard Worker bits<4> nzcv; 2230*9880d681SAndroid Build Coastguard Worker bits<4> cond; 2231*9880d681SAndroid Build Coastguard Worker 2232*9880d681SAndroid Build Coastguard Worker let Inst{30} = op; 2233*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b111010010; 2234*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2235*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 2236*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 2237*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2238*9880d681SAndroid Build Coastguard Worker let Inst{4} = 0b0; 2239*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = nzcv; 2240*9880d681SAndroid Build Coastguard Worker} 2241*9880d681SAndroid Build Coastguard Worker 2242*9880d681SAndroid Build Coastguard Workermulticlass CondComparison<bit op, string mnemonic, SDNode OpNode> { 2243*9880d681SAndroid Build Coastguard Worker // immediate operand variants 2244*9880d681SAndroid Build Coastguard Worker def Wi : BaseCondComparisonImm<op, GPR32, imm32_0_31, mnemonic, OpNode> { 2245*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2246*9880d681SAndroid Build Coastguard Worker } 2247*9880d681SAndroid Build Coastguard Worker def Xi : BaseCondComparisonImm<op, GPR64, imm0_31, mnemonic, OpNode> { 2248*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2249*9880d681SAndroid Build Coastguard Worker } 2250*9880d681SAndroid Build Coastguard Worker // register operand variants 2251*9880d681SAndroid Build Coastguard Worker def Wr : BaseCondComparisonReg<op, GPR32, mnemonic, OpNode> { 2252*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2253*9880d681SAndroid Build Coastguard Worker } 2254*9880d681SAndroid Build Coastguard Worker def Xr : BaseCondComparisonReg<op, GPR64, mnemonic, OpNode> { 2255*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2256*9880d681SAndroid Build Coastguard Worker } 2257*9880d681SAndroid Build Coastguard Worker} 2258*9880d681SAndroid Build Coastguard Worker 2259*9880d681SAndroid Build Coastguard Worker//--- 2260*9880d681SAndroid Build Coastguard Worker// Conditional select 2261*9880d681SAndroid Build Coastguard Worker//--- 2262*9880d681SAndroid Build Coastguard Worker 2263*9880d681SAndroid Build Coastguard Workerclass BaseCondSelect<bit op, bits<2> op2, RegisterClass regtype, string asm> 2264*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond), 2265*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $cond", "", 2266*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, 2267*9880d681SAndroid Build Coastguard Worker (AArch64csel regtype:$Rn, regtype:$Rm, (i32 imm:$cond), NZCV))]>, 2268*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]> { 2269*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 2270*9880d681SAndroid Build Coastguard Worker 2271*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2272*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2273*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2274*9880d681SAndroid Build Coastguard Worker bits<4> cond; 2275*9880d681SAndroid Build Coastguard Worker 2276*9880d681SAndroid Build Coastguard Worker let Inst{30} = op; 2277*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b011010100; 2278*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2279*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 2280*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = op2; 2281*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2282*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2283*9880d681SAndroid Build Coastguard Worker} 2284*9880d681SAndroid Build Coastguard Worker 2285*9880d681SAndroid Build Coastguard Workermulticlass CondSelect<bit op, bits<2> op2, string asm> { 2286*9880d681SAndroid Build Coastguard Worker def Wr : BaseCondSelect<op, op2, GPR32, asm> { 2287*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2288*9880d681SAndroid Build Coastguard Worker } 2289*9880d681SAndroid Build Coastguard Worker def Xr : BaseCondSelect<op, op2, GPR64, asm> { 2290*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2291*9880d681SAndroid Build Coastguard Worker } 2292*9880d681SAndroid Build Coastguard Worker} 2293*9880d681SAndroid Build Coastguard Worker 2294*9880d681SAndroid Build Coastguard Workerclass BaseCondSelectOp<bit op, bits<2> op2, RegisterClass regtype, string asm, 2295*9880d681SAndroid Build Coastguard Worker PatFrag frag> 2296*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond), 2297*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $cond", "", 2298*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, 2299*9880d681SAndroid Build Coastguard Worker (AArch64csel regtype:$Rn, (frag regtype:$Rm), 2300*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]>, 2301*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, ReadI, ReadI]> { 2302*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 2303*9880d681SAndroid Build Coastguard Worker 2304*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 2305*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2306*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2307*9880d681SAndroid Build Coastguard Worker bits<4> cond; 2308*9880d681SAndroid Build Coastguard Worker 2309*9880d681SAndroid Build Coastguard Worker let Inst{30} = op; 2310*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b011010100; 2311*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2312*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 2313*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = op2; 2314*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2315*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 2316*9880d681SAndroid Build Coastguard Worker} 2317*9880d681SAndroid Build Coastguard Worker 2318*9880d681SAndroid Build Coastguard Workerdef inv_cond_XFORM : SDNodeXForm<imm, [{ 2319*9880d681SAndroid Build Coastguard Worker AArch64CC::CondCode CC = static_cast<AArch64CC::CondCode>(N->getZExtValue()); 2320*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(AArch64CC::getInvertedCondCode(CC), SDLoc(N), 2321*9880d681SAndroid Build Coastguard Worker MVT::i32); 2322*9880d681SAndroid Build Coastguard Worker}]>; 2323*9880d681SAndroid Build Coastguard Worker 2324*9880d681SAndroid Build Coastguard Workermulticlass CondSelectOp<bit op, bits<2> op2, string asm, PatFrag frag> { 2325*9880d681SAndroid Build Coastguard Worker def Wr : BaseCondSelectOp<op, op2, GPR32, asm, frag> { 2326*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 2327*9880d681SAndroid Build Coastguard Worker } 2328*9880d681SAndroid Build Coastguard Worker def Xr : BaseCondSelectOp<op, op2, GPR64, asm, frag> { 2329*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 2330*9880d681SAndroid Build Coastguard Worker } 2331*9880d681SAndroid Build Coastguard Worker 2332*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64csel (frag GPR32:$Rm), GPR32:$Rn, (i32 imm:$cond), NZCV), 2333*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Wr) GPR32:$Rn, GPR32:$Rm, 2334*9880d681SAndroid Build Coastguard Worker (inv_cond_XFORM imm:$cond))>; 2335*9880d681SAndroid Build Coastguard Worker 2336*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64csel (frag GPR64:$Rm), GPR64:$Rn, (i32 imm:$cond), NZCV), 2337*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Xr) GPR64:$Rn, GPR64:$Rm, 2338*9880d681SAndroid Build Coastguard Worker (inv_cond_XFORM imm:$cond))>; 2339*9880d681SAndroid Build Coastguard Worker} 2340*9880d681SAndroid Build Coastguard Worker 2341*9880d681SAndroid Build Coastguard Worker//--- 2342*9880d681SAndroid Build Coastguard Worker// Special Mask Value 2343*9880d681SAndroid Build Coastguard Worker//--- 2344*9880d681SAndroid Build Coastguard Workerdef maski8_or_more : Operand<i32>, 2345*9880d681SAndroid Build Coastguard Worker ImmLeaf<i32, [{ return (Imm & 0xff) == 0xff; }]> { 2346*9880d681SAndroid Build Coastguard Worker} 2347*9880d681SAndroid Build Coastguard Workerdef maski16_or_more : Operand<i32>, 2348*9880d681SAndroid Build Coastguard Worker ImmLeaf<i32, [{ return (Imm & 0xffff) == 0xffff; }]> { 2349*9880d681SAndroid Build Coastguard Worker} 2350*9880d681SAndroid Build Coastguard Worker 2351*9880d681SAndroid Build Coastguard Worker 2352*9880d681SAndroid Build Coastguard Worker//--- 2353*9880d681SAndroid Build Coastguard Worker// Load/store 2354*9880d681SAndroid Build Coastguard Worker//--- 2355*9880d681SAndroid Build Coastguard Worker 2356*9880d681SAndroid Build Coastguard Worker// (unsigned immediate) 2357*9880d681SAndroid Build Coastguard Worker// Indexed for 8-bit registers. offset is in range [0,4095]. 2358*9880d681SAndroid Build Coastguard Workerdef am_indexed8 : ComplexPattern<i64, 2, "SelectAddrModeIndexed8", []>; 2359*9880d681SAndroid Build Coastguard Workerdef am_indexed16 : ComplexPattern<i64, 2, "SelectAddrModeIndexed16", []>; 2360*9880d681SAndroid Build Coastguard Workerdef am_indexed32 : ComplexPattern<i64, 2, "SelectAddrModeIndexed32", []>; 2361*9880d681SAndroid Build Coastguard Workerdef am_indexed64 : ComplexPattern<i64, 2, "SelectAddrModeIndexed64", []>; 2362*9880d681SAndroid Build Coastguard Workerdef am_indexed128 : ComplexPattern<i64, 2, "SelectAddrModeIndexed128", []>; 2363*9880d681SAndroid Build Coastguard Worker 2364*9880d681SAndroid Build Coastguard Workerclass UImm12OffsetOperand<int Scale> : AsmOperandClass { 2365*9880d681SAndroid Build Coastguard Worker let Name = "UImm12Offset" # Scale; 2366*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addUImm12OffsetOperands<" # Scale # ">"; 2367*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isUImm12Offset<" # Scale # ">"; 2368*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMemoryIndexed" # Scale; 2369*9880d681SAndroid Build Coastguard Worker} 2370*9880d681SAndroid Build Coastguard Worker 2371*9880d681SAndroid Build Coastguard Workerdef UImm12OffsetScale1Operand : UImm12OffsetOperand<1>; 2372*9880d681SAndroid Build Coastguard Workerdef UImm12OffsetScale2Operand : UImm12OffsetOperand<2>; 2373*9880d681SAndroid Build Coastguard Workerdef UImm12OffsetScale4Operand : UImm12OffsetOperand<4>; 2374*9880d681SAndroid Build Coastguard Workerdef UImm12OffsetScale8Operand : UImm12OffsetOperand<8>; 2375*9880d681SAndroid Build Coastguard Workerdef UImm12OffsetScale16Operand : UImm12OffsetOperand<16>; 2376*9880d681SAndroid Build Coastguard Worker 2377*9880d681SAndroid Build Coastguard Workerclass uimm12_scaled<int Scale> : Operand<i64> { 2378*9880d681SAndroid Build Coastguard Worker let ParserMatchClass 2379*9880d681SAndroid Build Coastguard Worker = !cast<AsmOperandClass>("UImm12OffsetScale" # Scale # "Operand"); 2380*9880d681SAndroid Build Coastguard Worker let EncoderMethod 2381*9880d681SAndroid Build Coastguard Worker = "getLdStUImm12OpValue<AArch64::fixup_aarch64_ldst_imm12_scale" # Scale # ">"; 2382*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printUImm12Offset<" # Scale # ">"; 2383*9880d681SAndroid Build Coastguard Worker} 2384*9880d681SAndroid Build Coastguard Worker 2385*9880d681SAndroid Build Coastguard Workerdef uimm12s1 : uimm12_scaled<1>; 2386*9880d681SAndroid Build Coastguard Workerdef uimm12s2 : uimm12_scaled<2>; 2387*9880d681SAndroid Build Coastguard Workerdef uimm12s4 : uimm12_scaled<4>; 2388*9880d681SAndroid Build Coastguard Workerdef uimm12s8 : uimm12_scaled<8>; 2389*9880d681SAndroid Build Coastguard Workerdef uimm12s16 : uimm12_scaled<16>; 2390*9880d681SAndroid Build Coastguard Worker 2391*9880d681SAndroid Build Coastguard Workerclass BaseLoadStoreUI<bits<2> sz, bit V, bits<2> opc, dag oops, dag iops, 2392*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> 2393*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, [$Rn, $offset]", "", pattern> { 2394*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2395*9880d681SAndroid Build Coastguard Worker 2396*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2397*9880d681SAndroid Build Coastguard Worker bits<12> offset; 2398*9880d681SAndroid Build Coastguard Worker 2399*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2400*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2401*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2402*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b01; 2403*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2404*9880d681SAndroid Build Coastguard Worker let Inst{21-10} = offset; 2405*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2406*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2407*9880d681SAndroid Build Coastguard Worker 2408*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeUnsignedLdStInstruction"; 2409*9880d681SAndroid Build Coastguard Worker} 2410*9880d681SAndroid Build Coastguard Worker 2411*9880d681SAndroid Build Coastguard Workermulticlass LoadUI<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2412*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm, list<dag> pattern> { 2413*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2414*9880d681SAndroid Build Coastguard Worker def ui : BaseLoadStoreUI<sz, V, opc, (outs regtype:$Rt), 2415*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, indextype:$offset), 2416*9880d681SAndroid Build Coastguard Worker asm, pattern>, 2417*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 2418*9880d681SAndroid Build Coastguard Worker 2419*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 2420*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "ui") regtype:$Rt, GPR64sp:$Rn, 0)>; 2421*9880d681SAndroid Build Coastguard Worker} 2422*9880d681SAndroid Build Coastguard Worker 2423*9880d681SAndroid Build Coastguard Workermulticlass StoreUI<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2424*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm, list<dag> pattern> { 2425*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 2426*9880d681SAndroid Build Coastguard Worker def ui : BaseLoadStoreUI<sz, V, opc, (outs), 2427*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, indextype:$offset), 2428*9880d681SAndroid Build Coastguard Worker asm, pattern>, 2429*9880d681SAndroid Build Coastguard Worker Sched<[WriteST]>; 2430*9880d681SAndroid Build Coastguard Worker 2431*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 2432*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "ui") regtype:$Rt, GPR64sp:$Rn, 0)>; 2433*9880d681SAndroid Build Coastguard Worker} 2434*9880d681SAndroid Build Coastguard Worker 2435*9880d681SAndroid Build Coastguard Workerdef PrefetchOperand : AsmOperandClass { 2436*9880d681SAndroid Build Coastguard Worker let Name = "Prefetch"; 2437*9880d681SAndroid Build Coastguard Worker let ParserMethod = "tryParsePrefetch"; 2438*9880d681SAndroid Build Coastguard Worker} 2439*9880d681SAndroid Build Coastguard Workerdef prfop : Operand<i32> { 2440*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printPrefetchOp"; 2441*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PrefetchOperand; 2442*9880d681SAndroid Build Coastguard Worker} 2443*9880d681SAndroid Build Coastguard Worker 2444*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 2445*9880d681SAndroid Build Coastguard Workerclass PrefetchUI<bits<2> sz, bit V, bits<2> opc, string asm, list<dag> pat> 2446*9880d681SAndroid Build Coastguard Worker : BaseLoadStoreUI<sz, V, opc, 2447*9880d681SAndroid Build Coastguard Worker (outs), (ins prfop:$Rt, GPR64sp:$Rn, uimm12s8:$offset), 2448*9880d681SAndroid Build Coastguard Worker asm, pat>, 2449*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 2450*9880d681SAndroid Build Coastguard Worker 2451*9880d681SAndroid Build Coastguard Worker//--- 2452*9880d681SAndroid Build Coastguard Worker// Load literal 2453*9880d681SAndroid Build Coastguard Worker//--- 2454*9880d681SAndroid Build Coastguard Worker 2455*9880d681SAndroid Build Coastguard Worker// Load literal address: 19-bit immediate. The low two bits of the target 2456*9880d681SAndroid Build Coastguard Worker// offset are implied zero and so are not part of the immediate. 2457*9880d681SAndroid Build Coastguard Workerdef am_ldrlit : Operand<OtherVT> { 2458*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getLoadLiteralOpValue"; 2459*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePCRelLabel19"; 2460*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printAlignedLabel"; 2461*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PCRelLabel19Operand; 2462*9880d681SAndroid Build Coastguard Worker} 2463*9880d681SAndroid Build Coastguard Worker 2464*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2465*9880d681SAndroid Build Coastguard Workerclass LoadLiteral<bits<2> opc, bit V, RegisterClass regtype, string asm> 2466*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rt), (ins am_ldrlit:$label), 2467*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, $label", "", []>, 2468*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]> { 2469*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2470*9880d681SAndroid Build Coastguard Worker bits<19> label; 2471*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 2472*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b011; 2473*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2474*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2475*9880d681SAndroid Build Coastguard Worker let Inst{23-5} = label; 2476*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2477*9880d681SAndroid Build Coastguard Worker} 2478*9880d681SAndroid Build Coastguard Worker 2479*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 2480*9880d681SAndroid Build Coastguard Workerclass PrefetchLiteral<bits<2> opc, bit V, string asm, list<dag> pat> 2481*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins prfop:$Rt, am_ldrlit:$label), 2482*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, $label", "", pat>, 2483*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]> { 2484*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2485*9880d681SAndroid Build Coastguard Worker bits<19> label; 2486*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 2487*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b011; 2488*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2489*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2490*9880d681SAndroid Build Coastguard Worker let Inst{23-5} = label; 2491*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2492*9880d681SAndroid Build Coastguard Worker} 2493*9880d681SAndroid Build Coastguard Worker 2494*9880d681SAndroid Build Coastguard Worker//--- 2495*9880d681SAndroid Build Coastguard Worker// Load/store register offset 2496*9880d681SAndroid Build Coastguard Worker//--- 2497*9880d681SAndroid Build Coastguard Worker 2498*9880d681SAndroid Build Coastguard Workerdef ro_Xindexed8 : ComplexPattern<i64, 4, "SelectAddrModeXRO<8>", []>; 2499*9880d681SAndroid Build Coastguard Workerdef ro_Xindexed16 : ComplexPattern<i64, 4, "SelectAddrModeXRO<16>", []>; 2500*9880d681SAndroid Build Coastguard Workerdef ro_Xindexed32 : ComplexPattern<i64, 4, "SelectAddrModeXRO<32>", []>; 2501*9880d681SAndroid Build Coastguard Workerdef ro_Xindexed64 : ComplexPattern<i64, 4, "SelectAddrModeXRO<64>", []>; 2502*9880d681SAndroid Build Coastguard Workerdef ro_Xindexed128 : ComplexPattern<i64, 4, "SelectAddrModeXRO<128>", []>; 2503*9880d681SAndroid Build Coastguard Worker 2504*9880d681SAndroid Build Coastguard Workerdef ro_Windexed8 : ComplexPattern<i64, 4, "SelectAddrModeWRO<8>", []>; 2505*9880d681SAndroid Build Coastguard Workerdef ro_Windexed16 : ComplexPattern<i64, 4, "SelectAddrModeWRO<16>", []>; 2506*9880d681SAndroid Build Coastguard Workerdef ro_Windexed32 : ComplexPattern<i64, 4, "SelectAddrModeWRO<32>", []>; 2507*9880d681SAndroid Build Coastguard Workerdef ro_Windexed64 : ComplexPattern<i64, 4, "SelectAddrModeWRO<64>", []>; 2508*9880d681SAndroid Build Coastguard Workerdef ro_Windexed128 : ComplexPattern<i64, 4, "SelectAddrModeWRO<128>", []>; 2509*9880d681SAndroid Build Coastguard Worker 2510*9880d681SAndroid Build Coastguard Workerclass MemExtendOperand<string Reg, int Width> : AsmOperandClass { 2511*9880d681SAndroid Build Coastguard Worker let Name = "Mem" # Reg # "Extend" # Width; 2512*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isMem" # Reg # "Extend<" # Width # ">"; 2513*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addMemExtendOperands"; 2514*9880d681SAndroid Build Coastguard Worker let DiagnosticType = "InvalidMemory" # Reg # "Extend" # Width; 2515*9880d681SAndroid Build Coastguard Worker} 2516*9880d681SAndroid Build Coastguard Worker 2517*9880d681SAndroid Build Coastguard Workerdef MemWExtend8Operand : MemExtendOperand<"W", 8> { 2518*9880d681SAndroid Build Coastguard Worker // The address "[x0, x1, lsl #0]" actually maps to the variant which performs 2519*9880d681SAndroid Build Coastguard Worker // the trivial shift. 2520*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addMemExtend8Operands"; 2521*9880d681SAndroid Build Coastguard Worker} 2522*9880d681SAndroid Build Coastguard Workerdef MemWExtend16Operand : MemExtendOperand<"W", 16>; 2523*9880d681SAndroid Build Coastguard Workerdef MemWExtend32Operand : MemExtendOperand<"W", 32>; 2524*9880d681SAndroid Build Coastguard Workerdef MemWExtend64Operand : MemExtendOperand<"W", 64>; 2525*9880d681SAndroid Build Coastguard Workerdef MemWExtend128Operand : MemExtendOperand<"W", 128>; 2526*9880d681SAndroid Build Coastguard Worker 2527*9880d681SAndroid Build Coastguard Workerdef MemXExtend8Operand : MemExtendOperand<"X", 8> { 2528*9880d681SAndroid Build Coastguard Worker // The address "[x0, x1, lsl #0]" actually maps to the variant which performs 2529*9880d681SAndroid Build Coastguard Worker // the trivial shift. 2530*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addMemExtend8Operands"; 2531*9880d681SAndroid Build Coastguard Worker} 2532*9880d681SAndroid Build Coastguard Workerdef MemXExtend16Operand : MemExtendOperand<"X", 16>; 2533*9880d681SAndroid Build Coastguard Workerdef MemXExtend32Operand : MemExtendOperand<"X", 32>; 2534*9880d681SAndroid Build Coastguard Workerdef MemXExtend64Operand : MemExtendOperand<"X", 64>; 2535*9880d681SAndroid Build Coastguard Workerdef MemXExtend128Operand : MemExtendOperand<"X", 128>; 2536*9880d681SAndroid Build Coastguard Worker 2537*9880d681SAndroid Build Coastguard Workerclass ro_extend<AsmOperandClass ParserClass, string Reg, int Width> 2538*9880d681SAndroid Build Coastguard Worker : Operand<i32> { 2539*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = ParserClass; 2540*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printMemExtend<'" # Reg # "', " # Width # ">"; 2541*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeMemExtend"; 2542*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getMemExtendOpValue"; 2543*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i32imm:$signed, i32imm:$doshift); 2544*9880d681SAndroid Build Coastguard Worker} 2545*9880d681SAndroid Build Coastguard Worker 2546*9880d681SAndroid Build Coastguard Workerdef ro_Wextend8 : ro_extend<MemWExtend8Operand, "w", 8>; 2547*9880d681SAndroid Build Coastguard Workerdef ro_Wextend16 : ro_extend<MemWExtend16Operand, "w", 16>; 2548*9880d681SAndroid Build Coastguard Workerdef ro_Wextend32 : ro_extend<MemWExtend32Operand, "w", 32>; 2549*9880d681SAndroid Build Coastguard Workerdef ro_Wextend64 : ro_extend<MemWExtend64Operand, "w", 64>; 2550*9880d681SAndroid Build Coastguard Workerdef ro_Wextend128 : ro_extend<MemWExtend128Operand, "w", 128>; 2551*9880d681SAndroid Build Coastguard Worker 2552*9880d681SAndroid Build Coastguard Workerdef ro_Xextend8 : ro_extend<MemXExtend8Operand, "x", 8>; 2553*9880d681SAndroid Build Coastguard Workerdef ro_Xextend16 : ro_extend<MemXExtend16Operand, "x", 16>; 2554*9880d681SAndroid Build Coastguard Workerdef ro_Xextend32 : ro_extend<MemXExtend32Operand, "x", 32>; 2555*9880d681SAndroid Build Coastguard Workerdef ro_Xextend64 : ro_extend<MemXExtend64Operand, "x", 64>; 2556*9880d681SAndroid Build Coastguard Workerdef ro_Xextend128 : ro_extend<MemXExtend128Operand, "x", 128>; 2557*9880d681SAndroid Build Coastguard Worker 2558*9880d681SAndroid Build Coastguard Workerclass ROAddrMode<ComplexPattern windex, ComplexPattern xindex, 2559*9880d681SAndroid Build Coastguard Worker Operand wextend, Operand xextend> { 2560*9880d681SAndroid Build Coastguard Worker // CodeGen-level pattern covering the entire addressing mode. 2561*9880d681SAndroid Build Coastguard Worker ComplexPattern Wpat = windex; 2562*9880d681SAndroid Build Coastguard Worker ComplexPattern Xpat = xindex; 2563*9880d681SAndroid Build Coastguard Worker 2564*9880d681SAndroid Build Coastguard Worker // Asm-level Operand covering the valid "uxtw #3" style syntax. 2565*9880d681SAndroid Build Coastguard Worker Operand Wext = wextend; 2566*9880d681SAndroid Build Coastguard Worker Operand Xext = xextend; 2567*9880d681SAndroid Build Coastguard Worker} 2568*9880d681SAndroid Build Coastguard Worker 2569*9880d681SAndroid Build Coastguard Workerdef ro8 : ROAddrMode<ro_Windexed8, ro_Xindexed8, ro_Wextend8, ro_Xextend8>; 2570*9880d681SAndroid Build Coastguard Workerdef ro16 : ROAddrMode<ro_Windexed16, ro_Xindexed16, ro_Wextend16, ro_Xextend16>; 2571*9880d681SAndroid Build Coastguard Workerdef ro32 : ROAddrMode<ro_Windexed32, ro_Xindexed32, ro_Wextend32, ro_Xextend32>; 2572*9880d681SAndroid Build Coastguard Workerdef ro64 : ROAddrMode<ro_Windexed64, ro_Xindexed64, ro_Wextend64, ro_Xextend64>; 2573*9880d681SAndroid Build Coastguard Workerdef ro128 : ROAddrMode<ro_Windexed128, ro_Xindexed128, ro_Wextend128, 2574*9880d681SAndroid Build Coastguard Worker ro_Xextend128>; 2575*9880d681SAndroid Build Coastguard Worker 2576*9880d681SAndroid Build Coastguard Workerclass LoadStore8RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2577*9880d681SAndroid Build Coastguard Worker string asm, dag ins, dag outs, list<dag> pat> 2578*9880d681SAndroid Build Coastguard Worker : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { 2579*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2580*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2581*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2582*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2583*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2584*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2585*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2586*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2587*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2588*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2589*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2590*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2591*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2592*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2593*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2594*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2595*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2596*9880d681SAndroid Build Coastguard Worker} 2597*9880d681SAndroid Build Coastguard Worker 2598*9880d681SAndroid Build Coastguard Workerclass ROInstAlias<string asm, RegisterClass regtype, Instruction INST> 2599*9880d681SAndroid Build Coastguard Worker : InstAlias<asm # "\t$Rt, [$Rn, $Rm]", 2600*9880d681SAndroid Build Coastguard Worker (INST regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, 0, 0)>; 2601*9880d681SAndroid Build Coastguard Worker 2602*9880d681SAndroid Build Coastguard Workermulticlass Load8RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2603*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator loadop> { 2604*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2605*9880d681SAndroid Build Coastguard Worker def roW : LoadStore8RO<sz, V, opc, regtype, asm, 2606*9880d681SAndroid Build Coastguard Worker (outs regtype:$Rt), 2607*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend8:$extend), 2608*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2609*9880d681SAndroid Build Coastguard Worker (loadop (ro_Windexed8 GPR64sp:$Rn, GPR32:$Rm, 2610*9880d681SAndroid Build Coastguard Worker ro_Wextend8:$extend)))]>, 2611*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2612*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2613*9880d681SAndroid Build Coastguard Worker } 2614*9880d681SAndroid Build Coastguard Worker 2615*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2616*9880d681SAndroid Build Coastguard Worker def roX : LoadStore8RO<sz, V, opc, regtype, asm, 2617*9880d681SAndroid Build Coastguard Worker (outs regtype:$Rt), 2618*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend8:$extend), 2619*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2620*9880d681SAndroid Build Coastguard Worker (loadop (ro_Xindexed8 GPR64sp:$Rn, GPR64:$Rm, 2621*9880d681SAndroid Build Coastguard Worker ro_Xextend8:$extend)))]>, 2622*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2623*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2624*9880d681SAndroid Build Coastguard Worker } 2625*9880d681SAndroid Build Coastguard Worker 2626*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2627*9880d681SAndroid Build Coastguard Worker} 2628*9880d681SAndroid Build Coastguard Worker 2629*9880d681SAndroid Build Coastguard Workermulticlass Store8RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2630*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator storeop> { 2631*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2632*9880d681SAndroid Build Coastguard Worker def roW : LoadStore8RO<sz, V, opc, regtype, asm, (outs), 2633*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend8:$extend), 2634*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2635*9880d681SAndroid Build Coastguard Worker (ro_Windexed8 GPR64sp:$Rn, GPR32:$Rm, 2636*9880d681SAndroid Build Coastguard Worker ro_Wextend8:$extend))]>, 2637*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2638*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2639*9880d681SAndroid Build Coastguard Worker } 2640*9880d681SAndroid Build Coastguard Worker 2641*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2642*9880d681SAndroid Build Coastguard Worker def roX : LoadStore8RO<sz, V, opc, regtype, asm, (outs), 2643*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend8:$extend), 2644*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2645*9880d681SAndroid Build Coastguard Worker (ro_Xindexed8 GPR64sp:$Rn, GPR64:$Rm, 2646*9880d681SAndroid Build Coastguard Worker ro_Xextend8:$extend))]>, 2647*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2648*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2649*9880d681SAndroid Build Coastguard Worker } 2650*9880d681SAndroid Build Coastguard Worker 2651*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2652*9880d681SAndroid Build Coastguard Worker} 2653*9880d681SAndroid Build Coastguard Worker 2654*9880d681SAndroid Build Coastguard Workerclass LoadStore16RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2655*9880d681SAndroid Build Coastguard Worker string asm, dag ins, dag outs, list<dag> pat> 2656*9880d681SAndroid Build Coastguard Worker : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { 2657*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2658*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2659*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2660*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2661*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2662*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2663*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2664*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2665*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2666*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2667*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2668*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2669*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2670*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2671*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2672*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2673*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2674*9880d681SAndroid Build Coastguard Worker} 2675*9880d681SAndroid Build Coastguard Worker 2676*9880d681SAndroid Build Coastguard Workermulticlass Load16RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2677*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator loadop> { 2678*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2679*9880d681SAndroid Build Coastguard Worker def roW : LoadStore16RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2680*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend16:$extend), 2681*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2682*9880d681SAndroid Build Coastguard Worker (loadop (ro_Windexed16 GPR64sp:$Rn, GPR32:$Rm, 2683*9880d681SAndroid Build Coastguard Worker ro_Wextend16:$extend)))]>, 2684*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2685*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2686*9880d681SAndroid Build Coastguard Worker } 2687*9880d681SAndroid Build Coastguard Worker 2688*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2689*9880d681SAndroid Build Coastguard Worker def roX : LoadStore16RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2690*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend16:$extend), 2691*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2692*9880d681SAndroid Build Coastguard Worker (loadop (ro_Xindexed16 GPR64sp:$Rn, GPR64:$Rm, 2693*9880d681SAndroid Build Coastguard Worker ro_Xextend16:$extend)))]>, 2694*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2695*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2696*9880d681SAndroid Build Coastguard Worker } 2697*9880d681SAndroid Build Coastguard Worker 2698*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2699*9880d681SAndroid Build Coastguard Worker} 2700*9880d681SAndroid Build Coastguard Worker 2701*9880d681SAndroid Build Coastguard Workermulticlass Store16RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2702*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator storeop> { 2703*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2704*9880d681SAndroid Build Coastguard Worker def roW : LoadStore16RO<sz, V, opc, regtype, asm, (outs), 2705*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend16:$extend), 2706*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2707*9880d681SAndroid Build Coastguard Worker (ro_Windexed16 GPR64sp:$Rn, GPR32:$Rm, 2708*9880d681SAndroid Build Coastguard Worker ro_Wextend16:$extend))]>, 2709*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2710*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2711*9880d681SAndroid Build Coastguard Worker } 2712*9880d681SAndroid Build Coastguard Worker 2713*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2714*9880d681SAndroid Build Coastguard Worker def roX : LoadStore16RO<sz, V, opc, regtype, asm, (outs), 2715*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend16:$extend), 2716*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2717*9880d681SAndroid Build Coastguard Worker (ro_Xindexed16 GPR64sp:$Rn, GPR64:$Rm, 2718*9880d681SAndroid Build Coastguard Worker ro_Xextend16:$extend))]>, 2719*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2720*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2721*9880d681SAndroid Build Coastguard Worker } 2722*9880d681SAndroid Build Coastguard Worker 2723*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2724*9880d681SAndroid Build Coastguard Worker} 2725*9880d681SAndroid Build Coastguard Worker 2726*9880d681SAndroid Build Coastguard Workerclass LoadStore32RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2727*9880d681SAndroid Build Coastguard Worker string asm, dag ins, dag outs, list<dag> pat> 2728*9880d681SAndroid Build Coastguard Worker : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { 2729*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2730*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2731*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2732*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2733*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2734*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2735*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2736*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2737*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2738*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2739*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2740*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2741*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2742*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2743*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2744*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2745*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2746*9880d681SAndroid Build Coastguard Worker} 2747*9880d681SAndroid Build Coastguard Worker 2748*9880d681SAndroid Build Coastguard Workermulticlass Load32RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2749*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator loadop> { 2750*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2751*9880d681SAndroid Build Coastguard Worker def roW : LoadStore32RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2752*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend32:$extend), 2753*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2754*9880d681SAndroid Build Coastguard Worker (loadop (ro_Windexed32 GPR64sp:$Rn, GPR32:$Rm, 2755*9880d681SAndroid Build Coastguard Worker ro_Wextend32:$extend)))]>, 2756*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2757*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2758*9880d681SAndroid Build Coastguard Worker } 2759*9880d681SAndroid Build Coastguard Worker 2760*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2761*9880d681SAndroid Build Coastguard Worker def roX : LoadStore32RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2762*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend32:$extend), 2763*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2764*9880d681SAndroid Build Coastguard Worker (loadop (ro_Xindexed32 GPR64sp:$Rn, GPR64:$Rm, 2765*9880d681SAndroid Build Coastguard Worker ro_Xextend32:$extend)))]>, 2766*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2767*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2768*9880d681SAndroid Build Coastguard Worker } 2769*9880d681SAndroid Build Coastguard Worker 2770*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2771*9880d681SAndroid Build Coastguard Worker} 2772*9880d681SAndroid Build Coastguard Worker 2773*9880d681SAndroid Build Coastguard Workermulticlass Store32RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2774*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator storeop> { 2775*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2776*9880d681SAndroid Build Coastguard Worker def roW : LoadStore32RO<sz, V, opc, regtype, asm, (outs), 2777*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend32:$extend), 2778*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2779*9880d681SAndroid Build Coastguard Worker (ro_Windexed32 GPR64sp:$Rn, GPR32:$Rm, 2780*9880d681SAndroid Build Coastguard Worker ro_Wextend32:$extend))]>, 2781*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2782*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2783*9880d681SAndroid Build Coastguard Worker } 2784*9880d681SAndroid Build Coastguard Worker 2785*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10 in 2786*9880d681SAndroid Build Coastguard Worker def roX : LoadStore32RO<sz, V, opc, regtype, asm, (outs), 2787*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend32:$extend), 2788*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2789*9880d681SAndroid Build Coastguard Worker (ro_Xindexed32 GPR64sp:$Rn, GPR64:$Rm, 2790*9880d681SAndroid Build Coastguard Worker ro_Xextend32:$extend))]>, 2791*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2792*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2793*9880d681SAndroid Build Coastguard Worker } 2794*9880d681SAndroid Build Coastguard Worker 2795*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2796*9880d681SAndroid Build Coastguard Worker} 2797*9880d681SAndroid Build Coastguard Worker 2798*9880d681SAndroid Build Coastguard Workerclass LoadStore64RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2799*9880d681SAndroid Build Coastguard Worker string asm, dag ins, dag outs, list<dag> pat> 2800*9880d681SAndroid Build Coastguard Worker : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { 2801*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2802*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2803*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2804*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2805*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2806*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2807*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2808*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2809*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2810*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2811*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2812*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2813*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2814*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2815*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2816*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2817*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2818*9880d681SAndroid Build Coastguard Worker} 2819*9880d681SAndroid Build Coastguard Worker 2820*9880d681SAndroid Build Coastguard Workermulticlass Load64RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2821*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator loadop> { 2822*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2823*9880d681SAndroid Build Coastguard Worker def roW : LoadStore64RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2824*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend), 2825*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2826*9880d681SAndroid Build Coastguard Worker (loadop (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, 2827*9880d681SAndroid Build Coastguard Worker ro_Wextend64:$extend)))]>, 2828*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2829*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2830*9880d681SAndroid Build Coastguard Worker } 2831*9880d681SAndroid Build Coastguard Worker 2832*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2833*9880d681SAndroid Build Coastguard Worker def roX : LoadStore64RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2834*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend), 2835*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2836*9880d681SAndroid Build Coastguard Worker (loadop (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, 2837*9880d681SAndroid Build Coastguard Worker ro_Xextend64:$extend)))]>, 2838*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2839*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2840*9880d681SAndroid Build Coastguard Worker } 2841*9880d681SAndroid Build Coastguard Worker 2842*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2843*9880d681SAndroid Build Coastguard Worker} 2844*9880d681SAndroid Build Coastguard Worker 2845*9880d681SAndroid Build Coastguard Workermulticlass Store64RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2846*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator storeop> { 2847*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 2848*9880d681SAndroid Build Coastguard Worker def roW : LoadStore64RO<sz, V, opc, regtype, asm, (outs), 2849*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend), 2850*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2851*9880d681SAndroid Build Coastguard Worker (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, 2852*9880d681SAndroid Build Coastguard Worker ro_Wextend64:$extend))]>, 2853*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2854*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2855*9880d681SAndroid Build Coastguard Worker } 2856*9880d681SAndroid Build Coastguard Worker 2857*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 2858*9880d681SAndroid Build Coastguard Worker def roX : LoadStore64RO<sz, V, opc, regtype, asm, (outs), 2859*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend), 2860*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2861*9880d681SAndroid Build Coastguard Worker (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, 2862*9880d681SAndroid Build Coastguard Worker ro_Xextend64:$extend))]>, 2863*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2864*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2865*9880d681SAndroid Build Coastguard Worker } 2866*9880d681SAndroid Build Coastguard Worker 2867*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2868*9880d681SAndroid Build Coastguard Worker} 2869*9880d681SAndroid Build Coastguard Worker 2870*9880d681SAndroid Build Coastguard Workerclass LoadStore128RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2871*9880d681SAndroid Build Coastguard Worker string asm, dag ins, dag outs, list<dag> pat> 2872*9880d681SAndroid Build Coastguard Worker : I<ins, outs, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat> { 2873*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2874*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2875*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2876*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2877*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2878*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2879*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2880*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2881*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2882*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2883*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2884*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2885*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2886*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2887*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2888*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2889*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2890*9880d681SAndroid Build Coastguard Worker} 2891*9880d681SAndroid Build Coastguard Worker 2892*9880d681SAndroid Build Coastguard Workermulticlass Load128RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2893*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator loadop> { 2894*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2895*9880d681SAndroid Build Coastguard Worker def roW : LoadStore128RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2896*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR32:$Rm, ro_Wextend128:$extend), 2897*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2898*9880d681SAndroid Build Coastguard Worker (loadop (ro_Windexed128 GPR64sp:$Rn, GPR32:$Rm, 2899*9880d681SAndroid Build Coastguard Worker ro_Wextend128:$extend)))]>, 2900*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2901*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2902*9880d681SAndroid Build Coastguard Worker } 2903*9880d681SAndroid Build Coastguard Worker 2904*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 2905*9880d681SAndroid Build Coastguard Worker def roX : LoadStore128RO<sz, V, opc, regtype, asm, (outs regtype:$Rt), 2906*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64:$Rm, ro_Xextend128:$extend), 2907*9880d681SAndroid Build Coastguard Worker [(set (Ty regtype:$Rt), 2908*9880d681SAndroid Build Coastguard Worker (loadop (ro_Xindexed128 GPR64sp:$Rn, GPR64:$Rm, 2909*9880d681SAndroid Build Coastguard Worker ro_Xextend128:$extend)))]>, 2910*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDIdx, ReadAdrBase]> { 2911*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2912*9880d681SAndroid Build Coastguard Worker } 2913*9880d681SAndroid Build Coastguard Worker 2914*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2915*9880d681SAndroid Build Coastguard Worker} 2916*9880d681SAndroid Build Coastguard Worker 2917*9880d681SAndroid Build Coastguard Workermulticlass Store128RO<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 2918*9880d681SAndroid Build Coastguard Worker string asm, ValueType Ty, SDPatternOperator storeop> { 2919*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 2920*9880d681SAndroid Build Coastguard Worker def roW : LoadStore128RO<sz, V, opc, regtype, asm, (outs), 2921*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend128:$extend), 2922*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2923*9880d681SAndroid Build Coastguard Worker (ro_Windexed128 GPR64sp:$Rn, GPR32:$Rm, 2924*9880d681SAndroid Build Coastguard Worker ro_Wextend128:$extend))]>, 2925*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2926*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2927*9880d681SAndroid Build Coastguard Worker } 2928*9880d681SAndroid Build Coastguard Worker 2929*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 10, mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 2930*9880d681SAndroid Build Coastguard Worker def roX : LoadStore128RO<sz, V, opc, regtype, asm, (outs), 2931*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend128:$extend), 2932*9880d681SAndroid Build Coastguard Worker [(storeop (Ty regtype:$Rt), 2933*9880d681SAndroid Build Coastguard Worker (ro_Xindexed128 GPR64sp:$Rn, GPR64:$Rm, 2934*9880d681SAndroid Build Coastguard Worker ro_Xextend128:$extend))]>, 2935*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTIdx, ReadAdrBase]> { 2936*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2937*9880d681SAndroid Build Coastguard Worker } 2938*9880d681SAndroid Build Coastguard Worker 2939*9880d681SAndroid Build Coastguard Worker def : ROInstAlias<asm, regtype, !cast<Instruction>(NAME # "roX")>; 2940*9880d681SAndroid Build Coastguard Worker} 2941*9880d681SAndroid Build Coastguard Worker 2942*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 2943*9880d681SAndroid Build Coastguard Workerclass BasePrefetchRO<bits<2> sz, bit V, bits<2> opc, dag outs, dag ins, 2944*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pat> 2945*9880d681SAndroid Build Coastguard Worker : I<outs, ins, asm, "\t$Rt, [$Rn, $Rm, $extend]", "", pat>, 2946*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]> { 2947*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 2948*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 2949*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 2950*9880d681SAndroid Build Coastguard Worker bits<2> extend; 2951*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 2952*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 2953*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 2954*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 2955*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 2956*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 2957*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 2958*9880d681SAndroid Build Coastguard Worker let Inst{15} = extend{1}; // sign extend Rm? 2959*9880d681SAndroid Build Coastguard Worker let Inst{14} = 1; 2960*9880d681SAndroid Build Coastguard Worker let Inst{12} = extend{0}; // do shift? 2961*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 2962*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 2963*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 2964*9880d681SAndroid Build Coastguard Worker} 2965*9880d681SAndroid Build Coastguard Worker 2966*9880d681SAndroid Build Coastguard Workermulticlass PrefetchRO<bits<2> sz, bit V, bits<2> opc, string asm> { 2967*9880d681SAndroid Build Coastguard Worker def roW : BasePrefetchRO<sz, V, opc, (outs), 2968*9880d681SAndroid Build Coastguard Worker (ins prfop:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend), 2969*9880d681SAndroid Build Coastguard Worker asm, [(AArch64Prefetch imm:$Rt, 2970*9880d681SAndroid Build Coastguard Worker (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, 2971*9880d681SAndroid Build Coastguard Worker ro_Wextend64:$extend))]> { 2972*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b0; 2973*9880d681SAndroid Build Coastguard Worker } 2974*9880d681SAndroid Build Coastguard Worker 2975*9880d681SAndroid Build Coastguard Worker def roX : BasePrefetchRO<sz, V, opc, (outs), 2976*9880d681SAndroid Build Coastguard Worker (ins prfop:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend), 2977*9880d681SAndroid Build Coastguard Worker asm, [(AArch64Prefetch imm:$Rt, 2978*9880d681SAndroid Build Coastguard Worker (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, 2979*9880d681SAndroid Build Coastguard Worker ro_Xextend64:$extend))]> { 2980*9880d681SAndroid Build Coastguard Worker let Inst{13} = 0b1; 2981*9880d681SAndroid Build Coastguard Worker } 2982*9880d681SAndroid Build Coastguard Worker 2983*9880d681SAndroid Build Coastguard Worker def : InstAlias<"prfm $Rt, [$Rn, $Rm]", 2984*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "roX") prfop:$Rt, 2985*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64:$Rm, 0, 0)>; 2986*9880d681SAndroid Build Coastguard Worker} 2987*9880d681SAndroid Build Coastguard Worker 2988*9880d681SAndroid Build Coastguard Worker//--- 2989*9880d681SAndroid Build Coastguard Worker// Load/store unscaled immediate 2990*9880d681SAndroid Build Coastguard Worker//--- 2991*9880d681SAndroid Build Coastguard Worker 2992*9880d681SAndroid Build Coastguard Workerdef am_unscaled8 : ComplexPattern<i64, 2, "SelectAddrModeUnscaled8", []>; 2993*9880d681SAndroid Build Coastguard Workerdef am_unscaled16 : ComplexPattern<i64, 2, "SelectAddrModeUnscaled16", []>; 2994*9880d681SAndroid Build Coastguard Workerdef am_unscaled32 : ComplexPattern<i64, 2, "SelectAddrModeUnscaled32", []>; 2995*9880d681SAndroid Build Coastguard Workerdef am_unscaled64 : ComplexPattern<i64, 2, "SelectAddrModeUnscaled64", []>; 2996*9880d681SAndroid Build Coastguard Workerdef am_unscaled128 :ComplexPattern<i64, 2, "SelectAddrModeUnscaled128", []>; 2997*9880d681SAndroid Build Coastguard Worker 2998*9880d681SAndroid Build Coastguard Workerclass BaseLoadStoreUnscale<bits<2> sz, bit V, bits<2> opc, dag oops, dag iops, 2999*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> 3000*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, [$Rn, $offset]", "", pattern> { 3001*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3002*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3003*9880d681SAndroid Build Coastguard Worker bits<9> offset; 3004*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 3005*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 3006*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3007*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 3008*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 3009*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 3010*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = offset; 3011*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 3012*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3013*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3014*9880d681SAndroid Build Coastguard Worker 3015*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSignedLdStInstruction"; 3016*9880d681SAndroid Build Coastguard Worker} 3017*9880d681SAndroid Build Coastguard Worker 3018*9880d681SAndroid Build Coastguard Workermulticlass LoadUnscaled<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3019*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> { 3020*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 1 in // try this before LoadUI 3021*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStoreUnscale<sz, V, opc, (outs regtype:$Rt), 3022*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, simm9:$offset), asm, pattern>, 3023*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 3024*9880d681SAndroid Build Coastguard Worker 3025*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 3026*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, GPR64sp:$Rn, 0)>; 3027*9880d681SAndroid Build Coastguard Worker} 3028*9880d681SAndroid Build Coastguard Worker 3029*9880d681SAndroid Build Coastguard Workermulticlass StoreUnscaled<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3030*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> { 3031*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 1 in // try this before StoreUI 3032*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStoreUnscale<sz, V, opc, (outs), 3033*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), 3034*9880d681SAndroid Build Coastguard Worker asm, pattern>, 3035*9880d681SAndroid Build Coastguard Worker Sched<[WriteST]>; 3036*9880d681SAndroid Build Coastguard Worker 3037*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 3038*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, GPR64sp:$Rn, 0)>; 3039*9880d681SAndroid Build Coastguard Worker} 3040*9880d681SAndroid Build Coastguard Worker 3041*9880d681SAndroid Build Coastguard Workermulticlass PrefetchUnscaled<bits<2> sz, bit V, bits<2> opc, string asm, 3042*9880d681SAndroid Build Coastguard Worker list<dag> pat> { 3043*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 3044*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStoreUnscale<sz, V, opc, (outs), 3045*9880d681SAndroid Build Coastguard Worker (ins prfop:$Rt, GPR64sp:$Rn, simm9:$offset), 3046*9880d681SAndroid Build Coastguard Worker asm, pat>, 3047*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 3048*9880d681SAndroid Build Coastguard Worker 3049*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 3050*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") prfop:$Rt, GPR64sp:$Rn, 0)>; 3051*9880d681SAndroid Build Coastguard Worker} 3052*9880d681SAndroid Build Coastguard Worker 3053*9880d681SAndroid Build Coastguard Worker//--- 3054*9880d681SAndroid Build Coastguard Worker// Load/store unscaled immediate, unprivileged 3055*9880d681SAndroid Build Coastguard Worker//--- 3056*9880d681SAndroid Build Coastguard Worker 3057*9880d681SAndroid Build Coastguard Workerclass BaseLoadStoreUnprivileged<bits<2> sz, bit V, bits<2> opc, 3058*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, string asm> 3059*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, [$Rn, $offset]", "", []> { 3060*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3061*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3062*9880d681SAndroid Build Coastguard Worker bits<9> offset; 3063*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 3064*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 3065*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3066*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 3067*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 3068*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 3069*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = offset; 3070*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 3071*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3072*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3073*9880d681SAndroid Build Coastguard Worker 3074*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSignedLdStInstruction"; 3075*9880d681SAndroid Build Coastguard Worker} 3076*9880d681SAndroid Build Coastguard Worker 3077*9880d681SAndroid Build Coastguard Workermulticlass LoadUnprivileged<bits<2> sz, bit V, bits<2> opc, 3078*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> { 3079*9880d681SAndroid Build Coastguard Worker let mayStore = 0, mayLoad = 1, hasSideEffects = 0 in 3080*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStoreUnprivileged<sz, V, opc, (outs regtype:$Rt), 3081*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, simm9:$offset), asm>, 3082*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 3083*9880d681SAndroid Build Coastguard Worker 3084*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 3085*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, GPR64sp:$Rn, 0)>; 3086*9880d681SAndroid Build Coastguard Worker} 3087*9880d681SAndroid Build Coastguard Worker 3088*9880d681SAndroid Build Coastguard Workermulticlass StoreUnprivileged<bits<2> sz, bit V, bits<2> opc, 3089*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> { 3090*9880d681SAndroid Build Coastguard Worker let mayStore = 1, mayLoad = 0, hasSideEffects = 0 in 3091*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStoreUnprivileged<sz, V, opc, (outs), 3092*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), 3093*9880d681SAndroid Build Coastguard Worker asm>, 3094*9880d681SAndroid Build Coastguard Worker Sched<[WriteST]>; 3095*9880d681SAndroid Build Coastguard Worker 3096*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, [$Rn]", 3097*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, GPR64sp:$Rn, 0)>; 3098*9880d681SAndroid Build Coastguard Worker} 3099*9880d681SAndroid Build Coastguard Worker 3100*9880d681SAndroid Build Coastguard Worker//--- 3101*9880d681SAndroid Build Coastguard Worker// Load/store pre-indexed 3102*9880d681SAndroid Build Coastguard Worker//--- 3103*9880d681SAndroid Build Coastguard Worker 3104*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePreIdx<bits<2> sz, bit V, bits<2> opc, dag oops, dag iops, 3105*9880d681SAndroid Build Coastguard Worker string asm, string cstr, list<dag> pat> 3106*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, [$Rn, $offset]!", cstr, pat> { 3107*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3108*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3109*9880d681SAndroid Build Coastguard Worker bits<9> offset; 3110*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 3111*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 3112*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3113*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0; 3114*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 3115*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 3116*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = offset; 3117*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b11; 3118*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3119*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3120*9880d681SAndroid Build Coastguard Worker 3121*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSignedLdStInstruction"; 3122*9880d681SAndroid Build Coastguard Worker} 3123*9880d681SAndroid Build Coastguard Worker 3124*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 3125*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 1 in 3126*9880d681SAndroid Build Coastguard Workerclass LoadPreIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3127*9880d681SAndroid Build Coastguard Worker string asm> 3128*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePreIdx<sz, V, opc, 3129*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, regtype:$Rt), 3130*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, simm9:$offset), asm, 3131*9880d681SAndroid Build Coastguard Worker "$Rn = $wback,@earlyclobber $wback", []>, 3132*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteAdr]>; 3133*9880d681SAndroid Build Coastguard Worker 3134*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 0 in 3135*9880d681SAndroid Build Coastguard Workerclass StorePreIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3136*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator storeop, ValueType Ty> 3137*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePreIdx<sz, V, opc, 3138*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 3139*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), 3140*9880d681SAndroid Build Coastguard Worker asm, "$Rn = $wback,@earlyclobber $wback", 3141*9880d681SAndroid Build Coastguard Worker [(set GPR64sp:$wback, 3142*9880d681SAndroid Build Coastguard Worker (storeop (Ty regtype:$Rt), GPR64sp:$Rn, simm9:$offset))]>, 3143*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdr, WriteST]>; 3144*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 3145*9880d681SAndroid Build Coastguard Worker 3146*9880d681SAndroid Build Coastguard Worker//--- 3147*9880d681SAndroid Build Coastguard Worker// Load/store post-indexed 3148*9880d681SAndroid Build Coastguard Worker//--- 3149*9880d681SAndroid Build Coastguard Worker 3150*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePostIdx<bits<2> sz, bit V, bits<2> opc, dag oops, dag iops, 3151*9880d681SAndroid Build Coastguard Worker string asm, string cstr, list<dag> pat> 3152*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, [$Rn], $offset", cstr, pat> { 3153*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3154*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3155*9880d681SAndroid Build Coastguard Worker bits<9> offset; 3156*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 3157*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b111; 3158*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3159*9880d681SAndroid Build Coastguard Worker let Inst{25-24} = 0b00; 3160*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = opc; 3161*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b0; 3162*9880d681SAndroid Build Coastguard Worker let Inst{20-12} = offset; 3163*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b01; 3164*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3165*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3166*9880d681SAndroid Build Coastguard Worker 3167*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeSignedLdStInstruction"; 3168*9880d681SAndroid Build Coastguard Worker} 3169*9880d681SAndroid Build Coastguard Worker 3170*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 3171*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 1 in 3172*9880d681SAndroid Build Coastguard Workerclass LoadPostIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3173*9880d681SAndroid Build Coastguard Worker string asm> 3174*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePostIdx<sz, V, opc, 3175*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, regtype:$Rt), 3176*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, simm9:$offset), 3177*9880d681SAndroid Build Coastguard Worker asm, "$Rn = $wback,@earlyclobber $wback", []>, 3178*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteI]>; 3179*9880d681SAndroid Build Coastguard Worker 3180*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 0 in 3181*9880d681SAndroid Build Coastguard Workerclass StorePostIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, 3182*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator storeop, ValueType Ty> 3183*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePostIdx<sz, V, opc, 3184*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 3185*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), 3186*9880d681SAndroid Build Coastguard Worker asm, "$Rn = $wback,@earlyclobber $wback", 3187*9880d681SAndroid Build Coastguard Worker [(set GPR64sp:$wback, 3188*9880d681SAndroid Build Coastguard Worker (storeop (Ty regtype:$Rt), GPR64sp:$Rn, simm9:$offset))]>, 3189*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdr, WriteST, ReadAdrBase]>; 3190*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 3191*9880d681SAndroid Build Coastguard Worker 3192*9880d681SAndroid Build Coastguard Worker 3193*9880d681SAndroid Build Coastguard Worker//--- 3194*9880d681SAndroid Build Coastguard Worker// Load/store pair 3195*9880d681SAndroid Build Coastguard Worker//--- 3196*9880d681SAndroid Build Coastguard Worker 3197*9880d681SAndroid Build Coastguard Worker// (indexed, offset) 3198*9880d681SAndroid Build Coastguard Worker 3199*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePairOffset<bits<2> opc, bit V, bit L, dag oops, dag iops, 3200*9880d681SAndroid Build Coastguard Worker string asm> 3201*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, $offset]", "", []> { 3202*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3203*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3204*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3205*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3206*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 3207*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b101; 3208*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3209*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = 0b010; 3210*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 3211*9880d681SAndroid Build Coastguard Worker let Inst{21-15} = offset; 3212*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3213*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3214*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3215*9880d681SAndroid Build Coastguard Worker 3216*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePairLdStInstruction"; 3217*9880d681SAndroid Build Coastguard Worker} 3218*9880d681SAndroid Build Coastguard Worker 3219*9880d681SAndroid Build Coastguard Workermulticlass LoadPairOffset<bits<2> opc, bit V, RegisterClass regtype, 3220*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> { 3221*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayStore = 0, mayLoad = 1 in 3222*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStorePairOffset<opc, V, 1, 3223*9880d681SAndroid Build Coastguard Worker (outs regtype:$Rt, regtype:$Rt2), 3224*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, indextype:$offset), asm>, 3225*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteLDHi]>; 3226*9880d681SAndroid Build Coastguard Worker 3227*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]", 3228*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, regtype:$Rt2, 3229*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 0)>; 3230*9880d681SAndroid Build Coastguard Worker} 3231*9880d681SAndroid Build Coastguard Worker 3232*9880d681SAndroid Build Coastguard Worker 3233*9880d681SAndroid Build Coastguard Workermulticlass StorePairOffset<bits<2> opc, bit V, RegisterClass regtype, 3234*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> { 3235*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in 3236*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStorePairOffset<opc, V, 0, (outs), 3237*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, regtype:$Rt2, 3238*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, indextype:$offset), 3239*9880d681SAndroid Build Coastguard Worker asm>, 3240*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTP]>; 3241*9880d681SAndroid Build Coastguard Worker 3242*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]", 3243*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, regtype:$Rt2, 3244*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 0)>; 3245*9880d681SAndroid Build Coastguard Worker} 3246*9880d681SAndroid Build Coastguard Worker 3247*9880d681SAndroid Build Coastguard Worker// (pre-indexed) 3248*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePairPreIdx<bits<2> opc, bit V, bit L, dag oops, dag iops, 3249*9880d681SAndroid Build Coastguard Worker string asm> 3250*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, $offset]!", "$Rn = $wback,@earlyclobber $wback", []> { 3251*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3252*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3253*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3254*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3255*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 3256*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b101; 3257*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3258*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = 0b011; 3259*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 3260*9880d681SAndroid Build Coastguard Worker let Inst{21-15} = offset; 3261*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3262*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3263*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3264*9880d681SAndroid Build Coastguard Worker 3265*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePairLdStInstruction"; 3266*9880d681SAndroid Build Coastguard Worker} 3267*9880d681SAndroid Build Coastguard Worker 3268*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 3269*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 1 in 3270*9880d681SAndroid Build Coastguard Workerclass LoadPairPreIdx<bits<2> opc, bit V, RegisterClass regtype, 3271*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> 3272*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePairPreIdx<opc, V, 1, 3273*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, regtype:$Rt, regtype:$Rt2), 3274*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, indextype:$offset), asm>, 3275*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteLDHi, WriteAdr]>; 3276*9880d681SAndroid Build Coastguard Worker 3277*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 0 in 3278*9880d681SAndroid Build Coastguard Workerclass StorePairPreIdx<bits<2> opc, bit V, RegisterClass regtype, 3279*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> 3280*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePairPreIdx<opc, V, 0, (outs GPR64sp:$wback), 3281*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, regtype:$Rt2, 3282*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, indextype:$offset), 3283*9880d681SAndroid Build Coastguard Worker asm>, 3284*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdr, WriteSTP]>; 3285*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 3286*9880d681SAndroid Build Coastguard Worker 3287*9880d681SAndroid Build Coastguard Worker// (post-indexed) 3288*9880d681SAndroid Build Coastguard Worker 3289*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePairPostIdx<bits<2> opc, bit V, bit L, dag oops, dag iops, 3290*9880d681SAndroid Build Coastguard Worker string asm> 3291*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn], $offset", "$Rn = $wback,@earlyclobber $wback", []> { 3292*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3293*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3294*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3295*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3296*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 3297*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b101; 3298*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3299*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = 0b001; 3300*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 3301*9880d681SAndroid Build Coastguard Worker let Inst{21-15} = offset; 3302*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3303*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3304*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3305*9880d681SAndroid Build Coastguard Worker 3306*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePairLdStInstruction"; 3307*9880d681SAndroid Build Coastguard Worker} 3308*9880d681SAndroid Build Coastguard Worker 3309*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 3310*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 1 in 3311*9880d681SAndroid Build Coastguard Workerclass LoadPairPostIdx<bits<2> opc, bit V, RegisterClass regtype, 3312*9880d681SAndroid Build Coastguard Worker Operand idxtype, string asm> 3313*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePairPostIdx<opc, V, 1, 3314*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, regtype:$Rt, regtype:$Rt2), 3315*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, idxtype:$offset), asm>, 3316*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteLDHi, WriteAdr]>; 3317*9880d681SAndroid Build Coastguard Worker 3318*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 0 in 3319*9880d681SAndroid Build Coastguard Workerclass StorePairPostIdx<bits<2> opc, bit V, RegisterClass regtype, 3320*9880d681SAndroid Build Coastguard Worker Operand idxtype, string asm> 3321*9880d681SAndroid Build Coastguard Worker : BaseLoadStorePairPostIdx<opc, V, 0, (outs GPR64sp:$wback), 3322*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, regtype:$Rt2, 3323*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, idxtype:$offset), 3324*9880d681SAndroid Build Coastguard Worker asm>, 3325*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdr, WriteSTP]>; 3326*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 3327*9880d681SAndroid Build Coastguard Worker 3328*9880d681SAndroid Build Coastguard Worker// (no-allocate) 3329*9880d681SAndroid Build Coastguard Worker 3330*9880d681SAndroid Build Coastguard Workerclass BaseLoadStorePairNoAlloc<bits<2> opc, bit V, bit L, dag oops, dag iops, 3331*9880d681SAndroid Build Coastguard Worker string asm> 3332*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, $offset]", "", []> { 3333*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3334*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3335*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3336*9880d681SAndroid Build Coastguard Worker bits<7> offset; 3337*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = opc; 3338*9880d681SAndroid Build Coastguard Worker let Inst{29-27} = 0b101; 3339*9880d681SAndroid Build Coastguard Worker let Inst{26} = V; 3340*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = 0b000; 3341*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 3342*9880d681SAndroid Build Coastguard Worker let Inst{21-15} = offset; 3343*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3344*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3345*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3346*9880d681SAndroid Build Coastguard Worker 3347*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodePairLdStInstruction"; 3348*9880d681SAndroid Build Coastguard Worker} 3349*9880d681SAndroid Build Coastguard Worker 3350*9880d681SAndroid Build Coastguard Workermulticlass LoadPairNoAlloc<bits<2> opc, bit V, RegisterClass regtype, 3351*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> { 3352*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayStore = 0, mayLoad = 1 in 3353*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStorePairNoAlloc<opc, V, 1, 3354*9880d681SAndroid Build Coastguard Worker (outs regtype:$Rt, regtype:$Rt2), 3355*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, indextype:$offset), asm>, 3356*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteLDHi]>; 3357*9880d681SAndroid Build Coastguard Worker 3358*9880d681SAndroid Build Coastguard Worker 3359*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]", 3360*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, regtype:$Rt2, 3361*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 0)>; 3362*9880d681SAndroid Build Coastguard Worker} 3363*9880d681SAndroid Build Coastguard Worker 3364*9880d681SAndroid Build Coastguard Workermulticlass StorePairNoAlloc<bits<2> opc, bit V, RegisterClass regtype, 3365*9880d681SAndroid Build Coastguard Worker Operand indextype, string asm> { 3366*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayStore = 1, mayLoad = 0 in 3367*9880d681SAndroid Build Coastguard Worker def i : BaseLoadStorePairNoAlloc<opc, V, 0, (outs), 3368*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, regtype:$Rt2, 3369*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, indextype:$offset), 3370*9880d681SAndroid Build Coastguard Worker asm>, 3371*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTP]>; 3372*9880d681SAndroid Build Coastguard Worker 3373*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]", 3374*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "i") regtype:$Rt, regtype:$Rt2, 3375*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 0)>; 3376*9880d681SAndroid Build Coastguard Worker} 3377*9880d681SAndroid Build Coastguard Worker 3378*9880d681SAndroid Build Coastguard Worker//--- 3379*9880d681SAndroid Build Coastguard Worker// Load/store exclusive 3380*9880d681SAndroid Build Coastguard Worker//--- 3381*9880d681SAndroid Build Coastguard Worker 3382*9880d681SAndroid Build Coastguard Worker// True exclusive operations write to and/or read from the system's exclusive 3383*9880d681SAndroid Build Coastguard Worker// monitors, which as far as a compiler is concerned can be modelled as a 3384*9880d681SAndroid Build Coastguard Worker// random shared memory address. Hence LoadExclusive mayStore. 3385*9880d681SAndroid Build Coastguard Worker// 3386*9880d681SAndroid Build Coastguard Worker// Since these instructions have the undefined register bits set to 1 in 3387*9880d681SAndroid Build Coastguard Worker// their canonical form, we need a post encoder method to set those bits 3388*9880d681SAndroid Build Coastguard Worker// to 1 when encoding these instructions. We do this using the 3389*9880d681SAndroid Build Coastguard Worker// fixLoadStoreExclusive function. This function has template parameters: 3390*9880d681SAndroid Build Coastguard Worker// 3391*9880d681SAndroid Build Coastguard Worker// fixLoadStoreExclusive<int hasRs, int hasRt2> 3392*9880d681SAndroid Build Coastguard Worker// 3393*9880d681SAndroid Build Coastguard Worker// hasRs indicates that the instruction uses the Rs field, so we won't set 3394*9880d681SAndroid Build Coastguard Worker// it to 1 (and the same for Rt2). We don't need template parameters for 3395*9880d681SAndroid Build Coastguard Worker// the other register fields since Rt and Rn are always used. 3396*9880d681SAndroid Build Coastguard Worker// 3397*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, mayLoad = 1, mayStore = 1 in 3398*9880d681SAndroid Build Coastguard Workerclass BaseLoadStoreExclusive<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3399*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, string asm, string operands> 3400*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, "", []> { 3401*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = sz; 3402*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b001000; 3403*9880d681SAndroid Build Coastguard Worker let Inst{23} = o2; 3404*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 3405*9880d681SAndroid Build Coastguard Worker let Inst{21} = o1; 3406*9880d681SAndroid Build Coastguard Worker let Inst{15} = o0; 3407*9880d681SAndroid Build Coastguard Worker 3408*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeExclusiveLdStInstruction"; 3409*9880d681SAndroid Build Coastguard Worker} 3410*9880d681SAndroid Build Coastguard Worker 3411*9880d681SAndroid Build Coastguard Worker// Neither Rs nor Rt2 operands. 3412*9880d681SAndroid Build Coastguard Workerclass LoadStoreExclusiveSimple<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3413*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, string asm, string operands> 3414*9880d681SAndroid Build Coastguard Worker : BaseLoadStoreExclusive<sz, o2, L, o1, o0, oops, iops, asm, operands> { 3415*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3416*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3417*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b11111; 3418*9880d681SAndroid Build Coastguard Worker let Unpredictable{20-16} = 0b11111; 3419*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = 0b11111; 3420*9880d681SAndroid Build Coastguard Worker let Unpredictable{14-10} = 0b11111; 3421*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3422*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3423*9880d681SAndroid Build Coastguard Worker 3424*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "fixLoadStoreExclusive<0,0>"; 3425*9880d681SAndroid Build Coastguard Worker} 3426*9880d681SAndroid Build Coastguard Worker 3427*9880d681SAndroid Build Coastguard Worker// Simple load acquires don't set the exclusive monitor 3428*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0 in 3429*9880d681SAndroid Build Coastguard Workerclass LoadAcquire<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3430*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3431*9880d681SAndroid Build Coastguard Worker : LoadStoreExclusiveSimple<sz, o2, L, o1, o0, (outs regtype:$Rt), 3432*9880d681SAndroid Build Coastguard Worker (ins GPR64sp0:$Rn), asm, "\t$Rt, [$Rn]">, 3433*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 3434*9880d681SAndroid Build Coastguard Worker 3435*9880d681SAndroid Build Coastguard Workerclass LoadExclusive<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3436*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3437*9880d681SAndroid Build Coastguard Worker : LoadStoreExclusiveSimple<sz, o2, L, o1, o0, (outs regtype:$Rt), 3438*9880d681SAndroid Build Coastguard Worker (ins GPR64sp0:$Rn), asm, "\t$Rt, [$Rn]">, 3439*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD]>; 3440*9880d681SAndroid Build Coastguard Worker 3441*9880d681SAndroid Build Coastguard Workerclass LoadExclusivePair<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3442*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3443*9880d681SAndroid Build Coastguard Worker : BaseLoadStoreExclusive<sz, o2, L, o1, o0, 3444*9880d681SAndroid Build Coastguard Worker (outs regtype:$Rt, regtype:$Rt2), 3445*9880d681SAndroid Build Coastguard Worker (ins GPR64sp0:$Rn), asm, 3446*9880d681SAndroid Build Coastguard Worker "\t$Rt, $Rt2, [$Rn]">, 3447*9880d681SAndroid Build Coastguard Worker Sched<[WriteLD, WriteLDHi]> { 3448*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3449*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3450*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3451*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3452*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3453*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3454*9880d681SAndroid Build Coastguard Worker 3455*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "fixLoadStoreExclusive<0,1>"; 3456*9880d681SAndroid Build Coastguard Worker} 3457*9880d681SAndroid Build Coastguard Worker 3458*9880d681SAndroid Build Coastguard Worker// Simple store release operations do not check the exclusive monitor. 3459*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 1 in 3460*9880d681SAndroid Build Coastguard Workerclass StoreRelease<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3461*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3462*9880d681SAndroid Build Coastguard Worker : LoadStoreExclusiveSimple<sz, o2, L, o1, o0, (outs), 3463*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp0:$Rn), 3464*9880d681SAndroid Build Coastguard Worker asm, "\t$Rt, [$Rn]">, 3465*9880d681SAndroid Build Coastguard Worker Sched<[WriteST]>; 3466*9880d681SAndroid Build Coastguard Worker 3467*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 1 in 3468*9880d681SAndroid Build Coastguard Workerclass StoreExclusive<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3469*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3470*9880d681SAndroid Build Coastguard Worker : BaseLoadStoreExclusive<sz, o2, L, o1, o0, (outs GPR32:$Ws), 3471*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, GPR64sp0:$Rn), 3472*9880d681SAndroid Build Coastguard Worker asm, "\t$Ws, $Rt, [$Rn]">, 3473*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTX]> { 3474*9880d681SAndroid Build Coastguard Worker bits<5> Ws; 3475*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3476*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3477*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Ws; 3478*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3479*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3480*9880d681SAndroid Build Coastguard Worker 3481*9880d681SAndroid Build Coastguard Worker let Constraints = "@earlyclobber $Ws"; 3482*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "fixLoadStoreExclusive<1,0>"; 3483*9880d681SAndroid Build Coastguard Worker} 3484*9880d681SAndroid Build Coastguard Worker 3485*9880d681SAndroid Build Coastguard Workerclass StoreExclusivePair<bits<2> sz, bit o2, bit L, bit o1, bit o0, 3486*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm> 3487*9880d681SAndroid Build Coastguard Worker : BaseLoadStoreExclusive<sz, o2, L, o1, o0, 3488*9880d681SAndroid Build Coastguard Worker (outs GPR32:$Ws), 3489*9880d681SAndroid Build Coastguard Worker (ins regtype:$Rt, regtype:$Rt2, GPR64sp0:$Rn), 3490*9880d681SAndroid Build Coastguard Worker asm, "\t$Ws, $Rt, $Rt2, [$Rn]">, 3491*9880d681SAndroid Build Coastguard Worker Sched<[WriteSTX]> { 3492*9880d681SAndroid Build Coastguard Worker bits<5> Ws; 3493*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 3494*9880d681SAndroid Build Coastguard Worker bits<5> Rt2; 3495*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3496*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Ws; 3497*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Rt2; 3498*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3499*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 3500*9880d681SAndroid Build Coastguard Worker 3501*9880d681SAndroid Build Coastguard Worker let Constraints = "@earlyclobber $Ws"; 3502*9880d681SAndroid Build Coastguard Worker} 3503*9880d681SAndroid Build Coastguard Worker 3504*9880d681SAndroid Build Coastguard Worker//--- 3505*9880d681SAndroid Build Coastguard Worker// Exception generation 3506*9880d681SAndroid Build Coastguard Worker//--- 3507*9880d681SAndroid Build Coastguard Worker 3508*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 3509*9880d681SAndroid Build Coastguard Workerclass ExceptionGeneration<bits<3> op1, bits<2> ll, string asm> 3510*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins imm0_65535:$imm), asm, "\t$imm", "", []>, 3511*9880d681SAndroid Build Coastguard Worker Sched<[WriteSys]> { 3512*9880d681SAndroid Build Coastguard Worker bits<16> imm; 3513*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b11010100; 3514*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = op1; 3515*9880d681SAndroid Build Coastguard Worker let Inst{20-5} = imm; 3516*9880d681SAndroid Build Coastguard Worker let Inst{4-2} = 0b000; 3517*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = ll; 3518*9880d681SAndroid Build Coastguard Worker} 3519*9880d681SAndroid Build Coastguard Worker 3520*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasFPARMv8] in { 3521*9880d681SAndroid Build Coastguard Worker 3522*9880d681SAndroid Build Coastguard Worker//--- 3523*9880d681SAndroid Build Coastguard Worker// Floating point to integer conversion 3524*9880d681SAndroid Build Coastguard Worker//--- 3525*9880d681SAndroid Build Coastguard Worker 3526*9880d681SAndroid Build Coastguard Workerclass BaseFPToIntegerUnscaled<bits<2> type, bits<2> rmode, bits<3> opcode, 3527*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterClass dstType, 3528*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> 3529*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn), 3530*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn", "", pattern>, 3531*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCvt]> { 3532*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3533*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3534*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = 0b00; 3535*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 3536*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = type; 3537*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 3538*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = rmode; 3539*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = opcode; 3540*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0; 3541*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3542*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3543*9880d681SAndroid Build Coastguard Worker} 3544*9880d681SAndroid Build Coastguard Worker 3545*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 3546*9880d681SAndroid Build Coastguard Workerclass BaseFPToInteger<bits<2> type, bits<2> rmode, bits<3> opcode, 3547*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterClass dstType, 3548*9880d681SAndroid Build Coastguard Worker Operand immType, string asm, list<dag> pattern> 3549*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn, immType:$scale), 3550*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $scale", "", pattern>, 3551*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCvt]> { 3552*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3553*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3554*9880d681SAndroid Build Coastguard Worker bits<6> scale; 3555*9880d681SAndroid Build Coastguard Worker let Inst{30-29} = 0b00; 3556*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 3557*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = type; 3558*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 3559*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = rmode; 3560*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = opcode; 3561*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = scale; 3562*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3563*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3564*9880d681SAndroid Build Coastguard Worker} 3565*9880d681SAndroid Build Coastguard Worker 3566*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerUnscaled<bits<2> rmode, bits<3> opcode, string asm, 3567*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpN> { 3568*9880d681SAndroid Build Coastguard Worker // Unscaled half-precision to 32-bit 3569*9880d681SAndroid Build Coastguard Worker def UWHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, GPR32, asm, 3570*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN FPR16:$Rn))]> { 3571*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3572*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3573*9880d681SAndroid Build Coastguard Worker } 3574*9880d681SAndroid Build Coastguard Worker 3575*9880d681SAndroid Build Coastguard Worker // Unscaled half-precision to 64-bit 3576*9880d681SAndroid Build Coastguard Worker def UXHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, GPR64, asm, 3577*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN FPR16:$Rn))]> { 3578*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3579*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3580*9880d681SAndroid Build Coastguard Worker } 3581*9880d681SAndroid Build Coastguard Worker 3582*9880d681SAndroid Build Coastguard Worker // Unscaled single-precision to 32-bit 3583*9880d681SAndroid Build Coastguard Worker def UWSr : BaseFPToIntegerUnscaled<0b00, rmode, opcode, FPR32, GPR32, asm, 3584*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN FPR32:$Rn))]> { 3585*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3586*9880d681SAndroid Build Coastguard Worker } 3587*9880d681SAndroid Build Coastguard Worker 3588*9880d681SAndroid Build Coastguard Worker // Unscaled single-precision to 64-bit 3589*9880d681SAndroid Build Coastguard Worker def UXSr : BaseFPToIntegerUnscaled<0b00, rmode, opcode, FPR32, GPR64, asm, 3590*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN FPR32:$Rn))]> { 3591*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3592*9880d681SAndroid Build Coastguard Worker } 3593*9880d681SAndroid Build Coastguard Worker 3594*9880d681SAndroid Build Coastguard Worker // Unscaled double-precision to 32-bit 3595*9880d681SAndroid Build Coastguard Worker def UWDr : BaseFPToIntegerUnscaled<0b01, rmode, opcode, FPR64, GPR32, asm, 3596*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN (f64 FPR64:$Rn)))]> { 3597*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3598*9880d681SAndroid Build Coastguard Worker } 3599*9880d681SAndroid Build Coastguard Worker 3600*9880d681SAndroid Build Coastguard Worker // Unscaled double-precision to 64-bit 3601*9880d681SAndroid Build Coastguard Worker def UXDr : BaseFPToIntegerUnscaled<0b01, rmode, opcode, FPR64, GPR64, asm, 3602*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN (f64 FPR64:$Rn)))]> { 3603*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3604*9880d681SAndroid Build Coastguard Worker } 3605*9880d681SAndroid Build Coastguard Worker} 3606*9880d681SAndroid Build Coastguard Worker 3607*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm, 3608*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpN> { 3609*9880d681SAndroid Build Coastguard Worker // Scaled half-precision to 32-bit 3610*9880d681SAndroid Build Coastguard Worker def SWHri : BaseFPToInteger<0b11, rmode, opcode, FPR16, GPR32, 3611*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i32, asm, 3612*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN (fmul FPR16:$Rn, 3613*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i32:$scale)))]> { 3614*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3615*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3616*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3617*9880d681SAndroid Build Coastguard Worker } 3618*9880d681SAndroid Build Coastguard Worker 3619*9880d681SAndroid Build Coastguard Worker // Scaled half-precision to 64-bit 3620*9880d681SAndroid Build Coastguard Worker def SXHri : BaseFPToInteger<0b11, rmode, opcode, FPR16, GPR64, 3621*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i64, asm, 3622*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN (fmul FPR16:$Rn, 3623*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i64:$scale)))]> { 3624*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3625*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3626*9880d681SAndroid Build Coastguard Worker } 3627*9880d681SAndroid Build Coastguard Worker 3628*9880d681SAndroid Build Coastguard Worker // Scaled single-precision to 32-bit 3629*9880d681SAndroid Build Coastguard Worker def SWSri : BaseFPToInteger<0b00, rmode, opcode, FPR32, GPR32, 3630*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i32, asm, 3631*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN (fmul FPR32:$Rn, 3632*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i32:$scale)))]> { 3633*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3634*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3635*9880d681SAndroid Build Coastguard Worker } 3636*9880d681SAndroid Build Coastguard Worker 3637*9880d681SAndroid Build Coastguard Worker // Scaled single-precision to 64-bit 3638*9880d681SAndroid Build Coastguard Worker def SXSri : BaseFPToInteger<0b00, rmode, opcode, FPR32, GPR64, 3639*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i64, asm, 3640*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN (fmul FPR32:$Rn, 3641*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i64:$scale)))]> { 3642*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3643*9880d681SAndroid Build Coastguard Worker } 3644*9880d681SAndroid Build Coastguard Worker 3645*9880d681SAndroid Build Coastguard Worker // Scaled double-precision to 32-bit 3646*9880d681SAndroid Build Coastguard Worker def SWDri : BaseFPToInteger<0b01, rmode, opcode, FPR64, GPR32, 3647*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i32, asm, 3648*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rd, (OpN (fmul FPR64:$Rn, 3649*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i32:$scale)))]> { 3650*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3651*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3652*9880d681SAndroid Build Coastguard Worker } 3653*9880d681SAndroid Build Coastguard Worker 3654*9880d681SAndroid Build Coastguard Worker // Scaled double-precision to 64-bit 3655*9880d681SAndroid Build Coastguard Worker def SXDri : BaseFPToInteger<0b01, rmode, opcode, FPR64, GPR64, 3656*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i64, asm, 3657*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rd, (OpN (fmul FPR64:$Rn, 3658*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i64:$scale)))]> { 3659*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3660*9880d681SAndroid Build Coastguard Worker } 3661*9880d681SAndroid Build Coastguard Worker} 3662*9880d681SAndroid Build Coastguard Worker 3663*9880d681SAndroid Build Coastguard Worker//--- 3664*9880d681SAndroid Build Coastguard Worker// Integer to floating point conversion 3665*9880d681SAndroid Build Coastguard Worker//--- 3666*9880d681SAndroid Build Coastguard Worker 3667*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 3668*9880d681SAndroid Build Coastguard Workerclass BaseIntegerToFP<bit isUnsigned, 3669*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterClass dstType, 3670*9880d681SAndroid Build Coastguard Worker Operand immType, string asm, list<dag> pattern> 3671*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn, immType:$scale), 3672*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $scale", "", pattern>, 3673*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCvt]> { 3674*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3675*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3676*9880d681SAndroid Build Coastguard Worker bits<6> scale; 3677*9880d681SAndroid Build Coastguard Worker let Inst{30-24} = 0b0011110; 3678*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b00001; 3679*9880d681SAndroid Build Coastguard Worker let Inst{16} = isUnsigned; 3680*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = scale; 3681*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3682*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3683*9880d681SAndroid Build Coastguard Worker} 3684*9880d681SAndroid Build Coastguard Worker 3685*9880d681SAndroid Build Coastguard Workerclass BaseIntegerToFPUnscaled<bit isUnsigned, 3686*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterClass dstType, 3687*9880d681SAndroid Build Coastguard Worker ValueType dvt, string asm, SDNode node> 3688*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn), 3689*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn", "", [(set (dvt dstType:$Rd), (node srcType:$Rn))]>, 3690*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCvt]> { 3691*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3692*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3693*9880d681SAndroid Build Coastguard Worker bits<6> scale; 3694*9880d681SAndroid Build Coastguard Worker let Inst{30-24} = 0b0011110; 3695*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10001; 3696*9880d681SAndroid Build Coastguard Worker let Inst{16} = isUnsigned; 3697*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000000; 3698*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3699*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3700*9880d681SAndroid Build Coastguard Worker} 3701*9880d681SAndroid Build Coastguard Worker 3702*9880d681SAndroid Build Coastguard Workermulticlass IntegerToFP<bit isUnsigned, string asm, SDNode node> { 3703*9880d681SAndroid Build Coastguard Worker // Unscaled 3704*9880d681SAndroid Build Coastguard Worker def UWHri: BaseIntegerToFPUnscaled<isUnsigned, GPR32, FPR16, f16, asm, node> { 3705*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3706*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3707*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3708*9880d681SAndroid Build Coastguard Worker } 3709*9880d681SAndroid Build Coastguard Worker 3710*9880d681SAndroid Build Coastguard Worker def UWSri: BaseIntegerToFPUnscaled<isUnsigned, GPR32, FPR32, f32, asm, node> { 3711*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3712*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3713*9880d681SAndroid Build Coastguard Worker } 3714*9880d681SAndroid Build Coastguard Worker 3715*9880d681SAndroid Build Coastguard Worker def UWDri: BaseIntegerToFPUnscaled<isUnsigned, GPR32, FPR64, f64, asm, node> { 3716*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3717*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3718*9880d681SAndroid Build Coastguard Worker } 3719*9880d681SAndroid Build Coastguard Worker 3720*9880d681SAndroid Build Coastguard Worker def UXHri: BaseIntegerToFPUnscaled<isUnsigned, GPR64, FPR16, f16, asm, node> { 3721*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3722*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3723*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3724*9880d681SAndroid Build Coastguard Worker } 3725*9880d681SAndroid Build Coastguard Worker 3726*9880d681SAndroid Build Coastguard Worker def UXSri: BaseIntegerToFPUnscaled<isUnsigned, GPR64, FPR32, f32, asm, node> { 3727*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3728*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3729*9880d681SAndroid Build Coastguard Worker } 3730*9880d681SAndroid Build Coastguard Worker 3731*9880d681SAndroid Build Coastguard Worker def UXDri: BaseIntegerToFPUnscaled<isUnsigned, GPR64, FPR64, f64, asm, node> { 3732*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3733*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3734*9880d681SAndroid Build Coastguard Worker } 3735*9880d681SAndroid Build Coastguard Worker 3736*9880d681SAndroid Build Coastguard Worker // Scaled 3737*9880d681SAndroid Build Coastguard Worker def SWHri: BaseIntegerToFP<isUnsigned, GPR32, FPR16, fixedpoint_f16_i32, asm, 3738*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, 3739*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR32:$Rn), 3740*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i32:$scale))]> { 3741*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3742*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3743*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3744*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3745*9880d681SAndroid Build Coastguard Worker } 3746*9880d681SAndroid Build Coastguard Worker 3747*9880d681SAndroid Build Coastguard Worker def SWSri: BaseIntegerToFP<isUnsigned, GPR32, FPR32, fixedpoint_f32_i32, asm, 3748*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, 3749*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR32:$Rn), 3750*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i32:$scale))]> { 3751*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3752*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3753*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3754*9880d681SAndroid Build Coastguard Worker } 3755*9880d681SAndroid Build Coastguard Worker 3756*9880d681SAndroid Build Coastguard Worker def SWDri: BaseIntegerToFP<isUnsigned, GPR32, FPR64, fixedpoint_f64_i32, asm, 3757*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, 3758*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR32:$Rn), 3759*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i32:$scale))]> { 3760*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3761*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3762*9880d681SAndroid Build Coastguard Worker let scale{5} = 1; 3763*9880d681SAndroid Build Coastguard Worker } 3764*9880d681SAndroid Build Coastguard Worker 3765*9880d681SAndroid Build Coastguard Worker def SXHri: BaseIntegerToFP<isUnsigned, GPR64, FPR16, fixedpoint_f16_i64, asm, 3766*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, 3767*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR64:$Rn), 3768*9880d681SAndroid Build Coastguard Worker fixedpoint_f16_i64:$scale))]> { 3769*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3770*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3771*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3772*9880d681SAndroid Build Coastguard Worker } 3773*9880d681SAndroid Build Coastguard Worker 3774*9880d681SAndroid Build Coastguard Worker def SXSri: BaseIntegerToFP<isUnsigned, GPR64, FPR32, fixedpoint_f32_i64, asm, 3775*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, 3776*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR64:$Rn), 3777*9880d681SAndroid Build Coastguard Worker fixedpoint_f32_i64:$scale))]> { 3778*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3779*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3780*9880d681SAndroid Build Coastguard Worker } 3781*9880d681SAndroid Build Coastguard Worker 3782*9880d681SAndroid Build Coastguard Worker def SXDri: BaseIntegerToFP<isUnsigned, GPR64, FPR64, fixedpoint_f64_i64, asm, 3783*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, 3784*9880d681SAndroid Build Coastguard Worker (fdiv (node GPR64:$Rn), 3785*9880d681SAndroid Build Coastguard Worker fixedpoint_f64_i64:$scale))]> { 3786*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3787*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3788*9880d681SAndroid Build Coastguard Worker } 3789*9880d681SAndroid Build Coastguard Worker} 3790*9880d681SAndroid Build Coastguard Worker 3791*9880d681SAndroid Build Coastguard Worker//--- 3792*9880d681SAndroid Build Coastguard Worker// Unscaled integer <-> floating point conversion (i.e. FMOV) 3793*9880d681SAndroid Build Coastguard Worker//--- 3794*9880d681SAndroid Build Coastguard Worker 3795*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 3796*9880d681SAndroid Build Coastguard Workerclass BaseUnscaledConversion<bits<2> rmode, bits<3> opcode, 3797*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterClass dstType, 3798*9880d681SAndroid Build Coastguard Worker string asm> 3799*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn), asm, "\t$Rd, $Rn", "", 3800*9880d681SAndroid Build Coastguard Worker // We use COPY_TO_REGCLASS for these bitconvert operations. 3801*9880d681SAndroid Build Coastguard Worker // copyPhysReg() expands the resultant COPY instructions after 3802*9880d681SAndroid Build Coastguard Worker // regalloc is done. This gives greater freedom for the allocator 3803*9880d681SAndroid Build Coastguard Worker // and related passes (coalescing, copy propagation, et. al.) to 3804*9880d681SAndroid Build Coastguard Worker // be more effective. 3805*9880d681SAndroid Build Coastguard Worker [/*(set (dvt dstType:$Rd), (bitconvert (svt srcType:$Rn)))*/]>, 3806*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCopy]> { 3807*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3808*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3809*9880d681SAndroid Build Coastguard Worker let Inst{30-24} = 0b0011110; 3810*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 3811*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = rmode; 3812*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = opcode; 3813*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000000; 3814*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3815*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3816*9880d681SAndroid Build Coastguard Worker} 3817*9880d681SAndroid Build Coastguard Worker 3818*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 3819*9880d681SAndroid Build Coastguard Workerclass BaseUnscaledConversionToHigh<bits<2> rmode, bits<3> opcode, 3820*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, RegisterOperand dstType, string asm, 3821*9880d681SAndroid Build Coastguard Worker string kind> 3822*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn, VectorIndex1:$idx), asm, 3823*9880d681SAndroid Build Coastguard Worker "{\t$Rd"#kind#"$idx, $Rn|"#kind#"\t$Rd$idx, $Rn}", "", []>, 3824*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCopy]> { 3825*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3826*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3827*9880d681SAndroid Build Coastguard Worker let Inst{30-23} = 0b00111101; 3828*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 3829*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = rmode; 3830*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = opcode; 3831*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000000; 3832*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3833*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3834*9880d681SAndroid Build Coastguard Worker 3835*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeFMOVLaneInstruction"; 3836*9880d681SAndroid Build Coastguard Worker} 3837*9880d681SAndroid Build Coastguard Worker 3838*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 3839*9880d681SAndroid Build Coastguard Workerclass BaseUnscaledConversionFromHigh<bits<2> rmode, bits<3> opcode, 3840*9880d681SAndroid Build Coastguard Worker RegisterOperand srcType, RegisterClass dstType, string asm, 3841*9880d681SAndroid Build Coastguard Worker string kind> 3842*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn, VectorIndex1:$idx), asm, 3843*9880d681SAndroid Build Coastguard Worker "{\t$Rd, $Rn"#kind#"$idx|"#kind#"\t$Rd, $Rn$idx}", "", []>, 3844*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCopy]> { 3845*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3846*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3847*9880d681SAndroid Build Coastguard Worker let Inst{30-23} = 0b00111101; 3848*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 3849*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = rmode; 3850*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = opcode; 3851*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000000; 3852*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3853*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3854*9880d681SAndroid Build Coastguard Worker 3855*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeFMOVLaneInstruction"; 3856*9880d681SAndroid Build Coastguard Worker} 3857*9880d681SAndroid Build Coastguard Worker 3858*9880d681SAndroid Build Coastguard Worker 3859*9880d681SAndroid Build Coastguard Workermulticlass UnscaledConversion<string asm> { 3860*9880d681SAndroid Build Coastguard Worker def WHr : BaseUnscaledConversion<0b00, 0b111, GPR32, FPR16, asm> { 3861*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3862*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3863*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3864*9880d681SAndroid Build Coastguard Worker } 3865*9880d681SAndroid Build Coastguard Worker 3866*9880d681SAndroid Build Coastguard Worker def XHr : BaseUnscaledConversion<0b00, 0b111, GPR64, FPR16, asm> { 3867*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3868*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3869*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3870*9880d681SAndroid Build Coastguard Worker } 3871*9880d681SAndroid Build Coastguard Worker 3872*9880d681SAndroid Build Coastguard Worker def WSr : BaseUnscaledConversion<0b00, 0b111, GPR32, FPR32, asm> { 3873*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3874*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3875*9880d681SAndroid Build Coastguard Worker } 3876*9880d681SAndroid Build Coastguard Worker 3877*9880d681SAndroid Build Coastguard Worker def XDr : BaseUnscaledConversion<0b00, 0b111, GPR64, FPR64, asm> { 3878*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3879*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3880*9880d681SAndroid Build Coastguard Worker } 3881*9880d681SAndroid Build Coastguard Worker 3882*9880d681SAndroid Build Coastguard Worker def HWr : BaseUnscaledConversion<0b00, 0b110, FPR16, GPR32, asm> { 3883*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3884*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3885*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3886*9880d681SAndroid Build Coastguard Worker } 3887*9880d681SAndroid Build Coastguard Worker 3888*9880d681SAndroid Build Coastguard Worker def HXr : BaseUnscaledConversion<0b00, 0b110, FPR16, GPR64, asm> { 3889*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3890*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit FPR flag 3891*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3892*9880d681SAndroid Build Coastguard Worker } 3893*9880d681SAndroid Build Coastguard Worker 3894*9880d681SAndroid Build Coastguard Worker def SWr : BaseUnscaledConversion<0b00, 0b110, FPR32, GPR32, asm> { 3895*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; // 32-bit GPR flag 3896*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit FPR flag 3897*9880d681SAndroid Build Coastguard Worker } 3898*9880d681SAndroid Build Coastguard Worker 3899*9880d681SAndroid Build Coastguard Worker def DXr : BaseUnscaledConversion<0b00, 0b110, FPR64, GPR64, asm> { 3900*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; // 64-bit GPR flag 3901*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit FPR flag 3902*9880d681SAndroid Build Coastguard Worker } 3903*9880d681SAndroid Build Coastguard Worker 3904*9880d681SAndroid Build Coastguard Worker def XDHighr : BaseUnscaledConversionToHigh<0b01, 0b111, GPR64, V128, 3905*9880d681SAndroid Build Coastguard Worker asm, ".d"> { 3906*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 3907*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 3908*9880d681SAndroid Build Coastguard Worker } 3909*9880d681SAndroid Build Coastguard Worker 3910*9880d681SAndroid Build Coastguard Worker def DXHighr : BaseUnscaledConversionFromHigh<0b01, 0b110, V128, GPR64, 3911*9880d681SAndroid Build Coastguard Worker asm, ".d"> { 3912*9880d681SAndroid Build Coastguard Worker let Inst{31} = 1; 3913*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 3914*9880d681SAndroid Build Coastguard Worker } 3915*9880d681SAndroid Build Coastguard Worker} 3916*9880d681SAndroid Build Coastguard Worker 3917*9880d681SAndroid Build Coastguard Worker//--- 3918*9880d681SAndroid Build Coastguard Worker// Floating point conversion 3919*9880d681SAndroid Build Coastguard Worker//--- 3920*9880d681SAndroid Build Coastguard Worker 3921*9880d681SAndroid Build Coastguard Workerclass BaseFPConversion<bits<2> type, bits<2> opcode, RegisterClass dstType, 3922*9880d681SAndroid Build Coastguard Worker RegisterClass srcType, string asm, list<dag> pattern> 3923*9880d681SAndroid Build Coastguard Worker : I<(outs dstType:$Rd), (ins srcType:$Rn), asm, "\t$Rd, $Rn", "", pattern>, 3924*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCvt]> { 3925*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3926*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3927*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 3928*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = type; 3929*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10001; 3930*9880d681SAndroid Build Coastguard Worker let Inst{16-15} = opcode; 3931*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = 0b10000; 3932*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3933*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3934*9880d681SAndroid Build Coastguard Worker} 3935*9880d681SAndroid Build Coastguard Worker 3936*9880d681SAndroid Build Coastguard Workermulticlass FPConversion<string asm> { 3937*9880d681SAndroid Build Coastguard Worker // Double-precision to Half-precision 3938*9880d681SAndroid Build Coastguard Worker def HDr : BaseFPConversion<0b01, 0b11, FPR16, FPR64, asm, 3939*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (fround FPR64:$Rn))]>; 3940*9880d681SAndroid Build Coastguard Worker 3941*9880d681SAndroid Build Coastguard Worker // Double-precision to Single-precision 3942*9880d681SAndroid Build Coastguard Worker def SDr : BaseFPConversion<0b01, 0b00, FPR32, FPR64, asm, 3943*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (fround FPR64:$Rn))]>; 3944*9880d681SAndroid Build Coastguard Worker 3945*9880d681SAndroid Build Coastguard Worker // Half-precision to Double-precision 3946*9880d681SAndroid Build Coastguard Worker def DHr : BaseFPConversion<0b11, 0b01, FPR64, FPR16, asm, 3947*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, (fextend FPR16:$Rn))]>; 3948*9880d681SAndroid Build Coastguard Worker 3949*9880d681SAndroid Build Coastguard Worker // Half-precision to Single-precision 3950*9880d681SAndroid Build Coastguard Worker def SHr : BaseFPConversion<0b11, 0b00, FPR32, FPR16, asm, 3951*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (fextend FPR16:$Rn))]>; 3952*9880d681SAndroid Build Coastguard Worker 3953*9880d681SAndroid Build Coastguard Worker // Single-precision to Double-precision 3954*9880d681SAndroid Build Coastguard Worker def DSr : BaseFPConversion<0b00, 0b01, FPR64, FPR32, asm, 3955*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, (fextend FPR32:$Rn))]>; 3956*9880d681SAndroid Build Coastguard Worker 3957*9880d681SAndroid Build Coastguard Worker // Single-precision to Half-precision 3958*9880d681SAndroid Build Coastguard Worker def HSr : BaseFPConversion<0b00, 0b11, FPR16, FPR32, asm, 3959*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (fround FPR32:$Rn))]>; 3960*9880d681SAndroid Build Coastguard Worker} 3961*9880d681SAndroid Build Coastguard Worker 3962*9880d681SAndroid Build Coastguard Worker//--- 3963*9880d681SAndroid Build Coastguard Worker// Single operand floating point data processing 3964*9880d681SAndroid Build Coastguard Worker//--- 3965*9880d681SAndroid Build Coastguard Worker 3966*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 3967*9880d681SAndroid Build Coastguard Workerclass BaseSingleOperandFPData<bits<4> opcode, RegisterClass regtype, 3968*9880d681SAndroid Build Coastguard Worker ValueType vt, string asm, SDPatternOperator node> 3969*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, "\t$Rd, $Rn", "", 3970*9880d681SAndroid Build Coastguard Worker [(set (vt regtype:$Rd), (node (vt regtype:$Rn)))]>, 3971*9880d681SAndroid Build Coastguard Worker Sched<[WriteF]> { 3972*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 3973*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 3974*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 3975*9880d681SAndroid Build Coastguard Worker let Inst{21-19} = 0b100; 3976*9880d681SAndroid Build Coastguard Worker let Inst{18-15} = opcode; 3977*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = 0b10000; 3978*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 3979*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 3980*9880d681SAndroid Build Coastguard Worker} 3981*9880d681SAndroid Build Coastguard Worker 3982*9880d681SAndroid Build Coastguard Workermulticlass SingleOperandFPData<bits<4> opcode, string asm, 3983*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 3984*9880d681SAndroid Build Coastguard Worker def Hr : BaseSingleOperandFPData<opcode, FPR16, f16, asm, node> { 3985*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit size flag 3986*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 3987*9880d681SAndroid Build Coastguard Worker } 3988*9880d681SAndroid Build Coastguard Worker 3989*9880d681SAndroid Build Coastguard Worker def Sr : BaseSingleOperandFPData<opcode, FPR32, f32, asm, node> { 3990*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit size flag 3991*9880d681SAndroid Build Coastguard Worker } 3992*9880d681SAndroid Build Coastguard Worker 3993*9880d681SAndroid Build Coastguard Worker def Dr : BaseSingleOperandFPData<opcode, FPR64, f64, asm, node> { 3994*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit size flag 3995*9880d681SAndroid Build Coastguard Worker } 3996*9880d681SAndroid Build Coastguard Worker} 3997*9880d681SAndroid Build Coastguard Worker 3998*9880d681SAndroid Build Coastguard Worker//--- 3999*9880d681SAndroid Build Coastguard Worker// Two operand floating point data processing 4000*9880d681SAndroid Build Coastguard Worker//--- 4001*9880d681SAndroid Build Coastguard Worker 4002*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4003*9880d681SAndroid Build Coastguard Workerclass BaseTwoOperandFPData<bits<4> opcode, RegisterClass regtype, 4004*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pat> 4005*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), 4006*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm", "", pat>, 4007*9880d681SAndroid Build Coastguard Worker Sched<[WriteF]> { 4008*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4009*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4010*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4011*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4012*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4013*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4014*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 4015*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 4016*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4017*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4018*9880d681SAndroid Build Coastguard Worker} 4019*9880d681SAndroid Build Coastguard Worker 4020*9880d681SAndroid Build Coastguard Workermulticlass TwoOperandFPData<bits<4> opcode, string asm, 4021*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 4022*9880d681SAndroid Build Coastguard Worker def Hrr : BaseTwoOperandFPData<opcode, FPR16, asm, 4023*9880d681SAndroid Build Coastguard Worker [(set (f16 FPR16:$Rd), 4024*9880d681SAndroid Build Coastguard Worker (node (f16 FPR16:$Rn), (f16 FPR16:$Rm)))]> { 4025*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit size flag 4026*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4027*9880d681SAndroid Build Coastguard Worker } 4028*9880d681SAndroid Build Coastguard Worker 4029*9880d681SAndroid Build Coastguard Worker def Srr : BaseTwoOperandFPData<opcode, FPR32, asm, 4030*9880d681SAndroid Build Coastguard Worker [(set (f32 FPR32:$Rd), 4031*9880d681SAndroid Build Coastguard Worker (node (f32 FPR32:$Rn), (f32 FPR32:$Rm)))]> { 4032*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit size flag 4033*9880d681SAndroid Build Coastguard Worker } 4034*9880d681SAndroid Build Coastguard Worker 4035*9880d681SAndroid Build Coastguard Worker def Drr : BaseTwoOperandFPData<opcode, FPR64, asm, 4036*9880d681SAndroid Build Coastguard Worker [(set (f64 FPR64:$Rd), 4037*9880d681SAndroid Build Coastguard Worker (node (f64 FPR64:$Rn), (f64 FPR64:$Rm)))]> { 4038*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit size flag 4039*9880d681SAndroid Build Coastguard Worker } 4040*9880d681SAndroid Build Coastguard Worker} 4041*9880d681SAndroid Build Coastguard Worker 4042*9880d681SAndroid Build Coastguard Workermulticlass TwoOperandFPDataNeg<bits<4> opcode, string asm, SDNode node> { 4043*9880d681SAndroid Build Coastguard Worker def Hrr : BaseTwoOperandFPData<opcode, FPR16, asm, 4044*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (fneg (node FPR16:$Rn, (f16 FPR16:$Rm))))]> { 4045*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit size flag 4046*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4047*9880d681SAndroid Build Coastguard Worker } 4048*9880d681SAndroid Build Coastguard Worker 4049*9880d681SAndroid Build Coastguard Worker def Srr : BaseTwoOperandFPData<opcode, FPR32, asm, 4050*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (fneg (node FPR32:$Rn, (f32 FPR32:$Rm))))]> { 4051*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit size flag 4052*9880d681SAndroid Build Coastguard Worker } 4053*9880d681SAndroid Build Coastguard Worker 4054*9880d681SAndroid Build Coastguard Worker def Drr : BaseTwoOperandFPData<opcode, FPR64, asm, 4055*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, (fneg (node FPR64:$Rn, (f64 FPR64:$Rm))))]> { 4056*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit size flag 4057*9880d681SAndroid Build Coastguard Worker } 4058*9880d681SAndroid Build Coastguard Worker} 4059*9880d681SAndroid Build Coastguard Worker 4060*9880d681SAndroid Build Coastguard Worker 4061*9880d681SAndroid Build Coastguard Worker//--- 4062*9880d681SAndroid Build Coastguard Worker// Three operand floating point data processing 4063*9880d681SAndroid Build Coastguard Worker//--- 4064*9880d681SAndroid Build Coastguard Worker 4065*9880d681SAndroid Build Coastguard Workerclass BaseThreeOperandFPData<bit isNegated, bit isSub, 4066*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm, list<dag> pat> 4067*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, regtype: $Ra), 4068*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $Ra", "", pat>, 4069*9880d681SAndroid Build Coastguard Worker Sched<[WriteFMul]> { 4070*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4071*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4072*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4073*9880d681SAndroid Build Coastguard Worker bits<5> Ra; 4074*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011111; 4075*9880d681SAndroid Build Coastguard Worker let Inst{21} = isNegated; 4076*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4077*9880d681SAndroid Build Coastguard Worker let Inst{15} = isSub; 4078*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = Ra; 4079*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4080*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4081*9880d681SAndroid Build Coastguard Worker} 4082*9880d681SAndroid Build Coastguard Worker 4083*9880d681SAndroid Build Coastguard Workermulticlass ThreeOperandFPData<bit isNegated, bit isSub,string asm, 4084*9880d681SAndroid Build Coastguard Worker SDPatternOperator node> { 4085*9880d681SAndroid Build Coastguard Worker def Hrrr : BaseThreeOperandFPData<isNegated, isSub, FPR16, asm, 4086*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, 4087*9880d681SAndroid Build Coastguard Worker (node (f16 FPR16:$Rn), (f16 FPR16:$Rm), (f16 FPR16:$Ra)))]> { 4088*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; // 16-bit size flag 4089*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4090*9880d681SAndroid Build Coastguard Worker } 4091*9880d681SAndroid Build Coastguard Worker 4092*9880d681SAndroid Build Coastguard Worker def Srrr : BaseThreeOperandFPData<isNegated, isSub, FPR32, asm, 4093*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, 4094*9880d681SAndroid Build Coastguard Worker (node (f32 FPR32:$Rn), (f32 FPR32:$Rm), (f32 FPR32:$Ra)))]> { 4095*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; // 32-bit size flag 4096*9880d681SAndroid Build Coastguard Worker } 4097*9880d681SAndroid Build Coastguard Worker 4098*9880d681SAndroid Build Coastguard Worker def Drrr : BaseThreeOperandFPData<isNegated, isSub, FPR64, asm, 4099*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, 4100*9880d681SAndroid Build Coastguard Worker (node (f64 FPR64:$Rn), (f64 FPR64:$Rm), (f64 FPR64:$Ra)))]> { 4101*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; // 64-bit size flag 4102*9880d681SAndroid Build Coastguard Worker } 4103*9880d681SAndroid Build Coastguard Worker} 4104*9880d681SAndroid Build Coastguard Worker 4105*9880d681SAndroid Build Coastguard Worker//--- 4106*9880d681SAndroid Build Coastguard Worker// Floating point data comparisons 4107*9880d681SAndroid Build Coastguard Worker//--- 4108*9880d681SAndroid Build Coastguard Worker 4109*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4110*9880d681SAndroid Build Coastguard Workerclass BaseOneOperandFPComparison<bit signalAllNans, 4111*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm, 4112*9880d681SAndroid Build Coastguard Worker list<dag> pat> 4113*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rn), asm, "\t$Rn, #0.0", "", pat>, 4114*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCmp]> { 4115*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4116*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4117*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4118*9880d681SAndroid Build Coastguard Worker 4119*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b001000; 4120*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4121*9880d681SAndroid Build Coastguard Worker let Inst{4} = signalAllNans; 4122*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b1000; 4123*9880d681SAndroid Build Coastguard Worker 4124*9880d681SAndroid Build Coastguard Worker // Rm should be 0b00000 canonically, but we need to accept any value. 4125*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "fixOneOperandFPComparison"; 4126*9880d681SAndroid Build Coastguard Worker} 4127*9880d681SAndroid Build Coastguard Worker 4128*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4129*9880d681SAndroid Build Coastguard Workerclass BaseTwoOperandFPComparison<bit signalAllNans, RegisterClass regtype, 4130*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pat> 4131*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rn, regtype:$Rm), asm, "\t$Rn, $Rm", "", pat>, 4132*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCmp]> { 4133*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4134*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4135*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4136*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4137*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4138*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b001000; 4139*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4140*9880d681SAndroid Build Coastguard Worker let Inst{4} = signalAllNans; 4141*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 4142*9880d681SAndroid Build Coastguard Worker} 4143*9880d681SAndroid Build Coastguard Worker 4144*9880d681SAndroid Build Coastguard Workermulticlass FPComparison<bit signalAllNans, string asm, 4145*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 4146*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV] in { 4147*9880d681SAndroid Build Coastguard Worker def Hrr : BaseTwoOperandFPComparison<signalAllNans, FPR16, asm, 4148*9880d681SAndroid Build Coastguard Worker [(OpNode FPR16:$Rn, (f16 FPR16:$Rm)), (implicit NZCV)]> { 4149*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; 4150*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4151*9880d681SAndroid Build Coastguard Worker } 4152*9880d681SAndroid Build Coastguard Worker 4153*9880d681SAndroid Build Coastguard Worker def Hri : BaseOneOperandFPComparison<signalAllNans, FPR16, asm, 4154*9880d681SAndroid Build Coastguard Worker [(OpNode (f16 FPR16:$Rn), fpimm0), (implicit NZCV)]> { 4155*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; 4156*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4157*9880d681SAndroid Build Coastguard Worker } 4158*9880d681SAndroid Build Coastguard Worker 4159*9880d681SAndroid Build Coastguard Worker def Srr : BaseTwoOperandFPComparison<signalAllNans, FPR32, asm, 4160*9880d681SAndroid Build Coastguard Worker [(OpNode FPR32:$Rn, (f32 FPR32:$Rm)), (implicit NZCV)]> { 4161*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; 4162*9880d681SAndroid Build Coastguard Worker } 4163*9880d681SAndroid Build Coastguard Worker 4164*9880d681SAndroid Build Coastguard Worker def Sri : BaseOneOperandFPComparison<signalAllNans, FPR32, asm, 4165*9880d681SAndroid Build Coastguard Worker [(OpNode (f32 FPR32:$Rn), fpimm0), (implicit NZCV)]> { 4166*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; 4167*9880d681SAndroid Build Coastguard Worker } 4168*9880d681SAndroid Build Coastguard Worker 4169*9880d681SAndroid Build Coastguard Worker def Drr : BaseTwoOperandFPComparison<signalAllNans, FPR64, asm, 4170*9880d681SAndroid Build Coastguard Worker [(OpNode FPR64:$Rn, (f64 FPR64:$Rm)), (implicit NZCV)]> { 4171*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; 4172*9880d681SAndroid Build Coastguard Worker } 4173*9880d681SAndroid Build Coastguard Worker 4174*9880d681SAndroid Build Coastguard Worker def Dri : BaseOneOperandFPComparison<signalAllNans, FPR64, asm, 4175*9880d681SAndroid Build Coastguard Worker [(OpNode (f64 FPR64:$Rn), fpimm0), (implicit NZCV)]> { 4176*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; 4177*9880d681SAndroid Build Coastguard Worker } 4178*9880d681SAndroid Build Coastguard Worker } // Defs = [NZCV] 4179*9880d681SAndroid Build Coastguard Worker} 4180*9880d681SAndroid Build Coastguard Worker 4181*9880d681SAndroid Build Coastguard Worker//--- 4182*9880d681SAndroid Build Coastguard Worker// Floating point conditional comparisons 4183*9880d681SAndroid Build Coastguard Worker//--- 4184*9880d681SAndroid Build Coastguard Worker 4185*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4186*9880d681SAndroid Build Coastguard Workerclass BaseFPCondComparison<bit signalAllNans, RegisterClass regtype, 4187*9880d681SAndroid Build Coastguard Worker string mnemonic, list<dag> pat> 4188*9880d681SAndroid Build Coastguard Worker : I<(outs), (ins regtype:$Rn, regtype:$Rm, imm32_0_15:$nzcv, ccode:$cond), 4189*9880d681SAndroid Build Coastguard Worker mnemonic, "\t$Rn, $Rm, $nzcv, $cond", "", pat>, 4190*9880d681SAndroid Build Coastguard Worker Sched<[WriteFCmp]> { 4191*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 4192*9880d681SAndroid Build Coastguard Worker let Defs = [NZCV]; 4193*9880d681SAndroid Build Coastguard Worker 4194*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4195*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4196*9880d681SAndroid Build Coastguard Worker bits<4> nzcv; 4197*9880d681SAndroid Build Coastguard Worker bits<4> cond; 4198*9880d681SAndroid Build Coastguard Worker 4199*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4200*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4201*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4202*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 4203*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b01; 4204*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4205*9880d681SAndroid Build Coastguard Worker let Inst{4} = signalAllNans; 4206*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = nzcv; 4207*9880d681SAndroid Build Coastguard Worker} 4208*9880d681SAndroid Build Coastguard Worker 4209*9880d681SAndroid Build Coastguard Workermulticlass FPCondComparison<bit signalAllNans, string mnemonic, 4210*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 4211*9880d681SAndroid Build Coastguard Worker def Hrr : BaseFPCondComparison<signalAllNans, FPR16, mnemonic, []> { 4212*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; 4213*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4214*9880d681SAndroid Build Coastguard Worker } 4215*9880d681SAndroid Build Coastguard Worker 4216*9880d681SAndroid Build Coastguard Worker def Srr : BaseFPCondComparison<signalAllNans, FPR32, mnemonic, 4217*9880d681SAndroid Build Coastguard Worker [(set NZCV, (OpNode (f32 FPR32:$Rn), (f32 FPR32:$Rm), (i32 imm:$nzcv), 4218*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]> { 4219*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; 4220*9880d681SAndroid Build Coastguard Worker } 4221*9880d681SAndroid Build Coastguard Worker 4222*9880d681SAndroid Build Coastguard Worker def Drr : BaseFPCondComparison<signalAllNans, FPR64, mnemonic, 4223*9880d681SAndroid Build Coastguard Worker [(set NZCV, (OpNode (f64 FPR64:$Rn), (f64 FPR64:$Rm), (i32 imm:$nzcv), 4224*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]> { 4225*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; 4226*9880d681SAndroid Build Coastguard Worker } 4227*9880d681SAndroid Build Coastguard Worker} 4228*9880d681SAndroid Build Coastguard Worker 4229*9880d681SAndroid Build Coastguard Worker//--- 4230*9880d681SAndroid Build Coastguard Worker// Floating point conditional select 4231*9880d681SAndroid Build Coastguard Worker//--- 4232*9880d681SAndroid Build Coastguard Worker 4233*9880d681SAndroid Build Coastguard Workerclass BaseFPCondSelect<RegisterClass regtype, ValueType vt, string asm> 4234*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond), 4235*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $Rm, $cond", "", 4236*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, 4237*9880d681SAndroid Build Coastguard Worker (AArch64csel (vt regtype:$Rn), regtype:$Rm, 4238*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]>, 4239*9880d681SAndroid Build Coastguard Worker Sched<[WriteF]> { 4240*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4241*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4242*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4243*9880d681SAndroid Build Coastguard Worker bits<4> cond; 4244*9880d681SAndroid Build Coastguard Worker 4245*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4246*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4247*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4248*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cond; 4249*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b11; 4250*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4251*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4252*9880d681SAndroid Build Coastguard Worker} 4253*9880d681SAndroid Build Coastguard Worker 4254*9880d681SAndroid Build Coastguard Workermulticlass FPCondSelect<string asm> { 4255*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV] in { 4256*9880d681SAndroid Build Coastguard Worker def Hrrr : BaseFPCondSelect<FPR16, f16, asm> { 4257*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; 4258*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4259*9880d681SAndroid Build Coastguard Worker } 4260*9880d681SAndroid Build Coastguard Worker 4261*9880d681SAndroid Build Coastguard Worker def Srrr : BaseFPCondSelect<FPR32, f32, asm> { 4262*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; 4263*9880d681SAndroid Build Coastguard Worker } 4264*9880d681SAndroid Build Coastguard Worker 4265*9880d681SAndroid Build Coastguard Worker def Drrr : BaseFPCondSelect<FPR64, f64, asm> { 4266*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; 4267*9880d681SAndroid Build Coastguard Worker } 4268*9880d681SAndroid Build Coastguard Worker } // Uses = [NZCV] 4269*9880d681SAndroid Build Coastguard Worker} 4270*9880d681SAndroid Build Coastguard Worker 4271*9880d681SAndroid Build Coastguard Worker//--- 4272*9880d681SAndroid Build Coastguard Worker// Floating move immediate 4273*9880d681SAndroid Build Coastguard Worker//--- 4274*9880d681SAndroid Build Coastguard Worker 4275*9880d681SAndroid Build Coastguard Workerclass BaseFPMoveImmediate<RegisterClass regtype, Operand fpimmtype, string asm> 4276*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins fpimmtype:$imm), asm, "\t$Rd, $imm", "", 4277*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, fpimmtype:$imm)]>, 4278*9880d681SAndroid Build Coastguard Worker Sched<[WriteFImm]> { 4279*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4280*9880d681SAndroid Build Coastguard Worker bits<8> imm; 4281*9880d681SAndroid Build Coastguard Worker let Inst{31-24} = 0b00011110; 4282*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 4283*9880d681SAndroid Build Coastguard Worker let Inst{20-13} = imm; 4284*9880d681SAndroid Build Coastguard Worker let Inst{12-5} = 0b10000000; 4285*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4286*9880d681SAndroid Build Coastguard Worker} 4287*9880d681SAndroid Build Coastguard Worker 4288*9880d681SAndroid Build Coastguard Workermulticlass FPMoveImmediate<string asm> { 4289*9880d681SAndroid Build Coastguard Worker def Hi : BaseFPMoveImmediate<FPR16, fpimm16, asm> { 4290*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b11; 4291*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 4292*9880d681SAndroid Build Coastguard Worker } 4293*9880d681SAndroid Build Coastguard Worker 4294*9880d681SAndroid Build Coastguard Worker def Si : BaseFPMoveImmediate<FPR32, fpimm32, asm> { 4295*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b00; 4296*9880d681SAndroid Build Coastguard Worker } 4297*9880d681SAndroid Build Coastguard Worker 4298*9880d681SAndroid Build Coastguard Worker def Di : BaseFPMoveImmediate<FPR64, fpimm64, asm> { 4299*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = 0b01; 4300*9880d681SAndroid Build Coastguard Worker } 4301*9880d681SAndroid Build Coastguard Worker} 4302*9880d681SAndroid Build Coastguard Worker} // end of 'let Predicates = [HasFPARMv8]' 4303*9880d681SAndroid Build Coastguard Worker 4304*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4305*9880d681SAndroid Build Coastguard Worker// AdvSIMD 4306*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4307*9880d681SAndroid Build Coastguard Worker 4308*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON] in { 4309*9880d681SAndroid Build Coastguard Worker 4310*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4311*9880d681SAndroid Build Coastguard Worker// AdvSIMD three register vector instructions 4312*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4313*9880d681SAndroid Build Coastguard Worker 4314*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4315*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeSameVector<bit Q, bit U, bits<3> size, bits<5> opcode, 4316*9880d681SAndroid Build Coastguard Worker RegisterOperand regtype, string asm, string kind, 4317*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 4318*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, 4319*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # 4320*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn, $Rm|}", "", pattern>, 4321*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4322*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4323*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4324*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4325*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4326*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4327*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4328*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4329*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = size; 4330*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4331*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opcode; 4332*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 4333*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4334*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4335*9880d681SAndroid Build Coastguard Worker} 4336*9880d681SAndroid Build Coastguard Worker 4337*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4338*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeSameVectorTied<bit Q, bit U, bits<3> size, bits<5> opcode, 4339*9880d681SAndroid Build Coastguard Worker RegisterOperand regtype, string asm, string kind, 4340*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 4341*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$dst), (ins regtype:$Rd, regtype:$Rn, regtype:$Rm), asm, 4342*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # 4343*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn, $Rm}", "$Rd = $dst", pattern>, 4344*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4345*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4346*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4347*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 4348*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4349*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4350*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4351*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4352*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = size; 4353*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 4354*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opcode; 4355*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 4356*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4357*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4358*9880d681SAndroid Build Coastguard Worker} 4359*9880d681SAndroid Build Coastguard Worker 4360*9880d681SAndroid Build Coastguard Worker// All operand sizes distinguished in the encoding. 4361*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVector<bit U, bits<5> opc, string asm, 4362*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4363*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVector<0, U, 0b001, opc, V64, 4364*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4365*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 4366*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVector<1, U, 0b001, opc, V128, 4367*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4368*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn), (v16i8 V128:$Rm)))]>; 4369*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDThreeSameVector<0, U, 0b011, opc, V64, 4370*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4371*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 4372*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDThreeSameVector<1, U, 0b011, opc, V128, 4373*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4374*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), (v8i16 V128:$Rm)))]>; 4375*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDThreeSameVector<0, U, 0b101, opc, V64, 4376*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4377*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 4378*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDThreeSameVector<1, U, 0b101, opc, V128, 4379*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4380*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), (v4i32 V128:$Rm)))]>; 4381*9880d681SAndroid Build Coastguard Worker def v2i64 : BaseSIMDThreeSameVector<1, U, 0b111, opc, V128, 4382*9880d681SAndroid Build Coastguard Worker asm, ".2d", 4383*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn), (v2i64 V128:$Rm)))]>; 4384*9880d681SAndroid Build Coastguard Worker} 4385*9880d681SAndroid Build Coastguard Worker 4386*9880d681SAndroid Build Coastguard Worker// As above, but D sized elements unsupported. 4387*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorBHS<bit U, bits<5> opc, string asm, 4388*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4389*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVector<0, U, 0b001, opc, V64, 4390*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4391*9880d681SAndroid Build Coastguard Worker [(set V64:$Rd, (v8i8 (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm))))]>; 4392*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVector<1, U, 0b001, opc, V128, 4393*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4394*9880d681SAndroid Build Coastguard Worker [(set V128:$Rd, (v16i8 (OpNode (v16i8 V128:$Rn), (v16i8 V128:$Rm))))]>; 4395*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDThreeSameVector<0, U, 0b011, opc, V64, 4396*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4397*9880d681SAndroid Build Coastguard Worker [(set V64:$Rd, (v4i16 (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm))))]>; 4398*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDThreeSameVector<1, U, 0b011, opc, V128, 4399*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4400*9880d681SAndroid Build Coastguard Worker [(set V128:$Rd, (v8i16 (OpNode (v8i16 V128:$Rn), (v8i16 V128:$Rm))))]>; 4401*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDThreeSameVector<0, U, 0b101, opc, V64, 4402*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4403*9880d681SAndroid Build Coastguard Worker [(set V64:$Rd, (v2i32 (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm))))]>; 4404*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDThreeSameVector<1, U, 0b101, opc, V128, 4405*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4406*9880d681SAndroid Build Coastguard Worker [(set V128:$Rd, (v4i32 (OpNode (v4i32 V128:$Rn), (v4i32 V128:$Rm))))]>; 4407*9880d681SAndroid Build Coastguard Worker} 4408*9880d681SAndroid Build Coastguard Worker 4409*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorBHSTied<bit U, bits<5> opc, string asm, 4410*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4411*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVectorTied<0, U, 0b001, opc, V64, 4412*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4413*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$dst), 4414*9880d681SAndroid Build Coastguard Worker (OpNode (v8i8 V64:$Rd), (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 4415*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVectorTied<1, U, 0b001, opc, V128, 4416*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4417*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), 4418*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn), (v16i8 V128:$Rm)))]>; 4419*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDThreeSameVectorTied<0, U, 0b011, opc, V64, 4420*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4421*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 4422*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rd), (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 4423*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDThreeSameVectorTied<1, U, 0b011, opc, V128, 4424*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4425*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 4426*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn), (v8i16 V128:$Rm)))]>; 4427*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDThreeSameVectorTied<0, U, 0b101, opc, V64, 4428*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4429*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 4430*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 4431*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDThreeSameVectorTied<1, U, 0b101, opc, V128, 4432*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4433*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 4434*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn), (v4i32 V128:$Rm)))]>; 4435*9880d681SAndroid Build Coastguard Worker} 4436*9880d681SAndroid Build Coastguard Worker 4437*9880d681SAndroid Build Coastguard Worker// As above, but only B sized elements supported. 4438*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorB<bit U, bits<5> opc, string asm, 4439*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4440*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVector<0, U, 0b001, opc, V64, 4441*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4442*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 4443*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVector<1, U, 0b001, opc, V128, 4444*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4445*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), 4446*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rn), (v16i8 V128:$Rm)))]>; 4447*9880d681SAndroid Build Coastguard Worker} 4448*9880d681SAndroid Build Coastguard Worker 4449*9880d681SAndroid Build Coastguard Worker// As above, but only floating point elements supported. 4450*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorFP<bit U, bit S, bits<3> opc, 4451*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator OpNode> { 4452*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4453*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDThreeSameVector<0, U, {S,0b10}, {0b00,opc}, V64, 4454*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4455*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), (OpNode (v4f16 V64:$Rn), (v4f16 V64:$Rm)))]>; 4456*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDThreeSameVector<1, U, {S,0b10}, {0b00,opc}, V128, 4457*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4458*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), (OpNode (v8f16 V128:$Rn), (v8f16 V128:$Rm)))]>; 4459*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4460*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDThreeSameVector<0, U, {S,0b01}, {0b11,opc}, V64, 4461*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4462*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (OpNode (v2f32 V64:$Rn), (v2f32 V64:$Rm)))]>; 4463*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDThreeSameVector<1, U, {S,0b01}, {0b11,opc}, V128, 4464*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4465*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), (OpNode (v4f32 V128:$Rn), (v4f32 V128:$Rm)))]>; 4466*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDThreeSameVector<1, U, {S,0b11}, {0b11,opc}, V128, 4467*9880d681SAndroid Build Coastguard Worker asm, ".2d", 4468*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), (OpNode (v2f64 V128:$Rn), (v2f64 V128:$Rm)))]>; 4469*9880d681SAndroid Build Coastguard Worker} 4470*9880d681SAndroid Build Coastguard Worker 4471*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorFPCmp<bit U, bit S, bits<3> opc, 4472*9880d681SAndroid Build Coastguard Worker string asm, 4473*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4474*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4475*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDThreeSameVector<0, U, {S,0b10}, {0b00,opc}, V64, 4476*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4477*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4f16 V64:$Rn), (v4f16 V64:$Rm)))]>; 4478*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDThreeSameVector<1, U, {S,0b10}, {0b00,opc}, V128, 4479*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4480*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8f16 V128:$Rn), (v8f16 V128:$Rm)))]>; 4481*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4482*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDThreeSameVector<0, U, {S,0b01}, {0b11,opc}, V64, 4483*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4484*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2f32 V64:$Rn), (v2f32 V64:$Rm)))]>; 4485*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDThreeSameVector<1, U, {S,0b01}, {0b11,opc}, V128, 4486*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4487*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4f32 V128:$Rn), (v4f32 V128:$Rm)))]>; 4488*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDThreeSameVector<1, U, {S,0b11}, {0b11,opc}, V128, 4489*9880d681SAndroid Build Coastguard Worker asm, ".2d", 4490*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2f64 V128:$Rn), (v2f64 V128:$Rm)))]>; 4491*9880d681SAndroid Build Coastguard Worker} 4492*9880d681SAndroid Build Coastguard Worker 4493*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorFPTied<bit U, bit S, bits<3> opc, 4494*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator OpNode> { 4495*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4496*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDThreeSameVectorTied<0, U, {S,0b10}, {0b00,opc}, V64, 4497*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4498*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$dst), 4499*9880d681SAndroid Build Coastguard Worker (OpNode (v4f16 V64:$Rd), (v4f16 V64:$Rn), (v4f16 V64:$Rm)))]>; 4500*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDThreeSameVectorTied<1, U, {S,0b10}, {0b00,opc}, V128, 4501*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4502*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$dst), 4503*9880d681SAndroid Build Coastguard Worker (OpNode (v8f16 V128:$Rd), (v8f16 V128:$Rn), (v8f16 V128:$Rm)))]>; 4504*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4505*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDThreeSameVectorTied<0, U, {S,0b01}, {0b11,opc}, V64, 4506*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4507*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$dst), 4508*9880d681SAndroid Build Coastguard Worker (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), (v2f32 V64:$Rm)))]>; 4509*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDThreeSameVectorTied<1, U, {S,0b01}, {0b11,opc}, V128, 4510*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4511*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$dst), 4512*9880d681SAndroid Build Coastguard Worker (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), (v4f32 V128:$Rm)))]>; 4513*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDThreeSameVectorTied<1, U, {S,0b11}, {0b11,opc}, V128, 4514*9880d681SAndroid Build Coastguard Worker asm, ".2d", 4515*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$dst), 4516*9880d681SAndroid Build Coastguard Worker (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn), (v2f64 V128:$Rm)))]>; 4517*9880d681SAndroid Build Coastguard Worker} 4518*9880d681SAndroid Build Coastguard Worker 4519*9880d681SAndroid Build Coastguard Worker// As above, but D and B sized elements unsupported. 4520*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorHS<bit U, bits<5> opc, string asm, 4521*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4522*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDThreeSameVector<0, U, 0b011, opc, V64, 4523*9880d681SAndroid Build Coastguard Worker asm, ".4h", 4524*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 4525*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDThreeSameVector<1, U, 0b011, opc, V128, 4526*9880d681SAndroid Build Coastguard Worker asm, ".8h", 4527*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), (v8i16 V128:$Rm)))]>; 4528*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDThreeSameVector<0, U, 0b101, opc, V64, 4529*9880d681SAndroid Build Coastguard Worker asm, ".2s", 4530*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 4531*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDThreeSameVector<1, U, 0b101, opc, V128, 4532*9880d681SAndroid Build Coastguard Worker asm, ".4s", 4533*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), (v4i32 V128:$Rm)))]>; 4534*9880d681SAndroid Build Coastguard Worker} 4535*9880d681SAndroid Build Coastguard Worker 4536*9880d681SAndroid Build Coastguard Worker// Logical three vector ops share opcode bits, and only use B sized elements. 4537*9880d681SAndroid Build Coastguard Workermulticlass SIMDLogicalThreeVector<bit U, bits<2> size, string asm, 4538*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 4539*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVector<0, U, {size,1}, 0b00011, V64, 4540*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4541*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode V64:$Rn, V64:$Rm))]>; 4542*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVector<1, U, {size,1}, 0b00011, V128, 4543*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4544*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode V128:$Rn, V128:$Rm))]>; 4545*9880d681SAndroid Build Coastguard Worker 4546*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i16 (OpNode V64:$LHS, V64:$RHS)), 4547*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") V64:$LHS, V64:$RHS)>; 4548*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i32 (OpNode V64:$LHS, V64:$RHS)), 4549*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") V64:$LHS, V64:$RHS)>; 4550*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode V64:$LHS, V64:$RHS)), 4551*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") V64:$LHS, V64:$RHS)>; 4552*9880d681SAndroid Build Coastguard Worker 4553*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (OpNode V128:$LHS, V128:$RHS)), 4554*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") V128:$LHS, V128:$RHS)>; 4555*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (OpNode V128:$LHS, V128:$RHS)), 4556*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") V128:$LHS, V128:$RHS)>; 4557*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (OpNode V128:$LHS, V128:$RHS)), 4558*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") V128:$LHS, V128:$RHS)>; 4559*9880d681SAndroid Build Coastguard Worker} 4560*9880d681SAndroid Build Coastguard Worker 4561*9880d681SAndroid Build Coastguard Workermulticlass SIMDLogicalThreeVectorTied<bit U, bits<2> size, 4562*9880d681SAndroid Build Coastguard Worker string asm, SDPatternOperator OpNode> { 4563*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDThreeSameVectorTied<0, U, {size,1}, 0b00011, V64, 4564*9880d681SAndroid Build Coastguard Worker asm, ".8b", 4565*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$dst), 4566*9880d681SAndroid Build Coastguard Worker (OpNode (v8i8 V64:$Rd), (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 4567*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDThreeSameVectorTied<1, U, {size,1}, 0b00011, V128, 4568*9880d681SAndroid Build Coastguard Worker asm, ".16b", 4569*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), 4570*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn), 4571*9880d681SAndroid Build Coastguard Worker (v16i8 V128:$Rm)))]>; 4572*9880d681SAndroid Build Coastguard Worker 4573*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i16 (OpNode (v4i16 V64:$LHS), (v4i16 V64:$MHS), 4574*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$RHS))), 4575*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") 4576*9880d681SAndroid Build Coastguard Worker V64:$LHS, V64:$MHS, V64:$RHS)>; 4577*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i32 (OpNode (v2i32 V64:$LHS), (v2i32 V64:$MHS), 4578*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$RHS))), 4579*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") 4580*9880d681SAndroid Build Coastguard Worker V64:$LHS, V64:$MHS, V64:$RHS)>; 4581*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 V64:$LHS), (v1i64 V64:$MHS), 4582*9880d681SAndroid Build Coastguard Worker (v1i64 V64:$RHS))), 4583*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i8") 4584*9880d681SAndroid Build Coastguard Worker V64:$LHS, V64:$MHS, V64:$RHS)>; 4585*9880d681SAndroid Build Coastguard Worker 4586*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (OpNode (v8i16 V128:$LHS), (v8i16 V128:$MHS), 4587*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$RHS))), 4588*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") 4589*9880d681SAndroid Build Coastguard Worker V128:$LHS, V128:$MHS, V128:$RHS)>; 4590*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (OpNode (v4i32 V128:$LHS), (v4i32 V128:$MHS), 4591*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$RHS))), 4592*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") 4593*9880d681SAndroid Build Coastguard Worker V128:$LHS, V128:$MHS, V128:$RHS)>; 4594*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (OpNode (v2i64 V128:$LHS), (v2i64 V128:$MHS), 4595*9880d681SAndroid Build Coastguard Worker (v2i64 V128:$RHS))), 4596*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") 4597*9880d681SAndroid Build Coastguard Worker V128:$LHS, V128:$MHS, V128:$RHS)>; 4598*9880d681SAndroid Build Coastguard Worker} 4599*9880d681SAndroid Build Coastguard Worker 4600*9880d681SAndroid Build Coastguard Worker 4601*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4602*9880d681SAndroid Build Coastguard Worker// AdvSIMD two register vector instructions. 4603*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4604*9880d681SAndroid Build Coastguard Worker 4605*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4606*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTwoSameVector<bit Q, bit U, bits<2> size, bits<5> opcode, 4607*9880d681SAndroid Build Coastguard Worker bits<2> size2, RegisterOperand regtype, string asm, 4608*9880d681SAndroid Build Coastguard Worker string dstkind, string srckind, list<dag> pattern> 4609*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, 4610*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dstkind # ", $Rn" # srckind # 4611*9880d681SAndroid Build Coastguard Worker "|" # dstkind # "\t$Rd, $Rn}", "", pattern>, 4612*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4613*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4614*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4615*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4616*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4617*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4618*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4619*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 4620*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 4621*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = size2; 4622*9880d681SAndroid Build Coastguard Worker let Inst{18-17} = 0b00; 4623*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 4624*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 4625*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4626*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4627*9880d681SAndroid Build Coastguard Worker} 4628*9880d681SAndroid Build Coastguard Worker 4629*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 4630*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTwoSameVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, 4631*9880d681SAndroid Build Coastguard Worker bits<2> size2, RegisterOperand regtype, 4632*9880d681SAndroid Build Coastguard Worker string asm, string dstkind, string srckind, 4633*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 4634*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$dst), (ins regtype:$Rd, regtype:$Rn), asm, 4635*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dstkind # ", $Rn" # srckind # 4636*9880d681SAndroid Build Coastguard Worker "|" # dstkind # "\t$Rd, $Rn}", "$Rd = $dst", pattern>, 4637*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4638*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4639*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4640*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4641*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4642*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4643*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4644*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 4645*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 4646*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = size2; 4647*9880d681SAndroid Build Coastguard Worker let Inst{18-17} = 0b00; 4648*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 4649*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 4650*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4651*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4652*9880d681SAndroid Build Coastguard Worker} 4653*9880d681SAndroid Build Coastguard Worker 4654*9880d681SAndroid Build Coastguard Worker// Supports B, H, and S element sizes. 4655*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorBHS<bit U, bits<5> opc, string asm, 4656*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4657*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDTwoSameVector<0, U, 0b00, opc, 0b00, V64, 4658*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 4659*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn)))]>; 4660*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDTwoSameVector<1, U, 0b00, opc, 0b00, V128, 4661*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 4662*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn)))]>; 4663*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDTwoSameVector<0, U, 0b01, opc, 0b00, V64, 4664*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4665*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn)))]>; 4666*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDTwoSameVector<1, U, 0b01, opc, 0b00, V128, 4667*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4668*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn)))]>; 4669*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDTwoSameVector<0, U, 0b10, opc, 0b00, V64, 4670*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4671*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn)))]>; 4672*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDTwoSameVector<1, U, 0b10, opc, 0b00, V128, 4673*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4674*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4675*9880d681SAndroid Build Coastguard Worker} 4676*9880d681SAndroid Build Coastguard Worker 4677*9880d681SAndroid Build Coastguard Workerclass BaseSIMDVectorLShiftLongBySize<bit Q, bits<2> size, 4678*9880d681SAndroid Build Coastguard Worker RegisterOperand regtype, string asm, string dstkind, 4679*9880d681SAndroid Build Coastguard Worker string srckind, string amount> 4680*9880d681SAndroid Build Coastguard Worker : I<(outs V128:$Rd), (ins regtype:$Rn), asm, 4681*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dstkind # ", $Rn" # srckind # ", #" # amount # 4682*9880d681SAndroid Build Coastguard Worker "|" # dstkind # "\t$Rd, $Rn, #" # amount # "}", "", []>, 4683*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4684*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4685*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4686*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4687*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4688*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b101110; 4689*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 4690*9880d681SAndroid Build Coastguard Worker let Inst{21-10} = 0b100001001110; 4691*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4692*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4693*9880d681SAndroid Build Coastguard Worker} 4694*9880d681SAndroid Build Coastguard Worker 4695*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftLongBySizeBHS { 4696*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in { 4697*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDVectorLShiftLongBySize<0, 0b00, V64, 4698*9880d681SAndroid Build Coastguard Worker "shll", ".8h", ".8b", "8">; 4699*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDVectorLShiftLongBySize<1, 0b00, V128, 4700*9880d681SAndroid Build Coastguard Worker "shll2", ".8h", ".16b", "8">; 4701*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDVectorLShiftLongBySize<0, 0b01, V64, 4702*9880d681SAndroid Build Coastguard Worker "shll", ".4s", ".4h", "16">; 4703*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDVectorLShiftLongBySize<1, 0b01, V128, 4704*9880d681SAndroid Build Coastguard Worker "shll2", ".4s", ".8h", "16">; 4705*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDVectorLShiftLongBySize<0, 0b10, V64, 4706*9880d681SAndroid Build Coastguard Worker "shll", ".2d", ".2s", "32">; 4707*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDVectorLShiftLongBySize<1, 0b10, V128, 4708*9880d681SAndroid Build Coastguard Worker "shll2", ".2d", ".4s", "32">; 4709*9880d681SAndroid Build Coastguard Worker } 4710*9880d681SAndroid Build Coastguard Worker} 4711*9880d681SAndroid Build Coastguard Worker 4712*9880d681SAndroid Build Coastguard Worker// Supports all element sizes. 4713*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongTwoVector<bit U, bits<5> opc, string asm, 4714*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4715*9880d681SAndroid Build Coastguard Worker def v8i8_v4i16 : BaseSIMDTwoSameVector<0, U, 0b00, opc, 0b00, V64, 4716*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".8b", 4717*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v8i8 V64:$Rn)))]>; 4718*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDTwoSameVector<1, U, 0b00, opc, 0b00, V128, 4719*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".16b", 4720*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v16i8 V128:$Rn)))]>; 4721*9880d681SAndroid Build Coastguard Worker def v4i16_v2i32 : BaseSIMDTwoSameVector<0, U, 0b01, opc, 0b00, V64, 4722*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".4h", 4723*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v4i16 V64:$Rn)))]>; 4724*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDTwoSameVector<1, U, 0b01, opc, 0b00, V128, 4725*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".8h", 4726*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v8i16 V128:$Rn)))]>; 4727*9880d681SAndroid Build Coastguard Worker def v2i32_v1i64 : BaseSIMDTwoSameVector<0, U, 0b10, opc, 0b00, V64, 4728*9880d681SAndroid Build Coastguard Worker asm, ".1d", ".2s", 4729*9880d681SAndroid Build Coastguard Worker [(set (v1i64 V64:$Rd), (OpNode (v2i32 V64:$Rn)))]>; 4730*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDTwoSameVector<1, U, 0b10, opc, 0b00, V128, 4731*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".4s", 4732*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4733*9880d681SAndroid Build Coastguard Worker} 4734*9880d681SAndroid Build Coastguard Worker 4735*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongTwoVectorTied<bit U, bits<5> opc, string asm, 4736*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4737*9880d681SAndroid Build Coastguard Worker def v8i8_v4i16 : BaseSIMDTwoSameVectorTied<0, U, 0b00, opc, 0b00, V64, 4738*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".8b", 4739*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), (OpNode (v4i16 V64:$Rd), 4740*9880d681SAndroid Build Coastguard Worker (v8i8 V64:$Rn)))]>; 4741*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDTwoSameVectorTied<1, U, 0b00, opc, 0b00, V128, 4742*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".16b", 4743*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), (OpNode (v8i16 V128:$Rd), 4744*9880d681SAndroid Build Coastguard Worker (v16i8 V128:$Rn)))]>; 4745*9880d681SAndroid Build Coastguard Worker def v4i16_v2i32 : BaseSIMDTwoSameVectorTied<0, U, 0b01, opc, 0b00, V64, 4746*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".4h", 4747*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), (OpNode (v2i32 V64:$Rd), 4748*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$Rn)))]>; 4749*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDTwoSameVectorTied<1, U, 0b01, opc, 0b00, V128, 4750*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".8h", 4751*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), (OpNode (v4i32 V128:$Rd), 4752*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$Rn)))]>; 4753*9880d681SAndroid Build Coastguard Worker def v2i32_v1i64 : BaseSIMDTwoSameVectorTied<0, U, 0b10, opc, 0b00, V64, 4754*9880d681SAndroid Build Coastguard Worker asm, ".1d", ".2s", 4755*9880d681SAndroid Build Coastguard Worker [(set (v1i64 V64:$dst), (OpNode (v1i64 V64:$Rd), 4756*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rn)))]>; 4757*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDTwoSameVectorTied<1, U, 0b10, opc, 0b00, V128, 4758*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".4s", 4759*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), (OpNode (v2i64 V128:$Rd), 4760*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rn)))]>; 4761*9880d681SAndroid Build Coastguard Worker} 4762*9880d681SAndroid Build Coastguard Worker 4763*9880d681SAndroid Build Coastguard Worker// Supports all element sizes, except 1xD. 4764*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorBHSDTied<bit U, bits<5> opc, string asm, 4765*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4766*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDTwoSameVectorTied<0, U, 0b00, opc, 0b00, V64, 4767*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 4768*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$dst), (OpNode (v8i8 V64:$Rd), (v8i8 V64:$Rn)))]>; 4769*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDTwoSameVectorTied<1, U, 0b00, opc, 0b00, V128, 4770*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 4771*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn)))]>; 4772*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDTwoSameVectorTied<0, U, 0b01, opc, 0b00, V64, 4773*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4774*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), (OpNode (v4i16 V64:$Rd), (v4i16 V64:$Rn)))]>; 4775*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDTwoSameVectorTied<1, U, 0b01, opc, 0b00, V128, 4776*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4777*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), (OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn)))]>; 4778*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDTwoSameVectorTied<0, U, 0b10, opc, 0b00, V64, 4779*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4780*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), (OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn)))]>; 4781*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDTwoSameVectorTied<1, U, 0b10, opc, 0b00, V128, 4782*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4783*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn)))]>; 4784*9880d681SAndroid Build Coastguard Worker def v2i64 : BaseSIMDTwoSameVectorTied<1, U, 0b11, opc, 0b00, V128, 4785*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 4786*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), (OpNode (v2i64 V128:$Rd), (v2i64 V128:$Rn)))]>; 4787*9880d681SAndroid Build Coastguard Worker} 4788*9880d681SAndroid Build Coastguard Worker 4789*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorBHSD<bit U, bits<5> opc, string asm, 4790*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 4791*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDTwoSameVector<0, U, 0b00, opc, 0b00, V64, 4792*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 4793*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn)))]>; 4794*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDTwoSameVector<1, U, 0b00, opc, 0b00, V128, 4795*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 4796*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn)))]>; 4797*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDTwoSameVector<0, U, 0b01, opc, 0b00, V64, 4798*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4799*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn)))]>; 4800*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDTwoSameVector<1, U, 0b01, opc, 0b00, V128, 4801*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4802*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn)))]>; 4803*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDTwoSameVector<0, U, 0b10, opc, 0b00, V64, 4804*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4805*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn)))]>; 4806*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDTwoSameVector<1, U, 0b10, opc, 0b00, V128, 4807*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4808*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4809*9880d681SAndroid Build Coastguard Worker def v2i64 : BaseSIMDTwoSameVector<1, U, 0b11, opc, 0b00, V128, 4810*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 4811*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn)))]>; 4812*9880d681SAndroid Build Coastguard Worker} 4813*9880d681SAndroid Build Coastguard Worker 4814*9880d681SAndroid Build Coastguard Worker 4815*9880d681SAndroid Build Coastguard Worker// Supports only B element sizes. 4816*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorB<bit U, bits<2> size, bits<5> opc, string asm, 4817*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4818*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDTwoSameVector<0, U, size, opc, 0b00, V64, 4819*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 4820*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn)))]>; 4821*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDTwoSameVector<1, U, size, opc, 0b00, V128, 4822*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 4823*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn)))]>; 4824*9880d681SAndroid Build Coastguard Worker 4825*9880d681SAndroid Build Coastguard Worker} 4826*9880d681SAndroid Build Coastguard Worker 4827*9880d681SAndroid Build Coastguard Worker// Supports only B and H element sizes. 4828*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorBH<bit U, bits<5> opc, string asm, 4829*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4830*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDTwoSameVector<0, U, 0b00, opc, 0b00, V64, 4831*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 4832*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode V64:$Rn))]>; 4833*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDTwoSameVector<1, U, 0b00, opc, 0b00, V128, 4834*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 4835*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode V128:$Rn))]>; 4836*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDTwoSameVector<0, U, 0b01, opc, 0b00, V64, 4837*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4838*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode V64:$Rn))]>; 4839*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDTwoSameVector<1, U, 0b01, opc, 0b00, V128, 4840*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4841*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode V128:$Rn))]>; 4842*9880d681SAndroid Build Coastguard Worker} 4843*9880d681SAndroid Build Coastguard Worker 4844*9880d681SAndroid Build Coastguard Worker// Supports only S and D element sizes, uses high bit of the size field 4845*9880d681SAndroid Build Coastguard Worker// as an extra opcode bit. 4846*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorFP<bit U, bit S, bits<5> opc, string asm, 4847*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4848*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4849*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDTwoSameVector<0, U, {S,1}, opc, 0b11, V64, 4850*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4851*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), (OpNode (v4f16 V64:$Rn)))]>; 4852*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b11, V128, 4853*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4854*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), (OpNode (v8f16 V128:$Rn)))]>; 4855*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4856*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDTwoSameVector<0, U, {S,0}, opc, 0b00, V64, 4857*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4858*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (OpNode (v2f32 V64:$Rn)))]>; 4859*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDTwoSameVector<1, U, {S,0}, opc, 0b00, V128, 4860*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4861*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), (OpNode (v4f32 V128:$Rn)))]>; 4862*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b00, V128, 4863*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 4864*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), (OpNode (v2f64 V128:$Rn)))]>; 4865*9880d681SAndroid Build Coastguard Worker} 4866*9880d681SAndroid Build Coastguard Worker 4867*9880d681SAndroid Build Coastguard Worker// Supports only S element size. 4868*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorS<bit U, bit S, bits<5> opc, string asm, 4869*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4870*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDTwoSameVector<0, U, {S,0}, opc, 0b00, V64, 4871*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4872*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn)))]>; 4873*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDTwoSameVector<1, U, {S,0}, opc, 0b00, V128, 4874*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4875*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4876*9880d681SAndroid Build Coastguard Worker} 4877*9880d681SAndroid Build Coastguard Worker 4878*9880d681SAndroid Build Coastguard Worker 4879*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorFPToInt<bit U, bit S, bits<5> opc, string asm, 4880*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4881*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4882*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDTwoSameVector<0, U, {S,1}, opc, 0b11, V64, 4883*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4884*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4f16 V64:$Rn)))]>; 4885*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b11, V128, 4886*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4887*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8f16 V128:$Rn)))]>; 4888*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4889*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDTwoSameVector<0, U, {S,0}, opc, 0b00, V64, 4890*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4891*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2f32 V64:$Rn)))]>; 4892*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDTwoSameVector<1, U, {S,0}, opc, 0b00, V128, 4893*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4894*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4f32 V128:$Rn)))]>; 4895*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b00, V128, 4896*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 4897*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2f64 V128:$Rn)))]>; 4898*9880d681SAndroid Build Coastguard Worker} 4899*9880d681SAndroid Build Coastguard Worker 4900*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoVectorIntToFP<bit U, bit S, bits<5> opc, string asm, 4901*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4902*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 4903*9880d681SAndroid Build Coastguard Worker def v4f16 : BaseSIMDTwoSameVector<0, U, {S,1}, opc, 0b11, V64, 4904*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 4905*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), (OpNode (v4i16 V64:$Rn)))]>; 4906*9880d681SAndroid Build Coastguard Worker def v8f16 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b11, V128, 4907*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 4908*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), (OpNode (v8i16 V128:$Rn)))]>; 4909*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 4910*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDTwoSameVector<0, U, {S,0}, opc, 0b00, V64, 4911*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 4912*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (OpNode (v2i32 V64:$Rn)))]>; 4913*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDTwoSameVector<1, U, {S,0}, opc, 0b00, V128, 4914*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 4915*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4916*9880d681SAndroid Build Coastguard Worker def v2f64 : BaseSIMDTwoSameVector<1, U, {S,1}, opc, 0b00, V128, 4917*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 4918*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), (OpNode (v2i64 V128:$Rn)))]>; 4919*9880d681SAndroid Build Coastguard Worker} 4920*9880d681SAndroid Build Coastguard Worker 4921*9880d681SAndroid Build Coastguard Worker 4922*9880d681SAndroid Build Coastguard Workerclass BaseSIMDMixedTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, 4923*9880d681SAndroid Build Coastguard Worker RegisterOperand inreg, RegisterOperand outreg, 4924*9880d681SAndroid Build Coastguard Worker string asm, string outkind, string inkind, 4925*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 4926*9880d681SAndroid Build Coastguard Worker : I<(outs outreg:$Rd), (ins inreg:$Rn), asm, 4927*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # outkind # ", $Rn" # inkind # 4928*9880d681SAndroid Build Coastguard Worker "|" # outkind # "\t$Rd, $Rn}", "", pattern>, 4929*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4930*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4931*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4932*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4933*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4934*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4935*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4936*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 4937*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10000; 4938*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 4939*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 4940*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4941*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4942*9880d681SAndroid Build Coastguard Worker} 4943*9880d681SAndroid Build Coastguard Worker 4944*9880d681SAndroid Build Coastguard Workerclass BaseSIMDMixedTwoVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, 4945*9880d681SAndroid Build Coastguard Worker RegisterOperand inreg, RegisterOperand outreg, 4946*9880d681SAndroid Build Coastguard Worker string asm, string outkind, string inkind, 4947*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 4948*9880d681SAndroid Build Coastguard Worker : I<(outs outreg:$dst), (ins outreg:$Rd, inreg:$Rn), asm, 4949*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # outkind # ", $Rn" # inkind # 4950*9880d681SAndroid Build Coastguard Worker "|" # outkind # "\t$Rd, $Rn}", "$Rd = $dst", pattern>, 4951*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 4952*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 4953*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 4954*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 4955*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 4956*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 4957*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 4958*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 4959*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10000; 4960*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 4961*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 4962*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 4963*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 4964*9880d681SAndroid Build Coastguard Worker} 4965*9880d681SAndroid Build Coastguard Worker 4966*9880d681SAndroid Build Coastguard Workermulticlass SIMDMixedTwoVector<bit U, bits<5> opc, string asm, 4967*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 4968*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDMixedTwoVector<0, U, 0b00, opc, V128, V64, 4969*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8h", 4970*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i16 V128:$Rn)))]>; 4971*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDMixedTwoVectorTied<1, U, 0b00, opc, V128, V128, 4972*9880d681SAndroid Build Coastguard Worker asm#"2", ".16b", ".8h", []>; 4973*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDMixedTwoVector<0, U, 0b01, opc, V128, V64, 4974*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4s", 4975*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i32 V128:$Rn)))]>; 4976*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDMixedTwoVectorTied<1, U, 0b01, opc, V128, V128, 4977*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".4s", []>; 4978*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDMixedTwoVector<0, U, 0b10, opc, V128, V64, 4979*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2d", 4980*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i64 V128:$Rn)))]>; 4981*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDMixedTwoVectorTied<1, U, 0b10, opc, V128, V128, 4982*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".2d", []>; 4983*9880d681SAndroid Build Coastguard Worker 4984*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v8i8 V64:$Rd), (OpNode (v8i16 V128:$Rn))), 4985*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v16i8") 4986*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 4987*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v4i16 V64:$Rd), (OpNode (v4i32 V128:$Rn))), 4988*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v8i16") 4989*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 4990*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v2i32 V64:$Rd), (OpNode (v2i64 V128:$Rn))), 4991*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v4i32") 4992*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 4993*9880d681SAndroid Build Coastguard Worker} 4994*9880d681SAndroid Build Coastguard Worker 4995*9880d681SAndroid Build Coastguard Workerclass BaseSIMDCmpTwoVector<bit Q, bit U, bits<2> size, bits<2> size2, 4996*9880d681SAndroid Build Coastguard Worker bits<5> opcode, RegisterOperand regtype, string asm, 4997*9880d681SAndroid Build Coastguard Worker string kind, string zero, ValueType dty, 4998*9880d681SAndroid Build Coastguard Worker ValueType sty, SDNode OpNode> 4999*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, 5000*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $Rn" # kind # ", #" # zero # 5001*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn, #" # zero # "}", "", 5002*9880d681SAndroid Build Coastguard Worker [(set (dty regtype:$Rd), (OpNode (sty regtype:$Rn)))]>, 5003*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5004*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5005*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5006*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5007*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 5008*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5009*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 5010*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5011*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 5012*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = size2; 5013*9880d681SAndroid Build Coastguard Worker let Inst{18-17} = 0b00; 5014*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5015*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5016*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5017*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5018*9880d681SAndroid Build Coastguard Worker} 5019*9880d681SAndroid Build Coastguard Worker 5020*9880d681SAndroid Build Coastguard Worker// Comparisons support all element sizes, except 1xD. 5021*9880d681SAndroid Build Coastguard Workermulticlass SIMDCmpTwoVector<bit U, bits<5> opc, string asm, 5022*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 5023*9880d681SAndroid Build Coastguard Worker def v8i8rz : BaseSIMDCmpTwoVector<0, U, 0b00, 0b00, opc, V64, 5024*9880d681SAndroid Build Coastguard Worker asm, ".8b", "0", 5025*9880d681SAndroid Build Coastguard Worker v8i8, v8i8, OpNode>; 5026*9880d681SAndroid Build Coastguard Worker def v16i8rz : BaseSIMDCmpTwoVector<1, U, 0b00, 0b00, opc, V128, 5027*9880d681SAndroid Build Coastguard Worker asm, ".16b", "0", 5028*9880d681SAndroid Build Coastguard Worker v16i8, v16i8, OpNode>; 5029*9880d681SAndroid Build Coastguard Worker def v4i16rz : BaseSIMDCmpTwoVector<0, U, 0b01, 0b00, opc, V64, 5030*9880d681SAndroid Build Coastguard Worker asm, ".4h", "0", 5031*9880d681SAndroid Build Coastguard Worker v4i16, v4i16, OpNode>; 5032*9880d681SAndroid Build Coastguard Worker def v8i16rz : BaseSIMDCmpTwoVector<1, U, 0b01, 0b00, opc, V128, 5033*9880d681SAndroid Build Coastguard Worker asm, ".8h", "0", 5034*9880d681SAndroid Build Coastguard Worker v8i16, v8i16, OpNode>; 5035*9880d681SAndroid Build Coastguard Worker def v2i32rz : BaseSIMDCmpTwoVector<0, U, 0b10, 0b00, opc, V64, 5036*9880d681SAndroid Build Coastguard Worker asm, ".2s", "0", 5037*9880d681SAndroid Build Coastguard Worker v2i32, v2i32, OpNode>; 5038*9880d681SAndroid Build Coastguard Worker def v4i32rz : BaseSIMDCmpTwoVector<1, U, 0b10, 0b00, opc, V128, 5039*9880d681SAndroid Build Coastguard Worker asm, ".4s", "0", 5040*9880d681SAndroid Build Coastguard Worker v4i32, v4i32, OpNode>; 5041*9880d681SAndroid Build Coastguard Worker def v2i64rz : BaseSIMDCmpTwoVector<1, U, 0b11, 0b00, opc, V128, 5042*9880d681SAndroid Build Coastguard Worker asm, ".2d", "0", 5043*9880d681SAndroid Build Coastguard Worker v2i64, v2i64, OpNode>; 5044*9880d681SAndroid Build Coastguard Worker} 5045*9880d681SAndroid Build Coastguard Worker 5046*9880d681SAndroid Build Coastguard Worker// FP Comparisons support only S and D element sizes (and H for v8.2a). 5047*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPCmpTwoVector<bit U, bit S, bits<5> opc, 5048*9880d681SAndroid Build Coastguard Worker string asm, SDNode OpNode> { 5049*9880d681SAndroid Build Coastguard Worker 5050*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5051*9880d681SAndroid Build Coastguard Worker def v4i16rz : BaseSIMDCmpTwoVector<0, U, {S,1}, 0b11, opc, V64, 5052*9880d681SAndroid Build Coastguard Worker asm, ".4h", "0.0", 5053*9880d681SAndroid Build Coastguard Worker v4i16, v4f16, OpNode>; 5054*9880d681SAndroid Build Coastguard Worker def v8i16rz : BaseSIMDCmpTwoVector<1, U, {S,1}, 0b11, opc, V128, 5055*9880d681SAndroid Build Coastguard Worker asm, ".8h", "0.0", 5056*9880d681SAndroid Build Coastguard Worker v8i16, v8f16, OpNode>; 5057*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 5058*9880d681SAndroid Build Coastguard Worker def v2i32rz : BaseSIMDCmpTwoVector<0, U, {S,0}, 0b00, opc, V64, 5059*9880d681SAndroid Build Coastguard Worker asm, ".2s", "0.0", 5060*9880d681SAndroid Build Coastguard Worker v2i32, v2f32, OpNode>; 5061*9880d681SAndroid Build Coastguard Worker def v4i32rz : BaseSIMDCmpTwoVector<1, U, {S,0}, 0b00, opc, V128, 5062*9880d681SAndroid Build Coastguard Worker asm, ".4s", "0.0", 5063*9880d681SAndroid Build Coastguard Worker v4i32, v4f32, OpNode>; 5064*9880d681SAndroid Build Coastguard Worker def v2i64rz : BaseSIMDCmpTwoVector<1, U, {S,1}, 0b00, opc, V128, 5065*9880d681SAndroid Build Coastguard Worker asm, ".2d", "0.0", 5066*9880d681SAndroid Build Coastguard Worker v2i64, v2f64, OpNode>; 5067*9880d681SAndroid Build Coastguard Worker 5068*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5069*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vd.4h, $Vn.4h, #0", 5070*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v4i16rz) V64:$Vd, V64:$Vn), 0>; 5071*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vd.8h, $Vn.8h, #0", 5072*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v8i16rz) V128:$Vd, V128:$Vn), 0>; 5073*9880d681SAndroid Build Coastguard Worker } 5074*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vd.2s, $Vn.2s, #0", 5075*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v2i32rz) V64:$Vd, V64:$Vn), 0>; 5076*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vd.4s, $Vn.4s, #0", 5077*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v4i32rz) V128:$Vd, V128:$Vn), 0>; 5078*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vd.2d, $Vn.2d, #0", 5079*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v2i64rz) V128:$Vd, V128:$Vn), 0>; 5080*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5081*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # ".4h\t$Vd, $Vn, #0", 5082*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v4i16rz) V64:$Vd, V64:$Vn), 0>; 5083*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # ".8h\t$Vd, $Vn, #0", 5084*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v8i16rz) V128:$Vd, V128:$Vn), 0>; 5085*9880d681SAndroid Build Coastguard Worker } 5086*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # ".2s\t$Vd, $Vn, #0", 5087*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v2i32rz) V64:$Vd, V64:$Vn), 0>; 5088*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # ".4s\t$Vd, $Vn, #0", 5089*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v4i32rz) V128:$Vd, V128:$Vn), 0>; 5090*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # ".2d\t$Vd, $Vn, #0", 5091*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v2i64rz) V128:$Vd, V128:$Vn), 0>; 5092*9880d681SAndroid Build Coastguard Worker} 5093*9880d681SAndroid Build Coastguard Worker 5094*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5095*9880d681SAndroid Build Coastguard Workerclass BaseSIMDFPCvtTwoVector<bit Q, bit U, bits<2> size, bits<5> opcode, 5096*9880d681SAndroid Build Coastguard Worker RegisterOperand outtype, RegisterOperand intype, 5097*9880d681SAndroid Build Coastguard Worker string asm, string VdTy, string VnTy, 5098*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5099*9880d681SAndroid Build Coastguard Worker : I<(outs outtype:$Rd), (ins intype:$Rn), asm, 5100*9880d681SAndroid Build Coastguard Worker !strconcat("\t$Rd", VdTy, ", $Rn", VnTy), "", pattern>, 5101*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5102*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5103*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5104*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5105*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 5106*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5107*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 5108*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5109*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10000; 5110*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5111*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5112*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5113*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5114*9880d681SAndroid Build Coastguard Worker} 5115*9880d681SAndroid Build Coastguard Worker 5116*9880d681SAndroid Build Coastguard Workerclass BaseSIMDFPCvtTwoVectorTied<bit Q, bit U, bits<2> size, bits<5> opcode, 5117*9880d681SAndroid Build Coastguard Worker RegisterOperand outtype, RegisterOperand intype, 5118*9880d681SAndroid Build Coastguard Worker string asm, string VdTy, string VnTy, 5119*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5120*9880d681SAndroid Build Coastguard Worker : I<(outs outtype:$dst), (ins outtype:$Rd, intype:$Rn), asm, 5121*9880d681SAndroid Build Coastguard Worker !strconcat("\t$Rd", VdTy, ", $Rn", VnTy), "$Rd = $dst", pattern>, 5122*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5123*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5124*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5125*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5126*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 5127*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5128*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 5129*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5130*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10000; 5131*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5132*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5133*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5134*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5135*9880d681SAndroid Build Coastguard Worker} 5136*9880d681SAndroid Build Coastguard Worker 5137*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPWidenTwoVector<bit U, bit S, bits<5> opc, string asm> { 5138*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDFPCvtTwoVector<0, U, {S,0}, opc, V128, V64, 5139*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", []>; 5140*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDFPCvtTwoVector<1, U, {S,0}, opc, V128, V128, 5141*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", []>; 5142*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDFPCvtTwoVector<0, U, {S,1}, opc, V128, V64, 5143*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", []>; 5144*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDFPCvtTwoVector<1, U, {S,1}, opc, V128, V128, 5145*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", []>; 5146*9880d681SAndroid Build Coastguard Worker} 5147*9880d681SAndroid Build Coastguard Worker 5148*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPNarrowTwoVector<bit U, bit S, bits<5> opc, string asm> { 5149*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDFPCvtTwoVector<0, U, {S,0}, opc, V64, V128, 5150*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4s", []>; 5151*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDFPCvtTwoVectorTied<1, U, {S,0}, opc, V128, V128, 5152*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".4s", []>; 5153*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDFPCvtTwoVector<0, U, {S,1}, opc, V64, V128, 5154*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2d", []>; 5155*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDFPCvtTwoVectorTied<1, U, {S,1}, opc, V128, V128, 5156*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".2d", []>; 5157*9880d681SAndroid Build Coastguard Worker} 5158*9880d681SAndroid Build Coastguard Worker 5159*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPInexactCvtTwoVector<bit U, bit S, bits<5> opc, string asm, 5160*9880d681SAndroid Build Coastguard Worker Intrinsic OpNode> { 5161*9880d681SAndroid Build Coastguard Worker def v2f32 : BaseSIMDFPCvtTwoVector<0, U, {S,1}, opc, V64, V128, 5162*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2d", 5163*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (OpNode (v2f64 V128:$Rn)))]>; 5164*9880d681SAndroid Build Coastguard Worker def v4f32 : BaseSIMDFPCvtTwoVectorTied<1, U, {S,1}, opc, V128, V128, 5165*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".2d", []>; 5166*9880d681SAndroid Build Coastguard Worker 5167*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v2f32 V64:$Rd), (OpNode (v2f64 V128:$Rn))), 5168*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v4f32") 5169*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 5170*9880d681SAndroid Build Coastguard Worker} 5171*9880d681SAndroid Build Coastguard Worker 5172*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5173*9880d681SAndroid Build Coastguard Worker// AdvSIMD three register different-size vector instructions. 5174*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5175*9880d681SAndroid Build Coastguard Worker 5176*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5177*9880d681SAndroid Build Coastguard Workerclass BaseSIMDDifferentThreeVector<bit U, bits<3> size, bits<4> opcode, 5178*9880d681SAndroid Build Coastguard Worker RegisterOperand outtype, RegisterOperand intype1, 5179*9880d681SAndroid Build Coastguard Worker RegisterOperand intype2, string asm, 5180*9880d681SAndroid Build Coastguard Worker string outkind, string inkind1, string inkind2, 5181*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5182*9880d681SAndroid Build Coastguard Worker : I<(outs outtype:$Rd), (ins intype1:$Rn, intype2:$Rm), asm, 5183*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # outkind # ", $Rn" # inkind1 # ", $Rm" # inkind2 # 5184*9880d681SAndroid Build Coastguard Worker "|" # outkind # "\t$Rd, $Rn, $Rm}", "", pattern>, 5185*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5186*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5187*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5188*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5189*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5190*9880d681SAndroid Build Coastguard Worker let Inst{30} = size{0}; 5191*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5192*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 5193*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size{2-1}; 5194*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 5195*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5196*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 5197*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 5198*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5199*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5200*9880d681SAndroid Build Coastguard Worker} 5201*9880d681SAndroid Build Coastguard Worker 5202*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5203*9880d681SAndroid Build Coastguard Workerclass BaseSIMDDifferentThreeVectorTied<bit U, bits<3> size, bits<4> opcode, 5204*9880d681SAndroid Build Coastguard Worker RegisterOperand outtype, RegisterOperand intype1, 5205*9880d681SAndroid Build Coastguard Worker RegisterOperand intype2, string asm, 5206*9880d681SAndroid Build Coastguard Worker string outkind, string inkind1, string inkind2, 5207*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5208*9880d681SAndroid Build Coastguard Worker : I<(outs outtype:$dst), (ins outtype:$Rd, intype1:$Rn, intype2:$Rm), asm, 5209*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # outkind # ", $Rn" # inkind1 # ", $Rm" # inkind2 # 5210*9880d681SAndroid Build Coastguard Worker "|" # outkind # "\t$Rd, $Rn, $Rm}", "$Rd = $dst", pattern>, 5211*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5212*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5213*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5214*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5215*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5216*9880d681SAndroid Build Coastguard Worker let Inst{30} = size{0}; 5217*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5218*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 5219*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size{2-1}; 5220*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 5221*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5222*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 5223*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 5224*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5225*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5226*9880d681SAndroid Build Coastguard Worker} 5227*9880d681SAndroid Build Coastguard Worker 5228*9880d681SAndroid Build Coastguard Worker// FIXME: TableGen doesn't know how to deal with expanded types that also 5229*9880d681SAndroid Build Coastguard Worker// change the element count (in this case, placing the results in 5230*9880d681SAndroid Build Coastguard Worker// the high elements of the result register rather than the low 5231*9880d681SAndroid Build Coastguard Worker// elements). Until that's fixed, we can't code-gen those. 5232*9880d681SAndroid Build Coastguard Workermulticlass SIMDNarrowThreeVectorBHS<bit U, bits<4> opc, string asm, 5233*9880d681SAndroid Build Coastguard Worker Intrinsic IntOp> { 5234*9880d681SAndroid Build Coastguard Worker def v8i16_v8i8 : BaseSIMDDifferentThreeVector<U, 0b000, opc, 5235*9880d681SAndroid Build Coastguard Worker V64, V128, V128, 5236*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8h", ".8h", 5237*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (IntOp (v8i16 V128:$Rn), (v8i16 V128:$Rm)))]>; 5238*9880d681SAndroid Build Coastguard Worker def v8i16_v16i8 : BaseSIMDDifferentThreeVectorTied<U, 0b001, opc, 5239*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5240*9880d681SAndroid Build Coastguard Worker asm#"2", ".16b", ".8h", ".8h", 5241*9880d681SAndroid Build Coastguard Worker []>; 5242*9880d681SAndroid Build Coastguard Worker def v4i32_v4i16 : BaseSIMDDifferentThreeVector<U, 0b010, opc, 5243*9880d681SAndroid Build Coastguard Worker V64, V128, V128, 5244*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4s", ".4s", 5245*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (IntOp (v4i32 V128:$Rn), (v4i32 V128:$Rm)))]>; 5246*9880d681SAndroid Build Coastguard Worker def v4i32_v8i16 : BaseSIMDDifferentThreeVectorTied<U, 0b011, opc, 5247*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5248*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".4s", ".4s", 5249*9880d681SAndroid Build Coastguard Worker []>; 5250*9880d681SAndroid Build Coastguard Worker def v2i64_v2i32 : BaseSIMDDifferentThreeVector<U, 0b100, opc, 5251*9880d681SAndroid Build Coastguard Worker V64, V128, V128, 5252*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2d", ".2d", 5253*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (IntOp (v2i64 V128:$Rn), (v2i64 V128:$Rm)))]>; 5254*9880d681SAndroid Build Coastguard Worker def v2i64_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b101, opc, 5255*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5256*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".2d", ".2d", 5257*9880d681SAndroid Build Coastguard Worker []>; 5258*9880d681SAndroid Build Coastguard Worker 5259*9880d681SAndroid Build Coastguard Worker 5260*9880d681SAndroid Build Coastguard Worker // Patterns for the '2' variants involve INSERT_SUBREG, which you can't put in 5261*9880d681SAndroid Build Coastguard Worker // a version attached to an instruction. 5262*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v8i8 V64:$Rd), (IntOp (v8i16 V128:$Rn), 5263*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$Rm))), 5264*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v8i16_v16i8") 5265*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 5266*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 5267*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v4i16 V64:$Rd), (IntOp (v4i32 V128:$Rn), 5268*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm))), 5269*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v4i32_v8i16") 5270*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 5271*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 5272*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v2i32 V64:$Rd), (IntOp (v2i64 V128:$Rn), 5273*9880d681SAndroid Build Coastguard Worker (v2i64 V128:$Rm))), 5274*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v2i64_v4i32") 5275*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 5276*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 5277*9880d681SAndroid Build Coastguard Worker} 5278*9880d681SAndroid Build Coastguard Worker 5279*9880d681SAndroid Build Coastguard Workermulticlass SIMDDifferentThreeVectorBD<bit U, bits<4> opc, string asm, 5280*9880d681SAndroid Build Coastguard Worker Intrinsic IntOp> { 5281*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDDifferentThreeVector<U, 0b000, opc, 5282*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5283*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8b", ".8b", 5284*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (IntOp (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 5285*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDDifferentThreeVector<U, 0b001, opc, 5286*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5287*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", ".16b", []>; 5288*9880d681SAndroid Build Coastguard Worker let Predicates = [HasCrypto] in { 5289*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDDifferentThreeVector<U, 0b110, opc, 5290*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5291*9880d681SAndroid Build Coastguard Worker asm, ".1q", ".1d", ".1d", []>; 5292*9880d681SAndroid Build Coastguard Worker def v2i64 : BaseSIMDDifferentThreeVector<U, 0b111, opc, 5293*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5294*9880d681SAndroid Build Coastguard Worker asm#"2", ".1q", ".2d", ".2d", []>; 5295*9880d681SAndroid Build Coastguard Worker } 5296*9880d681SAndroid Build Coastguard Worker 5297*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (IntOp (v8i8 (extract_high_v16i8 V128:$Rn)), 5298*9880d681SAndroid Build Coastguard Worker (v8i8 (extract_high_v16i8 V128:$Rm)))), 5299*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v16i8") V128:$Rn, V128:$Rm)>; 5300*9880d681SAndroid Build Coastguard Worker} 5301*9880d681SAndroid Build Coastguard Worker 5302*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorHS<bit U, bits<4> opc, string asm, 5303*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5304*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b010, opc, 5305*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5306*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5307*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 5308*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b011, opc, 5309*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5310*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5311*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (extract_high_v8i16 V128:$Rn), 5312*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))]>; 5313*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b100, opc, 5314*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5315*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5316*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 5317*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b101, opc, 5318*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5319*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5320*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (extract_high_v4i32 V128:$Rn), 5321*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))]>; 5322*9880d681SAndroid Build Coastguard Worker} 5323*9880d681SAndroid Build Coastguard Worker 5324*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorBHSabdl<bit U, bits<4> opc, string asm, 5325*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5326*9880d681SAndroid Build Coastguard Worker def v8i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b000, opc, 5327*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5328*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8b", ".8b", 5329*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), 5330*9880d681SAndroid Build Coastguard Worker (zext (v8i8 (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm)))))]>; 5331*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b001, opc, 5332*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5333*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", ".16b", 5334*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), 5335*9880d681SAndroid Build Coastguard Worker (zext (v8i8 (OpNode (extract_high_v16i8 V128:$Rn), 5336*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rm)))))]>; 5337*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b010, opc, 5338*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5339*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5340*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 5341*9880d681SAndroid Build Coastguard Worker (zext (v4i16 (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm)))))]>; 5342*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b011, opc, 5343*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5344*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5345*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 5346*9880d681SAndroid Build Coastguard Worker (zext (v4i16 (OpNode (extract_high_v8i16 V128:$Rn), 5347*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))))]>; 5348*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b100, opc, 5349*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5350*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5351*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 5352*9880d681SAndroid Build Coastguard Worker (zext (v2i32 (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm)))))]>; 5353*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b101, opc, 5354*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5355*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5356*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 5357*9880d681SAndroid Build Coastguard Worker (zext (v2i32 (OpNode (extract_high_v4i32 V128:$Rn), 5358*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))))]>; 5359*9880d681SAndroid Build Coastguard Worker} 5360*9880d681SAndroid Build Coastguard Worker 5361*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorTiedBHSabal<bit U, bits<4> opc, 5362*9880d681SAndroid Build Coastguard Worker string asm, 5363*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5364*9880d681SAndroid Build Coastguard Worker def v8i8_v8i16 : BaseSIMDDifferentThreeVectorTied<U, 0b000, opc, 5365*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5366*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8b", ".8b", 5367*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 5368*9880d681SAndroid Build Coastguard Worker (add (v8i16 V128:$Rd), 5369*9880d681SAndroid Build Coastguard Worker (zext (v8i8 (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm))))))]>; 5370*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDDifferentThreeVectorTied<U, 0b001, opc, 5371*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5372*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", ".16b", 5373*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 5374*9880d681SAndroid Build Coastguard Worker (add (v8i16 V128:$Rd), 5375*9880d681SAndroid Build Coastguard Worker (zext (v8i8 (OpNode (extract_high_v16i8 V128:$Rn), 5376*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rm))))))]>; 5377*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b010, opc, 5378*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5379*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5380*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5381*9880d681SAndroid Build Coastguard Worker (add (v4i32 V128:$Rd), 5382*9880d681SAndroid Build Coastguard Worker (zext (v4i16 (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm))))))]>; 5383*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b011, opc, 5384*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5385*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5386*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5387*9880d681SAndroid Build Coastguard Worker (add (v4i32 V128:$Rd), 5388*9880d681SAndroid Build Coastguard Worker (zext (v4i16 (OpNode (extract_high_v8i16 V128:$Rn), 5389*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm))))))]>; 5390*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b100, opc, 5391*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5392*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5393*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5394*9880d681SAndroid Build Coastguard Worker (add (v2i64 V128:$Rd), 5395*9880d681SAndroid Build Coastguard Worker (zext (v2i32 (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm))))))]>; 5396*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b101, opc, 5397*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5398*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5399*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5400*9880d681SAndroid Build Coastguard Worker (add (v2i64 V128:$Rd), 5401*9880d681SAndroid Build Coastguard Worker (zext (v2i32 (OpNode (extract_high_v4i32 V128:$Rn), 5402*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm))))))]>; 5403*9880d681SAndroid Build Coastguard Worker} 5404*9880d681SAndroid Build Coastguard Worker 5405*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorBHS<bit U, bits<4> opc, string asm, 5406*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5407*9880d681SAndroid Build Coastguard Worker def v8i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b000, opc, 5408*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5409*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8b", ".8b", 5410*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 5411*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b001, opc, 5412*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5413*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", ".16b", 5414*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (extract_high_v16i8 V128:$Rn), 5415*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rm)))]>; 5416*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b010, opc, 5417*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5418*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5419*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 5420*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b011, opc, 5421*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5422*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5423*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (extract_high_v8i16 V128:$Rn), 5424*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))]>; 5425*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b100, opc, 5426*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5427*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5428*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 5429*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b101, opc, 5430*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5431*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5432*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (extract_high_v4i32 V128:$Rn), 5433*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))]>; 5434*9880d681SAndroid Build Coastguard Worker} 5435*9880d681SAndroid Build Coastguard Worker 5436*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorTiedBHS<bit U, bits<4> opc, 5437*9880d681SAndroid Build Coastguard Worker string asm, 5438*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5439*9880d681SAndroid Build Coastguard Worker def v8i8_v8i16 : BaseSIMDDifferentThreeVectorTied<U, 0b000, opc, 5440*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5441*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8b", ".8b", 5442*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 5443*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), (v8i8 V64:$Rn), (v8i8 V64:$Rm)))]>; 5444*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDDifferentThreeVectorTied<U, 0b001, opc, 5445*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5446*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", ".16b", 5447*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 5448*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), 5449*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rn), 5450*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rm)))]>; 5451*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b010, opc, 5452*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5453*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5454*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5455*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i16 V64:$Rn), (v4i16 V64:$Rm)))]>; 5456*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b011, opc, 5457*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5458*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5459*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5460*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), 5461*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rn), 5462*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))]>; 5463*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b100, opc, 5464*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5465*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5466*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5467*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), (v2i32 V64:$Rn), (v2i32 V64:$Rm)))]>; 5468*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b101, opc, 5469*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5470*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5471*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5472*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), 5473*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rn), 5474*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))]>; 5475*9880d681SAndroid Build Coastguard Worker} 5476*9880d681SAndroid Build Coastguard Worker 5477*9880d681SAndroid Build Coastguard Workermulticlass SIMDLongThreeVectorSQDMLXTiedHS<bit U, bits<4> opc, string asm, 5478*9880d681SAndroid Build Coastguard Worker SDPatternOperator Accum> { 5479*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b010, opc, 5480*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5481*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4h", ".4h", 5482*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5483*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 5484*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqdmull (v4i16 V64:$Rn), 5485*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$Rm)))))]>; 5486*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b011, opc, 5487*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5488*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", ".8h", 5489*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 5490*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 5491*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqdmull (extract_high_v8i16 V128:$Rn), 5492*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))))]>; 5493*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b100, opc, 5494*9880d681SAndroid Build Coastguard Worker V128, V64, V64, 5495*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2s", ".2s", 5496*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5497*9880d681SAndroid Build Coastguard Worker (Accum (v2i64 V128:$Rd), 5498*9880d681SAndroid Build Coastguard Worker (v2i64 (int_aarch64_neon_sqdmull (v2i32 V64:$Rn), 5499*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rm)))))]>; 5500*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b101, opc, 5501*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5502*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", ".4s", 5503*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 5504*9880d681SAndroid Build Coastguard Worker (Accum (v2i64 V128:$Rd), 5505*9880d681SAndroid Build Coastguard Worker (v2i64 (int_aarch64_neon_sqdmull (extract_high_v4i32 V128:$Rn), 5506*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))))]>; 5507*9880d681SAndroid Build Coastguard Worker} 5508*9880d681SAndroid Build Coastguard Worker 5509*9880d681SAndroid Build Coastguard Workermulticlass SIMDWideThreeVectorBHS<bit U, bits<4> opc, string asm, 5510*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5511*9880d681SAndroid Build Coastguard Worker def v8i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b000, opc, 5512*9880d681SAndroid Build Coastguard Worker V128, V128, V64, 5513*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8b", 5514*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), (v8i8 V64:$Rm)))]>; 5515*9880d681SAndroid Build Coastguard Worker def v16i8_v8i16 : BaseSIMDDifferentThreeVector<U, 0b001, opc, 5516*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5517*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".8h", ".16b", 5518*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), 5519*9880d681SAndroid Build Coastguard Worker (extract_high_v16i8 V128:$Rm)))]>; 5520*9880d681SAndroid Build Coastguard Worker def v4i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b010, opc, 5521*9880d681SAndroid Build Coastguard Worker V128, V128, V64, 5522*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4h", 5523*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), (v4i16 V64:$Rm)))]>; 5524*9880d681SAndroid Build Coastguard Worker def v8i16_v4i32 : BaseSIMDDifferentThreeVector<U, 0b011, opc, 5525*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5526*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".4s", ".8h", 5527*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), 5528*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rm)))]>; 5529*9880d681SAndroid Build Coastguard Worker def v2i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b100, opc, 5530*9880d681SAndroid Build Coastguard Worker V128, V128, V64, 5531*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2s", 5532*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn), (v2i32 V64:$Rm)))]>; 5533*9880d681SAndroid Build Coastguard Worker def v4i32_v2i64 : BaseSIMDDifferentThreeVector<U, 0b101, opc, 5534*9880d681SAndroid Build Coastguard Worker V128, V128, V128, 5535*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".2d", ".4s", 5536*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn), 5537*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rm)))]>; 5538*9880d681SAndroid Build Coastguard Worker} 5539*9880d681SAndroid Build Coastguard Worker 5540*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5541*9880d681SAndroid Build Coastguard Worker// AdvSIMD bitwise extract from vector 5542*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5543*9880d681SAndroid Build Coastguard Worker 5544*9880d681SAndroid Build Coastguard Workerclass BaseSIMDBitwiseExtract<bit size, RegisterOperand regtype, ValueType vty, 5545*9880d681SAndroid Build Coastguard Worker string asm, string kind> 5546*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, i32imm:$imm), asm, 5547*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # ", $imm" # 5548*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn, $Rm, $imm}", "", 5549*9880d681SAndroid Build Coastguard Worker [(set (vty regtype:$Rd), 5550*9880d681SAndroid Build Coastguard Worker (AArch64ext regtype:$Rn, regtype:$Rm, (i32 imm:$imm)))]>, 5551*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5552*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5553*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5554*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5555*9880d681SAndroid Build Coastguard Worker bits<4> imm; 5556*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5557*9880d681SAndroid Build Coastguard Worker let Inst{30} = size; 5558*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b101110000; 5559*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5560*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 5561*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = imm; 5562*9880d681SAndroid Build Coastguard Worker let Inst{10} = 0; 5563*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5564*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5565*9880d681SAndroid Build Coastguard Worker} 5566*9880d681SAndroid Build Coastguard Worker 5567*9880d681SAndroid Build Coastguard Worker 5568*9880d681SAndroid Build Coastguard Workermulticlass SIMDBitwiseExtract<string asm> { 5569*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDBitwiseExtract<0, V64, v8i8, asm, ".8b"> { 5570*9880d681SAndroid Build Coastguard Worker let imm{3} = 0; 5571*9880d681SAndroid Build Coastguard Worker } 5572*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDBitwiseExtract<1, V128, v16i8, asm, ".16b">; 5573*9880d681SAndroid Build Coastguard Worker} 5574*9880d681SAndroid Build Coastguard Worker 5575*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5576*9880d681SAndroid Build Coastguard Worker// AdvSIMD zip vector 5577*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5578*9880d681SAndroid Build Coastguard Worker 5579*9880d681SAndroid Build Coastguard Workerclass BaseSIMDZipVector<bits<3> size, bits<3> opc, RegisterOperand regtype, 5580*9880d681SAndroid Build Coastguard Worker string asm, string kind, SDNode OpNode, ValueType valty> 5581*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, 5582*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # 5583*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn, $Rm}", "", 5584*9880d681SAndroid Build Coastguard Worker [(set (valty regtype:$Rd), (OpNode regtype:$Rn, regtype:$Rm))]>, 5585*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5586*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5587*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5588*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5589*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 5590*9880d681SAndroid Build Coastguard Worker let Inst{30} = size{0}; 5591*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b001110; 5592*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size{2-1}; 5593*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 5594*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5595*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 5596*9880d681SAndroid Build Coastguard Worker let Inst{14-12} = opc; 5597*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5598*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5599*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5600*9880d681SAndroid Build Coastguard Worker} 5601*9880d681SAndroid Build Coastguard Worker 5602*9880d681SAndroid Build Coastguard Workermulticlass SIMDZipVector<bits<3>opc, string asm, 5603*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 5604*9880d681SAndroid Build Coastguard Worker def v8i8 : BaseSIMDZipVector<0b000, opc, V64, 5605*9880d681SAndroid Build Coastguard Worker asm, ".8b", OpNode, v8i8>; 5606*9880d681SAndroid Build Coastguard Worker def v16i8 : BaseSIMDZipVector<0b001, opc, V128, 5607*9880d681SAndroid Build Coastguard Worker asm, ".16b", OpNode, v16i8>; 5608*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDZipVector<0b010, opc, V64, 5609*9880d681SAndroid Build Coastguard Worker asm, ".4h", OpNode, v4i16>; 5610*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDZipVector<0b011, opc, V128, 5611*9880d681SAndroid Build Coastguard Worker asm, ".8h", OpNode, v8i16>; 5612*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDZipVector<0b100, opc, V64, 5613*9880d681SAndroid Build Coastguard Worker asm, ".2s", OpNode, v2i32>; 5614*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDZipVector<0b101, opc, V128, 5615*9880d681SAndroid Build Coastguard Worker asm, ".4s", OpNode, v4i32>; 5616*9880d681SAndroid Build Coastguard Worker def v2i64 : BaseSIMDZipVector<0b111, opc, V128, 5617*9880d681SAndroid Build Coastguard Worker asm, ".2d", OpNode, v2i64>; 5618*9880d681SAndroid Build Coastguard Worker 5619*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f16 (OpNode V64:$Rn, V64:$Rm)), 5620*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v4i16") V64:$Rn, V64:$Rm)>; 5621*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f16 (OpNode V128:$Rn, V128:$Rm)), 5622*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v8i16") V128:$Rn, V128:$Rm)>; 5623*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode V64:$Rn, V64:$Rm)), 5624*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v2i32") V64:$Rn, V64:$Rm)>; 5625*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode V128:$Rn, V128:$Rm)), 5626*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v4i32") V128:$Rn, V128:$Rm)>; 5627*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (OpNode V128:$Rn, V128:$Rm)), 5628*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v2i64") V128:$Rn, V128:$Rm)>; 5629*9880d681SAndroid Build Coastguard Worker} 5630*9880d681SAndroid Build Coastguard Worker 5631*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5632*9880d681SAndroid Build Coastguard Worker// AdvSIMD three register scalar instructions 5633*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5634*9880d681SAndroid Build Coastguard Worker 5635*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 5636*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeScalar<bit U, bits<3> size, bits<5> opcode, 5637*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm, 5638*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5639*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, 5640*9880d681SAndroid Build Coastguard Worker "\t$Rd, $Rn, $Rm", "", pattern>, 5641*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5642*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5643*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5644*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5645*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5646*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5647*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5648*9880d681SAndroid Build Coastguard Worker let Inst{23-21} = size; 5649*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5650*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opcode; 5651*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 5652*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5653*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5654*9880d681SAndroid Build Coastguard Worker} 5655*9880d681SAndroid Build Coastguard Worker 5656*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 5657*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeScalarTied<bit U, bits<2> size, bit R, bits<5> opcode, 5658*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, string asm, 5659*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 5660*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Rd, $Rn, $Rm", "$Rd = $dst", pattern>, 5661*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5662*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5663*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5664*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5665*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5666*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5667*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5668*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5669*9880d681SAndroid Build Coastguard Worker let Inst{21} = R; 5670*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5671*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opcode; 5672*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 5673*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5674*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5675*9880d681SAndroid Build Coastguard Worker} 5676*9880d681SAndroid Build Coastguard Worker 5677*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarD<bit U, bits<5> opc, string asm, 5678*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5679*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDThreeScalar<U, 0b111, opc, FPR64, asm, 5680*9880d681SAndroid Build Coastguard Worker [(set (v1i64 FPR64:$Rd), (OpNode (v1i64 FPR64:$Rn), (v1i64 FPR64:$Rm)))]>; 5681*9880d681SAndroid Build Coastguard Worker} 5682*9880d681SAndroid Build Coastguard Worker 5683*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarBHSD<bit U, bits<5> opc, string asm, 5684*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5685*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDThreeScalar<U, 0b111, opc, FPR64, asm, 5686*9880d681SAndroid Build Coastguard Worker [(set (v1i64 FPR64:$Rd), (OpNode (v1i64 FPR64:$Rn), (v1i64 FPR64:$Rm)))]>; 5687*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDThreeScalar<U, 0b101, opc, FPR32, asm, []>; 5688*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDThreeScalar<U, 0b011, opc, FPR16, asm, []>; 5689*9880d681SAndroid Build Coastguard Worker def v1i8 : BaseSIMDThreeScalar<U, 0b001, opc, FPR8 , asm, []>; 5690*9880d681SAndroid Build Coastguard Worker 5691*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (OpNode (i64 FPR64:$Rn), (i64 FPR64:$Rm))), 5692*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v1i64") FPR64:$Rn, FPR64:$Rm)>; 5693*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (OpNode (i32 FPR32:$Rn), (i32 FPR32:$Rm))), 5694*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"v1i32") FPR32:$Rn, FPR32:$Rm)>; 5695*9880d681SAndroid Build Coastguard Worker} 5696*9880d681SAndroid Build Coastguard Worker 5697*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarHS<bit U, bits<5> opc, string asm, 5698*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5699*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDThreeScalar<U, 0b101, opc, FPR32, asm, 5700*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (OpNode FPR32:$Rn, FPR32:$Rm))]>; 5701*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDThreeScalar<U, 0b011, opc, FPR16, asm, []>; 5702*9880d681SAndroid Build Coastguard Worker} 5703*9880d681SAndroid Build Coastguard Worker 5704*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarHSTied<bit U, bit R, bits<5> opc, string asm, 5705*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5706*9880d681SAndroid Build Coastguard Worker def v1i32: BaseSIMDThreeScalarTied<U, 0b10, R, opc, (outs FPR32:$dst), 5707*9880d681SAndroid Build Coastguard Worker (ins FPR32:$Rd, FPR32:$Rn, FPR32:$Rm), 5708*9880d681SAndroid Build Coastguard Worker asm, []>; 5709*9880d681SAndroid Build Coastguard Worker def v1i16: BaseSIMDThreeScalarTied<U, 0b01, R, opc, (outs FPR16:$dst), 5710*9880d681SAndroid Build Coastguard Worker (ins FPR16:$Rd, FPR16:$Rn, FPR16:$Rm), 5711*9880d681SAndroid Build Coastguard Worker asm, []>; 5712*9880d681SAndroid Build Coastguard Worker} 5713*9880d681SAndroid Build Coastguard Worker 5714*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPThreeScalar<bit U, bit S, bits<3> opc, string asm, 5715*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5716*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 5717*9880d681SAndroid Build Coastguard Worker def #NAME#64 : BaseSIMDThreeScalar<U, {S,0b11}, {0b11,opc}, FPR64, asm, 5718*9880d681SAndroid Build Coastguard Worker [(set (f64 FPR64:$Rd), (OpNode (f64 FPR64:$Rn), (f64 FPR64:$Rm)))]>; 5719*9880d681SAndroid Build Coastguard Worker def #NAME#32 : BaseSIMDThreeScalar<U, {S,0b01}, {0b11,opc}, FPR32, asm, 5720*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (OpNode FPR32:$Rn, FPR32:$Rm))]>; 5721*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5722*9880d681SAndroid Build Coastguard Worker def #NAME#16 : BaseSIMDThreeScalar<U, {S,0b10}, {0b00,opc}, FPR16, asm, 5723*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (OpNode FPR16:$Rn, FPR16:$Rm))]>; 5724*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 5725*9880d681SAndroid Build Coastguard Worker } 5726*9880d681SAndroid Build Coastguard Worker 5727*9880d681SAndroid Build Coastguard Worker def : Pat<(v1f64 (OpNode (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 5728*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "64") FPR64:$Rn, FPR64:$Rm)>; 5729*9880d681SAndroid Build Coastguard Worker} 5730*9880d681SAndroid Build Coastguard Worker 5731*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarFPCmp<bit U, bit S, bits<3> opc, string asm, 5732*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5733*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 5734*9880d681SAndroid Build Coastguard Worker def #NAME#64 : BaseSIMDThreeScalar<U, {S,0b11}, {0b11,opc}, FPR64, asm, 5735*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$Rd), (OpNode (f64 FPR64:$Rn), (f64 FPR64:$Rm)))]>; 5736*9880d681SAndroid Build Coastguard Worker def #NAME#32 : BaseSIMDThreeScalar<U, {S,0b01}, {0b11,opc}, FPR32, asm, 5737*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (f32 FPR32:$Rn), (f32 FPR32:$Rm)))]>; 5738*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5739*9880d681SAndroid Build Coastguard Worker def #NAME#16 : BaseSIMDThreeScalar<U, {S,0b10}, {0b00,opc}, FPR16, asm, 5740*9880d681SAndroid Build Coastguard Worker []>; 5741*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 5742*9880d681SAndroid Build Coastguard Worker } 5743*9880d681SAndroid Build Coastguard Worker 5744*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 5745*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "64") FPR64:$Rn, FPR64:$Rm)>; 5746*9880d681SAndroid Build Coastguard Worker} 5747*9880d681SAndroid Build Coastguard Worker 5748*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeScalarMixed<bit U, bits<2> size, bits<5> opcode, 5749*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, string asm, string cstr, list<dag> pat> 5750*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, 5751*9880d681SAndroid Build Coastguard Worker "\t$Rd, $Rn, $Rm", cstr, pat>, 5752*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5753*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5754*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5755*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 5756*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5757*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5758*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5759*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5760*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 5761*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 5762*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opcode; 5763*9880d681SAndroid Build Coastguard Worker let Inst{10} = 0; 5764*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5765*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5766*9880d681SAndroid Build Coastguard Worker} 5767*9880d681SAndroid Build Coastguard Worker 5768*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5769*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarMixedHS<bit U, bits<5> opc, string asm, 5770*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5771*9880d681SAndroid Build Coastguard Worker def i16 : BaseSIMDThreeScalarMixed<U, 0b01, opc, 5772*9880d681SAndroid Build Coastguard Worker (outs FPR32:$Rd), 5773*9880d681SAndroid Build Coastguard Worker (ins FPR16:$Rn, FPR16:$Rm), asm, "", []>; 5774*9880d681SAndroid Build Coastguard Worker def i32 : BaseSIMDThreeScalarMixed<U, 0b10, opc, 5775*9880d681SAndroid Build Coastguard Worker (outs FPR64:$Rd), 5776*9880d681SAndroid Build Coastguard Worker (ins FPR32:$Rn, FPR32:$Rm), asm, "", 5777*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$Rd), (OpNode (i32 FPR32:$Rn), (i32 FPR32:$Rm)))]>; 5778*9880d681SAndroid Build Coastguard Worker} 5779*9880d681SAndroid Build Coastguard Worker 5780*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5781*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeScalarMixedTiedHS<bit U, bits<5> opc, string asm, 5782*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5783*9880d681SAndroid Build Coastguard Worker def i16 : BaseSIMDThreeScalarMixed<U, 0b01, opc, 5784*9880d681SAndroid Build Coastguard Worker (outs FPR32:$dst), 5785*9880d681SAndroid Build Coastguard Worker (ins FPR32:$Rd, FPR16:$Rn, FPR16:$Rm), 5786*9880d681SAndroid Build Coastguard Worker asm, "$Rd = $dst", []>; 5787*9880d681SAndroid Build Coastguard Worker def i32 : BaseSIMDThreeScalarMixed<U, 0b10, opc, 5788*9880d681SAndroid Build Coastguard Worker (outs FPR64:$dst), 5789*9880d681SAndroid Build Coastguard Worker (ins FPR64:$Rd, FPR32:$Rn, FPR32:$Rm), 5790*9880d681SAndroid Build Coastguard Worker asm, "$Rd = $dst", 5791*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$dst), 5792*9880d681SAndroid Build Coastguard Worker (OpNode (i64 FPR64:$Rd), (i32 FPR32:$Rn), (i32 FPR32:$Rm)))]>; 5793*9880d681SAndroid Build Coastguard Worker} 5794*9880d681SAndroid Build Coastguard Worker 5795*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5796*9880d681SAndroid Build Coastguard Worker// AdvSIMD two register scalar instructions 5797*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5798*9880d681SAndroid Build Coastguard Worker 5799*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5800*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTwoScalar<bit U, bits<2> size, bits<2> size2, bits<5> opcode, 5801*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, RegisterClass regtype2, 5802*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pat> 5803*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype2:$Rn), asm, 5804*9880d681SAndroid Build Coastguard Worker "\t$Rd, $Rn", "", pat>, 5805*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5806*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5807*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5808*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5809*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5810*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5811*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5812*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 5813*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = size2; 5814*9880d681SAndroid Build Coastguard Worker let Inst{18-17} = 0b00; 5815*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5816*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5817*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5818*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5819*9880d681SAndroid Build Coastguard Worker} 5820*9880d681SAndroid Build Coastguard Worker 5821*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5822*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTwoScalarTied<bit U, bits<2> size, bits<5> opcode, 5823*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, RegisterClass regtype2, 5824*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pat> 5825*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$dst), (ins regtype:$Rd, regtype2:$Rn), asm, 5826*9880d681SAndroid Build Coastguard Worker "\t$Rd, $Rn", "$Rd = $dst", pat>, 5827*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5828*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5829*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5830*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5831*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5832*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5833*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5834*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b10000; 5835*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5836*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5837*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5838*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5839*9880d681SAndroid Build Coastguard Worker} 5840*9880d681SAndroid Build Coastguard Worker 5841*9880d681SAndroid Build Coastguard Worker 5842*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5843*9880d681SAndroid Build Coastguard Workerclass BaseSIMDCmpTwoScalar<bit U, bits<2> size, bits<2> size2, bits<5> opcode, 5844*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, string asm, string zero> 5845*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins regtype:$Rn), asm, 5846*9880d681SAndroid Build Coastguard Worker "\t$Rd, $Rn, #" # zero, "", []>, 5847*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5848*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5849*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5850*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5851*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5852*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5853*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5854*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 5855*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = size2; 5856*9880d681SAndroid Build Coastguard Worker let Inst{18-17} = 0b00; 5857*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5858*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5859*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5860*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5861*9880d681SAndroid Build Coastguard Worker} 5862*9880d681SAndroid Build Coastguard Worker 5863*9880d681SAndroid Build Coastguard Workerclass SIMDInexactCvtTwoScalar<bits<5> opcode, string asm> 5864*9880d681SAndroid Build Coastguard Worker : I<(outs FPR32:$Rd), (ins FPR64:$Rn), asm, "\t$Rd, $Rn", "", 5865*9880d681SAndroid Build Coastguard Worker [(set (f32 FPR32:$Rd), (int_aarch64_sisd_fcvtxn (f64 FPR64:$Rn)))]>, 5866*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5867*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5868*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5869*9880d681SAndroid Build Coastguard Worker let Inst{31-17} = 0b011111100110000; 5870*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5871*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5872*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5873*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5874*9880d681SAndroid Build Coastguard Worker} 5875*9880d681SAndroid Build Coastguard Worker 5876*9880d681SAndroid Build Coastguard Workermulticlass SIMDCmpTwoScalarD<bit U, bits<5> opc, string asm, 5877*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5878*9880d681SAndroid Build Coastguard Worker def v1i64rz : BaseSIMDCmpTwoScalar<U, 0b11, 0b00, opc, FPR64, asm, "0">; 5879*9880d681SAndroid Build Coastguard Worker 5880*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode FPR64:$Rn)), 5881*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i64rz) FPR64:$Rn)>; 5882*9880d681SAndroid Build Coastguard Worker} 5883*9880d681SAndroid Build Coastguard Worker 5884*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPCmpTwoScalar<bit U, bit S, bits<5> opc, string asm, 5885*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5886*9880d681SAndroid Build Coastguard Worker def v1i64rz : BaseSIMDCmpTwoScalar<U, {S,1}, 0b00, opc, FPR64, asm, "0.0">; 5887*9880d681SAndroid Build Coastguard Worker def v1i32rz : BaseSIMDCmpTwoScalar<U, {S,0}, 0b00, opc, FPR32, asm, "0.0">; 5888*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5889*9880d681SAndroid Build Coastguard Worker def v1i16rz : BaseSIMDCmpTwoScalar<U, {S,1}, 0b11, opc, FPR16, asm, "0.0">; 5890*9880d681SAndroid Build Coastguard Worker } 5891*9880d681SAndroid Build Coastguard Worker 5892*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rd, $Rn, #0", 5893*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i64rz) FPR64:$Rd, FPR64:$Rn), 0>; 5894*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rd, $Rn, #0", 5895*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i32rz) FPR32:$Rd, FPR32:$Rn), 0>; 5896*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5897*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Rd, $Rn, #0", 5898*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i16rz) FPR16:$Rd, FPR16:$Rn), 0>; 5899*9880d681SAndroid Build Coastguard Worker } 5900*9880d681SAndroid Build Coastguard Worker 5901*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1f64 FPR64:$Rn))), 5902*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i64rz) FPR64:$Rn)>; 5903*9880d681SAndroid Build Coastguard Worker} 5904*9880d681SAndroid Build Coastguard Worker 5905*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoScalarD<bit U, bits<5> opc, string asm, 5906*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5907*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDTwoScalar<U, 0b11, 0b00, opc, FPR64, FPR64, asm, 5908*9880d681SAndroid Build Coastguard Worker [(set (v1i64 FPR64:$Rd), (OpNode (v1i64 FPR64:$Rn)))]>; 5909*9880d681SAndroid Build Coastguard Worker 5910*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (OpNode (i64 FPR64:$Rn))), 5911*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v1i64") FPR64:$Rn)>; 5912*9880d681SAndroid Build Coastguard Worker} 5913*9880d681SAndroid Build Coastguard Worker 5914*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPTwoScalar<bit U, bit S, bits<5> opc, string asm> { 5915*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDTwoScalar<U, {S,1}, 0b00, opc, FPR64, FPR64, asm,[]>; 5916*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDTwoScalar<U, {S,0}, 0b00, opc, FPR32, FPR32, asm,[]>; 5917*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5918*9880d681SAndroid Build Coastguard Worker def v1f16 : BaseSIMDTwoScalar<U, {S,1}, 0b11, opc, FPR16, FPR16, asm,[]>; 5919*9880d681SAndroid Build Coastguard Worker } 5920*9880d681SAndroid Build Coastguard Worker} 5921*9880d681SAndroid Build Coastguard Worker 5922*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPTwoScalarCVT<bit U, bit S, bits<5> opc, string asm, 5923*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 5924*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDTwoScalar<U, {S,1}, 0b00, opc, FPR64, FPR64, asm, 5925*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, (OpNode (f64 FPR64:$Rn)))]>; 5926*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDTwoScalar<U, {S,0}, 0b00, opc, FPR32, FPR32, asm, 5927*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (OpNode (f32 FPR32:$Rn)))]>; 5928*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 5929*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDTwoScalar<U, {S,1}, 0b11, opc, FPR16, FPR16, asm, 5930*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (OpNode (f16 FPR16:$Rn)))]>; 5931*9880d681SAndroid Build Coastguard Worker } 5932*9880d681SAndroid Build Coastguard Worker} 5933*9880d681SAndroid Build Coastguard Worker 5934*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoScalarBHSD<bit U, bits<5> opc, string asm, 5935*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5936*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 5937*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDTwoScalar<U, 0b11, 0b00, opc, FPR64, FPR64, asm, 5938*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$Rd), (OpNode (i64 FPR64:$Rn)))]>; 5939*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDTwoScalar<U, 0b10, 0b00, opc, FPR32, FPR32, asm, 5940*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (i32 FPR32:$Rn)))]>; 5941*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDTwoScalar<U, 0b01, 0b00, opc, FPR16, FPR16, asm, []>; 5942*9880d681SAndroid Build Coastguard Worker def v1i8 : BaseSIMDTwoScalar<U, 0b00, 0b00, opc, FPR8 , FPR8 , asm, []>; 5943*9880d681SAndroid Build Coastguard Worker } 5944*9880d681SAndroid Build Coastguard Worker 5945*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 FPR64:$Rn))), 5946*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i64) FPR64:$Rn)>; 5947*9880d681SAndroid Build Coastguard Worker} 5948*9880d681SAndroid Build Coastguard Worker 5949*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoScalarBHSDTied<bit U, bits<5> opc, string asm, 5950*9880d681SAndroid Build Coastguard Worker Intrinsic OpNode> { 5951*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 5952*9880d681SAndroid Build Coastguard Worker def v1i64 : BaseSIMDTwoScalarTied<U, 0b11, opc, FPR64, FPR64, asm, 5953*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$dst), (OpNode (i64 FPR64:$Rd), (i64 FPR64:$Rn)))]>; 5954*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDTwoScalarTied<U, 0b10, opc, FPR32, FPR32, asm, 5955*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$dst), (OpNode (i32 FPR32:$Rd), (i32 FPR32:$Rn)))]>; 5956*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDTwoScalarTied<U, 0b01, opc, FPR16, FPR16, asm, []>; 5957*9880d681SAndroid Build Coastguard Worker def v1i8 : BaseSIMDTwoScalarTied<U, 0b00, opc, FPR8 , FPR8 , asm, []>; 5958*9880d681SAndroid Build Coastguard Worker } 5959*9880d681SAndroid Build Coastguard Worker 5960*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn))), 5961*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v1i64) FPR64:$Rd, FPR64:$Rn)>; 5962*9880d681SAndroid Build Coastguard Worker} 5963*9880d681SAndroid Build Coastguard Worker 5964*9880d681SAndroid Build Coastguard Worker 5965*9880d681SAndroid Build Coastguard Worker 5966*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5967*9880d681SAndroid Build Coastguard Workermulticlass SIMDTwoScalarMixedBHS<bit U, bits<5> opc, string asm, 5968*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 5969*9880d681SAndroid Build Coastguard Worker def v1i32 : BaseSIMDTwoScalar<U, 0b10, 0b00, opc, FPR32, FPR64, asm, 5970*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (i64 FPR64:$Rn)))]>; 5971*9880d681SAndroid Build Coastguard Worker def v1i16 : BaseSIMDTwoScalar<U, 0b01, 0b00, opc, FPR16, FPR32, asm, []>; 5972*9880d681SAndroid Build Coastguard Worker def v1i8 : BaseSIMDTwoScalar<U, 0b00, 0b00, opc, FPR8 , FPR16, asm, []>; 5973*9880d681SAndroid Build Coastguard Worker} 5974*9880d681SAndroid Build Coastguard Worker 5975*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5976*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar pairwise instructions 5977*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5978*9880d681SAndroid Build Coastguard Worker 5979*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 5980*9880d681SAndroid Build Coastguard Workerclass BaseSIMDPairwiseScalar<bit U, bits<2> size, bits<5> opcode, 5981*9880d681SAndroid Build Coastguard Worker RegisterOperand regtype, RegisterOperand vectype, 5982*9880d681SAndroid Build Coastguard Worker string asm, string kind> 5983*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins vectype:$Rn), asm, 5984*9880d681SAndroid Build Coastguard Worker "{\t$Rd, $Rn" # kind # "|" # kind # "\t$Rd, $Rn}", "", []>, 5985*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 5986*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 5987*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 5988*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 5989*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 5990*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b11110; 5991*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 5992*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b11000; 5993*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 5994*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 5995*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 5996*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 5997*9880d681SAndroid Build Coastguard Worker} 5998*9880d681SAndroid Build Coastguard Worker 5999*9880d681SAndroid Build Coastguard Workermulticlass SIMDPairwiseScalarD<bit U, bits<5> opc, string asm> { 6000*9880d681SAndroid Build Coastguard Worker def v2i64p : BaseSIMDPairwiseScalar<U, 0b11, opc, FPR64Op, V128, 6001*9880d681SAndroid Build Coastguard Worker asm, ".2d">; 6002*9880d681SAndroid Build Coastguard Worker} 6003*9880d681SAndroid Build Coastguard Worker 6004*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPPairwiseScalar<bit S, bits<5> opc, string asm> { 6005*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6006*9880d681SAndroid Build Coastguard Worker def v2i16p : BaseSIMDPairwiseScalar<0, {S,0}, opc, FPR16Op, V64, 6007*9880d681SAndroid Build Coastguard Worker asm, ".2h">; 6008*9880d681SAndroid Build Coastguard Worker } 6009*9880d681SAndroid Build Coastguard Worker def v2i32p : BaseSIMDPairwiseScalar<1, {S,0}, opc, FPR32Op, V64, 6010*9880d681SAndroid Build Coastguard Worker asm, ".2s">; 6011*9880d681SAndroid Build Coastguard Worker def v2i64p : BaseSIMDPairwiseScalar<1, {S,1}, opc, FPR64Op, V128, 6012*9880d681SAndroid Build Coastguard Worker asm, ".2d">; 6013*9880d681SAndroid Build Coastguard Worker} 6014*9880d681SAndroid Build Coastguard Worker 6015*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6016*9880d681SAndroid Build Coastguard Worker// AdvSIMD across lanes instructions 6017*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6018*9880d681SAndroid Build Coastguard Worker 6019*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 6020*9880d681SAndroid Build Coastguard Workerclass BaseSIMDAcrossLanes<bit Q, bit U, bits<2> size, bits<5> opcode, 6021*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, RegisterOperand vectype, 6022*9880d681SAndroid Build Coastguard Worker string asm, string kind, list<dag> pattern> 6023*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$Rd), (ins vectype:$Rn), asm, 6024*9880d681SAndroid Build Coastguard Worker "{\t$Rd, $Rn" # kind # "|" # kind # "\t$Rd, $Rn}", "", pattern>, 6025*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6026*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 6027*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 6028*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6029*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6030*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 6031*9880d681SAndroid Build Coastguard Worker let Inst{28-24} = 0b01110; 6032*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 6033*9880d681SAndroid Build Coastguard Worker let Inst{21-17} = 0b11000; 6034*9880d681SAndroid Build Coastguard Worker let Inst{16-12} = opcode; 6035*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 6036*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 6037*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 6038*9880d681SAndroid Build Coastguard Worker} 6039*9880d681SAndroid Build Coastguard Worker 6040*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesBHS<bit U, bits<5> opcode, 6041*9880d681SAndroid Build Coastguard Worker string asm> { 6042*9880d681SAndroid Build Coastguard Worker def v8i8v : BaseSIMDAcrossLanes<0, U, 0b00, opcode, FPR8, V64, 6043*9880d681SAndroid Build Coastguard Worker asm, ".8b", []>; 6044*9880d681SAndroid Build Coastguard Worker def v16i8v : BaseSIMDAcrossLanes<1, U, 0b00, opcode, FPR8, V128, 6045*9880d681SAndroid Build Coastguard Worker asm, ".16b", []>; 6046*9880d681SAndroid Build Coastguard Worker def v4i16v : BaseSIMDAcrossLanes<0, U, 0b01, opcode, FPR16, V64, 6047*9880d681SAndroid Build Coastguard Worker asm, ".4h", []>; 6048*9880d681SAndroid Build Coastguard Worker def v8i16v : BaseSIMDAcrossLanes<1, U, 0b01, opcode, FPR16, V128, 6049*9880d681SAndroid Build Coastguard Worker asm, ".8h", []>; 6050*9880d681SAndroid Build Coastguard Worker def v4i32v : BaseSIMDAcrossLanes<1, U, 0b10, opcode, FPR32, V128, 6051*9880d681SAndroid Build Coastguard Worker asm, ".4s", []>; 6052*9880d681SAndroid Build Coastguard Worker} 6053*9880d681SAndroid Build Coastguard Worker 6054*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesHSD<bit U, bits<5> opcode, string asm> { 6055*9880d681SAndroid Build Coastguard Worker def v8i8v : BaseSIMDAcrossLanes<0, U, 0b00, opcode, FPR16, V64, 6056*9880d681SAndroid Build Coastguard Worker asm, ".8b", []>; 6057*9880d681SAndroid Build Coastguard Worker def v16i8v : BaseSIMDAcrossLanes<1, U, 0b00, opcode, FPR16, V128, 6058*9880d681SAndroid Build Coastguard Worker asm, ".16b", []>; 6059*9880d681SAndroid Build Coastguard Worker def v4i16v : BaseSIMDAcrossLanes<0, U, 0b01, opcode, FPR32, V64, 6060*9880d681SAndroid Build Coastguard Worker asm, ".4h", []>; 6061*9880d681SAndroid Build Coastguard Worker def v8i16v : BaseSIMDAcrossLanes<1, U, 0b01, opcode, FPR32, V128, 6062*9880d681SAndroid Build Coastguard Worker asm, ".8h", []>; 6063*9880d681SAndroid Build Coastguard Worker def v4i32v : BaseSIMDAcrossLanes<1, U, 0b10, opcode, FPR64, V128, 6064*9880d681SAndroid Build Coastguard Worker asm, ".4s", []>; 6065*9880d681SAndroid Build Coastguard Worker} 6066*9880d681SAndroid Build Coastguard Worker 6067*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPAcrossLanes<bits<5> opcode, bit sz1, string asm, 6068*9880d681SAndroid Build Coastguard Worker Intrinsic intOp> { 6069*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6070*9880d681SAndroid Build Coastguard Worker def v4i16v : BaseSIMDAcrossLanes<0, 0, {sz1, 0}, opcode, FPR16, V64, 6071*9880d681SAndroid Build Coastguard Worker asm, ".4h", 6072*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (intOp (v4f16 V64:$Rn)))]>; 6073*9880d681SAndroid Build Coastguard Worker def v8i16v : BaseSIMDAcrossLanes<1, 0, {sz1, 0}, opcode, FPR16, V128, 6074*9880d681SAndroid Build Coastguard Worker asm, ".8h", 6075*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rd, (intOp (v8f16 V128:$Rn)))]>; 6076*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 6077*9880d681SAndroid Build Coastguard Worker def v4i32v : BaseSIMDAcrossLanes<1, 1, {sz1, 0}, opcode, FPR32, V128, 6078*9880d681SAndroid Build Coastguard Worker asm, ".4s", 6079*9880d681SAndroid Build Coastguard Worker [(set FPR32:$Rd, (intOp (v4f32 V128:$Rn)))]>; 6080*9880d681SAndroid Build Coastguard Worker} 6081*9880d681SAndroid Build Coastguard Worker 6082*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6083*9880d681SAndroid Build Coastguard Worker// AdvSIMD INS/DUP instructions 6084*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6085*9880d681SAndroid Build Coastguard Worker 6086*9880d681SAndroid Build Coastguard Worker// FIXME: There has got to be a better way to factor these. ugh. 6087*9880d681SAndroid Build Coastguard Worker 6088*9880d681SAndroid Build Coastguard Workerclass BaseSIMDInsDup<bit Q, bit op, dag outs, dag ins, string asm, 6089*9880d681SAndroid Build Coastguard Worker string operands, string constraints, list<dag> pattern> 6090*9880d681SAndroid Build Coastguard Worker : I<outs, ins, asm, operands, constraints, pattern>, 6091*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6092*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 6093*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 6094*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6095*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6096*9880d681SAndroid Build Coastguard Worker let Inst{29} = op; 6097*9880d681SAndroid Build Coastguard Worker let Inst{28-21} = 0b01110000; 6098*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 6099*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 6100*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 6101*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 6102*9880d681SAndroid Build Coastguard Worker} 6103*9880d681SAndroid Build Coastguard Worker 6104*9880d681SAndroid Build Coastguard Workerclass SIMDDupFromMain<bit Q, bits<5> imm5, string size, ValueType vectype, 6105*9880d681SAndroid Build Coastguard Worker RegisterOperand vecreg, RegisterClass regtype> 6106*9880d681SAndroid Build Coastguard Worker : BaseSIMDInsDup<Q, 0, (outs vecreg:$Rd), (ins regtype:$Rn), "dup", 6107*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # size # ", $Rn" # 6108*9880d681SAndroid Build Coastguard Worker "|" # size # "\t$Rd, $Rn}", "", 6109*9880d681SAndroid Build Coastguard Worker [(set (vectype vecreg:$Rd), (AArch64dup regtype:$Rn))]> { 6110*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm5; 6111*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = 0b0001; 6112*9880d681SAndroid Build Coastguard Worker} 6113*9880d681SAndroid Build Coastguard Worker 6114*9880d681SAndroid Build Coastguard Workerclass SIMDDupFromElement<bit Q, string dstkind, string srckind, 6115*9880d681SAndroid Build Coastguard Worker ValueType vectype, ValueType insreg, 6116*9880d681SAndroid Build Coastguard Worker RegisterOperand vecreg, Operand idxtype, 6117*9880d681SAndroid Build Coastguard Worker ValueType elttype, SDNode OpNode> 6118*9880d681SAndroid Build Coastguard Worker : BaseSIMDInsDup<Q, 0, (outs vecreg:$Rd), (ins V128:$Rn, idxtype:$idx), "dup", 6119*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dstkind # ", $Rn" # srckind # "$idx" # 6120*9880d681SAndroid Build Coastguard Worker "|" # dstkind # "\t$Rd, $Rn$idx}", "", 6121*9880d681SAndroid Build Coastguard Worker [(set (vectype vecreg:$Rd), 6122*9880d681SAndroid Build Coastguard Worker (OpNode (insreg V128:$Rn), idxtype:$idx))]> { 6123*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = 0b0000; 6124*9880d681SAndroid Build Coastguard Worker} 6125*9880d681SAndroid Build Coastguard Worker 6126*9880d681SAndroid Build Coastguard Workerclass SIMDDup64FromElement 6127*9880d681SAndroid Build Coastguard Worker : SIMDDupFromElement<1, ".2d", ".d", v2i64, v2i64, V128, 6128*9880d681SAndroid Build Coastguard Worker VectorIndexD, i64, AArch64duplane64> { 6129*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6130*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx; 6131*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b1000; 6132*9880d681SAndroid Build Coastguard Worker} 6133*9880d681SAndroid Build Coastguard Worker 6134*9880d681SAndroid Build Coastguard Workerclass SIMDDup32FromElement<bit Q, string size, ValueType vectype, 6135*9880d681SAndroid Build Coastguard Worker RegisterOperand vecreg> 6136*9880d681SAndroid Build Coastguard Worker : SIMDDupFromElement<Q, size, ".s", vectype, v4i32, vecreg, 6137*9880d681SAndroid Build Coastguard Worker VectorIndexS, i64, AArch64duplane32> { 6138*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6139*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6140*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6141*9880d681SAndroid Build Coastguard Worker} 6142*9880d681SAndroid Build Coastguard Worker 6143*9880d681SAndroid Build Coastguard Workerclass SIMDDup16FromElement<bit Q, string size, ValueType vectype, 6144*9880d681SAndroid Build Coastguard Worker RegisterOperand vecreg> 6145*9880d681SAndroid Build Coastguard Worker : SIMDDupFromElement<Q, size, ".h", vectype, v8i16, vecreg, 6146*9880d681SAndroid Build Coastguard Worker VectorIndexH, i64, AArch64duplane16> { 6147*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6148*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6149*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6150*9880d681SAndroid Build Coastguard Worker} 6151*9880d681SAndroid Build Coastguard Worker 6152*9880d681SAndroid Build Coastguard Workerclass SIMDDup8FromElement<bit Q, string size, ValueType vectype, 6153*9880d681SAndroid Build Coastguard Worker RegisterOperand vecreg> 6154*9880d681SAndroid Build Coastguard Worker : SIMDDupFromElement<Q, size, ".b", vectype, v16i8, vecreg, 6155*9880d681SAndroid Build Coastguard Worker VectorIndexB, i64, AArch64duplane8> { 6156*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6157*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6158*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6159*9880d681SAndroid Build Coastguard Worker} 6160*9880d681SAndroid Build Coastguard Worker 6161*9880d681SAndroid Build Coastguard Workerclass BaseSIMDMov<bit Q, string size, bits<4> imm4, RegisterClass regtype, 6162*9880d681SAndroid Build Coastguard Worker Operand idxtype, string asm, list<dag> pattern> 6163*9880d681SAndroid Build Coastguard Worker : BaseSIMDInsDup<Q, 0, (outs regtype:$Rd), (ins V128:$Rn, idxtype:$idx), asm, 6164*9880d681SAndroid Build Coastguard Worker "{\t$Rd, $Rn" # size # "$idx" # 6165*9880d681SAndroid Build Coastguard Worker "|" # size # "\t$Rd, $Rn$idx}", "", pattern> { 6166*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = imm4; 6167*9880d681SAndroid Build Coastguard Worker} 6168*9880d681SAndroid Build Coastguard Worker 6169*9880d681SAndroid Build Coastguard Workerclass SIMDSMov<bit Q, string size, RegisterClass regtype, 6170*9880d681SAndroid Build Coastguard Worker Operand idxtype> 6171*9880d681SAndroid Build Coastguard Worker : BaseSIMDMov<Q, size, 0b0101, regtype, idxtype, "smov", []>; 6172*9880d681SAndroid Build Coastguard Workerclass SIMDUMov<bit Q, string size, ValueType vectype, RegisterClass regtype, 6173*9880d681SAndroid Build Coastguard Worker Operand idxtype> 6174*9880d681SAndroid Build Coastguard Worker : BaseSIMDMov<Q, size, 0b0111, regtype, idxtype, "umov", 6175*9880d681SAndroid Build Coastguard Worker [(set regtype:$Rd, (vector_extract (vectype V128:$Rn), idxtype:$idx))]>; 6176*9880d681SAndroid Build Coastguard Worker 6177*9880d681SAndroid Build Coastguard Workerclass SIMDMovAlias<string asm, string size, Instruction inst, 6178*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, Operand idxtype> 6179*9880d681SAndroid Build Coastguard Worker : InstAlias<asm#"{\t$dst, $src"#size#"$idx" # 6180*9880d681SAndroid Build Coastguard Worker "|" # size # "\t$dst, $src$idx}", 6181*9880d681SAndroid Build Coastguard Worker (inst regtype:$dst, V128:$src, idxtype:$idx)>; 6182*9880d681SAndroid Build Coastguard Worker 6183*9880d681SAndroid Build Coastguard Workermulticlass SMov { 6184*9880d681SAndroid Build Coastguard Worker def vi8to32 : SIMDSMov<0, ".b", GPR32, VectorIndexB> { 6185*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6186*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6187*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6188*9880d681SAndroid Build Coastguard Worker } 6189*9880d681SAndroid Build Coastguard Worker def vi8to64 : SIMDSMov<1, ".b", GPR64, VectorIndexB> { 6190*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6191*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6192*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6193*9880d681SAndroid Build Coastguard Worker } 6194*9880d681SAndroid Build Coastguard Worker def vi16to32 : SIMDSMov<0, ".h", GPR32, VectorIndexH> { 6195*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6196*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6197*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6198*9880d681SAndroid Build Coastguard Worker } 6199*9880d681SAndroid Build Coastguard Worker def vi16to64 : SIMDSMov<1, ".h", GPR64, VectorIndexH> { 6200*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6201*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6202*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6203*9880d681SAndroid Build Coastguard Worker } 6204*9880d681SAndroid Build Coastguard Worker def vi32to64 : SIMDSMov<1, ".s", GPR64, VectorIndexS> { 6205*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6206*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6207*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6208*9880d681SAndroid Build Coastguard Worker } 6209*9880d681SAndroid Build Coastguard Worker} 6210*9880d681SAndroid Build Coastguard Worker 6211*9880d681SAndroid Build Coastguard Workermulticlass UMov { 6212*9880d681SAndroid Build Coastguard Worker def vi8 : SIMDUMov<0, ".b", v16i8, GPR32, VectorIndexB> { 6213*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6214*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6215*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6216*9880d681SAndroid Build Coastguard Worker } 6217*9880d681SAndroid Build Coastguard Worker def vi16 : SIMDUMov<0, ".h", v8i16, GPR32, VectorIndexH> { 6218*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6219*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6220*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6221*9880d681SAndroid Build Coastguard Worker } 6222*9880d681SAndroid Build Coastguard Worker def vi32 : SIMDUMov<0, ".s", v4i32, GPR32, VectorIndexS> { 6223*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6224*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6225*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6226*9880d681SAndroid Build Coastguard Worker } 6227*9880d681SAndroid Build Coastguard Worker def vi64 : SIMDUMov<1, ".d", v2i64, GPR64, VectorIndexD> { 6228*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6229*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx; 6230*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b1000; 6231*9880d681SAndroid Build Coastguard Worker } 6232*9880d681SAndroid Build Coastguard Worker def : SIMDMovAlias<"mov", ".s", 6233*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"vi32"), 6234*9880d681SAndroid Build Coastguard Worker GPR32, VectorIndexS>; 6235*9880d681SAndroid Build Coastguard Worker def : SIMDMovAlias<"mov", ".d", 6236*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"vi64"), 6237*9880d681SAndroid Build Coastguard Worker GPR64, VectorIndexD>; 6238*9880d681SAndroid Build Coastguard Worker} 6239*9880d681SAndroid Build Coastguard Worker 6240*9880d681SAndroid Build Coastguard Workerclass SIMDInsFromMain<string size, ValueType vectype, 6241*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, Operand idxtype> 6242*9880d681SAndroid Build Coastguard Worker : BaseSIMDInsDup<1, 0, (outs V128:$dst), 6243*9880d681SAndroid Build Coastguard Worker (ins V128:$Rd, idxtype:$idx, regtype:$Rn), "ins", 6244*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # size # "$idx, $Rn" # 6245*9880d681SAndroid Build Coastguard Worker "|" # size # "\t$Rd$idx, $Rn}", 6246*9880d681SAndroid Build Coastguard Worker "$Rd = $dst", 6247*9880d681SAndroid Build Coastguard Worker [(set V128:$dst, 6248*9880d681SAndroid Build Coastguard Worker (vector_insert (vectype V128:$Rd), regtype:$Rn, idxtype:$idx))]> { 6249*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = 0b0011; 6250*9880d681SAndroid Build Coastguard Worker} 6251*9880d681SAndroid Build Coastguard Worker 6252*9880d681SAndroid Build Coastguard Workerclass SIMDInsFromElement<string size, ValueType vectype, 6253*9880d681SAndroid Build Coastguard Worker ValueType elttype, Operand idxtype> 6254*9880d681SAndroid Build Coastguard Worker : BaseSIMDInsDup<1, 1, (outs V128:$dst), 6255*9880d681SAndroid Build Coastguard Worker (ins V128:$Rd, idxtype:$idx, V128:$Rn, idxtype:$idx2), "ins", 6256*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # size # "$idx, $Rn" # size # "$idx2" # 6257*9880d681SAndroid Build Coastguard Worker "|" # size # "\t$Rd$idx, $Rn$idx2}", 6258*9880d681SAndroid Build Coastguard Worker "$Rd = $dst", 6259*9880d681SAndroid Build Coastguard Worker [(set V128:$dst, 6260*9880d681SAndroid Build Coastguard Worker (vector_insert 6261*9880d681SAndroid Build Coastguard Worker (vectype V128:$Rd), 6262*9880d681SAndroid Build Coastguard Worker (elttype (vector_extract (vectype V128:$Rn), idxtype:$idx2)), 6263*9880d681SAndroid Build Coastguard Worker idxtype:$idx))]>; 6264*9880d681SAndroid Build Coastguard Worker 6265*9880d681SAndroid Build Coastguard Workerclass SIMDInsMainMovAlias<string size, Instruction inst, 6266*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, Operand idxtype> 6267*9880d681SAndroid Build Coastguard Worker : InstAlias<"mov" # "{\t$dst" # size # "$idx, $src" # 6268*9880d681SAndroid Build Coastguard Worker "|" # size #"\t$dst$idx, $src}", 6269*9880d681SAndroid Build Coastguard Worker (inst V128:$dst, idxtype:$idx, regtype:$src)>; 6270*9880d681SAndroid Build Coastguard Workerclass SIMDInsElementMovAlias<string size, Instruction inst, 6271*9880d681SAndroid Build Coastguard Worker Operand idxtype> 6272*9880d681SAndroid Build Coastguard Worker : InstAlias<"mov" # "{\t$dst" # size # "$idx, $src" # size # "$idx2" # 6273*9880d681SAndroid Build Coastguard Worker # "|" # size #"\t$dst$idx, $src$idx2}", 6274*9880d681SAndroid Build Coastguard Worker (inst V128:$dst, idxtype:$idx, V128:$src, idxtype:$idx2)>; 6275*9880d681SAndroid Build Coastguard Worker 6276*9880d681SAndroid Build Coastguard Worker 6277*9880d681SAndroid Build Coastguard Workermulticlass SIMDIns { 6278*9880d681SAndroid Build Coastguard Worker def vi8gpr : SIMDInsFromMain<".b", v16i8, GPR32, VectorIndexB> { 6279*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6280*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6281*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6282*9880d681SAndroid Build Coastguard Worker } 6283*9880d681SAndroid Build Coastguard Worker def vi16gpr : SIMDInsFromMain<".h", v8i16, GPR32, VectorIndexH> { 6284*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6285*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6286*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6287*9880d681SAndroid Build Coastguard Worker } 6288*9880d681SAndroid Build Coastguard Worker def vi32gpr : SIMDInsFromMain<".s", v4i32, GPR32, VectorIndexS> { 6289*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6290*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6291*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6292*9880d681SAndroid Build Coastguard Worker } 6293*9880d681SAndroid Build Coastguard Worker def vi64gpr : SIMDInsFromMain<".d", v2i64, GPR64, VectorIndexD> { 6294*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6295*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx; 6296*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b1000; 6297*9880d681SAndroid Build Coastguard Worker } 6298*9880d681SAndroid Build Coastguard Worker 6299*9880d681SAndroid Build Coastguard Worker def vi8lane : SIMDInsFromElement<".b", v16i8, i32, VectorIndexB> { 6300*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6301*9880d681SAndroid Build Coastguard Worker bits<4> idx2; 6302*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6303*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6304*9880d681SAndroid Build Coastguard Worker let Inst{14-11} = idx2; 6305*9880d681SAndroid Build Coastguard Worker } 6306*9880d681SAndroid Build Coastguard Worker def vi16lane : SIMDInsFromElement<".h", v8i16, i32, VectorIndexH> { 6307*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6308*9880d681SAndroid Build Coastguard Worker bits<3> idx2; 6309*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6310*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6311*9880d681SAndroid Build Coastguard Worker let Inst{14-12} = idx2; 6312*9880d681SAndroid Build Coastguard Worker let Inst{11} = {?}; 6313*9880d681SAndroid Build Coastguard Worker } 6314*9880d681SAndroid Build Coastguard Worker def vi32lane : SIMDInsFromElement<".s", v4i32, i32, VectorIndexS> { 6315*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6316*9880d681SAndroid Build Coastguard Worker bits<2> idx2; 6317*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6318*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6319*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = idx2; 6320*9880d681SAndroid Build Coastguard Worker let Inst{12-11} = {?,?}; 6321*9880d681SAndroid Build Coastguard Worker } 6322*9880d681SAndroid Build Coastguard Worker def vi64lane : SIMDInsFromElement<".d", v2i64, i64, VectorIndexD> { 6323*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6324*9880d681SAndroid Build Coastguard Worker bits<1> idx2; 6325*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx; 6326*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b1000; 6327*9880d681SAndroid Build Coastguard Worker let Inst{14} = idx2; 6328*9880d681SAndroid Build Coastguard Worker let Inst{13-11} = {?,?,?}; 6329*9880d681SAndroid Build Coastguard Worker } 6330*9880d681SAndroid Build Coastguard Worker 6331*9880d681SAndroid Build Coastguard Worker // For all forms of the INS instruction, the "mov" mnemonic is the 6332*9880d681SAndroid Build Coastguard Worker // preferred alias. Why they didn't just call the instruction "mov" in 6333*9880d681SAndroid Build Coastguard Worker // the first place is a very good question indeed... 6334*9880d681SAndroid Build Coastguard Worker def : SIMDInsMainMovAlias<".b", !cast<Instruction>(NAME#"vi8gpr"), 6335*9880d681SAndroid Build Coastguard Worker GPR32, VectorIndexB>; 6336*9880d681SAndroid Build Coastguard Worker def : SIMDInsMainMovAlias<".h", !cast<Instruction>(NAME#"vi16gpr"), 6337*9880d681SAndroid Build Coastguard Worker GPR32, VectorIndexH>; 6338*9880d681SAndroid Build Coastguard Worker def : SIMDInsMainMovAlias<".s", !cast<Instruction>(NAME#"vi32gpr"), 6339*9880d681SAndroid Build Coastguard Worker GPR32, VectorIndexS>; 6340*9880d681SAndroid Build Coastguard Worker def : SIMDInsMainMovAlias<".d", !cast<Instruction>(NAME#"vi64gpr"), 6341*9880d681SAndroid Build Coastguard Worker GPR64, VectorIndexD>; 6342*9880d681SAndroid Build Coastguard Worker 6343*9880d681SAndroid Build Coastguard Worker def : SIMDInsElementMovAlias<".b", !cast<Instruction>(NAME#"vi8lane"), 6344*9880d681SAndroid Build Coastguard Worker VectorIndexB>; 6345*9880d681SAndroid Build Coastguard Worker def : SIMDInsElementMovAlias<".h", !cast<Instruction>(NAME#"vi16lane"), 6346*9880d681SAndroid Build Coastguard Worker VectorIndexH>; 6347*9880d681SAndroid Build Coastguard Worker def : SIMDInsElementMovAlias<".s", !cast<Instruction>(NAME#"vi32lane"), 6348*9880d681SAndroid Build Coastguard Worker VectorIndexS>; 6349*9880d681SAndroid Build Coastguard Worker def : SIMDInsElementMovAlias<".d", !cast<Instruction>(NAME#"vi64lane"), 6350*9880d681SAndroid Build Coastguard Worker VectorIndexD>; 6351*9880d681SAndroid Build Coastguard Worker} 6352*9880d681SAndroid Build Coastguard Worker 6353*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6354*9880d681SAndroid Build Coastguard Worker// AdvSIMD TBL/TBX 6355*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6356*9880d681SAndroid Build Coastguard Worker 6357*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 6358*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTableLookup<bit Q, bits<2> len, bit op, RegisterOperand vectype, 6359*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, string asm, string kind> 6360*9880d681SAndroid Build Coastguard Worker : I<(outs vectype:$Vd), (ins listtype:$Vn, vectype:$Vm), asm, 6361*9880d681SAndroid Build Coastguard Worker "\t$Vd" # kind # ", $Vn, $Vm" # kind, "", []>, 6362*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6363*9880d681SAndroid Build Coastguard Worker bits<5> Vd; 6364*9880d681SAndroid Build Coastguard Worker bits<5> Vn; 6365*9880d681SAndroid Build Coastguard Worker bits<5> Vm; 6366*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6367*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6368*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b001110000; 6369*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Vm; 6370*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 6371*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = len; 6372*9880d681SAndroid Build Coastguard Worker let Inst{12} = op; 6373*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 6374*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Vn; 6375*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vd; 6376*9880d681SAndroid Build Coastguard Worker} 6377*9880d681SAndroid Build Coastguard Worker 6378*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 6379*9880d681SAndroid Build Coastguard Workerclass BaseSIMDTableLookupTied<bit Q, bits<2> len, bit op, RegisterOperand vectype, 6380*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, string asm, string kind> 6381*9880d681SAndroid Build Coastguard Worker : I<(outs vectype:$dst), (ins vectype:$Vd, listtype:$Vn, vectype:$Vm), asm, 6382*9880d681SAndroid Build Coastguard Worker "\t$Vd" # kind # ", $Vn, $Vm" # kind, "$Vd = $dst", []>, 6383*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6384*9880d681SAndroid Build Coastguard Worker bits<5> Vd; 6385*9880d681SAndroid Build Coastguard Worker bits<5> Vn; 6386*9880d681SAndroid Build Coastguard Worker bits<5> Vm; 6387*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6388*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6389*9880d681SAndroid Build Coastguard Worker let Inst{29-21} = 0b001110000; 6390*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Vm; 6391*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 6392*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = len; 6393*9880d681SAndroid Build Coastguard Worker let Inst{12} = op; 6394*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 6395*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Vn; 6396*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vd; 6397*9880d681SAndroid Build Coastguard Worker} 6398*9880d681SAndroid Build Coastguard Worker 6399*9880d681SAndroid Build Coastguard Workerclass SIMDTableLookupAlias<string asm, Instruction inst, 6400*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, RegisterOperand listtype> 6401*9880d681SAndroid Build Coastguard Worker : InstAlias<!strconcat(asm, "\t$dst, $lst, $index"), 6402*9880d681SAndroid Build Coastguard Worker (inst vectype:$dst, listtype:$lst, vectype:$index), 0>; 6403*9880d681SAndroid Build Coastguard Worker 6404*9880d681SAndroid Build Coastguard Workermulticlass SIMDTableLookup<bit op, string asm> { 6405*9880d681SAndroid Build Coastguard Worker def v8i8One : BaseSIMDTableLookup<0, 0b00, op, V64, VecListOne16b, 6406*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6407*9880d681SAndroid Build Coastguard Worker def v8i8Two : BaseSIMDTableLookup<0, 0b01, op, V64, VecListTwo16b, 6408*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6409*9880d681SAndroid Build Coastguard Worker def v8i8Three : BaseSIMDTableLookup<0, 0b10, op, V64, VecListThree16b, 6410*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6411*9880d681SAndroid Build Coastguard Worker def v8i8Four : BaseSIMDTableLookup<0, 0b11, op, V64, VecListFour16b, 6412*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6413*9880d681SAndroid Build Coastguard Worker def v16i8One : BaseSIMDTableLookup<1, 0b00, op, V128, VecListOne16b, 6414*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6415*9880d681SAndroid Build Coastguard Worker def v16i8Two : BaseSIMDTableLookup<1, 0b01, op, V128, VecListTwo16b, 6416*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6417*9880d681SAndroid Build Coastguard Worker def v16i8Three: BaseSIMDTableLookup<1, 0b10, op, V128, VecListThree16b, 6418*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6419*9880d681SAndroid Build Coastguard Worker def v16i8Four : BaseSIMDTableLookup<1, 0b11, op, V128, VecListFour16b, 6420*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6421*9880d681SAndroid Build Coastguard Worker 6422*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6423*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8One"), 6424*9880d681SAndroid Build Coastguard Worker V64, VecListOne128>; 6425*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6426*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Two"), 6427*9880d681SAndroid Build Coastguard Worker V64, VecListTwo128>; 6428*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6429*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Three"), 6430*9880d681SAndroid Build Coastguard Worker V64, VecListThree128>; 6431*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6432*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Four"), 6433*9880d681SAndroid Build Coastguard Worker V64, VecListFour128>; 6434*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6435*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8One"), 6436*9880d681SAndroid Build Coastguard Worker V128, VecListOne128>; 6437*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6438*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Two"), 6439*9880d681SAndroid Build Coastguard Worker V128, VecListTwo128>; 6440*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6441*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Three"), 6442*9880d681SAndroid Build Coastguard Worker V128, VecListThree128>; 6443*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6444*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Four"), 6445*9880d681SAndroid Build Coastguard Worker V128, VecListFour128>; 6446*9880d681SAndroid Build Coastguard Worker} 6447*9880d681SAndroid Build Coastguard Worker 6448*9880d681SAndroid Build Coastguard Workermulticlass SIMDTableLookupTied<bit op, string asm> { 6449*9880d681SAndroid Build Coastguard Worker def v8i8One : BaseSIMDTableLookupTied<0, 0b00, op, V64, VecListOne16b, 6450*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6451*9880d681SAndroid Build Coastguard Worker def v8i8Two : BaseSIMDTableLookupTied<0, 0b01, op, V64, VecListTwo16b, 6452*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6453*9880d681SAndroid Build Coastguard Worker def v8i8Three : BaseSIMDTableLookupTied<0, 0b10, op, V64, VecListThree16b, 6454*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6455*9880d681SAndroid Build Coastguard Worker def v8i8Four : BaseSIMDTableLookupTied<0, 0b11, op, V64, VecListFour16b, 6456*9880d681SAndroid Build Coastguard Worker asm, ".8b">; 6457*9880d681SAndroid Build Coastguard Worker def v16i8One : BaseSIMDTableLookupTied<1, 0b00, op, V128, VecListOne16b, 6458*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6459*9880d681SAndroid Build Coastguard Worker def v16i8Two : BaseSIMDTableLookupTied<1, 0b01, op, V128, VecListTwo16b, 6460*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6461*9880d681SAndroid Build Coastguard Worker def v16i8Three: BaseSIMDTableLookupTied<1, 0b10, op, V128, VecListThree16b, 6462*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6463*9880d681SAndroid Build Coastguard Worker def v16i8Four : BaseSIMDTableLookupTied<1, 0b11, op, V128, VecListFour16b, 6464*9880d681SAndroid Build Coastguard Worker asm, ".16b">; 6465*9880d681SAndroid Build Coastguard Worker 6466*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6467*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8One"), 6468*9880d681SAndroid Build Coastguard Worker V64, VecListOne128>; 6469*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6470*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Two"), 6471*9880d681SAndroid Build Coastguard Worker V64, VecListTwo128>; 6472*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6473*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Three"), 6474*9880d681SAndroid Build Coastguard Worker V64, VecListThree128>; 6475*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".8b", 6476*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v8i8Four"), 6477*9880d681SAndroid Build Coastguard Worker V64, VecListFour128>; 6478*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6479*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8One"), 6480*9880d681SAndroid Build Coastguard Worker V128, VecListOne128>; 6481*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6482*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Two"), 6483*9880d681SAndroid Build Coastguard Worker V128, VecListTwo128>; 6484*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6485*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Three"), 6486*9880d681SAndroid Build Coastguard Worker V128, VecListThree128>; 6487*9880d681SAndroid Build Coastguard Worker def : SIMDTableLookupAlias<asm # ".16b", 6488*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"v16i8Four"), 6489*9880d681SAndroid Build Coastguard Worker V128, VecListFour128>; 6490*9880d681SAndroid Build Coastguard Worker} 6491*9880d681SAndroid Build Coastguard Worker 6492*9880d681SAndroid Build Coastguard Worker 6493*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6494*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar CPY 6495*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6496*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 6497*9880d681SAndroid Build Coastguard Workerclass BaseSIMDScalarCPY<RegisterClass regtype, RegisterOperand vectype, 6498*9880d681SAndroid Build Coastguard Worker string kind, Operand idxtype> 6499*9880d681SAndroid Build Coastguard Worker : I<(outs regtype:$dst), (ins vectype:$src, idxtype:$idx), "mov", 6500*9880d681SAndroid Build Coastguard Worker "{\t$dst, $src" # kind # "$idx" # 6501*9880d681SAndroid Build Coastguard Worker "|\t$dst, $src$idx}", "", []>, 6502*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6503*9880d681SAndroid Build Coastguard Worker bits<5> dst; 6504*9880d681SAndroid Build Coastguard Worker bits<5> src; 6505*9880d681SAndroid Build Coastguard Worker let Inst{31-21} = 0b01011110000; 6506*9880d681SAndroid Build Coastguard Worker let Inst{15-10} = 0b000001; 6507*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = src; 6508*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = dst; 6509*9880d681SAndroid Build Coastguard Worker} 6510*9880d681SAndroid Build Coastguard Worker 6511*9880d681SAndroid Build Coastguard Workerclass SIMDScalarCPYAlias<string asm, string size, Instruction inst, 6512*9880d681SAndroid Build Coastguard Worker RegisterClass regtype, RegisterOperand vectype, Operand idxtype> 6513*9880d681SAndroid Build Coastguard Worker : InstAlias<asm # "{\t$dst, $src" # size # "$index" # 6514*9880d681SAndroid Build Coastguard Worker # "|\t$dst, $src$index}", 6515*9880d681SAndroid Build Coastguard Worker (inst regtype:$dst, vectype:$src, idxtype:$index), 0>; 6516*9880d681SAndroid Build Coastguard Worker 6517*9880d681SAndroid Build Coastguard Worker 6518*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarCPY<string asm> { 6519*9880d681SAndroid Build Coastguard Worker def i8 : BaseSIMDScalarCPY<FPR8, V128, ".b", VectorIndexB> { 6520*9880d681SAndroid Build Coastguard Worker bits<4> idx; 6521*9880d681SAndroid Build Coastguard Worker let Inst{20-17} = idx; 6522*9880d681SAndroid Build Coastguard Worker let Inst{16} = 1; 6523*9880d681SAndroid Build Coastguard Worker } 6524*9880d681SAndroid Build Coastguard Worker def i16 : BaseSIMDScalarCPY<FPR16, V128, ".h", VectorIndexH> { 6525*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6526*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = idx; 6527*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = 0b10; 6528*9880d681SAndroid Build Coastguard Worker } 6529*9880d681SAndroid Build Coastguard Worker def i32 : BaseSIMDScalarCPY<FPR32, V128, ".s", VectorIndexS> { 6530*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6531*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = idx; 6532*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = 0b100; 6533*9880d681SAndroid Build Coastguard Worker } 6534*9880d681SAndroid Build Coastguard Worker def i64 : BaseSIMDScalarCPY<FPR64, V128, ".d", VectorIndexD> { 6535*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6536*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx; 6537*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b1000; 6538*9880d681SAndroid Build Coastguard Worker } 6539*9880d681SAndroid Build Coastguard Worker 6540*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (scalar_to_vector (i64 (vector_extract (v2i64 V128:$src), 6541*9880d681SAndroid Build Coastguard Worker VectorIndexD:$idx)))), 6542*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # i64) V128:$src, VectorIndexD:$idx)>; 6543*9880d681SAndroid Build Coastguard Worker 6544*9880d681SAndroid Build Coastguard Worker // 'DUP' mnemonic aliases. 6545*9880d681SAndroid Build Coastguard Worker def : SIMDScalarCPYAlias<"dup", ".b", 6546*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"i8"), 6547*9880d681SAndroid Build Coastguard Worker FPR8, V128, VectorIndexB>; 6548*9880d681SAndroid Build Coastguard Worker def : SIMDScalarCPYAlias<"dup", ".h", 6549*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"i16"), 6550*9880d681SAndroid Build Coastguard Worker FPR16, V128, VectorIndexH>; 6551*9880d681SAndroid Build Coastguard Worker def : SIMDScalarCPYAlias<"dup", ".s", 6552*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"i32"), 6553*9880d681SAndroid Build Coastguard Worker FPR32, V128, VectorIndexS>; 6554*9880d681SAndroid Build Coastguard Worker def : SIMDScalarCPYAlias<"dup", ".d", 6555*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(NAME#"i64"), 6556*9880d681SAndroid Build Coastguard Worker FPR64, V128, VectorIndexD>; 6557*9880d681SAndroid Build Coastguard Worker} 6558*9880d681SAndroid Build Coastguard Worker 6559*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6560*9880d681SAndroid Build Coastguard Worker// AdvSIMD modified immediate instructions 6561*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6562*9880d681SAndroid Build Coastguard Worker 6563*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImm<bit Q, bit op, bit op2, dag oops, dag iops, 6564*9880d681SAndroid Build Coastguard Worker string asm, string op_string, 6565*9880d681SAndroid Build Coastguard Worker string cstr, list<dag> pattern> 6566*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, op_string, cstr, pattern>, 6567*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6568*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 6569*9880d681SAndroid Build Coastguard Worker bits<8> imm8; 6570*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6571*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6572*9880d681SAndroid Build Coastguard Worker let Inst{29} = op; 6573*9880d681SAndroid Build Coastguard Worker let Inst{28-19} = 0b0111100000; 6574*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm8{7-5}; 6575*9880d681SAndroid Build Coastguard Worker let Inst{11} = op2; 6576*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 6577*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = imm8{4-0}; 6578*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 6579*9880d681SAndroid Build Coastguard Worker} 6580*9880d681SAndroid Build Coastguard Worker 6581*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVector<bit Q, bit op, bit op2, RegisterOperand vectype, 6582*9880d681SAndroid Build Coastguard Worker Operand immtype, dag opt_shift_iop, 6583*9880d681SAndroid Build Coastguard Worker string opt_shift, string asm, string kind, 6584*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 6585*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImm<Q, op, op2, (outs vectype:$Rd), 6586*9880d681SAndroid Build Coastguard Worker !con((ins immtype:$imm8), opt_shift_iop), asm, 6587*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # kind # ", $imm8" # opt_shift # 6588*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $imm8" # opt_shift # "}", 6589*9880d681SAndroid Build Coastguard Worker "", pattern> { 6590*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeModImmInstruction"; 6591*9880d681SAndroid Build Coastguard Worker} 6592*9880d681SAndroid Build Coastguard Worker 6593*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVectorTied<bit Q, bit op, RegisterOperand vectype, 6594*9880d681SAndroid Build Coastguard Worker Operand immtype, dag opt_shift_iop, 6595*9880d681SAndroid Build Coastguard Worker string opt_shift, string asm, string kind, 6596*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 6597*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImm<Q, op, 0, (outs vectype:$dst), 6598*9880d681SAndroid Build Coastguard Worker !con((ins vectype:$Rd, immtype:$imm8), opt_shift_iop), 6599*9880d681SAndroid Build Coastguard Worker asm, "{\t$Rd" # kind # ", $imm8" # opt_shift # 6600*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $imm8" # opt_shift # "}", 6601*9880d681SAndroid Build Coastguard Worker "$Rd = $dst", pattern> { 6602*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeModImmTiedInstruction"; 6603*9880d681SAndroid Build Coastguard Worker} 6604*9880d681SAndroid Build Coastguard Worker 6605*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVectorShift<bit Q, bit op, bits<2> b15_b12, 6606*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, string asm, 6607*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6608*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVector<Q, op, 0, vectype, imm0_255, 6609*9880d681SAndroid Build Coastguard Worker (ins logical_vec_shift:$shift), 6610*9880d681SAndroid Build Coastguard Worker "$shift", asm, kind, pattern> { 6611*9880d681SAndroid Build Coastguard Worker bits<2> shift; 6612*9880d681SAndroid Build Coastguard Worker let Inst{15} = b15_b12{1}; 6613*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = shift; 6614*9880d681SAndroid Build Coastguard Worker let Inst{12} = b15_b12{0}; 6615*9880d681SAndroid Build Coastguard Worker} 6616*9880d681SAndroid Build Coastguard Worker 6617*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVectorShiftTied<bit Q, bit op, bits<2> b15_b12, 6618*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, string asm, 6619*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6620*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVectorTied<Q, op, vectype, imm0_255, 6621*9880d681SAndroid Build Coastguard Worker (ins logical_vec_shift:$shift), 6622*9880d681SAndroid Build Coastguard Worker "$shift", asm, kind, pattern> { 6623*9880d681SAndroid Build Coastguard Worker bits<2> shift; 6624*9880d681SAndroid Build Coastguard Worker let Inst{15} = b15_b12{1}; 6625*9880d681SAndroid Build Coastguard Worker let Inst{14-13} = shift; 6626*9880d681SAndroid Build Coastguard Worker let Inst{12} = b15_b12{0}; 6627*9880d681SAndroid Build Coastguard Worker} 6628*9880d681SAndroid Build Coastguard Worker 6629*9880d681SAndroid Build Coastguard Worker 6630*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVectorShiftHalf<bit Q, bit op, bits<2> b15_b12, 6631*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, string asm, 6632*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6633*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVector<Q, op, 0, vectype, imm0_255, 6634*9880d681SAndroid Build Coastguard Worker (ins logical_vec_hw_shift:$shift), 6635*9880d681SAndroid Build Coastguard Worker "$shift", asm, kind, pattern> { 6636*9880d681SAndroid Build Coastguard Worker bits<2> shift; 6637*9880d681SAndroid Build Coastguard Worker let Inst{15} = b15_b12{1}; 6638*9880d681SAndroid Build Coastguard Worker let Inst{14} = 0; 6639*9880d681SAndroid Build Coastguard Worker let Inst{13} = shift{0}; 6640*9880d681SAndroid Build Coastguard Worker let Inst{12} = b15_b12{0}; 6641*9880d681SAndroid Build Coastguard Worker} 6642*9880d681SAndroid Build Coastguard Worker 6643*9880d681SAndroid Build Coastguard Workerclass BaseSIMDModifiedImmVectorShiftHalfTied<bit Q, bit op, bits<2> b15_b12, 6644*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, string asm, 6645*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6646*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVectorTied<Q, op, vectype, imm0_255, 6647*9880d681SAndroid Build Coastguard Worker (ins logical_vec_hw_shift:$shift), 6648*9880d681SAndroid Build Coastguard Worker "$shift", asm, kind, pattern> { 6649*9880d681SAndroid Build Coastguard Worker bits<2> shift; 6650*9880d681SAndroid Build Coastguard Worker let Inst{15} = b15_b12{1}; 6651*9880d681SAndroid Build Coastguard Worker let Inst{14} = 0; 6652*9880d681SAndroid Build Coastguard Worker let Inst{13} = shift{0}; 6653*9880d681SAndroid Build Coastguard Worker let Inst{12} = b15_b12{0}; 6654*9880d681SAndroid Build Coastguard Worker} 6655*9880d681SAndroid Build Coastguard Worker 6656*9880d681SAndroid Build Coastguard Workermulticlass SIMDModifiedImmVectorShift<bit op, bits<2> hw_cmode, bits<2> w_cmode, 6657*9880d681SAndroid Build Coastguard Worker string asm> { 6658*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDModifiedImmVectorShiftHalf<0, op, hw_cmode, V64, 6659*9880d681SAndroid Build Coastguard Worker asm, ".4h", []>; 6660*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDModifiedImmVectorShiftHalf<1, op, hw_cmode, V128, 6661*9880d681SAndroid Build Coastguard Worker asm, ".8h", []>; 6662*9880d681SAndroid Build Coastguard Worker 6663*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDModifiedImmVectorShift<0, op, w_cmode, V64, 6664*9880d681SAndroid Build Coastguard Worker asm, ".2s", []>; 6665*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDModifiedImmVectorShift<1, op, w_cmode, V128, 6666*9880d681SAndroid Build Coastguard Worker asm, ".4s", []>; 6667*9880d681SAndroid Build Coastguard Worker} 6668*9880d681SAndroid Build Coastguard Worker 6669*9880d681SAndroid Build Coastguard Workermulticlass SIMDModifiedImmVectorShiftTied<bit op, bits<2> hw_cmode, 6670*9880d681SAndroid Build Coastguard Worker bits<2> w_cmode, string asm, 6671*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 6672*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDModifiedImmVectorShiftHalfTied<0, op, hw_cmode, V64, 6673*9880d681SAndroid Build Coastguard Worker asm, ".4h", 6674*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), (OpNode V64:$Rd, 6675*9880d681SAndroid Build Coastguard Worker imm0_255:$imm8, 6676*9880d681SAndroid Build Coastguard Worker (i32 imm:$shift)))]>; 6677*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDModifiedImmVectorShiftHalfTied<1, op, hw_cmode, V128, 6678*9880d681SAndroid Build Coastguard Worker asm, ".8h", 6679*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), (OpNode V128:$Rd, 6680*9880d681SAndroid Build Coastguard Worker imm0_255:$imm8, 6681*9880d681SAndroid Build Coastguard Worker (i32 imm:$shift)))]>; 6682*9880d681SAndroid Build Coastguard Worker 6683*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDModifiedImmVectorShiftTied<0, op, w_cmode, V64, 6684*9880d681SAndroid Build Coastguard Worker asm, ".2s", 6685*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), (OpNode V64:$Rd, 6686*9880d681SAndroid Build Coastguard Worker imm0_255:$imm8, 6687*9880d681SAndroid Build Coastguard Worker (i32 imm:$shift)))]>; 6688*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDModifiedImmVectorShiftTied<1, op, w_cmode, V128, 6689*9880d681SAndroid Build Coastguard Worker asm, ".4s", 6690*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), (OpNode V128:$Rd, 6691*9880d681SAndroid Build Coastguard Worker imm0_255:$imm8, 6692*9880d681SAndroid Build Coastguard Worker (i32 imm:$shift)))]>; 6693*9880d681SAndroid Build Coastguard Worker} 6694*9880d681SAndroid Build Coastguard Worker 6695*9880d681SAndroid Build Coastguard Workerclass SIMDModifiedImmMoveMSL<bit Q, bit op, bits<4> cmode, 6696*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, string asm, 6697*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6698*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVector<Q, op, 0, vectype, imm0_255, 6699*9880d681SAndroid Build Coastguard Worker (ins move_vec_shift:$shift), 6700*9880d681SAndroid Build Coastguard Worker "$shift", asm, kind, pattern> { 6701*9880d681SAndroid Build Coastguard Worker bits<1> shift; 6702*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = cmode{3-1}; 6703*9880d681SAndroid Build Coastguard Worker let Inst{12} = shift; 6704*9880d681SAndroid Build Coastguard Worker} 6705*9880d681SAndroid Build Coastguard Worker 6706*9880d681SAndroid Build Coastguard Workerclass SIMDModifiedImmVectorNoShift<bit Q, bit op, bit op2, bits<4> cmode, 6707*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype, 6708*9880d681SAndroid Build Coastguard Worker Operand imm_type, string asm, 6709*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 6710*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImmVector<Q, op, op2, vectype, imm_type, (ins), "", 6711*9880d681SAndroid Build Coastguard Worker asm, kind, pattern> { 6712*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cmode; 6713*9880d681SAndroid Build Coastguard Worker} 6714*9880d681SAndroid Build Coastguard Worker 6715*9880d681SAndroid Build Coastguard Workerclass SIMDModifiedImmScalarNoShift<bit Q, bit op, bits<4> cmode, string asm, 6716*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 6717*9880d681SAndroid Build Coastguard Worker : BaseSIMDModifiedImm<Q, op, 0, (outs FPR64:$Rd), (ins simdimmtype10:$imm8), asm, 6718*9880d681SAndroid Build Coastguard Worker "\t$Rd, $imm8", "", pattern> { 6719*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = cmode; 6720*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeModImmInstruction"; 6721*9880d681SAndroid Build Coastguard Worker} 6722*9880d681SAndroid Build Coastguard Worker 6723*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6724*9880d681SAndroid Build Coastguard Worker// AdvSIMD indexed element 6725*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 6726*9880d681SAndroid Build Coastguard Worker 6727*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 6728*9880d681SAndroid Build Coastguard Workerclass BaseSIMDIndexed<bit Q, bit U, bit Scalar, bits<2> size, bits<4> opc, 6729*9880d681SAndroid Build Coastguard Worker RegisterOperand dst_reg, RegisterOperand lhs_reg, 6730*9880d681SAndroid Build Coastguard Worker RegisterOperand rhs_reg, Operand vec_idx, string asm, 6731*9880d681SAndroid Build Coastguard Worker string apple_kind, string dst_kind, string lhs_kind, 6732*9880d681SAndroid Build Coastguard Worker string rhs_kind, list<dag> pattern> 6733*9880d681SAndroid Build Coastguard Worker : I<(outs dst_reg:$Rd), (ins lhs_reg:$Rn, rhs_reg:$Rm, vec_idx:$idx), 6734*9880d681SAndroid Build Coastguard Worker asm, 6735*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dst_kind # ", $Rn" # lhs_kind # ", $Rm" # rhs_kind # "$idx" # 6736*9880d681SAndroid Build Coastguard Worker "|" # apple_kind # "\t$Rd, $Rn, $Rm$idx}", "", pattern>, 6737*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6738*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 6739*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 6740*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 6741*9880d681SAndroid Build Coastguard Worker 6742*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6743*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6744*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 6745*9880d681SAndroid Build Coastguard Worker let Inst{28} = Scalar; 6746*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1111; 6747*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 6748*9880d681SAndroid Build Coastguard Worker // Bit 21 must be set by the derived class. 6749*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 6750*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opc; 6751*9880d681SAndroid Build Coastguard Worker // Bit 11 must be set by the derived class. 6752*9880d681SAndroid Build Coastguard Worker let Inst{10} = 0; 6753*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 6754*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 6755*9880d681SAndroid Build Coastguard Worker} 6756*9880d681SAndroid Build Coastguard Worker 6757*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 6758*9880d681SAndroid Build Coastguard Workerclass BaseSIMDIndexedTied<bit Q, bit U, bit Scalar, bits<2> size, bits<4> opc, 6759*9880d681SAndroid Build Coastguard Worker RegisterOperand dst_reg, RegisterOperand lhs_reg, 6760*9880d681SAndroid Build Coastguard Worker RegisterOperand rhs_reg, Operand vec_idx, string asm, 6761*9880d681SAndroid Build Coastguard Worker string apple_kind, string dst_kind, string lhs_kind, 6762*9880d681SAndroid Build Coastguard Worker string rhs_kind, list<dag> pattern> 6763*9880d681SAndroid Build Coastguard Worker : I<(outs dst_reg:$dst), 6764*9880d681SAndroid Build Coastguard Worker (ins dst_reg:$Rd, lhs_reg:$Rn, rhs_reg:$Rm, vec_idx:$idx), asm, 6765*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dst_kind # ", $Rn" # lhs_kind # ", $Rm" # rhs_kind # "$idx" # 6766*9880d681SAndroid Build Coastguard Worker "|" # apple_kind # "\t$Rd, $Rn, $Rm$idx}", "$Rd = $dst", pattern>, 6767*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 6768*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 6769*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 6770*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 6771*9880d681SAndroid Build Coastguard Worker 6772*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 6773*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 6774*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 6775*9880d681SAndroid Build Coastguard Worker let Inst{28} = Scalar; 6776*9880d681SAndroid Build Coastguard Worker let Inst{27-24} = 0b1111; 6777*9880d681SAndroid Build Coastguard Worker let Inst{23-22} = size; 6778*9880d681SAndroid Build Coastguard Worker // Bit 21 must be set by the derived class. 6779*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 6780*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opc; 6781*9880d681SAndroid Build Coastguard Worker // Bit 11 must be set by the derived class. 6782*9880d681SAndroid Build Coastguard Worker let Inst{10} = 0; 6783*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 6784*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 6785*9880d681SAndroid Build Coastguard Worker} 6786*9880d681SAndroid Build Coastguard Worker 6787*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPIndexed<bit U, bits<4> opc, string asm, 6788*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 6789*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6790*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexed<0, U, 0, 0b00, opc, 6791*9880d681SAndroid Build Coastguard Worker V64, V64, 6792*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 6793*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", 6794*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), 6795*9880d681SAndroid Build Coastguard Worker (OpNode (v4f16 V64:$Rn), 6796*9880d681SAndroid Build Coastguard Worker (v4f16 (AArch64duplane16 (v8f16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 6797*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6798*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6799*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 6800*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 6801*9880d681SAndroid Build Coastguard Worker } 6802*9880d681SAndroid Build Coastguard Worker 6803*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexed<1, U, 0, 0b00, opc, 6804*9880d681SAndroid Build Coastguard Worker V128, V128, 6805*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 6806*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", 6807*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), 6808*9880d681SAndroid Build Coastguard Worker (OpNode (v8f16 V128:$Rn), 6809*9880d681SAndroid Build Coastguard Worker (v8f16 (AArch64duplane16 (v8f16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 6810*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6811*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6812*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 6813*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 6814*9880d681SAndroid Build Coastguard Worker } 6815*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 6816*9880d681SAndroid Build Coastguard Worker 6817*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexed<0, U, 0, 0b10, opc, 6818*9880d681SAndroid Build Coastguard Worker V64, V64, 6819*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 6820*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", 6821*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), 6822*9880d681SAndroid Build Coastguard Worker (OpNode (v2f32 V64:$Rn), 6823*9880d681SAndroid Build Coastguard Worker (v2f32 (AArch64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> { 6824*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6825*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 6826*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 6827*9880d681SAndroid Build Coastguard Worker } 6828*9880d681SAndroid Build Coastguard Worker 6829*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexed<1, U, 0, 0b10, opc, 6830*9880d681SAndroid Build Coastguard Worker V128, V128, 6831*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 6832*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", 6833*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), 6834*9880d681SAndroid Build Coastguard Worker (OpNode (v4f32 V128:$Rn), 6835*9880d681SAndroid Build Coastguard Worker (v4f32 (AArch64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> { 6836*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6837*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 6838*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 6839*9880d681SAndroid Build Coastguard Worker } 6840*9880d681SAndroid Build Coastguard Worker 6841*9880d681SAndroid Build Coastguard Worker def v2i64_indexed : BaseSIMDIndexed<1, U, 0, 0b11, opc, 6842*9880d681SAndroid Build Coastguard Worker V128, V128, 6843*9880d681SAndroid Build Coastguard Worker V128, VectorIndexD, 6844*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2d", ".d", 6845*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), 6846*9880d681SAndroid Build Coastguard Worker (OpNode (v2f64 V128:$Rn), 6847*9880d681SAndroid Build Coastguard Worker (v2f64 (AArch64duplane64 (v2f64 V128:$Rm), VectorIndexD:$idx))))]> { 6848*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6849*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 6850*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 6851*9880d681SAndroid Build Coastguard Worker } 6852*9880d681SAndroid Build Coastguard Worker 6853*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6854*9880d681SAndroid Build Coastguard Worker def v1i16_indexed : BaseSIMDIndexed<1, U, 1, 0b00, opc, 6855*9880d681SAndroid Build Coastguard Worker FPR16Op, FPR16Op, V128_lo, VectorIndexH, 6856*9880d681SAndroid Build Coastguard Worker asm, ".h", "", "", ".h", 6857*9880d681SAndroid Build Coastguard Worker [(set (f16 FPR16Op:$Rd), 6858*9880d681SAndroid Build Coastguard Worker (OpNode (f16 FPR16Op:$Rn), 6859*9880d681SAndroid Build Coastguard Worker (f16 (vector_extract (v8f16 V128_lo:$Rm), 6860*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))]> { 6861*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6862*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6863*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 6864*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 6865*9880d681SAndroid Build Coastguard Worker } 6866*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 6867*9880d681SAndroid Build Coastguard Worker 6868*9880d681SAndroid Build Coastguard Worker def v1i32_indexed : BaseSIMDIndexed<1, U, 1, 0b10, opc, 6869*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR32Op, V128, VectorIndexS, 6870*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", 6871*9880d681SAndroid Build Coastguard Worker [(set (f32 FPR32Op:$Rd), 6872*9880d681SAndroid Build Coastguard Worker (OpNode (f32 FPR32Op:$Rn), 6873*9880d681SAndroid Build Coastguard Worker (f32 (vector_extract (v4f32 V128:$Rm), 6874*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))]> { 6875*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6876*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 6877*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 6878*9880d681SAndroid Build Coastguard Worker } 6879*9880d681SAndroid Build Coastguard Worker 6880*9880d681SAndroid Build Coastguard Worker def v1i64_indexed : BaseSIMDIndexed<1, U, 1, 0b11, opc, 6881*9880d681SAndroid Build Coastguard Worker FPR64Op, FPR64Op, V128, VectorIndexD, 6882*9880d681SAndroid Build Coastguard Worker asm, ".d", "", "", ".d", 6883*9880d681SAndroid Build Coastguard Worker [(set (f64 FPR64Op:$Rd), 6884*9880d681SAndroid Build Coastguard Worker (OpNode (f64 FPR64Op:$Rn), 6885*9880d681SAndroid Build Coastguard Worker (f64 (vector_extract (v2f64 V128:$Rm), 6886*9880d681SAndroid Build Coastguard Worker VectorIndexD:$idx))))]> { 6887*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6888*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 6889*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 6890*9880d681SAndroid Build Coastguard Worker } 6891*9880d681SAndroid Build Coastguard Worker} 6892*9880d681SAndroid Build Coastguard Worker 6893*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPIndexedTiedPatterns<string INST, SDPatternOperator OpNode> { 6894*9880d681SAndroid Build Coastguard Worker // 2 variants for the .2s version: DUPLANE from 128-bit and DUP scalar. 6895*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), 6896*9880d681SAndroid Build Coastguard Worker (AArch64duplane32 (v4f32 V128:$Rm), 6897*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 6898*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # v2i32_indexed) 6899*9880d681SAndroid Build Coastguard Worker V64:$Rd, V64:$Rn, V128:$Rm, VectorIndexS:$idx)>; 6900*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), 6901*9880d681SAndroid Build Coastguard Worker (AArch64dup (f32 FPR32Op:$Rm)))), 6902*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v2i32_indexed") V64:$Rd, V64:$Rn, 6903*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>; 6904*9880d681SAndroid Build Coastguard Worker 6905*9880d681SAndroid Build Coastguard Worker 6906*9880d681SAndroid Build Coastguard Worker // 2 variants for the .4s version: DUPLANE from 128-bit and DUP scalar. 6907*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), 6908*9880d681SAndroid Build Coastguard Worker (AArch64duplane32 (v4f32 V128:$Rm), 6909*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 6910*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v4i32_indexed") 6911*9880d681SAndroid Build Coastguard Worker V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>; 6912*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), 6913*9880d681SAndroid Build Coastguard Worker (AArch64dup (f32 FPR32Op:$Rm)))), 6914*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v4i32_indexed") V128:$Rd, V128:$Rn, 6915*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>; 6916*9880d681SAndroid Build Coastguard Worker 6917*9880d681SAndroid Build Coastguard Worker // 2 variants for the .2d version: DUPLANE from 128-bit and DUP scalar. 6918*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn), 6919*9880d681SAndroid Build Coastguard Worker (AArch64duplane64 (v2f64 V128:$Rm), 6920*9880d681SAndroid Build Coastguard Worker VectorIndexD:$idx))), 6921*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v2i64_indexed") 6922*9880d681SAndroid Build Coastguard Worker V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>; 6923*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn), 6924*9880d681SAndroid Build Coastguard Worker (AArch64dup (f64 FPR64Op:$Rm)))), 6925*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v2i64_indexed") V128:$Rd, V128:$Rn, 6926*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR64Op:$Rm, dsub), (i64 0))>; 6927*9880d681SAndroid Build Coastguard Worker 6928*9880d681SAndroid Build Coastguard Worker // 2 variants for 32-bit scalar version: extract from .2s or from .4s 6929*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn), 6930*9880d681SAndroid Build Coastguard Worker (vector_extract (v4f32 V128:$Rm), VectorIndexS:$idx))), 6931*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v1i32_indexed") FPR32:$Rd, FPR32:$Rn, 6932*9880d681SAndroid Build Coastguard Worker V128:$Rm, VectorIndexS:$idx)>; 6933*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn), 6934*9880d681SAndroid Build Coastguard Worker (vector_extract (v2f32 V64:$Rm), VectorIndexS:$idx))), 6935*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v1i32_indexed") FPR32:$Rd, FPR32:$Rn, 6936*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), V64:$Rm, dsub), VectorIndexS:$idx)>; 6937*9880d681SAndroid Build Coastguard Worker 6938*9880d681SAndroid Build Coastguard Worker // 1 variant for 64-bit scalar version: extract from .1d or from .2d 6939*9880d681SAndroid Build Coastguard Worker def : Pat<(f64 (OpNode (f64 FPR64:$Rd), (f64 FPR64:$Rn), 6940*9880d681SAndroid Build Coastguard Worker (vector_extract (v2f64 V128:$Rm), VectorIndexD:$idx))), 6941*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # "v1i64_indexed") FPR64:$Rd, FPR64:$Rn, 6942*9880d681SAndroid Build Coastguard Worker V128:$Rm, VectorIndexD:$idx)>; 6943*9880d681SAndroid Build Coastguard Worker} 6944*9880d681SAndroid Build Coastguard Worker 6945*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPIndexedTied<bit U, bits<4> opc, string asm> { 6946*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6947*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexedTied<0, U, 0, 0b00, opc, V64, V64, 6948*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 6949*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", []> { 6950*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6951*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6952*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 6953*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 6954*9880d681SAndroid Build Coastguard Worker } 6955*9880d681SAndroid Build Coastguard Worker 6956*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexedTied<1, U, 0, 0b00, opc, 6957*9880d681SAndroid Build Coastguard Worker V128, V128, 6958*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 6959*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", []> { 6960*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6961*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6962*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 6963*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 6964*9880d681SAndroid Build Coastguard Worker } 6965*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 6966*9880d681SAndroid Build Coastguard Worker 6967*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexedTied<0, U, 0, 0b10, opc, V64, V64, 6968*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 6969*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", []> { 6970*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6971*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 6972*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 6973*9880d681SAndroid Build Coastguard Worker } 6974*9880d681SAndroid Build Coastguard Worker 6975*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexedTied<1, U, 0, 0b10, opc, 6976*9880d681SAndroid Build Coastguard Worker V128, V128, 6977*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 6978*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", []> { 6979*9880d681SAndroid Build Coastguard Worker bits<2> idx; 6980*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 6981*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 6982*9880d681SAndroid Build Coastguard Worker } 6983*9880d681SAndroid Build Coastguard Worker 6984*9880d681SAndroid Build Coastguard Worker def v2i64_indexed : BaseSIMDIndexedTied<1, U, 0, 0b11, opc, 6985*9880d681SAndroid Build Coastguard Worker V128, V128, 6986*9880d681SAndroid Build Coastguard Worker V128, VectorIndexD, 6987*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2d", ".d", []> { 6988*9880d681SAndroid Build Coastguard Worker bits<1> idx; 6989*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 6990*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 6991*9880d681SAndroid Build Coastguard Worker } 6992*9880d681SAndroid Build Coastguard Worker 6993*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 6994*9880d681SAndroid Build Coastguard Worker def v1i16_indexed : BaseSIMDIndexedTied<1, U, 1, 0b00, opc, 6995*9880d681SAndroid Build Coastguard Worker FPR16Op, FPR16Op, V128_lo, VectorIndexH, 6996*9880d681SAndroid Build Coastguard Worker asm, ".h", "", "", ".h", []> { 6997*9880d681SAndroid Build Coastguard Worker bits<3> idx; 6998*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 6999*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7000*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7001*9880d681SAndroid Build Coastguard Worker } 7002*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 7003*9880d681SAndroid Build Coastguard Worker 7004*9880d681SAndroid Build Coastguard Worker def v1i32_indexed : BaseSIMDIndexedTied<1, U, 1, 0b10, opc, 7005*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR32Op, V128, VectorIndexS, 7006*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", []> { 7007*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7008*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7009*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7010*9880d681SAndroid Build Coastguard Worker } 7011*9880d681SAndroid Build Coastguard Worker 7012*9880d681SAndroid Build Coastguard Worker def v1i64_indexed : BaseSIMDIndexedTied<1, U, 1, 0b11, opc, 7013*9880d681SAndroid Build Coastguard Worker FPR64Op, FPR64Op, V128, VectorIndexD, 7014*9880d681SAndroid Build Coastguard Worker asm, ".d", "", "", ".d", []> { 7015*9880d681SAndroid Build Coastguard Worker bits<1> idx; 7016*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 7017*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 7018*9880d681SAndroid Build Coastguard Worker } 7019*9880d681SAndroid Build Coastguard Worker} 7020*9880d681SAndroid Build Coastguard Worker 7021*9880d681SAndroid Build Coastguard Workermulticlass SIMDIndexedHS<bit U, bits<4> opc, string asm, 7022*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7023*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexed<0, U, 0, 0b01, opc, V64, V64, 7024*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7025*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", 7026*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), 7027*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rn), 7028*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7029*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7030*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7031*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7032*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7033*9880d681SAndroid Build Coastguard Worker } 7034*9880d681SAndroid Build Coastguard Worker 7035*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexed<1, U, 0, 0b01, opc, 7036*9880d681SAndroid Build Coastguard Worker V128, V128, 7037*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7038*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", 7039*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), 7040*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rn), 7041*9880d681SAndroid Build Coastguard Worker (v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7042*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7043*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7044*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7045*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7046*9880d681SAndroid Build Coastguard Worker } 7047*9880d681SAndroid Build Coastguard Worker 7048*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexed<0, U, 0, 0b10, opc, 7049*9880d681SAndroid Build Coastguard Worker V64, V64, 7050*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7051*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", 7052*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), 7053*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rn), 7054*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7055*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7056*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7057*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7058*9880d681SAndroid Build Coastguard Worker } 7059*9880d681SAndroid Build Coastguard Worker 7060*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexed<1, U, 0, 0b10, opc, 7061*9880d681SAndroid Build Coastguard Worker V128, V128, 7062*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7063*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", 7064*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7065*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rn), 7066*9880d681SAndroid Build Coastguard Worker (v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7067*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7068*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7069*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7070*9880d681SAndroid Build Coastguard Worker } 7071*9880d681SAndroid Build Coastguard Worker 7072*9880d681SAndroid Build Coastguard Worker def v1i16_indexed : BaseSIMDIndexed<1, U, 1, 0b01, opc, 7073*9880d681SAndroid Build Coastguard Worker FPR16Op, FPR16Op, V128_lo, VectorIndexH, 7074*9880d681SAndroid Build Coastguard Worker asm, ".h", "", "", ".h", []> { 7075*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7076*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7077*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7078*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7079*9880d681SAndroid Build Coastguard Worker } 7080*9880d681SAndroid Build Coastguard Worker 7081*9880d681SAndroid Build Coastguard Worker def v1i32_indexed : BaseSIMDIndexed<1, U, 1, 0b10, opc, 7082*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR32Op, V128, VectorIndexS, 7083*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", 7084*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32Op:$Rd), 7085*9880d681SAndroid Build Coastguard Worker (OpNode FPR32Op:$Rn, 7086*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract (v4i32 V128:$Rm), 7087*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))]> { 7088*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7089*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7090*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7091*9880d681SAndroid Build Coastguard Worker } 7092*9880d681SAndroid Build Coastguard Worker} 7093*9880d681SAndroid Build Coastguard Worker 7094*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorIndexedHS<bit U, bits<4> opc, string asm, 7095*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7096*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexed<0, U, 0, 0b01, opc, 7097*9880d681SAndroid Build Coastguard Worker V64, V64, 7098*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7099*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", 7100*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), 7101*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rn), 7102*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7103*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7104*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7105*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7106*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7107*9880d681SAndroid Build Coastguard Worker } 7108*9880d681SAndroid Build Coastguard Worker 7109*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexed<1, U, 0, 0b01, opc, 7110*9880d681SAndroid Build Coastguard Worker V128, V128, 7111*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7112*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", 7113*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), 7114*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rn), 7115*9880d681SAndroid Build Coastguard Worker (v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7116*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7117*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7118*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7119*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7120*9880d681SAndroid Build Coastguard Worker } 7121*9880d681SAndroid Build Coastguard Worker 7122*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexed<0, U, 0, 0b10, opc, 7123*9880d681SAndroid Build Coastguard Worker V64, V64, 7124*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7125*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", 7126*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), 7127*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rn), 7128*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7129*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7130*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7131*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7132*9880d681SAndroid Build Coastguard Worker } 7133*9880d681SAndroid Build Coastguard Worker 7134*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexed<1, U, 0, 0b10, opc, 7135*9880d681SAndroid Build Coastguard Worker V128, V128, 7136*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7137*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", 7138*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7139*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rn), 7140*9880d681SAndroid Build Coastguard Worker (v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7141*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7142*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7143*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7144*9880d681SAndroid Build Coastguard Worker } 7145*9880d681SAndroid Build Coastguard Worker} 7146*9880d681SAndroid Build Coastguard Worker 7147*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorIndexedHSTied<bit U, bits<4> opc, string asm, 7148*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7149*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexedTied<0, U, 0, 0b01, opc, V64, V64, 7150*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7151*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", 7152*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 7153*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rd),(v4i16 V64:$Rn), 7154*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7155*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7156*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7157*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7158*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7159*9880d681SAndroid Build Coastguard Worker } 7160*9880d681SAndroid Build Coastguard Worker 7161*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexedTied<1, U, 0, 0b01, opc, 7162*9880d681SAndroid Build Coastguard Worker V128, V128, 7163*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7164*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", 7165*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 7166*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn), 7167*9880d681SAndroid Build Coastguard Worker (v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7168*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7169*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7170*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7171*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7172*9880d681SAndroid Build Coastguard Worker } 7173*9880d681SAndroid Build Coastguard Worker 7174*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexedTied<0, U, 0, 0b10, opc, 7175*9880d681SAndroid Build Coastguard Worker V64, V64, 7176*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7177*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", 7178*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 7179*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn), 7180*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7181*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7182*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7183*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7184*9880d681SAndroid Build Coastguard Worker } 7185*9880d681SAndroid Build Coastguard Worker 7186*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexedTied<1, U, 0, 0b10, opc, 7187*9880d681SAndroid Build Coastguard Worker V128, V128, 7188*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7189*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", 7190*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 7191*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn), 7192*9880d681SAndroid Build Coastguard Worker (v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7193*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7194*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7195*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7196*9880d681SAndroid Build Coastguard Worker } 7197*9880d681SAndroid Build Coastguard Worker} 7198*9880d681SAndroid Build Coastguard Worker 7199*9880d681SAndroid Build Coastguard Workermulticlass SIMDIndexedLongSD<bit U, bits<4> opc, string asm, 7200*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7201*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexed<0, U, 0, 0b01, opc, 7202*9880d681SAndroid Build Coastguard Worker V128, V64, 7203*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7204*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4h", ".h", 7205*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7206*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rn), 7207*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7208*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7209*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7210*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7211*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7212*9880d681SAndroid Build Coastguard Worker } 7213*9880d681SAndroid Build Coastguard Worker 7214*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexed<1, U, 0, 0b01, opc, 7215*9880d681SAndroid Build Coastguard Worker V128, V128, 7216*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7217*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".4s", ".8h", ".h", 7218*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7219*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v8i16 V128:$Rn), 7220*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 7221*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))]> { 7222*9880d681SAndroid Build Coastguard Worker 7223*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7224*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7225*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7226*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7227*9880d681SAndroid Build Coastguard Worker } 7228*9880d681SAndroid Build Coastguard Worker 7229*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexed<0, U, 0, 0b10, opc, 7230*9880d681SAndroid Build Coastguard Worker V128, V64, 7231*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7232*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2s", ".s", 7233*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 7234*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rn), 7235*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7236*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7237*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7238*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7239*9880d681SAndroid Build Coastguard Worker } 7240*9880d681SAndroid Build Coastguard Worker 7241*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexed<1, U, 0, 0b10, opc, 7242*9880d681SAndroid Build Coastguard Worker V128, V128, 7243*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7244*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".2d", ".4s", ".s", 7245*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 7246*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v4i32 V128:$Rn), 7247*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm), 7248*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))]> { 7249*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7250*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7251*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7252*9880d681SAndroid Build Coastguard Worker } 7253*9880d681SAndroid Build Coastguard Worker 7254*9880d681SAndroid Build Coastguard Worker def v1i32_indexed : BaseSIMDIndexed<1, U, 1, 0b01, opc, 7255*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR16Op, V128_lo, VectorIndexH, 7256*9880d681SAndroid Build Coastguard Worker asm, ".h", "", "", ".h", []> { 7257*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7258*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7259*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7260*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7261*9880d681SAndroid Build Coastguard Worker } 7262*9880d681SAndroid Build Coastguard Worker 7263*9880d681SAndroid Build Coastguard Worker def v1i64_indexed : BaseSIMDIndexed<1, U, 1, 0b10, opc, 7264*9880d681SAndroid Build Coastguard Worker FPR64Op, FPR32Op, V128, VectorIndexS, 7265*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", []> { 7266*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7267*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7268*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7269*9880d681SAndroid Build Coastguard Worker } 7270*9880d681SAndroid Build Coastguard Worker} 7271*9880d681SAndroid Build Coastguard Worker 7272*9880d681SAndroid Build Coastguard Workermulticlass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm, 7273*9880d681SAndroid Build Coastguard Worker SDPatternOperator Accum> { 7274*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexedTied<0, U, 0, 0b01, opc, 7275*9880d681SAndroid Build Coastguard Worker V128, V64, 7276*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7277*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4h", ".h", 7278*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 7279*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 7280*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqdmull 7281*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$Rn), 7282*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 7283*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))))]> { 7284*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7285*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7286*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7287*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7288*9880d681SAndroid Build Coastguard Worker } 7289*9880d681SAndroid Build Coastguard Worker 7290*9880d681SAndroid Build Coastguard Worker // FIXME: it would be nice to use the scalar (v1i32) instruction here, but an 7291*9880d681SAndroid Build Coastguard Worker // intermediate EXTRACT_SUBREG would be untyped. 7292*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (Accum (i32 FPR32Op:$Rd), 7293*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract (v4i32 7294*9880d681SAndroid Build Coastguard Worker (int_aarch64_neon_sqdmull (v4i16 V64:$Rn), 7295*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 7296*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx)))), 7297*9880d681SAndroid Build Coastguard Worker (i64 0))))), 7298*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 7299*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # v4i16_indexed) 7300*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR32Op:$Rd, ssub), V64:$Rn, 7301*9880d681SAndroid Build Coastguard Worker V128_lo:$Rm, VectorIndexH:$idx), 7302*9880d681SAndroid Build Coastguard Worker ssub)>; 7303*9880d681SAndroid Build Coastguard Worker 7304*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexedTied<1, U, 0, 0b01, opc, 7305*9880d681SAndroid Build Coastguard Worker V128, V128, 7306*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7307*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".4s", ".8h", ".h", 7308*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 7309*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 7310*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqdmull 7311*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rn), 7312*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 7313*9880d681SAndroid Build Coastguard Worker (AArch64duplane16 (v8i16 V128_lo:$Rm), 7314*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))))]> { 7315*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7316*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7317*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7318*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7319*9880d681SAndroid Build Coastguard Worker } 7320*9880d681SAndroid Build Coastguard Worker 7321*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexedTied<0, U, 0, 0b10, opc, 7322*9880d681SAndroid Build Coastguard Worker V128, V64, 7323*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7324*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2s", ".s", 7325*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 7326*9880d681SAndroid Build Coastguard Worker (Accum (v2i64 V128:$Rd), 7327*9880d681SAndroid Build Coastguard Worker (v2i64 (int_aarch64_neon_sqdmull 7328*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rn), 7329*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), 7330*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 7331*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7332*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7333*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7334*9880d681SAndroid Build Coastguard Worker } 7335*9880d681SAndroid Build Coastguard Worker 7336*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexedTied<1, U, 0, 0b10, opc, 7337*9880d681SAndroid Build Coastguard Worker V128, V128, 7338*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7339*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".2d", ".4s", ".s", 7340*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 7341*9880d681SAndroid Build Coastguard Worker (Accum (v2i64 V128:$Rd), 7342*9880d681SAndroid Build Coastguard Worker (v2i64 (int_aarch64_neon_sqdmull 7343*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rn), 7344*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 7345*9880d681SAndroid Build Coastguard Worker (AArch64duplane32 (v4i32 V128:$Rm), 7346*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 7347*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7348*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7349*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7350*9880d681SAndroid Build Coastguard Worker } 7351*9880d681SAndroid Build Coastguard Worker 7352*9880d681SAndroid Build Coastguard Worker def v1i32_indexed : BaseSIMDIndexedTied<1, U, 1, 0b01, opc, 7353*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR16Op, V128_lo, VectorIndexH, 7354*9880d681SAndroid Build Coastguard Worker asm, ".h", "", "", ".h", []> { 7355*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7356*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7357*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7358*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7359*9880d681SAndroid Build Coastguard Worker } 7360*9880d681SAndroid Build Coastguard Worker 7361*9880d681SAndroid Build Coastguard Worker 7362*9880d681SAndroid Build Coastguard Worker def v1i64_indexed : BaseSIMDIndexedTied<1, U, 1, 0b10, opc, 7363*9880d681SAndroid Build Coastguard Worker FPR64Op, FPR32Op, V128, VectorIndexS, 7364*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", 7365*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64Op:$dst), 7366*9880d681SAndroid Build Coastguard Worker (Accum (i64 FPR64Op:$Rd), 7367*9880d681SAndroid Build Coastguard Worker (i64 (int_aarch64_neon_sqdmulls_scalar 7368*9880d681SAndroid Build Coastguard Worker (i32 FPR32Op:$Rn), 7369*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract (v4i32 V128:$Rm), 7370*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 7371*9880d681SAndroid Build Coastguard Worker 7372*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7373*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7374*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7375*9880d681SAndroid Build Coastguard Worker } 7376*9880d681SAndroid Build Coastguard Worker} 7377*9880d681SAndroid Build Coastguard Worker 7378*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorIndexedLongSD<bit U, bits<4> opc, string asm, 7379*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7380*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 7381*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexed<0, U, 0, 0b01, opc, 7382*9880d681SAndroid Build Coastguard Worker V128, V64, 7383*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7384*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4h", ".h", 7385*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7386*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rn), 7387*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7388*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7389*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7390*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7391*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7392*9880d681SAndroid Build Coastguard Worker } 7393*9880d681SAndroid Build Coastguard Worker 7394*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexed<1, U, 0, 0b01, opc, 7395*9880d681SAndroid Build Coastguard Worker V128, V128, 7396*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7397*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".4s", ".8h", ".h", 7398*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 7399*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v8i16 V128:$Rn), 7400*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 7401*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))]> { 7402*9880d681SAndroid Build Coastguard Worker 7403*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7404*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7405*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7406*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7407*9880d681SAndroid Build Coastguard Worker } 7408*9880d681SAndroid Build Coastguard Worker 7409*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexed<0, U, 0, 0b10, opc, 7410*9880d681SAndroid Build Coastguard Worker V128, V64, 7411*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7412*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2s", ".s", 7413*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 7414*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rn), 7415*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7416*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7417*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7418*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7419*9880d681SAndroid Build Coastguard Worker } 7420*9880d681SAndroid Build Coastguard Worker 7421*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexed<1, U, 0, 0b10, opc, 7422*9880d681SAndroid Build Coastguard Worker V128, V128, 7423*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7424*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".2d", ".4s", ".s", 7425*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 7426*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v4i32 V128:$Rn), 7427*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm), 7428*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))]> { 7429*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7430*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7431*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7432*9880d681SAndroid Build Coastguard Worker } 7433*9880d681SAndroid Build Coastguard Worker } 7434*9880d681SAndroid Build Coastguard Worker} 7435*9880d681SAndroid Build Coastguard Worker 7436*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorIndexedLongSDTied<bit U, bits<4> opc, string asm, 7437*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7438*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { 7439*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexedTied<0, U, 0, 0b01, opc, 7440*9880d681SAndroid Build Coastguard Worker V128, V64, 7441*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7442*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4h", ".h", 7443*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 7444*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i16 V64:$Rn), 7445*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> { 7446*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7447*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7448*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7449*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7450*9880d681SAndroid Build Coastguard Worker } 7451*9880d681SAndroid Build Coastguard Worker 7452*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexedTied<1, U, 0, 0b01, opc, 7453*9880d681SAndroid Build Coastguard Worker V128, V128, 7454*9880d681SAndroid Build Coastguard Worker V128_lo, VectorIndexH, 7455*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".4s", ".8h", ".h", 7456*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 7457*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), 7458*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 V128:$Rn), 7459*9880d681SAndroid Build Coastguard Worker (extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 7460*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))]> { 7461*9880d681SAndroid Build Coastguard Worker bits<3> idx; 7462*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 7463*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 7464*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 7465*9880d681SAndroid Build Coastguard Worker } 7466*9880d681SAndroid Build Coastguard Worker 7467*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexedTied<0, U, 0, 0b10, opc, 7468*9880d681SAndroid Build Coastguard Worker V128, V64, 7469*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7470*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", ".2s", ".s", 7471*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 7472*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), (v2i32 V64:$Rn), 7473*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> { 7474*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7475*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7476*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7477*9880d681SAndroid Build Coastguard Worker } 7478*9880d681SAndroid Build Coastguard Worker 7479*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexedTied<1, U, 0, 0b10, opc, 7480*9880d681SAndroid Build Coastguard Worker V128, V128, 7481*9880d681SAndroid Build Coastguard Worker V128, VectorIndexS, 7482*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".2d", ".4s", ".s", 7483*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 7484*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), 7485*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 V128:$Rn), 7486*9880d681SAndroid Build Coastguard Worker (extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm), 7487*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))]> { 7488*9880d681SAndroid Build Coastguard Worker bits<2> idx; 7489*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 7490*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 7491*9880d681SAndroid Build Coastguard Worker } 7492*9880d681SAndroid Build Coastguard Worker } 7493*9880d681SAndroid Build Coastguard Worker} 7494*9880d681SAndroid Build Coastguard Worker 7495*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 7496*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar shift by immediate 7497*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 7498*9880d681SAndroid Build Coastguard Worker 7499*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7500*9880d681SAndroid Build Coastguard Workerclass BaseSIMDScalarShift<bit U, bits<5> opc, bits<7> fixed_imm, 7501*9880d681SAndroid Build Coastguard Worker RegisterClass regtype1, RegisterClass regtype2, 7502*9880d681SAndroid Build Coastguard Worker Operand immtype, string asm, list<dag> pattern> 7503*9880d681SAndroid Build Coastguard Worker : I<(outs regtype1:$Rd), (ins regtype2:$Rn, immtype:$imm), 7504*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $imm", "", pattern>, 7505*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 7506*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 7507*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 7508*9880d681SAndroid Build Coastguard Worker bits<7> imm; 7509*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 7510*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 7511*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b111110; 7512*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = fixed_imm; 7513*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opc; 7514*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 7515*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 7516*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 7517*9880d681SAndroid Build Coastguard Worker} 7518*9880d681SAndroid Build Coastguard Worker 7519*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7520*9880d681SAndroid Build Coastguard Workerclass BaseSIMDScalarShiftTied<bit U, bits<5> opc, bits<7> fixed_imm, 7521*9880d681SAndroid Build Coastguard Worker RegisterClass regtype1, RegisterClass regtype2, 7522*9880d681SAndroid Build Coastguard Worker Operand immtype, string asm, list<dag> pattern> 7523*9880d681SAndroid Build Coastguard Worker : I<(outs regtype1:$dst), (ins regtype1:$Rd, regtype2:$Rn, immtype:$imm), 7524*9880d681SAndroid Build Coastguard Worker asm, "\t$Rd, $Rn, $imm", "$Rd = $dst", pattern>, 7525*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 7526*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 7527*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 7528*9880d681SAndroid Build Coastguard Worker bits<7> imm; 7529*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = 0b01; 7530*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 7531*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b111110; 7532*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = fixed_imm; 7533*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opc; 7534*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 7535*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 7536*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 7537*9880d681SAndroid Build Coastguard Worker} 7538*9880d681SAndroid Build Coastguard Worker 7539*9880d681SAndroid Build Coastguard Worker 7540*9880d681SAndroid Build Coastguard Workermulticlass SIMDFPScalarRShift<bit U, bits<5> opc, string asm> { 7541*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 7542*9880d681SAndroid Build Coastguard Worker def h : BaseSIMDScalarShift<U, opc, {0,0,1,?,?,?,?}, 7543*9880d681SAndroid Build Coastguard Worker FPR16, FPR16, vecshiftR16, asm, []> { 7544*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{3-0}; 7545*9880d681SAndroid Build Coastguard Worker } 7546*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 7547*9880d681SAndroid Build Coastguard Worker def s : BaseSIMDScalarShift<U, opc, {0,1,?,?,?,?,?}, 7548*9880d681SAndroid Build Coastguard Worker FPR32, FPR32, vecshiftR32, asm, []> { 7549*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm{4-0}; 7550*9880d681SAndroid Build Coastguard Worker } 7551*9880d681SAndroid Build Coastguard Worker 7552*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShift<U, opc, {1,?,?,?,?,?,?}, 7553*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftR64, asm, []> { 7554*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7555*9880d681SAndroid Build Coastguard Worker } 7556*9880d681SAndroid Build Coastguard Worker} 7557*9880d681SAndroid Build Coastguard Worker 7558*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarRShiftD<bit U, bits<5> opc, string asm, 7559*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7560*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShift<U, opc, {1,?,?,?,?,?,?}, 7561*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftR64, asm, 7562*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$Rd), 7563*9880d681SAndroid Build Coastguard Worker (OpNode (i64 FPR64:$Rn), (i32 vecshiftR64:$imm)))]> { 7564*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7565*9880d681SAndroid Build Coastguard Worker } 7566*9880d681SAndroid Build Coastguard Worker 7567*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 FPR64:$Rn), (i32 vecshiftR64:$imm))), 7568*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "d") FPR64:$Rn, vecshiftR64:$imm)>; 7569*9880d681SAndroid Build Coastguard Worker} 7570*9880d681SAndroid Build Coastguard Worker 7571*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarRShiftDTied<bit U, bits<5> opc, string asm, 7572*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 7573*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShiftTied<U, opc, {1,?,?,?,?,?,?}, 7574*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftR64, asm, 7575*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$dst), (OpNode (i64 FPR64:$Rd), (i64 FPR64:$Rn), 7576*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR64:$imm)))]> { 7577*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7578*9880d681SAndroid Build Coastguard Worker } 7579*9880d681SAndroid Build Coastguard Worker 7580*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn), 7581*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR64:$imm))), 7582*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "d") FPR64:$Rd, FPR64:$Rn, 7583*9880d681SAndroid Build Coastguard Worker vecshiftR64:$imm)>; 7584*9880d681SAndroid Build Coastguard Worker} 7585*9880d681SAndroid Build Coastguard Worker 7586*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarLShiftD<bit U, bits<5> opc, string asm, 7587*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7588*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShift<U, opc, {1,?,?,?,?,?,?}, 7589*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftL64, asm, 7590*9880d681SAndroid Build Coastguard Worker [(set (v1i64 FPR64:$Rd), 7591*9880d681SAndroid Build Coastguard Worker (OpNode (v1i64 FPR64:$Rn), (i32 vecshiftL64:$imm)))]> { 7592*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7593*9880d681SAndroid Build Coastguard Worker } 7594*9880d681SAndroid Build Coastguard Worker} 7595*9880d681SAndroid Build Coastguard Worker 7596*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7597*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarLShiftDTied<bit U, bits<5> opc, string asm> { 7598*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShiftTied<U, opc, {1,?,?,?,?,?,?}, 7599*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftL64, asm, []> { 7600*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7601*9880d681SAndroid Build Coastguard Worker } 7602*9880d681SAndroid Build Coastguard Worker} 7603*9880d681SAndroid Build Coastguard Worker 7604*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7605*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarRShiftBHS<bit U, bits<5> opc, string asm, 7606*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 7607*9880d681SAndroid Build Coastguard Worker def b : BaseSIMDScalarShift<U, opc, {0,0,0,1,?,?,?}, 7608*9880d681SAndroid Build Coastguard Worker FPR8, FPR16, vecshiftR8, asm, []> { 7609*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm{2-0}; 7610*9880d681SAndroid Build Coastguard Worker } 7611*9880d681SAndroid Build Coastguard Worker 7612*9880d681SAndroid Build Coastguard Worker def h : BaseSIMDScalarShift<U, opc, {0,0,1,?,?,?,?}, 7613*9880d681SAndroid Build Coastguard Worker FPR16, FPR32, vecshiftR16, asm, []> { 7614*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{3-0}; 7615*9880d681SAndroid Build Coastguard Worker } 7616*9880d681SAndroid Build Coastguard Worker 7617*9880d681SAndroid Build Coastguard Worker def s : BaseSIMDScalarShift<U, opc, {0,1,?,?,?,?,?}, 7618*9880d681SAndroid Build Coastguard Worker FPR32, FPR64, vecshiftR32, asm, 7619*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (i64 FPR64:$Rn), vecshiftR32:$imm))]> { 7620*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm{4-0}; 7621*9880d681SAndroid Build Coastguard Worker } 7622*9880d681SAndroid Build Coastguard Worker} 7623*9880d681SAndroid Build Coastguard Worker 7624*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarLShiftBHSD<bit U, bits<5> opc, string asm, 7625*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7626*9880d681SAndroid Build Coastguard Worker def b : BaseSIMDScalarShift<U, opc, {0,0,0,1,?,?,?}, 7627*9880d681SAndroid Build Coastguard Worker FPR8, FPR8, vecshiftL8, asm, []> { 7628*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm{2-0}; 7629*9880d681SAndroid Build Coastguard Worker } 7630*9880d681SAndroid Build Coastguard Worker 7631*9880d681SAndroid Build Coastguard Worker def h : BaseSIMDScalarShift<U, opc, {0,0,1,?,?,?,?}, 7632*9880d681SAndroid Build Coastguard Worker FPR16, FPR16, vecshiftL16, asm, []> { 7633*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{3-0}; 7634*9880d681SAndroid Build Coastguard Worker } 7635*9880d681SAndroid Build Coastguard Worker 7636*9880d681SAndroid Build Coastguard Worker def s : BaseSIMDScalarShift<U, opc, {0,1,?,?,?,?,?}, 7637*9880d681SAndroid Build Coastguard Worker FPR32, FPR32, vecshiftL32, asm, 7638*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (i32 FPR32:$Rn), (i32 vecshiftL32:$imm)))]> { 7639*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm{4-0}; 7640*9880d681SAndroid Build Coastguard Worker } 7641*9880d681SAndroid Build Coastguard Worker 7642*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShift<U, opc, {1,?,?,?,?,?,?}, 7643*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftL64, asm, 7644*9880d681SAndroid Build Coastguard Worker [(set (i64 FPR64:$Rd), (OpNode (i64 FPR64:$Rn), (i32 vecshiftL64:$imm)))]> { 7645*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7646*9880d681SAndroid Build Coastguard Worker } 7647*9880d681SAndroid Build Coastguard Worker 7648*9880d681SAndroid Build Coastguard Worker def : Pat<(v1i64 (OpNode (v1i64 FPR64:$Rn), (i32 vecshiftL64:$imm))), 7649*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "d") FPR64:$Rn, vecshiftL64:$imm)>; 7650*9880d681SAndroid Build Coastguard Worker} 7651*9880d681SAndroid Build Coastguard Worker 7652*9880d681SAndroid Build Coastguard Workermulticlass SIMDScalarRShiftBHSD<bit U, bits<5> opc, string asm> { 7653*9880d681SAndroid Build Coastguard Worker def b : BaseSIMDScalarShift<U, opc, {0,0,0,1,?,?,?}, 7654*9880d681SAndroid Build Coastguard Worker FPR8, FPR8, vecshiftR8, asm, []> { 7655*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm{2-0}; 7656*9880d681SAndroid Build Coastguard Worker } 7657*9880d681SAndroid Build Coastguard Worker 7658*9880d681SAndroid Build Coastguard Worker def h : BaseSIMDScalarShift<U, opc, {0,0,1,?,?,?,?}, 7659*9880d681SAndroid Build Coastguard Worker FPR16, FPR16, vecshiftR16, asm, []> { 7660*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{3-0}; 7661*9880d681SAndroid Build Coastguard Worker } 7662*9880d681SAndroid Build Coastguard Worker 7663*9880d681SAndroid Build Coastguard Worker def s : BaseSIMDScalarShift<U, opc, {0,1,?,?,?,?,?}, 7664*9880d681SAndroid Build Coastguard Worker FPR32, FPR32, vecshiftR32, asm, []> { 7665*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm{4-0}; 7666*9880d681SAndroid Build Coastguard Worker } 7667*9880d681SAndroid Build Coastguard Worker 7668*9880d681SAndroid Build Coastguard Worker def d : BaseSIMDScalarShift<U, opc, {1,?,?,?,?,?,?}, 7669*9880d681SAndroid Build Coastguard Worker FPR64, FPR64, vecshiftR64, asm, []> { 7670*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm{5-0}; 7671*9880d681SAndroid Build Coastguard Worker } 7672*9880d681SAndroid Build Coastguard Worker} 7673*9880d681SAndroid Build Coastguard Worker 7674*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 7675*9880d681SAndroid Build Coastguard Worker// AdvSIMD vector x indexed element 7676*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 7677*9880d681SAndroid Build Coastguard Worker 7678*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7679*9880d681SAndroid Build Coastguard Workerclass BaseSIMDVectorShift<bit Q, bit U, bits<5> opc, bits<7> fixed_imm, 7680*9880d681SAndroid Build Coastguard Worker RegisterOperand dst_reg, RegisterOperand src_reg, 7681*9880d681SAndroid Build Coastguard Worker Operand immtype, 7682*9880d681SAndroid Build Coastguard Worker string asm, string dst_kind, string src_kind, 7683*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 7684*9880d681SAndroid Build Coastguard Worker : I<(outs dst_reg:$Rd), (ins src_reg:$Rn, immtype:$imm), 7685*9880d681SAndroid Build Coastguard Worker asm, "{\t$Rd" # dst_kind # ", $Rn" # src_kind # ", $imm" # 7686*9880d681SAndroid Build Coastguard Worker "|" # dst_kind # "\t$Rd, $Rn, $imm}", "", pattern>, 7687*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 7688*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 7689*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 7690*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 7691*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 7692*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 7693*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b011110; 7694*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = fixed_imm; 7695*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opc; 7696*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 7697*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 7698*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 7699*9880d681SAndroid Build Coastguard Worker} 7700*9880d681SAndroid Build Coastguard Worker 7701*9880d681SAndroid Build Coastguard Workerlet mayStore = 0, mayLoad = 0, hasSideEffects = 0 in 7702*9880d681SAndroid Build Coastguard Workerclass BaseSIMDVectorShiftTied<bit Q, bit U, bits<5> opc, bits<7> fixed_imm, 7703*9880d681SAndroid Build Coastguard Worker RegisterOperand vectype1, RegisterOperand vectype2, 7704*9880d681SAndroid Build Coastguard Worker Operand immtype, 7705*9880d681SAndroid Build Coastguard Worker string asm, string dst_kind, string src_kind, 7706*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 7707*9880d681SAndroid Build Coastguard Worker : I<(outs vectype1:$dst), (ins vectype1:$Rd, vectype2:$Rn, immtype:$imm), 7708*9880d681SAndroid Build Coastguard Worker asm, "{\t$Rd" # dst_kind # ", $Rn" # src_kind # ", $imm" # 7709*9880d681SAndroid Build Coastguard Worker "|" # dst_kind # "\t$Rd, $Rn, $imm}", "$Rd = $dst", pattern>, 7710*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]> { 7711*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 7712*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 7713*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 7714*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 7715*9880d681SAndroid Build Coastguard Worker let Inst{29} = U; 7716*9880d681SAndroid Build Coastguard Worker let Inst{28-23} = 0b011110; 7717*9880d681SAndroid Build Coastguard Worker let Inst{22-16} = fixed_imm; 7718*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = opc; 7719*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 7720*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 7721*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 7722*9880d681SAndroid Build Coastguard Worker} 7723*9880d681SAndroid Build Coastguard Worker 7724*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorRShiftSD<bit U, bits<5> opc, string asm, 7725*9880d681SAndroid Build Coastguard Worker Intrinsic OpNode> { 7726*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 7727*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 7728*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR16, 7729*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 7730*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4f16 V64:$Rn), (i32 imm:$imm)))]> { 7731*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7732*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7733*9880d681SAndroid Build Coastguard Worker } 7734*9880d681SAndroid Build Coastguard Worker 7735*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShift<1, U, opc, {0,0,1,?,?,?,?}, 7736*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR16, 7737*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 7738*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8f16 V128:$Rn), (i32 imm:$imm)))]> { 7739*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7740*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7741*9880d681SAndroid Build Coastguard Worker } 7742*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 7743*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 7744*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR32, 7745*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 7746*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2f32 V64:$Rn), (i32 imm:$imm)))]> { 7747*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7748*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7749*9880d681SAndroid Build Coastguard Worker } 7750*9880d681SAndroid Build Coastguard Worker 7751*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShift<1, U, opc, {0,1,?,?,?,?,?}, 7752*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR32, 7753*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 7754*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4f32 V128:$Rn), (i32 imm:$imm)))]> { 7755*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7756*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7757*9880d681SAndroid Build Coastguard Worker } 7758*9880d681SAndroid Build Coastguard Worker 7759*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShift<1, U, opc, {1,?,?,?,?,?,?}, 7760*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR64, 7761*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 7762*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2f64 V128:$Rn), (i32 imm:$imm)))]> { 7763*9880d681SAndroid Build Coastguard Worker bits<6> imm; 7764*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 7765*9880d681SAndroid Build Coastguard Worker } 7766*9880d681SAndroid Build Coastguard Worker} 7767*9880d681SAndroid Build Coastguard Worker 7768*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorRShiftToFP<bit U, bits<5> opc, string asm, 7769*9880d681SAndroid Build Coastguard Worker Intrinsic OpNode> { 7770*9880d681SAndroid Build Coastguard Worker let Predicates = [HasNEON, HasFullFP16] in { 7771*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 7772*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR16, 7773*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 7774*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), (OpNode (v4i16 V64:$Rn), (i32 imm:$imm)))]> { 7775*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7776*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7777*9880d681SAndroid Build Coastguard Worker } 7778*9880d681SAndroid Build Coastguard Worker 7779*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShift<1, U, opc, {0,0,1,?,?,?,?}, 7780*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR16, 7781*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 7782*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), (OpNode (v8i16 V128:$Rn), (i32 imm:$imm)))]> { 7783*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7784*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7785*9880d681SAndroid Build Coastguard Worker } 7786*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasNEON, HasFullFP16] 7787*9880d681SAndroid Build Coastguard Worker 7788*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 7789*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR32, 7790*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 7791*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (OpNode (v2i32 V64:$Rn), (i32 imm:$imm)))]> { 7792*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7793*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7794*9880d681SAndroid Build Coastguard Worker } 7795*9880d681SAndroid Build Coastguard Worker 7796*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShift<1, U, opc, {0,1,?,?,?,?,?}, 7797*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR32, 7798*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 7799*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), (OpNode (v4i32 V128:$Rn), (i32 imm:$imm)))]> { 7800*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7801*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7802*9880d681SAndroid Build Coastguard Worker } 7803*9880d681SAndroid Build Coastguard Worker 7804*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShift<1, U, opc, {1,?,?,?,?,?,?}, 7805*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR64, 7806*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 7807*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), (OpNode (v2i64 V128:$Rn), (i32 imm:$imm)))]> { 7808*9880d681SAndroid Build Coastguard Worker bits<6> imm; 7809*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 7810*9880d681SAndroid Build Coastguard Worker } 7811*9880d681SAndroid Build Coastguard Worker} 7812*9880d681SAndroid Build Coastguard Worker 7813*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorRShiftNarrowBHS<bit U, bits<5> opc, string asm, 7814*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7815*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShift<0, U, opc, {0,0,0,1,?,?,?}, 7816*9880d681SAndroid Build Coastguard Worker V64, V128, vecshiftR16Narrow, 7817*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8h", 7818*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i16 V128:$Rn), vecshiftR16Narrow:$imm))]> { 7819*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7820*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7821*9880d681SAndroid Build Coastguard Worker } 7822*9880d681SAndroid Build Coastguard Worker 7823*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,0,1,?,?,?}, 7824*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR16Narrow, 7825*9880d681SAndroid Build Coastguard Worker asm#"2", ".16b", ".8h", []> { 7826*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7827*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7828*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 7829*9880d681SAndroid Build Coastguard Worker } 7830*9880d681SAndroid Build Coastguard Worker 7831*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 7832*9880d681SAndroid Build Coastguard Worker V64, V128, vecshiftR32Narrow, 7833*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4s", 7834*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i32 V128:$Rn), vecshiftR32Narrow:$imm))]> { 7835*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7836*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7837*9880d681SAndroid Build Coastguard Worker } 7838*9880d681SAndroid Build Coastguard Worker 7839*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,1,?,?,?,?}, 7840*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR32Narrow, 7841*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".4s", []> { 7842*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7843*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7844*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 7845*9880d681SAndroid Build Coastguard Worker } 7846*9880d681SAndroid Build Coastguard Worker 7847*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 7848*9880d681SAndroid Build Coastguard Worker V64, V128, vecshiftR64Narrow, 7849*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2d", 7850*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i64 V128:$Rn), vecshiftR64Narrow:$imm))]> { 7851*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7852*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7853*9880d681SAndroid Build Coastguard Worker } 7854*9880d681SAndroid Build Coastguard Worker 7855*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,1,?,?,?,?,?}, 7856*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR64Narrow, 7857*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".2d", []> { 7858*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7859*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7860*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0; 7861*9880d681SAndroid Build Coastguard Worker } 7862*9880d681SAndroid Build Coastguard Worker 7863*9880d681SAndroid Build Coastguard Worker // TableGen doesn't like patters w/ INSERT_SUBREG on the instructions 7864*9880d681SAndroid Build Coastguard Worker // themselves, so put them here instead. 7865*9880d681SAndroid Build Coastguard Worker 7866*9880d681SAndroid Build Coastguard Worker // Patterns involving what's effectively an insert high and a normal 7867*9880d681SAndroid Build Coastguard Worker // intrinsic, represented by CONCAT_VECTORS. 7868*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v8i8 V64:$Rd),(OpNode (v8i16 V128:$Rn), 7869*9880d681SAndroid Build Coastguard Worker vecshiftR16Narrow:$imm)), 7870*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v16i8_shift") 7871*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 7872*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR16Narrow:$imm)>; 7873*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v4i16 V64:$Rd), (OpNode (v4i32 V128:$Rn), 7874*9880d681SAndroid Build Coastguard Worker vecshiftR32Narrow:$imm)), 7875*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v8i16_shift") 7876*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 7877*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR32Narrow:$imm)>; 7878*9880d681SAndroid Build Coastguard Worker def : Pat<(concat_vectors (v2i32 V64:$Rd), (OpNode (v2i64 V128:$Rn), 7879*9880d681SAndroid Build Coastguard Worker vecshiftR64Narrow:$imm)), 7880*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v4i32_shift") 7881*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 7882*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR64Narrow:$imm)>; 7883*9880d681SAndroid Build Coastguard Worker} 7884*9880d681SAndroid Build Coastguard Worker 7885*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftBHSD<bit U, bits<5> opc, string asm, 7886*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7887*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShift<0, U, opc, {0,0,0,1,?,?,?}, 7888*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL8, 7889*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 7890*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn), 7891*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL8:$imm)))]> { 7892*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7893*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7894*9880d681SAndroid Build Coastguard Worker } 7895*9880d681SAndroid Build Coastguard Worker 7896*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShift<1, U, opc, {0,0,0,1,?,?,?}, 7897*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL8, 7898*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 7899*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn), 7900*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL8:$imm)))]> { 7901*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7902*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7903*9880d681SAndroid Build Coastguard Worker } 7904*9880d681SAndroid Build Coastguard Worker 7905*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 7906*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL16, 7907*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 7908*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn), 7909*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL16:$imm)))]> { 7910*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7911*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7912*9880d681SAndroid Build Coastguard Worker } 7913*9880d681SAndroid Build Coastguard Worker 7914*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShift<1, U, opc, {0,0,1,?,?,?,?}, 7915*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL16, 7916*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 7917*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), 7918*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL16:$imm)))]> { 7919*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7920*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7921*9880d681SAndroid Build Coastguard Worker } 7922*9880d681SAndroid Build Coastguard Worker 7923*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 7924*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL32, 7925*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 7926*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn), 7927*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL32:$imm)))]> { 7928*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7929*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7930*9880d681SAndroid Build Coastguard Worker } 7931*9880d681SAndroid Build Coastguard Worker 7932*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShift<1, U, opc, {0,1,?,?,?,?,?}, 7933*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL32, 7934*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 7935*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), 7936*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL32:$imm)))]> { 7937*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7938*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7939*9880d681SAndroid Build Coastguard Worker } 7940*9880d681SAndroid Build Coastguard Worker 7941*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShift<1, U, opc, {1,?,?,?,?,?,?}, 7942*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL64, 7943*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 7944*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn), 7945*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL64:$imm)))]> { 7946*9880d681SAndroid Build Coastguard Worker bits<6> imm; 7947*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 7948*9880d681SAndroid Build Coastguard Worker } 7949*9880d681SAndroid Build Coastguard Worker} 7950*9880d681SAndroid Build Coastguard Worker 7951*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorRShiftBHSD<bit U, bits<5> opc, string asm, 7952*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 7953*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShift<0, U, opc, {0,0,0,1,?,?,?}, 7954*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR8, 7955*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 7956*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (OpNode (v8i8 V64:$Rn), 7957*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR8:$imm)))]> { 7958*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7959*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7960*9880d681SAndroid Build Coastguard Worker } 7961*9880d681SAndroid Build Coastguard Worker 7962*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShift<1, U, opc, {0,0,0,1,?,?,?}, 7963*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR8, 7964*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 7965*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn), 7966*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR8:$imm)))]> { 7967*9880d681SAndroid Build Coastguard Worker bits<3> imm; 7968*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 7969*9880d681SAndroid Build Coastguard Worker } 7970*9880d681SAndroid Build Coastguard Worker 7971*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 7972*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR16, 7973*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 7974*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$Rd), (OpNode (v4i16 V64:$Rn), 7975*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR16:$imm)))]> { 7976*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7977*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7978*9880d681SAndroid Build Coastguard Worker } 7979*9880d681SAndroid Build Coastguard Worker 7980*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShift<1, U, opc, {0,0,1,?,?,?,?}, 7981*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR16, 7982*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 7983*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i16 V128:$Rn), 7984*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR16:$imm)))]> { 7985*9880d681SAndroid Build Coastguard Worker bits<4> imm; 7986*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 7987*9880d681SAndroid Build Coastguard Worker } 7988*9880d681SAndroid Build Coastguard Worker 7989*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 7990*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR32, 7991*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 7992*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), (OpNode (v2i32 V64:$Rn), 7993*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR32:$imm)))]> { 7994*9880d681SAndroid Build Coastguard Worker bits<5> imm; 7995*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 7996*9880d681SAndroid Build Coastguard Worker } 7997*9880d681SAndroid Build Coastguard Worker 7998*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShift<1, U, opc, {0,1,?,?,?,?,?}, 7999*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR32, 8000*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 8001*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i32 V128:$Rn), 8002*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR32:$imm)))]> { 8003*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8004*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8005*9880d681SAndroid Build Coastguard Worker } 8006*9880d681SAndroid Build Coastguard Worker 8007*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShift<1, U, opc, {1,?,?,?,?,?,?}, 8008*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR64, 8009*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 8010*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i64 V128:$Rn), 8011*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR64:$imm)))]> { 8012*9880d681SAndroid Build Coastguard Worker bits<6> imm; 8013*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 8014*9880d681SAndroid Build Coastguard Worker } 8015*9880d681SAndroid Build Coastguard Worker} 8016*9880d681SAndroid Build Coastguard Worker 8017*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 8018*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorRShiftBHSDTied<bit U, bits<5> opc, string asm, 8019*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 8020*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,0,0,1,?,?,?}, 8021*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR8, asm, ".8b", ".8b", 8022*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$dst), 8023*9880d681SAndroid Build Coastguard Worker (OpNode (v8i8 V64:$Rd), (v8i8 V64:$Rn), 8024*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR8:$imm)))]> { 8025*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8026*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8027*9880d681SAndroid Build Coastguard Worker } 8028*9880d681SAndroid Build Coastguard Worker 8029*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,0,1,?,?,?}, 8030*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR8, asm, ".16b", ".16b", 8031*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), 8032*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn), 8033*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR8:$imm)))]> { 8034*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8035*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8036*9880d681SAndroid Build Coastguard Worker } 8037*9880d681SAndroid Build Coastguard Worker 8038*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,0,1,?,?,?,?}, 8039*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR16, asm, ".4h", ".4h", 8040*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 8041*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rd), (v4i16 V64:$Rn), 8042*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR16:$imm)))]> { 8043*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8044*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8045*9880d681SAndroid Build Coastguard Worker } 8046*9880d681SAndroid Build Coastguard Worker 8047*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,1,?,?,?,?}, 8048*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR16, asm, ".8h", ".8h", 8049*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 8050*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn), 8051*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR16:$imm)))]> { 8052*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8053*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8054*9880d681SAndroid Build Coastguard Worker } 8055*9880d681SAndroid Build Coastguard Worker 8056*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,1,?,?,?,?,?}, 8057*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftR32, asm, ".2s", ".2s", 8058*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 8059*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn), 8060*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR32:$imm)))]> { 8061*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8062*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8063*9880d681SAndroid Build Coastguard Worker } 8064*9880d681SAndroid Build Coastguard Worker 8065*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,1,?,?,?,?,?}, 8066*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR32, asm, ".4s", ".4s", 8067*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 8068*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn), 8069*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR32:$imm)))]> { 8070*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8071*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8072*9880d681SAndroid Build Coastguard Worker } 8073*9880d681SAndroid Build Coastguard Worker 8074*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShiftTied<1, U, opc, {1,?,?,?,?,?,?}, 8075*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftR64, 8076*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", [(set (v2i64 V128:$dst), 8077*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), (v2i64 V128:$Rn), 8078*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR64:$imm)))]> { 8079*9880d681SAndroid Build Coastguard Worker bits<6> imm; 8080*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 8081*9880d681SAndroid Build Coastguard Worker } 8082*9880d681SAndroid Build Coastguard Worker} 8083*9880d681SAndroid Build Coastguard Worker 8084*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftBHSDTied<bit U, bits<5> opc, string asm, 8085*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 8086*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,0,0,1,?,?,?}, 8087*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL8, 8088*9880d681SAndroid Build Coastguard Worker asm, ".8b", ".8b", 8089*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$dst), 8090*9880d681SAndroid Build Coastguard Worker (OpNode (v8i8 V64:$Rd), (v8i8 V64:$Rn), 8091*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL8:$imm)))]> { 8092*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8093*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8094*9880d681SAndroid Build Coastguard Worker } 8095*9880d681SAndroid Build Coastguard Worker 8096*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,0,1,?,?,?}, 8097*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL8, 8098*9880d681SAndroid Build Coastguard Worker asm, ".16b", ".16b", 8099*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), 8100*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn), 8101*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL8:$imm)))]> { 8102*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8103*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8104*9880d681SAndroid Build Coastguard Worker } 8105*9880d681SAndroid Build Coastguard Worker 8106*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,0,1,?,?,?,?}, 8107*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL16, 8108*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", 8109*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 8110*9880d681SAndroid Build Coastguard Worker (OpNode (v4i16 V64:$Rd), (v4i16 V64:$Rn), 8111*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL16:$imm)))]> { 8112*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8113*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8114*9880d681SAndroid Build Coastguard Worker } 8115*9880d681SAndroid Build Coastguard Worker 8116*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,0,1,?,?,?,?}, 8117*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL16, 8118*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", 8119*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 8120*9880d681SAndroid Build Coastguard Worker (OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn), 8121*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL16:$imm)))]> { 8122*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8123*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8124*9880d681SAndroid Build Coastguard Worker } 8125*9880d681SAndroid Build Coastguard Worker 8126*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShiftTied<0, U, opc, {0,1,?,?,?,?,?}, 8127*9880d681SAndroid Build Coastguard Worker V64, V64, vecshiftL32, 8128*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", 8129*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 8130*9880d681SAndroid Build Coastguard Worker (OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn), 8131*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL32:$imm)))]> { 8132*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8133*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8134*9880d681SAndroid Build Coastguard Worker } 8135*9880d681SAndroid Build Coastguard Worker 8136*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShiftTied<1, U, opc, {0,1,?,?,?,?,?}, 8137*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL32, 8138*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", 8139*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 8140*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn), 8141*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL32:$imm)))]> { 8142*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8143*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8144*9880d681SAndroid Build Coastguard Worker } 8145*9880d681SAndroid Build Coastguard Worker 8146*9880d681SAndroid Build Coastguard Worker def v2i64_shift : BaseSIMDVectorShiftTied<1, U, opc, {1,?,?,?,?,?,?}, 8147*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL64, 8148*9880d681SAndroid Build Coastguard Worker asm, ".2d", ".2d", 8149*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$dst), 8150*9880d681SAndroid Build Coastguard Worker (OpNode (v2i64 V128:$Rd), (v2i64 V128:$Rn), 8151*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL64:$imm)))]> { 8152*9880d681SAndroid Build Coastguard Worker bits<6> imm; 8153*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = imm; 8154*9880d681SAndroid Build Coastguard Worker } 8155*9880d681SAndroid Build Coastguard Worker} 8156*9880d681SAndroid Build Coastguard Worker 8157*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftLongBHSD<bit U, bits<5> opc, string asm, 8158*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 8159*9880d681SAndroid Build Coastguard Worker def v8i8_shift : BaseSIMDVectorShift<0, U, opc, {0,0,0,1,?,?,?}, 8160*9880d681SAndroid Build Coastguard Worker V128, V64, vecshiftL8, asm, ".8h", ".8b", 8161*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), (OpNode (v8i8 V64:$Rn), vecshiftL8:$imm))]> { 8162*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8163*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8164*9880d681SAndroid Build Coastguard Worker } 8165*9880d681SAndroid Build Coastguard Worker 8166*9880d681SAndroid Build Coastguard Worker def v16i8_shift : BaseSIMDVectorShift<1, U, opc, {0,0,0,1,?,?,?}, 8167*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL8, 8168*9880d681SAndroid Build Coastguard Worker asm#"2", ".8h", ".16b", 8169*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$Rd), 8170*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v16i8 V128:$Rn), vecshiftL8:$imm))]> { 8171*9880d681SAndroid Build Coastguard Worker bits<3> imm; 8172*9880d681SAndroid Build Coastguard Worker let Inst{18-16} = imm; 8173*9880d681SAndroid Build Coastguard Worker } 8174*9880d681SAndroid Build Coastguard Worker 8175*9880d681SAndroid Build Coastguard Worker def v4i16_shift : BaseSIMDVectorShift<0, U, opc, {0,0,1,?,?,?,?}, 8176*9880d681SAndroid Build Coastguard Worker V128, V64, vecshiftL16, asm, ".4s", ".4h", 8177*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), (OpNode (v4i16 V64:$Rn), vecshiftL16:$imm))]> { 8178*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8179*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8180*9880d681SAndroid Build Coastguard Worker } 8181*9880d681SAndroid Build Coastguard Worker 8182*9880d681SAndroid Build Coastguard Worker def v8i16_shift : BaseSIMDVectorShift<1, U, opc, {0,0,1,?,?,?,?}, 8183*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL16, 8184*9880d681SAndroid Build Coastguard Worker asm#"2", ".4s", ".8h", 8185*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 8186*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v8i16 V128:$Rn), vecshiftL16:$imm))]> { 8187*9880d681SAndroid Build Coastguard Worker 8188*9880d681SAndroid Build Coastguard Worker bits<4> imm; 8189*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm; 8190*9880d681SAndroid Build Coastguard Worker } 8191*9880d681SAndroid Build Coastguard Worker 8192*9880d681SAndroid Build Coastguard Worker def v2i32_shift : BaseSIMDVectorShift<0, U, opc, {0,1,?,?,?,?,?}, 8193*9880d681SAndroid Build Coastguard Worker V128, V64, vecshiftL32, asm, ".2d", ".2s", 8194*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (OpNode (v2i32 V64:$Rn), vecshiftL32:$imm))]> { 8195*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8196*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8197*9880d681SAndroid Build Coastguard Worker } 8198*9880d681SAndroid Build Coastguard Worker 8199*9880d681SAndroid Build Coastguard Worker def v4i32_shift : BaseSIMDVectorShift<1, U, opc, {0,1,?,?,?,?,?}, 8200*9880d681SAndroid Build Coastguard Worker V128, V128, vecshiftL32, 8201*9880d681SAndroid Build Coastguard Worker asm#"2", ".2d", ".4s", 8202*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), 8203*9880d681SAndroid Build Coastguard Worker (OpNode (extract_high_v4i32 V128:$Rn), vecshiftL32:$imm))]> { 8204*9880d681SAndroid Build Coastguard Worker bits<5> imm; 8205*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = imm; 8206*9880d681SAndroid Build Coastguard Worker } 8207*9880d681SAndroid Build Coastguard Worker} 8208*9880d681SAndroid Build Coastguard Worker 8209*9880d681SAndroid Build Coastguard Worker 8210*9880d681SAndroid Build Coastguard Worker//--- 8211*9880d681SAndroid Build Coastguard Worker// Vector load/store 8212*9880d681SAndroid Build Coastguard Worker//--- 8213*9880d681SAndroid Build Coastguard Worker// SIMD ldX/stX no-index memory references don't allow the optional 8214*9880d681SAndroid Build Coastguard Worker// ", #0" constant and handle post-indexing explicitly, so we use 8215*9880d681SAndroid Build Coastguard Worker// a more specialized parse method for them. Otherwise, it's the same as 8216*9880d681SAndroid Build Coastguard Worker// the general GPR64sp handling. 8217*9880d681SAndroid Build Coastguard Worker 8218*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdSt<bit Q, bit L, bits<4> opcode, bits<2> size, 8219*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops, list<dag> pattern> 8220*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Vt, [$Rn]", "", pattern> { 8221*9880d681SAndroid Build Coastguard Worker bits<5> Vt; 8222*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 8223*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 8224*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 8225*9880d681SAndroid Build Coastguard Worker let Inst{29-23} = 0b0011000; 8226*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 8227*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = 0b000000; 8228*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 8229*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8230*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 8231*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vt; 8232*9880d681SAndroid Build Coastguard Worker} 8233*9880d681SAndroid Build Coastguard Worker 8234*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdStPost<bit Q, bit L, bits<4> opcode, bits<2> size, 8235*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops> 8236*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "\t$Vt, [$Rn], $Xm", "$Rn = $wback", []> { 8237*9880d681SAndroid Build Coastguard Worker bits<5> Vt; 8238*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 8239*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8240*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 8241*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 8242*9880d681SAndroid Build Coastguard Worker let Inst{29-23} = 0b0011001; 8243*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 8244*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; 8245*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8246*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 8247*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8248*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 8249*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vt; 8250*9880d681SAndroid Build Coastguard Worker} 8251*9880d681SAndroid Build Coastguard Worker 8252*9880d681SAndroid Build Coastguard Worker// The immediate form of AdvSIMD post-indexed addressing is encoded with 8253*9880d681SAndroid Build Coastguard Worker// register post-index addressing from the zero register. 8254*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdStAliases<string asm, string layout, string Count, 8255*9880d681SAndroid Build Coastguard Worker int Offset, int Size> { 8256*9880d681SAndroid Build Coastguard Worker // E.g. "ld1 { v0.8b, v1.8b }, [x1], #16" 8257*9880d681SAndroid Build Coastguard Worker // "ld1\t$Vt, [$Rn], #16" 8258*9880d681SAndroid Build Coastguard Worker // may get mapped to 8259*9880d681SAndroid Build Coastguard Worker // (LD1Twov8b_POST VecListTwo8b:$Vt, GPR64sp:$Rn, XZR) 8260*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vt, [$Rn], #" # Offset, 8261*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Count # "v" # layout # "_POST") 8262*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8263*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # layout):$Vt, 8264*9880d681SAndroid Build Coastguard Worker XZR), 1>; 8265*9880d681SAndroid Build Coastguard Worker 8266*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0, v1 }, [x1], #16" 8267*9880d681SAndroid Build Coastguard Worker // "ld1.8b\t$Vt, [$Rn], #16" 8268*9880d681SAndroid Build Coastguard Worker // may get mapped to 8269*9880d681SAndroid Build Coastguard Worker // (LD1Twov8b_POST VecListTwo64:$Vt, GPR64sp:$Rn, XZR) 8270*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn], #" # Offset, 8271*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Count # "v" # layout # "_POST") 8272*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8273*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8274*9880d681SAndroid Build Coastguard Worker XZR), 0>; 8275*9880d681SAndroid Build Coastguard Worker 8276*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0, v1 }, [x1]" 8277*9880d681SAndroid Build Coastguard Worker // "ld1\t$Vt, [$Rn]" 8278*9880d681SAndroid Build Coastguard Worker // may get mapped to 8279*9880d681SAndroid Build Coastguard Worker // (LD1Twov8b VecListTwo64:$Vt, GPR64sp:$Rn) 8280*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn]", 8281*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Count # "v" # layout) 8282*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8283*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), 0>; 8284*9880d681SAndroid Build Coastguard Worker 8285*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0, v1 }, [x1], x2" 8286*9880d681SAndroid Build Coastguard Worker // "ld1\t$Vt, [$Rn], $Xm" 8287*9880d681SAndroid Build Coastguard Worker // may get mapped to 8288*9880d681SAndroid Build Coastguard Worker // (LD1Twov8b_POST VecListTwo64:$Vt, GPR64sp:$Rn, GPR64pi8:$Xm) 8289*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn], $Xm", 8290*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Count # "v" # layout # "_POST") 8291*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8292*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8293*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset):$Xm), 0>; 8294*9880d681SAndroid Build Coastguard Worker} 8295*9880d681SAndroid Build Coastguard Worker 8296*9880d681SAndroid Build Coastguard Workermulticlass BaseSIMDLdN<string Count, string asm, string veclist, int Offset128, 8297*9880d681SAndroid Build Coastguard Worker int Offset64, bits<4> opcode> { 8298*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { 8299*9880d681SAndroid Build Coastguard Worker def v16b: BaseSIMDLdSt<1, 1, opcode, 0b00, asm, 8300*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "16b"):$Vt), 8301*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8302*9880d681SAndroid Build Coastguard Worker def v8h : BaseSIMDLdSt<1, 1, opcode, 0b01, asm, 8303*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "8h"):$Vt), 8304*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8305*9880d681SAndroid Build Coastguard Worker def v4s : BaseSIMDLdSt<1, 1, opcode, 0b10, asm, 8306*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "4s"):$Vt), 8307*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8308*9880d681SAndroid Build Coastguard Worker def v2d : BaseSIMDLdSt<1, 1, opcode, 0b11, asm, 8309*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "2d"):$Vt), 8310*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8311*9880d681SAndroid Build Coastguard Worker def v8b : BaseSIMDLdSt<0, 1, opcode, 0b00, asm, 8312*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "8b"):$Vt), 8313*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8314*9880d681SAndroid Build Coastguard Worker def v4h : BaseSIMDLdSt<0, 1, opcode, 0b01, asm, 8315*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "4h"):$Vt), 8316*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8317*9880d681SAndroid Build Coastguard Worker def v2s : BaseSIMDLdSt<0, 1, opcode, 0b10, asm, 8318*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "2s"):$Vt), 8319*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8320*9880d681SAndroid Build Coastguard Worker 8321*9880d681SAndroid Build Coastguard Worker 8322*9880d681SAndroid Build Coastguard Worker def v16b_POST: BaseSIMDLdStPost<1, 1, opcode, 0b00, asm, 8323*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8324*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "16b"):$Vt), 8325*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8326*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8327*9880d681SAndroid Build Coastguard Worker def v8h_POST : BaseSIMDLdStPost<1, 1, opcode, 0b01, asm, 8328*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8329*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "8h"):$Vt), 8330*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8331*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8332*9880d681SAndroid Build Coastguard Worker def v4s_POST : BaseSIMDLdStPost<1, 1, opcode, 0b10, asm, 8333*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8334*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "4s"):$Vt), 8335*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8336*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8337*9880d681SAndroid Build Coastguard Worker def v2d_POST : BaseSIMDLdStPost<1, 1, opcode, 0b11, asm, 8338*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8339*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "2d"):$Vt), 8340*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8341*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8342*9880d681SAndroid Build Coastguard Worker def v8b_POST : BaseSIMDLdStPost<0, 1, opcode, 0b00, asm, 8343*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8344*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "8b"):$Vt), 8345*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8346*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8347*9880d681SAndroid Build Coastguard Worker def v4h_POST : BaseSIMDLdStPost<0, 1, opcode, 0b01, asm, 8348*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8349*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "4h"):$Vt), 8350*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8351*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8352*9880d681SAndroid Build Coastguard Worker def v2s_POST : BaseSIMDLdStPost<0, 1, opcode, 0b10, asm, 8353*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8354*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "2s"):$Vt), 8355*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8356*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8357*9880d681SAndroid Build Coastguard Worker } 8358*9880d681SAndroid Build Coastguard Worker 8359*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "16b", Count, Offset128, 128>; 8360*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "8h", Count, Offset128, 128>; 8361*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "4s", Count, Offset128, 128>; 8362*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "2d", Count, Offset128, 128>; 8363*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "8b", Count, Offset64, 64>; 8364*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "4h", Count, Offset64, 64>; 8365*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "2s", Count, Offset64, 64>; 8366*9880d681SAndroid Build Coastguard Worker} 8367*9880d681SAndroid Build Coastguard Worker 8368*9880d681SAndroid Build Coastguard Worker// Only ld1/st1 has a v1d version. 8369*9880d681SAndroid Build Coastguard Workermulticlass BaseSIMDStN<string Count, string asm, string veclist, int Offset128, 8370*9880d681SAndroid Build Coastguard Worker int Offset64, bits<4> opcode> { 8371*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayStore = 1, mayLoad = 0 in { 8372*9880d681SAndroid Build Coastguard Worker def v16b : BaseSIMDLdSt<1, 0, opcode, 0b00, asm, (outs), 8373*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "16b"):$Vt, 8374*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8375*9880d681SAndroid Build Coastguard Worker def v8h : BaseSIMDLdSt<1, 0, opcode, 0b01, asm, (outs), 8376*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "8h"):$Vt, 8377*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8378*9880d681SAndroid Build Coastguard Worker def v4s : BaseSIMDLdSt<1, 0, opcode, 0b10, asm, (outs), 8379*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "4s"):$Vt, 8380*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8381*9880d681SAndroid Build Coastguard Worker def v2d : BaseSIMDLdSt<1, 0, opcode, 0b11, asm, (outs), 8382*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "2d"):$Vt, 8383*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8384*9880d681SAndroid Build Coastguard Worker def v8b : BaseSIMDLdSt<0, 0, opcode, 0b00, asm, (outs), 8385*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "8b"):$Vt, 8386*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8387*9880d681SAndroid Build Coastguard Worker def v4h : BaseSIMDLdSt<0, 0, opcode, 0b01, asm, (outs), 8388*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "4h"):$Vt, 8389*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8390*9880d681SAndroid Build Coastguard Worker def v2s : BaseSIMDLdSt<0, 0, opcode, 0b10, asm, (outs), 8391*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "2s"):$Vt, 8392*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8393*9880d681SAndroid Build Coastguard Worker 8394*9880d681SAndroid Build Coastguard Worker def v16b_POST : BaseSIMDLdStPost<1, 0, opcode, 0b00, asm, 8395*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8396*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "16b"):$Vt, 8397*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8398*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8399*9880d681SAndroid Build Coastguard Worker def v8h_POST : BaseSIMDLdStPost<1, 0, opcode, 0b01, asm, 8400*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8401*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "8h"):$Vt, 8402*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8403*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8404*9880d681SAndroid Build Coastguard Worker def v4s_POST : BaseSIMDLdStPost<1, 0, opcode, 0b10, asm, 8405*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8406*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "4s"):$Vt, 8407*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8408*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8409*9880d681SAndroid Build Coastguard Worker def v2d_POST : BaseSIMDLdStPost<1, 0, opcode, 0b11, asm, 8410*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8411*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "2d"):$Vt, 8412*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8413*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset128):$Xm)>; 8414*9880d681SAndroid Build Coastguard Worker def v8b_POST : BaseSIMDLdStPost<0, 0, opcode, 0b00, asm, 8415*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8416*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "8b"):$Vt, 8417*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8418*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8419*9880d681SAndroid Build Coastguard Worker def v4h_POST : BaseSIMDLdStPost<0, 0, opcode, 0b01, asm, 8420*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8421*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "4h"):$Vt, 8422*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8423*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8424*9880d681SAndroid Build Coastguard Worker def v2s_POST : BaseSIMDLdStPost<0, 0, opcode, 0b10, asm, 8425*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8426*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "2s"):$Vt, 8427*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8428*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8429*9880d681SAndroid Build Coastguard Worker } 8430*9880d681SAndroid Build Coastguard Worker 8431*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "16b", Count, Offset128, 128>; 8432*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "8h", Count, Offset128, 128>; 8433*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "4s", Count, Offset128, 128>; 8434*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "2d", Count, Offset128, 128>; 8435*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "8b", Count, Offset64, 64>; 8436*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "4h", Count, Offset64, 64>; 8437*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "2s", Count, Offset64, 64>; 8438*9880d681SAndroid Build Coastguard Worker} 8439*9880d681SAndroid Build Coastguard Worker 8440*9880d681SAndroid Build Coastguard Workermulticlass BaseSIMDLd1<string Count, string asm, string veclist, 8441*9880d681SAndroid Build Coastguard Worker int Offset128, int Offset64, bits<4> opcode> 8442*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdN<Count, asm, veclist, Offset128, Offset64, opcode> { 8443*9880d681SAndroid Build Coastguard Worker 8444*9880d681SAndroid Build Coastguard Worker // LD1 instructions have extra "1d" variants. 8445*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { 8446*9880d681SAndroid Build Coastguard Worker def v1d : BaseSIMDLdSt<0, 1, opcode, 0b11, asm, 8447*9880d681SAndroid Build Coastguard Worker (outs !cast<RegisterOperand>(veclist # "1d"):$Vt), 8448*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn), []>; 8449*9880d681SAndroid Build Coastguard Worker 8450*9880d681SAndroid Build Coastguard Worker def v1d_POST : BaseSIMDLdStPost<0, 1, opcode, 0b11, asm, 8451*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, 8452*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>(veclist # "1d"):$Vt), 8453*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, 8454*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8455*9880d681SAndroid Build Coastguard Worker } 8456*9880d681SAndroid Build Coastguard Worker 8457*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "1d", Count, Offset64, 64>; 8458*9880d681SAndroid Build Coastguard Worker} 8459*9880d681SAndroid Build Coastguard Worker 8460*9880d681SAndroid Build Coastguard Workermulticlass BaseSIMDSt1<string Count, string asm, string veclist, 8461*9880d681SAndroid Build Coastguard Worker int Offset128, int Offset64, bits<4> opcode> 8462*9880d681SAndroid Build Coastguard Worker : BaseSIMDStN<Count, asm, veclist, Offset128, Offset64, opcode> { 8463*9880d681SAndroid Build Coastguard Worker 8464*9880d681SAndroid Build Coastguard Worker // ST1 instructions have extra "1d" variants. 8465*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { 8466*9880d681SAndroid Build Coastguard Worker def v1d : BaseSIMDLdSt<0, 0, opcode, 0b11, asm, (outs), 8467*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "1d"):$Vt, 8468*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8469*9880d681SAndroid Build Coastguard Worker 8470*9880d681SAndroid Build Coastguard Worker def v1d_POST : BaseSIMDLdStPost<0, 0, opcode, 0b11, asm, 8471*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8472*9880d681SAndroid Build Coastguard Worker (ins !cast<RegisterOperand>(veclist # "1d"):$Vt, 8473*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8474*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset64):$Xm)>; 8475*9880d681SAndroid Build Coastguard Worker } 8476*9880d681SAndroid Build Coastguard Worker 8477*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStAliases<asm, "1d", Count, Offset64, 64>; 8478*9880d681SAndroid Build Coastguard Worker} 8479*9880d681SAndroid Build Coastguard Worker 8480*9880d681SAndroid Build Coastguard Workermulticlass SIMDLd1Multiple<string asm> { 8481*9880d681SAndroid Build Coastguard Worker defm One : BaseSIMDLd1<"One", asm, "VecListOne", 16, 8, 0b0111>; 8482*9880d681SAndroid Build Coastguard Worker defm Two : BaseSIMDLd1<"Two", asm, "VecListTwo", 32, 16, 0b1010>; 8483*9880d681SAndroid Build Coastguard Worker defm Three : BaseSIMDLd1<"Three", asm, "VecListThree", 48, 24, 0b0110>; 8484*9880d681SAndroid Build Coastguard Worker defm Four : BaseSIMDLd1<"Four", asm, "VecListFour", 64, 32, 0b0010>; 8485*9880d681SAndroid Build Coastguard Worker} 8486*9880d681SAndroid Build Coastguard Worker 8487*9880d681SAndroid Build Coastguard Workermulticlass SIMDSt1Multiple<string asm> { 8488*9880d681SAndroid Build Coastguard Worker defm One : BaseSIMDSt1<"One", asm, "VecListOne", 16, 8, 0b0111>; 8489*9880d681SAndroid Build Coastguard Worker defm Two : BaseSIMDSt1<"Two", asm, "VecListTwo", 32, 16, 0b1010>; 8490*9880d681SAndroid Build Coastguard Worker defm Three : BaseSIMDSt1<"Three", asm, "VecListThree", 48, 24, 0b0110>; 8491*9880d681SAndroid Build Coastguard Worker defm Four : BaseSIMDSt1<"Four", asm, "VecListFour", 64, 32, 0b0010>; 8492*9880d681SAndroid Build Coastguard Worker} 8493*9880d681SAndroid Build Coastguard Worker 8494*9880d681SAndroid Build Coastguard Workermulticlass SIMDLd2Multiple<string asm> { 8495*9880d681SAndroid Build Coastguard Worker defm Two : BaseSIMDLdN<"Two", asm, "VecListTwo", 32, 16, 0b1000>; 8496*9880d681SAndroid Build Coastguard Worker} 8497*9880d681SAndroid Build Coastguard Worker 8498*9880d681SAndroid Build Coastguard Workermulticlass SIMDSt2Multiple<string asm> { 8499*9880d681SAndroid Build Coastguard Worker defm Two : BaseSIMDStN<"Two", asm, "VecListTwo", 32, 16, 0b1000>; 8500*9880d681SAndroid Build Coastguard Worker} 8501*9880d681SAndroid Build Coastguard Worker 8502*9880d681SAndroid Build Coastguard Workermulticlass SIMDLd3Multiple<string asm> { 8503*9880d681SAndroid Build Coastguard Worker defm Three : BaseSIMDLdN<"Three", asm, "VecListThree", 48, 24, 0b0100>; 8504*9880d681SAndroid Build Coastguard Worker} 8505*9880d681SAndroid Build Coastguard Worker 8506*9880d681SAndroid Build Coastguard Workermulticlass SIMDSt3Multiple<string asm> { 8507*9880d681SAndroid Build Coastguard Worker defm Three : BaseSIMDStN<"Three", asm, "VecListThree", 48, 24, 0b0100>; 8508*9880d681SAndroid Build Coastguard Worker} 8509*9880d681SAndroid Build Coastguard Worker 8510*9880d681SAndroid Build Coastguard Workermulticlass SIMDLd4Multiple<string asm> { 8511*9880d681SAndroid Build Coastguard Worker defm Four : BaseSIMDLdN<"Four", asm, "VecListFour", 64, 32, 0b0000>; 8512*9880d681SAndroid Build Coastguard Worker} 8513*9880d681SAndroid Build Coastguard Worker 8514*9880d681SAndroid Build Coastguard Workermulticlass SIMDSt4Multiple<string asm> { 8515*9880d681SAndroid Build Coastguard Worker defm Four : BaseSIMDStN<"Four", asm, "VecListFour", 64, 32, 0b0000>; 8516*9880d681SAndroid Build Coastguard Worker} 8517*9880d681SAndroid Build Coastguard Worker 8518*9880d681SAndroid Build Coastguard Worker//--- 8519*9880d681SAndroid Build Coastguard Worker// AdvSIMD Load/store single-element 8520*9880d681SAndroid Build Coastguard Worker//--- 8521*9880d681SAndroid Build Coastguard Worker 8522*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdStSingle<bit L, bit R, bits<3> opcode, 8523*9880d681SAndroid Build Coastguard Worker string asm, string operands, string cst, 8524*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8525*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, cst, pattern> { 8526*9880d681SAndroid Build Coastguard Worker bits<5> Vt; 8527*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 8528*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 8529*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b001101; 8530*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 8531*9880d681SAndroid Build Coastguard Worker let Inst{21} = R; 8532*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = opcode; 8533*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 8534*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vt; 8535*9880d681SAndroid Build Coastguard Worker} 8536*9880d681SAndroid Build Coastguard Worker 8537*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdStSingleTied<bit L, bit R, bits<3> opcode, 8538*9880d681SAndroid Build Coastguard Worker string asm, string operands, string cst, 8539*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8540*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, "$Vt = $dst," # cst, pattern> { 8541*9880d681SAndroid Build Coastguard Worker bits<5> Vt; 8542*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 8543*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0; 8544*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b001101; 8545*9880d681SAndroid Build Coastguard Worker let Inst{22} = L; 8546*9880d681SAndroid Build Coastguard Worker let Inst{21} = R; 8547*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = opcode; 8548*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 8549*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Vt; 8550*9880d681SAndroid Build Coastguard Worker} 8551*9880d681SAndroid Build Coastguard Worker 8552*9880d681SAndroid Build Coastguard Worker 8553*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8554*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdR<bit Q, bit R, bits<3> opcode, bit S, bits<2> size, string asm, 8555*9880d681SAndroid Build Coastguard Worker Operand listtype> 8556*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<1, R, opcode, asm, "\t$Vt, [$Rn]", "", 8557*9880d681SAndroid Build Coastguard Worker (outs listtype:$Vt), (ins GPR64sp:$Rn), 8558*9880d681SAndroid Build Coastguard Worker []> { 8559*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 8560*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8561*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8562*9880d681SAndroid Build Coastguard Worker let Inst{12} = S; 8563*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8564*9880d681SAndroid Build Coastguard Worker} 8565*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8566*9880d681SAndroid Build Coastguard Workerclass BaseSIMDLdRPost<bit Q, bit R, bits<3> opcode, bit S, bits<2> size, 8567*9880d681SAndroid Build Coastguard Worker string asm, Operand listtype, Operand GPR64pi> 8568*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<1, R, opcode, asm, "\t$Vt, [$Rn], $Xm", 8569*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", 8570*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, listtype:$Vt), 8571*9880d681SAndroid Build Coastguard Worker (ins GPR64sp:$Rn, GPR64pi:$Xm), []> { 8572*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8573*9880d681SAndroid Build Coastguard Worker let Inst{30} = Q; 8574*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8575*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8576*9880d681SAndroid Build Coastguard Worker let Inst{12} = S; 8577*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8578*9880d681SAndroid Build Coastguard Worker} 8579*9880d681SAndroid Build Coastguard Worker 8580*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdrAliases<string asm, string layout, string Count, 8581*9880d681SAndroid Build Coastguard Worker int Offset, int Size> { 8582*9880d681SAndroid Build Coastguard Worker // E.g. "ld1r { v0.8b }, [x1], #1" 8583*9880d681SAndroid Build Coastguard Worker // "ld1r.8b\t$Vt, [$Rn], #1" 8584*9880d681SAndroid Build Coastguard Worker // may get mapped to 8585*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne8b:$Vt, GPR64sp:$Rn, XZR) 8586*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vt, [$Rn], #" # Offset, 8587*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v" # layout # "_POST") 8588*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8589*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # layout):$Vt, 8590*9880d681SAndroid Build Coastguard Worker XZR), 1>; 8591*9880d681SAndroid Build Coastguard Worker 8592*9880d681SAndroid Build Coastguard Worker // E.g. "ld1r.8b { v0 }, [x1], #1" 8593*9880d681SAndroid Build Coastguard Worker // "ld1r.8b\t$Vt, [$Rn], #1" 8594*9880d681SAndroid Build Coastguard Worker // may get mapped to 8595*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne64:$Vt, GPR64sp:$Rn, XZR) 8596*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn], #" # Offset, 8597*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v" # layout # "_POST") 8598*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8599*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8600*9880d681SAndroid Build Coastguard Worker XZR), 0>; 8601*9880d681SAndroid Build Coastguard Worker 8602*9880d681SAndroid Build Coastguard Worker // E.g. "ld1r.8b { v0 }, [x1]" 8603*9880d681SAndroid Build Coastguard Worker // "ld1r.8b\t$Vt, [$Rn]" 8604*9880d681SAndroid Build Coastguard Worker // may get mapped to 8605*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b VecListOne64:$Vt, GPR64sp:$Rn) 8606*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn]", 8607*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v" # layout) 8608*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8609*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), 0>; 8610*9880d681SAndroid Build Coastguard Worker 8611*9880d681SAndroid Build Coastguard Worker // E.g. "ld1r.8b { v0 }, [x1], x2" 8612*9880d681SAndroid Build Coastguard Worker // "ld1r.8b\t$Vt, [$Rn], $Xm" 8613*9880d681SAndroid Build Coastguard Worker // may get mapped to 8614*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne64:$Vt, GPR64sp:$Rn, GPR64pi1:$Xm) 8615*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt, [$Rn], $Xm", 8616*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # "v" # layout # "_POST") 8617*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8618*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # Size):$Vt, 8619*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset):$Xm), 0>; 8620*9880d681SAndroid Build Coastguard Worker} 8621*9880d681SAndroid Build Coastguard Worker 8622*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdR<bit R, bits<3> opcode, bit S, string asm, string Count, 8623*9880d681SAndroid Build Coastguard Worker int Offset1, int Offset2, int Offset4, int Offset8> { 8624*9880d681SAndroid Build Coastguard Worker def v8b : BaseSIMDLdR<0, R, opcode, S, 0b00, asm, 8625*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "8b")>; 8626*9880d681SAndroid Build Coastguard Worker def v16b: BaseSIMDLdR<1, R, opcode, S, 0b00, asm, 8627*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"16b")>; 8628*9880d681SAndroid Build Coastguard Worker def v4h : BaseSIMDLdR<0, R, opcode, S, 0b01, asm, 8629*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"4h")>; 8630*9880d681SAndroid Build Coastguard Worker def v8h : BaseSIMDLdR<1, R, opcode, S, 0b01, asm, 8631*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"8h")>; 8632*9880d681SAndroid Build Coastguard Worker def v2s : BaseSIMDLdR<0, R, opcode, S, 0b10, asm, 8633*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"2s")>; 8634*9880d681SAndroid Build Coastguard Worker def v4s : BaseSIMDLdR<1, R, opcode, S, 0b10, asm, 8635*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"4s")>; 8636*9880d681SAndroid Build Coastguard Worker def v1d : BaseSIMDLdR<0, R, opcode, S, 0b11, asm, 8637*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"1d")>; 8638*9880d681SAndroid Build Coastguard Worker def v2d : BaseSIMDLdR<1, R, opcode, S, 0b11, asm, 8639*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count #"2d")>; 8640*9880d681SAndroid Build Coastguard Worker 8641*9880d681SAndroid Build Coastguard Worker def v8b_POST : BaseSIMDLdRPost<0, R, opcode, S, 0b00, asm, 8642*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "8b"), 8643*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset1)>; 8644*9880d681SAndroid Build Coastguard Worker def v16b_POST: BaseSIMDLdRPost<1, R, opcode, S, 0b00, asm, 8645*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "16b"), 8646*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset1)>; 8647*9880d681SAndroid Build Coastguard Worker def v4h_POST : BaseSIMDLdRPost<0, R, opcode, S, 0b01, asm, 8648*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "4h"), 8649*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset2)>; 8650*9880d681SAndroid Build Coastguard Worker def v8h_POST : BaseSIMDLdRPost<1, R, opcode, S, 0b01, asm, 8651*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "8h"), 8652*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset2)>; 8653*9880d681SAndroid Build Coastguard Worker def v2s_POST : BaseSIMDLdRPost<0, R, opcode, S, 0b10, asm, 8654*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "2s"), 8655*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset4)>; 8656*9880d681SAndroid Build Coastguard Worker def v4s_POST : BaseSIMDLdRPost<1, R, opcode, S, 0b10, asm, 8657*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "4s"), 8658*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset4)>; 8659*9880d681SAndroid Build Coastguard Worker def v1d_POST : BaseSIMDLdRPost<0, R, opcode, S, 0b11, asm, 8660*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "1d"), 8661*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset8)>; 8662*9880d681SAndroid Build Coastguard Worker def v2d_POST : BaseSIMDLdRPost<1, R, opcode, S, 0b11, asm, 8663*9880d681SAndroid Build Coastguard Worker !cast<Operand>("VecList" # Count # "2d"), 8664*9880d681SAndroid Build Coastguard Worker !cast<Operand>("GPR64pi" # Offset8)>; 8665*9880d681SAndroid Build Coastguard Worker 8666*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "8b", Count, Offset1, 64>; 8667*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "16b", Count, Offset1, 128>; 8668*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "4h", Count, Offset2, 64>; 8669*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "8h", Count, Offset2, 128>; 8670*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "2s", Count, Offset4, 64>; 8671*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "4s", Count, Offset4, 128>; 8672*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "1d", Count, Offset8, 64>; 8673*9880d681SAndroid Build Coastguard Worker defm : SIMDLdrAliases<asm, "2d", Count, Offset8, 128>; 8674*9880d681SAndroid Build Coastguard Worker} 8675*9880d681SAndroid Build Coastguard Worker 8676*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleB<bit L, bit R, bits<3> opcode, string asm, 8677*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8678*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", oops, iops, 8679*9880d681SAndroid Build Coastguard Worker pattern> { 8680*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size fields. 8681*9880d681SAndroid Build Coastguard Worker bits<4> idx; 8682*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{3}; 8683*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8684*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8685*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{2}; 8686*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = idx{1-0}; 8687*9880d681SAndroid Build Coastguard Worker} 8688*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleBTied<bit L, bit R, bits<3> opcode, string asm, 8689*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8690*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", 8691*9880d681SAndroid Build Coastguard Worker oops, iops, pattern> { 8692*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size fields. 8693*9880d681SAndroid Build Coastguard Worker bits<4> idx; 8694*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{3}; 8695*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8696*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8697*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{2}; 8698*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = idx{1-0}; 8699*9880d681SAndroid Build Coastguard Worker} 8700*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleBPost<bit L, bit R, bits<3> opcode, string asm, 8701*9880d681SAndroid Build Coastguard Worker dag oops, dag iops> 8702*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8703*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8704*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size fields. 8705*9880d681SAndroid Build Coastguard Worker bits<4> idx; 8706*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8707*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{3}; 8708*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8709*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8710*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{2}; 8711*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = idx{1-0}; 8712*9880d681SAndroid Build Coastguard Worker} 8713*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleBTiedPost<bit L, bit R, bits<3> opcode, string asm, 8714*9880d681SAndroid Build Coastguard Worker dag oops, dag iops> 8715*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8716*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8717*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size fields. 8718*9880d681SAndroid Build Coastguard Worker bits<4> idx; 8719*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8720*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{3}; 8721*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8722*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8723*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{2}; 8724*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = idx{1-0}; 8725*9880d681SAndroid Build Coastguard Worker} 8726*9880d681SAndroid Build Coastguard Worker 8727*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleH<bit L, bit R, bits<3> opcode, bit size, string asm, 8728*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8729*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", oops, iops, 8730*9880d681SAndroid Build Coastguard Worker pattern> { 8731*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size<1> fields. 8732*9880d681SAndroid Build Coastguard Worker bits<3> idx; 8733*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{2}; 8734*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8735*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8736*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{1}; 8737*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 8738*9880d681SAndroid Build Coastguard Worker let Inst{10} = size; 8739*9880d681SAndroid Build Coastguard Worker} 8740*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleHTied<bit L, bit R, bits<3> opcode, bit size, string asm, 8741*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8742*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", 8743*9880d681SAndroid Build Coastguard Worker oops, iops, pattern> { 8744*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size<1> fields. 8745*9880d681SAndroid Build Coastguard Worker bits<3> idx; 8746*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{2}; 8747*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8748*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8749*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{1}; 8750*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 8751*9880d681SAndroid Build Coastguard Worker let Inst{10} = size; 8752*9880d681SAndroid Build Coastguard Worker} 8753*9880d681SAndroid Build Coastguard Worker 8754*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleHPost<bit L, bit R, bits<3> opcode, bit size, string asm, 8755*9880d681SAndroid Build Coastguard Worker dag oops, dag iops> 8756*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8757*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8758*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size<1> fields. 8759*9880d681SAndroid Build Coastguard Worker bits<3> idx; 8760*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8761*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{2}; 8762*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8763*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8764*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{1}; 8765*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 8766*9880d681SAndroid Build Coastguard Worker let Inst{10} = size; 8767*9880d681SAndroid Build Coastguard Worker} 8768*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleHTiedPost<bit L, bit R, bits<3> opcode, bit size, string asm, 8769*9880d681SAndroid Build Coastguard Worker dag oops, dag iops> 8770*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8771*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8772*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S:size<1> fields. 8773*9880d681SAndroid Build Coastguard Worker bits<3> idx; 8774*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8775*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{2}; 8776*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8777*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8778*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{1}; 8779*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{0}; 8780*9880d681SAndroid Build Coastguard Worker let Inst{10} = size; 8781*9880d681SAndroid Build Coastguard Worker} 8782*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleS<bit L, bit R, bits<3> opcode, bits<2> size, string asm, 8783*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8784*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", oops, iops, 8785*9880d681SAndroid Build Coastguard Worker pattern> { 8786*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S fields. 8787*9880d681SAndroid Build Coastguard Worker bits<2> idx; 8788*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{1}; 8789*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8790*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8791*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{0}; 8792*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8793*9880d681SAndroid Build Coastguard Worker} 8794*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleSTied<bit L, bit R, bits<3> opcode, bits<2> size, string asm, 8795*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8796*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", 8797*9880d681SAndroid Build Coastguard Worker oops, iops, pattern> { 8798*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S fields. 8799*9880d681SAndroid Build Coastguard Worker bits<2> idx; 8800*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{1}; 8801*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8802*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8803*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{0}; 8804*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8805*9880d681SAndroid Build Coastguard Worker} 8806*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleSPost<bit L, bit R, bits<3> opcode, bits<2> size, 8807*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops> 8808*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8809*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8810*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S fields. 8811*9880d681SAndroid Build Coastguard Worker bits<2> idx; 8812*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8813*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{1}; 8814*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8815*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8816*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{0}; 8817*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8818*9880d681SAndroid Build Coastguard Worker} 8819*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleSTiedPost<bit L, bit R, bits<3> opcode, bits<2> size, 8820*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops> 8821*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8822*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8823*9880d681SAndroid Build Coastguard Worker // idx encoded in Q:S fields. 8824*9880d681SAndroid Build Coastguard Worker bits<2> idx; 8825*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8826*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx{1}; 8827*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8828*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8829*9880d681SAndroid Build Coastguard Worker let Inst{12} = idx{0}; 8830*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8831*9880d681SAndroid Build Coastguard Worker} 8832*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleD<bit L, bit R, bits<3> opcode, bits<2> size, string asm, 8833*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8834*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", oops, iops, 8835*9880d681SAndroid Build Coastguard Worker pattern> { 8836*9880d681SAndroid Build Coastguard Worker // idx encoded in Q field. 8837*9880d681SAndroid Build Coastguard Worker bits<1> idx; 8838*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx; 8839*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8840*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8841*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 8842*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8843*9880d681SAndroid Build Coastguard Worker} 8844*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleDTied<bit L, bit R, bits<3> opcode, bits<2> size, string asm, 8845*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pattern> 8846*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn]", "", 8847*9880d681SAndroid Build Coastguard Worker oops, iops, pattern> { 8848*9880d681SAndroid Build Coastguard Worker // idx encoded in Q field. 8849*9880d681SAndroid Build Coastguard Worker bits<1> idx; 8850*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx; 8851*9880d681SAndroid Build Coastguard Worker let Inst{23} = 0; 8852*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 8853*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 8854*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8855*9880d681SAndroid Build Coastguard Worker} 8856*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleDPost<bit L, bit R, bits<3> opcode, bits<2> size, 8857*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops> 8858*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingle<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8859*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8860*9880d681SAndroid Build Coastguard Worker // idx encoded in Q field. 8861*9880d681SAndroid Build Coastguard Worker bits<1> idx; 8862*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8863*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx; 8864*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8865*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8866*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 8867*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8868*9880d681SAndroid Build Coastguard Worker} 8869*9880d681SAndroid Build Coastguard Workerclass SIMDLdStSingleDTiedPost<bit L, bit R, bits<3> opcode, bits<2> size, 8870*9880d681SAndroid Build Coastguard Worker string asm, dag oops, dag iops> 8871*9880d681SAndroid Build Coastguard Worker : BaseSIMDLdStSingleTied<L, R, opcode, asm, "\t$Vt$idx, [$Rn], $Xm", 8872*9880d681SAndroid Build Coastguard Worker "$Rn = $wback", oops, iops, []> { 8873*9880d681SAndroid Build Coastguard Worker // idx encoded in Q field. 8874*9880d681SAndroid Build Coastguard Worker bits<1> idx; 8875*9880d681SAndroid Build Coastguard Worker bits<5> Xm; 8876*9880d681SAndroid Build Coastguard Worker let Inst{30} = idx; 8877*9880d681SAndroid Build Coastguard Worker let Inst{23} = 1; 8878*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Xm; 8879*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 8880*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = size; 8881*9880d681SAndroid Build Coastguard Worker} 8882*9880d681SAndroid Build Coastguard Worker 8883*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8884*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSingleBTied<bit R, bits<3> opcode, string asm, 8885*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, 8886*9880d681SAndroid Build Coastguard Worker RegisterOperand GPR64pi> { 8887*9880d681SAndroid Build Coastguard Worker def i8 : SIMDLdStSingleBTied<1, R, opcode, asm, 8888*9880d681SAndroid Build Coastguard Worker (outs listtype:$dst), 8889*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexB:$idx, 8890*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8891*9880d681SAndroid Build Coastguard Worker 8892*9880d681SAndroid Build Coastguard Worker def i8_POST : SIMDLdStSingleBTiedPost<1, R, opcode, asm, 8893*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, listtype:$dst), 8894*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexB:$idx, 8895*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8896*9880d681SAndroid Build Coastguard Worker} 8897*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8898*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSingleHTied<bit R, bits<3> opcode, bit size, string asm, 8899*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, 8900*9880d681SAndroid Build Coastguard Worker RegisterOperand GPR64pi> { 8901*9880d681SAndroid Build Coastguard Worker def i16 : SIMDLdStSingleHTied<1, R, opcode, size, asm, 8902*9880d681SAndroid Build Coastguard Worker (outs listtype:$dst), 8903*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexH:$idx, 8904*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8905*9880d681SAndroid Build Coastguard Worker 8906*9880d681SAndroid Build Coastguard Worker def i16_POST : SIMDLdStSingleHTiedPost<1, R, opcode, size, asm, 8907*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, listtype:$dst), 8908*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexH:$idx, 8909*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8910*9880d681SAndroid Build Coastguard Worker} 8911*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8912*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSingleSTied<bit R, bits<3> opcode, bits<2> size,string asm, 8913*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, 8914*9880d681SAndroid Build Coastguard Worker RegisterOperand GPR64pi> { 8915*9880d681SAndroid Build Coastguard Worker def i32 : SIMDLdStSingleSTied<1, R, opcode, size, asm, 8916*9880d681SAndroid Build Coastguard Worker (outs listtype:$dst), 8917*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexS:$idx, 8918*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8919*9880d681SAndroid Build Coastguard Worker 8920*9880d681SAndroid Build Coastguard Worker def i32_POST : SIMDLdStSingleSTiedPost<1, R, opcode, size, asm, 8921*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, listtype:$dst), 8922*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexS:$idx, 8923*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8924*9880d681SAndroid Build Coastguard Worker} 8925*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0, hasSideEffects = 0 in 8926*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSingleDTied<bit R, bits<3> opcode, bits<2> size, string asm, 8927*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, RegisterOperand GPR64pi> { 8928*9880d681SAndroid Build Coastguard Worker def i64 : SIMDLdStSingleDTied<1, R, opcode, size, asm, 8929*9880d681SAndroid Build Coastguard Worker (outs listtype:$dst), 8930*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexD:$idx, 8931*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8932*9880d681SAndroid Build Coastguard Worker 8933*9880d681SAndroid Build Coastguard Worker def i64_POST : SIMDLdStSingleDTiedPost<1, R, opcode, size, asm, 8934*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback, listtype:$dst), 8935*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexD:$idx, 8936*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8937*9880d681SAndroid Build Coastguard Worker} 8938*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 8939*9880d681SAndroid Build Coastguard Workermulticlass SIMDStSingleB<bit R, bits<3> opcode, string asm, 8940*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, RegisterOperand GPR64pi> { 8941*9880d681SAndroid Build Coastguard Worker def i8 : SIMDLdStSingleB<0, R, opcode, asm, 8942*9880d681SAndroid Build Coastguard Worker (outs), (ins listtype:$Vt, VectorIndexB:$idx, 8943*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8944*9880d681SAndroid Build Coastguard Worker 8945*9880d681SAndroid Build Coastguard Worker def i8_POST : SIMDLdStSingleBPost<0, R, opcode, asm, 8946*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8947*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexB:$idx, 8948*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8949*9880d681SAndroid Build Coastguard Worker} 8950*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 8951*9880d681SAndroid Build Coastguard Workermulticlass SIMDStSingleH<bit R, bits<3> opcode, bit size, string asm, 8952*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, RegisterOperand GPR64pi> { 8953*9880d681SAndroid Build Coastguard Worker def i16 : SIMDLdStSingleH<0, R, opcode, size, asm, 8954*9880d681SAndroid Build Coastguard Worker (outs), (ins listtype:$Vt, VectorIndexH:$idx, 8955*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8956*9880d681SAndroid Build Coastguard Worker 8957*9880d681SAndroid Build Coastguard Worker def i16_POST : SIMDLdStSingleHPost<0, R, opcode, size, asm, 8958*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8959*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexH:$idx, 8960*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8961*9880d681SAndroid Build Coastguard Worker} 8962*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 8963*9880d681SAndroid Build Coastguard Workermulticlass SIMDStSingleS<bit R, bits<3> opcode, bits<2> size,string asm, 8964*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, RegisterOperand GPR64pi> { 8965*9880d681SAndroid Build Coastguard Worker def i32 : SIMDLdStSingleS<0, R, opcode, size, asm, 8966*9880d681SAndroid Build Coastguard Worker (outs), (ins listtype:$Vt, VectorIndexS:$idx, 8967*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8968*9880d681SAndroid Build Coastguard Worker 8969*9880d681SAndroid Build Coastguard Worker def i32_POST : SIMDLdStSingleSPost<0, R, opcode, size, asm, 8970*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8971*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexS:$idx, 8972*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8973*9880d681SAndroid Build Coastguard Worker} 8974*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 1, hasSideEffects = 0 in 8975*9880d681SAndroid Build Coastguard Workermulticlass SIMDStSingleD<bit R, bits<3> opcode, bits<2> size, string asm, 8976*9880d681SAndroid Build Coastguard Worker RegisterOperand listtype, RegisterOperand GPR64pi> { 8977*9880d681SAndroid Build Coastguard Worker def i64 : SIMDLdStSingleD<0, R, opcode, size, asm, 8978*9880d681SAndroid Build Coastguard Worker (outs), (ins listtype:$Vt, VectorIndexD:$idx, 8979*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), []>; 8980*9880d681SAndroid Build Coastguard Worker 8981*9880d681SAndroid Build Coastguard Worker def i64_POST : SIMDLdStSingleDPost<0, R, opcode, size, asm, 8982*9880d681SAndroid Build Coastguard Worker (outs GPR64sp:$wback), 8983*9880d681SAndroid Build Coastguard Worker (ins listtype:$Vt, VectorIndexD:$idx, 8984*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64pi:$Xm)>; 8985*9880d681SAndroid Build Coastguard Worker} 8986*9880d681SAndroid Build Coastguard Worker 8987*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdStSingleAliases<string asm, string layout, string Type, 8988*9880d681SAndroid Build Coastguard Worker string Count, int Offset, Operand idxtype> { 8989*9880d681SAndroid Build Coastguard Worker // E.g. "ld1 { v0.8b }[0], [x1], #1" 8990*9880d681SAndroid Build Coastguard Worker // "ld1\t$Vt, [$Rn], #1" 8991*9880d681SAndroid Build Coastguard Worker // may get mapped to 8992*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne8b:$Vt, GPR64sp:$Rn, XZR) 8993*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "\t$Vt$idx, [$Rn], #" # Offset, 8994*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Type # "_POST") 8995*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 8996*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # layout):$Vt, 8997*9880d681SAndroid Build Coastguard Worker idxtype:$idx, XZR), 1>; 8998*9880d681SAndroid Build Coastguard Worker 8999*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0 }[0], [x1], #1" 9000*9880d681SAndroid Build Coastguard Worker // "ld1.8b\t$Vt, [$Rn], #1" 9001*9880d681SAndroid Build Coastguard Worker // may get mapped to 9002*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne64:$Vt, GPR64sp:$Rn, XZR) 9003*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt$idx, [$Rn], #" # Offset, 9004*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Type # "_POST") 9005*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 9006*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # "128"):$Vt, 9007*9880d681SAndroid Build Coastguard Worker idxtype:$idx, XZR), 0>; 9008*9880d681SAndroid Build Coastguard Worker 9009*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0 }[0], [x1]" 9010*9880d681SAndroid Build Coastguard Worker // "ld1.8b\t$Vt, [$Rn]" 9011*9880d681SAndroid Build Coastguard Worker // may get mapped to 9012*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b VecListOne64:$Vt, GPR64sp:$Rn) 9013*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt$idx, [$Rn]", 9014*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Type) 9015*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # "128"):$Vt, 9016*9880d681SAndroid Build Coastguard Worker idxtype:$idx, GPR64sp:$Rn), 0>; 9017*9880d681SAndroid Build Coastguard Worker 9018*9880d681SAndroid Build Coastguard Worker // E.g. "ld1.8b { v0 }[0], [x1], x2" 9019*9880d681SAndroid Build Coastguard Worker // "ld1.8b\t$Vt, [$Rn], $Xm" 9020*9880d681SAndroid Build Coastguard Worker // may get mapped to 9021*9880d681SAndroid Build Coastguard Worker // (LD1Rv8b_POST VecListOne64:$Vt, GPR64sp:$Rn, GPR64pi1:$Xm) 9022*9880d681SAndroid Build Coastguard Worker def : InstAlias<asm # "." # layout # "\t$Vt$idx, [$Rn], $Xm", 9023*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Type # "_POST") 9024*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, 9025*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("VecList" # Count # "128"):$Vt, 9026*9880d681SAndroid Build Coastguard Worker idxtype:$idx, 9027*9880d681SAndroid Build Coastguard Worker !cast<RegisterOperand>("GPR64pi" # Offset):$Xm), 0>; 9028*9880d681SAndroid Build Coastguard Worker} 9029*9880d681SAndroid Build Coastguard Worker 9030*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSt1SingleAliases<string asm> { 9031*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "b", "i8", "One", 1, VectorIndexB>; 9032*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "h", "i16", "One", 2, VectorIndexH>; 9033*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "s", "i32", "One", 4, VectorIndexS>; 9034*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "d", "i64", "One", 8, VectorIndexD>; 9035*9880d681SAndroid Build Coastguard Worker} 9036*9880d681SAndroid Build Coastguard Worker 9037*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSt2SingleAliases<string asm> { 9038*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "b", "i8", "Two", 2, VectorIndexB>; 9039*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "h", "i16", "Two", 4, VectorIndexH>; 9040*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "s", "i32", "Two", 8, VectorIndexS>; 9041*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "d", "i64", "Two", 16, VectorIndexD>; 9042*9880d681SAndroid Build Coastguard Worker} 9043*9880d681SAndroid Build Coastguard Worker 9044*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSt3SingleAliases<string asm> { 9045*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "b", "i8", "Three", 3, VectorIndexB>; 9046*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "h", "i16", "Three", 6, VectorIndexH>; 9047*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "s", "i32", "Three", 12, VectorIndexS>; 9048*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "d", "i64", "Three", 24, VectorIndexD>; 9049*9880d681SAndroid Build Coastguard Worker} 9050*9880d681SAndroid Build Coastguard Worker 9051*9880d681SAndroid Build Coastguard Workermulticlass SIMDLdSt4SingleAliases<string asm> { 9052*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "b", "i8", "Four", 4, VectorIndexB>; 9053*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "h", "i16", "Four", 8, VectorIndexH>; 9054*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "s", "i32", "Four", 16, VectorIndexS>; 9055*9880d681SAndroid Build Coastguard Worker defm : SIMDLdStSingleAliases<asm, "d", "i64", "Four", 32, VectorIndexD>; 9056*9880d681SAndroid Build Coastguard Worker} 9057*9880d681SAndroid Build Coastguard Worker} // end of 'let Predicates = [HasNEON]' 9058*9880d681SAndroid Build Coastguard Worker 9059*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9060*9880d681SAndroid Build Coastguard Worker// AdvSIMD v8.1 Rounding Double Multiply Add/Subtract 9061*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9062*9880d681SAndroid Build Coastguard Worker 9063*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasV8_1a] in { 9064*9880d681SAndroid Build Coastguard Worker 9065*9880d681SAndroid Build Coastguard Workerclass BaseSIMDThreeSameVectorTiedR0<bit Q, bit U, bits<2> size, bits<5> opcode, 9066*9880d681SAndroid Build Coastguard Worker RegisterOperand regtype, string asm, 9067*9880d681SAndroid Build Coastguard Worker string kind, list<dag> pattern> 9068*9880d681SAndroid Build Coastguard Worker : BaseSIMDThreeSameVectorTied<Q, U, {size,0}, opcode, regtype, asm, kind, 9069*9880d681SAndroid Build Coastguard Worker pattern> { 9070*9880d681SAndroid Build Coastguard Worker} 9071*9880d681SAndroid Build Coastguard Workermulticlass SIMDThreeSameVectorSQRDMLxHTiedHS<bit U, bits<5> opc, string asm, 9072*9880d681SAndroid Build Coastguard Worker SDPatternOperator Accum> { 9073*9880d681SAndroid Build Coastguard Worker def v4i16 : BaseSIMDThreeSameVectorTiedR0<0, U, 0b01, opc, V64, asm, ".4h", 9074*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 9075*9880d681SAndroid Build Coastguard Worker (Accum (v4i16 V64:$Rd), 9076*9880d681SAndroid Build Coastguard Worker (v4i16 (int_aarch64_neon_sqrdmulh (v4i16 V64:$Rn), 9077*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$Rm)))))]>; 9078*9880d681SAndroid Build Coastguard Worker def v8i16 : BaseSIMDThreeSameVectorTiedR0<1, U, 0b01, opc, V128, asm, ".8h", 9079*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 9080*9880d681SAndroid Build Coastguard Worker (Accum (v8i16 V128:$Rd), 9081*9880d681SAndroid Build Coastguard Worker (v8i16 (int_aarch64_neon_sqrdmulh (v8i16 V128:$Rn), 9082*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$Rm)))))]>; 9083*9880d681SAndroid Build Coastguard Worker def v2i32 : BaseSIMDThreeSameVectorTiedR0<0, U, 0b10, opc, V64, asm, ".2s", 9084*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 9085*9880d681SAndroid Build Coastguard Worker (Accum (v2i32 V64:$Rd), 9086*9880d681SAndroid Build Coastguard Worker (v2i32 (int_aarch64_neon_sqrdmulh (v2i32 V64:$Rn), 9087*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rm)))))]>; 9088*9880d681SAndroid Build Coastguard Worker def v4i32 : BaseSIMDThreeSameVectorTiedR0<1, U, 0b10, opc, V128, asm, ".4s", 9089*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 9090*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 9091*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqrdmulh (v4i32 V128:$Rn), 9092*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm)))))]>; 9093*9880d681SAndroid Build Coastguard Worker} 9094*9880d681SAndroid Build Coastguard Worker 9095*9880d681SAndroid Build Coastguard Workermulticlass SIMDIndexedSQRDMLxHSDTied<bit U, bits<4> opc, string asm, 9096*9880d681SAndroid Build Coastguard Worker SDPatternOperator Accum> { 9097*9880d681SAndroid Build Coastguard Worker def v4i16_indexed : BaseSIMDIndexedTied<0, U, 0, 0b01, opc, 9098*9880d681SAndroid Build Coastguard Worker V64, V64, V128_lo, VectorIndexH, 9099*9880d681SAndroid Build Coastguard Worker asm, ".4h", ".4h", ".4h", ".h", 9100*9880d681SAndroid Build Coastguard Worker [(set (v4i16 V64:$dst), 9101*9880d681SAndroid Build Coastguard Worker (Accum (v4i16 V64:$Rd), 9102*9880d681SAndroid Build Coastguard Worker (v4i16 (int_aarch64_neon_sqrdmulh 9103*9880d681SAndroid Build Coastguard Worker (v4i16 V64:$Rn), 9104*9880d681SAndroid Build Coastguard Worker (v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 9105*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))))]> { 9106*9880d681SAndroid Build Coastguard Worker bits<3> idx; 9107*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 9108*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 9109*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 9110*9880d681SAndroid Build Coastguard Worker } 9111*9880d681SAndroid Build Coastguard Worker 9112*9880d681SAndroid Build Coastguard Worker def v8i16_indexed : BaseSIMDIndexedTied<1, U, 0, 0b01, opc, 9113*9880d681SAndroid Build Coastguard Worker V128, V128, V128_lo, VectorIndexH, 9114*9880d681SAndroid Build Coastguard Worker asm, ".8h", ".8h", ".8h", ".h", 9115*9880d681SAndroid Build Coastguard Worker [(set (v8i16 V128:$dst), 9116*9880d681SAndroid Build Coastguard Worker (Accum (v8i16 V128:$Rd), 9117*9880d681SAndroid Build Coastguard Worker (v8i16 (int_aarch64_neon_sqrdmulh 9118*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$Rn), 9119*9880d681SAndroid Build Coastguard Worker (v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), 9120*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx))))))]> { 9121*9880d681SAndroid Build Coastguard Worker bits<3> idx; 9122*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 9123*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 9124*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 9125*9880d681SAndroid Build Coastguard Worker } 9126*9880d681SAndroid Build Coastguard Worker 9127*9880d681SAndroid Build Coastguard Worker def v2i32_indexed : BaseSIMDIndexedTied<0, U, 0, 0b10, opc, 9128*9880d681SAndroid Build Coastguard Worker V64, V64, V128, VectorIndexS, 9129*9880d681SAndroid Build Coastguard Worker asm, ".2s", ".2s", ".2s", ".s", 9130*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$dst), 9131*9880d681SAndroid Build Coastguard Worker (Accum (v2i32 V64:$Rd), 9132*9880d681SAndroid Build Coastguard Worker (v2i32 (int_aarch64_neon_sqrdmulh 9133*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rn), 9134*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 (v4i32 V128:$Rm), 9135*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 9136*9880d681SAndroid Build Coastguard Worker bits<2> idx; 9137*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 9138*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 9139*9880d681SAndroid Build Coastguard Worker } 9140*9880d681SAndroid Build Coastguard Worker 9141*9880d681SAndroid Build Coastguard Worker // FIXME: it would be nice to use the scalar (v1i32) instruction here, but 9142*9880d681SAndroid Build Coastguard Worker // an intermediate EXTRACT_SUBREG would be untyped. 9143*9880d681SAndroid Build Coastguard Worker // FIXME: direct EXTRACT_SUBREG from v2i32 to i32 is illegal, that's why we 9144*9880d681SAndroid Build Coastguard Worker // got it lowered here as (i32 vector_extract (v4i32 insert_subvector(..))) 9145*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (Accum (i32 FPR32Op:$Rd), 9146*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract 9147*9880d681SAndroid Build Coastguard Worker (v4i32 (insert_subvector 9148*9880d681SAndroid Build Coastguard Worker (undef), 9149*9880d681SAndroid Build Coastguard Worker (v2i32 (int_aarch64_neon_sqrdmulh 9150*9880d681SAndroid Build Coastguard Worker (v2i32 V64:$Rn), 9151*9880d681SAndroid Build Coastguard Worker (v2i32 (AArch64duplane32 9152*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm), 9153*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)))), 9154*9880d681SAndroid Build Coastguard Worker (i32 0))), 9155*9880d681SAndroid Build Coastguard Worker (i64 0))))), 9156*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 9157*9880d681SAndroid Build Coastguard Worker (v2i32 (!cast<Instruction>(NAME # v2i32_indexed) 9158*9880d681SAndroid Build Coastguard Worker (v2i32 (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)), 9159*9880d681SAndroid Build Coastguard Worker FPR32Op:$Rd, 9160*9880d681SAndroid Build Coastguard Worker ssub)), 9161*9880d681SAndroid Build Coastguard Worker V64:$Rn, 9162*9880d681SAndroid Build Coastguard Worker V128:$Rm, 9163*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)), 9164*9880d681SAndroid Build Coastguard Worker ssub)>; 9165*9880d681SAndroid Build Coastguard Worker 9166*9880d681SAndroid Build Coastguard Worker def v4i32_indexed : BaseSIMDIndexedTied<1, U, 0, 0b10, opc, 9167*9880d681SAndroid Build Coastguard Worker V128, V128, V128, VectorIndexS, 9168*9880d681SAndroid Build Coastguard Worker asm, ".4s", ".4s", ".4s", ".s", 9169*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 9170*9880d681SAndroid Build Coastguard Worker (Accum (v4i32 V128:$Rd), 9171*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqrdmulh 9172*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rn), 9173*9880d681SAndroid Build Coastguard Worker (v4i32 (AArch64duplane32 (v4i32 V128:$Rm), 9174*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 9175*9880d681SAndroid Build Coastguard Worker bits<2> idx; 9176*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 9177*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 9178*9880d681SAndroid Build Coastguard Worker } 9179*9880d681SAndroid Build Coastguard Worker 9180*9880d681SAndroid Build Coastguard Worker // FIXME: it would be nice to use the scalar (v1i32) instruction here, but 9181*9880d681SAndroid Build Coastguard Worker // an intermediate EXTRACT_SUBREG would be untyped. 9182*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (Accum (i32 FPR32Op:$Rd), 9183*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract 9184*9880d681SAndroid Build Coastguard Worker (v4i32 (int_aarch64_neon_sqrdmulh 9185*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rn), 9186*9880d681SAndroid Build Coastguard Worker (v4i32 (AArch64duplane32 9187*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm), 9188*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)))), 9189*9880d681SAndroid Build Coastguard Worker (i64 0))))), 9190*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 9191*9880d681SAndroid Build Coastguard Worker (v4i32 (!cast<Instruction>(NAME # v4i32_indexed) 9192*9880d681SAndroid Build Coastguard Worker (v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), 9193*9880d681SAndroid Build Coastguard Worker FPR32Op:$Rd, 9194*9880d681SAndroid Build Coastguard Worker ssub)), 9195*9880d681SAndroid Build Coastguard Worker V128:$Rn, 9196*9880d681SAndroid Build Coastguard Worker V128:$Rm, 9197*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)), 9198*9880d681SAndroid Build Coastguard Worker ssub)>; 9199*9880d681SAndroid Build Coastguard Worker 9200*9880d681SAndroid Build Coastguard Worker def i16_indexed : BaseSIMDIndexedTied<1, U, 1, 0b01, opc, 9201*9880d681SAndroid Build Coastguard Worker FPR16Op, FPR16Op, V128_lo, 9202*9880d681SAndroid Build Coastguard Worker VectorIndexH, asm, ".h", "", "", ".h", 9203*9880d681SAndroid Build Coastguard Worker []> { 9204*9880d681SAndroid Build Coastguard Worker bits<3> idx; 9205*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{2}; 9206*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{1}; 9207*9880d681SAndroid Build Coastguard Worker let Inst{20} = idx{0}; 9208*9880d681SAndroid Build Coastguard Worker } 9209*9880d681SAndroid Build Coastguard Worker 9210*9880d681SAndroid Build Coastguard Worker def i32_indexed : BaseSIMDIndexedTied<1, U, 1, 0b10, opc, 9211*9880d681SAndroid Build Coastguard Worker FPR32Op, FPR32Op, V128, VectorIndexS, 9212*9880d681SAndroid Build Coastguard Worker asm, ".s", "", "", ".s", 9213*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32Op:$dst), 9214*9880d681SAndroid Build Coastguard Worker (Accum (i32 FPR32Op:$Rd), 9215*9880d681SAndroid Build Coastguard Worker (i32 (int_aarch64_neon_sqrdmulh 9216*9880d681SAndroid Build Coastguard Worker (i32 FPR32Op:$Rn), 9217*9880d681SAndroid Build Coastguard Worker (i32 (vector_extract (v4i32 V128:$Rm), 9218*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))))))]> { 9219*9880d681SAndroid Build Coastguard Worker bits<2> idx; 9220*9880d681SAndroid Build Coastguard Worker let Inst{11} = idx{1}; 9221*9880d681SAndroid Build Coastguard Worker let Inst{21} = idx{0}; 9222*9880d681SAndroid Build Coastguard Worker } 9223*9880d681SAndroid Build Coastguard Worker} 9224*9880d681SAndroid Build Coastguard Worker} // let Predicates = [HasNeon, HasV8_1a] 9225*9880d681SAndroid Build Coastguard Worker 9226*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9227*9880d681SAndroid Build Coastguard Worker// Crypto extensions 9228*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9229*9880d681SAndroid Build Coastguard Worker 9230*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasCrypto] in { 9231*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 9232*9880d681SAndroid Build Coastguard Workerclass AESBase<bits<4> opc, string asm, dag outs, dag ins, string cstr, 9233*9880d681SAndroid Build Coastguard Worker list<dag> pat> 9234*9880d681SAndroid Build Coastguard Worker : I<outs, ins, asm, "{\t$Rd.16b, $Rn.16b|.16b\t$Rd, $Rn}", cstr, pat>, 9235*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]>{ 9236*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 9237*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9238*9880d681SAndroid Build Coastguard Worker let Inst{31-16} = 0b0100111000101000; 9239*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opc; 9240*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 9241*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9242*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 9243*9880d681SAndroid Build Coastguard Worker} 9244*9880d681SAndroid Build Coastguard Worker 9245*9880d681SAndroid Build Coastguard Workerclass AESInst<bits<4> opc, string asm, Intrinsic OpNode> 9246*9880d681SAndroid Build Coastguard Worker : AESBase<opc, asm, (outs V128:$Rd), (ins V128:$Rn), "", 9247*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (OpNode (v16i8 V128:$Rn)))]>; 9248*9880d681SAndroid Build Coastguard Worker 9249*9880d681SAndroid Build Coastguard Workerclass AESTiedInst<bits<4> opc, string asm, Intrinsic OpNode> 9250*9880d681SAndroid Build Coastguard Worker : AESBase<opc, asm, (outs V128:$dst), (ins V128:$Rd, V128:$Rn), 9251*9880d681SAndroid Build Coastguard Worker "$Rd = $dst", 9252*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$dst), 9253*9880d681SAndroid Build Coastguard Worker (OpNode (v16i8 V128:$Rd), (v16i8 V128:$Rn)))]>; 9254*9880d681SAndroid Build Coastguard Worker 9255*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 9256*9880d681SAndroid Build Coastguard Workerclass SHA3OpTiedInst<bits<3> opc, string asm, string dst_lhs_kind, 9257*9880d681SAndroid Build Coastguard Worker dag oops, dag iops, list<dag> pat> 9258*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, 9259*9880d681SAndroid Build Coastguard Worker "{\t$Rd" # dst_lhs_kind # ", $Rn" # dst_lhs_kind # ", $Rm.4s" # 9260*9880d681SAndroid Build Coastguard Worker "|.4s\t$Rd, $Rn, $Rm}", "$Rd = $dst", pat>, 9261*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]>{ 9262*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 9263*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9264*9880d681SAndroid Build Coastguard Worker bits<5> Rm; 9265*9880d681SAndroid Build Coastguard Worker let Inst{31-21} = 0b01011110000; 9266*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rm; 9267*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0; 9268*9880d681SAndroid Build Coastguard Worker let Inst{14-12} = opc; 9269*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 9270*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9271*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 9272*9880d681SAndroid Build Coastguard Worker} 9273*9880d681SAndroid Build Coastguard Worker 9274*9880d681SAndroid Build Coastguard Workerclass SHATiedInstQSV<bits<3> opc, string asm, Intrinsic OpNode> 9275*9880d681SAndroid Build Coastguard Worker : SHA3OpTiedInst<opc, asm, "", (outs FPR128:$dst), 9276*9880d681SAndroid Build Coastguard Worker (ins FPR128:$Rd, FPR32:$Rn, V128:$Rm), 9277*9880d681SAndroid Build Coastguard Worker [(set (v4i32 FPR128:$dst), 9278*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 FPR128:$Rd), (i32 FPR32:$Rn), 9279*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm)))]>; 9280*9880d681SAndroid Build Coastguard Worker 9281*9880d681SAndroid Build Coastguard Workerclass SHATiedInstVVV<bits<3> opc, string asm, Intrinsic OpNode> 9282*9880d681SAndroid Build Coastguard Worker : SHA3OpTiedInst<opc, asm, ".4s", (outs V128:$dst), 9283*9880d681SAndroid Build Coastguard Worker (ins V128:$Rd, V128:$Rn, V128:$Rm), 9284*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 9285*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn), 9286*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm)))]>; 9287*9880d681SAndroid Build Coastguard Worker 9288*9880d681SAndroid Build Coastguard Workerclass SHATiedInstQQV<bits<3> opc, string asm, Intrinsic OpNode> 9289*9880d681SAndroid Build Coastguard Worker : SHA3OpTiedInst<opc, asm, "", (outs FPR128:$dst), 9290*9880d681SAndroid Build Coastguard Worker (ins FPR128:$Rd, FPR128:$Rn, V128:$Rm), 9291*9880d681SAndroid Build Coastguard Worker [(set (v4i32 FPR128:$dst), 9292*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 FPR128:$Rd), (v4i32 FPR128:$Rn), 9293*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Rm)))]>; 9294*9880d681SAndroid Build Coastguard Worker 9295*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in 9296*9880d681SAndroid Build Coastguard Workerclass SHA2OpInst<bits<4> opc, string asm, string kind, 9297*9880d681SAndroid Build Coastguard Worker string cstr, dag oops, dag iops, 9298*9880d681SAndroid Build Coastguard Worker list<dag> pat> 9299*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, "{\t$Rd" # kind # ", $Rn" # kind # 9300*9880d681SAndroid Build Coastguard Worker "|" # kind # "\t$Rd, $Rn}", cstr, pat>, 9301*9880d681SAndroid Build Coastguard Worker Sched<[WriteV]>{ 9302*9880d681SAndroid Build Coastguard Worker bits<5> Rd; 9303*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9304*9880d681SAndroid Build Coastguard Worker let Inst{31-16} = 0b0101111000101000; 9305*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opc; 9306*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 9307*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9308*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rd; 9309*9880d681SAndroid Build Coastguard Worker} 9310*9880d681SAndroid Build Coastguard Worker 9311*9880d681SAndroid Build Coastguard Workerclass SHATiedInstVV<bits<4> opc, string asm, Intrinsic OpNode> 9312*9880d681SAndroid Build Coastguard Worker : SHA2OpInst<opc, asm, ".4s", "$Rd = $dst", (outs V128:$dst), 9313*9880d681SAndroid Build Coastguard Worker (ins V128:$Rd, V128:$Rn), 9314*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$dst), 9315*9880d681SAndroid Build Coastguard Worker (OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn)))]>; 9316*9880d681SAndroid Build Coastguard Worker 9317*9880d681SAndroid Build Coastguard Workerclass SHAInstSS<bits<4> opc, string asm, Intrinsic OpNode> 9318*9880d681SAndroid Build Coastguard Worker : SHA2OpInst<opc, asm, "", "", (outs FPR32:$Rd), (ins FPR32:$Rn), 9319*9880d681SAndroid Build Coastguard Worker [(set (i32 FPR32:$Rd), (OpNode (i32 FPR32:$Rn)))]>; 9320*9880d681SAndroid Build Coastguard Worker} // end of 'let Predicates = [HasCrypto]' 9321*9880d681SAndroid Build Coastguard Worker 9322*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9323*9880d681SAndroid Build Coastguard Worker// v8.1 atomic instructions extension: 9324*9880d681SAndroid Build Coastguard Worker// * CAS 9325*9880d681SAndroid Build Coastguard Worker// * CASP 9326*9880d681SAndroid Build Coastguard Worker// * SWP 9327*9880d681SAndroid Build Coastguard Worker// * LDOPregister<OP>, and aliases STOPregister<OP> 9328*9880d681SAndroid Build Coastguard Worker 9329*9880d681SAndroid Build Coastguard Worker// Instruction encodings: 9330*9880d681SAndroid Build Coastguard Worker// 9331*9880d681SAndroid Build Coastguard Worker// 31 30|29 24|23|22|21|20 16|15|14 10|9 5|4 0 9332*9880d681SAndroid Build Coastguard Worker// CAS SZ |001000|1 |A |1 |Rs |R |11111 |Rn |Rt 9333*9880d681SAndroid Build Coastguard Worker// CASP 0|SZ|001000|0 |A |1 |Rs |R |11111 |Rn |Rt 9334*9880d681SAndroid Build Coastguard Worker// SWP SZ |111000|A |R |1 |Rs |1 |OPC|00|Rn |Rt 9335*9880d681SAndroid Build Coastguard Worker// LD SZ |111000|A |R |1 |Rs |0 |OPC|00|Rn |Rt 9336*9880d681SAndroid Build Coastguard Worker// ST SZ |111000|A |R |1 |Rs |0 |OPC|00|Rn |11111 9337*9880d681SAndroid Build Coastguard Worker 9338*9880d681SAndroid Build Coastguard Worker// Instruction syntax: 9339*9880d681SAndroid Build Coastguard Worker// 9340*9880d681SAndroid Build Coastguard Worker// CAS{<order>}[<size>] <Ws>, <Wt>, [<Xn|SP>] 9341*9880d681SAndroid Build Coastguard Worker// CAS{<order>} <Xs>, <Xt>, [<Xn|SP>] 9342*9880d681SAndroid Build Coastguard Worker// CASP{<order>} <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>] 9343*9880d681SAndroid Build Coastguard Worker// CASP{<order>} <Xs>, <X(s+1)>, <Xt>, <X(t+1)>, [<Xn|SP>] 9344*9880d681SAndroid Build Coastguard Worker// SWP{<order>}[<size>] <Ws>, <Wt>, [<Xn|SP>] 9345*9880d681SAndroid Build Coastguard Worker// SWP{<order>} <Xs>, <Xt>, [<Xn|SP>] 9346*9880d681SAndroid Build Coastguard Worker// LD<OP>{<order>}[<size>] <Ws>, <Wt>, [<Xn|SP>] 9347*9880d681SAndroid Build Coastguard Worker// LD<OP>{<order>} <Xs>, <Xt>, [<Xn|SP>] 9348*9880d681SAndroid Build Coastguard Worker// ST<OP>{<order>}[<size>] <Ws>, [<Xn|SP>] 9349*9880d681SAndroid Build Coastguard Worker// ST<OP>{<order>} <Xs>, [<Xn|SP>] 9350*9880d681SAndroid Build Coastguard Worker 9351*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a], mayLoad = 1, mayStore = 1, hasSideEffects = 1 in 9352*9880d681SAndroid Build Coastguard Workerclass BaseCASEncoding<dag oops, dag iops, string asm, string operands, 9353*9880d681SAndroid Build Coastguard Worker string cstr, list<dag> pattern> 9354*9880d681SAndroid Build Coastguard Worker : I<oops, iops, asm, operands, cstr, pattern> { 9355*9880d681SAndroid Build Coastguard Worker bits<2> Sz; 9356*9880d681SAndroid Build Coastguard Worker bit NP; 9357*9880d681SAndroid Build Coastguard Worker bit Acq; 9358*9880d681SAndroid Build Coastguard Worker bit Rel; 9359*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 9360*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9361*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 9362*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = Sz; 9363*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b001000; 9364*9880d681SAndroid Build Coastguard Worker let Inst{23} = NP; 9365*9880d681SAndroid Build Coastguard Worker let Inst{22} = Acq; 9366*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 9367*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 9368*9880d681SAndroid Build Coastguard Worker let Inst{15} = Rel; 9369*9880d681SAndroid Build Coastguard Worker let Inst{14-10} = 0b11111; 9370*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9371*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 9372*9880d681SAndroid Build Coastguard Worker} 9373*9880d681SAndroid Build Coastguard Worker 9374*9880d681SAndroid Build Coastguard Workerclass BaseCAS<string order, string size, RegisterClass RC> 9375*9880d681SAndroid Build Coastguard Worker : BaseCASEncoding<(outs RC:$out),(ins RC:$Rs, RC:$Rt, GPR64sp:$Rn), 9376*9880d681SAndroid Build Coastguard Worker "cas" # order # size, "\t$Rs, $Rt, [$Rn]", 9377*9880d681SAndroid Build Coastguard Worker "$out = $Rs",[]>, 9378*9880d681SAndroid Build Coastguard Worker Sched<[WriteAtomic]> { 9379*9880d681SAndroid Build Coastguard Worker let NP = 1; 9380*9880d681SAndroid Build Coastguard Worker} 9381*9880d681SAndroid Build Coastguard Worker 9382*9880d681SAndroid Build Coastguard Workermulticlass CompareAndSwap<bits<1> Acq, bits<1> Rel, string order> { 9383*9880d681SAndroid Build Coastguard Worker let Sz = 0b00, Acq = Acq, Rel = Rel in def b : BaseCAS<order, "b", GPR32>; 9384*9880d681SAndroid Build Coastguard Worker let Sz = 0b01, Acq = Acq, Rel = Rel in def h : BaseCAS<order, "h", GPR32>; 9385*9880d681SAndroid Build Coastguard Worker let Sz = 0b10, Acq = Acq, Rel = Rel in def s : BaseCAS<order, "", GPR32>; 9386*9880d681SAndroid Build Coastguard Worker let Sz = 0b11, Acq = Acq, Rel = Rel in def d : BaseCAS<order, "", GPR64>; 9387*9880d681SAndroid Build Coastguard Worker} 9388*9880d681SAndroid Build Coastguard Worker 9389*9880d681SAndroid Build Coastguard Workerclass BaseCASP<string order, string size, RegisterOperand RC> 9390*9880d681SAndroid Build Coastguard Worker : BaseCASEncoding<(outs RC:$out),(ins RC:$Rs, RC:$Rt, GPR64sp:$Rn), 9391*9880d681SAndroid Build Coastguard Worker "casp" # order # size, "\t$Rs, $Rt, [$Rn]", 9392*9880d681SAndroid Build Coastguard Worker "$out = $Rs",[]>, 9393*9880d681SAndroid Build Coastguard Worker Sched<[WriteAtomic]> { 9394*9880d681SAndroid Build Coastguard Worker let NP = 0; 9395*9880d681SAndroid Build Coastguard Worker} 9396*9880d681SAndroid Build Coastguard Worker 9397*9880d681SAndroid Build Coastguard Workermulticlass CompareAndSwapPair<bits<1> Acq, bits<1> Rel, string order> { 9398*9880d681SAndroid Build Coastguard Worker let Sz = 0b00, Acq = Acq, Rel = Rel in 9399*9880d681SAndroid Build Coastguard Worker def s : BaseCASP<order, "", WSeqPairClassOperand>; 9400*9880d681SAndroid Build Coastguard Worker let Sz = 0b01, Acq = Acq, Rel = Rel in 9401*9880d681SAndroid Build Coastguard Worker def d : BaseCASP<order, "", XSeqPairClassOperand>; 9402*9880d681SAndroid Build Coastguard Worker} 9403*9880d681SAndroid Build Coastguard Worker 9404*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in 9405*9880d681SAndroid Build Coastguard Workerclass BaseSWP<string order, string size, RegisterClass RC> 9406*9880d681SAndroid Build Coastguard Worker : I<(outs RC:$Rt),(ins RC:$Rs, GPR64sp:$Rn), "swp" # order # size, 9407*9880d681SAndroid Build Coastguard Worker "\t$Rs, $Rt, [$Rn]","",[]>, 9408*9880d681SAndroid Build Coastguard Worker Sched<[WriteAtomic]> { 9409*9880d681SAndroid Build Coastguard Worker bits<2> Sz; 9410*9880d681SAndroid Build Coastguard Worker bit Acq; 9411*9880d681SAndroid Build Coastguard Worker bit Rel; 9412*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 9413*9880d681SAndroid Build Coastguard Worker bits<3> opc = 0b000; 9414*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9415*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 9416*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = Sz; 9417*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b111000; 9418*9880d681SAndroid Build Coastguard Worker let Inst{23} = Acq; 9419*9880d681SAndroid Build Coastguard Worker let Inst{22} = Rel; 9420*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 9421*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 9422*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0b1; 9423*9880d681SAndroid Build Coastguard Worker let Inst{14-12} = opc; 9424*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 9425*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9426*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 9427*9880d681SAndroid Build Coastguard Worker} 9428*9880d681SAndroid Build Coastguard Worker 9429*9880d681SAndroid Build Coastguard Workermulticlass Swap<bits<1> Acq, bits<1> Rel, string order> { 9430*9880d681SAndroid Build Coastguard Worker let Sz = 0b00, Acq = Acq, Rel = Rel in def b : BaseSWP<order, "b", GPR32>; 9431*9880d681SAndroid Build Coastguard Worker let Sz = 0b01, Acq = Acq, Rel = Rel in def h : BaseSWP<order, "h", GPR32>; 9432*9880d681SAndroid Build Coastguard Worker let Sz = 0b10, Acq = Acq, Rel = Rel in def s : BaseSWP<order, "", GPR32>; 9433*9880d681SAndroid Build Coastguard Worker let Sz = 0b11, Acq = Acq, Rel = Rel in def d : BaseSWP<order, "", GPR64>; 9434*9880d681SAndroid Build Coastguard Worker} 9435*9880d681SAndroid Build Coastguard Worker 9436*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a], mayLoad = 1, mayStore = 1, hasSideEffects = 1 in 9437*9880d681SAndroid Build Coastguard Workerclass BaseLDOPregister<string op, string order, string size, RegisterClass RC> 9438*9880d681SAndroid Build Coastguard Worker : I<(outs RC:$Rt),(ins RC:$Rs, GPR64sp:$Rn), "ld" # op # order # size, 9439*9880d681SAndroid Build Coastguard Worker "\t$Rs, $Rt, [$Rn]","",[]>, 9440*9880d681SAndroid Build Coastguard Worker Sched<[WriteAtomic]> { 9441*9880d681SAndroid Build Coastguard Worker bits<2> Sz; 9442*9880d681SAndroid Build Coastguard Worker bit Acq; 9443*9880d681SAndroid Build Coastguard Worker bit Rel; 9444*9880d681SAndroid Build Coastguard Worker bits<5> Rs; 9445*9880d681SAndroid Build Coastguard Worker bits<3> opc; 9446*9880d681SAndroid Build Coastguard Worker bits<5> Rn; 9447*9880d681SAndroid Build Coastguard Worker bits<5> Rt; 9448*9880d681SAndroid Build Coastguard Worker let Inst{31-30} = Sz; 9449*9880d681SAndroid Build Coastguard Worker let Inst{29-24} = 0b111000; 9450*9880d681SAndroid Build Coastguard Worker let Inst{23} = Acq; 9451*9880d681SAndroid Build Coastguard Worker let Inst{22} = Rel; 9452*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0b1; 9453*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Rs; 9454*9880d681SAndroid Build Coastguard Worker let Inst{15} = 0b0; 9455*9880d681SAndroid Build Coastguard Worker let Inst{14-12} = opc; 9456*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 9457*9880d681SAndroid Build Coastguard Worker let Inst{9-5} = Rn; 9458*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Rt; 9459*9880d681SAndroid Build Coastguard Worker} 9460*9880d681SAndroid Build Coastguard Worker 9461*9880d681SAndroid Build Coastguard Workermulticlass LDOPregister<bits<3> opc, string op, bits<1> Acq, bits<1> Rel, 9462*9880d681SAndroid Build Coastguard Worker string order> { 9463*9880d681SAndroid Build Coastguard Worker let Sz = 0b00, Acq = Acq, Rel = Rel, opc = opc in 9464*9880d681SAndroid Build Coastguard Worker def b : BaseLDOPregister<op, order, "b", GPR32>; 9465*9880d681SAndroid Build Coastguard Worker let Sz = 0b01, Acq = Acq, Rel = Rel, opc = opc in 9466*9880d681SAndroid Build Coastguard Worker def h : BaseLDOPregister<op, order, "h", GPR32>; 9467*9880d681SAndroid Build Coastguard Worker let Sz = 0b10, Acq = Acq, Rel = Rel, opc = opc in 9468*9880d681SAndroid Build Coastguard Worker def s : BaseLDOPregister<op, order, "", GPR32>; 9469*9880d681SAndroid Build Coastguard Worker let Sz = 0b11, Acq = Acq, Rel = Rel, opc = opc in 9470*9880d681SAndroid Build Coastguard Worker def d : BaseLDOPregister<op, order, "", GPR64>; 9471*9880d681SAndroid Build Coastguard Worker} 9472*9880d681SAndroid Build Coastguard Worker 9473*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in 9474*9880d681SAndroid Build Coastguard Workerclass BaseSTOPregister<string asm, RegisterClass OP, Register Reg, 9475*9880d681SAndroid Build Coastguard Worker Instruction inst> : 9476*9880d681SAndroid Build Coastguard Worker InstAlias<asm # "\t$Rs, [$Rn]", (inst Reg, OP:$Rs, GPR64sp:$Rn)>; 9477*9880d681SAndroid Build Coastguard Worker 9478*9880d681SAndroid Build Coastguard Workermulticlass STOPregister<string asm, string instr> { 9479*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "lb", GPR32, WZR, 9480*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "Lb")>; 9481*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "lh", GPR32, WZR, 9482*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "Lh")>; 9483*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "l", GPR32, WZR, 9484*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "Ls")>; 9485*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "l", GPR64, XZR, 9486*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "Ld")>; 9487*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "b", GPR32, WZR, 9488*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "b")>; 9489*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm # "h", GPR32, WZR, 9490*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "h")>; 9491*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm, GPR32, WZR, 9492*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "s")>; 9493*9880d681SAndroid Build Coastguard Worker def : BaseSTOPregister<asm, GPR64, XZR, 9494*9880d681SAndroid Build Coastguard Worker !cast<Instruction>(instr # "d")>; 9495*9880d681SAndroid Build Coastguard Worker} 9496*9880d681SAndroid Build Coastguard Worker 9497*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 9498*9880d681SAndroid Build Coastguard Worker// Allow the size specifier tokens to be upper case, not just lower. 9499*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".8B", ".8b">; 9500*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".4H", ".4h">; 9501*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".2S", ".2s">; 9502*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".1D", ".1d">; 9503*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".16B", ".16b">; 9504*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".8H", ".8h">; 9505*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".4S", ".4s">; 9506*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".2D", ".2d">; 9507*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".1Q", ".1q">; 9508*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".2H", ".2h">; 9509*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".B", ".b">; 9510*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".H", ".h">; 9511*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".S", ".s">; 9512*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".D", ".d">; 9513*9880d681SAndroid Build Coastguard Workerdef : TokenAlias<".Q", ".q">; 9514