LCOV - code coverage report
Current view: top level - include/llvm/MC - LaneBitmask.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 21 21 100.0 %
Date: 2017-09-14 15:23:50 Functions: 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     1301755 :     constexpr LaneBitmask() = default;
      47       28523 :     explicit constexpr LaneBitmask(Type V) : Mask(V) {}
      48             : 
      49       91818 :     constexpr bool operator== (LaneBitmask M) const { return Mask == M.Mask; }
      50      183612 :     constexpr bool operator!= (LaneBitmask M) const { return Mask != M.Mask; }
      51      186192 :     constexpr bool operator< (LaneBitmask M)  const { return Mask < M.Mask; }
      52    14762565 :     constexpr bool none() const { return Mask == 0; }
      53    22620108 :     constexpr bool any()  const { return Mask != 0; }
      54     2822575 :     constexpr bool all()  const { return ~Mask == 0; }
      55             : 
      56             :     constexpr LaneBitmask operator~() const {
      57     6568206 :       return LaneBitmask(~Mask);
      58             :     }
      59             :     constexpr LaneBitmask operator|(LaneBitmask M) const {
      60     9415180 :       return LaneBitmask(Mask | M.Mask);
      61             :     }
      62             :     constexpr LaneBitmask operator&(LaneBitmask M) const {
      63    38397224 :       return LaneBitmask(Mask & M.Mask);
      64             :     }
      65             :     LaneBitmask &operator|=(LaneBitmask M) {
      66    15607969 :       Mask |= M.Mask;
      67             :       return *this;
      68             :     }
      69             :     LaneBitmask &operator&=(LaneBitmask M) {
      70     6700291 :       Mask &= M.Mask;
      71             :       return *this;
      72             :     }
      73             : 
      74      260217 :     constexpr Type getAsInteger() const { return Mask; }
      75             : 
      76             :     unsigned getNumLanes() const {
      77     1197172 :       return countPopulation(Mask);
      78             :     }
      79             :     unsigned getHighestLane() const {
      80        1140 :       return Log2_32(Mask);
      81             :     }
      82             : 
      83    25669359 :     static LaneBitmask getNone() { return LaneBitmask(0); }
      84    15006525 :     static LaneBitmask getAll()  { return ~LaneBitmask(0); }
      85             :     static LaneBitmask getLane(unsigned Lane) {
      86      325155 :       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             :   static LLVM_ATTRIBUTE_UNUSED Printable PrintLaneMask(LaneBitmask LaneMask) {
      95             :     return Printable([LaneMask](raw_ostream &OS) {
      96        3774 :       OS << format(LaneBitmask::FormatStr, LaneMask.getAsInteger());
      97        5032 :     });
      98             :   }
      99             : 
     100             : } // end namespace llvm
     101             : 
     102             : #endif // LLVM_MC_LANEBITMASK_H

Generated by: LCOV version 1.13