summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeon/AMDILIOExpansion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/radeon/AMDILIOExpansion.cpp')
-rw-r--r--src/gallium/drivers/radeon/AMDILIOExpansion.cpp1160
1 files changed, 0 insertions, 1160 deletions
diff --git a/src/gallium/drivers/radeon/AMDILIOExpansion.cpp b/src/gallium/drivers/radeon/AMDILIOExpansion.cpp
deleted file mode 100644
index 68d8eef344d..00000000000
--- a/src/gallium/drivers/radeon/AMDILIOExpansion.cpp
+++ /dev/null
@@ -1,1160 +0,0 @@
-//===----------- AMDILIOExpansion.cpp - IO Expansion Pass -----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//==-----------------------------------------------------------------------===//
-// The AMDIL IO Expansion class expands pseudo IO instructions into a sequence
-// of instructions that produces the correct results. These instructions are
-// not expanded earlier in the pass because any pass before this can assume to
-// be able to generate a load/store instruction. So this pass can only have
-// passes that execute after it if no load/store instructions can be generated.
-//===----------------------------------------------------------------------===//
-#include "AMDILIOExpansion.h"
-#include "AMDIL.h"
-#include "AMDILDevices.h"
-#include "AMDILGlobalManager.h"
-#include "AMDILKernelManager.h"
-#include "AMDILMachineFunctionInfo.h"
-#include "AMDILTargetMachine.h"
-#include "AMDILUtilityFunctions.h"
-#include "llvm/CodeGen/MachineConstantPool.h"
-#include "llvm/CodeGen/MachineInstr.h"
-#include "llvm/CodeGen/MachineInstrBuilder.h"
-#include "llvm/CodeGen/MachineMemOperand.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Support/DebugLoc.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Value.h"
-
-using namespace llvm;
-
-char AMDILIOExpansion::ID = 0;
-namespace llvm {
- FunctionPass*
- createAMDILIOExpansion(TargetMachine &TM AMDIL_OPT_LEVEL_DECL)
- {
- return TM.getSubtarget<AMDILSubtarget>()
- .device()->getIOExpansion(TM AMDIL_OPT_LEVEL_VAR);
- }
-}
-
-AMDILIOExpansion::AMDILIOExpansion(TargetMachine &tm
- AMDIL_OPT_LEVEL_DECL) :
- MachineFunctionPass(ID), TM(tm)
-{
- mSTM = &tm.getSubtarget<AMDILSubtarget>();
- mDebug = DEBUGME;
- mTII = tm.getInstrInfo();
- mKM = NULL;
-}
-
-AMDILIOExpansion::~AMDILIOExpansion()
-{
-}
- bool
-AMDILIOExpansion::runOnMachineFunction(MachineFunction &MF)
-{
- mKM = const_cast<AMDILKernelManager*>(mSTM->getKernelManager());
- mMFI = MF.getInfo<AMDILMachineFunctionInfo>();
- for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end();
- MFI != MFE; ++MFI) {
- MachineBasicBlock *MBB = MFI;
- for (MachineBasicBlock::iterator MBI = MBB->begin(), MBE = MBB->end();
- MBI != MBE; ++MBI) {
- MachineInstr *MI = MBI;
- if (isIOInstruction(MI)) {
- mBB = MBB;
- saveInst = false;
- expandIOInstruction(MI);
- if (!saveInst) {
- // erase returns the instruction after
- // and we want the instruction before
- MBI = MBB->erase(MI);
- --MBI;
- }
- }
- }
- }
- return false;
-}
-const char *AMDILIOExpansion::getPassName() const
-{
- return "AMDIL Generic IO Expansion Pass";
-}
- bool
-AMDILIOExpansion::isIOInstruction(MachineInstr *MI)
-{
- if (!MI) {
- return false;
- }
- switch(MI->getOpcode()) {
- default:
- return false;
- ExpandCaseToAllTypes(AMDIL::CPOOLLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CONSTANTLOAD)
- ExpandCaseToAllTypes(AMDIL::CONSTANTSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CONSTANTZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CONSTANTAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATELOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATESEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATESTORE)
- ExpandCaseToAllTruncTypes(AMDIL::PRIVATETRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::REGIONSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::REGIONTRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::REGIONLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::LOCALLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::GLOBALLOAD)
- ExpandCaseToAllTypes(AMDIL::GLOBALSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::GLOBALAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::GLOBALZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::GLOBALSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::GLOBALTRUNCSTORE)
- return true;
- };
- return false;
-}
-void
-AMDILIOExpansion::expandIOInstruction(MachineInstr *MI)
-{
- assert(isIOInstruction(MI) && "Must be an IO instruction to "
- "be passed to this function!");
- switch (MI->getOpcode()) {
- default:
- assert(0 && "Not an IO Instruction!");
- ExpandCaseToAllTypes(AMDIL::GLOBALLOAD);
- ExpandCaseToAllTypes(AMDIL::GLOBALSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::GLOBALZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::GLOBALAEXTLOAD);
- expandGlobalLoad(MI);
- break;
- ExpandCaseToAllTypes(AMDIL::REGIONLOAD);
- ExpandCaseToAllTypes(AMDIL::REGIONSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::REGIONZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::REGIONAEXTLOAD);
- expandRegionLoad(MI);
- break;
- ExpandCaseToAllTypes(AMDIL::LOCALLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALAEXTLOAD);
- expandLocalLoad(MI);
- break;
- ExpandCaseToAllTypes(AMDIL::CONSTANTLOAD);
- ExpandCaseToAllTypes(AMDIL::CONSTANTSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CONSTANTZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CONSTANTAEXTLOAD);
- expandConstantLoad(MI);
- break;
- ExpandCaseToAllTypes(AMDIL::PRIVATELOAD);
- ExpandCaseToAllTypes(AMDIL::PRIVATESEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::PRIVATEZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::PRIVATEAEXTLOAD);
- expandPrivateLoad(MI);
- break;
- ExpandCaseToAllTypes(AMDIL::CPOOLLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLAEXTLOAD);
- expandConstantPoolLoad(MI);
- break;
- ExpandCaseToAllTruncTypes(AMDIL::GLOBALTRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::GLOBALSTORE);
- expandGlobalStore(MI);
- break;
- ExpandCaseToAllTruncTypes(AMDIL::PRIVATETRUNCSTORE);
- ExpandCaseToAllTypes(AMDIL::PRIVATESTORE);
- expandPrivateStore(MI);
- break;
- ExpandCaseToAllTruncTypes(AMDIL::REGIONTRUNCSTORE);
- ExpandCaseToAllTypes(AMDIL::REGIONSTORE);
- expandRegionStore(MI);
- break;
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE);
- ExpandCaseToAllTypes(AMDIL::LOCALSTORE);
- expandLocalStore(MI);
- break;
- }
-}
- bool
-AMDILIOExpansion::isAddrCalcInstr(MachineInstr *MI)
-{
- switch(MI->getOpcode()) {
- ExpandCaseToAllTypes(AMDIL::PRIVATELOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATESEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEAEXTLOAD)
- {
- // This section of code is a workaround for the problem of
- // globally scoped constant address variables. The problems
- // comes that although they are declared in the constant
- // address space, all variables must be allocated in the
- // private address space. So when there is a load from
- // the global address, it automatically goes into the private
- // address space. However, the data section is placed in the
- // constant address space so we need to check to see if our
- // load base address is a global variable or not. Only if it
- // is not a global variable can we do the address calculation
- // into the private memory ring.
-
- MachineMemOperand& memOp = (**MI->memoperands_begin());
- const Value *V = memOp.getValue();
- if (V) {
- const GlobalValue *GV = dyn_cast<GlobalVariable>(V);
- return mSTM->device()->usesSoftware(AMDILDeviceInfo::PrivateMem)
- && !(GV);
- } else {
- return false;
- }
- }
- ExpandCaseToAllTypes(AMDIL::CPOOLLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLAEXTLOAD);
- return MI->getOperand(1).isReg();
- ExpandCaseToAllTruncTypes(AMDIL::PRIVATETRUNCSTORE);
- ExpandCaseToAllTypes(AMDIL::PRIVATESTORE);
- return mSTM->device()->usesSoftware(AMDILDeviceInfo::PrivateMem);
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE);
- ExpandCaseToAllTypes(AMDIL::LOCALSTORE);
- ExpandCaseToAllTypes(AMDIL::LOCALLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::LOCALAEXTLOAD);
- return mSTM->device()->usesSoftware(AMDILDeviceInfo::LocalMem);
- };
- return false;
-
-}
- bool
-AMDILIOExpansion::isExtendLoad(MachineInstr *MI)
-{
- return isSExtLoadInst(TM.getInstrInfo(), MI) ||
- isZExtLoadInst(TM.getInstrInfo(), MI) ||
- isAExtLoadInst(TM.getInstrInfo(), MI)
- || isSWSExtLoadInst(MI);
-}
-
- bool
-AMDILIOExpansion::isHardwareRegion(MachineInstr *MI)
-{
- switch(MI->getOpcode()) {
- default:
- return false;
- break;
- ExpandCaseToAllTypes(AMDIL::REGIONLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::REGIONSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::REGIONTRUNCSTORE)
- return mSTM->device()->usesHardware(AMDILDeviceInfo::RegionMem);
- };
- return false;
-}
- bool
-AMDILIOExpansion::isHardwareLocal(MachineInstr *MI)
-{
- switch(MI->getOpcode()) {
- default:
- return false;
- break;
- ExpandCaseToAllTypes(AMDIL::LOCALLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE)
- return mSTM->device()->usesHardware(AMDILDeviceInfo::LocalMem);
- };
- return false;
-}
- bool
-AMDILIOExpansion::isPackedData(MachineInstr *MI)
-{
- switch(MI->getOpcode()) {
- default:
- if (isTruncStoreInst(TM.getInstrInfo(), MI)) {
- switch (MI->getDesc().OpInfo[0].RegClass) {
- default:
- break;
- case AMDIL::GPRV2I64RegClassID:
- case AMDIL::GPRV2I32RegClassID:
- switch (getMemorySize(MI)) {
- case 2:
- case 4:
- return true;
- default:
- break;
- }
- break;
- case AMDIL::GPRV4I32RegClassID:
- switch (getMemorySize(MI)) {
- case 4:
- case 8:
- return true;
- default:
- break;
- }
- break;
- }
- }
- break;
- ExpandCaseToPackedTypes(AMDIL::CPOOLLOAD);
- ExpandCaseToPackedTypes(AMDIL::CPOOLSEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CPOOLZEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CPOOLAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::GLOBALLOAD);
- ExpandCaseToPackedTypes(AMDIL::GLOBALSEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::GLOBALZEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::GLOBALAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::LOCALLOAD);
- ExpandCaseToPackedTypes(AMDIL::LOCALSEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::LOCALZEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::LOCALAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::REGIONLOAD);
- ExpandCaseToPackedTypes(AMDIL::REGIONSEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::REGIONZEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::REGIONAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::PRIVATELOAD);
- ExpandCaseToPackedTypes(AMDIL::PRIVATESEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::PRIVATEZEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::PRIVATEAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CONSTANTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CONSTANTSEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CONSTANTAEXTLOAD);
- ExpandCaseToPackedTypes(AMDIL::CONSTANTZEXTLOAD);
- ExpandCaseToAllTruncTypes(AMDIL::GLOBALTRUNCSTORE)
- ExpandCaseToAllTruncTypes(AMDIL::PRIVATETRUNCSTORE);
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE);
- ExpandCaseToAllTruncTypes(AMDIL::REGIONTRUNCSTORE);
- ExpandCaseToPackedTypes(AMDIL::GLOBALSTORE);
- ExpandCaseToPackedTypes(AMDIL::PRIVATESTORE);
- ExpandCaseToPackedTypes(AMDIL::LOCALSTORE);
- ExpandCaseToPackedTypes(AMDIL::REGIONSTORE);
- return true;
- }
- return false;
-}
-
- bool
-AMDILIOExpansion::isStaticCPLoad(MachineInstr *MI)
-{
- switch(MI->getOpcode()) {
- ExpandCaseToAllTypes(AMDIL::CPOOLLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLSEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLZEXTLOAD);
- ExpandCaseToAllTypes(AMDIL::CPOOLAEXTLOAD);
- {
- uint32_t x = 0;
- uint32_t num = MI->getNumOperands();
- for (x = 0; x < num; ++x) {
- if (MI->getOperand(x).isCPI()) {
- return true;
- }
- }
- }
- break;
- default:
- break;
- }
- return false;
-}
-
- bool
-AMDILIOExpansion::isNbitType(Type *mType, uint32_t nBits, bool isScalar)
-{
- if (!mType) {
- return false;
- }
- if (dyn_cast<PointerType>(mType)) {
- PointerType *PT = dyn_cast<PointerType>(mType);
- return isNbitType(PT->getElementType(), nBits);
- } else if (dyn_cast<StructType>(mType)) {
- return getTypeSize(mType) == nBits;
- } else if (dyn_cast<VectorType>(mType)) {
- VectorType *VT = dyn_cast<VectorType>(mType);
- size_t size = VT->getScalarSizeInBits();
- return (isScalar ?
- VT->getNumElements() * size == nBits : size == nBits);
- } else if (dyn_cast<ArrayType>(mType)) {
- ArrayType *AT = dyn_cast<ArrayType>(mType);
- size_t size = AT->getScalarSizeInBits();
- return (isScalar ?
- AT->getNumElements() * size == nBits : size == nBits);
- } else if (mType->isSized()) {
- return mType->getScalarSizeInBits() == nBits;
- } else {
- assert(0 && "Found a type that we don't know how to handle!");
- return false;
- }
-}
-
- bool
-AMDILIOExpansion::isHardwareInst(MachineInstr *MI)
-{
- AMDILAS::InstrResEnc curRes;
- curRes.u16all = MI->getAsmPrinterFlags();
- return curRes.bits.HardwareInst;
-}
-
-REG_PACKED_TYPE
-AMDILIOExpansion::getPackedID(MachineInstr *MI)
-{
- switch (MI->getOpcode()) {
- default:
- break;
- case AMDIL::GLOBALTRUNCSTORE_v2i64i8:
- case AMDIL::REGIONTRUNCSTORE_v2i64i8:
- case AMDIL::LOCALTRUNCSTORE_v2i64i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i64i8:
- case AMDIL::GLOBALTRUNCSTORE_v2i32i8:
- case AMDIL::REGIONTRUNCSTORE_v2i32i8:
- case AMDIL::LOCALTRUNCSTORE_v2i32i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i32i8:
- case AMDIL::GLOBALTRUNCSTORE_v2i16i8:
- case AMDIL::REGIONTRUNCSTORE_v2i16i8:
- case AMDIL::LOCALTRUNCSTORE_v2i16i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i16i8:
- case AMDIL::GLOBALSTORE_v2i8:
- case AMDIL::LOCALSTORE_v2i8:
- case AMDIL::REGIONSTORE_v2i8:
- case AMDIL::PRIVATESTORE_v2i8:
- return PACK_V2I8;
- case AMDIL::GLOBALTRUNCSTORE_v4i32i8:
- case AMDIL::REGIONTRUNCSTORE_v4i32i8:
- case AMDIL::LOCALTRUNCSTORE_v4i32i8:
- case AMDIL::PRIVATETRUNCSTORE_v4i32i8:
- case AMDIL::GLOBALTRUNCSTORE_v4i16i8:
- case AMDIL::REGIONTRUNCSTORE_v4i16i8:
- case AMDIL::LOCALTRUNCSTORE_v4i16i8:
- case AMDIL::PRIVATETRUNCSTORE_v4i16i8:
- case AMDIL::GLOBALSTORE_v4i8:
- case AMDIL::LOCALSTORE_v4i8:
- case AMDIL::REGIONSTORE_v4i8:
- case AMDIL::PRIVATESTORE_v4i8:
- return PACK_V4I8;
- case AMDIL::GLOBALTRUNCSTORE_v2i64i16:
- case AMDIL::REGIONTRUNCSTORE_v2i64i16:
- case AMDIL::LOCALTRUNCSTORE_v2i64i16:
- case AMDIL::PRIVATETRUNCSTORE_v2i64i16:
- case AMDIL::GLOBALTRUNCSTORE_v2i32i16:
- case AMDIL::REGIONTRUNCSTORE_v2i32i16:
- case AMDIL::LOCALTRUNCSTORE_v2i32i16:
- case AMDIL::PRIVATETRUNCSTORE_v2i32i16:
- case AMDIL::GLOBALSTORE_v2i16:
- case AMDIL::LOCALSTORE_v2i16:
- case AMDIL::REGIONSTORE_v2i16:
- case AMDIL::PRIVATESTORE_v2i16:
- return PACK_V2I16;
- case AMDIL::GLOBALTRUNCSTORE_v4i32i16:
- case AMDIL::REGIONTRUNCSTORE_v4i32i16:
- case AMDIL::LOCALTRUNCSTORE_v4i32i16:
- case AMDIL::PRIVATETRUNCSTORE_v4i32i16:
- case AMDIL::GLOBALSTORE_v4i16:
- case AMDIL::LOCALSTORE_v4i16:
- case AMDIL::REGIONSTORE_v4i16:
- case AMDIL::PRIVATESTORE_v4i16:
- return PACK_V4I16;
- case AMDIL::GLOBALLOAD_v2i8:
- case AMDIL::GLOBALSEXTLOAD_v2i8:
- case AMDIL::GLOBALAEXTLOAD_v2i8:
- case AMDIL::GLOBALZEXTLOAD_v2i8:
- case AMDIL::LOCALLOAD_v2i8:
- case AMDIL::LOCALSEXTLOAD_v2i8:
- case AMDIL::LOCALAEXTLOAD_v2i8:
- case AMDIL::LOCALZEXTLOAD_v2i8:
- case AMDIL::REGIONLOAD_v2i8:
- case AMDIL::REGIONSEXTLOAD_v2i8:
- case AMDIL::REGIONAEXTLOAD_v2i8:
- case AMDIL::REGIONZEXTLOAD_v2i8:
- case AMDIL::PRIVATELOAD_v2i8:
- case AMDIL::PRIVATESEXTLOAD_v2i8:
- case AMDIL::PRIVATEAEXTLOAD_v2i8:
- case AMDIL::PRIVATEZEXTLOAD_v2i8:
- case AMDIL::CONSTANTLOAD_v2i8:
- case AMDIL::CONSTANTSEXTLOAD_v2i8:
- case AMDIL::CONSTANTAEXTLOAD_v2i8:
- case AMDIL::CONSTANTZEXTLOAD_v2i8:
- return UNPACK_V2I8;
- case AMDIL::GLOBALLOAD_v4i8:
- case AMDIL::GLOBALSEXTLOAD_v4i8:
- case AMDIL::GLOBALAEXTLOAD_v4i8:
- case AMDIL::GLOBALZEXTLOAD_v4i8:
- case AMDIL::LOCALLOAD_v4i8:
- case AMDIL::LOCALSEXTLOAD_v4i8:
- case AMDIL::LOCALAEXTLOAD_v4i8:
- case AMDIL::LOCALZEXTLOAD_v4i8:
- case AMDIL::REGIONLOAD_v4i8:
- case AMDIL::REGIONSEXTLOAD_v4i8:
- case AMDIL::REGIONAEXTLOAD_v4i8:
- case AMDIL::REGIONZEXTLOAD_v4i8:
- case AMDIL::PRIVATELOAD_v4i8:
- case AMDIL::PRIVATESEXTLOAD_v4i8:
- case AMDIL::PRIVATEAEXTLOAD_v4i8:
- case AMDIL::PRIVATEZEXTLOAD_v4i8:
- case AMDIL::CONSTANTLOAD_v4i8:
- case AMDIL::CONSTANTSEXTLOAD_v4i8:
- case AMDIL::CONSTANTAEXTLOAD_v4i8:
- case AMDIL::CONSTANTZEXTLOAD_v4i8:
- return UNPACK_V4I8;
- case AMDIL::GLOBALLOAD_v2i16:
- case AMDIL::GLOBALSEXTLOAD_v2i16:
- case AMDIL::GLOBALAEXTLOAD_v2i16:
- case AMDIL::GLOBALZEXTLOAD_v2i16:
- case AMDIL::LOCALLOAD_v2i16:
- case AMDIL::LOCALSEXTLOAD_v2i16:
- case AMDIL::LOCALAEXTLOAD_v2i16:
- case AMDIL::LOCALZEXTLOAD_v2i16:
- case AMDIL::REGIONLOAD_v2i16:
- case AMDIL::REGIONSEXTLOAD_v2i16:
- case AMDIL::REGIONAEXTLOAD_v2i16:
- case AMDIL::REGIONZEXTLOAD_v2i16:
- case AMDIL::PRIVATELOAD_v2i16:
- case AMDIL::PRIVATESEXTLOAD_v2i16:
- case AMDIL::PRIVATEAEXTLOAD_v2i16:
- case AMDIL::PRIVATEZEXTLOAD_v2i16:
- case AMDIL::CONSTANTLOAD_v2i16:
- case AMDIL::CONSTANTSEXTLOAD_v2i16:
- case AMDIL::CONSTANTAEXTLOAD_v2i16:
- case AMDIL::CONSTANTZEXTLOAD_v2i16:
- return UNPACK_V2I16;
- case AMDIL::GLOBALLOAD_v4i16:
- case AMDIL::GLOBALSEXTLOAD_v4i16:
- case AMDIL::GLOBALAEXTLOAD_v4i16:
- case AMDIL::GLOBALZEXTLOAD_v4i16:
- case AMDIL::LOCALLOAD_v4i16:
- case AMDIL::LOCALSEXTLOAD_v4i16:
- case AMDIL::LOCALAEXTLOAD_v4i16:
- case AMDIL::LOCALZEXTLOAD_v4i16:
- case AMDIL::REGIONLOAD_v4i16:
- case AMDIL::REGIONSEXTLOAD_v4i16:
- case AMDIL::REGIONAEXTLOAD_v4i16:
- case AMDIL::REGIONZEXTLOAD_v4i16:
- case AMDIL::PRIVATELOAD_v4i16:
- case AMDIL::PRIVATESEXTLOAD_v4i16:
- case AMDIL::PRIVATEAEXTLOAD_v4i16:
- case AMDIL::PRIVATEZEXTLOAD_v4i16:
- case AMDIL::CONSTANTLOAD_v4i16:
- case AMDIL::CONSTANTSEXTLOAD_v4i16:
- case AMDIL::CONSTANTAEXTLOAD_v4i16:
- case AMDIL::CONSTANTZEXTLOAD_v4i16:
- return UNPACK_V4I16;
- };
- return NO_PACKING;
-}
-
- uint32_t
-AMDILIOExpansion::getPointerID(MachineInstr *MI)
-{
- AMDILAS::InstrResEnc curInst;
- getAsmPrinterFlags(MI, curInst);
- return curInst.bits.ResourceID;
-}
-
- uint32_t
-AMDILIOExpansion::getShiftSize(MachineInstr *MI)
-{
- switch(getPackedID(MI)) {
- default:
- return 0;
- case PACK_V2I8:
- case PACK_V4I8:
- case UNPACK_V2I8:
- case UNPACK_V4I8:
- return 1;
- case PACK_V2I16:
- case PACK_V4I16:
- case UNPACK_V2I16:
- case UNPACK_V4I16:
- return 2;
- }
- return 0;
-}
- uint32_t
-AMDILIOExpansion::getMemorySize(MachineInstr *MI)
-{
- if (MI->memoperands_empty()) {
- return 4;
- }
- return (uint32_t)((*MI->memoperands_begin())->getSize());
-}
-
- void
-AMDILIOExpansion::expandLongExtend(MachineInstr *MI,
- uint32_t numComps, uint32_t size, bool signedShift)
-{
- DebugLoc DL = MI->getDebugLoc();
- switch(size) {
- default:
- assert(0 && "Found a case we don't handle!");
- break;
- case 8:
- if (numComps == 1) {
- expandLongExtendSub32(MI, AMDIL::SHL_i8, AMDIL::SHRVEC_v2i32,
- AMDIL::USHRVEC_i8,
- 24, (24ULL | (31ULL << 32)), 24, AMDIL::LCREATE, signedShift);
- } else if (numComps == 2) {
- expandLongExtendSub32(MI, AMDIL::SHL_v2i8, AMDIL::SHRVEC_v4i32,
- AMDIL::USHRVEC_v2i8,
- 24, (24ULL | (31ULL << 32)), 24, AMDIL::LCREATE_v2i64, signedShift);
- } else {
- assert(0 && "Found a case we don't handle!");
- }
- break;
- case 16:
- if (numComps == 1) {
- expandLongExtendSub32(MI, AMDIL::SHL_i16, AMDIL::SHRVEC_v2i32,
- AMDIL::USHRVEC_i16,
- 16, (16ULL | (31ULL << 32)), 16, AMDIL::LCREATE, signedShift);
- } else if (numComps == 2) {
- expandLongExtendSub32(MI, AMDIL::SHL_v2i16, AMDIL::SHRVEC_v4i32,
- AMDIL::USHRVEC_v2i16,
- 16, (16ULL | (31ULL << 32)), 16, AMDIL::LCREATE_v2i64, signedShift);
- } else {
- assert(0 && "Found a case we don't handle!");
- }
- break;
- case 32:
- if (numComps == 1) {
- if (signedShift) {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::SHRVEC_i32), AMDIL::R1012)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(31));
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::LCREATE), AMDIL::R1011)
- .addReg(AMDIL::R1011).addReg(AMDIL::R1012);
- } else {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::LCREATE), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(0));
- }
- } else if (numComps == 2) {
- if (signedShift) {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::SHRVEC_v2i32), AMDIL::R1012)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(31));
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::LCREATE_v2i64), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addReg(AMDIL::R1012);
- } else {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::LCREATE_v2i64), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(0));
- }
- } else {
- assert(0 && "Found a case we don't handle!");
- }
- };
-}
- void
-AMDILIOExpansion::expandLongExtendSub32(MachineInstr *MI,
- unsigned SHLop, unsigned SHRop, unsigned USHRop,
- unsigned SHLimm, uint64_t SHRimm, unsigned USHRimm,
- unsigned LCRop, bool signedShift)
-{
- DebugLoc DL = MI->getDebugLoc();
- BuildMI(*mBB, MI, DL, mTII->get(SHLop), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(SHLimm));
- if (signedShift) {
- BuildMI(*mBB, MI, DL, mTII->get(LCRop), AMDIL::R1011)
- .addReg(AMDIL::R1011).addReg(AMDIL::R1011);
- BuildMI(*mBB, MI, DL, mTII->get(SHRop), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi64Literal(SHRimm));
- } else {
- BuildMI(*mBB, MI, DL, mTII->get(USHRop), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(USHRimm));
- BuildMI(*mBB, MI, MI->getDebugLoc(), mTII->get(LCRop), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(0));
- }
-}
-
- void
-AMDILIOExpansion::expandIntegerExtend(MachineInstr *MI, unsigned SHLop,
- unsigned SHRop, unsigned offset)
-{
- DebugLoc DL = MI->getDebugLoc();
- offset = mMFI->addi32Literal(offset);
- BuildMI(*mBB, MI, DL,
- mTII->get(SHLop), AMDIL::R1011)
- .addReg(AMDIL::R1011).addImm(offset);
- BuildMI(*mBB, MI, DL,
- mTII->get(SHRop), AMDIL::R1011)
- .addReg(AMDIL::R1011).addImm(offset);
-}
- void
-AMDILIOExpansion::expandExtendLoad(MachineInstr *MI)
-{
- if (!isExtendLoad(MI)) {
- return;
- }
- Type *mType = NULL;
- if (!MI->memoperands_empty()) {
- MachineMemOperand *memOp = (*MI->memoperands_begin());
- const Value *moVal = (memOp) ? memOp->getValue() : NULL;
- mType = (moVal) ? moVal->getType() : NULL;
- }
- unsigned opcode = 0;
- DebugLoc DL = MI->getDebugLoc();
- if (isZExtLoadInst(TM.getInstrInfo(), MI) || isAExtLoadInst(TM.getInstrInfo(), MI) || isSExtLoadInst(TM.getInstrInfo(), MI)) {
- switch(MI->getDesc().OpInfo[0].RegClass) {
- default:
- assert(0 && "Found an extending load that we don't handle!");
- break;
- case AMDIL::GPRI16RegClassID:
- if (!isHardwareLocal(MI)
- || mSTM->device()->usesSoftware(AMDILDeviceInfo::ByteLDSOps)) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_i16 : AMDIL::USHRVEC_i16;
- expandIntegerExtend(MI, AMDIL::SHL_i16, opcode, 24);
- }
- break;
- case AMDIL::GPRV2I16RegClassID:
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v2i16 : AMDIL::USHRVEC_v2i16;
- expandIntegerExtend(MI, AMDIL::SHL_v2i16, opcode, 24);
- break;
- case AMDIL::GPRV4I8RegClassID:
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v4i8 : AMDIL::USHRVEC_v4i8;
- expandIntegerExtend(MI, AMDIL::SHL_v4i8, opcode, 24);
- break;
- case AMDIL::GPRV4I16RegClassID:
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v4i16 : AMDIL::USHRVEC_v4i16;
- expandIntegerExtend(MI, AMDIL::SHL_v4i16, opcode, 24);
- break;
- case AMDIL::GPRI32RegClassID:
- // We can be a i8 or i16 bit sign extended value
- if (isNbitType(mType, 8) || getMemorySize(MI) == 1) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_i32 : AMDIL::USHRVEC_i32;
- expandIntegerExtend(MI, AMDIL::SHL_i32, opcode, 24);
- } else if (isNbitType(mType, 16) || getMemorySize(MI) == 2) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_i32 : AMDIL::USHRVEC_i32;
- expandIntegerExtend(MI, AMDIL::SHL_i32, opcode, 16);
- } else {
- assert(0 && "Found an extending load that we don't handle!");
- }
- break;
- case AMDIL::GPRV2I32RegClassID:
- // We can be a v2i8 or v2i16 bit sign extended value
- if (isNbitType(mType, 8, false) || getMemorySize(MI) == 2) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v2i32 : AMDIL::USHRVEC_v2i32;
- expandIntegerExtend(MI, AMDIL::SHL_v2i32, opcode, 24);
- } else if (isNbitType(mType, 16, false) || getMemorySize(MI) == 4) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v2i32 : AMDIL::USHRVEC_v2i32;
- expandIntegerExtend(MI, AMDIL::SHL_v2i32, opcode, 16);
- } else {
- assert(0 && "Found an extending load that we don't handle!");
- }
- break;
- case AMDIL::GPRV4I32RegClassID:
- // We can be a v4i8 or v4i16 bit sign extended value
- if (isNbitType(mType, 8, false) || getMemorySize(MI) == 4) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v4i32 : AMDIL::USHRVEC_v4i32;
- expandIntegerExtend(MI, AMDIL::SHL_v4i32, opcode, 24);
- } else if (isNbitType(mType, 16, false) || getMemorySize(MI) == 8) {
- opcode = isSExtLoadInst(TM.getInstrInfo(), MI) ? AMDIL::SHRVEC_v4i32 : AMDIL::USHRVEC_v4i32;
- expandIntegerExtend(MI, AMDIL::SHL_v4i32, opcode, 16);
- } else {
- assert(0 && "Found an extending load that we don't handle!");
- }
- break;
- case AMDIL::GPRI64RegClassID:
- // We can be a i8, i16 or i32 bit sign extended value
- if (isNbitType(mType, 8) || getMemorySize(MI) == 1) {
- expandLongExtend(MI, 1, 8, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else if (isNbitType(mType, 16) || getMemorySize(MI) == 2) {
- expandLongExtend(MI, 1, 16, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else if (isNbitType(mType, 32) || getMemorySize(MI) == 4) {
- expandLongExtend(MI, 1, 32, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else {
- assert(0 && "Found an extending load that we don't handle!");
- }
- break;
- case AMDIL::GPRV2I64RegClassID:
- // We can be a v2i8, v2i16 or v2i32 bit sign extended value
- if (isNbitType(mType, 8, false) || getMemorySize(MI) == 2) {
- expandLongExtend(MI, 2, 8, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else if (isNbitType(mType, 16, false) || getMemorySize(MI) == 4) {
- expandLongExtend(MI, 2, 16, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else if (isNbitType(mType, 32, false) || getMemorySize(MI) == 8) {
- expandLongExtend(MI, 2, 32, isSExtLoadInst(TM.getInstrInfo(), MI));
- } else {
- assert(0 && "Found an extending load that we don't handle!");
- }
- break;
- case AMDIL::GPRF32RegClassID:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::HTOF_f32), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GPRV2F32RegClassID:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::HTOF_v2f32), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GPRV4F32RegClassID:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::HTOF_v4f32), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GPRF64RegClassID:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::FTOD), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GPRV2F64RegClassID:
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::VEXTRACT_v2f32),
- AMDIL::R1012).addReg(AMDIL::R1011).addImm(2);
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::FTOD), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::FTOD), AMDIL::R1012)
- .addReg(AMDIL::R1012);
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::VINSERT_v2f64), AMDIL::R1011)
- .addReg(AMDIL::R1011).addReg(AMDIL::R1012)
- .addImm(1 << 8).addImm(1 << 8);
- break;
- };
- } else if (isSWSExtLoadInst(MI)) {
- switch(MI->getDesc().OpInfo[0].RegClass) {
- case AMDIL::GPRI8RegClassID:
- if (!isHardwareLocal(MI)
- || mSTM->device()->usesSoftware(AMDILDeviceInfo::ByteLDSOps)) {
- expandIntegerExtend(MI, AMDIL::SHL_i8, AMDIL::SHRVEC_i8, 24);
- }
- break;
- case AMDIL::GPRV2I8RegClassID:
- expandIntegerExtend(MI, AMDIL::SHL_v2i8, AMDIL::SHRVEC_v2i8, 24);
- break;
- case AMDIL::GPRV4I8RegClassID:
- expandIntegerExtend(MI, AMDIL::SHL_v4i8, AMDIL::SHRVEC_v4i8, 24);
- break;
- case AMDIL::GPRI16RegClassID:
- if (!isHardwareLocal(MI)
- || mSTM->device()->usesSoftware(AMDILDeviceInfo::ByteLDSOps)) {
- expandIntegerExtend(MI, AMDIL::SHL_i16, AMDIL::SHRVEC_i16, 16);
- }
- break;
- case AMDIL::GPRV2I16RegClassID:
- expandIntegerExtend(MI, AMDIL::SHL_v2i16, AMDIL::SHRVEC_v2i16, 16);
- break;
- case AMDIL::GPRV4I16RegClassID:
- expandIntegerExtend(MI, AMDIL::SHL_v4i16, AMDIL::SHRVEC_v4i16, 16);
- break;
-
- };
- }
-}
-
- void
-AMDILIOExpansion::expandTruncData(MachineInstr *MI)
-{
- MachineBasicBlock::iterator I = *MI;
- if (!isTruncStoreInst(TM.getInstrInfo(), MI)) {
- return;
- }
- DebugLoc DL = MI->getDebugLoc();
- switch (MI->getOpcode()) {
- default:
- MI->dump();
- assert(!"Found a trunc store instructions we don't handle!");
- break;
- case AMDIL::GLOBALTRUNCSTORE_i64i8:
- case AMDIL::GLOBALTRUNCSTORE_v2i64i8:
- case AMDIL::LOCALTRUNCSTORE_i64i8:
- case AMDIL::LOCALTRUNCSTORE_v2i64i8:
- case AMDIL::REGIONTRUNCSTORE_i64i8:
- case AMDIL::REGIONTRUNCSTORE_v2i64i8:
- case AMDIL::PRIVATETRUNCSTORE_i64i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i64i8:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::LLO_v2i64), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- case AMDIL::GLOBALTRUNCSTORE_i16i8:
- case AMDIL::GLOBALTRUNCSTORE_v2i16i8:
- case AMDIL::GLOBALTRUNCSTORE_v4i16i8:
- case AMDIL::LOCALTRUNCSTORE_i16i8:
- case AMDIL::LOCALTRUNCSTORE_v2i16i8:
- case AMDIL::LOCALTRUNCSTORE_v4i16i8:
- case AMDIL::REGIONTRUNCSTORE_i16i8:
- case AMDIL::REGIONTRUNCSTORE_v2i16i8:
- case AMDIL::REGIONTRUNCSTORE_v4i16i8:
- case AMDIL::PRIVATETRUNCSTORE_i16i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i16i8:
- case AMDIL::PRIVATETRUNCSTORE_v4i16i8:
- case AMDIL::GLOBALTRUNCSTORE_i32i8:
- case AMDIL::GLOBALTRUNCSTORE_v2i32i8:
- case AMDIL::GLOBALTRUNCSTORE_v4i32i8:
- case AMDIL::LOCALTRUNCSTORE_i32i8:
- case AMDIL::LOCALTRUNCSTORE_v2i32i8:
- case AMDIL::LOCALTRUNCSTORE_v4i32i8:
- case AMDIL::REGIONTRUNCSTORE_i32i8:
- case AMDIL::REGIONTRUNCSTORE_v2i32i8:
- case AMDIL::REGIONTRUNCSTORE_v4i32i8:
- case AMDIL::PRIVATETRUNCSTORE_i32i8:
- case AMDIL::PRIVATETRUNCSTORE_v2i32i8:
- case AMDIL::PRIVATETRUNCSTORE_v4i32i8:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::BINARY_AND_v4i32), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(0xFF));
- break;
- case AMDIL::GLOBALTRUNCSTORE_i64i16:
- case AMDIL::GLOBALTRUNCSTORE_v2i64i16:
- case AMDIL::LOCALTRUNCSTORE_i64i16:
- case AMDIL::LOCALTRUNCSTORE_v2i64i16:
- case AMDIL::REGIONTRUNCSTORE_i64i16:
- case AMDIL::REGIONTRUNCSTORE_v2i64i16:
- case AMDIL::PRIVATETRUNCSTORE_i64i16:
- case AMDIL::PRIVATETRUNCSTORE_v2i64i16:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::LLO_v2i64), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- case AMDIL::GLOBALTRUNCSTORE_i32i16:
- case AMDIL::GLOBALTRUNCSTORE_v2i32i16:
- case AMDIL::GLOBALTRUNCSTORE_v4i32i16:
- case AMDIL::LOCALTRUNCSTORE_i32i16:
- case AMDIL::LOCALTRUNCSTORE_v2i32i16:
- case AMDIL::LOCALTRUNCSTORE_v4i32i16:
- case AMDIL::REGIONTRUNCSTORE_i32i16:
- case AMDIL::REGIONTRUNCSTORE_v2i32i16:
- case AMDIL::REGIONTRUNCSTORE_v4i32i16:
- case AMDIL::PRIVATETRUNCSTORE_i32i16:
- case AMDIL::PRIVATETRUNCSTORE_v2i32i16:
- case AMDIL::PRIVATETRUNCSTORE_v4i32i16:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::BINARY_AND_v4i32), AMDIL::R1011)
- .addReg(AMDIL::R1011)
- .addImm(mMFI->addi32Literal(0xFFFF));
- break;
- case AMDIL::GLOBALTRUNCSTORE_i64i32:
- case AMDIL::LOCALTRUNCSTORE_i64i32:
- case AMDIL::REGIONTRUNCSTORE_i64i32:
- case AMDIL::PRIVATETRUNCSTORE_i64i32:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::LLO), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GLOBALTRUNCSTORE_v2i64i32:
- case AMDIL::LOCALTRUNCSTORE_v2i64i32:
- case AMDIL::REGIONTRUNCSTORE_v2i64i32:
- case AMDIL::PRIVATETRUNCSTORE_v2i64i32:
- BuildMI(*mBB, MI, DL,
- mTII->get(AMDIL::LLO_v2i64), AMDIL::R1011)
- .addReg(AMDIL::R1011);
- break;
- case AMDIL::GLOBALTRUNCSTORE_f64f32:
- case AMDIL::LOCALTRUNCSTORE_f64f32:
- case AMDIL::REGIONTRUNCSTORE_f64f32:
- case AMDIL::PRIVATETRUNCSTORE_f64f32:
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::DTOF),
- AMDIL::R1011).addReg(AMDIL::R1011);
- break;
- case AMDIL::GLOBALTRUNCSTORE_v2f64f32:
- case AMDIL::LOCALTRUNCSTORE_v2f64f32:
- case AMDIL::REGIONTRUNCSTORE_v2f64f32:
- case AMDIL::PRIVATETRUNCSTORE_v2f64f32:
- BuildMI(*mBB, I, DL, mTII->get(AMDIL::VEXTRACT_v2f64),
- AMDIL::R1012).addReg(AMDIL::R1011).addImm(2);
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::DTOF),
- AMDIL::R1011).addReg(AMDIL::R1011);
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::DTOF),
- AMDIL::R1012).addReg(AMDIL::R1012);
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::VINSERT_v2f32),
- AMDIL::R1011).addReg(AMDIL::R1011).addReg(AMDIL::R1012)
- .addImm(1 << 8).addImm(1 << 8);
- break;
- }
-}
- void
-AMDILIOExpansion::expandAddressCalc(MachineInstr *MI)
-{
- if (!isAddrCalcInstr(MI)) {
- return;
- }
- DebugLoc DL = MI->getDebugLoc();
- switch(MI->getOpcode()) {
- ExpandCaseToAllTruncTypes(AMDIL::PRIVATETRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::PRIVATESTORE)
- ExpandCaseToAllTypes(AMDIL::PRIVATELOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATESEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::PRIVATEAEXTLOAD)
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::ADD_i32),
- AMDIL::R1010).addReg(AMDIL::R1010).addReg(AMDIL::T1);
- break;
- ExpandCaseToAllTruncTypes(AMDIL::LOCALTRUNCSTORE)
- ExpandCaseToAllTypes(AMDIL::LOCALLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALAEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::LOCALSTORE)
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::ADD_i32),
- AMDIL::R1010).addReg(AMDIL::R1010).addReg(AMDIL::T2);
- break;
- ExpandCaseToAllTypes(AMDIL::CPOOLLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLSEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLZEXTLOAD)
- ExpandCaseToAllTypes(AMDIL::CPOOLAEXTLOAD)
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::ADD_i32),
- AMDIL::R1010).addReg(AMDIL::R1010).addReg(AMDIL::SDP);
- break;
- default:
- return;
- }
-}
- void
-AMDILIOExpansion::expandLoadStartCode(MachineInstr *MI)
-{
- DebugLoc DL = MI->getDebugLoc();
- if (MI->getOperand(2).isReg()) {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::ADD_i32),
- AMDIL::R1010).addReg(MI->getOperand(1).getReg())
- .addReg(MI->getOperand(2).getReg());
- } else {
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::MOVE_i32),
- AMDIL::R1010).addReg(MI->getOperand(1).getReg());
- }
- MI->getOperand(1).setReg(AMDIL::R1010);
- expandAddressCalc(MI);
-}
- void
-AMDILIOExpansion::emitStaticCPLoad(MachineInstr* MI, int swizzle,
- int id, bool ExtFPLoad)
-{
- DebugLoc DL = MI->getDebugLoc();
- switch(swizzle) {
- default:
- BuildMI(*mBB, MI, DL, mTII->get(ExtFPLoad
- ? AMDIL::DTOF : AMDIL::MOVE_i32),
- MI->getOperand(0).getReg())
- .addImm(id);
- break;
- case 1:
- case 2:
- case 3:
- BuildMI(*mBB, MI, DL, mTII->get(ExtFPLoad
- ? AMDIL::DTOF : AMDIL::MOVE_i32), AMDIL::R1001)
- .addImm(id);
- BuildMI(*mBB, MI, DL, mTII->get(AMDIL::VINSERT_v4i32),
- MI->getOperand(0).getReg())
- .addReg(MI->getOperand(0).getReg())
- .addReg(AMDIL::R1001)
- .addImm(swizzle + 1);
- break;
- };
-}
- void
-AMDILIOExpansion::emitCPInst(MachineInstr* MI,
- const Constant* C, AMDILKernelManager* KM, int swizzle, bool ExtFPLoad)
-{
- if (const ConstantFP* CFP = dyn_cast<ConstantFP>(C)) {
- if (CFP->getType()->isFloatTy()) {
- uint32_t val = (uint32_t)(CFP->getValueAPF().bitcastToAPInt()
- .getZExtValue());
- uint32_t id = mMFI->addi32Literal(val);
- if (!id) {
- const APFloat &APF = CFP->getValueAPF();
- union dtol_union {
- double d;
- uint64_t ul;
- } conv;
- if (&APF.getSemantics()
- == (const llvm::fltSemantics*)&APFloat::IEEEsingle) {
- float fval = APF.convertToFloat();
- conv.d = (double)fval;
- } else {
- conv.d = APF.convertToDouble();
- }
- id = mMFI->addi64Literal(conv.ul);
- }
- emitStaticCPLoad(MI, swizzle, id, ExtFPLoad);
- } else {
- const APFloat &APF = CFP->getValueAPF();
- union ftol_union {
- double d;
- uint64_t ul;
- } conv;
- if (&APF.getSemantics()
- == (const llvm::fltSemantics*)&APFloat::IEEEsingle) {
- float fval = APF.convertToFloat();
- conv.d = (double)fval;
- } else {
- conv.d = APF.convertToDouble();
- }
- uint32_t id = mMFI->getLongLits(conv.ul);
- if (!id) {
- id = mMFI->getIntLits((uint32_t)conv.ul);
- }
- emitStaticCPLoad(MI, swizzle, id, ExtFPLoad);
- }
- } else if (const ConstantInt* CI = dyn_cast<ConstantInt>(C)) {
- int64_t val = 0;
- if (CI) {
- val = CI->getSExtValue();
- }
- if (CI->getBitWidth() == 64) {
- emitStaticCPLoad(MI, swizzle, mMFI->addi64Literal(val), ExtFPLoad);
- } else {
- emitStaticCPLoad(MI, swizzle, mMFI->addi32Literal(val), ExtFPLoad);
- }
- } else if (const ConstantArray* CA = dyn_cast<ConstantArray>(C)) {
- uint32_t size = CA->getNumOperands();
- assert(size < 5 && "Cannot handle a constant array where size > 4");
- if (size > 4) {
- size = 4;
- }
- for (uint32_t x = 0; x < size; ++x) {
- emitCPInst(MI, CA->getOperand(0), KM, x, ExtFPLoad);
- }
- } else if (const ConstantAggregateZero* CAZ
- = dyn_cast<ConstantAggregateZero>(C)) {
- if (CAZ->isNullValue()) {
- emitStaticCPLoad(MI, swizzle, mMFI->addi32Literal(0), ExtFPLoad);
- }
- } else if (const ConstantStruct* CS = dyn_cast<ConstantStruct>(C)) {
- uint32_t size = CS->getNumOperands();
- assert(size < 5 && "Cannot handle a constant array where size > 4");
- if (size > 4) {
- size = 4;
- }
- for (uint32_t x = 0; x < size; ++x) {
- emitCPInst(MI, CS->getOperand(0), KM, x, ExtFPLoad);
- }
- } else if (const ConstantVector* CV = dyn_cast<ConstantVector>(C)) {
- // TODO: Make this handle vectors natively up to the correct
- // size
- uint32_t size = CV->getNumOperands();
- assert(size < 5 && "Cannot handle a constant array where size > 4");
- if (size > 4) {
- size = 4;
- }
- for (uint32_t x = 0; x < size; ++x) {
- emitCPInst(MI, CV->getOperand(0), KM, x, ExtFPLoad);
- }
- } else {
- // TODO: Do we really need to handle ConstantPointerNull?
- // What about BlockAddress, ConstantExpr and Undef?
- // How would these even be generated by a valid CL program?
- assert(0 && "Found a constant type that I don't know how to handle");
- }
-}
-