aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/RegisterMask.cpp
blob: 027ee2615e4b936e9de25a99c04bcc2e207664de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: GPL-3.0-or-later

#include "rcc/CodeGen/RegisterMask.h"

namespace rcc {

bool RegisterMask::preserves(PhysicalRegister PhysReg) const noexcept {
  if (!PhysReg.isValid())
    return false;

  constexpr std::uint32_t BitsPerWord = 64;
  const std::uint32_t RegisterNumber = PhysReg.number();
  const std::size_t WordIndex = RegisterNumber / BitsPerWord;
  if (WordIndex >= PreservedWords.size())
    return false;

  const std::uint32_t BitIndex = RegisterNumber % BitsPerWord;
  return (PreservedWords[WordIndex] & (std::uint64_t{1} << BitIndex)) != 0;
}

} // namespace rcc