| //===------------ 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<OtherVT>; | 
 |  | 
 | //===--------------------------------------------------------------------===// | 
 | // 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<StoreSDNode>(N)); | 
 | }]>; | 
 |  | 
 | //===----------------------------------------------------------------------===// | 
 | // Load pattern fragments | 
 | //===----------------------------------------------------------------------===// | 
 | // Global address space loads | 
 | def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
 |     return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
 | }]>; | 
 | // Constant address space loads | 
 | def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
 |     return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
 | }]>; | 
 |  | 
 | //===----------------------------------------------------------------------===// | 
 | // Complex addressing mode patterns | 
 | //===----------------------------------------------------------------------===// | 
 | def ADDR : ComplexPattern<i32, 2, "SelectADDR", [], []>; | 
 | def ADDRF : ComplexPattern<i32, 2, "SelectADDR", [frameindex], []>; | 
 | def ADDR64 : ComplexPattern<i64, 2, "SelectADDR64", [], []>; | 
 | def ADDR64F : ComplexPattern<i64, 2, "SelectADDR64", [frameindex], []>; | 
 |  | 
 | //===----------------------------------------------------------------------===// | 
 | // Instruction format classes | 
 | //===----------------------------------------------------------------------===// | 
 | class ILFormat<dag outs, dag ins, string asmstr, list<dag> 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<SDNode Op, RegisterClass rci, RegisterClass rcf> { | 
 |     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<string name> { | 
 |   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<string name> { | 
 |   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" |