diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
commit | 0b57cec536236d46e3dba9bd041533462f33dbb7 (patch) | |
tree | 56229dbdbbf76d18580f72f789003db17246c8d9 /contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h | |
parent | 718ef55ec7785aae63f98f8ca05dc07ed399c16d (diff) | |
download | src-0b57cec536236d46e3dba9bd041533462f33dbb7.tar.gz src-0b57cec536236d46e3dba9bd041533462f33dbb7.zip |
Notes
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h new file mode 100644 index 000000000000..02607d50f686 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonBitTracker.h @@ -0,0 +1,77 @@ +//===- HexagonBitTracker.h --------------------------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONBITTRACKER_H +#define LLVM_LIB_TARGET_HEXAGON_HEXAGONBITTRACKER_H + +#include "BitTracker.h" +#include "llvm/ADT/DenseMap.h" +#include <cstdint> + +namespace llvm { + +class HexagonInstrInfo; +class HexagonRegisterInfo; +class MachineFrameInfo; +class MachineFunction; +class MachineInstr; +class MachineRegisterInfo; + +struct HexagonEvaluator : public BitTracker::MachineEvaluator { + using CellMapType = BitTracker::CellMapType; + using RegisterRef = BitTracker::RegisterRef; + using RegisterCell = BitTracker::RegisterCell; + using BranchTargetList = BitTracker::BranchTargetList; + + HexagonEvaluator(const HexagonRegisterInfo &tri, MachineRegisterInfo &mri, + const HexagonInstrInfo &tii, MachineFunction &mf); + + bool evaluate(const MachineInstr &MI, const CellMapType &Inputs, + CellMapType &Outputs) const override; + bool evaluate(const MachineInstr &BI, const CellMapType &Inputs, + BranchTargetList &Targets, bool &FallsThru) const override; + + BitTracker::BitMask mask(unsigned Reg, unsigned Sub) const override; + + uint16_t getPhysRegBitWidth(unsigned Reg) const override; + + const TargetRegisterClass &composeWithSubRegIndex( + const TargetRegisterClass &RC, unsigned Idx) const override; + + MachineFunction &MF; + MachineFrameInfo &MFI; + const HexagonInstrInfo &TII; + +private: + unsigned getUniqueDefVReg(const MachineInstr &MI) const; + bool evaluateLoad(const MachineInstr &MI, const CellMapType &Inputs, + CellMapType &Outputs) const; + bool evaluateFormalCopy(const MachineInstr &MI, const CellMapType &Inputs, + CellMapType &Outputs) const; + + unsigned getNextPhysReg(unsigned PReg, unsigned Width) const; + unsigned getVirtRegFor(unsigned PReg) const; + + // Type of formal parameter extension. + struct ExtType { + enum { SExt, ZExt }; + + ExtType() = default; + ExtType(char t, uint16_t w) : Type(t), Width(w) {} + + char Type = 0; + uint16_t Width = 0; + }; + // Map VR -> extension type. + using RegExtMap = DenseMap<unsigned, ExtType>; + RegExtMap VRX; +}; + +} // end namespace llvm + +#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONBITTRACKER_H |