//===------------ AMDILInstrInfo.td - AMDIL Target ------*-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 AMDIL instructions in TableGen format. // //===----------------------------------------------------------------------===// //===--------------------------------------------------------------------===// // Custom Operands //===--------------------------------------------------------------------===// def brtarget : Operand; //===--------------------------------------------------------------------===// // Custom Selection DAG Type Profiles //===--------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Generic Profile Types //===----------------------------------------------------------------------===// def SDTIL_GenBinaryOp : SDTypeProfile<1, 2, [ SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2> ]>; def SDTIL_GenTernaryOp : SDTypeProfile<1, 3, [ SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisSameAs<2, 3> ]>; def SDTIL_GenVecBuild : SDTypeProfile<1, 1, [ SDTCisEltOfVec<1, 0> ]>; //===----------------------------------------------------------------------===// // Flow Control Profile Types //===----------------------------------------------------------------------===// // Branch instruction where second and third are basic blocks def SDTIL_BRCond : SDTypeProfile<0, 2, [ SDTCisVT<0, OtherVT> ]>; //===--------------------------------------------------------------------===// // Custom Selection DAG Nodes //===--------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Flow Control DAG Nodes //===----------------------------------------------------------------------===// def IL_brcond : SDNode<"AMDGPUISD::BRANCH_COND", SDTIL_BRCond, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // Call/Return DAG Nodes //===----------------------------------------------------------------------===// def IL_retflag : SDNode<"AMDGPUISD::RET_FLAG", SDTNone, [SDNPHasChain, SDNPOptInGlue]>; //===--------------------------------------------------------------------===// // Instructions //===--------------------------------------------------------------------===// // Floating point math functions def IL_div_inf : SDNode<"AMDGPUISD::DIV_INF", SDTIL_GenBinaryOp>; //===----------------------------------------------------------------------===// // Integer functions //===----------------------------------------------------------------------===// def IL_umul : SDNode<"AMDGPUISD::UMUL" , SDTIntBinOp, [SDNPCommutative, SDNPAssociative]>; //===--------------------------------------------------------------------===// // Custom Pattern DAG Nodes //===--------------------------------------------------------------------===// def global_store : PatFrag<(ops node:$val, node:$ptr), (store node:$val, node:$ptr), [{ return isGlobalStore(dyn_cast(N)); }]>; //===----------------------------------------------------------------------===// // Load pattern fragments //===----------------------------------------------------------------------===// // Global address space loads def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ return isGlobalLoad(dyn_cast(N)); }]>; // Constant address space loads def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ return isConstantLoad(dyn_cast(N), -1); }]>; //===----------------------------------------------------------------------===// // Complex addressing mode patterns //===----------------------------------------------------------------------===// def ADDR : ComplexPattern; def ADDRF : ComplexPattern; def ADDR64 : ComplexPattern; def ADDR64F : ComplexPattern; //===----------------------------------------------------------------------===// // Instruction format classes //===----------------------------------------------------------------------===// class ILFormat pattern> : Instruction { let Namespace = "AMDGPU"; dag OutOperandList = outs; dag InOperandList = ins; let Pattern = pattern; let AsmString = !strconcat(asmstr, "\n"); let isPseudo = 1; let Itinerary = NullALU; bit hasIEEEFlag = 0; bit hasZeroOpFlag = 0; let mayLoad = 0; let mayStore = 0; let hasSideEffects = 0; } //===--------------------------------------------------------------------===// // Multiclass Instruction formats //===--------------------------------------------------------------------===// // Multiclass that handles branch instructions multiclass BranchConditional { def _i32 : ILFormat<(outs), (ins brtarget:$target, rci:$src0), "; i32 Pseudo branch instruction", [(Op bb:$target, (i32 rci:$src0))]>; def _f32 : ILFormat<(outs), (ins brtarget:$target, rcf:$src0), "; f32 Pseudo branch instruction", [(Op bb:$target, (f32 rcf:$src0))]>; } // Only scalar types should generate flow control multiclass BranchInstr { def _i32 : ILFormat<(outs), (ins GPRI32:$src), !strconcat(name, " $src"), []>; def _f32 : ILFormat<(outs), (ins GPRF32:$src), !strconcat(name, " $src"), []>; } // Only scalar types should generate flow control multiclass BranchInstr2 { def _i32 : ILFormat<(outs), (ins GPRI32:$src0, GPRI32:$src1), !strconcat(name, " $src0, $src1"), []>; def _f32 : ILFormat<(outs), (ins GPRF32:$src0, GPRF32:$src1), !strconcat(name, " $src0, $src1"), []>; } //===--------------------------------------------------------------------===// // Intrinsics support //===--------------------------------------------------------------------===// include "AMDILIntrinsics.td"