xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric//===-- RISCVInstrInfoZc.td - RISC-V 'Zc*' instructions ----*- tablegen -*-===//
206c3fb27SDimitry Andric//
306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric//
706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric///
906c3fb27SDimitry Andric/// This file describes the RISC-V instructions from the 'Zc*' compressed
1006c3fb27SDimitry Andric/// instruction extensions, version 1.0.3.
1106c3fb27SDimitry Andric///
1206c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1306c3fb27SDimitry Andric
1406c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1506c3fb27SDimitry Andric// Operand and SDNode transformation definitions.
1606c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1706c3fb27SDimitry Andric
185f757f3fSDimitry Andricdef uimm2_lsb0 : RISCVOp,
1906c3fb27SDimitry Andric                 ImmLeaf<XLenVT, [{return isShiftedUInt<1, 1>(Imm);}]> {
2006c3fb27SDimitry Andric  let ParserMatchClass = UImmAsmOperand<2, "Lsb0">;
2106c3fb27SDimitry Andric  let EncoderMethod = "getImmOpValue";
2206c3fb27SDimitry Andric  let DecoderMethod = "decodeUImmOperand<2>";
2306c3fb27SDimitry Andric  let OperandType = "OPERAND_UIMM2_LSB0";
2406c3fb27SDimitry Andric  let MCOperandPredicate = [{
2506c3fb27SDimitry Andric    int64_t Imm;
2606c3fb27SDimitry Andric    if (!MCOp.evaluateAsConstantImm(Imm))
2706c3fb27SDimitry Andric      return false;
2806c3fb27SDimitry Andric    return isShiftedUInt<1, 1>(Imm);
2906c3fb27SDimitry Andric  }];
3006c3fb27SDimitry Andric}
3106c3fb27SDimitry Andric
325f757f3fSDimitry Andricdef uimm8ge32 : RISCVOp {
3306c3fb27SDimitry Andric  let ParserMatchClass = UImmAsmOperand<8, "GE32">;
3406c3fb27SDimitry Andric  let DecoderMethod = "decodeUImmOperand<8>";
3506c3fb27SDimitry Andric  let OperandType = "OPERAND_UIMM8_GE32";
3606c3fb27SDimitry Andric}
3706c3fb27SDimitry Andric
3806c3fb27SDimitry Andricdef RlistAsmOperand : AsmOperandClass {
3906c3fb27SDimitry Andric  let Name = "Rlist";
4006c3fb27SDimitry Andric  let ParserMethod = "parseReglist";
4106c3fb27SDimitry Andric  let DiagnosticType = "InvalidRlist";
4206c3fb27SDimitry Andric}
4306c3fb27SDimitry Andric
44*0fca6ea1SDimitry Andricdef StackAdjAsmOperand : AsmOperandClass {
45*0fca6ea1SDimitry Andric  let Name = "StackAdj";
46*0fca6ea1SDimitry Andric  let ParserMethod = "parseZcmpStackAdj";
47*0fca6ea1SDimitry Andric  let DiagnosticType = "InvalidStackAdj";
48*0fca6ea1SDimitry Andric  let PredicateMethod = "isSpimm";
49*0fca6ea1SDimitry Andric  let RenderMethod = "addSpimmOperands";
50*0fca6ea1SDimitry Andric}
51*0fca6ea1SDimitry Andric
52*0fca6ea1SDimitry Andricdef NegStackAdjAsmOperand : AsmOperandClass {
53*0fca6ea1SDimitry Andric  let Name = "NegStackAdj";
54*0fca6ea1SDimitry Andric  let ParserMethod = "parseZcmpNegStackAdj";
55*0fca6ea1SDimitry Andric  let DiagnosticType = "InvalidStackAdj";
56*0fca6ea1SDimitry Andric  let PredicateMethod = "isSpimm";
57*0fca6ea1SDimitry Andric  let RenderMethod = "addSpimmOperands";
5806c3fb27SDimitry Andric}
5906c3fb27SDimitry Andric
6006c3fb27SDimitry Andricdef rlist : Operand<OtherVT> {
6106c3fb27SDimitry Andric   let ParserMatchClass = RlistAsmOperand;
6206c3fb27SDimitry Andric   let PrintMethod = "printRlist";
6306c3fb27SDimitry Andric   let DecoderMethod = "decodeZcmpRlist";
6406c3fb27SDimitry Andric   let EncoderMethod = "getRlistOpValue";
6506c3fb27SDimitry Andric   let MCOperandPredicate = [{
6606c3fb27SDimitry Andric    int64_t Imm;
6706c3fb27SDimitry Andric    if (!MCOp.evaluateAsConstantImm(Imm))
6806c3fb27SDimitry Andric      return false;
6906c3fb27SDimitry Andric    // 0~3 Reserved for EABI
70647cbc5dSDimitry Andric    return isUInt<4>(Imm) && Imm >= 4;
7106c3fb27SDimitry Andric  }];
7206c3fb27SDimitry Andric}
7306c3fb27SDimitry Andric
74*0fca6ea1SDimitry Andricdef stackadj : RISCVOp<OtherVT> {
75*0fca6ea1SDimitry Andric  let ParserMatchClass = StackAdjAsmOperand;
76*0fca6ea1SDimitry Andric  let PrintMethod = "printStackAdj";
7706c3fb27SDimitry Andric  let DecoderMethod = "decodeZcmpSpimm";
78*0fca6ea1SDimitry Andric  let OperandType = "OPERAND_SPIMM";
79*0fca6ea1SDimitry Andric  let MCOperandPredicate = [{
80*0fca6ea1SDimitry Andric    int64_t Imm;
81*0fca6ea1SDimitry Andric    if (!MCOp.evaluateAsConstantImm(Imm))
82*0fca6ea1SDimitry Andric      return false;
83*0fca6ea1SDimitry Andric    return isShiftedUInt<2, 4>(Imm);
84*0fca6ea1SDimitry Andric  }];
85*0fca6ea1SDimitry Andric}
86*0fca6ea1SDimitry Andric
87*0fca6ea1SDimitry Andricdef negstackadj : RISCVOp<OtherVT> {
88*0fca6ea1SDimitry Andric  let ParserMatchClass = NegStackAdjAsmOperand;
89*0fca6ea1SDimitry Andric  let PrintMethod = "printNegStackAdj";
90*0fca6ea1SDimitry Andric  let DecoderMethod = "decodeZcmpSpimm";
91*0fca6ea1SDimitry Andric  let OperandType = "OPERAND_SPIMM";
9206c3fb27SDimitry Andric  let MCOperandPredicate = [{
9306c3fb27SDimitry Andric    int64_t Imm;
9406c3fb27SDimitry Andric    if (!MCOp.evaluateAsConstantImm(Imm))
9506c3fb27SDimitry Andric      return false;
96647cbc5dSDimitry Andric    return isShiftedUInt<2, 4>(Imm);
9706c3fb27SDimitry Andric  }];
9806c3fb27SDimitry Andric}
9906c3fb27SDimitry Andric
10006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
10106c3fb27SDimitry Andric// Instruction Class Templates
10206c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
10306c3fb27SDimitry Andric
10406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in
10506c3fb27SDimitry Andricclass CLoadB_ri<bits<6> funct6, string OpcodeStr>
10606c3fb27SDimitry Andric    : RVInst16CLB<funct6, 0b00, (outs GPRC:$rd),
10706c3fb27SDimitry Andric                  (ins GPRCMem:$rs1, uimm2:$imm),
10806c3fb27SDimitry Andric                  OpcodeStr, "$rd, ${imm}(${rs1})"> {
10906c3fb27SDimitry Andric  bits<2> imm;
11006c3fb27SDimitry Andric
11106c3fb27SDimitry Andric  let Inst{6-5} = imm{0,1};
11206c3fb27SDimitry Andric}
11306c3fb27SDimitry Andric
11406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in
11506c3fb27SDimitry Andricclass CLoadH_ri<bits<6> funct6, bit funct1, string OpcodeStr>
11606c3fb27SDimitry Andric    : RVInst16CLH<funct6, funct1, 0b00, (outs GPRC:$rd),
11706c3fb27SDimitry Andric                  (ins GPRCMem:$rs1, uimm2_lsb0:$imm),
11806c3fb27SDimitry Andric                  OpcodeStr, "$rd, ${imm}(${rs1})"> {
11906c3fb27SDimitry Andric  bits<2> imm;
12006c3fb27SDimitry Andric
12106c3fb27SDimitry Andric  let Inst{5} = imm{1};
12206c3fb27SDimitry Andric}
12306c3fb27SDimitry Andric
12406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
12506c3fb27SDimitry Andricclass CStoreB_rri<bits<6> funct6, string OpcodeStr>
12606c3fb27SDimitry Andric    : RVInst16CSB<funct6, 0b00, (outs),
12706c3fb27SDimitry Andric                  (ins GPRC:$rs2, GPRCMem:$rs1, uimm2:$imm),
12806c3fb27SDimitry Andric                  OpcodeStr, "$rs2, ${imm}(${rs1})"> {
12906c3fb27SDimitry Andric  bits<2> imm;
13006c3fb27SDimitry Andric
13106c3fb27SDimitry Andric  let Inst{6-5} = imm{0,1};
13206c3fb27SDimitry Andric}
13306c3fb27SDimitry Andric
13406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
13506c3fb27SDimitry Andricclass CStoreH_rri<bits<6> funct6, bit funct1, string OpcodeStr>
13606c3fb27SDimitry Andric    : RVInst16CSH<funct6, funct1, 0b00, (outs),
13706c3fb27SDimitry Andric                  (ins GPRC:$rs2, GPRCMem:$rs1, uimm2_lsb0:$imm),
13806c3fb27SDimitry Andric                  OpcodeStr, "$rs2, ${imm}(${rs1})"> {
13906c3fb27SDimitry Andric  bits<2> imm;
14006c3fb27SDimitry Andric
14106c3fb27SDimitry Andric  let Inst{5} = imm{1};
14206c3fb27SDimitry Andric}
14306c3fb27SDimitry Andric
14406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
14506c3fb27SDimitry Andricclass RVZcArith_r<bits<5> funct5, string OpcodeStr> :
14606c3fb27SDimitry Andric  RVInst16CU<0b100111, funct5, 0b01, (outs GPRC:$rd_wb), (ins GPRC:$rd),
14706c3fb27SDimitry Andric             OpcodeStr, "$rd"> {
14806c3fb27SDimitry Andric  let Constraints = "$rd = $rd_wb";
14906c3fb27SDimitry Andric}
15006c3fb27SDimitry Andric
151*0fca6ea1SDimitry Andricclass RVInstZcCPPP<bits<5> funct5, string opcodestr,
152*0fca6ea1SDimitry Andric                   DAGOperand immtype = stackadj>
153*0fca6ea1SDimitry Andric    : RVInst16<(outs), (ins rlist:$rlist, immtype:$stackadj),
154*0fca6ea1SDimitry Andric               opcodestr, "$rlist, $stackadj", [], InstFormatOther> {
15506c3fb27SDimitry Andric  bits<4> rlist;
156*0fca6ea1SDimitry Andric  bits<16> stackadj;
15706c3fb27SDimitry Andric
15806c3fb27SDimitry Andric  let Inst{1-0} = 0b10;
159*0fca6ea1SDimitry Andric  let Inst{3-2} = stackadj{5-4};
16006c3fb27SDimitry Andric  let Inst{7-4} = rlist;
16106c3fb27SDimitry Andric  let Inst{12-8} = funct5;
16206c3fb27SDimitry Andric  let Inst{15-13} = 0b101;
16306c3fb27SDimitry Andric}
16406c3fb27SDimitry Andric
16506c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
16606c3fb27SDimitry Andric// Instructions
16706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
16806c3fb27SDimitry Andric
16906c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZba, IsRV64] in
17006c3fb27SDimitry Andricdef C_ZEXT_W  : RVZcArith_r<0b11100 , "c.zext.w">,
17106c3fb27SDimitry Andric                Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
17206c3fb27SDimitry Andric
17306c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZbb] in {
17406c3fb27SDimitry Andricdef C_ZEXT_H  : RVZcArith_r<0b11010 , "c.zext.h">,
17506c3fb27SDimitry Andric                Sched<[WriteIALU, ReadIALU]>;
17606c3fb27SDimitry Andricdef C_SEXT_B  : RVZcArith_r<0b11001 , "c.sext.b">,
17706c3fb27SDimitry Andric                Sched<[WriteIALU, ReadIALU]>;
17806c3fb27SDimitry Andricdef C_SEXT_H  : RVZcArith_r<0b11011 , "c.sext.h">,
17906c3fb27SDimitry Andric                Sched<[WriteIALU, ReadIALU]>;
18006c3fb27SDimitry Andric}
18106c3fb27SDimitry Andric
18206c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in
18306c3fb27SDimitry Andricdef C_ZEXT_B  : RVZcArith_r<0b11000 , "c.zext.b">,
18406c3fb27SDimitry Andric                Sched<[WriteIALU, ReadIALU]>;
18506c3fb27SDimitry Andric
186*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZmmul] in
18706c3fb27SDimitry Andricdef C_MUL     : CA_ALU<0b100111, 0b10, "c.mul", GPRC>,
18806c3fb27SDimitry Andric                Sched<[WriteIMul, ReadIMul, ReadIMul]>;
18906c3fb27SDimitry Andric
19006c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in {
19106c3fb27SDimitry Andricdef C_NOT : RVZcArith_r<0b11101 , "c.not">,
19206c3fb27SDimitry Andric            Sched<[WriteIALU, ReadIALU]>;
19306c3fb27SDimitry Andric
19406c3fb27SDimitry Andricdef C_LBU : CLoadB_ri<0b100000, "c.lbu">,
19506c3fb27SDimitry Andric            Sched<[WriteLDB, ReadMemBase]>;
19606c3fb27SDimitry Andricdef C_LHU : CLoadH_ri<0b100001, 0b0, "c.lhu">,
19706c3fb27SDimitry Andric            Sched<[WriteLDH, ReadMemBase]>;
19806c3fb27SDimitry Andricdef C_LH  : CLoadH_ri<0b100001, 0b1, "c.lh">,
19906c3fb27SDimitry Andric            Sched<[WriteLDH, ReadMemBase]>;
20006c3fb27SDimitry Andric
20106c3fb27SDimitry Andricdef C_SB : CStoreB_rri<0b100010, "c.sb">,
20206c3fb27SDimitry Andric           Sched<[WriteSTB, ReadStoreData, ReadMemBase]>;
20306c3fb27SDimitry Andricdef C_SH : CStoreH_rri<0b100011, 0b0, "c.sh">,
20406c3fb27SDimitry Andric           Sched<[WriteSTH, ReadStoreData, ReadMemBase]>;
20506c3fb27SDimitry Andric}
20606c3fb27SDimitry Andric
20706c3fb27SDimitry Andric// Zcmp
20806c3fb27SDimitry Andriclet DecoderNamespace = "RVZcmp", Predicates = [HasStdExtZcmp],
209*0fca6ea1SDimitry Andric    hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
210*0fca6ea1SDimitry Andriclet Defs = [X10, X11] in
21106c3fb27SDimitry Andricdef CM_MVA01S : RVInst16CA<0b101011, 0b11, 0b10, (outs),
212*0fca6ea1SDimitry Andric                            (ins SR07:$rs1, SR07:$rs2), "cm.mva01s", "$rs1, $rs2">,
213*0fca6ea1SDimitry Andric                Sched<[WriteIALU, WriteIALU, ReadIALU, ReadIALU]>;
21406c3fb27SDimitry Andric
215*0fca6ea1SDimitry Andriclet Uses = [X10, X11] in
21606c3fb27SDimitry Andricdef CM_MVSA01 : RVInst16CA<0b101011, 0b01, 0b10, (outs SR07:$rs1, SR07:$rs2),
217*0fca6ea1SDimitry Andric                            (ins), "cm.mvsa01", "$rs1, $rs2">,
218*0fca6ea1SDimitry Andric                Sched<[WriteIALU, WriteIALU, ReadIALU, ReadIALU]>;
21906c3fb27SDimitry Andric} // DecoderNamespace = "RVZcmp", Predicates = [HasStdExtZcmp]...
22006c3fb27SDimitry Andric
22106c3fb27SDimitry Andriclet DecoderNamespace = "RVZcmp", Predicates = [HasStdExtZcmp] in {
222*0fca6ea1SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1, Uses = [X2], Defs = [X2] in
223*0fca6ea1SDimitry Andricdef CM_PUSH : RVInstZcCPPP<0b11000, "cm.push", negstackadj>,
224*0fca6ea1SDimitry Andric              Sched<[WriteIALU, ReadIALU, ReadStoreData, ReadStoreData,
225*0fca6ea1SDimitry Andric                     ReadStoreData, ReadStoreData, ReadStoreData, ReadStoreData,
226*0fca6ea1SDimitry Andric                     ReadStoreData, ReadStoreData, ReadStoreData, ReadStoreData,
227*0fca6ea1SDimitry Andric                     ReadStoreData, ReadStoreData, ReadStoreData]>;
22806c3fb27SDimitry Andric
229*0fca6ea1SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0, isReturn = 1,
230*0fca6ea1SDimitry Andric    Uses = [X2], Defs = [X2] in
231*0fca6ea1SDimitry Andricdef CM_POPRET : RVInstZcCPPP<0b11110, "cm.popret">,
232*0fca6ea1SDimitry Andric                Sched<[WriteIALU, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
233*0fca6ea1SDimitry Andric                       WriteLDW, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
234*0fca6ea1SDimitry Andric                       WriteLDW, WriteLDW, WriteLDW, WriteLDW, ReadIALU]>;
23506c3fb27SDimitry Andric
236*0fca6ea1SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0, isReturn = 1,
237*0fca6ea1SDimitry Andric    Uses = [X2], Defs = [X2, X10] in
238*0fca6ea1SDimitry Andricdef CM_POPRETZ : RVInstZcCPPP<0b11100, "cm.popretz">,
239*0fca6ea1SDimitry Andric                 Sched<[WriteIALU, WriteIALU, WriteLDW, WriteLDW, WriteLDW,
240*0fca6ea1SDimitry Andric                        WriteLDW, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
241*0fca6ea1SDimitry Andric                        WriteLDW, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
242*0fca6ea1SDimitry Andric                        ReadIALU]>;
24306c3fb27SDimitry Andric
244*0fca6ea1SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0,
245*0fca6ea1SDimitry Andric    Uses = [X2], Defs = [X2] in
246*0fca6ea1SDimitry Andricdef CM_POP : RVInstZcCPPP<0b11010, "cm.pop">,
247*0fca6ea1SDimitry Andric             Sched<[WriteIALU, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
248*0fca6ea1SDimitry Andric                    WriteLDW, WriteLDW, WriteLDW, WriteLDW, WriteLDW, WriteLDW,
249*0fca6ea1SDimitry Andric                    WriteLDW, WriteLDW, WriteLDW, ReadIALU]>;
25006c3fb27SDimitry Andric} // DecoderNamespace = "RVZcmp", Predicates = [HasStdExtZcmp]...
25106c3fb27SDimitry Andric
25206c3fb27SDimitry Andriclet DecoderNamespace = "RVZcmt", Predicates = [HasStdExtZcmt],
25306c3fb27SDimitry Andric    hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
25406c3fb27SDimitry Andricdef CM_JT : RVInst16CJ<0b101, 0b10, (outs), (ins uimm5:$index),
25506c3fb27SDimitry Andric                       "cm.jt", "$index">{
25606c3fb27SDimitry Andric  bits<5> index;
25706c3fb27SDimitry Andric
25806c3fb27SDimitry Andric  let Inst{12-7} = 0b000000;
25906c3fb27SDimitry Andric  let Inst{6-2} = index;
26006c3fb27SDimitry Andric}
26106c3fb27SDimitry Andric
26206c3fb27SDimitry Andriclet Defs = [X1] in
26306c3fb27SDimitry Andricdef CM_JALT : RVInst16CJ<0b101, 0b10, (outs), (ins uimm8ge32:$index),
26406c3fb27SDimitry Andric                         "cm.jalt", "$index">{
26506c3fb27SDimitry Andric  bits<8> index;
26606c3fb27SDimitry Andric
26706c3fb27SDimitry Andric  let Inst{12-10} = 0b000;
26806c3fb27SDimitry Andric  let Inst{9-2} = index;
26906c3fb27SDimitry Andric}
27006c3fb27SDimitry Andric} // DecoderNamespace = "RVZcmt", Predicates = [HasStdExtZcmt]...
27106c3fb27SDimitry Andric
27206c3fb27SDimitry Andric
273*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZmmul] in{
27406c3fb27SDimitry Andricdef : CompressPat<(MUL GPRC:$rs1, GPRC:$rs1, GPRC:$rs2),
27506c3fb27SDimitry Andric                  (C_MUL GPRC:$rs1, GPRC:$rs2)>;
27606c3fb27SDimitry Andriclet isCompressOnly = true in
27706c3fb27SDimitry Andricdef : CompressPat<(MUL GPRC:$rs1, GPRC:$rs2, GPRC:$rs1),
27806c3fb27SDimitry Andric                  (C_MUL GPRC:$rs1, GPRC:$rs2)>;
279*0fca6ea1SDimitry Andric} // Predicates = [HasStdExtZcb, HasStdExtZmmul]
28006c3fb27SDimitry Andric
28106c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZbb] in{
28206c3fb27SDimitry Andricdef : CompressPat<(SEXT_B GPRC:$rs1, GPRC:$rs1),
28306c3fb27SDimitry Andric                  (C_SEXT_B GPRC:$rs1, GPRC:$rs1)>;
28406c3fb27SDimitry Andricdef : CompressPat<(SEXT_H GPRC:$rs1, GPRC:$rs1),
28506c3fb27SDimitry Andric                  (C_SEXT_H GPRC:$rs1, GPRC:$rs1)>;
28606c3fb27SDimitry Andric} // Predicates = [HasStdExtZcb, HasStdExtZbb]
28706c3fb27SDimitry Andric
28806c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZbb] in{
28906c3fb27SDimitry Andricdef : CompressPat<(ZEXT_H_RV32 GPRC:$rs1, GPRC:$rs1),
29006c3fb27SDimitry Andric                  (C_ZEXT_H GPRC:$rs1, GPRC:$rs1)>;
29106c3fb27SDimitry Andricdef : CompressPat<(ZEXT_H_RV64 GPRC:$rs1, GPRC:$rs1),
29206c3fb27SDimitry Andric                  (C_ZEXT_H GPRC:$rs1, GPRC:$rs1)>;
29306c3fb27SDimitry Andric} // Predicates = [HasStdExtZcb, HasStdExtZbb]
29406c3fb27SDimitry Andric
29506c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in{
29606c3fb27SDimitry Andricdef : CompressPat<(ANDI GPRC:$rs1, GPRC:$rs1, 255),
29706c3fb27SDimitry Andric                  (C_ZEXT_B GPRC:$rs1, GPRC:$rs1)>;
29806c3fb27SDimitry Andric} // Predicates = [HasStdExtZcb]
29906c3fb27SDimitry Andric
30006c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb, HasStdExtZba, IsRV64] in{
30106c3fb27SDimitry Andricdef : CompressPat<(ADD_UW GPRC:$rs1, GPRC:$rs1, X0),
30206c3fb27SDimitry Andric                  (C_ZEXT_W GPRC:$rs1, GPRC:$rs1)>;
30306c3fb27SDimitry Andric} // Predicates = [HasStdExtZcb, HasStdExtZba, IsRV64]
30406c3fb27SDimitry Andric
30506c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in{
30606c3fb27SDimitry Andricdef : CompressPat<(XORI GPRC:$rs1, GPRC:$rs1, -1),
30706c3fb27SDimitry Andric                  (C_NOT GPRC:$rs1, GPRC:$rs1)>;
30806c3fb27SDimitry Andric}
30906c3fb27SDimitry Andric
31006c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in{
31106c3fb27SDimitry Andricdef : CompressPat<(LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm),
31206c3fb27SDimitry Andric                  (C_LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm)>;
31306c3fb27SDimitry Andricdef : CompressPat<(LHU GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm),
31406c3fb27SDimitry Andric                  (C_LHU GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
31506c3fb27SDimitry Andricdef : CompressPat<(LH GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm),
31606c3fb27SDimitry Andric                  (C_LH GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
31706c3fb27SDimitry Andricdef : CompressPat<(SB GPRC:$rs2, GPRCMem:$rs1, uimm2:$imm),
31806c3fb27SDimitry Andric                  (C_SB GPRC:$rs2, GPRCMem:$rs1, uimm2:$imm)>;
31906c3fb27SDimitry Andricdef : CompressPat<(SH GPRC:$rs2, GPRCMem:$rs1, uimm2_lsb0:$imm),
32006c3fb27SDimitry Andric                  (C_SH GPRC:$rs2, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
32106c3fb27SDimitry Andric}// Predicates = [HasStdExtZcb]
32206c3fb27SDimitry Andric
32306c3fb27SDimitry Andric
32406c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
32506c3fb27SDimitry Andric// Pseudo Instructions
32606c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
32706c3fb27SDimitry Andric
32806c3fb27SDimitry Andriclet Predicates = [HasStdExtZcb] in {
3295f757f3fSDimitry Andricdef : InstAlias<"c.lbu $rd, (${rs1})",(C_LBU GPRC:$rd, GPRC:$rs1, 0), 0>;
3305f757f3fSDimitry Andricdef : InstAlias<"c.lhu $rd, (${rs1})",(C_LHU GPRC:$rd, GPRC:$rs1, 0), 0>;
3315f757f3fSDimitry Andricdef : InstAlias<"c.lh $rd, (${rs1})", (C_LH GPRC:$rd, GPRC:$rs1, 0), 0>;
3325f757f3fSDimitry Andricdef : InstAlias<"c.sb $rd, (${rs1})", (C_SB GPRC:$rd, GPRC:$rs1, 0), 0>;
3335f757f3fSDimitry Andricdef : InstAlias<"c.sh $rd, (${rs1})", (C_SH GPRC:$rd, GPRC:$rs1, 0), 0>;
33406c3fb27SDimitry Andric}
335