mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
AMDGPU/SI: Add hsa code object directives
Reviewers: arsenm Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10757 llvm-svn: 240831
This commit is contained in:
parent
a87fcfe4a1
commit
daced4c4cc
@ -92,3 +92,29 @@ strings:
|
||||
v_mul_i32_i24 v1, v2, v3
|
||||
v_mul_i32_i24_e32 v1, v2, v3
|
||||
v_mul_i32_i24_e64 v1, v2, v3
|
||||
|
||||
Assembler Directives
|
||||
--------------------
|
||||
|
||||
.hsa_code_object_version major, minor
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
*major* and *minor* are integers that specify the version of the HSA code
|
||||
object that will be generated by the assembler. This value will be stored
|
||||
in an entry of the .note section.
|
||||
|
||||
.hsa_code_object_isa [major, minor, stepping, vendor, arch]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
*major*, *minor*, and *stepping* are all integers that describe the instruction
|
||||
set architecture (ISA) version of the assembly program.
|
||||
|
||||
*vendor* and *arch* are quoted strings. *vendor* should always be equal to
|
||||
"AMD" and *arch* should always be equal to "AMDGPU".
|
||||
|
||||
If no arguments are specified, then the assembler will derive the ISA version,
|
||||
*vendor*, and *arch* from the value of the -mcpu option that is passed to the
|
||||
assembler.
|
||||
|
||||
ISA version, *vendor*, and *arch* will all be stored in a single entry of the
|
||||
.note section.
|
||||
|
@ -141,6 +141,19 @@ class SubtargetFeatureLDSBankCount <int Value> : SubtargetFeature <
|
||||
def FeatureLDSBankCount16 : SubtargetFeatureLDSBankCount<16>;
|
||||
def FeatureLDSBankCount32 : SubtargetFeatureLDSBankCount<32>;
|
||||
|
||||
class SubtargetFeatureISAVersion <int Major, int Minor, int Stepping>
|
||||
: SubtargetFeature <
|
||||
"isaver"#Major#"."#Minor#"."#Stepping,
|
||||
"IsaVersion",
|
||||
"ISAVersion"#Major#"_"#Minor#"_"#Stepping,
|
||||
"Instruction set version number"
|
||||
>;
|
||||
|
||||
def FeatureISAVersion7_0_0 : SubtargetFeatureISAVersion <7,0,0>;
|
||||
def FeatureISAVersion7_0_1 : SubtargetFeatureISAVersion <7,0,1>;
|
||||
def FeatureISAVersion8_0_0 : SubtargetFeatureISAVersion <8,0,0>;
|
||||
def FeatureISAVersion8_0_1 : SubtargetFeatureISAVersion <8,0,1>;
|
||||
|
||||
class SubtargetFeatureLocalMemorySize <int Value> : SubtargetFeature<
|
||||
"localmemorysize"#Value,
|
||||
"LocalMemorySize",
|
||||
|
@ -17,7 +17,9 @@
|
||||
//
|
||||
|
||||
#include "AMDGPUAsmPrinter.h"
|
||||
#include "MCTargetDesc/AMDGPUTargetStreamer.h"
|
||||
#include "InstPrinter/AMDGPUInstPrinter.h"
|
||||
#include "Utils/AMDGPUBaseInfo.h"
|
||||
#include "AMDGPU.h"
|
||||
#include "AMDKernelCodeT.h"
|
||||
#include "AMDGPUSubtarget.h"
|
||||
@ -127,6 +129,13 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
getSIProgramInfo(KernelInfo, MF);
|
||||
EmitProgramInfoSI(MF, KernelInfo);
|
||||
}
|
||||
// Emit directives
|
||||
AMDGPUTargetStreamer *TS =
|
||||
static_cast<AMDGPUTargetStreamer *>(OutStreamer->getTargetStreamer());
|
||||
TS->EmitDirectiveHSACodeObjectVersion(1, 0);
|
||||
AMDGPU::IsaVersion ISA = STM.getIsaVersion();
|
||||
TS->EmitDirectiveHSACodeObjectISA(ISA.Major, ISA.Minor, ISA.Stepping,
|
||||
"AMD", "AMDGPU");
|
||||
} else {
|
||||
EmitProgramInfoR600(MF);
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ AMDGPUSubtarget::AMDGPUSubtarget(const Triple &TT, StringRef GPU, StringRef FS,
|
||||
WavefrontSize(0), CFALUBug(false), LocalMemorySize(0),
|
||||
EnableVGPRSpilling(false), SGPRInitBug(false), IsGCN(false),
|
||||
GCN1Encoding(false), GCN3Encoding(false), CIInsts(false), LDSBankCount(0),
|
||||
IsaVersion(ISAVersion0_0_0),
|
||||
FrameLowering(TargetFrameLowering::StackGrowsUp,
|
||||
64 * 16, // Maximum stack alignment (long16)
|
||||
0),
|
||||
@ -109,6 +110,10 @@ unsigned AMDGPUSubtarget::getAmdKernelCodeChipID() const {
|
||||
}
|
||||
}
|
||||
|
||||
AMDGPU::IsaVersion AMDGPUSubtarget::getIsaVersion() const {
|
||||
return AMDGPU::getIsaVersion(getFeatureBits());
|
||||
}
|
||||
|
||||
bool AMDGPUSubtarget::isVGPRSpillingEnabled(
|
||||
const SIMachineFunctionInfo *MFI) const {
|
||||
return MFI->getShaderType() == ShaderType::COMPUTE || EnableVGPRSpilling;
|
||||
@ -131,3 +136,4 @@ void AMDGPUSubtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
|
||||
Policy.OnlyBottomUp = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,8 @@
|
||||
#include "AMDGPUIntrinsicInfo.h"
|
||||
#include "AMDGPUSubtarget.h"
|
||||
#include "R600ISelLowering.h"
|
||||
#include "AMDKernelCodeT.h"
|
||||
#include "Utils/AMDGPUBaseInfo.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
@ -48,6 +50,14 @@ public:
|
||||
FIXED_SGPR_COUNT_FOR_INIT_BUG = 80
|
||||
};
|
||||
|
||||
enum {
|
||||
ISAVersion0_0_0,
|
||||
ISAVersion7_0_0,
|
||||
ISAVersion7_0_1,
|
||||
ISAVersion8_0_0,
|
||||
ISAVersion8_0_1
|
||||
};
|
||||
|
||||
private:
|
||||
std::string DevName;
|
||||
bool Is64bit;
|
||||
@ -77,6 +87,7 @@ private:
|
||||
bool CIInsts;
|
||||
bool FeatureDisable;
|
||||
int LDSBankCount;
|
||||
unsigned IsaVersion;
|
||||
|
||||
AMDGPUFrameLowering FrameLowering;
|
||||
std::unique_ptr<AMDGPUTargetLowering> TLInfo;
|
||||
@ -236,6 +247,8 @@ public:
|
||||
|
||||
unsigned getAmdKernelCodeChipID() const;
|
||||
|
||||
AMDGPU::IsaVersion getIsaVersion() const;
|
||||
|
||||
bool enableMachineScheduler() const override {
|
||||
return true;
|
||||
}
|
||||
|
@ -8,6 +8,8 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
||||
#include "MCTargetDesc/AMDGPUTargetStreamer.h"
|
||||
#include "Utils/AMDGPUBaseInfo.h"
|
||||
#include "SIDefines.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
@ -314,6 +316,11 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
|
||||
|
||||
/// }
|
||||
|
||||
private:
|
||||
bool ParseDirectiveMajorMinor(uint32_t &Major, uint32_t &Minor);
|
||||
bool ParseDirectiveHSACodeObjectVersion();
|
||||
bool ParseDirectiveHSACodeObjectISA();
|
||||
|
||||
public:
|
||||
AMDGPUAsmParser(MCSubtargetInfo &STI, MCAsmParser &_Parser,
|
||||
const MCInstrInfo &MII,
|
||||
@ -329,6 +336,11 @@ public:
|
||||
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
|
||||
}
|
||||
|
||||
AMDGPUTargetStreamer &getTargetStreamer() {
|
||||
MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
|
||||
return static_cast<AMDGPUTargetStreamer &>(TS);
|
||||
}
|
||||
|
||||
unsigned getForcedEncodingSize() const {
|
||||
return ForcedEncodingSize;
|
||||
}
|
||||
@ -581,7 +593,106 @@ bool AMDGPUAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
llvm_unreachable("Implement any new match types added!");
|
||||
}
|
||||
|
||||
bool AMDGPUAsmParser::ParseDirectiveMajorMinor(uint32_t &Major,
|
||||
uint32_t &Minor) {
|
||||
if (getLexer().isNot(AsmToken::Integer))
|
||||
return TokError("invalid major version");
|
||||
|
||||
Major = getLexer().getTok().getIntVal();
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return TokError("minor version number required, comma expected");
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Integer))
|
||||
return TokError("invalid minor version");
|
||||
|
||||
Minor = getLexer().getTok().getIntVal();
|
||||
Lex();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AMDGPUAsmParser::ParseDirectiveHSACodeObjectVersion() {
|
||||
|
||||
uint32_t Major;
|
||||
uint32_t Minor;
|
||||
|
||||
if (ParseDirectiveMajorMinor(Major, Minor))
|
||||
return true;
|
||||
|
||||
getTargetStreamer().EmitDirectiveHSACodeObjectVersion(Major, Minor);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AMDGPUAsmParser::ParseDirectiveHSACodeObjectISA() {
|
||||
|
||||
uint32_t Major;
|
||||
uint32_t Minor;
|
||||
uint32_t Stepping;
|
||||
StringRef VendorName;
|
||||
StringRef ArchName;
|
||||
|
||||
// If this directive has no arguments, then use the ISA version for the
|
||||
// targeted GPU.
|
||||
if (getLexer().is(AsmToken::EndOfStatement)) {
|
||||
AMDGPU::IsaVersion Isa = AMDGPU::getIsaVersion(STI.getFeatureBits());
|
||||
getTargetStreamer().EmitDirectiveHSACodeObjectISA(Isa.Major, Isa.Minor,
|
||||
Isa.Stepping,
|
||||
"AMD", "AMDGPU");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (ParseDirectiveMajorMinor(Major, Minor))
|
||||
return true;
|
||||
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return TokError("stepping version number required, comma expected");
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Integer))
|
||||
return TokError("invalid stepping version");
|
||||
|
||||
Stepping = getLexer().getTok().getIntVal();
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return TokError("vendor name required, comma expected");
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::String))
|
||||
return TokError("invalid vendor name");
|
||||
|
||||
VendorName = getLexer().getTok().getStringContents();
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return TokError("arch name required, comma expected");
|
||||
Lex();
|
||||
|
||||
if (getLexer().isNot(AsmToken::String))
|
||||
return TokError("invalid arch name");
|
||||
|
||||
ArchName = getLexer().getTok().getStringContents();
|
||||
Lex();
|
||||
|
||||
getTargetStreamer().EmitDirectiveHSACodeObjectISA(Major, Minor, Stepping,
|
||||
VendorName, ArchName);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AMDGPUAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
StringRef IDVal = DirectiveID.getString();
|
||||
|
||||
if (IDVal == ".hsa_code_object_version")
|
||||
return ParseDirectiveHSACodeObjectVersion();
|
||||
|
||||
if (IDVal == ".hsa_code_object_isa")
|
||||
return ParseDirectiveHSACodeObjectISA();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -19,5 +19,5 @@
|
||||
type = Library
|
||||
name = AMDGPUAsmParser
|
||||
parent = AMDGPU
|
||||
required_libraries = MC MCParser AMDGPUDesc AMDGPUInfo Support
|
||||
required_libraries = MC MCParser AMDGPUDesc AMDGPUInfo AMDGPUUtils Support
|
||||
add_to_library_groups = AMDGPU
|
||||
|
@ -62,3 +62,4 @@ add_subdirectory(AsmParser)
|
||||
add_subdirectory(InstPrinter)
|
||||
add_subdirectory(TargetInfo)
|
||||
add_subdirectory(MCTargetDesc)
|
||||
add_subdirectory(Utils)
|
||||
|
@ -16,7 +16,7 @@
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[common]
|
||||
subdirectories = AsmParser InstPrinter MCTargetDesc TargetInfo
|
||||
subdirectories = AsmParser InstPrinter MCTargetDesc TargetInfo Utils
|
||||
|
||||
[component_0]
|
||||
type = TargetGroup
|
||||
@ -29,5 +29,5 @@ has_asmprinter = 1
|
||||
type = Library
|
||||
name = AMDGPUCodeGen
|
||||
parent = AMDGPU
|
||||
required_libraries = Analysis AsmPrinter CodeGen Core IPO MC AMDGPUAsmParser AMDGPUAsmPrinter AMDGPUDesc AMDGPUInfo Scalar SelectionDAG Support Target TransformUtils
|
||||
required_libraries = Analysis AsmPrinter CodeGen Core IPO MC AMDGPUAsmParser AMDGPUAsmPrinter AMDGPUDesc AMDGPUInfo AMDGPUUtils Scalar SelectionDAG Support Target TransformUtils
|
||||
add_to_library_groups = AMDGPU
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#include "AMDGPUMCTargetDesc.h"
|
||||
#include "AMDGPUMCAsmInfo.h"
|
||||
#include "AMDGPUTargetStreamer.h"
|
||||
#include "InstPrinter/AMDGPUInstPrinter.h"
|
||||
#include "SIDefines.h"
|
||||
#include "llvm/MC/MCCodeGenInfo.h"
|
||||
@ -72,6 +73,19 @@ static MCInstPrinter *createAMDGPUMCInstPrinter(const Triple &T,
|
||||
return new AMDGPUInstPrinter(MAI, MII, MRI);
|
||||
}
|
||||
|
||||
static MCTargetStreamer *createAMDGPUAsmTargetStreamer(MCStreamer &S,
|
||||
formatted_raw_ostream &OS,
|
||||
MCInstPrinter *InstPrint,
|
||||
bool isVerboseAsm) {
|
||||
return new AMDGPUTargetAsmStreamer(S, OS);
|
||||
}
|
||||
|
||||
static MCTargetStreamer * createAMDGPUObjectTargetStreamer(
|
||||
MCStreamer &S,
|
||||
const MCSubtargetInfo &STI) {
|
||||
return new AMDGPUTargetELFStreamer(S);
|
||||
}
|
||||
|
||||
extern "C" void LLVMInitializeAMDGPUTargetMC() {
|
||||
for (Target *T : {&TheAMDGPUTarget, &TheGCNTarget}) {
|
||||
RegisterMCAsmInfo<AMDGPUMCAsmInfo> X(*T);
|
||||
@ -84,7 +98,15 @@ extern "C" void LLVMInitializeAMDGPUTargetMC() {
|
||||
TargetRegistry::RegisterMCAsmBackend(*T, createAMDGPUAsmBackend);
|
||||
}
|
||||
|
||||
// R600 specific registration
|
||||
TargetRegistry::RegisterMCCodeEmitter(TheAMDGPUTarget,
|
||||
createR600MCCodeEmitter);
|
||||
|
||||
// GCN specific registration
|
||||
TargetRegistry::RegisterMCCodeEmitter(TheGCNTarget, createSIMCCodeEmitter);
|
||||
|
||||
TargetRegistry::RegisterAsmTargetStreamer(TheGCNTarget,
|
||||
createAMDGPUAsmTargetStreamer);
|
||||
TargetRegistry::RegisterObjectTargetStreamer(TheGCNTarget,
|
||||
createAMDGPUObjectTargetStreamer);
|
||||
}
|
||||
|
118
lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
Normal file
118
lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
Normal file
@ -0,0 +1,118 @@
|
||||
//===-- AMDGPUTargetStreamer.cpp - Mips Target Streamer Methods -----------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file provides AMDGPU specific target streamer methods.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "AMDGPUTargetStreamer.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCELFStreamer.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
AMDGPUTargetStreamer::AMDGPUTargetStreamer(MCStreamer &S)
|
||||
: MCTargetStreamer(S) { }
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AMDGPUTargetAsmStreamer
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
AMDGPUTargetAsmStreamer::AMDGPUTargetAsmStreamer(MCStreamer &S,
|
||||
formatted_raw_ostream &OS)
|
||||
: AMDGPUTargetStreamer(S), OS(OS) { }
|
||||
|
||||
void
|
||||
AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
|
||||
uint32_t Minor) {
|
||||
OS << "\t.hsa_code_object_version " <<
|
||||
Twine(Major) << "," << Twine(Minor) << '\n';
|
||||
}
|
||||
|
||||
void
|
||||
AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
|
||||
uint32_t Minor,
|
||||
uint32_t Stepping,
|
||||
StringRef VendorName,
|
||||
StringRef ArchName) {
|
||||
OS << "\t.hsa_code_object_isa " <<
|
||||
Twine(Major) << "," << Twine(Minor) << "," << Twine(Stepping) <<
|
||||
",\"" << VendorName << "\",\"" << ArchName << "\"\n";
|
||||
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AMDGPUTargetELFStreamer
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
AMDGPUTargetELFStreamer::AMDGPUTargetELFStreamer(MCStreamer &S)
|
||||
: AMDGPUTargetStreamer(S), Streamer(S) { }
|
||||
|
||||
MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
|
||||
return static_cast<MCELFStreamer &>(Streamer);
|
||||
}
|
||||
|
||||
void
|
||||
AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
|
||||
uint32_t Minor) {
|
||||
MCStreamer &OS = getStreamer();
|
||||
MCSectionELF *Note = OS.getContext().getELFSection(".note", ELF::SHT_NOTE, 0);
|
||||
|
||||
unsigned NameSZ = 4;
|
||||
|
||||
OS.PushSection();
|
||||
OS.SwitchSection(Note);
|
||||
OS.EmitIntValue(NameSZ, 4); // namesz
|
||||
OS.EmitIntValue(8, 4); // descz
|
||||
OS.EmitIntValue(NT_AMDGPU_HSA_CODE_OBJECT_VERSION, 4); // type
|
||||
OS.EmitBytes(StringRef("AMD", NameSZ)); // name
|
||||
OS.EmitIntValue(Major, 4); // desc
|
||||
OS.EmitIntValue(Minor, 4);
|
||||
OS.EmitValueToAlignment(4);
|
||||
OS.PopSection();
|
||||
}
|
||||
|
||||
void
|
||||
AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
|
||||
uint32_t Minor,
|
||||
uint32_t Stepping,
|
||||
StringRef VendorName,
|
||||
StringRef ArchName) {
|
||||
MCStreamer &OS = getStreamer();
|
||||
MCSectionELF *Note = OS.getContext().getELFSection(".note", ELF::SHT_NOTE, 0);
|
||||
|
||||
unsigned NameSZ = 4;
|
||||
uint16_t VendorNameSize = VendorName.size() + 1;
|
||||
uint16_t ArchNameSize = ArchName.size() + 1;
|
||||
unsigned DescSZ = sizeof(VendorNameSize) + sizeof(ArchNameSize) +
|
||||
sizeof(Major) + sizeof(Minor) + sizeof(Stepping) +
|
||||
VendorNameSize + ArchNameSize;
|
||||
|
||||
OS.PushSection();
|
||||
OS.SwitchSection(Note);
|
||||
OS.EmitIntValue(NameSZ, 4); // namesz
|
||||
OS.EmitIntValue(DescSZ, 4); // descsz
|
||||
OS.EmitIntValue(NT_AMDGPU_HSA_ISA, 4); // type
|
||||
OS.EmitBytes(StringRef("AMD", 4)); // name
|
||||
OS.EmitIntValue(VendorNameSize, 2); // desc
|
||||
OS.EmitIntValue(ArchNameSize, 2);
|
||||
OS.EmitIntValue(Major, 4);
|
||||
OS.EmitIntValue(Minor, 4);
|
||||
OS.EmitIntValue(Stepping, 4);
|
||||
OS.EmitBytes(VendorName);
|
||||
OS.EmitIntValue(0, 1); // NULL terminate VendorName
|
||||
OS.EmitBytes(ArchName);
|
||||
OS.EmitIntValue(0, 1); // NULL terminte ArchName
|
||||
OS.EmitValueToAlignment(4);
|
||||
OS.PopSection();
|
||||
}
|
70
lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
Normal file
70
lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
Normal file
@ -0,0 +1,70 @@
|
||||
//===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- C++ -*--===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
namespace llvm {
|
||||
|
||||
class MCELFStreamer;
|
||||
|
||||
class AMDGPUTargetStreamer : public MCTargetStreamer {
|
||||
public:
|
||||
AMDGPUTargetStreamer(MCStreamer &S);
|
||||
virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
|
||||
uint32_t Minor) = 0;
|
||||
|
||||
virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
|
||||
uint32_t Stepping,
|
||||
StringRef VendorName,
|
||||
StringRef ArchName) = 0;
|
||||
};
|
||||
|
||||
class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer {
|
||||
formatted_raw_ostream &OS;
|
||||
public:
|
||||
AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
|
||||
void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
|
||||
uint32_t Minor) override;
|
||||
|
||||
void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
|
||||
uint32_t Stepping, StringRef VendorName,
|
||||
StringRef ArchName) override;
|
||||
};
|
||||
|
||||
class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer {
|
||||
|
||||
enum NoteType {
|
||||
NT_AMDGPU_HSA_CODE_OBJECT_VERSION = 1,
|
||||
NT_AMDGPU_HSA_HSAIL = 2,
|
||||
NT_AMDGPU_HSA_ISA = 3,
|
||||
NT_AMDGPU_HSA_PRODUCER = 4,
|
||||
NT_AMDGPU_HSA_PRODUCER_OPTIONS = 5,
|
||||
NT_AMDGPU_HSA_EXTENSION = 6,
|
||||
NT_AMDGPU_HSA_HLDEBUG_DEBUG = 101,
|
||||
NT_AMDGPU_HSA_HLDEBUG_TARGET = 102
|
||||
};
|
||||
|
||||
MCStreamer &Streamer;
|
||||
|
||||
public:
|
||||
AMDGPUTargetELFStreamer(MCStreamer &S);
|
||||
|
||||
MCELFStreamer &getStreamer();
|
||||
|
||||
void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
|
||||
uint32_t Minor) override;
|
||||
|
||||
void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
|
||||
uint32_t Stepping, StringRef VendorName,
|
||||
StringRef ArchName) override;
|
||||
};
|
||||
|
||||
}
|
@ -5,6 +5,7 @@ add_llvm_library(LLVMAMDGPUDesc
|
||||
AMDGPUMCCodeEmitter.cpp
|
||||
AMDGPUMCTargetDesc.cpp
|
||||
AMDGPUMCAsmInfo.cpp
|
||||
AMDGPUTargetStreamer.cpp
|
||||
R600MCCodeEmitter.cpp
|
||||
SIMCCodeEmitter.cpp
|
||||
)
|
||||
|
@ -18,6 +18,6 @@ BUILT_SOURCES = AMDGPUGenRegisterInfo.inc AMDGPUGenInstrInfo.inc \
|
||||
AMDGPUGenIntrinsics.inc AMDGPUGenDFAPacketizer.inc \
|
||||
AMDGPUGenAsmWriter.inc AMDGPUGenAsmMatcher.inc
|
||||
|
||||
DIRS = AsmParser InstPrinter TargetInfo MCTargetDesc
|
||||
DIRS = AsmParser InstPrinter TargetInfo MCTargetDesc Utils
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
@ -104,7 +104,7 @@ def : ProcessorModel<"hainan", SIQuarterSpeedModel, [FeatureSouthernIslands]>;
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def : ProcessorModel<"bonaire", SIQuarterSpeedModel,
|
||||
[FeatureSeaIslands, FeatureLDSBankCount32]
|
||||
[FeatureSeaIslands, FeatureLDSBankCount32, FeatureISAVersion7_0_0]
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"kabini", SIQuarterSpeedModel,
|
||||
@ -112,11 +112,12 @@ def : ProcessorModel<"kabini", SIQuarterSpeedModel,
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"kaveri", SIQuarterSpeedModel,
|
||||
[FeatureSeaIslands, FeatureLDSBankCount32]
|
||||
[FeatureSeaIslands, FeatureLDSBankCount32, FeatureISAVersion7_0_0]
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"hawaii", SIFullSpeedModel,
|
||||
[FeatureSeaIslands, FeatureFastFMAF32, FeatureLDSBankCount32]
|
||||
[FeatureSeaIslands, FeatureFastFMAF32, FeatureLDSBankCount32,
|
||||
FeatureISAVersion7_0_1]
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"mullins", SIQuarterSpeedModel,
|
||||
@ -127,11 +128,13 @@ def : ProcessorModel<"mullins", SIQuarterSpeedModel,
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def : ProcessorModel<"tonga", SIQuarterSpeedModel,
|
||||
[FeatureVolcanicIslands, FeatureSGPRInitBug]
|
||||
[FeatureVolcanicIslands, FeatureSGPRInitBug, FeatureISAVersion8_0_0]
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"iceland", SIQuarterSpeedModel,
|
||||
[FeatureVolcanicIslands, FeatureSGPRInitBug]
|
||||
[FeatureVolcanicIslands, FeatureSGPRInitBug, FeatureISAVersion8_0_0]
|
||||
>;
|
||||
|
||||
def : ProcessorModel<"carrizo", SIQuarterSpeedModel, [FeatureVolcanicIslands]>;
|
||||
def : ProcessorModel<"carrizo", SIQuarterSpeedModel,
|
||||
[FeatureVolcanicIslands, FeatureISAVersion8_0_1]
|
||||
>;
|
||||
|
37
lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
Normal file
37
lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
Normal file
@ -0,0 +1,37 @@
|
||||
//===-- AMDGPUBaseInfo.cpp - AMDGPU Base encoding information--------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include "AMDGPUBaseInfo.h"
|
||||
#include "llvm/MC/SubtargetFeature.h"
|
||||
|
||||
#define GET_SUBTARGETINFO_ENUM
|
||||
#include "AMDGPUGenSubtargetInfo.inc"
|
||||
#undef GET_SUBTARGETINFO_ENUM
|
||||
|
||||
namespace llvm {
|
||||
namespace AMDGPU {
|
||||
|
||||
IsaVersion getIsaVersion(const FeatureBitset &Features) {
|
||||
|
||||
if (Features.test(FeatureISAVersion7_0_0))
|
||||
return {7, 0, 0};
|
||||
|
||||
if (Features.test(FeatureISAVersion7_0_1))
|
||||
return {7, 0, 1};
|
||||
|
||||
if (Features.test(FeatureISAVersion8_0_0))
|
||||
return {8, 0, 0};
|
||||
|
||||
if (Features.test(FeatureISAVersion8_0_1))
|
||||
return {8, 0, 1};
|
||||
|
||||
return {0, 0, 0};
|
||||
}
|
||||
|
||||
} // End namespace AMDGPU
|
||||
} // End namespace llvm
|
32
lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h
Normal file
32
lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h
Normal file
@ -0,0 +1,32 @@
|
||||
//===-- AMDGPUBaseInfo.h - Top level definitions for AMDGPU -----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
|
||||
#define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
|
||||
|
||||
#include "AMDKernelCodeT.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class FeatureBitset;
|
||||
|
||||
namespace AMDGPU {
|
||||
|
||||
struct IsaVersion {
|
||||
unsigned Major;
|
||||
unsigned Minor;
|
||||
unsigned Stepping;
|
||||
};
|
||||
|
||||
IsaVersion getIsaVersion(const FeatureBitset &Features);
|
||||
|
||||
} // end namespace AMDGPU
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
3
lib/Target/AMDGPU/Utils/CMakeLists.txt
Normal file
3
lib/Target/AMDGPU/Utils/CMakeLists.txt
Normal file
@ -0,0 +1,3 @@
|
||||
add_llvm_library(LLVMAMDGPUUtils
|
||||
AMDGPUBaseInfo.cpp
|
||||
)
|
23
lib/Target/AMDGPU/Utils/LLVMBuild.txt
Normal file
23
lib/Target/AMDGPU/Utils/LLVMBuild.txt
Normal file
@ -0,0 +1,23 @@
|
||||
;===- ./lib/Target/AMDGPU/Utils/LLVMBuild.txt ------------------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
name = AMDGPUUtils
|
||||
parent = AMDGPU
|
||||
required_libraries = Support
|
||||
add_to_library_groups = AMDGPU
|
16
lib/Target/AMDGPU/Utils/Makefile
Normal file
16
lib/Target/AMDGPU/Utils/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
##===- lib/Target/AMDGPU/Utils/Makefile --------------------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
# This file is distributed under the University of Illinois Open Source
|
||||
# License. See LICENSE.TXT for details.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
LEVEL = ../../../..
|
||||
LIBRARYNAME = LLVMAMDGPUUtils
|
||||
|
||||
# Hack: we need to include 'main' AMDGPU target directory to grab private
|
||||
# headers
|
||||
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
@ -1,4 +1,19 @@
|
||||
; RUN: llc < %s -mtriple=amdgcn--amdhsa -mcpu=kaveri | FileCheck --check-prefix=HSA %s
|
||||
; RUN: llc < %s -mtriple=amdgcn--amdhsa -mcpu=kaveri -filetype=obj | llvm-readobj -s -sd | FileCheck --check-prefix=ELF %s
|
||||
; RUN: llc < %s -mtriple=amdgcn--amdhsa -mcpu=kaveri | llvm-mc -filetype=obj -triple amdgcn--amdhsa -mcpu=kaveri | llvm-readobj -s -sd | FileCheck %s --check-prefix=ELF
|
||||
|
||||
; The SHT_NOTE section contains the output from the .hsa_code_object_*
|
||||
; directives.
|
||||
|
||||
; ELF: SHT_NOTE
|
||||
; ELF: 0000: 04000000 08000000 01000000 414D4400
|
||||
; ELF: 0010: 01000000 00000000 04000000 1B000000
|
||||
; ELF: 0020: 03000000 414D4400 04000700 07000000
|
||||
; ELF: 0030: 00000000 00000000 414D4400 414D4447
|
||||
; ELF: 0040: 50550000
|
||||
|
||||
; HSA: .hsa_code_object_version 1,0
|
||||
; HSA: .hsa_code_object_isa 7,0,0,"AMD","AMDGPU"
|
||||
|
||||
; HSA: {{^}}simple:
|
||||
; HSA: .section .hsa.version
|
||||
|
16
test/MC/AMDGPU/hsa.s
Normal file
16
test/MC/AMDGPU/hsa.s
Normal file
@ -0,0 +1,16 @@
|
||||
// RUN: llvm-mc -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | FileCheck %s --check-prefix=ASM
|
||||
// RUN: llvm-mc -filetype=obj -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | llvm-readobj -s -sd | FileCheck %s --check-prefix=ELF
|
||||
|
||||
// ELF: SHT_NOTE
|
||||
// ELF: 0000: 04000000 08000000 01000000 414D4400
|
||||
// ELF: 0010: 01000000 00000000 04000000 1B000000
|
||||
// ELF: 0020: 03000000 414D4400 04000700 07000000
|
||||
// ELF: 0030: 00000000 00000000 414D4400 414D4447
|
||||
// ELF: 0040: 50550000
|
||||
|
||||
.hsa_code_object_version 1,0
|
||||
// ASM: .hsa_code_object_version 1,0
|
||||
|
||||
.hsa_code_object_isa 7,0,0,"AMD","AMDGPU"
|
||||
// ASM: .hsa_code_object_isa 7,0,0,"AMD","AMDGPU"
|
||||
|
16
test/MC/AMDGPU/hsa_code_object_isa_noargs.s
Normal file
16
test/MC/AMDGPU/hsa_code_object_isa_noargs.s
Normal file
@ -0,0 +1,16 @@
|
||||
// RUN: llvm-mc -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | FileCheck %s --check-prefix=ASM
|
||||
// RUN: llvm-mc -filetype=obj -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | llvm-readobj -s -sd | FileCheck %s --check-prefix=ELF
|
||||
|
||||
// ELF: SHT_NOTE
|
||||
// ELF: 0000: 04000000 08000000 01000000 414D4400
|
||||
// ELF: 0010: 01000000 00000000 04000000 1B000000
|
||||
// ELF: 0020: 03000000 414D4400 04000700 07000000
|
||||
// ELF: 0030: 00000000 00000000 414D4400 414D4447
|
||||
// ELF: 0040: 50550000
|
||||
|
||||
.hsa_code_object_version 1,0
|
||||
// ASM: .hsa_code_object_version 1,0
|
||||
|
||||
.hsa_code_object_isa
|
||||
// ASM: .hsa_code_object_isa 7,0,0,"AMD","AMDGPU"
|
||||
|
Loading…
Reference in New Issue
Block a user