diff options
author | Artem Tamazov <artem.tamazov@amd.com> | 2016-06-14 15:03:59 +0000 |
---|---|---|
committer | Artem Tamazov <artem.tamazov@amd.com> | 2016-06-14 15:03:59 +0000 |
commit | 17091364d13f2436eb63ec4df484d28fcb55d976 (patch) | |
tree | 54f422831fae2e4c4e0c03b6f78b7363ab1ca96e | |
parent | dfb66a11917be12253dfe7f95e15fa23bf31faae (diff) | |
download | bcm5719-llvm-17091364d13f2436eb63ec4df484d28fcb55d976.tar.gz bcm5719-llvm-17091364d13f2436eb63ec4df484d28fcb55d976.zip |
[AMDGPU][llvm-mc] Predefined symbols to access -mcpu from the assembly source (.option.machine_version...)
The feature allows for conditional assembly etc.
TODO: make those symbols read-only.
Test added.
Differential Revision: http://reviews.llvm.org/D21238
llvm-svn: 272673
-rw-r--r-- | llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 17 | ||||
-rw-r--r-- | llvm/test/MC/AMDGPU/symbol_special.s | 48 |
2 files changed, 63 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 0120c04a4eb..12303a67c27 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -60,8 +60,6 @@ class AMDGPUOperand : public MCParsedAsmOperand { public: AMDGPUOperand(enum KindTy K) : MCParsedAsmOperand(), Kind(K) {} - MCContext *Ctx; - typedef std::unique_ptr<AMDGPUOperand> Ptr; struct Modifiers { @@ -586,6 +584,21 @@ public: } setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits())); + + { + // TODO: make those pre-defined variables read-only. + // Currently there is none suitable machinery in the core llvm-mc for this. + // MCSymbol::isRedefinable is intended for another purpose, and + // AsmParser::parseDirectiveSet() cannot be specialized for specific target. + AMDGPU::IsaVersion Isa = AMDGPU::getIsaVersion(getSTI().getFeatureBits()); + MCContext &Ctx = getContext(); + MCSymbol *Sym = Ctx.getOrCreateSymbol(Twine(".option.machine_version_major")); + Sym->setVariableValue(MCConstantExpr::create(Isa.Major, Ctx)); + Sym = Ctx.getOrCreateSymbol(Twine(".option.machine_version_minor")); + Sym->setVariableValue(MCConstantExpr::create(Isa.Minor, Ctx)); + Sym = Ctx.getOrCreateSymbol(Twine(".option.machine_version_stepping")); + Sym->setVariableValue(MCConstantExpr::create(Isa.Stepping, Ctx)); + } } AMDGPUTargetStreamer &getTargetStreamer() { diff --git a/llvm/test/MC/AMDGPU/symbol_special.s b/llvm/test/MC/AMDGPU/symbol_special.s new file mode 100644 index 00000000000..75d36b84c4a --- /dev/null +++ b/llvm/test/MC/AMDGPU/symbol_special.s @@ -0,0 +1,48 @@ +// RUN: llvm-mc -arch=amdgcn -mcpu=bonaire %s | FileCheck %s --check-prefix=BONAIRE +// RUN: llvm-mc -arch=amdgcn -mcpu=hawaii %s | FileCheck %s --check-prefix=HAWAII +// RUN: llvm-mc -arch=amdgcn -mcpu=tonga %s | FileCheck %s --check-prefix=TONGA +// RUN: llvm-mc -arch=amdgcn -mcpu=fiji %s | FileCheck %s --check-prefix=FIJI + +.if .option.machine_version_major == 0 +.byte 0 +.elseif .option.machine_version_major == 7 +.byte 7 +.elseif .option.machine_version_major == 8 +.byte 8 +.else +.error "major unknown" +.endif +// BONAIRE: .byte 7 +// HAWAII: .byte 7 +// TONGA: .byte 8 +// FIJI: .byte 8 + +.if .option.machine_version_minor == 0 +.byte 0 +.else +.error "minor unknown" +.endif +// BONAIRE: .byte 0 +// HAWAII: .byte 0 +// TONGA: .byte 0 +// FIJI: .byte 0 + +.if .option.machine_version_stepping == 0 +.byte 0 +.elseif .option.machine_version_stepping == 1 +.byte 1 +.elseif .option.machine_version_stepping == 3 +.byte 3 +.else +.error "stepping unknown" +.endif +// BONAIRE: .byte 0 +// HAWAII: .byte 1 +// TONGA: .byte 0 +// FIJI: .byte 3 + +v_add_f32 v0, v0, v[.option.machine_version_major] +// BONAIRE: v_add_f32_e32 v0, v0, v7 +// HAWAII: v_add_f32_e32 v0, v0, v7 +// TONGA: v_add_f32_e32 v0, v0, v8 +// FIJI: v_add_f32_e32 v0, v0, v8 |