mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
2f935bc924
Summary: This commit enables some of the arithmetic instructions for Nios2 ISA (for both R1 and R2 revisions), implements facilities required to emit those instructions and provides LIT tests for added instructions. Reviewed By: hfinkel Differential Revision: https://reviews.llvm.org/D41236 Author: belickim <mateusz.belicki@intel.com> llvm-svn: 322069
110 lines
4.1 KiB
TableGen
110 lines
4.1 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()); }]>;
|
|
|
|
// Custom return SDNode
|
|
def Nios2Ret : SDNode<"Nios2ISD::Ret", SDTNone,
|
|
[SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// 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>;
|
|
|
|
// Arithmetic and logical instructions with 3 register operands.
|
|
// Defines R1 and R2 instruction at the same time.
|
|
multiclass ArithLogicReg<bits<6> opx, string mnemonic,
|
|
SDNode opNode>:
|
|
CommonInstr_R_F3X6<opx, (outs CPURegs:$rC),
|
|
(ins CPURegs:$rA, CPURegs:$rB),
|
|
!strconcat(mnemonic, "\t$rC, $rA, $rB"),
|
|
[(set CPURegs:$rC, (opNode CPURegs:$rA, CPURegs:$rB))],
|
|
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>;
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Nios2 Instructions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// Arithmetic instructions operating on registers.
|
|
let isCommutable = 1 ,
|
|
isReMaterializable = 1 in {
|
|
defm ADD : ArithLogicReg<0x31, "add", add>;
|
|
defm AND : ArithLogicReg<0x0e, "and", and>;
|
|
defm OR : ArithLogicReg<0x16, "or", or>;
|
|
defm XOR : ArithLogicReg<0x1e, "xor", xor>;
|
|
defm MUL : ArithLogicReg<0x27, "mul", mul>;
|
|
}
|
|
|
|
let isReMaterializable = 1 in {
|
|
defm SUB : ArithLogicReg<0x39, "sub", sub>;
|
|
}
|
|
|
|
defm DIVU : ArithLogicReg<0x24, "divu", udiv>;
|
|
defm DIV : ArithLogicReg<0x25, "div", sdiv>;
|
|
|
|
defm SLL : ArithLogicReg<0x13, "sll", shl>;
|
|
defm SRL : ArithLogicReg<0x1b, "srl", srl>;
|
|
defm SRA : ArithLogicReg<0x3b, "sra", sra>;
|
|
|
|
/// 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)]>;
|