summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Tamazov <artem.tamazov@amd.com>2016-06-14 15:03:59 +0000
committerArtem Tamazov <artem.tamazov@amd.com>2016-06-14 15:03:59 +0000
commit17091364d13f2436eb63ec4df484d28fcb55d976 (patch)
tree54f422831fae2e4c4e0c03b6f78b7363ab1ca96e
parentdfb66a11917be12253dfe7f95e15fa23bf31faae (diff)
downloadbcm5719-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.cpp17
-rw-r--r--llvm/test/MC/AMDGPU/symbol_special.s48
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
OpenPOWER on IntegriCloud