brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · bf7b40b Raw
143 lines · c
1//===- AMDGPUMCExpr.h - AMDGPU specific MC expression classes ---*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H10#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H11 12#include "llvm/ADT/ArrayRef.h"13#include "llvm/MC/MCExpr.h"14 15namespace llvm {16 17class Function;18class GCNSubtarget;19 20enum class LitModifier { None, Lit, Lit64 };21 22/// AMDGPU target specific MCExpr operations.23///24/// Takes in a minimum of 1 argument to be used with an operation. The supported25/// operations are:26///   - (bitwise) or27///   - max28///29/// \note If the 'or'/'max' operations are provided only a single argument, the30/// operation will act as a no-op and simply resolve as the provided argument.31///32class AMDGPUMCExpr : public MCTargetExpr {33public:34  enum VariantKind {35    AGVK_None,36    AGVK_Or,37    AGVK_Max,38    AGVK_ExtraSGPRs,39    AGVK_TotalNumVGPRs,40    AGVK_AlignTo,41    AGVK_Occupancy,42    AGVK_Lit,43    AGVK_Lit64,44  };45 46  // Relocation specifiers.47  enum Specifier {48    S_None,49    S_GOTPCREL,      // symbol@gotpcrel50    S_GOTPCREL32_LO, // symbol@gotpcrel32@lo51    S_GOTPCREL32_HI, // symbol@gotpcrel32@hi52    S_REL32_LO,      // symbol@rel32@lo53    S_REL32_HI,      // symbol@rel32@hi54    S_REL64,         // symbol@rel6455    S_ABS32_LO,      // symbol@abs32@lo56    S_ABS32_HI,      // symbol@abs32@hi57    S_ABS64,         // symbol@abs6458  };59 60private:61  VariantKind Kind;62  MCContext &Ctx;63  const MCExpr **RawArgs;64  ArrayRef<const MCExpr *> Args;65 66  AMDGPUMCExpr(VariantKind Kind, ArrayRef<const MCExpr *> Args, MCContext &Ctx);67  ~AMDGPUMCExpr() override;68 69  bool evaluateExtraSGPRs(MCValue &Res, const MCAssembler *Asm) const;70  bool evaluateTotalNumVGPR(MCValue &Res, const MCAssembler *Asm) const;71  bool evaluateAlignTo(MCValue &Res, const MCAssembler *Asm) const;72  bool evaluateOccupancy(MCValue &Res, const MCAssembler *Asm) const;73 74public:75  static const AMDGPUMCExpr *76  create(VariantKind Kind, ArrayRef<const MCExpr *> Args, MCContext &Ctx);77 78  static const AMDGPUMCExpr *createOr(ArrayRef<const MCExpr *> Args,79                                      MCContext &Ctx) {80    return create(VariantKind::AGVK_Or, Args, Ctx);81  }82 83  static const AMDGPUMCExpr *createMax(ArrayRef<const MCExpr *> Args,84                                       MCContext &Ctx) {85    return create(VariantKind::AGVK_Max, Args, Ctx);86  }87 88  static const AMDGPUMCExpr *createExtraSGPRs(const MCExpr *VCCUsed,89                                              const MCExpr *FlatScrUsed,90                                              bool XNACKUsed, MCContext &Ctx);91 92  static const AMDGPUMCExpr *createTotalNumVGPR(const MCExpr *NumAGPR,93                                                const MCExpr *NumVGPR,94                                                MCContext &Ctx);95 96  static const AMDGPUMCExpr *97  createAlignTo(const MCExpr *Value, const MCExpr *Align, MCContext &Ctx) {98    return create(VariantKind::AGVK_AlignTo, {Value, Align}, Ctx);99  }100 101  static const AMDGPUMCExpr *createLit(LitModifier Lit, int64_t Value,102                                       MCContext &Ctx);103 104  ArrayRef<const MCExpr *> getArgs() const { return Args; }105  VariantKind getKind() const { return Kind; }106  const MCExpr *getSubExpr(size_t Index) const;107 108  void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;109  bool evaluateAsRelocatableImpl(MCValue &Res,110                                 const MCAssembler *Asm) const override;111  void visitUsedExpr(MCStreamer &Streamer) const override;112  MCFragment *findAssociatedFragment() const override;113 114  static bool classof(const MCExpr *E) {115    return E->getKind() == MCExpr::Target;116  }117  static bool isSymbolUsedInExpression(const MCSymbol *Sym, const MCExpr *E);118};119 120namespace AMDGPU {121// Tries to leverage KnownBits for MCExprs to reduce and limit any composed122// MCExprs printing. E.g., for an expression such as123// ((unevaluatable_sym | 1) & 1) won't evaluate due to unevaluatable_sym and124// would verbosely print the full expression; however, KnownBits should deduce125// the value to be 1. Particularly useful for AMDGPU metadata MCExprs.126void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS,127                       const MCAsmInfo *MAI);128 129const MCExpr *foldAMDGPUMCExpr(const MCExpr *Expr, MCContext &Ctx);130 131static inline AMDGPUMCExpr::Specifier getSpecifier(const MCSymbolRefExpr *SRE) {132  return AMDGPUMCExpr::Specifier(SRE->getKind());133}134 135LLVM_READONLY bool isLitExpr(const MCExpr *Expr);136 137LLVM_READONLY int64_t getLitValue(const MCExpr *Expr);138 139} // end namespace AMDGPU140} // end namespace llvm141 142#endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H143