LCOV - code coverage report
Current view: top level - include/llvm/MC - LaneBitmask.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 10 24 41.7 %
Date: 2018-10-20 13:21:21 Functions: 0 12 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- llvm/MC/LaneBitmask.h ------------------------------------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : ///
      10             : /// \file
      11             : /// A common definition of LaneBitmask for use in TableGen and CodeGen.
      12             : ///
      13             : /// A lane mask is a bitmask representing the covering of a register with
      14             : /// sub-registers.
      15             : ///
      16             : /// This is typically used to track liveness at sub-register granularity.
      17             : /// Lane masks for sub-register indices are similar to register units for
      18             : /// physical registers. The individual bits in a lane mask can't be assigned
      19             : /// any specific meaning. They can be used to check if two sub-register
      20             : /// indices overlap.
      21             : ///
      22             : /// Iff the target has a register such that:
      23             : ///
      24             : ///   getSubReg(Reg, A) overlaps getSubReg(Reg, B)
      25             : ///
      26             : /// then:
      27             : ///
      28             : ///   (getSubRegIndexLaneMask(A) & getSubRegIndexLaneMask(B)) != 0
      29             : 
      30             : #ifndef LLVM_MC_LANEBITMASK_H
      31             : #define LLVM_MC_LANEBITMASK_H
      32             : 
      33             : #include "llvm/Support/Compiler.h"
      34             : #include "llvm/Support/Format.h"
      35             : #include "llvm/Support/Printable.h"
      36             : #include "llvm/Support/raw_ostream.h"
      37             : 
      38             : namespace llvm {
      39             : 
      40             :   struct LaneBitmask {
      41             :     // When changing the underlying type, change the format string as well.
      42             :     using Type = unsigned;
      43             :     enum : unsigned { BitWidth = 8*sizeof(Type) };
      44             :     constexpr static const char *const FormatStr = "%08X";
      45             : 
      46      838203 :     constexpr LaneBitmask() = default;
      47       41319 :     explicit constexpr LaneBitmask(Type V) : Mask(V) {}
      48             : 
      49           0 :     constexpr bool operator== (LaneBitmask M) const { return Mask == M.Mask; }
      50           0 :     constexpr bool operator!= (LaneBitmask M) const { return Mask != M.Mask; }
      51           0 :     constexpr bool operator< (LaneBitmask M)  const { return Mask < M.Mask; }
      52           0 :     constexpr bool none() const { return Mask == 0; }
      53      362864 :     constexpr bool any()  const { return Mask != 0; }
      54           0 :     constexpr bool all()  const { return ~Mask == 0; }
      55             : 
      56           0 :     constexpr LaneBitmask operator~() const {
      57           0 :       return LaneBitmask(~Mask);
      58             :     }
      59           0 :     constexpr LaneBitmask operator|(LaneBitmask M) const {
      60     8278298 :       return LaneBitmask(Mask | M.Mask);
      61             :     }
      62           0 :     constexpr LaneBitmask operator&(LaneBitmask M) const {
      63    39042225 :       return LaneBitmask(Mask & M.Mask);
      64             :     }
      65             :     LaneBitmask &operator|=(LaneBitmask M) {
      66    20940225 :       Mask |= M.Mask;
      67             :       return *this;
      68             :     }
      69             :     LaneBitmask &operator&=(LaneBitmask M) {
      70     8117299 :       Mask &= M.Mask;
      71             :       return *this;
      72             :     }
      73             : 
      74           0 :     constexpr Type getAsInteger() const { return Mask; }
      75             : 
      76           0 :     unsigned getNumLanes() const {
      77           0 :       return countPopulation(Mask);
      78             :     }
      79           0 :     unsigned getHighestLane() const {
      80           0 :       return Log2_32(Mask);
      81             :     }
      82             : 
      83             :     static constexpr LaneBitmask getNone() { return LaneBitmask(0); }
      84    17084225 :     static constexpr LaneBitmask getAll() { return ~LaneBitmask(0); }
      85             :     static constexpr LaneBitmask getLane(unsigned Lane) {
      86             :       return LaneBitmask(Type(1) << Lane);
      87             :     }
      88             : 
      89             :   private:
      90             :     Type Mask = 0;
      91             :   };
      92             : 
      93             :   /// Create Printable object to print LaneBitmasks on a \ref raw_ostream.
      94             :   inline Printable PrintLaneMask(LaneBitmask LaneMask) {
      95             :     return Printable([LaneMask](raw_ostream &OS) {
      96        3230 :       OS << format(LaneBitmask::FormatStr, LaneMask.getAsInteger());
      97        1612 :     });
      98             :   }
      99             : 
     100             : } // end namespace llvm
     101             : 
     102             : #endif // LLVM_MC_LANEBITMASK_H

Generated by: LCOV version 1.13