1bdd1243dSDimitry Andric//===- XtensaOperands.td - Xtensa instruction operands -------*- tblgen-*--===// 2bdd1243dSDimitry Andric// 3bdd1243dSDimitry Andric// The LLVM Compiler Infrastructure 4bdd1243dSDimitry Andric// 5bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 6bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 7bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 8bdd1243dSDimitry Andric// 9bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 10bdd1243dSDimitry Andric 11bdd1243dSDimitry Andric// Immediate operands with a shared generic render method. 12bdd1243dSDimitry Andricclass ImmAsmOperand<string name> : AsmOperandClass { 13bdd1243dSDimitry Andric let Name = name; 14bdd1243dSDimitry Andric let RenderMethod = "addImmOperands"; 15bdd1243dSDimitry Andric let DiagnosticType = !strconcat("Invalid", name); 16bdd1243dSDimitry Andric} 17bdd1243dSDimitry Andric 18bdd1243dSDimitry Andricclass Immediate<ValueType vt, code pred, string asmop> 19bdd1243dSDimitry Andric : Operand<vt>, ImmLeaf<vt, pred> { 20bdd1243dSDimitry Andric let PrintMethod = "print"#asmop; 21bdd1243dSDimitry Andric let ParserMatchClass = !cast<AsmOperandClass>(asmop); 22bdd1243dSDimitry Andric} 23bdd1243dSDimitry Andric 24bdd1243dSDimitry Andric// imm8 predicate - Immediate in the range [-128,127] 25bdd1243dSDimitry Andricdef Imm8_AsmOperand : ImmAsmOperand<"Imm8">; 26bdd1243dSDimitry Andricdef imm8 : Immediate<i32, [{ return Imm >= -128 && Imm <= 127; }], "Imm8_AsmOperand"> { 27bdd1243dSDimitry Andric let EncoderMethod = "getImm8OpValue"; 28bdd1243dSDimitry Andric let DecoderMethod = "decodeImm8Operand"; 29bdd1243dSDimitry Andric} 30bdd1243dSDimitry Andric 31bdd1243dSDimitry Andric// imm8_sh8 predicate - Immediate in the range [-32768,32512] with (bits[7-0] == 0) 32bdd1243dSDimitry Andric// imm8 value left shifted by 8 bits 33bdd1243dSDimitry Andricdef Imm8_sh8_AsmOperand : ImmAsmOperand<"Imm8_sh8">; 34bdd1243dSDimitry Andricdef imm8_sh8 : Immediate<i32, [{ return Imm >= -32768 && Imm <= 32512 && ((Imm & 0xFF) == 0); }], 35bdd1243dSDimitry Andric "Imm8_sh8_AsmOperand"> { 36bdd1243dSDimitry Andric let EncoderMethod = "getImm8_sh8OpValue"; 37bdd1243dSDimitry Andric let DecoderMethod = "decodeImm8_sh8Operand"; 38bdd1243dSDimitry Andric} 39bdd1243dSDimitry Andric 40bdd1243dSDimitry Andric// imm12 predicate - Immediate in the range [-2048,2047] 41bdd1243dSDimitry Andricdef Imm12_AsmOperand : ImmAsmOperand<"Imm12">; 42bdd1243dSDimitry Andricdef imm12 : Immediate<i32, [{ return Imm >= -2048 && Imm <= 2047; }], "Imm12_AsmOperand"> { 43bdd1243dSDimitry Andric let EncoderMethod = "getImm12OpValue"; 44bdd1243dSDimitry Andric let DecoderMethod = "decodeImm12Operand"; 45bdd1243dSDimitry Andric} 46bdd1243dSDimitry Andric 47bdd1243dSDimitry Andric// imm12m predicate - Immediate for MOV operation 48bdd1243dSDimitry Andricdef Imm12m_AsmOperand : ImmAsmOperand<"Imm12m">; 49bdd1243dSDimitry Andricdef imm12m : Immediate<i32, [{ return Imm >= -2048 && Imm <= 2047; }], "Imm12m_AsmOperand"> { 50bdd1243dSDimitry Andric let EncoderMethod = "getImm12OpValue"; 51bdd1243dSDimitry Andric let DecoderMethod = "decodeImm12Operand"; 52bdd1243dSDimitry Andric} 53bdd1243dSDimitry Andric 54bdd1243dSDimitry Andric// uimm4 predicate - Immediate in the range [0,15] 55bdd1243dSDimitry Andricdef Uimm4_AsmOperand : ImmAsmOperand<"Uimm4">; 56bdd1243dSDimitry Andricdef uimm4 : Immediate<i32, [{ return Imm >= 0 && Imm <= 15; }], "Uimm4_AsmOperand"> { 57bdd1243dSDimitry Andric let EncoderMethod = "getUimm4OpValue"; 58bdd1243dSDimitry Andric let DecoderMethod = "decodeUimm4Operand"; 59bdd1243dSDimitry Andric} 60bdd1243dSDimitry Andric 61bdd1243dSDimitry Andric// uimm5 predicate - Immediate in the range [0,31] 62bdd1243dSDimitry Andricdef Uimm5_AsmOperand : ImmAsmOperand<"Uimm5">; 63bdd1243dSDimitry Andricdef uimm5 : Immediate<i32, [{ return Imm >= 0 && Imm <= 31; }], "Uimm5_AsmOperand"> { 64bdd1243dSDimitry Andric let EncoderMethod = "getUimm5OpValue"; 65bdd1243dSDimitry Andric let DecoderMethod = "decodeUimm5Operand"; 66bdd1243dSDimitry Andric} 67bdd1243dSDimitry Andric 68bdd1243dSDimitry Andric// imm1_16 predicate - Immediate in the range [1,16] 69bdd1243dSDimitry Andricdef Imm1_16_AsmOperand : ImmAsmOperand<"Imm1_16">; 70bdd1243dSDimitry Andricdef imm1_16 : Immediate<i32, [{ return Imm >= 1 && Imm <= 16; }], "Imm1_16_AsmOperand"> { 71bdd1243dSDimitry Andric let EncoderMethod = "getImm1_16OpValue"; 72bdd1243dSDimitry Andric let DecoderMethod = "decodeImm1_16Operand"; 73bdd1243dSDimitry Andric} 74bdd1243dSDimitry Andric 75bdd1243dSDimitry Andric// shimm1_31 predicate - Immediate in the range [1,31] 76bdd1243dSDimitry Andricdef Shimm1_31_AsmOperand : ImmAsmOperand<"Shimm1_31">; 77bdd1243dSDimitry Andricdef shimm1_31 : Immediate<i32, [{ return Imm >= 1 && Imm <= 31; }], "Shimm1_31_AsmOperand"> { 78bdd1243dSDimitry Andric let EncoderMethod = "getShimm1_31OpValue"; 79bdd1243dSDimitry Andric let DecoderMethod = "decodeShimm1_31Operand"; 80bdd1243dSDimitry Andric} 81bdd1243dSDimitry Andric 82bdd1243dSDimitry Andric// Memory offset 0..255 for 8-bit memory accesses 83bdd1243dSDimitry Andricdef Offset8m8_AsmOperand : ImmAsmOperand<"Offset8m8">; 84bdd1243dSDimitry Andricdef offset8m8 : Immediate<i32, 85bdd1243dSDimitry Andric [{ return Imm >= 0 && Imm <= 255; }], 86bdd1243dSDimitry Andric "Offset8m8_AsmOperand">; 87bdd1243dSDimitry Andric 88bdd1243dSDimitry Andric// Memory offset 0..510 for 16-bit memory accesses 89bdd1243dSDimitry Andricdef Offset8m16_AsmOperand : ImmAsmOperand<"Offset8m16">; 90bdd1243dSDimitry Andricdef offset8m16 : Immediate<i32, 91bdd1243dSDimitry Andric [{ return Imm >= 0 && Imm <= 510 && (Imm & 0x1 == 0); }], 92bdd1243dSDimitry Andric "Offset8m16_AsmOperand">; 93bdd1243dSDimitry Andric 94bdd1243dSDimitry Andric// Memory offset 0..1020 for 32-bit memory accesses 95bdd1243dSDimitry Andricdef Offset8m32_AsmOperand : ImmAsmOperand<"Offset8m32">; 96bdd1243dSDimitry Andricdef offset8m32 : Immediate<i32, 97bdd1243dSDimitry Andric [{ return Imm >= 0 && Imm <= 1020 && (Imm & 0x3 == 0); }], 98bdd1243dSDimitry Andric "Offset8m32_AsmOperand">; 99bdd1243dSDimitry Andric 100bdd1243dSDimitry Andric// Memory offset 0..60 for 32-bit memory accesses 101bdd1243dSDimitry Andricdef Offset4m32_AsmOperand : ImmAsmOperand<"Offset4m32">; 102bdd1243dSDimitry Andricdef offset4m32 : Immediate<i32, 103bdd1243dSDimitry Andric [{ return Imm >= 0 && Imm <= 60 && (Imm & 0x3 == 0); }], 104bdd1243dSDimitry Andric "Offset4m32_AsmOperand">; 105bdd1243dSDimitry Andric 106bdd1243dSDimitry Andric// b4const predicate - Branch Immediate 4-bit signed operand 107bdd1243dSDimitry Andricdef B4const_AsmOperand: ImmAsmOperand<"B4const">; 108bdd1243dSDimitry Andricdef b4const: Immediate<i32, 109bdd1243dSDimitry Andric [{ switch (Imm) { 110bdd1243dSDimitry Andric case -1: case 1: case 2: case 3: case 4: 111bdd1243dSDimitry Andric case 5: case 6: case 7: case 8: case 10: case 12: 112bdd1243dSDimitry Andric case 16: case 32: case 64: case 128: case 256: return 1; 113bdd1243dSDimitry Andric default: return 0; 114bdd1243dSDimitry Andric } 115bdd1243dSDimitry Andric }], 116bdd1243dSDimitry Andric "B4const_AsmOperand"> { 117bdd1243dSDimitry Andric let EncoderMethod = "getB4constOpValue"; 118bdd1243dSDimitry Andric let DecoderMethod = "decodeB4constOperand"; 119bdd1243dSDimitry Andric} 120bdd1243dSDimitry Andric 121bdd1243dSDimitry Andric// b4constu predicate - Branch Immediate 4-bit unsigned operand 122bdd1243dSDimitry Andricdef B4constu_AsmOperand: ImmAsmOperand<"B4constu">; 123bdd1243dSDimitry Andricdef b4constu: Immediate<i32, 124bdd1243dSDimitry Andric [{ switch (Imm) { 125bdd1243dSDimitry Andric case 32768: case 65536: case 2: case 3: case 4: 126bdd1243dSDimitry Andric case 5: case 6: case 7: case 8: case 10: case 12: 127bdd1243dSDimitry Andric case 16: case 32: case 64: case 128: case 256: return 1; 128bdd1243dSDimitry Andric default: return 0; 129bdd1243dSDimitry Andric } 130bdd1243dSDimitry Andric }], 131bdd1243dSDimitry Andric "B4constu_AsmOperand"> { 132bdd1243dSDimitry Andric let EncoderMethod = "getB4constuOpValue"; 133bdd1243dSDimitry Andric let DecoderMethod = "decodeB4constuOperand"; 134bdd1243dSDimitry Andric} 135bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 136bdd1243dSDimitry Andric// Memory address operands 137bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 138bdd1243dSDimitry Andric 139bdd1243dSDimitry Andricclass mem<Operand offset> : Operand<i32> { 140bdd1243dSDimitry Andric let MIOperandInfo = (ops AR, offset); 141bdd1243dSDimitry Andric let EncoderMethod = "getMemRegEncoding"; 142bdd1243dSDimitry Andric let OperandType = "OPERAND_MEMORY"; 143bdd1243dSDimitry Andric let PrintMethod = "printMemOperand"; 144bdd1243dSDimitry Andric} 145bdd1243dSDimitry Andric 146bdd1243dSDimitry Andricdef mem8 : mem<offset8m8> { 147bdd1243dSDimitry Andric let DecoderMethod = "decodeMem8Operand"; 148bdd1243dSDimitry Andric} 149bdd1243dSDimitry Andric 150bdd1243dSDimitry Andricdef mem16 : mem<offset8m16> { 151bdd1243dSDimitry Andric let DecoderMethod = "decodeMem16Operand"; 152bdd1243dSDimitry Andric} 153bdd1243dSDimitry Andric 154bdd1243dSDimitry Andricdef mem32 : mem<offset8m32> { 155bdd1243dSDimitry Andric let DecoderMethod = "decodeMem32Operand"; 156bdd1243dSDimitry Andric} 157bdd1243dSDimitry Andric 158bdd1243dSDimitry Andricdef mem32n : mem<offset4m32> { 159bdd1243dSDimitry Andric let DecoderMethod = "decodeMem32nOperand"; 160bdd1243dSDimitry Andric} 161bdd1243dSDimitry Andric 162bdd1243dSDimitry Andric//Add patterns for future use in stack addressing mode 163bdd1243dSDimitry Andricdef addr_ish1 : ComplexPattern<iPTR, 2, "selectMemRegAddrISH1", [frameindex]>; 164bdd1243dSDimitry Andricdef addr_ish2 : ComplexPattern<iPTR, 2, "selectMemRegAddrISH2", [frameindex]>; 165bdd1243dSDimitry Andricdef addr_ish4 : ComplexPattern<iPTR, 2, "selectMemRegAddrISH4", [frameindex]>; 166bdd1243dSDimitry Andric 167bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 168bdd1243dSDimitry Andric// Symbolic address operands 169bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 170bdd1243dSDimitry Andricdef XtensaPCRelTargetAsmOperand : AsmOperandClass { 171bdd1243dSDimitry Andric let Name = "PCRelTarget"; 172bdd1243dSDimitry Andric let ParserMethod = "parsePCRelTarget"; 173bdd1243dSDimitry Andric let PredicateMethod = "isImm"; 174bdd1243dSDimitry Andric let RenderMethod = "addImmOperands"; 175bdd1243dSDimitry Andric} 176bdd1243dSDimitry Andric 177bdd1243dSDimitry Andricdef pcrel32call : Operand<iPTR> { 178bdd1243dSDimitry Andric let PrintMethod = "printCallOperand"; 179bdd1243dSDimitry Andric let EncoderMethod = "getCallEncoding"; 180bdd1243dSDimitry Andric let DecoderMethod = "decodeCallOperand"; 181bdd1243dSDimitry Andric let ParserMatchClass = XtensaPCRelTargetAsmOperand; 182bdd1243dSDimitry Andric} 183bdd1243dSDimitry Andric 184bdd1243dSDimitry Andricdef brtarget : Operand<OtherVT> { 185bdd1243dSDimitry Andric let PrintMethod = "printBranchTarget"; 186bdd1243dSDimitry Andric let EncoderMethod = "getBranchTargetEncoding"; 187bdd1243dSDimitry Andric let DecoderMethod = "decodeBranchOperand"; 188bdd1243dSDimitry Andric let ParserMatchClass = XtensaPCRelTargetAsmOperand; 189bdd1243dSDimitry Andric} 190bdd1243dSDimitry Andric 191bdd1243dSDimitry Andricdef jumptarget : Operand<OtherVT> { 192bdd1243dSDimitry Andric let PrintMethod = "printJumpTarget"; 193bdd1243dSDimitry Andric let EncoderMethod = "getJumpTargetEncoding"; 194bdd1243dSDimitry Andric let DecoderMethod = "decodeJumpOperand"; 195bdd1243dSDimitry Andric let ParserMatchClass = XtensaPCRelTargetAsmOperand; 196bdd1243dSDimitry Andric} 197bdd1243dSDimitry Andric 198*0fca6ea1SDimitry Andricdef L32Rtarget : Operand<i32> { 199bdd1243dSDimitry Andric let PrintMethod = "printL32RTarget"; 200bdd1243dSDimitry Andric let EncoderMethod = "getL32RTargetEncoding"; 201bdd1243dSDimitry Andric let DecoderMethod = "decodeL32ROperand"; 202bdd1243dSDimitry Andric let ParserMatchClass = XtensaPCRelTargetAsmOperand; 203bdd1243dSDimitry Andric} 204