mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-29 07:53:33 +00:00
04c559569f
The AMDGPUIndirectAddressing pass was previously responsible for lowering private loads and stores to indirect addressing instructions. However, this pass was buggy and way too complicated. The only advantage it had over the new simplified code was that it saved one instruction per direct write to private memory. This optimization likely has a minimal impact on performance, and we may be able to duplicate it using some other transformation. For the private address space, we now: 1. Lower private loads/store to Register(Load|Store) instructions 2. Reserve part of the register file as 'private memory' 3. After regalloc lower the Register(Load|Store) instructions to MOV instructions that use indirect addressing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193179 91177308-0d34-0410-b5e6-96231b3b80d8
103 lines
3.4 KiB
C++
103 lines
3.4 KiB
C++
//===-- SIInstrInfo.h - SI Instruction Info Interface -----------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file
|
|
/// \brief Interface definition for SIInstrInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
#ifndef SIINSTRINFO_H
|
|
#define SIINSTRINFO_H
|
|
|
|
#include "AMDGPUInstrInfo.h"
|
|
#include "SIRegisterInfo.h"
|
|
|
|
namespace llvm {
|
|
|
|
class SIInstrInfo : public AMDGPUInstrInfo {
|
|
private:
|
|
const SIRegisterInfo RI;
|
|
|
|
public:
|
|
explicit SIInstrInfo(AMDGPUTargetMachine &tm);
|
|
|
|
const SIRegisterInfo &getRegisterInfo() const;
|
|
|
|
virtual void copyPhysReg(MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator MI, DebugLoc DL,
|
|
unsigned DestReg, unsigned SrcReg,
|
|
bool KillSrc) const;
|
|
|
|
unsigned commuteOpcode(unsigned Opcode) const;
|
|
|
|
virtual MachineInstr *commuteInstruction(MachineInstr *MI,
|
|
bool NewMI=false) const;
|
|
|
|
virtual unsigned getIEQOpcode() const { assert(!"Implement"); return 0;}
|
|
MachineInstr *buildMovInstr(MachineBasicBlock *MBB,
|
|
MachineBasicBlock::iterator I,
|
|
unsigned DstReg, unsigned SrcReg) const;
|
|
virtual bool isMov(unsigned Opcode) const;
|
|
|
|
virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const;
|
|
int isMIMG(uint16_t Opcode) const;
|
|
int isSMRD(uint16_t Opcode) const;
|
|
bool isVOP1(uint16_t Opcode) const;
|
|
bool isVOP2(uint16_t Opcode) const;
|
|
bool isVOP3(uint16_t Opcode) const;
|
|
bool isVOPC(uint16_t Opcode) const;
|
|
bool isInlineConstant(const MachineOperand &MO) const;
|
|
bool isLiteralConstant(const MachineOperand &MO) const;
|
|
|
|
virtual bool verifyInstruction(const MachineInstr *MI,
|
|
StringRef &ErrInfo) const;
|
|
virtual int getIndirectIndexBegin(const MachineFunction &MF) const;
|
|
|
|
virtual int getIndirectIndexEnd(const MachineFunction &MF) const;
|
|
|
|
virtual unsigned calculateIndirectAddress(unsigned RegIndex,
|
|
unsigned Channel) const;
|
|
|
|
virtual const TargetRegisterClass *getIndirectAddrRegClass() const;
|
|
|
|
virtual MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB,
|
|
MachineBasicBlock::iterator I,
|
|
unsigned ValueReg,
|
|
unsigned Address,
|
|
unsigned OffsetReg) const;
|
|
|
|
virtual MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB,
|
|
MachineBasicBlock::iterator I,
|
|
unsigned ValueReg,
|
|
unsigned Address,
|
|
unsigned OffsetReg) const;
|
|
};
|
|
|
|
namespace AMDGPU {
|
|
|
|
int getVOPe64(uint16_t Opcode);
|
|
int getCommuteRev(uint16_t Opcode);
|
|
int getCommuteOrig(uint16_t Opcode);
|
|
|
|
} // End namespace AMDGPU
|
|
|
|
} // End namespace llvm
|
|
|
|
namespace SIInstrFlags {
|
|
enum Flags {
|
|
// First 4 bits are the instruction encoding
|
|
VM_CNT = 1 << 0,
|
|
EXP_CNT = 1 << 1,
|
|
LGKM_CNT = 1 << 2
|
|
};
|
|
}
|
|
|
|
#endif //SIINSTRINFO_H
|