//===- 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 { 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 op, string mnemonic, SDNode opNode, Operand immOp, PatLeaf immType>: CommonInstr_I_F2I16; // Arithmetic and logical instructions with 3 register operands. // Defines R1 and R2 instruction at the same time. multiclass ArithLogicReg opx, string mnemonic, SDNode opNode>: CommonInstr_R_F3X6; multiclass Return 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; } } //===----------------------------------------------------------------------===// // 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)]>;