From: Artem Tamazov Date: Tue, 14 Jun 2016 15:03:59 +0000 (+0000) Subject: [AMDGPU][llvm-mc] Predefined symbols to access -mcpu from the assembly source (.optio... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da10a460d7c98278561225fda90855b303675f35;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272673 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 0120c04a4eb..12303a67c27 100644 --- a/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/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 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/test/MC/AMDGPU/symbol_special.s b/test/MC/AMDGPU/symbol_special.s new file mode 100644 index 00000000000..75d36b84c4a --- /dev/null +++ b/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