mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
R600: Remove AMDIL instruction and register definitions
Most of these are no longer used any more. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210915 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
df46288714
commit
61bc72e9ae
@ -48,7 +48,6 @@ extern char &SILowerI1CopiesID;
|
||||
|
||||
// Passes common to R600 and SI
|
||||
Pass *createAMDGPUStructurizeCFGPass();
|
||||
FunctionPass *createAMDGPUConvertToISAPass(TargetMachine &tm);
|
||||
FunctionPass *createAMDGPUISelDag(TargetMachine &tm);
|
||||
|
||||
/// \brief Creates an AMDGPU-specific Target Transformation Info pass.
|
||||
|
@ -7,8 +7,7 @@
|
||||
//
|
||||
//==-----------------------------------------------------------------------===//
|
||||
|
||||
// Include AMDIL TD files
|
||||
include "AMDILBase.td"
|
||||
include "llvm/Target/Target.td"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Subtarget Features
|
||||
@ -120,6 +119,10 @@ def AMDGPU : Target {
|
||||
let InstructionSet = AMDGPUInstrInfo;
|
||||
}
|
||||
|
||||
// Dummy Instruction itineraries for pseudo instructions
|
||||
def ALU_NULL : FuncUnit;
|
||||
def NullALU : InstrItinClass;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Predicate helper class
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,62 +0,0 @@
|
||||
//===-- AMDGPUConvertToISA.cpp - Lower AMDIL to HW ISA --------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
/// \file
|
||||
/// \brief This pass lowers AMDIL machine instructions to the appropriate
|
||||
/// hardware instructions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "AMDGPU.h"
|
||||
#include "AMDGPUInstrInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
class AMDGPUConvertToISAPass : public MachineFunctionPass {
|
||||
|
||||
private:
|
||||
static char ID;
|
||||
TargetMachine &TM;
|
||||
|
||||
public:
|
||||
AMDGPUConvertToISAPass(TargetMachine &tm) :
|
||||
MachineFunctionPass(ID), TM(tm) { }
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
|
||||
const char *getPassName() const override {return "AMDGPU Convert to ISA";}
|
||||
|
||||
};
|
||||
|
||||
} // End anonymous namespace
|
||||
|
||||
char AMDGPUConvertToISAPass::ID = 0;
|
||||
|
||||
FunctionPass *llvm::createAMDGPUConvertToISAPass(TargetMachine &tm) {
|
||||
return new AMDGPUConvertToISAPass(tm);
|
||||
}
|
||||
|
||||
bool AMDGPUConvertToISAPass::runOnMachineFunction(MachineFunction &MF) {
|
||||
const AMDGPUInstrInfo * TII =
|
||||
static_cast<const AMDGPUInstrInfo*>(TM.getInstrInfo());
|
||||
|
||||
for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
|
||||
BB != BB_E; ++BB) {
|
||||
MachineBasicBlock &MBB = *BB;
|
||||
for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
|
||||
I != E; ++I) {
|
||||
MachineInstr &MI = *I;
|
||||
TII->convertToISA(MI, MF, MBB.findDebugLoc(I));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
@ -325,28 +325,6 @@ int AMDGPUInstrInfo::getIndirectIndexEnd(const MachineFunction &MF) const {
|
||||
return getIndirectIndexBegin(MF) + Offset;
|
||||
}
|
||||
|
||||
|
||||
void AMDGPUInstrInfo::convertToISA(MachineInstr & MI, MachineFunction &MF,
|
||||
DebugLoc DL) const {
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
const AMDGPURegisterInfo & RI = getRegisterInfo();
|
||||
|
||||
for (unsigned i = 0; i < MI.getNumOperands(); i++) {
|
||||
MachineOperand &MO = MI.getOperand(i);
|
||||
// Convert dst regclass to one that is supported by the ISA
|
||||
if (MO.isReg() && MO.isDef()) {
|
||||
if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
|
||||
const TargetRegisterClass * oldRegClass = MRI.getRegClass(MO.getReg());
|
||||
const TargetRegisterClass * newRegClass = RI.getISARegClass(oldRegClass);
|
||||
|
||||
assert(newRegClass);
|
||||
|
||||
MRI.setRegClass(MO.getReg(), newRegClass);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int AMDGPUInstrInfo::getMaskedMIMGOp(uint16_t Opcode, unsigned Channels) const {
|
||||
switch (Channels) {
|
||||
default: return Opcode;
|
||||
|
@ -185,11 +185,6 @@ public:
|
||||
unsigned ValueReg, unsigned Address,
|
||||
unsigned OffsetReg) const = 0;
|
||||
|
||||
|
||||
/// \brief Convert the AMDIL MachineInstr to a supported ISA
|
||||
/// MachineInstr
|
||||
void convertToISA(MachineInstr & MI, MachineFunction &MF, DebugLoc DL) const;
|
||||
|
||||
/// \brief Build a MOV instruction.
|
||||
virtual MachineInstr *buildMovInstr(MachineBasicBlock *MBB,
|
||||
MachineBasicBlock::iterator I,
|
||||
|
@ -120,3 +120,22 @@ def AMDGPUmad_u24 : SDNode<"AMDGPUISD::MAD_U24", AMDGPUDTIntTernaryOp,
|
||||
def AMDGPUmad_i24 : SDNode<"AMDGPUISD::MAD_I24", AMDGPUDTIntTernaryOp,
|
||||
[]
|
||||
>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Flow Control Profile Types
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Branch instruction where second and third are basic blocks
|
||||
def SDTIL_BRCond : SDTypeProfile<0, 2, [
|
||||
SDTCisVT<0, OtherVT>
|
||||
]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Flow Control DAG Nodes
|
||||
//===----------------------------------------------------------------------===//
|
||||
def IL_brcond : SDNode<"AMDGPUISD::BRANCH_COND", SDTIL_BRCond, [SDNPHasChain]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Call/Return DAG Nodes
|
||||
//===----------------------------------------------------------------------===//
|
||||
def IL_retflag : SDNode<"AMDGPUISD::RET_FLAG", SDTNone,
|
||||
[SDNPHasChain, SDNPOptInGlue]>;
|
||||
|
@ -49,6 +49,11 @@ def u8imm : Operand<i8> {
|
||||
let PrintMethod = "printU8ImmOperand";
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Custom Operands
|
||||
//===--------------------------------------------------------------------===//
|
||||
def brtarget : Operand<OtherVT>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PatLeafs for floating-point comparisons
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -127,6 +132,21 @@ def COND_NULL : PatLeaf <
|
||||
// Load/Store Pattern Fragments
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def global_store : PatFrag<(ops node:$val, node:$ptr),
|
||||
(store node:$val, node:$ptr), [{
|
||||
return isGlobalStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
// Global address space loads
|
||||
def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
// Constant address space loads
|
||||
def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isConstantLoad(dyn_cast<LoadSDNode>(N), -1);
|
||||
}]>;
|
||||
|
||||
def az_extload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{
|
||||
LoadSDNode *L = cast<LoadSDNode>(N);
|
||||
return L->getExtensionType() == ISD::ZEXTLOAD ||
|
||||
|
@ -38,14 +38,6 @@ struct AMDGPURegisterInfo : public AMDGPUGenRegisterInfo {
|
||||
assert(!"Unimplemented"); return BitVector();
|
||||
}
|
||||
|
||||
/// \param RC is an AMDIL reg class.
|
||||
///
|
||||
/// \returns The ISA reg class that is equivalent to \p RC.
|
||||
virtual const TargetRegisterClass * getISARegClass(
|
||||
const TargetRegisterClass * RC) const {
|
||||
assert(!"Unimplemented"); return nullptr;
|
||||
}
|
||||
|
||||
virtual const TargetRegisterClass* getCFGStructurizerRegClass(MVT VT) const {
|
||||
assert(!"Unimplemented"); return nullptr;
|
||||
}
|
||||
|
@ -157,7 +157,6 @@ bool AMDGPUPassConfig::addInstSelector() {
|
||||
}
|
||||
|
||||
bool AMDGPUPassConfig::addPreRegAlloc() {
|
||||
addPass(createAMDGPUConvertToISAPass(*TM));
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
|
||||
if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS) {
|
||||
|
@ -1,25 +0,0 @@
|
||||
//===- AMDIL.td - AMDIL Target Machine -------------*- tablegen -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Target-independent interfaces which we are implementing
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
include "llvm/Target/Target.td"
|
||||
|
||||
// Dummy Instruction itineraries for pseudo instructions
|
||||
def ALU_NULL : FuncUnit;
|
||||
def NullALU : InstrItinClass;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Register File, Calling Conv, Instruction Descriptions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
include "AMDILRegisterInfo.td"
|
||||
include "AMDILInstrInfo.td"
|
||||
|
@ -1,145 +0,0 @@
|
||||
//===------------ AMDILInstrInfo.td - AMDIL Target ------*-tablegen-*------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//==-----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file describes the AMDIL instructions in TableGen format.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Custom Operands
|
||||
//===--------------------------------------------------------------------===//
|
||||
def brtarget : Operand<OtherVT>;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Custom Selection DAG Type Profiles
|
||||
//===--------------------------------------------------------------------===//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Generic Profile Types
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def SDTIL_GenBinaryOp : SDTypeProfile<1, 2, [
|
||||
SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>
|
||||
]>;
|
||||
def SDTIL_GenTernaryOp : SDTypeProfile<1, 3, [
|
||||
SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisSameAs<2, 3>
|
||||
]>;
|
||||
def SDTIL_GenVecBuild : SDTypeProfile<1, 1, [
|
||||
SDTCisEltOfVec<1, 0>
|
||||
]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Flow Control Profile Types
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Branch instruction where second and third are basic blocks
|
||||
def SDTIL_BRCond : SDTypeProfile<0, 2, [
|
||||
SDTCisVT<0, OtherVT>
|
||||
]>;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Custom Selection DAG Nodes
|
||||
//===--------------------------------------------------------------------===//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Flow Control DAG Nodes
|
||||
//===----------------------------------------------------------------------===//
|
||||
def IL_brcond : SDNode<"AMDGPUISD::BRANCH_COND", SDTIL_BRCond, [SDNPHasChain]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Call/Return DAG Nodes
|
||||
//===----------------------------------------------------------------------===//
|
||||
def IL_retflag : SDNode<"AMDGPUISD::RET_FLAG", SDTNone,
|
||||
[SDNPHasChain, SDNPOptInGlue]>;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Instructions
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Floating point math functions
|
||||
def IL_div_inf : SDNode<"AMDGPUISD::DIV_INF", SDTIL_GenBinaryOp>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Integer functions
|
||||
//===----------------------------------------------------------------------===//
|
||||
def IL_umul : SDNode<"AMDGPUISD::UMUL" , SDTIntBinOp,
|
||||
[SDNPCommutative, SDNPAssociative]>;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Custom Pattern DAG Nodes
|
||||
//===--------------------------------------------------------------------===//
|
||||
def global_store : PatFrag<(ops node:$val, node:$ptr),
|
||||
(store node:$val, node:$ptr), [{
|
||||
return isGlobalStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Load pattern fragments
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Global address space loads
|
||||
def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
// Constant address space loads
|
||||
def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isConstantLoad(dyn_cast<LoadSDNode>(N), -1);
|
||||
}]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Complex addressing mode patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
def ADDR : ComplexPattern<i32, 2, "SelectADDR", [], []>;
|
||||
def ADDRF : ComplexPattern<i32, 2, "SelectADDR", [frameindex], []>;
|
||||
def ADDR64 : ComplexPattern<i64, 2, "SelectADDR64", [], []>;
|
||||
def ADDR64F : ComplexPattern<i64, 2, "SelectADDR64", [frameindex], []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Instruction format classes
|
||||
//===----------------------------------------------------------------------===//
|
||||
class ILFormat<dag outs, dag ins, string asmstr, list<dag> pattern>
|
||||
: Instruction {
|
||||
|
||||
let Namespace = "AMDGPU";
|
||||
dag OutOperandList = outs;
|
||||
dag InOperandList = ins;
|
||||
let Pattern = pattern;
|
||||
let AsmString = !strconcat(asmstr, "\n");
|
||||
let isPseudo = 1;
|
||||
let Itinerary = NullALU;
|
||||
bit hasIEEEFlag = 0;
|
||||
bit hasZeroOpFlag = 0;
|
||||
let mayLoad = 0;
|
||||
let mayStore = 0;
|
||||
let hasSideEffects = 0;
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Multiclass Instruction formats
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Multiclass that handles branch instructions
|
||||
multiclass BranchConditional<SDNode Op, RegisterClass rci, RegisterClass rcf> {
|
||||
def _i32 : ILFormat<(outs),
|
||||
(ins brtarget:$target, rci:$src0),
|
||||
"; i32 Pseudo branch instruction",
|
||||
[(Op bb:$target, (i32 rci:$src0))]>;
|
||||
def _f32 : ILFormat<(outs),
|
||||
(ins brtarget:$target, rcf:$src0),
|
||||
"; f32 Pseudo branch instruction",
|
||||
[(Op bb:$target, (f32 rcf:$src0))]>;
|
||||
}
|
||||
|
||||
// Only scalar types should generate flow control
|
||||
multiclass BranchInstr<string name> {
|
||||
def _i32 : ILFormat<(outs), (ins GPRI32:$src),
|
||||
!strconcat(name, " $src"), []>;
|
||||
def _f32 : ILFormat<(outs), (ins GPRF32:$src),
|
||||
!strconcat(name, " $src"), []>;
|
||||
}
|
||||
// Only scalar types should generate flow control
|
||||
multiclass BranchInstr2<string name> {
|
||||
def _i32 : ILFormat<(outs), (ins GPRI32:$src0, GPRI32:$src1),
|
||||
!strconcat(name, " $src0, $src1"), []>;
|
||||
def _f32 : ILFormat<(outs), (ins GPRF32:$src0, GPRF32:$src1),
|
||||
!strconcat(name, " $src0, $src1"), []>;
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
//===- AMDILRegisterInfo.td - AMDIL Register defs ----------*- tablegen -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//==-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Declarations that describe the AMDIL register file
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
class AMDILReg<bits<16> num, string n> : Register<n> {
|
||||
field bits<16> Value;
|
||||
let Value = num;
|
||||
let Namespace = "AMDGPU";
|
||||
}
|
||||
|
||||
// We will start with 8 registers for each class before expanding to more
|
||||
// Since the swizzle is added based on the register class, we can leave it
|
||||
// off here and just specify different registers for different register classes
|
||||
def R1 : AMDILReg<1, "r1">, DwarfRegNum<[1]>;
|
||||
def R2 : AMDILReg<2, "r2">, DwarfRegNum<[2]>;
|
||||
def R3 : AMDILReg<3, "r3">, DwarfRegNum<[3]>;
|
||||
def R4 : AMDILReg<4, "r4">, DwarfRegNum<[4]>;
|
||||
def R5 : AMDILReg<5, "r5">, DwarfRegNum<[5]>;
|
||||
def R6 : AMDILReg<6, "r6">, DwarfRegNum<[6]>;
|
||||
def R7 : AMDILReg<7, "r7">, DwarfRegNum<[7]>;
|
||||
def R8 : AMDILReg<8, "r8">, DwarfRegNum<[8]>;
|
||||
def R9 : AMDILReg<9, "r9">, DwarfRegNum<[9]>;
|
||||
def R10 : AMDILReg<10, "r10">, DwarfRegNum<[10]>;
|
||||
def R11 : AMDILReg<11, "r11">, DwarfRegNum<[11]>;
|
||||
def R12 : AMDILReg<12, "r12">, DwarfRegNum<[12]>;
|
||||
def R13 : AMDILReg<13, "r13">, DwarfRegNum<[13]>;
|
||||
def R14 : AMDILReg<14, "r14">, DwarfRegNum<[14]>;
|
||||
def R15 : AMDILReg<15, "r15">, DwarfRegNum<[15]>;
|
||||
def R16 : AMDILReg<16, "r16">, DwarfRegNum<[16]>;
|
||||
def R17 : AMDILReg<17, "r17">, DwarfRegNum<[17]>;
|
||||
def R18 : AMDILReg<18, "r18">, DwarfRegNum<[18]>;
|
||||
def R19 : AMDILReg<19, "r19">, DwarfRegNum<[19]>;
|
||||
def R20 : AMDILReg<20, "r20">, DwarfRegNum<[20]>;
|
||||
|
||||
// All registers between 1000 and 1024 are reserved and cannot be used
|
||||
// unless commented in this section
|
||||
// r1021-r1025 are used to dynamically calculate the local/group/thread/region/region_local ID's
|
||||
// r1020 is used to hold the frame index for local arrays
|
||||
// r1019 is used to hold the dynamic stack allocation pointer
|
||||
// r1018 is used as a temporary register for handwritten code
|
||||
// r1017 is used as a temporary register for handwritten code
|
||||
// r1016 is used as a temporary register for load/store code
|
||||
// r1015 is used as a temporary register for data segment offset
|
||||
// r1014 is used as a temporary register for store code
|
||||
// r1013 is used as the section data pointer register
|
||||
// r1012-r1010 and r1001-r1008 are used for temporary I/O registers
|
||||
// r1009 is used as the frame pointer register
|
||||
// r999 is used as the mem register.
|
||||
// r998 is used as the return address register.
|
||||
//def R1025 : AMDILReg<1025, "r1025">, DwarfRegNum<[1025]>;
|
||||
//def R1024 : AMDILReg<1024, "r1024">, DwarfRegNum<[1024]>;
|
||||
//def R1023 : AMDILReg<1023, "r1023">, DwarfRegNum<[1023]>;
|
||||
//def R1022 : AMDILReg<1022, "r1022">, DwarfRegNum<[1022]>;
|
||||
//def R1021 : AMDILReg<1021, "r1021">, DwarfRegNum<[1021]>;
|
||||
//def R1020 : AMDILReg<1020, "r1020">, DwarfRegNum<[1020]>;
|
||||
def SP : AMDILReg<1019, "r1019">, DwarfRegNum<[1019]>;
|
||||
def T1 : AMDILReg<1018, "r1018">, DwarfRegNum<[1018]>;
|
||||
def T2 : AMDILReg<1017, "r1017">, DwarfRegNum<[1017]>;
|
||||
def T3 : AMDILReg<1016, "r1016">, DwarfRegNum<[1016]>;
|
||||
def T4 : AMDILReg<1015, "r1015">, DwarfRegNum<[1015]>;
|
||||
def T5 : AMDILReg<1014, "r1014">, DwarfRegNum<[1014]>;
|
||||
def SDP : AMDILReg<1013, "r1013">, DwarfRegNum<[1013]>;
|
||||
def R1012: AMDILReg<1012, "r1012">, DwarfRegNum<[1012]>;
|
||||
def R1011: AMDILReg<1011, "r1011">, DwarfRegNum<[1011]>;
|
||||
def R1010: AMDILReg<1010, "r1010">, DwarfRegNum<[1010]>;
|
||||
def DFP : AMDILReg<1009, "r1009">, DwarfRegNum<[1009]>;
|
||||
def R1008: AMDILReg<1008, "r1008">, DwarfRegNum<[1008]>;
|
||||
def R1007: AMDILReg<1007, "r1007">, DwarfRegNum<[1007]>;
|
||||
def R1006: AMDILReg<1006, "r1006">, DwarfRegNum<[1006]>;
|
||||
def R1005: AMDILReg<1005, "r1005">, DwarfRegNum<[1005]>;
|
||||
def R1004: AMDILReg<1004, "r1004">, DwarfRegNum<[1004]>;
|
||||
def R1003: AMDILReg<1003, "r1003">, DwarfRegNum<[1003]>;
|
||||
def R1002: AMDILReg<1002, "r1002">, DwarfRegNum<[1002]>;
|
||||
def R1001: AMDILReg<1001, "r1001">, DwarfRegNum<[1001]>;
|
||||
def MEM : AMDILReg<999, "mem">, DwarfRegNum<[999]>;
|
||||
def RA : AMDILReg<998, "r998">, DwarfRegNum<[998]>;
|
||||
def FP : AMDILReg<997, "r997">, DwarfRegNum<[997]>;
|
||||
def GPRI16 : RegisterClass<"AMDGPU", [i16], 16,
|
||||
(add (sequence "R%u", 1, 20), RA, SP, T1, T2, T3, T4, T5, SDP, R1010, R1011, R1001, R1002, R1003, R1004, R1005, R1006, R1007, R1008, MEM, R1012)> {
|
||||
let AltOrders = [(add (sequence "R%u", 1, 20))];
|
||||
let AltOrderSelect = [{
|
||||
return 1;
|
||||
}];
|
||||
}
|
||||
def GPRI32 : RegisterClass<"AMDGPU", [i32], 32,
|
||||
(add (sequence "R%u", 1, 20), RA, SP, T1, T2, T3, T4, T5, SDP, R1010, R1011, R1001, R1002, R1003, R1004, R1005, R1006, R1007, R1008, MEM, R1012)> {
|
||||
let AltOrders = [(add (sequence "R%u", 1, 20))];
|
||||
let AltOrderSelect = [{
|
||||
return 1;
|
||||
}];
|
||||
}
|
||||
def GPRF32 : RegisterClass<"AMDGPU", [f32], 32,
|
||||
(add (sequence "R%u", 1, 20), RA, SP, T1, T2, T3, T4, T5, SDP, R1010, R1011, R1001, R1002, R1003, R1004, R1005, R1006, R1007, R1008, MEM, R1012)> {
|
||||
let AltOrders = [(add (sequence "R%u", 1, 20))];
|
||||
let AltOrderSelect = [{
|
||||
return 1;
|
||||
}];
|
||||
}
|
@ -24,7 +24,6 @@ add_llvm_target(R600CodeGen
|
||||
AMDGPUTargetMachine.cpp
|
||||
AMDGPUTargetTransformInfo.cpp
|
||||
AMDGPUISelLowering.cpp
|
||||
AMDGPUConvertToISA.cpp
|
||||
AMDGPUInstrInfo.cpp
|
||||
AMDGPURegisterInfo.cpp
|
||||
R600ClauseMergePass.cpp
|
||||
|
@ -767,16 +767,6 @@ R600InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
|
||||
return true;
|
||||
}
|
||||
|
||||
int R600InstrInfo::getBranchInstr(const MachineOperand &op) const {
|
||||
const MachineInstr *MI = op.getParent();
|
||||
|
||||
switch (MI->getDesc().OpInfo->RegClass) {
|
||||
default: // FIXME: fallthrough??
|
||||
case AMDGPU::GPRI32RegClassID: return AMDGPU::BRANCH_COND_i32;
|
||||
case AMDGPU::GPRF32RegClassID: return AMDGPU::BRANCH_COND_f32;
|
||||
};
|
||||
}
|
||||
|
||||
static
|
||||
MachineBasicBlock::iterator FindLastAluClause(MachineBasicBlock &MBB) {
|
||||
for (MachineBasicBlock::reverse_iterator It = MBB.rbegin(), E = MBB.rend();
|
||||
|
@ -33,7 +33,6 @@ namespace llvm {
|
||||
private:
|
||||
const R600RegisterInfo RI;
|
||||
|
||||
int getBranchInstr(const MachineOperand &op) const;
|
||||
std::vector<std::pair<int, unsigned> >
|
||||
ExtractSrcs(MachineInstr *MI, const DenseMap<unsigned, unsigned> &PV, unsigned &ConstCount) const;
|
||||
|
||||
|
@ -1265,13 +1265,6 @@ let Predicates = [isR600] in {
|
||||
defm R600_ : RegisterLoadStore <R600_Reg32, FRAMEri, ADDRIndirect>;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Branch Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def IF_PREDICATE_SET : ILFormat<(outs), (ins GPRI32:$src),
|
||||
"IF_PREDICATE_SET $src", []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Pseudo instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -1345,15 +1338,6 @@ def TXD_SHADOW: InstR600 <
|
||||
} // End isPseudo = 1
|
||||
} // End usesCustomInserter = 1
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Return instruction
|
||||
//===---------------------------------------------------------------------===//
|
||||
let isTerminator = 1, isReturn = 1, hasCtrlDep = 1,
|
||||
usesCustomInserter = 1 in {
|
||||
def RETURN : ILFormat<(outs), (ins variable_ops),
|
||||
"RETURN", [(IL_retflag)]>;
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Constant Buffer Addressing Support
|
||||
@ -1480,11 +1464,52 @@ let Inst{63-32} = Word1;
|
||||
let VTXInst = 1;
|
||||
}
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Flow and Program control Instructions
|
||||
//===---------------------------------------------------------------------===//
|
||||
class ILFormat<dag outs, dag ins, string asmstr, list<dag> pattern>
|
||||
: Instruction {
|
||||
|
||||
let Namespace = "AMDGPU";
|
||||
dag OutOperandList = outs;
|
||||
dag InOperandList = ins;
|
||||
let Pattern = pattern;
|
||||
let AsmString = !strconcat(asmstr, "\n");
|
||||
let isPseudo = 1;
|
||||
let Itinerary = NullALU;
|
||||
bit hasIEEEFlag = 0;
|
||||
bit hasZeroOpFlag = 0;
|
||||
let mayLoad = 0;
|
||||
let mayStore = 0;
|
||||
let hasSideEffects = 0;
|
||||
}
|
||||
|
||||
multiclass BranchConditional<SDNode Op, RegisterClass rci, RegisterClass rcf> {
|
||||
def _i32 : ILFormat<(outs),
|
||||
(ins brtarget:$target, rci:$src0),
|
||||
"; i32 Pseudo branch instruction",
|
||||
[(Op bb:$target, (i32 rci:$src0))]>;
|
||||
def _f32 : ILFormat<(outs),
|
||||
(ins brtarget:$target, rcf:$src0),
|
||||
"; f32 Pseudo branch instruction",
|
||||
[(Op bb:$target, (f32 rcf:$src0))]>;
|
||||
}
|
||||
|
||||
// Only scalar types should generate flow control
|
||||
multiclass BranchInstr<string name> {
|
||||
def _i32 : ILFormat<(outs), (ins R600_Reg32:$src),
|
||||
!strconcat(name, " $src"), []>;
|
||||
def _f32 : ILFormat<(outs), (ins R600_Reg32:$src),
|
||||
!strconcat(name, " $src"), []>;
|
||||
}
|
||||
// Only scalar types should generate flow control
|
||||
multiclass BranchInstr2<string name> {
|
||||
def _i32 : ILFormat<(outs), (ins R600_Reg32:$src0, R600_Reg32:$src1),
|
||||
!strconcat(name, " $src0, $src1"), []>;
|
||||
def _f32 : ILFormat<(outs), (ins R600_Reg32:$src0, R600_Reg32:$src1),
|
||||
!strconcat(name, " $src0, $src1"), []>;
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Instructions support
|
||||
//===--------------------------------------------------------------------===//
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Custom Inserter for Branches and returns, this eventually will be a
|
||||
// separate pass
|
||||
@ -1497,13 +1522,22 @@ let isTerminator = 1, usesCustomInserter = 1, isBranch = 1, isBarrier = 1 in {
|
||||
}
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Flow and Program control Instructions
|
||||
// Return instruction
|
||||
//===---------------------------------------------------------------------===//
|
||||
let isTerminator = 1, isReturn = 1, hasCtrlDep = 1,
|
||||
usesCustomInserter = 1 in {
|
||||
def RETURN : ILFormat<(outs), (ins variable_ops),
|
||||
"RETURN", [(IL_retflag)]>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Branch Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def IF_PREDICATE_SET : ILFormat<(outs), (ins R600_Reg32:$src),
|
||||
"IF_PREDICATE_SET $src", []>;
|
||||
|
||||
let isTerminator=1 in {
|
||||
def SWITCH : ILFormat< (outs), (ins GPRI32:$src),
|
||||
!strconcat("SWITCH", " $src"), []>;
|
||||
def CASE : ILFormat< (outs), (ins GPRI32:$src),
|
||||
!strconcat("CASE", " $src"), []>;
|
||||
def BREAK : ILFormat< (outs), (ins),
|
||||
"BREAK", []>;
|
||||
def CONTINUE : ILFormat< (outs), (ins),
|
||||
|
@ -54,16 +54,6 @@ BitVector R600RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
R600RegisterInfo::getISARegClass(const TargetRegisterClass * rc) const {
|
||||
switch (rc->getID()) {
|
||||
case AMDGPU::GPRF32RegClassID:
|
||||
case AMDGPU::GPRI32RegClassID:
|
||||
return &AMDGPU::R600_Reg32RegClass;
|
||||
default: return rc;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned R600RegisterInfo::getHWRegChan(unsigned reg) const {
|
||||
return this->getEncodingValue(reg) >> HW_CHAN_SHIFT;
|
||||
}
|
||||
|
@ -28,12 +28,6 @@ struct R600RegisterInfo : public AMDGPURegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const override;
|
||||
|
||||
/// \param RC is an AMDIL reg class.
|
||||
///
|
||||
/// \returns the R600 reg class that is equivalent to \p RC.
|
||||
const TargetRegisterClass *getISARegClass(
|
||||
const TargetRegisterClass *RC) const override;
|
||||
|
||||
/// \brief get the HW encoding for a register's channel.
|
||||
unsigned getHWRegChan(unsigned reg) const;
|
||||
|
||||
|
@ -1659,7 +1659,7 @@ def : Pat <
|
||||
|
||||
/* int_SI_vs_load_input */
|
||||
def : Pat<
|
||||
(SIload_input v4i32:$tlst, IMM12bit:$attr_offset, i32:$buf_idx_vgpr),
|
||||
(SIload_input v4i32:$tlst, imm:$attr_offset, i32:$buf_idx_vgpr),
|
||||
(BUFFER_LOAD_FORMAT_XYZW_IDXEN $tlst, $buf_idx_vgpr, imm:$attr_offset, 0, 0, 0, 0)
|
||||
>;
|
||||
|
||||
|
@ -37,15 +37,6 @@ unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
return RC->getNumRegs();
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
SIRegisterInfo::getISARegClass(const TargetRegisterClass * rc) const {
|
||||
switch (rc->getID()) {
|
||||
case AMDGPU::GPRF32RegClassID:
|
||||
return &AMDGPU::VReg_32RegClass;
|
||||
default: return rc;
|
||||
}
|
||||
}
|
||||
|
||||
const TargetRegisterClass * SIRegisterInfo::getCFGStructurizerRegClass(
|
||||
MVT VT) const {
|
||||
switch(VT.SimpleTy) {
|
||||
|
@ -29,12 +29,6 @@ struct SIRegisterInfo : public AMDGPURegisterInfo {
|
||||
unsigned getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const override;
|
||||
|
||||
/// \param RC is an AMDIL reg class.
|
||||
///
|
||||
/// \returns the SI register class that is equivalent to \p RC.
|
||||
const TargetRegisterClass *
|
||||
getISARegClass(const TargetRegisterClass *RC) const override;
|
||||
|
||||
/// \brief get the register class of the specified type to use in the
|
||||
/// CFGStructurizer
|
||||
const TargetRegisterClass * getCFGStructurizerRegClass(MVT VT) const override;
|
||||
|
Loading…
x
Reference in New Issue
Block a user