Skip to content

Commit 628e115

Browse files
committed
[EraVM] Prepare for removing repeated operand definitions in *.td files
Perform a few preparations before removing repeated definitions of operands in `EraVMInstrInfo.td`: * move the definitions of EraVM-specific `AsmOperandClass`es and `Operand`s, so that they can be used in `EraVMInstrFormats.td` * define tablegen classes to be mixed into `Ixx_x` instruction classes
1 parent f31171e commit 628e115

File tree

2 files changed

+143
-158
lines changed

2 files changed

+143
-158
lines changed

llvm/lib/Target/EraVM/EraVMInstrFormats.td

Lines changed: 143 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,88 @@ def withRegisterResult : WithDifferentResult<"ToStack", "ToReg">;
108108

109109
include "EraVMOpcodes.td"
110110

111+
//===----------------------------------------------------------------------===//
112+
// EraVM Operand Definitions.
113+
//===----------------------------------------------------------------------===//
114+
115+
def UImm16Operand : AsmOperandClass {
116+
let Name = "UImm16";
117+
let ParserMethod = "tryParseUImm16Operand";
118+
let PredicateMethod = "isImm";
119+
let RenderMethod = "addImmOperands";
120+
}
121+
122+
def imm16 : Operand<i256>, IntImmLeaf<i256, [{
123+
return Imm.isIntN(16);
124+
}]> {
125+
let ParserMatchClass = UImm16Operand;
126+
}
127+
128+
def neg_imm16 : Operand<i256>, IntImmLeaf<i256, [{
129+
return Imm.isNegative() && Imm.abs().isIntN(16);
130+
}]> {}
131+
132+
def large_imm : Operand<i256>, IntImmLeaf<i256, [{
133+
return !Imm.abs().isIntN(16);
134+
}]> {}
135+
136+
// This operand class represents those jump targets described
137+
// as imm_in operand in the spec.
138+
def JumpTargetOperand : AsmOperandClass {
139+
let Name = "JumpTarget";
140+
let ParserMethod = "tryParseJumpTargetOperand";
141+
let PredicateMethod = "isImm";
142+
let RenderMethod = "addImmOperands";
143+
}
144+
145+
def jmptarget : Operand<OtherVT> {
146+
let ParserMatchClass = JumpTargetOperand;
147+
let EncoderMethod = "getJumpTargetValue";
148+
}
149+
150+
// Address operands
151+
152+
def CodeOperand : AsmOperandClass {
153+
let Name = "CodeReference";
154+
let ParserMethod = "tryParseCodeOperand";
155+
}
156+
157+
def memop : Operand<i256> {
158+
let PrintMethod = "printMemOperand";
159+
let EncoderMethod = "getMemOpValue";
160+
let ParserMatchClass = CodeOperand;
161+
let DecoderMethod = "DecodeCodeOperand";
162+
let MIOperandInfo = (ops GR256, i16imm);
163+
}
164+
165+
let ParserMethod = "tryParseStackOperand",
166+
RenderMethod = "addStackReferenceOperands" in {
167+
def StackInOperand : AsmOperandClass {
168+
let Name = "StackInReference";
169+
let PredicateMethod = "isStackReference<true>";
170+
}
171+
def StackOutOperand : AsmOperandClass {
172+
let Name = "StackOutReference";
173+
let PredicateMethod = "isStackReference<false>";
174+
}
175+
}
176+
177+
def stackin : Operand<i256> {
178+
let PrintMethod = "printStackOperand<true>";
179+
let EncoderMethod = "getStackOpValue<true>";
180+
let ParserMatchClass = StackInOperand;
181+
let DecoderMethod = "DecodeStackOperand";
182+
let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm);
183+
}
184+
185+
def stackout : Operand<i256> {
186+
let PrintMethod = "printStackOperand<false>";
187+
let EncoderMethod = "getStackOpValue<false>";
188+
let ParserMatchClass = StackOutOperand;
189+
let DecoderMethod = "DecodeStackOperand";
190+
let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm);
191+
}
192+
111193
//===----------------------------------------------------------------------===//
112194
// EraVM Instructions
113195
//===----------------------------------------------------------------------===//
@@ -346,21 +428,59 @@ class IBinaryS<EraVMOpcode opcode,
346428
let Imm1 = dst0{19-4};
347429
}
348430

349-
class Irr_r<EraVMOpcode opcode,
350-
mod_swap swap_operands, mod_set_flags silent,
351-
dag outs, dag ins,
352-
string asmstr,
353-
list<dag> pattern>
354-
: IBinaryR<opcode, SrcReg, swap_operands, silent, outs, ins, asmstr, pattern> {
431+
// Mix-in classes to hook standard fields for different combinations
432+
// of input operands.
433+
434+
class SrcOperandsRR {
435+
SrcOperandMode OperandAddrMode = OpndRR;
436+
355437
bits<4> rs0;
356438
bits<4> rs1;
357439

358-
let OperandAddrMode = OpndRR;
440+
bits<4> Src0 = rs0;
441+
bits<4> Src1 = rs1;
442+
}
443+
444+
class SrcOperandsIR {
445+
SrcOperandMode OperandAddrMode = OpndIR;
359446

360-
let Src0 = rs0;
361-
let Src1 = rs1;
447+
bits<16> imm;
448+
bits<4> rs1;
449+
450+
bits<16> Imm0 = imm;
451+
bits<4> Src1 = rs1;
452+
}
453+
454+
class SrcOperandsMR {
455+
SrcOperandMode OperandAddrMode = OpndCR;
456+
457+
bits<20> src0;
458+
bits<4> rs1;
459+
460+
bits<4> Src0 = src0{3-0};
461+
bits<16> Imm0 = src0{19-4};
462+
bits<4> Src1 = rs1;
463+
}
464+
465+
class SrcOperandsSR {
466+
SrcOperandMode OperandAddrMode = OpndSR;
467+
468+
bits<20> src0;
469+
bits<4> rs1;
470+
471+
bits<4> Src0 = src0{3-0};
472+
bits<16> Imm0 = src0{19-4};
473+
bits<4> Src1 = rs1;
362474
}
363475

476+
class Irr_r<EraVMOpcode opcode,
477+
mod_swap swap_operands, mod_set_flags silent,
478+
dag outs, dag ins,
479+
string asmstr,
480+
list<dag> pattern>
481+
: IBinaryR<opcode, SrcReg, swap_operands, silent, outs, ins, asmstr, pattern>,
482+
SrcOperandsRR;
483+
364484
class Irr_rr<EraVMOpcode opcode,
365485
mod_swap swap_operands, mod_set_flags silent,
366486
dag outs, dag ins,
@@ -377,15 +497,8 @@ class Iir_r<EraVMOpcode opcode,
377497
dag outs, dag ins,
378498
string asmstr,
379499
list<dag> pattern>
380-
: IBinaryR<opcode, SrcImm, swap_operands, silent, outs, ins, asmstr, pattern> {
381-
bits<4> rs1;
382-
bits<16> imm;
383-
384-
let OperandAddrMode = OpndIR;
385-
386-
let Src1 = rs1;
387-
let Imm0 = imm;
388-
}
500+
: IBinaryR<opcode, SrcImm, swap_operands, silent, outs, ins, asmstr, pattern>,
501+
SrcOperandsIR;
389502

390503
class Iir_rr<EraVMOpcode opcode,
391504
mod_swap swap_operands, mod_set_flags silent,
@@ -403,32 +516,16 @@ class Imr_r<EraVMOpcode opcode,
403516
dag outs, dag ins,
404517
string asmstr,
405518
list<dag> pattern>
406-
: IBinaryR<opcode, SrcCodeAddr, swap_operands, silent, outs, ins, asmstr, pattern> {
407-
bits<20> src0;
408-
bits<4> rs1;
409-
410-
let OperandAddrMode = OpndCR;
411-
412-
let Src0 = src0{3-0};
413-
let Imm0 = src0{19-4};
414-
let Src1 = rs1;
415-
}
519+
: IBinaryR<opcode, SrcCodeAddr, swap_operands, silent, outs, ins, asmstr, pattern>,
520+
SrcOperandsMR;
416521

417522
class Isr_r<EraVMOpcode opcode,
418523
mod_swap swap_operands, mod_set_flags silent,
419524
dag outs, dag ins,
420525
string asmstr,
421526
list<dag> pattern>
422-
: IBinaryR<opcode, SrcStackAbsolute, swap_operands, silent, outs, ins, asmstr, pattern> {
423-
bits<20> src0;
424-
bits<4> rs1;
425-
426-
let OperandAddrMode = OpndSR;
427-
428-
let Src0 = src0{3-0};
429-
let Src1 = rs1;
430-
let Imm0 = src0{19-4};
431-
}
527+
: IBinaryR<opcode, SrcStackAbsolute, swap_operands, silent, outs, ins, asmstr, pattern>,
528+
SrcOperandsSR;
432529

433530
class Imr_rr<EraVMOpcode opcode,
434531
mod_swap swap_operands, mod_set_flags silent,
@@ -457,15 +554,8 @@ class Irr_s<EraVMOpcode opcode,
457554
dag outs, dag ins,
458555
string asmstr,
459556
list<dag> pattern>
460-
: IBinaryS<opcode, SrcReg, swap_operands, silent, outs, ins, asmstr, pattern> {
461-
bits<4> rs0;
462-
bits<4> rs1;
463-
464-
let OperandAddrMode = OpndRR;
465-
466-
let Src0 = rs0;
467-
let Src1 = rs1;
468-
}
557+
: IBinaryS<opcode, SrcReg, swap_operands, silent, outs, ins, asmstr, pattern>,
558+
SrcOperandsRR;
469559

470560
class Irr_sr<EraVMOpcode opcode,
471561
mod_swap swap_operands, mod_set_flags silent,
@@ -483,15 +573,8 @@ class Iir_s<EraVMOpcode opcode,
483573
dag outs, dag ins,
484574
string asmstr,
485575
list<dag> pattern>
486-
: IBinaryS<opcode, SrcImm, swap_operands, silent, outs, ins, asmstr, pattern> {
487-
bits<16> imm;
488-
bits<4> rs1;
489-
490-
let OperandAddrMode = OpndIR;
491-
492-
let Imm0 = imm;
493-
let Src1 = rs1;
494-
}
576+
: IBinaryS<opcode, SrcImm, swap_operands, silent, outs, ins, asmstr, pattern>,
577+
SrcOperandsIR;
495578

496579
class Iir_sr<EraVMOpcode opcode,
497580
mod_swap swap_operands, mod_set_flags silent,
@@ -509,32 +592,16 @@ class Imr_s<EraVMOpcode opcode,
509592
dag outs, dag ins,
510593
string asmstr,
511594
list<dag> pattern>
512-
: IBinaryS<opcode, SrcCodeAddr, swap_operands, silent, outs, ins, asmstr, pattern> {
513-
bits<20> src0;
514-
bits<4> rs1;
515-
516-
let OperandAddrMode = OpndCR;
517-
518-
let Src0 = src0{3-0};
519-
let Imm0 = src0{19-4};
520-
let Src1 = rs1;
521-
}
595+
: IBinaryS<opcode, SrcCodeAddr, swap_operands, silent, outs, ins, asmstr, pattern>,
596+
SrcOperandsMR;
522597

523598
class Isr_s<EraVMOpcode opcode,
524599
mod_swap swap_operands, mod_set_flags silent,
525600
dag outs, dag ins,
526601
string asmstr,
527602
list<dag> pattern>
528-
: IBinaryS<opcode, SrcStackAbsolute, swap_operands, silent, outs, ins, asmstr, pattern> {
529-
bits<20> src0;
530-
bits<4> rs1;
531-
532-
let OperandAddrMode = OpndSR;
533-
534-
let Src0 = src0{3-0};
535-
let Src1 = rs1;
536-
let Imm0 = src0{19-4};
537-
}
603+
: IBinaryS<opcode, SrcStackAbsolute, swap_operands, silent, outs, ins, asmstr, pattern>,
604+
SrcOperandsSR;
538605

539606
class Imr_sr<EraVMOpcode opcode,
540607
mod_swap swap_operands, mod_set_flags silent,

llvm/lib/Target/EraVM/EraVMInstrInfo.td

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -105,88 +105,6 @@ def EraVMAdd_v : SDNode<"EraVMISD::ADD_V", SDT_EraVMArith, [SDNPHasChain, SDNPOu
105105
def EraVMSub_v : SDNode<"EraVMISD::SUB_V", SDT_EraVMArith, [SDNPHasChain, SDNPOutGlue]>;
106106
def EraVMMul_v : SDNode<"EraVMISD::MUL_V", SDT_EraVMArith, [SDNPHasChain, SDNPOutGlue]>;
107107

108-
//===----------------------------------------------------------------------===//
109-
// EraVM Operand Definitions.
110-
//===----------------------------------------------------------------------===//
111-
112-
def UImm16Operand : AsmOperandClass {
113-
let Name = "UImm16";
114-
let ParserMethod = "tryParseUImm16Operand";
115-
let PredicateMethod = "isImm";
116-
let RenderMethod = "addImmOperands";
117-
}
118-
119-
def imm16 : Operand<i256>, IntImmLeaf<i256, [{
120-
return Imm.isIntN(16);
121-
}]> {
122-
let ParserMatchClass = UImm16Operand;
123-
}
124-
125-
def neg_imm16 : Operand<i256>, IntImmLeaf<i256, [{
126-
return Imm.isNegative() && Imm.abs().isIntN(16);
127-
}]> {}
128-
129-
def large_imm : Operand<i256>, IntImmLeaf<i256, [{
130-
return !Imm.abs().isIntN(16);
131-
}]> {}
132-
133-
// This operand class represents those jump targets described
134-
// as imm_in operand in the spec.
135-
def JumpTargetOperand : AsmOperandClass {
136-
let Name = "JumpTarget";
137-
let ParserMethod = "tryParseJumpTargetOperand";
138-
let PredicateMethod = "isImm";
139-
let RenderMethod = "addImmOperands";
140-
}
141-
142-
def jmptarget : Operand<OtherVT> {
143-
let ParserMatchClass = JumpTargetOperand;
144-
let EncoderMethod = "getJumpTargetValue";
145-
}
146-
147-
// Address operands
148-
149-
def CodeOperand : AsmOperandClass {
150-
let Name = "CodeReference";
151-
let ParserMethod = "tryParseCodeOperand";
152-
}
153-
154-
def memop : Operand<i256> {
155-
let PrintMethod = "printMemOperand";
156-
let EncoderMethod = "getMemOpValue";
157-
let ParserMatchClass = CodeOperand;
158-
let DecoderMethod = "DecodeCodeOperand";
159-
let MIOperandInfo = (ops GR256, i16imm);
160-
}
161-
162-
let ParserMethod = "tryParseStackOperand",
163-
RenderMethod = "addStackReferenceOperands" in {
164-
def StackInOperand : AsmOperandClass {
165-
let Name = "StackInReference";
166-
let PredicateMethod = "isStackReference<true>";
167-
}
168-
def StackOutOperand : AsmOperandClass {
169-
let Name = "StackOutReference";
170-
let PredicateMethod = "isStackReference<false>";
171-
}
172-
}
173-
174-
def stackin : Operand<i256> {
175-
let PrintMethod = "printStackOperand<true>";
176-
let EncoderMethod = "getStackOpValue<true>";
177-
let ParserMatchClass = StackInOperand;
178-
let DecoderMethod = "DecodeStackOperand";
179-
let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm);
180-
}
181-
182-
def stackout : Operand<i256> {
183-
let PrintMethod = "printStackOperand<false>";
184-
let EncoderMethod = "getStackOpValue<false>";
185-
let ParserMatchClass = StackOutOperand;
186-
let DecoderMethod = "DecodeStackOperand";
187-
let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm);
188-
}
189-
190108
//===----------------------------------------------------------------------===//
191109
// Custom DAG Selection Operations.
192110
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)