view lib/Target/Nios2/Nios2InstrInfo.td @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children
line wrap: on
line source

//===- 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)]>;