//===-- RISCVInstrInfoXCV.td - CORE-V instructions ---------*- tablegen -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file describes the vendor extensions defined by Core-V extensions. // //===----------------------------------------------------------------------===// let DecoderNamespace = "XCVbitmanip" in { class CVInstBitManipRII funct2, bits<3> funct3, dag outs, dag ins, string opcodestr, string argstr> : RVInstI { bits<5> is3; bits<5> is2; let imm12 = {funct2, is3, is2}; } class CVBitManipRII funct2, bits<3> funct3, string opcodestr, Operand i3type = uimm5> : CVInstBitManipRII; class CVBitManipRR funct7, string opcodestr> : RVInstR; class CVBitManipR funct7, string opcodestr> : RVInstR { let rs2 = 0b00000; } } let Predicates = [HasVendorXCVbitmanip, IsRV32], hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { def CV_EXTRACT : CVBitManipRII<0b00, 0b000, "cv.extract">; def CV_EXTRACTU : CVBitManipRII<0b01, 0b000, "cv.extractu">; def CV_BCLR : CVBitManipRII<0b00, 0b001, "cv.bclr">; def CV_BSET : CVBitManipRII<0b01, 0b001, "cv.bset">; def CV_BITREV : CVBitManipRII<0b11, 0b001, "cv.bitrev", uimm2>; def CV_EXTRACTR : CVBitManipRR<0b0011000, "cv.extractr">; def CV_EXTRACTUR : CVBitManipRR<0b0011001, "cv.extractur">; let Constraints = "$rd = $rd_wb" in { def CV_INSERT : CVInstBitManipRII<0b10, 0b000, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, uimm5:$is3, uimm5:$is2), "cv.insert", "$rd, $rs1, $is3, $is2">; def CV_INSERTR : RVInstR<0b0011010, 0b011, OPC_CUSTOM_1, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2), "cv.insertr", "$rd, $rs1, $rs2">; } def CV_BCLRR : CVBitManipRR<0b0011100, "cv.bclrr">; def CV_BSETR : CVBitManipRR<0b0011101, "cv.bsetr">; def CV_ROR : CVBitManipRR<0b0100000, "cv.ror">; def CV_FF1 : CVBitManipR<0b0100001, "cv.ff1">; def CV_FL1 : CVBitManipR<0b0100010, "cv.fl1">; def CV_CLB : CVBitManipR<0b0100011, "cv.clb">; def CV_CNT : CVBitManipR<0b0100100, "cv.cnt">; } class CVInstMac funct7, bits<3> funct3, dag outs, dag ins, string opcodestr, string argstr, list pattern> : RVInst { bits<5> rs2; bits<5> rs1; bits<5> rd; let Inst{31-25} = funct7; let Inst{24-20} = rs2; let Inst{19-15} = rs1; let Inst{14-12} = funct3; let Inst{11-7} = rd; let Inst{6-0} = OPC_CUSTOM_1.Value; let DecoderNamespace = "XCVmac"; } class CVInstMac16I funct2, bits<3> funct3, dag outs, dag ins, string opcodestr, string argstr, list pattern> : RVInst { bits<5> imm5; bits<5> rs2; bits<5> rs1; bits<5> rd; let Inst{31-30} = funct2; let Inst{29-25} = imm5; let Inst{24-20} = rs2; let Inst{19-15} = rs1; let Inst{14-12} = funct3; let Inst{11-7} = rd; let Inst{6-0} = OPC_CUSTOM_2.Value; let DecoderNamespace = "XCVmac"; } let Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0, mayStore = 0, Constraints = "$rd = $rd_wb" in { // 32x32 bit macs def CV_MAC : CVInstMac<0b1001000, 0b011, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2), "cv.mac", "$rd, $rs1, $rs2", []>, Sched<[]>; def CV_MSU : CVInstMac<0b1001001, 0b011, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2), "cv.msu", "$rd, $rs1, $rs2", []>, Sched<[]>; // Signed 16x16 bit macs with imm def CV_MACSN : CVInstMac16I<0b00, 0b110, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.macsn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACHHSN : CVInstMac16I<0b01, 0b110, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.machhsn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACSRN : CVInstMac16I<0b10, 0b110, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.macsrn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACHHSRN : CVInstMac16I<0b11, 0b110, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.machhsrn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; // Unsigned 16x16 bit macs with imm def CV_MACUN : CVInstMac16I<0b00, 0b111, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.macun", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACHHUN : CVInstMac16I<0b01, 0b111, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.machhun", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACURN : CVInstMac16I<0b10, 0b111, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.macurn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MACHHURN : CVInstMac16I<0b11, 0b111, (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.machhurn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; } // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0... let Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // Signed 16x16 bit muls with imm def CV_MULSN : CVInstMac16I<0b00, 0b100, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulsn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULHHSN : CVInstMac16I<0b01, 0b100, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulhhsn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULSRN : CVInstMac16I<0b10, 0b100, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulsrn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULHHSRN : CVInstMac16I<0b11, 0b100, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulhhsrn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; // Unsigned 16x16 bit muls with imm def CV_MULUN : CVInstMac16I<0b00, 0b101, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulun", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULHHUN : CVInstMac16I<0b01, 0b101, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulhhun", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULURN : CVInstMac16I<0b10, 0b101, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulurn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; def CV_MULHHURN : CVInstMac16I<0b11, 0b101, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), "cv.mulhhurn", "$rd, $rs1, $rs2, $imm5", []>, Sched<[]>; } // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0... let Predicates = [HasVendorXCVmac, IsRV32] in { // Xcvmac Pseudo Instructions // Signed 16x16 bit muls def : InstAlias<"cv.muls $rd1, $rs1, $rs2", (CV_MULSN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>; def : InstAlias<"cv.mulhhs $rd1, $rs1, $rs2", (CV_MULHHSN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>; // Unsigned 16x16 bit muls def : InstAlias<"cv.mulu $rd1, $rs1, $rs2", (CV_MULUN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>; def : InstAlias<"cv.mulhhu $rd1, $rs1, $rs2", (CV_MULHHUN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>; } // Predicates = [HasVendorXCVmac, IsRV32]