1//===------------ AMDILInstrInfo.td - AMDIL Target ------*-tablegen-*------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//==-----------------------------------------------------------------------===// 9// 10// This file describes the AMDIL instructions in TableGen format. 11// 12//===----------------------------------------------------------------------===// 13//===--------------------------------------------------------------------===// 14// Custom Operands 15//===--------------------------------------------------------------------===// 16def brtarget : Operand<OtherVT>; 17 18//===--------------------------------------------------------------------===// 19// Custom Selection DAG Type Profiles 20//===--------------------------------------------------------------------===// 21//===----------------------------------------------------------------------===// 22// Generic Profile Types 23//===----------------------------------------------------------------------===// 24 25def SDTIL_GenBinaryOp : SDTypeProfile<1, 2, [ 26 SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2> 27 ]>; 28def SDTIL_GenTernaryOp : SDTypeProfile<1, 3, [ 29 SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisSameAs<2, 3> 30 ]>; 31def SDTIL_GenVecBuild : SDTypeProfile<1, 1, [ 32 SDTCisEltOfVec<1, 0> 33 ]>; 34 35//===----------------------------------------------------------------------===// 36// Flow Control Profile Types 37//===----------------------------------------------------------------------===// 38// Branch instruction where second and third are basic blocks 39def SDTIL_BRCond : SDTypeProfile<0, 2, [ 40 SDTCisVT<0, OtherVT> 41 ]>; 42 43//===--------------------------------------------------------------------===// 44// Custom Selection DAG Nodes 45//===--------------------------------------------------------------------===// 46//===----------------------------------------------------------------------===// 47// Flow Control DAG Nodes 48//===----------------------------------------------------------------------===// 49def IL_brcond : SDNode<"AMDGPUISD::BRANCH_COND", SDTIL_BRCond, [SDNPHasChain]>; 50 51//===----------------------------------------------------------------------===// 52// Call/Return DAG Nodes 53//===----------------------------------------------------------------------===// 54def IL_retflag : SDNode<"AMDGPUISD::RET_FLAG", SDTNone, 55 [SDNPHasChain, SDNPOptInGlue]>; 56 57//===--------------------------------------------------------------------===// 58// Instructions 59//===--------------------------------------------------------------------===// 60// Floating point math functions 61def IL_div_inf : SDNode<"AMDGPUISD::DIV_INF", SDTIL_GenBinaryOp>; 62 63//===----------------------------------------------------------------------===// 64// Integer functions 65//===----------------------------------------------------------------------===// 66def IL_umul : SDNode<"AMDGPUISD::UMUL" , SDTIntBinOp, 67 [SDNPCommutative, SDNPAssociative]>; 68 69//===--------------------------------------------------------------------===// 70// Custom Pattern DAG Nodes 71//===--------------------------------------------------------------------===// 72def global_store : PatFrag<(ops node:$val, node:$ptr), 73 (store node:$val, node:$ptr), [{ 74 return isGlobalStore(dyn_cast<StoreSDNode>(N)); 75}]>; 76 77//===----------------------------------------------------------------------===// 78// Load pattern fragments 79//===----------------------------------------------------------------------===// 80// Global address space loads 81def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 82 return isGlobalLoad(dyn_cast<LoadSDNode>(N)); 83}]>; 84// Constant address space loads 85def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 86 return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); 87}]>; 88 89//===----------------------------------------------------------------------===// 90// Complex addressing mode patterns 91//===----------------------------------------------------------------------===// 92def ADDR : ComplexPattern<i32, 2, "SelectADDR", [], []>; 93def ADDRF : ComplexPattern<i32, 2, "SelectADDR", [frameindex], []>; 94def ADDR64 : ComplexPattern<i64, 2, "SelectADDR64", [], []>; 95def ADDR64F : ComplexPattern<i64, 2, "SelectADDR64", [frameindex], []>; 96 97//===----------------------------------------------------------------------===// 98// Instruction format classes 99//===----------------------------------------------------------------------===// 100class ILFormat<dag outs, dag ins, string asmstr, list<dag> pattern> 101: Instruction { 102 103 let Namespace = "AMDGPU"; 104 dag OutOperandList = outs; 105 dag InOperandList = ins; 106 let Pattern = pattern; 107 let AsmString = !strconcat(asmstr, "\n"); 108 let isPseudo = 1; 109 let Itinerary = NullALU; 110 bit hasIEEEFlag = 0; 111 bit hasZeroOpFlag = 0; 112 let mayLoad = 0; 113 let mayStore = 0; 114 let hasSideEffects = 0; 115} 116 117//===--------------------------------------------------------------------===// 118// Multiclass Instruction formats 119//===--------------------------------------------------------------------===// 120// Multiclass that handles branch instructions 121multiclass BranchConditional<SDNode Op> { 122 def _i32 : ILFormat<(outs), 123 (ins brtarget:$target, GPRI32:$src0), 124 "; i32 Pseudo branch instruction", 125 [(Op bb:$target, GPRI32:$src0)]>; 126 def _f32 : ILFormat<(outs), 127 (ins brtarget:$target, GPRF32:$src0), 128 "; f32 Pseudo branch instruction", 129 [(Op bb:$target, GPRF32:$src0)]>; 130} 131 132// Only scalar types should generate flow control 133multiclass BranchInstr<string name> { 134 def _i32 : ILFormat<(outs), (ins GPRI32:$src), 135 !strconcat(name, " $src"), []>; 136 def _f32 : ILFormat<(outs), (ins GPRF32:$src), 137 !strconcat(name, " $src"), []>; 138} 139// Only scalar types should generate flow control 140multiclass BranchInstr2<string name> { 141 def _i32 : ILFormat<(outs), (ins GPRI32:$src0, GPRI32:$src1), 142 !strconcat(name, " $src0, $src1"), []>; 143 def _f32 : ILFormat<(outs), (ins GPRF32:$src0, GPRF32:$src1), 144 !strconcat(name, " $src0, $src1"), []>; 145} 146 147//===--------------------------------------------------------------------===// 148// Intrinsics support 149//===--------------------------------------------------------------------===// 150include "AMDILIntrinsics.td" 151