xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Xtensa/XtensaOperands.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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