forked from OSchip/llvm-project
65 lines
2.2 KiB
TableGen
65 lines
2.2 KiB
TableGen
//===-- RISCVInstrInfo.td - Target Description for RISCV ---*- tablegen -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file describes the RISC-V instructions in TableGen format.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
include "RISCVInstrFormats.td"
|
|
|
|
class SImmAsmOperand<int width>
|
|
: AsmOperandClass {
|
|
let Name = "SImm" # width;
|
|
let RenderMethod = "addImmOperands";
|
|
let DiagnosticType = !strconcat("Invalid", Name);
|
|
}
|
|
|
|
def simm12 : Operand<i32> {
|
|
let ParserMatchClass = SImmAsmOperand<12>;
|
|
}
|
|
|
|
// As noted in RISCVRegisterInfo.td, the hope is that support for
|
|
// variable-sized register classes will mean that instruction definitions do
|
|
// not need to be duplicated for 32-bit and 64-bit register classes. For now
|
|
// we use 'GPR', which is 32-bit. When codegen for both RV32 and RV64 is
|
|
// added, we will need to duplicate instruction definitions unless a proposal
|
|
// like <http://lists.llvm.org/pipermail/llvm-dev/2016-September/105027.html>
|
|
// is adopted.
|
|
|
|
class ALU_ri<bits<3> funct3, string OpcodeStr> :
|
|
FI<funct3, 0b0010011, (outs GPR:$rd), (ins GPR:$rs1, simm12:$imm12),
|
|
OpcodeStr#"\t$rd, $rs1, $imm12", []>
|
|
{
|
|
}
|
|
|
|
def ADDI : ALU_ri<0b000, "addi">;
|
|
def SLTI : ALU_ri<0b010, "slti">;
|
|
def SLTIU : ALU_ri<0b011, "sltiu">;
|
|
def XORI : ALU_ri<0b100, "xori">;
|
|
def ORI : ALU_ri<0b110, "ori">;
|
|
def ANDI : ALU_ri<0b111, "andi">;
|
|
|
|
class ALU_rr<bits<7> funct7, bits<3> funct3, string OpcodeStr> :
|
|
FR<funct7, funct3, 0b0110011, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2),
|
|
OpcodeStr#"\t$rd, $rs1, $rs2", []>
|
|
{
|
|
}
|
|
|
|
def ADD : ALU_rr<0b0000000, 0b000, "add">;
|
|
def SUB : ALU_rr<0b0100000, 0b000, "sub">;
|
|
def SLL : ALU_rr<0b0000000, 0b001, "sll">;
|
|
def SLT : ALU_rr<0b0000000, 0b010, "slt">;
|
|
def SLTU : ALU_rr<0b0000000, 0b011, "sltu">;
|
|
def XOR : ALU_rr<0b0000000, 0b100, "xor">;
|
|
def SRL : ALU_rr<0b0000000, 0b101, "srl">;
|
|
def SRA : ALU_rr<0b0100000, 0b101, "sra">;
|
|
def OR : ALU_rr<0b0000000, 0b110, "or">;
|
|
def AND : ALU_rr<0b0000000, 0b111, "and">;
|
|
|