brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 261b283 Raw
110 lines · c
1//===------- LeonPasses.h - Define passes specific to LEON ----------------===//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//10//===----------------------------------------------------------------------===//11 12#ifndef LLVM_LIB_TARGET_SPARC_LEON_PASSES_H13#define LLVM_LIB_TARGET_SPARC_LEON_PASSES_H14 15#include "llvm/CodeGen/MachineFunctionPass.h"16 17namespace llvm {18class SparcSubtarget;19 20class LLVM_LIBRARY_VISIBILITY LEONMachineFunctionPass21    : public MachineFunctionPass {22protected:23  const SparcSubtarget *Subtarget = nullptr;24  const int LAST_OPERAND = -1;25 26  // this vector holds free registers that we allocate in groups for some of the27  // LEON passes28  std::vector<int> UsedRegisters;29 30protected:31  LEONMachineFunctionPass(char &ID);32 33  void clearUsedRegisterList() { UsedRegisters.clear(); }34 35  void markRegisterUsed(int registerIndex) {36    UsedRegisters.push_back(registerIndex);37  }38};39 40class LLVM_LIBRARY_VISIBILITY ErrataWorkaround : public MachineFunctionPass {41protected:42  const SparcSubtarget *ST;43  const TargetInstrInfo *TII;44  const TargetRegisterInfo *TRI;45 46  bool checkSeqTN0009A(MachineBasicBlock::iterator I);47  bool checkSeqTN0009B(MachineBasicBlock::iterator I);48  bool checkSeqTN0010First(MachineBasicBlock &MBB);49  bool checkSeqTN0010(MachineBasicBlock::iterator I);50  bool checkSeqTN0012(MachineBasicBlock::iterator I);51  bool checkSeqTN0013(MachineBasicBlock::iterator I);52 53  bool moveNext(MachineBasicBlock::iterator &I);54  bool isFloat(MachineBasicBlock::iterator I);55  bool isDivSqrt(MachineBasicBlock::iterator I);56  void insertNop(MachineBasicBlock::iterator I);57 58public:59  static char ID;60 61  ErrataWorkaround();62  bool runOnMachineFunction(MachineFunction &MF) override;63 64  StringRef getPassName() const override { return "Errata workaround pass"; };65};66 67class LLVM_LIBRARY_VISIBILITY InsertNOPLoad : public LEONMachineFunctionPass {68public:69  static char ID;70 71  InsertNOPLoad();72  bool runOnMachineFunction(MachineFunction &MF) override;73 74  StringRef getPassName() const override {75    return "InsertNOPLoad: Erratum Fix LBR35: insert a NOP instruction after "76           "every single-cycle load instruction when the next instruction is "77           "another load/store instruction";78  }79};80 81class LLVM_LIBRARY_VISIBILITY DetectRoundChange82    : public LEONMachineFunctionPass {83public:84  static char ID;85 86  DetectRoundChange();87  bool runOnMachineFunction(MachineFunction &MF) override;88 89  StringRef getPassName() const override {90    return "DetectRoundChange: Leon erratum detection: detect any rounding "91           "mode change request: use only the round-to-nearest rounding mode";92  }93};94 95class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass {96public:97  static char ID;98 99  FixAllFDIVSQRT();100  bool runOnMachineFunction(MachineFunction &MF) override;101 102  StringRef getPassName() const override {103    return "FixAllFDIVSQRT: Erratum Fix LBR34: fix FDIVS/FDIVD/FSQRTS/FSQRTD "104           "instructions with NOPs and floating-point store";105  }106};107} // namespace llvm108 109#endif // LLVM_LIB_TARGET_SPARC_LEON_PASSES_H110