forked from OSchip/llvm-project
79 lines
3.0 KiB
TableGen
79 lines
3.0 KiB
TableGen
//===- Nios2InstrInfo.td - Target Description for Nios2 ------*- tablegen -*-=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the Nios2 implementation of the TargetInstrInfo class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Instruction format superclass
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
include "Nios2InstrFormats.td"
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Nios2 Operand, Complex Patterns and Transformations Definitions.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def simm16 : Operand<i32> {
|
|
let DecoderMethod= "DecodeSimm16";
|
|
}
|
|
|
|
// Node immediate fits as 16-bit sign extended on target immediate.
|
|
// e.g. addi, andi
|
|
def immSExt16 : PatLeaf<(imm), [{ return isInt<16>(N->getSExtValue()); }]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Instructions specific format
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Arithmetic and logical instructions with 2 registers and 16-bit immediate
|
|
// value.
|
|
multiclass ArithLogicRegImm16<bits<6> op, string mnemonic, SDNode opNode,
|
|
Operand immOp, PatLeaf immType>:
|
|
CommonInstr_I_F2I16<op, (outs CPURegs:$rB),
|
|
(ins CPURegs:$rA, immOp:$imm),
|
|
!strconcat(mnemonic, "\t$rB, $rA, $imm"),
|
|
[(set CPURegs:$rB,
|
|
(opNode CPURegs:$rA, immType:$imm))],
|
|
IIAlu>;
|
|
|
|
multiclass Return<bits<6> opx, dag outs, dag ins, string mnemonic> {
|
|
let rB = 0, rC = 0,
|
|
isReturn = 1,
|
|
isCodeGenOnly = 1,
|
|
hasCtrlDep = 1,
|
|
hasExtraSrcRegAllocReq = 1 in {
|
|
defm NAME# : CommonInstr_R_F3X6<opx, outs, ins, mnemonic, [], IIBranch>;
|
|
}
|
|
}
|
|
|
|
// Custom return SDNode
|
|
def Nios2Ret : SDNode<"Nios2ISD::Ret", SDTNone,
|
|
[SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Nios2 Instructions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// Arithmetic Instructions (ALU Immediate)
|
|
defm ADDI : ArithLogicRegImm16<0x04, "addi", add, simm16, immSExt16>;
|
|
|
|
// Returns:
|
|
defm RET : Return<0x05, (outs), (ins CPURegs:$rA), "ret">;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Pseudo instructions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Return RA.
|
|
let isReturn=1, isTerminator=1, hasDelaySlot=1, isBarrier=1, hasCtrlDep=1 in
|
|
def RetRA : Nios2Pseudo<(outs), (ins), "", [(Nios2Ret)]>;
|