• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_CODEGEN_REGLIST_H_
6 #define V8_CODEGEN_REGLIST_H_
7 
8 #include <cstdint>
9 
10 #include "src/base/bits.h"
11 #include "src/base/template-utils.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 // Register configurations.
17 #if V8_TARGET_ARCH_ARM64
18 using RegList = uint64_t;
19 #else
20 using RegList = uint32_t;
21 #endif
22 
23 // Get the number of registers in a given register list.
NumRegs(RegList list)24 constexpr int NumRegs(RegList list) {
25   return base::bits::CountPopulation(list);
26 }
27 
28 namespace detail {
29 // Combine two RegLists by building the union of the contained registers.
30 // TODO(clemensb): Replace by constexpr lambda once we have C++17.
CombineRegListsHelper(RegList list1,RegList list2)31 constexpr RegList CombineRegListsHelper(RegList list1, RegList list2) {
32   return list1 | list2;
33 }
34 }  // namespace detail
35 
36 // Combine several RegLists by building the union of the contained registers.
37 template <typename... RegLists>
CombineRegLists(RegLists...lists)38 constexpr RegList CombineRegLists(RegLists... lists) {
39   return base::fold(detail::CombineRegListsHelper, 0, lists...);
40 }
41 
42 }  // namespace internal
43 }  // namespace v8
44 
45 #endif  // V8_CODEGEN_REGLIST_H_
46