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