• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//===-- RISCVInstrFormatsC.td - RISCV C Instruction Formats --*- tablegen -*-=//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file describes the RISC-V C extension instruction formats.
11//
12//===----------------------------------------------------------------------===//
13
14class RVInst16<dag outs, dag ins, string opcodestr, string argstr,
15               list<dag> pattern, InstFormat format>
16    : Instruction {
17  field bits<16> Inst;
18  // SoftFail is a field the disassembler can use to provide a way for
19  // instructions to not match without killing the whole decode process. It is
20  // mainly used for ARM, but Tablegen expects this field to exist or it fails
21  // to build the decode table.
22  field bits<16> SoftFail = 0;
23  let Size = 2;
24
25  bits<2> Opcode = 0;
26
27  let Namespace = "RISCV";
28
29  dag OutOperandList = outs;
30  dag InOperandList = ins;
31  let AsmString = opcodestr # "\t" # argstr;
32  let Pattern = pattern;
33
34  let TSFlags{4-0} = format.Value;
35}
36
37class RVInst16CR<bits<4> funct4, bits<2> opcode, dag outs, dag ins,
38                 string opcodestr, string argstr>
39    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCR> {
40  bits<5> rs1;
41  bits<5> rs2;
42
43  let Inst{15-12} = funct4;
44  let Inst{11-7} = rs1;
45  let Inst{6-2} = rs2;
46  let Inst{1-0} = opcode;
47}
48
49// The immediate value encoding differs for each instruction, so each subclass
50// is responsible for setting the appropriate bits in the Inst field.
51// The bits Inst{6-2} must be set for each instruction.
52class RVInst16CI<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
53                 string opcodestr, string argstr>
54    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCI> {
55  bits<10> imm;
56  bits<5> rd;
57  bits<5> rs1;
58
59  let Inst{15-13} = funct3;
60  let Inst{12} = imm{5};
61  let Inst{11-7} = rd;
62  let Inst{1-0} = opcode;
63}
64
65// The immediate value encoding differs for each instruction, so each subclass
66// is responsible for setting the appropriate bits in the Inst field.
67// The bits Inst{12-7} must be set for each instruction.
68class RVInst16CSS<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
69                  string opcodestr, string argstr>
70    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCSS> {
71  bits<10> imm;
72  bits<5> rs2;
73  bits<5> rs1;
74
75  let Inst{15-13} = funct3;
76  let Inst{6-2} = rs2;
77  let Inst{1-0} = opcode;
78}
79
80class RVInst16CIW<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
81                  string opcodestr, string argstr>
82    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCIW> {
83  bits<10> imm;
84  bits<3> rd;
85
86  let Inst{15-13} = funct3;
87  let Inst{4-2} = rd;
88  let Inst{1-0} = opcode;
89}
90
91// The immediate value encoding differs for each instruction, so each subclass
92// is responsible for setting the appropriate bits in the Inst field.
93// The bits Inst{12-10} and Inst{6-5} must be set for each instruction.
94class RVInst16CL<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
95                 string opcodestr, string argstr>
96    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCL> {
97  bits<3> rd;
98  bits<3> rs1;
99
100  let Inst{15-13} = funct3;
101  let Inst{9-7} = rs1;
102  let Inst{4-2} = rd;
103  let Inst{1-0} = opcode;
104}
105
106// The immediate value encoding differs for each instruction, so each subclass
107// is responsible for setting the appropriate bits in the Inst field.
108// The bits Inst{12-10} and Inst{6-5} must be set for each instruction.
109class RVInst16CS<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
110                 string opcodestr, string argstr>
111    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCS> {
112  bits<3> rs2;
113  bits<3> rs1;
114
115  let Inst{15-13} = funct3;
116  let Inst{9-7} = rs1;
117  let Inst{4-2} = rs2;
118  let Inst{1-0} = opcode;
119}
120
121class RVInst16CB<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
122                 string opcodestr, string argstr>
123    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCB> {
124  bits<9> imm;
125  bits<3> rs1;
126
127  let Inst{15-13} = funct3;
128  let Inst{9-7} = rs1;
129  let Inst{1-0} = opcode;
130}
131
132class RVInst16CJ<bits<3> funct3, bits<2> opcode, dag outs, dag ins,
133                 string opcodestr, string argstr>
134    : RVInst16<outs, ins, opcodestr, argstr, [], InstFormatCJ> {
135  bits<11> offset;
136
137  let Inst{15-13} = funct3;
138  let Inst{12} = offset{10};
139  let Inst{11} = offset{3};
140  let Inst{10-9} = offset{8-7};
141  let Inst{8} = offset{9};
142  let Inst{7} = offset{5};
143  let Inst{6} = offset{6};
144  let Inst{5-3} = offset{2-0};
145  let Inst{2} = offset{4};
146  let Inst{1-0} = opcode;
147}
148