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