Home | History | Annotate | Download | only in MC
      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     constexpr LaneBitmask() = default;
     47     explicit constexpr LaneBitmask(Type V) : Mask(V) {}
     48 
     49     constexpr bool operator== (LaneBitmask M) const { return Mask == M.Mask; }
     50     constexpr bool operator!= (LaneBitmask M) const { return Mask != M.Mask; }
     51     constexpr bool operator< (LaneBitmask M)  const { return Mask < M.Mask; }
     52     constexpr bool none() const { return Mask == 0; }
     53     constexpr bool any()  const { return Mask != 0; }
     54     constexpr bool all()  const { return ~Mask == 0; }
     55 
     56     constexpr LaneBitmask operator~() const {
     57       return LaneBitmask(~Mask);
     58     }
     59     constexpr LaneBitmask operator|(LaneBitmask M) const {
     60       return LaneBitmask(Mask | M.Mask);
     61     }
     62     constexpr LaneBitmask operator&(LaneBitmask M) const {
     63       return LaneBitmask(Mask & M.Mask);
     64     }
     65     LaneBitmask &operator|=(LaneBitmask M) {
     66       Mask |= M.Mask;
     67       return *this;
     68     }
     69     LaneBitmask &operator&=(LaneBitmask M) {
     70       Mask &= M.Mask;
     71       return *this;
     72     }
     73 
     74     constexpr Type getAsInteger() const { return Mask; }
     75 
     76     unsigned getNumLanes() const {
     77       return countPopulation(Mask);
     78     }
     79     unsigned getHighestLane() const {
     80       return Log2_32(Mask);
     81     }
     82 
     83     static LaneBitmask getNone() { return LaneBitmask(0); }
     84     static LaneBitmask getAll()  { return ~LaneBitmask(0); }
     85     static 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   static LLVM_ATTRIBUTE_UNUSED Printable PrintLaneMask(LaneBitmask LaneMask) {
     95     return Printable([LaneMask](raw_ostream &OS) {
     96       OS << format(LaneBitmask::FormatStr, LaneMask.getAsInteger());
     97     });
     98   }
     99 
    100 } // end namespace llvm
    101 
    102 #endif // LLVM_MC_LANEBITMASK_H
    103