AMDGPUISelLowering.cpp revision cee23ab246f22210b3063cdc47bdb45b3d943526
1f903da7335433ae243cf7ff59662be1a03ee9a14Tom Stellard//===-- AMDGPUISelLowering.cpp - AMDGPU Common DAG lowering functions -----===// 2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// The LLVM Compiler Infrastructure 4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source 6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details. 7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 10f903da7335433ae243cf7ff59662be1a03ee9a14Tom Stellard// This is the parent TargetLowering class for hardware code gen targets. 11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDGPUISelLowering.h" 15431bb79a41bd5e7402954385daea1594c3e750abTom Stellard#include "AMDILIntrinsicInfo.h" 16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDGPUUtil.h" 17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/CodeGen/MachineRegisterInfo.h" 18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace llvm; 20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 21a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardAMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) : 22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard AMDILTargetLowering(TM) 23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 24431bb79a41bd5e7402954385daea1594c3e750abTom Stellard // We need to custom lower some of the intrinsics 25431bb79a41bd5e7402954385daea1594c3e750abTom Stellard setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom); 26cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 27cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard setOperationAction(ISD::SELECT_CC, MVT::f32, Custom); 28cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); 29431bb79a41bd5e7402954385daea1594c3e750abTom Stellard} 30431bb79a41bd5e7402954385daea1594c3e750abTom Stellard 31431bb79a41bd5e7402954385daea1594c3e750abTom StellardSDValue AMDGPUTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) 32431bb79a41bd5e7402954385daea1594c3e750abTom Stellard const 33431bb79a41bd5e7402954385daea1594c3e750abTom Stellard{ 34431bb79a41bd5e7402954385daea1594c3e750abTom Stellard switch (Op.getOpcode()) { 35431bb79a41bd5e7402954385daea1594c3e750abTom Stellard default: return AMDILTargetLowering::LowerOperation(Op, DAG); 36431bb79a41bd5e7402954385daea1594c3e750abTom Stellard case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG); 37cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG); 38431bb79a41bd5e7402954385daea1594c3e750abTom Stellard } 39431bb79a41bd5e7402954385daea1594c3e750abTom Stellard} 40431bb79a41bd5e7402954385daea1594c3e750abTom Stellard 41431bb79a41bd5e7402954385daea1594c3e750abTom StellardSDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, 42431bb79a41bd5e7402954385daea1594c3e750abTom Stellard SelectionDAG &DAG) const 43431bb79a41bd5e7402954385daea1594c3e750abTom Stellard{ 44431bb79a41bd5e7402954385daea1594c3e750abTom Stellard unsigned IntrinsicID = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue(); 45431bb79a41bd5e7402954385daea1594c3e750abTom Stellard DebugLoc DL = Op.getDebugLoc(); 46431bb79a41bd5e7402954385daea1594c3e750abTom Stellard EVT VT = Op.getValueType(); 47431bb79a41bd5e7402954385daea1594c3e750abTom Stellard 48431bb79a41bd5e7402954385daea1594c3e750abTom Stellard switch (IntrinsicID) { 49431bb79a41bd5e7402954385daea1594c3e750abTom Stellard default: return Op; 509a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard case AMDGPUIntrinsic::AMDIL_abs: 519a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard return LowerIntrinsicIABS(Op, DAG); 52c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard case AMDGPUIntrinsic::AMDGPU_lrp: 53c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard return LowerIntrinsicLRP(Op, DAG); 54ef8e66bc165ea2ef9987ab6406268ce195f74eb0Tom Stellard case AMDGPUIntrinsic::AMDIL_mad: 55ef8e66bc165ea2ef9987ab6406268ce195f74eb0Tom Stellard return DAG.getNode(AMDILISD::MAD, DL, VT, Op.getOperand(1), 56ef8e66bc165ea2ef9987ab6406268ce195f74eb0Tom Stellard Op.getOperand(2), Op.getOperand(3)); 57431bb79a41bd5e7402954385daea1594c3e750abTom Stellard case AMDGPUIntrinsic::AMDIL_max: 58431bb79a41bd5e7402954385daea1594c3e750abTom Stellard return DAG.getNode(AMDGPUISD::FMAX, DL, VT, Op.getOperand(1), 59431bb79a41bd5e7402954385daea1594c3e750abTom Stellard Op.getOperand(2)); 60431bb79a41bd5e7402954385daea1594c3e750abTom Stellard case AMDGPUIntrinsic::AMDGPU_imax: 61431bb79a41bd5e7402954385daea1594c3e750abTom Stellard return DAG.getNode(AMDGPUISD::SMAX, DL, VT, Op.getOperand(1), 62431bb79a41bd5e7402954385daea1594c3e750abTom Stellard Op.getOperand(2)); 63431bb79a41bd5e7402954385daea1594c3e750abTom Stellard case AMDGPUIntrinsic::AMDGPU_umax: 64431bb79a41bd5e7402954385daea1594c3e750abTom Stellard return DAG.getNode(AMDGPUISD::UMAX, DL, VT, Op.getOperand(1), 65431bb79a41bd5e7402954385daea1594c3e750abTom Stellard Op.getOperand(2)); 667e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard case AMDGPUIntrinsic::AMDIL_min: 677e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard return DAG.getNode(AMDGPUISD::FMIN, DL, VT, Op.getOperand(1), 687e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard Op.getOperand(2)); 697e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard case AMDGPUIntrinsic::AMDGPU_imin: 707e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard return DAG.getNode(AMDGPUISD::SMIN, DL, VT, Op.getOperand(1), 717e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard Op.getOperand(2)); 727e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard case AMDGPUIntrinsic::AMDGPU_umin: 737e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard return DAG.getNode(AMDGPUISD::UMIN, DL, VT, Op.getOperand(1), 747e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard Op.getOperand(2)); 75431bb79a41bd5e7402954385daea1594c3e750abTom Stellard } 76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 789a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard///IABS(a) = SMAX(sub(0, a), a) 799a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom StellardSDValue AMDGPUTargetLowering::LowerIntrinsicIABS(SDValue Op, 809a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard SelectionDAG &DAG) const 819a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard{ 829a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard 839a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard DebugLoc DL = Op.getDebugLoc(); 849a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard EVT VT = Op.getValueType(); 859a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, VT), 869a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard Op.getOperand(1)); 879a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard 889a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard return DAG.getNode(AMDGPUISD::SMAX, DL, VT, Neg, Op.getOperand(1)); 899a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard} 909a020092aedc6310d5bfc72b2aa6fc4348fe5c32Tom Stellard 91c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard/// Linear Interpolation 92c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard/// LRP(a, b, c) = muladd(a, b, (1 - a) * c) 93c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom StellardSDValue AMDGPUTargetLowering::LowerIntrinsicLRP(SDValue Op, 94c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard SelectionDAG &DAG) const 95c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard{ 96c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard DebugLoc DL = Op.getDebugLoc(); 97c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard EVT VT = Op.getValueType(); 98c20e7417992380871261699c2b0123819e7d51fcTom Stellard SDValue OneSubA = DAG.getNode(ISD::FSUB, DL, VT, 99c20e7417992380871261699c2b0123819e7d51fcTom Stellard DAG.getConstantFP(1.0f, MVT::f32), 100c20e7417992380871261699c2b0123819e7d51fcTom Stellard Op.getOperand(1)); 101c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard SDValue OneSubAC = DAG.getNode(ISD::FMUL, DL, VT, OneSubA, 102c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard Op.getOperand(3)); 103c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard return DAG.getNode(AMDILISD::MAD, DL, VT, Op.getOperand(1), 104c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard Op.getOperand(2), 105c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard OneSubAC); 106c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard} 107c6c8a05c509b30600d2ccb4be635f05cd71c68a4Tom Stellard 108cee23ab246f22210b3063cdc47bdb45b3d943526Tom StellardSDValue AMDGPUTargetLowering::LowerSELECT_CC(SDValue Op, 109cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SelectionDAG &DAG) const 110cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard{ 111cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard DebugLoc DL = Op.getDebugLoc(); 112cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard EVT VT = Op.getValueType(); 113cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 114cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue LHS = Op.getOperand(0); 115cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue RHS = Op.getOperand(1); 116cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue True = Op.getOperand(2); 117cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue False = Op.getOperand(3); 118cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue CC = Op.getOperand(4); 119cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard ISD::CondCode CCOpcode = cast<CondCodeSDNode>(CC)->get(); 120cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue Temp; 121cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 122cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard //cmovlog = src0 != 0.0f ? src1 : src2 123cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard //cmovlog = src0 == 0.0f ? src2 : src1 124cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard //cnde = src0 == 0.0f ? src1 : src2 125cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 126cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // LHS and RHS are guaranteed to be the same value type 127cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard EVT CompareVT = LHS.getValueType(); 128cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 129cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // We need all the operands of SELECT_CC to have the same value type, so if 130cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // necessary we need to convert LHS and RHS to be the same type True and 131cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // False. True and False are guaranteed to have the same type as this 132cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // SELECT_CC node. 133cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 134cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (CompareVT != VT) { 135cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard ISD::NodeType ConversionOp = ISD::DELETED_NODE; 136cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (VT == MVT::f32 && CompareVT == MVT::i32) { 137cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (isUnsignedIntSetCC(CCOpcode)) { 138cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard ConversionOp = ISD::UINT_TO_FP; 139cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } else { 140cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard ConversionOp = ISD::SINT_TO_FP; 141cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 142cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } else if (VT == MVT::i32 && CompareVT == MVT::f32) { 143cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard ConversionOp = ISD::FP_TO_SINT; 144cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } else { 145cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // I don't think there will be any other type pairings. 146cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard assert(!"Unhandled operand type parings in SELECT_CC"); 147cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 148cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // XXX Check the value of LHS and RHS and avoid creating sequences like 149cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // (FTOI (ITOF)) 150cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard LHS = DAG.getNode(ConversionOp, DL, VT, LHS); 151cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard RHS = DAG.getNode(ConversionOp, DL, VT, RHS); 152cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 153cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 154cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // If true is 1 and false is 0 or vice-versa we can handle this with a native 155cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // instruction (SET* instructions). 156cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if ((isOne(True) && isZero(False))) { 157cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return DAG.getNode(ISD::SELECT_CC, DL, VT, LHS, RHS, True, False, CC); 158cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 159cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 160cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // XXX If true is 0 and 1 is false, we can handle this with a native 161cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // instruction, but we need to swap true and false and change the 162cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // conditional. 163cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (isOne(False) && isZero(True)) { 164cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 165cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 166cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // XXX Check if we can lower this to a SELECT or if it is supported by a native 167cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // operation. (The code below does this but we don't have the Instruction 168cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // selection patterns to do this yet. 169cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard#if 0 170cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (isZero(LHS) || isZero(RHS)) { 171cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue Cond = (isZero(LHS) ? RHS : LHS); 172cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard bool SwapTF = false; 173cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard switch (CCOpcode) { 174cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETOEQ: 175cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETUEQ: 176cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETEQ: 177cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SwapTF = true; 178cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // Fall through 179cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETONE: 180cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETUNE: 181cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard case ISD::SETNE: 182cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // We can lower to select 183cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (SwapTF) { 184cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard Temp = True; 185cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard True = False; 186cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard False = Temp; 187cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 188cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // CNDE 189cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return DAG.getNode(ISD::SELECT, DL, VT, Cond, True, False); 190cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard default: 191cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // Supported by a native operation (CNDGE, CNDGT) 192cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return DAG.getNode(ISD::SELECT_CC, DL, VT, LHS, RHS, True, False, CC); 193cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 194cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 195cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard#endif 196cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 197cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // If we make it this for it means we have no native instructions to handle 198cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // this SELECT_CC, so we must lower it. 199cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue One, Zero; 200cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 201cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (VT == MVT::f32) { 202cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard One = DAG.getConstantFP(1.0f, VT); 203cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard Zero = DAG.getConstantFP(0.0f, VT); 204cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } else if (VT == MVT::i32) { 205cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard One = DAG.getConstant(1, VT); 206cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard Zero = DAG.getConstant(0, VT); 207cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 208cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard else { 209cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard assert(!"Unhandled value type in LowerSELECT_CC"); 210cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 211cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 212cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // Lower this unsupported SELECT_CC into a combination of two supported 213cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard // SELECT_CC operations. 214cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard SDValue Cond = DAG.getNode(ISD::SELECT_CC, DL, VT, LHS, RHS, One, Zero, CC); 215cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 216cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return DAG.getNode(ISD::SELECT, DL, VT, Cond, True, False); 217cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard} 218cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 219cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard//===----------------------------------------------------------------------===// 220cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard// Helper functions 221cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard//===----------------------------------------------------------------------===// 222cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 223cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellardbool AMDGPUTargetLowering::isOne(SDValue Op) const 224cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard{ 225cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (ConstantFPSDNode * CFP = dyn_cast<ConstantFPSDNode>(Op)) { 226cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return CFP->isExactlyValue(1.0); 227cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 228cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) { 229cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return C->isOne(); 230cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 231cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return false; 232cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard} 233cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 234cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellardbool AMDGPUTargetLowering::isZero(SDValue Op) const 235cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard{ 236cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (ConstantFPSDNode * CFP = dyn_cast<ConstantFPSDNode>(Op)) { 237cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return CFP->getValueAPF().isZero(); 238cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 239cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) { 240cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return C->isNullValue(); 241cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard } 242cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard return false; 243cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard} 244cee23ab246f22210b3063cdc47bdb45b3d943526Tom Stellard 245a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid AMDGPUTargetLowering::addLiveIn(MachineInstr * MI, 246a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard MachineFunction * MF, MachineRegisterInfo & MRI, 247bcfc97dbf40c256ed59c2424e0c55b845f0f2569Tom Stellard const TargetInstrInfo * TII, unsigned reg) const 248a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 249bcfc97dbf40c256ed59c2424e0c55b845f0f2569Tom Stellard AMDGPU::utilAddLiveIn(MF, MRI, TII, reg, MI->getOperand(0).getReg()); 250a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 251a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 252431bb79a41bd5e7402954385daea1594c3e750abTom Stellard#define NODE_NAME_CASE(node) case AMDGPUISD::node: return #node; 253431bb79a41bd5e7402954385daea1594c3e750abTom Stellard 254431bb79a41bd5e7402954385daea1594c3e750abTom Stellardconst char* AMDGPUTargetLowering::getTargetNodeName(unsigned Opcode) const 255431bb79a41bd5e7402954385daea1594c3e750abTom Stellard{ 256431bb79a41bd5e7402954385daea1594c3e750abTom Stellard switch (Opcode) { 257431bb79a41bd5e7402954385daea1594c3e750abTom Stellard default: return AMDILTargetLowering::getTargetNodeName(Opcode); 258431bb79a41bd5e7402954385daea1594c3e750abTom Stellard 259431bb79a41bd5e7402954385daea1594c3e750abTom Stellard NODE_NAME_CASE(FMAX) 260431bb79a41bd5e7402954385daea1594c3e750abTom Stellard NODE_NAME_CASE(SMAX) 261431bb79a41bd5e7402954385daea1594c3e750abTom Stellard NODE_NAME_CASE(UMAX) 2627e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard NODE_NAME_CASE(FMIN) 2637e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard NODE_NAME_CASE(SMIN) 2647e3cd8df183448e2cc01a8f2645a001b0972f4abTom Stellard NODE_NAME_CASE(UMIN) 265431bb79a41bd5e7402954385daea1594c3e750abTom Stellard } 266431bb79a41bd5e7402954385daea1594c3e750abTom Stellard} 267