| //===-- MCTargetDesc/AMDGPUMCAsmInfo.cpp - Assembly Info ------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| /// \file | |
| //===----------------------------------------------------------------------===// | |
| #include "AMDGPUMCAsmInfo.h" | |
| #include "MCTargetDesc/AMDGPUMCExpr.h" | |
| #include "MCTargetDesc/AMDGPUMCTargetDesc.h" | |
| #include "llvm/ADT/Enum.h" | |
| #include "llvm/MC/MCExpr.h" | |
| #include "llvm/MC/MCSubtargetInfo.h" | |
| #include "llvm/TargetParser/Triple.h" | |
| using namespace llvm; | |
| constexpr EnumStringDef<MCAsmInfo::AtSpecifierKind> AtSpecifierDefs[] = { | |
| {{"gotpcrel"}, AMDGPUMCExpr::S_GOTPCREL}, | |
| {{"gotpcrel32@lo"}, AMDGPUMCExpr::S_GOTPCREL32_LO}, | |
| {{"gotpcrel32@hi"}, AMDGPUMCExpr::S_GOTPCREL32_HI}, | |
| {{"rel32@lo"}, AMDGPUMCExpr::S_REL32_LO}, | |
| {{"rel32@hi"}, AMDGPUMCExpr::S_REL32_HI}, | |
| {{"rel64"}, AMDGPUMCExpr::S_REL64}, | |
| {{"abs32@lo"}, AMDGPUMCExpr::S_ABS32_LO}, | |
| {{"abs32@hi"}, AMDGPUMCExpr::S_ABS32_HI}, | |
| {{"abs64"}, AMDGPUMCExpr::S_ABS64}, | |
| }; | |
| constexpr auto atSpecifiers = BUILD_ENUM_STRINGS(AtSpecifierDefs); | |
| AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(const Triple &TT, | |
| const MCTargetOptions &Options) | |
| : MCAsmInfoELF(Options) { | |
| CodePointerSize = (TT.isAMDGCN()) ? 8 : 4; | |
| StackGrowsUp = true; | |
| HasSingleParameterDotFile = false; | |
| //===------------------------------------------------------------------===// | |
| MinInstAlignment = 4; | |
| // This is the maximum instruction encoded size for gfx10. With a known | |
| // subtarget, it can be reduced to 8 bytes. | |
| MaxInstLength = (TT.isAMDGCN()) ? 20 : 16; | |
| SeparatorString = "\n"; | |
| CommentString = ";"; | |
| InlineAsmStart = ";#ASMSTART"; | |
| InlineAsmEnd = ";#ASMEND"; | |
| UsesSetToEquateSymbol = true; | |
| //===--- Data Emission Directives -------------------------------------===// | |
| UsesELFSectionDirectiveForBSS = true; | |
| //===--- Global Variable Emission Directives --------------------------===// | |
| COMMDirectiveAlignmentIsInBytes = false; | |
| HasNoDeadStrip = true; | |
| //===--- Dwarf Emission Directives -----------------------------------===// | |
| SupportsDebugInformation = true; | |
| UsesCFIWithoutEH = true; | |
| DwarfRegNumForCFI = true; | |
| UseIntegratedAssembler = false; | |
| initializeAtSpecifiers(atSpecifiers); | |
| } | |
| bool AMDGPUMCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const { | |
| return SectionName == ".hsatext" || SectionName == ".hsadata_global_agent" || | |
| SectionName == ".hsadata_global_program" || | |
| SectionName == ".hsarodata_readonly_agent" || | |
| MCAsmInfo::shouldOmitSectionDirective(SectionName); | |
| } | |
| unsigned AMDGPUMCAsmInfo::getMaxInstLength(const MCSubtargetInfo *STI) const { | |
| if (!STI || STI->getTargetTriple().getArch() == Triple::r600) | |
| return MaxInstLength; | |
| // Maximum for NSA encoded images | |
| if (STI->hasFeature(AMDGPU::FeatureNSAEncoding)) | |
| return 20; | |
| // VOP3PX/VOP3PX2 encoding. | |
| if (STI->hasFeature(AMDGPU::FeatureGFX950Insts) || | |
| STI->hasFeature(AMDGPU::FeatureGFX1250Insts)) | |
| return 16; | |
| // 64-bit instruction with 32-bit literal. | |
| if (STI->hasFeature(AMDGPU::FeatureVOP3Literal)) | |
| return 12; | |
| return 8; | |
| } |