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