AMDILISelDAGToDAG.cpp revision 431bb79a41bd5e7402954385daea1594c3e750ab
1a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===-- AMDILISelDAGToDAG.cpp - A dag to dag inst selector for AMDIL ------===//
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//
10a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file defines an instruction selector for the AMDIL target.
11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
13431bb79a41bd5e7402954385daea1594c3e750abTom Stellard#include "AMDGPUISelLowering.h" // For AMDGPUISD
14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDILDevices.h"
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDILTargetMachine.h"
16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDILUtilityFunctions.h"
175aaaa6a426258dc714c7346bec062795998f9986Tom Stellard#include "llvm/ADT/ValueMap.h"
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/CodeGen/PseudoSourceValue.h"
19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/CodeGen/SelectionDAGISel.h"
20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/Support/Compiler.h"
215aaaa6a426258dc714c7346bec062795998f9986Tom Stellard#include <list>
225aaaa6a426258dc714c7346bec062795998f9986Tom Stellard#include <queue>
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace llvm;
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// Instruction Selector Implementation
28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// AMDILDAGToDAGISel - AMDIL specific code to select AMDIL machine instructions
32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// //for SelectionDAG operations.
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardnamespace {
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass AMDILDAGToDAGISel : public SelectionDAGISel {
36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // Subtarget - Keep a pointer to the AMDIL Subtarget around so that we can
37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // make the right decision when generating code for different targets.
38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  const AMDILSubtarget &Subtarget;
39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardpublic:
40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  AMDILDAGToDAGISel(AMDILTargetMachine &TM AMDIL_OPT_LEVEL_DECL);
41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  virtual ~AMDILDAGToDAGISel();
42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  SDNode *Select(SDNode *N);
445aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  virtual const char *getPassName() const;
455aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
465aaaa6a426258dc714c7346bec062795998f9986Tom Stellardprivate:
475aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  inline SDValue getSmallIPtrImm(unsigned Imm);
485aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // Complex pattern selectors
50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  bool SelectADDRParam(SDValue Addr, SDValue& R1, SDValue& R2);
51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  bool SelectADDR(SDValue N, SDValue &R1, SDValue &R2);
52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  bool SelectADDR64(SDValue N, SDValue &R1, SDValue &R2);
535aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
545aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  static bool checkType(const Value *ptr, unsigned int addrspace);
555aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  static const Value *getBasePointerValue(const Value *V);
565aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isGlobalStore(const StoreSDNode *N);
58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isPrivateStore(const StoreSDNode *N);
59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isLocalStore(const StoreSDNode *N);
60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isRegionStore(const StoreSDNode *N);
61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isCPLoad(const LoadSDNode *N);
63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isConstantLoad(const LoadSDNode *N, int cbID);
64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isGlobalLoad(const LoadSDNode *N);
65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isPrivateLoad(const LoadSDNode *N);
66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isLocalLoad(const LoadSDNode *N);
67a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  static bool isRegionLoad(const LoadSDNode *N);
68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  SDNode *xformAtomicInst(SDNode *N);
70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // Include the pieces autogenerated from the target description.
72a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDILGenDAGISel.inc"
73a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard};
74a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}  // end anonymous namespace
75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// createAMDILISelDag - This pass converts a legalized DAG into a AMDIL-specific
77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// DAG, ready for instruction scheduling.
78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
79a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardFunctionPass *llvm::createAMDILISelDag(AMDILTargetMachine &TM
80a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                        AMDIL_OPT_LEVEL_DECL) {
81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return new AMDILDAGToDAGISel(TM AMDIL_OPT_LEVEL_VAR);
82a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
83a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
84a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardAMDILDAGToDAGISel::AMDILDAGToDAGISel(AMDILTargetMachine &TM
85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                      AMDIL_OPT_LEVEL_DECL)
86a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  : SelectionDAGISel(TM AMDIL_OPT_LEVEL_VAR), Subtarget(TM.getSubtarget<AMDILSubtarget>())
87a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
90a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardAMDILDAGToDAGISel::~AMDILDAGToDAGISel() {
91a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
92a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
93a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSDValue AMDILDAGToDAGISel::getSmallIPtrImm(unsigned int Imm) {
94a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return CurDAG->getTargetConstant(Imm, MVT::i32);
95a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
96a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
97a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::SelectADDRParam(
98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    SDValue Addr, SDValue& R1, SDValue& R2) {
99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (Addr.getOpcode() == ISD::FrameIndex) {
101a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R1 = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R2 = CurDAG->getTargetConstant(0, MVT::i32);
104a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    } else {
105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R1 = Addr;
106a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R2 = CurDAG->getTargetConstant(0, MVT::i32);
107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else if (Addr.getOpcode() == ISD::ADD) {
109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R1 = Addr.getOperand(0);
110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R2 = Addr.getOperand(1);
111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R1 = Addr;
113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R2 = CurDAG->getTargetConstant(0, MVT::i32);
114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
115a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return true;
116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::SelectADDR(SDValue Addr, SDValue& R1, SDValue& R2) {
119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      Addr.getOpcode() == ISD::TargetGlobalAddress) {
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return false;
122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return SelectADDRParam(Addr, R1, R2);
124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::SelectADDR64(SDValue Addr, SDValue& R1, SDValue& R2) {
128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      Addr.getOpcode() == ISD::TargetGlobalAddress) {
130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return false;
131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (Addr.getOpcode() == ISD::FrameIndex) {
134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R1 = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i64);
136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R2 = CurDAG->getTargetConstant(0, MVT::i64);
137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    } else {
138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R1 = Addr;
139a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      R2 = CurDAG->getTargetConstant(0, MVT::i64);
140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else if (Addr.getOpcode() == ISD::ADD) {
142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R1 = Addr.getOperand(0);
143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R2 = Addr.getOperand(1);
144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R1 = Addr;
146a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R2 = CurDAG->getTargetConstant(0, MVT::i64);
147a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
148a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return true;
149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
150a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
151a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSDNode *AMDILDAGToDAGISel::Select(SDNode *N) {
152a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  unsigned int Opc = N->getOpcode();
153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (N->isMachineOpcode()) {
154a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return NULL;   // Already selected.
155a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  switch (Opc) {
157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  default: break;
158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case ISD::FrameIndex:
159a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    {
160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        unsigned int FI = FIN->getIndex();
162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        EVT OpVT = N->getValueType(0);
163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        unsigned int NewOpc = AMDIL::MOVE_i32;
164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        SDValue TFI = CurDAG->getTargetFrameIndex(FI, MVT::i32);
165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        return CurDAG->SelectNodeTo(N, NewOpc, OpVT, TFI);
166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      }
167a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
168a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    break;
169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
170a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // For all atomic instructions, we need to add a constant
171a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // operand that stores the resource ID in the instruction
172a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (Opc > AMDILISD::ADDADDR && Opc < AMDILISD::APPEND_ALLOC) {
173a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    N = xformAtomicInst(N);
174a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
175a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return SelectCode(N);
176a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
177a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1785aaaa6a426258dc714c7346bec062795998f9986Tom Stellardbool AMDILDAGToDAGISel::checkType(const Value *ptr, unsigned int addrspace) {
1795aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (!ptr) {
1805aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    return false;
1815aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  }
1825aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  Type *ptrType = ptr->getType();
1835aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return dyn_cast<PointerType>(ptrType)->getAddressSpace() == addrspace;
1845aaaa6a426258dc714c7346bec062795998f9986Tom Stellard}
1855aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
1865aaaa6a426258dc714c7346bec062795998f9986Tom Stellardconst Value * AMDILDAGToDAGISel::getBasePointerValue(const Value *V)
1875aaaa6a426258dc714c7346bec062795998f9986Tom Stellard{
1885aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (!V) {
1895aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    return NULL;
1905aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  }
1915aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  const Value *ret = NULL;
1925aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  ValueMap<const Value *, bool> ValueBitMap;
1935aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  std::queue<const Value *, std::list<const Value *> > ValueQueue;
1945aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  ValueQueue.push(V);
1955aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  while (!ValueQueue.empty()) {
1965aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    V = ValueQueue.front();
1975aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    if (ValueBitMap.find(V) == ValueBitMap.end()) {
1985aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      ValueBitMap[V] = true;
1995aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      if (dyn_cast<Argument>(V) && dyn_cast<PointerType>(V->getType())) {
2005aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        ret = V;
2015aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        break;
2025aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      } else if (dyn_cast<GlobalVariable>(V)) {
2035aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        ret = V;
2045aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        break;
2055aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      } else if (dyn_cast<Constant>(V)) {
2065aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        const ConstantExpr *CE = dyn_cast<ConstantExpr>(V);
2075aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        if (CE) {
2085aaaa6a426258dc714c7346bec062795998f9986Tom Stellard          ValueQueue.push(CE->getOperand(0));
2095aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        }
2105aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2115aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        ret = AI;
2125aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        break;
2135aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      } else if (const Instruction *I = dyn_cast<Instruction>(V)) {
2145aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        uint32_t numOps = I->getNumOperands();
2155aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        for (uint32_t x = 0; x < numOps; ++x) {
2165aaaa6a426258dc714c7346bec062795998f9986Tom Stellard          ValueQueue.push(I->getOperand(x));
2175aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        }
2185aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      } else {
2195aaaa6a426258dc714c7346bec062795998f9986Tom Stellard        // assert(0 && "Found a Value that we didn't know how to handle!");
2205aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      }
2215aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    }
2225aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    ValueQueue.pop();
2235aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  }
2245aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return ret;
2255aaaa6a426258dc714c7346bec062795998f9986Tom Stellard}
2265aaaa6a426258dc714c7346bec062795998f9986Tom Stellard
227a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isGlobalStore(const StoreSDNode *N) {
2285aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::GLOBAL_ADDRESS);
229a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
230a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
231a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isPrivateStore(const StoreSDNode *N) {
2325aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return (!checkType(N->getSrcValue(), AMDILAS::LOCAL_ADDRESS)
2335aaaa6a426258dc714c7346bec062795998f9986Tom Stellard          && !checkType(N->getSrcValue(), AMDILAS::GLOBAL_ADDRESS)
2345aaaa6a426258dc714c7346bec062795998f9986Tom Stellard          && !checkType(N->getSrcValue(), AMDILAS::REGION_ADDRESS));
235a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
236a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
237a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isLocalStore(const StoreSDNode *N) {
2385aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::LOCAL_ADDRESS);
239a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
240a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
241a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isRegionStore(const StoreSDNode *N) {
2425aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::REGION_ADDRESS);
243a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
244a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
245a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isConstantLoad(const LoadSDNode *N, int cbID) {
2465aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (checkType(N->getSrcValue(), AMDILAS::CONSTANT_ADDRESS)) {
247a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return true;
248a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
249a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  MachineMemOperand *MMO = N->getMemOperand();
250a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  const Value *V = MMO->getValue();
251a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  const Value *BV = getBasePointerValue(V);
252a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (MMO
253a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      && MMO->getValue()
254a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      && ((V && dyn_cast<GlobalValue>(V))
255a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard          || (BV && dyn_cast<GlobalValue>(
256a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                        getBasePointerValue(MMO->getValue()))))) {
2575aaaa6a426258dc714c7346bec062795998f9986Tom Stellard    return checkType(N->getSrcValue(), AMDILAS::PRIVATE_ADDRESS);
258a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
259a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return false;
260a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
261a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
262a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
263a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isGlobalLoad(const LoadSDNode *N) {
2645aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::GLOBAL_ADDRESS);
265a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
266a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
267a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isLocalLoad(const  LoadSDNode *N) {
2685aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::LOCAL_ADDRESS);
269a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
270a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
271a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isRegionLoad(const  LoadSDNode *N) {
2725aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  return checkType(N->getSrcValue(), AMDILAS::REGION_ADDRESS);
273a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
274a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
275a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isCPLoad(const LoadSDNode *N) {
276a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  MachineMemOperand *MMO = N->getMemOperand();
2775aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (checkType(N->getSrcValue(), AMDILAS::PRIVATE_ADDRESS)) {
278a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    if (MMO) {
279a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      const Value *V = MMO->getValue();
280a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V);
281a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      if (PSV && PSV == PseudoSourceValue::getConstantPool()) {
282a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard        return true;
283a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      }
284a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
285a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
286a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return false;
287a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
288a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
289a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool AMDILDAGToDAGISel::isPrivateLoad(const LoadSDNode *N) {
2905aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (checkType(N->getSrcValue(), AMDILAS::PRIVATE_ADDRESS)) {
291a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    // Check to make sure we are not a constant pool load or a constant load
292a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    // that is marked as a private load
293a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    if (isCPLoad(N) || isConstantLoad(N, -1)) {
294a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return false;
295a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
296a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
2975aaaa6a426258dc714c7346bec062795998f9986Tom Stellard  if (!checkType(N->getSrcValue(), AMDILAS::LOCAL_ADDRESS)
2985aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      && !checkType(N->getSrcValue(), AMDILAS::GLOBAL_ADDRESS)
2995aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      && !checkType(N->getSrcValue(), AMDILAS::REGION_ADDRESS)
3005aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      && !checkType(N->getSrcValue(), AMDILAS::CONSTANT_ADDRESS)
3015aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      && !checkType(N->getSrcValue(), AMDILAS::PARAM_D_ADDRESS)
3025aaaa6a426258dc714c7346bec062795998f9986Tom Stellard      && !checkType(N->getSrcValue(), AMDILAS::PARAM_I_ADDRESS))
303a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  {
304a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return true;
305a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
306a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return false;
307a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
308a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
309a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardconst char *AMDILDAGToDAGISel::getPassName() const {
310a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return "AMDIL DAG->DAG Pattern Instruction Selection";
311a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
312a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
313a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSDNode*
314a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardAMDILDAGToDAGISel::xformAtomicInst(SDNode *N)
315a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
316a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  uint32_t addVal = 1;
317a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  bool addOne = false;
318a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // bool bitCastToInt = (N->getValueType(0) == MVT::f32);
319a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  unsigned opc = N->getOpcode();
320a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  switch (opc) {
321a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    default: return N;
322a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_ADD:
323a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_AND:
324a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_MAX:
325a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_UMAX:
326a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_MIN:
327a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_UMIN:
328a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_OR:
329a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_SUB:
330a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_RSUB:
331a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_XCHG:
332a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_XOR:
333a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_ADD_NORET:
334a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_AND_NORET:
335a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_MAX_NORET:
336a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_UMAX_NORET:
337a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_MIN_NORET:
338a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_UMIN_NORET:
339a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_OR_NORET:
340a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_SUB_NORET:
341a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_RSUB_NORET:
342a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_XCHG_NORET:
343a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_XOR_NORET:
344a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_ADD:
345a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_AND:
346a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_MAX:
347a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_UMAX:
348a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_MIN:
349a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_UMIN:
350a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_OR:
351a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_SUB:
352a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_RSUB:
353a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_XCHG:
354a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_XOR:
355a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_ADD_NORET:
356a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_AND_NORET:
357a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_MAX_NORET:
358a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_UMAX_NORET:
359a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_MIN_NORET:
360a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_UMIN_NORET:
361a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_OR_NORET:
362a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_SUB_NORET:
363a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_RSUB_NORET:
364a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_XCHG_NORET:
365a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_XOR_NORET:
366a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_ADD:
367a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_AND:
368a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_MAX:
369a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_UMAX:
370a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_MIN:
371a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_UMIN:
372a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_OR:
373a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_SUB:
374a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_RSUB:
375a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_XCHG:
376a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_XOR:
377a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_ADD_NORET:
378a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_AND_NORET:
379a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_MAX_NORET:
380a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_UMAX_NORET:
381a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_MIN_NORET:
382a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_UMIN_NORET:
383a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_OR_NORET:
384a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_SUB_NORET:
385a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_RSUB_NORET:
386a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_XCHG_NORET:
387a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_XOR_NORET:
388a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_CMPXCHG:
389a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_CMPXCHG_NORET:
390a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_CMPXCHG:
391a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_CMPXCHG_NORET:
392a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_CMPXCHG:
393a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_CMPXCHG_NORET:
394a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
395a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_DEC:
396a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
397a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
398a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
399a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
400a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_G_SUB;
401a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
402a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
403a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_INC:
404a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
405a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
406a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
407a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
408a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_G_ADD;
409a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
410a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
411a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_DEC_NORET:
412a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
413a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
414a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
415a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
416a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_G_SUB_NORET;
417a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
418a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
419a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_G_INC_NORET:
420a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
421a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
422a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
423a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
424a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_G_ADD_NORET;
425a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
426a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
427a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_DEC:
428a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
429a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
430a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
431a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
432a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_L_SUB;
433a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
434a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
435a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_INC:
436a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
437a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
438a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
439a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
440a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_L_ADD;
441a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
442a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
443a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_DEC_NORET:
444a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
445a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
446a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
447a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
448a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_L_SUB_NORET;
449a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
450a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
451a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_L_INC_NORET:
452a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
453a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
454a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
455a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
456a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_L_ADD_NORET;
457a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
458a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
459a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_DEC:
460a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
461a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
462a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
463a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
464a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_R_SUB;
465a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
466a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
467a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_INC:
468a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
469a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
470a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
471a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
472a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_R_ADD;
473a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
474a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
475a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_DEC_NORET:
476a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
477a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
478a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
479a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
480a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_R_SUB;
481a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
482a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
483a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    case AMDILISD::ATOM_R_INC_NORET:
484a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             addOne = true;
485a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             if (Subtarget.calVersion() >= CAL_VERSION_SC_136) {
486a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               addVal = (uint32_t)-1;
487a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             } else {
488a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard               opc = AMDILISD::ATOM_R_ADD_NORET;
489a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             }
490a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard             break;
491a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
492a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // The largest we can have is a cmpxchg w/ a return value and an output chain.
493a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // The cmpxchg function has 3 inputs and a single output along with an
494a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  // output change and a target constant, giving a total of 6.
495a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  SDValue Ops[12];
496a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  unsigned x = 0;
497a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  unsigned y = N->getNumOperands();
498a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  for (x = 0; x < y; ++x) {
499a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    Ops[x] = N->getOperand(x);
500a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
501a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (addOne) {
502a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    Ops[x++] = SDValue(SelectCode(CurDAG->getConstant(addVal, MVT::i32).getNode()), 0);
503a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
504a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  Ops[x++] = CurDAG->getTargetConstant(0, MVT::i32);
505a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  SDVTList Tys = N->getVTList();
506a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  MemSDNode *MemNode = dyn_cast<MemSDNode>(N);
507a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  assert(MemNode && "Atomic should be of MemSDNode type!");
508a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  N = CurDAG->getMemIntrinsicNode(opc, N->getDebugLoc(), Tys, Ops, x,
509a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      MemNode->getMemoryVT(), MemNode->getMemOperand()).getNode();
510a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return N;
511a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
512a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
513a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#ifdef DEBUGTMP
514a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#undef INT64_C
515a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#endif
516a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#undef DEBUGTMP
517