annotate llvm/test/TableGen/DAGDefaultOps.td @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: llvm-tblgen -gen-dag-isel -I %p/../../include %s -o %t
anatofuz
parents:
diff changeset
2 // RUN: FileCheck --check-prefix=ADD %s < %t
anatofuz
parents:
diff changeset
3 // RUN: FileCheck --check-prefix=ADDINT %s < %t
anatofuz
parents:
diff changeset
4 // RUN: FileCheck --check-prefix=SUB %s < %t
anatofuz
parents:
diff changeset
5 // RUN: FileCheck --check-prefix=MULINT %s < %t
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 include "llvm/Target/Target.td"
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 def TestInstrInfo : InstrInfo;
anatofuz
parents:
diff changeset
10 def TestTarget : Target {
anatofuz
parents:
diff changeset
11 let InstructionSet = TestInstrInfo;
anatofuz
parents:
diff changeset
12 }
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 class TestEncoding : Instruction {
anatofuz
parents:
diff changeset
15 field bits<32> Inst;
anatofuz
parents:
diff changeset
16 }
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 class TestReg<int index> : Register<"R"#index, []> {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
19 let HWEncoding{15...4} = 0;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20 let HWEncoding{3...0} = !cast<bits<4>>(index);
150
anatofuz
parents:
diff changeset
21 }
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
22 foreach i = 0...15 in
150
anatofuz
parents:
diff changeset
23 def "R"#i : TestReg<i>;
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 def Reg : RegisterClass<"TestTarget", [i32], 32, (sequence "R%d", 0, 15)>;
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 def IntOperand: Operand<i32>;
anatofuz
parents:
diff changeset
28 def OptionalIntOperand: OperandWithDefaultOps<i32, (ops (i32 0))>;
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 class RRI<string Mnemonic, bits<4> Opcode> : TestEncoding {
anatofuz
parents:
diff changeset
31 dag OutOperandList = (outs Reg:$dest);
anatofuz
parents:
diff changeset
32 dag InOperandList = (ins Reg:$src1, Reg:$src2, OptionalIntOperand:$imm);
anatofuz
parents:
diff changeset
33 string AsmString = Mnemonic # " $dest1, $src1, $src2, #$imm";
anatofuz
parents:
diff changeset
34 string AsmVariantName = "";
anatofuz
parents:
diff changeset
35 field bits<4> dest;
anatofuz
parents:
diff changeset
36 field bits<4> src1;
anatofuz
parents:
diff changeset
37 field bits<4> src2;
anatofuz
parents:
diff changeset
38 field bits<16> imm;
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
39 let Inst{31...28} = Opcode;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
40 let Inst{27...24} = dest;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
41 let Inst{23...20} = src1;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42 let Inst{19...16} = src2;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
43 let Inst{15...0} = imm;
150
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 def AddRRI : RRI<"add", 0b0001>;
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 // I define one of these intrinsics with IntrNoMem and the other
anatofuz
parents:
diff changeset
49 // without it, so that they'll match different top-level DAG opcodes
anatofuz
parents:
diff changeset
50 // (INTRINSIC_WO_CHAIN and INTRINSIC_W_CHAIN), which makes the
anatofuz
parents:
diff changeset
51 // FileCheck-herding easier, because every case I want to detect
anatofuz
parents:
diff changeset
52 // should show up as a separate top-level switch element.
anatofuz
parents:
diff changeset
53 def int_addplus1 : Intrinsic<
anatofuz
parents:
diff changeset
54 [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
anatofuz
parents:
diff changeset
55 def int_mul3 : Intrinsic<
anatofuz
parents:
diff changeset
56 [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 def AddPat : Pat<(add i32:$x, i32:$y),
anatofuz
parents:
diff changeset
59 (AddRRI Reg:$x, Reg:$y)>;
anatofuz
parents:
diff changeset
60 def Add1Pat : Pat<(int_addplus1 i32:$x, i32:$y),
anatofuz
parents:
diff changeset
61 (AddRRI Reg:$x, Reg:$y, (i32 1))>;
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 def SubRRI : RRI<"sub", 0b0010> {
anatofuz
parents:
diff changeset
64 let Pattern = [(set Reg:$dest, (sub Reg:$src1, Reg:$src2))];
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 def MulRRI : RRI<"mul", 0b0011> {
anatofuz
parents:
diff changeset
68 let Pattern = [(set Reg:$dest, (int_mul3 Reg:$src1, Reg:$src2, i32:$imm))];
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 def MulIRR : RRI<"mul2", 0b0100> {
anatofuz
parents:
diff changeset
72 let InOperandList = (ins OptionalIntOperand:$imm, Reg:$src1, Reg:$src2);
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74 def MulIRRPat : Pat<(mul i32:$x, i32:$y), (MulIRR Reg:$x, Reg:$y)>;
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // ADD: SwitchOpcode{{.*}}TARGET_VAL(ISD::ADD)
anatofuz
parents:
diff changeset
77 // ADD-NEXT: OPC_RecordChild0
anatofuz
parents:
diff changeset
78 // ADD-NEXT: OPC_RecordChild1
anatofuz
parents:
diff changeset
79 // ADD-NEXT: OPC_EmitInteger, MVT::i32, 0
anatofuz
parents:
diff changeset
80 // ADD-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::AddRRI)
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 // ADDINT: SwitchOpcode{{.*}}TARGET_VAL(ISD::INTRINSIC_WO_CHAIN)
anatofuz
parents:
diff changeset
83 // ADDINT-NEXT: OPC_CheckChild0Integer
anatofuz
parents:
diff changeset
84 // ADDINT-NEXT: OPC_RecordChild1
anatofuz
parents:
diff changeset
85 // ADDINT-NEXT: OPC_RecordChild2
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 // ADDINT-NEXT: OPC_EmitInteger, MVT::i32, 2
150
anatofuz
parents:
diff changeset
87 // ADDINT-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::AddRRI)
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 // SUB: SwitchOpcode{{.*}}TARGET_VAL(ISD::SUB)
anatofuz
parents:
diff changeset
90 // SUB-NEXT: OPC_RecordChild0
anatofuz
parents:
diff changeset
91 // SUB-NEXT: OPC_RecordChild1
anatofuz
parents:
diff changeset
92 // SUB-NEXT: OPC_EmitInteger, MVT::i32, 0
anatofuz
parents:
diff changeset
93 // SUB-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::SubRRI)
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 // MULINT: SwitchOpcode{{.*}}TARGET_VAL(ISD::INTRINSIC_W_CHAIN)
anatofuz
parents:
diff changeset
96 // MULINT-NEXT: OPC_RecordNode
anatofuz
parents:
diff changeset
97 // MULINT-NEXT: OPC_CheckChild1Integer
anatofuz
parents:
diff changeset
98 // MULINT-NEXT: OPC_RecordChild2
anatofuz
parents:
diff changeset
99 // MULINT-NEXT: OPC_RecordChild3
anatofuz
parents:
diff changeset
100 // MULINT-NEXT: OPC_RecordChild4
anatofuz
parents:
diff changeset
101 // MULINT-NEXT: OPC_EmitMergeInputChains
anatofuz
parents:
diff changeset
102 // MULINT-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::MulRRI)
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 // MUL: SwitchOpcode{{.*}}TARGET_VAL(ISD::MUL)
anatofuz
parents:
diff changeset
105 // MUL-NEXT: OPC_EmitInteger, MVT::i32, 0
anatofuz
parents:
diff changeset
106 // MUL-NEXT: OPC_RecordChild0
anatofuz
parents:
diff changeset
107 // MUL-NEXT: OPC_RecordChild1
anatofuz
parents:
diff changeset
108 // MUL-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::MulRRI)