debase-ruby_core_source 3.2.0 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +10 -0
  4. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/addr2line.h +20 -0
  5. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/builtin.h +117 -0
  6. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ccan/build_assert/build_assert.h +40 -0
  7. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ccan/check_type/check_type.h +63 -0
  8. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ccan/container_of/container_of.h +142 -0
  9. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ccan/list/list.h +789 -0
  10. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ccan/str/str.h +17 -0
  11. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/constant.h +53 -0
  12. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/darray.h +246 -0
  13. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/debug_counter.h +423 -0
  14. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/dln.h +31 -0
  15. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/encindex.h +70 -0
  16. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/eval_intern.h +341 -0
  17. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/hrtime.h +227 -0
  18. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/id.h +343 -0
  19. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/id_table.h +39 -0
  20. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/insns.inc +249 -0
  21. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/insns_info.inc +9133 -0
  22. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/array.h +144 -0
  23. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/basic_operators.h +63 -0
  24. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/bignum.h +244 -0
  25. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/bits.h +568 -0
  26. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/class.h +226 -0
  27. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/cmdlineopt.h +63 -0
  28. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/compar.h +29 -0
  29. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/compile.h +34 -0
  30. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/compilers.h +107 -0
  31. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/complex.h +29 -0
  32. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/cont.h +32 -0
  33. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/dir.h +16 -0
  34. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/enc.h +19 -0
  35. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/encoding.h +32 -0
  36. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/enum.h +18 -0
  37. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/enumerator.h +21 -0
  38. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/error.h +213 -0
  39. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/eval.h +32 -0
  40. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/file.h +38 -0
  41. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/fixnum.h +184 -0
  42. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/gc.h +361 -0
  43. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/hash.h +190 -0
  44. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/imemo.h +241 -0
  45. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/inits.h +50 -0
  46. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/io.h +137 -0
  47. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/load.h +18 -0
  48. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/loadpath.h +16 -0
  49. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/math.h +23 -0
  50. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/missing.h +18 -0
  51. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/numeric.h +273 -0
  52. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/object.h +59 -0
  53. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/parse.h +133 -0
  54. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/proc.h +30 -0
  55. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/process.h +124 -0
  56. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/ractor.h +6 -0
  57. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/random.h +16 -0
  58. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/range.h +40 -0
  59. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/rational.h +71 -0
  60. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/re.h +28 -0
  61. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/ruby_parser.h +69 -0
  62. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/sanitizers.h +186 -0
  63. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/serial.h +23 -0
  64. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/signal.h +25 -0
  65. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/static_assert.h +16 -0
  66. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/string.h +160 -0
  67. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/struct.h +127 -0
  68. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/symbol.h +42 -0
  69. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/thread.h +74 -0
  70. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/time.h +34 -0
  71. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/transcode.h +20 -0
  72. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/util.h +27 -0
  73. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/variable.h +71 -0
  74. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/vm.h +129 -0
  75. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal/warnings.h +16 -0
  76. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/internal.h +112 -0
  77. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/iseq.h +334 -0
  78. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/known_errors.inc +791 -0
  79. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/method.h +254 -0
  80. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/node.h +125 -0
  81. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/node_name.inc +210 -0
  82. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/optinsn.inc +128 -0
  83. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/optunifs.inc +43 -0
  84. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parse.h +232 -0
  85. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parser_bits.h +564 -0
  86. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parser_node.h +133 -0
  87. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parser_st.h +162 -0
  88. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parser_value.h +106 -0
  89. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/probes_helper.h +42 -0
  90. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ractor_core.h +387 -0
  91. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/regenc.h +254 -0
  92. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/regint.h +996 -0
  93. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/regparse.h +370 -0
  94. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/revision.h +5 -0
  95. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/rjit.h +103 -0
  96. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/rjit_c.h +165 -0
  97. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ruby_assert.h +14 -0
  98. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/ruby_atomic.h +23 -0
  99. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/rubyparser.h +628 -0
  100. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/shape.h +232 -0
  101. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/siphash.h +48 -0
  102. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/symbol.h +119 -0
  103. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/thread_none.h +20 -0
  104. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/thread_pthread.h +126 -0
  105. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/thread_win32.h +58 -0
  106. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/timev.h +58 -0
  107. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/transcode_data.h +138 -0
  108. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/variable.h +30 -0
  109. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/version.h +65 -0
  110. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm.inc +5396 -0
  111. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_call_iseq_optimized.inc +244 -0
  112. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_callinfo.h +608 -0
  113. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_core.h +2089 -0
  114. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_debug.h +122 -0
  115. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_exec.h +199 -0
  116. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_insnhelper.h +271 -0
  117. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_opts.h +67 -0
  118. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vm_sync.h +137 -0
  119. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/vmtc.inc +243 -0
  120. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/yjit.h +70 -0
  121. data/lib/debase/ruby_core_source/version.rb +1 -1
  122. metadata +120 -3
@@ -0,0 +1,568 @@
1
+ #ifndef INTERNAL_BITS_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_BITS_H
3
+ /**
4
+ * @author Ruby developers <ruby-core@ruby-lang.org>
5
+ * @copyright This file is a part of the programming language Ruby.
6
+ * Permission is hereby granted, to either redistribute and/or
7
+ * modify this file, provided that the conditions mentioned in the
8
+ * file COPYING are met. Consult the file for details.
9
+ * @brief Internal header for bitwise integer algorithms.
10
+ * @see Henry S. Warren Jr., "Hacker's Delight" (2nd ed.), 2013.
11
+ * @see SEI CERT C Coding Standard INT32-C. "Ensure that operations on
12
+ * signed integers do not result in overflow"
13
+ * @see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
14
+ * @see https://clang.llvm.org/docs/LanguageExtensions.html#builtin-rotateleft
15
+ * @see https://clang.llvm.org/docs/LanguageExtensions.html#builtin-rotateright
16
+ * @see https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/byteswap-uint64-byteswap-ulong-byteswap-ushort
17
+ * @see https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rotl-rotl64-rotr-rotr64
18
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64
19
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64
20
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/lzcnt16-lzcnt-lzcnt64
21
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/popcnt16-popcnt-popcnt64
22
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_lzcnt_u32
23
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_tzcnt_u32
24
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_rotl64
25
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_rotr64
26
+ * @see https://stackoverflow.com/a/776523
27
+ */
28
+ #include "ruby/internal/config.h"
29
+ #include <limits.h> /* for CHAR_BITS */
30
+ #include <stdint.h> /* for uintptr_t */
31
+ #include "internal/compilers.h" /* for MSC_VERSION_SINCE */
32
+
33
+ #if MSC_VERSION_SINCE(1310)
34
+ # include <stdlib.h> /* for _byteswap_uint64 */
35
+ #endif
36
+
37
+ #if defined(HAVE_X86INTRIN_H)
38
+ # include <x86intrin.h> /* for _lzcnt_u64 */
39
+ #elif MSC_VERSION_SINCE(1310)
40
+ # include <intrin.h> /* for the following intrinsics */
41
+ #endif
42
+
43
+ #if defined(_MSC_VER) && defined(__AVX__)
44
+ # pragma intrinsic(__popcnt)
45
+ # pragma intrinsic(__popcnt64)
46
+ #endif
47
+
48
+ #if defined(_MSC_VER) && defined(__AVX2__)
49
+ # pragma intrinsic(__lzcnt)
50
+ # pragma intrinsic(__lzcnt64)
51
+ #endif
52
+
53
+ #if MSC_VERSION_SINCE(1310)
54
+ # pragma intrinsic(_rotl)
55
+ # pragma intrinsic(_rotr)
56
+ # ifdef _WIN64
57
+ # pragma intrinsic(_rotl64)
58
+ # pragma intrinsic(_rotr64)
59
+ # endif
60
+ #endif
61
+
62
+ #if MSC_VERSION_SINCE(1400)
63
+ # pragma intrinsic(_BitScanForward)
64
+ # pragma intrinsic(_BitScanReverse)
65
+ # ifdef _WIN64
66
+ # pragma intrinsic(_BitScanForward64)
67
+ # pragma intrinsic(_BitScanReverse64)
68
+ # endif
69
+ #endif
70
+
71
+ #include "ruby/ruby.h" /* for VALUE */
72
+ #include "internal/static_assert.h" /* for STATIC_ASSERT */
73
+
74
+ /* The most significant bit of the lower part of half-long integer.
75
+ * If sizeof(long) == 4, this is 0x8000.
76
+ * If sizeof(long) == 8, this is 0x80000000.
77
+ */
78
+ #define HALF_LONG_MSB ((SIGNED_VALUE)1<<((SIZEOF_LONG*CHAR_BIT-1)/2))
79
+
80
+ #define SIGNED_INTEGER_TYPE_P(T) (0 > ((T)0)-1)
81
+
82
+ #define SIGNED_INTEGER_MIN(T) \
83
+ ((sizeof(T) == sizeof(int8_t)) ? ((T)INT8_MIN) : \
84
+ ((sizeof(T) == sizeof(int16_t)) ? ((T)INT16_MIN) : \
85
+ ((sizeof(T) == sizeof(int32_t)) ? ((T)INT32_MIN) : \
86
+ ((sizeof(T) == sizeof(int64_t)) ? ((T)INT64_MIN) : \
87
+ 0))))
88
+
89
+ #define SIGNED_INTEGER_MAX(T) ((T)(SIGNED_INTEGER_MIN(T) ^ ((T)~(T)0)))
90
+
91
+ #define UNSIGNED_INTEGER_MAX(T) ((T)~(T)0)
92
+
93
+ #if __has_builtin(__builtin_mul_overflow_p)
94
+ # define MUL_OVERFLOW_P(a, b) \
95
+ __builtin_mul_overflow_p((a), (b), (__typeof__(a * b))0)
96
+ #elif __has_builtin(__builtin_mul_overflow)
97
+ # define MUL_OVERFLOW_P(a, b) \
98
+ __extension__ ({ __typeof__(a) c; __builtin_mul_overflow((a), (b), &c); })
99
+ #endif
100
+
101
+ #define MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
102
+ (a) == 0 ? 0 : \
103
+ (a) == -1 ? (b) < -(max) : \
104
+ (a) > 0 ? \
105
+ ((b) > 0 ? (max) / (a) < (b) : (min) / (a) > (b)) : \
106
+ ((b) > 0 ? (min) / (a) < (b) : (max) / (a) > (b)))
107
+
108
+ #if __has_builtin(__builtin_mul_overflow_p)
109
+ /* __builtin_mul_overflow_p can take bitfield */
110
+ /* and GCC permits bitfields for integers other than int */
111
+ # define MUL_OVERFLOW_FIXNUM_P(a, b) \
112
+ __extension__ ({ \
113
+ struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
114
+ __builtin_mul_overflow_p((a), (b), c.fixnum); \
115
+ })
116
+ #else
117
+ # define MUL_OVERFLOW_FIXNUM_P(a, b) \
118
+ MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
119
+ #endif
120
+
121
+ #if defined(MUL_OVERFLOW_P) && defined(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG)
122
+ # define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
123
+ #else
124
+ # define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
125
+ #endif
126
+
127
+ #ifdef MUL_OVERFLOW_P
128
+ # define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
129
+ # define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_P(a, b)
130
+ #else
131
+ # define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
132
+ # define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
133
+ #endif
134
+
135
+ #ifdef HAVE_UINT128_T
136
+ # define bit_length(x) \
137
+ (unsigned int) \
138
+ (sizeof(x) <= sizeof(int32_t) ? 32 - nlz_int32((uint32_t)(x)) : \
139
+ sizeof(x) <= sizeof(int64_t) ? 64 - nlz_int64((uint64_t)(x)) : \
140
+ 128 - nlz_int128((uint128_t)(x)))
141
+ #else
142
+ # define bit_length(x) \
143
+ (unsigned int) \
144
+ (sizeof(x) <= sizeof(int32_t) ? 32 - nlz_int32((uint32_t)(x)) : \
145
+ 64 - nlz_int64((uint64_t)(x)))
146
+ #endif
147
+
148
+ #ifndef swap16
149
+ # define swap16 ruby_swap16
150
+ #endif
151
+
152
+ #ifndef swap32
153
+ # define swap32 ruby_swap32
154
+ #endif
155
+
156
+ #ifndef swap64
157
+ # define swap64 ruby_swap64
158
+ #endif
159
+
160
+ static inline uint16_t ruby_swap16(uint16_t);
161
+ static inline uint32_t ruby_swap32(uint32_t);
162
+ static inline uint64_t ruby_swap64(uint64_t);
163
+ static inline unsigned nlz_int(unsigned x);
164
+ static inline unsigned nlz_long(unsigned long x);
165
+ static inline unsigned nlz_long_long(unsigned long long x);
166
+ static inline unsigned nlz_intptr(uintptr_t x);
167
+ static inline unsigned nlz_int32(uint32_t x);
168
+ static inline unsigned nlz_int64(uint64_t x);
169
+ #ifdef HAVE_UINT128_T
170
+ static inline unsigned nlz_int128(uint128_t x);
171
+ #endif
172
+ static inline unsigned rb_popcount32(uint32_t x);
173
+ static inline unsigned rb_popcount64(uint64_t x);
174
+ static inline unsigned rb_popcount_intptr(uintptr_t x);
175
+ static inline int ntz_int32(uint32_t x);
176
+ static inline int ntz_int64(uint64_t x);
177
+ static inline int ntz_intptr(uintptr_t x);
178
+ static inline VALUE RUBY_BIT_ROTL(VALUE, int);
179
+ static inline VALUE RUBY_BIT_ROTR(VALUE, int);
180
+
181
+ static inline uint16_t
182
+ ruby_swap16(uint16_t x)
183
+ {
184
+ #if __has_builtin(__builtin_bswap16)
185
+ return __builtin_bswap16(x);
186
+
187
+ #elif MSC_VERSION_SINCE(1310)
188
+ return _byteswap_ushort(x);
189
+
190
+ #else
191
+ return (x << 8) | (x >> 8);
192
+
193
+ #endif
194
+ }
195
+
196
+ static inline uint32_t
197
+ ruby_swap32(uint32_t x)
198
+ {
199
+ #if __has_builtin(__builtin_bswap32)
200
+ return __builtin_bswap32(x);
201
+
202
+ #elif MSC_VERSION_SINCE(1310)
203
+ return _byteswap_ulong(x);
204
+
205
+ #else
206
+ x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16);
207
+ x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
208
+ return x;
209
+
210
+ #endif
211
+ }
212
+
213
+ static inline uint64_t
214
+ ruby_swap64(uint64_t x)
215
+ {
216
+ #if __has_builtin(__builtin_bswap64)
217
+ return __builtin_bswap64(x);
218
+
219
+ #elif MSC_VERSION_SINCE(1310)
220
+ return _byteswap_uint64(x);
221
+
222
+ #else
223
+ x = ((x & 0x00000000FFFFFFFFULL) << 32) | ((x & 0xFFFFFFFF00000000ULL) >> 32);
224
+ x = ((x & 0x0000FFFF0000FFFFULL) << 16) | ((x & 0xFFFF0000FFFF0000ULL) >> 16);
225
+ x = ((x & 0x00FF00FF00FF00FFULL) << 8) | ((x & 0xFF00FF00FF00FF00ULL) >> 8);
226
+ return x;
227
+
228
+ #endif
229
+ }
230
+
231
+ static inline unsigned int
232
+ nlz_int32(uint32_t x)
233
+ {
234
+ #if defined(_MSC_VER) && defined(__AVX2__)
235
+ /* Note: It seems there is no such thing like __LZCNT__ predefined in MSVC.
236
+ * AMD CPUs have had this instruction for decades (since K10) but for
237
+ * Intel, Haswell is the oldest one. We need to use __AVX2__ for maximum
238
+ * safety. */
239
+ return (unsigned int)__lzcnt(x);
240
+
241
+ #elif defined(__x86_64__) && defined(__LZCNT__)
242
+ return (unsigned int)_lzcnt_u32(x);
243
+
244
+ #elif MSC_VERSION_SINCE(1400) /* &&! defined(__AVX2__) */
245
+ unsigned long r;
246
+ return _BitScanReverse(&r, x) ? (31 - (int)r) : 32;
247
+
248
+ #elif __has_builtin(__builtin_clz)
249
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT == 32);
250
+ return x ? (unsigned int)__builtin_clz(x) : 32;
251
+
252
+ #else
253
+ uint32_t y;
254
+ unsigned n = 32;
255
+ y = x >> 16; if (y) {n -= 16; x = y;}
256
+ y = x >> 8; if (y) {n -= 8; x = y;}
257
+ y = x >> 4; if (y) {n -= 4; x = y;}
258
+ y = x >> 2; if (y) {n -= 2; x = y;}
259
+ y = x >> 1; if (y) {return n - 2;}
260
+ return (unsigned int)(n - x);
261
+ #endif
262
+ }
263
+
264
+ static inline unsigned int
265
+ nlz_int64(uint64_t x)
266
+ {
267
+ #if defined(_MSC_VER) && defined(__AVX2__)
268
+ return (unsigned int)__lzcnt64(x);
269
+
270
+ #elif defined(__x86_64__) && defined(__LZCNT__)
271
+ return (unsigned int)_lzcnt_u64(x);
272
+
273
+ #elif defined(_WIN64) && MSC_VERSION_SINCE(1400) /* &&! defined(__AVX2__) */
274
+ unsigned long r;
275
+ return _BitScanReverse64(&r, x) ? (63u - (unsigned int)r) : 64;
276
+
277
+ #elif __has_builtin(__builtin_clzl)
278
+ if (x == 0) {
279
+ return 64;
280
+ }
281
+ else if (sizeof(long) * CHAR_BIT == 64) {
282
+ return (unsigned int)__builtin_clzl((unsigned long)x);
283
+ }
284
+ else if (sizeof(long long) * CHAR_BIT == 64) {
285
+ return (unsigned int)__builtin_clzll((unsigned long long)x);
286
+ }
287
+ else {
288
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
289
+ UNREACHABLE_RETURN(~0);
290
+ }
291
+
292
+ #else
293
+ uint64_t y;
294
+ unsigned int n = 64;
295
+ y = x >> 32; if (y) {n -= 32; x = y;}
296
+ y = x >> 16; if (y) {n -= 16; x = y;}
297
+ y = x >> 8; if (y) {n -= 8; x = y;}
298
+ y = x >> 4; if (y) {n -= 4; x = y;}
299
+ y = x >> 2; if (y) {n -= 2; x = y;}
300
+ y = x >> 1; if (y) {return n - 2;}
301
+ return (unsigned int)(n - x);
302
+
303
+ #endif
304
+ }
305
+
306
+ #ifdef HAVE_UINT128_T
307
+ static inline unsigned int
308
+ nlz_int128(uint128_t x)
309
+ {
310
+ uint64_t y = (uint64_t)(x >> 64);
311
+
312
+ if (x == 0) {
313
+ return 128;
314
+ }
315
+ else if (y == 0) {
316
+ return (unsigned int)nlz_int64(x) + 64;
317
+ }
318
+ else {
319
+ return (unsigned int)nlz_int64(y);
320
+ }
321
+ }
322
+ #endif
323
+
324
+ static inline unsigned int
325
+ nlz_int(unsigned int x)
326
+ {
327
+ if (sizeof(unsigned int) * CHAR_BIT == 32) {
328
+ return nlz_int32((uint32_t)x);
329
+ }
330
+ else if (sizeof(unsigned int) * CHAR_BIT == 64) {
331
+ return nlz_int64((uint64_t)x);
332
+ }
333
+ else {
334
+ UNREACHABLE_RETURN(~0);
335
+ }
336
+ }
337
+
338
+ static inline unsigned int
339
+ nlz_long(unsigned long x)
340
+ {
341
+ if (sizeof(unsigned long) * CHAR_BIT == 32) {
342
+ return nlz_int32((uint32_t)x);
343
+ }
344
+ else if (sizeof(unsigned long) * CHAR_BIT == 64) {
345
+ return nlz_int64((uint64_t)x);
346
+ }
347
+ else {
348
+ UNREACHABLE_RETURN(~0);
349
+ }
350
+ }
351
+
352
+ static inline unsigned int
353
+ nlz_long_long(unsigned long long x)
354
+ {
355
+ if (sizeof(unsigned long long) * CHAR_BIT == 64) {
356
+ return nlz_int64((uint64_t)x);
357
+ }
358
+ #ifdef HAVE_UINT128_T
359
+ else if (sizeof(unsigned long long) * CHAR_BIT == 128) {
360
+ return nlz_int128((uint128_t)x);
361
+ }
362
+ #endif
363
+ else {
364
+ UNREACHABLE_RETURN(~0);
365
+ }
366
+ }
367
+
368
+ static inline unsigned int
369
+ nlz_intptr(uintptr_t x)
370
+ {
371
+ if (sizeof(uintptr_t) == sizeof(unsigned int)) {
372
+ return nlz_int((unsigned int)x);
373
+ }
374
+ if (sizeof(uintptr_t) == sizeof(unsigned long)) {
375
+ return nlz_long((unsigned long)x);
376
+ }
377
+ if (sizeof(uintptr_t) == sizeof(unsigned long long)) {
378
+ return nlz_long_long((unsigned long long)x);
379
+ }
380
+ else {
381
+ UNREACHABLE_RETURN(~0);
382
+ }
383
+ }
384
+
385
+ static inline unsigned int
386
+ rb_popcount32(uint32_t x)
387
+ {
388
+ #if defined(_MSC_VER) && defined(__AVX__)
389
+ /* Note: CPUs since Nehalem and Barcelona have had this instruction so SSE
390
+ * 4.2 should suffice, but it seems there is no such thing like __SSE_4_2__
391
+ * predefined macro in MSVC. They do have __AVX__ so use it instead. */
392
+ return (unsigned int)__popcnt(x);
393
+
394
+ #elif __has_builtin(__builtin_popcount)
395
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT >= 32);
396
+ return (unsigned int)__builtin_popcount(x);
397
+
398
+ #else
399
+ x = (x & 0x55555555) + (x >> 1 & 0x55555555);
400
+ x = (x & 0x33333333) + (x >> 2 & 0x33333333);
401
+ x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
402
+ x = (x & 0x001f001f) + (x >> 8 & 0x001f001f);
403
+ x = (x & 0x0000003f) + (x >>16 & 0x0000003f);
404
+ return (unsigned int)x;
405
+
406
+ #endif
407
+ }
408
+
409
+ static inline unsigned int
410
+ rb_popcount64(uint64_t x)
411
+ {
412
+ #if defined(_MSC_VER) && defined(__AVX__)
413
+ return (unsigned int)__popcnt64(x);
414
+
415
+ #elif __has_builtin(__builtin_popcount)
416
+ if (sizeof(long) * CHAR_BIT == 64) {
417
+ return (unsigned int)__builtin_popcountl((unsigned long)x);
418
+ }
419
+ else if (sizeof(long long) * CHAR_BIT == 64) {
420
+ return (unsigned int)__builtin_popcountll((unsigned long long)x);
421
+ }
422
+ else {
423
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
424
+ UNREACHABLE_RETURN(~0);
425
+ }
426
+
427
+ #else
428
+ x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
429
+ x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
430
+ x = (x & 0x0707070707070707) + (x >> 4 & 0x0707070707070707);
431
+ x = (x & 0x001f001f001f001f) + (x >> 8 & 0x001f001f001f001f);
432
+ x = (x & 0x0000003f0000003f) + (x >>16 & 0x0000003f0000003f);
433
+ x = (x & 0x000000000000007f) + (x >>32 & 0x000000000000007f);
434
+ return (unsigned int)x;
435
+
436
+ #endif
437
+ }
438
+
439
+ static inline unsigned int
440
+ rb_popcount_intptr(uintptr_t x)
441
+ {
442
+ if (sizeof(uintptr_t) * CHAR_BIT == 64) {
443
+ return rb_popcount64((uint64_t)x);
444
+ }
445
+ else if (sizeof(uintptr_t) * CHAR_BIT == 32) {
446
+ return rb_popcount32((uint32_t)x);
447
+ }
448
+ else {
449
+ UNREACHABLE_RETURN(~0);
450
+ }
451
+ }
452
+
453
+ static inline int
454
+ ntz_int32(uint32_t x)
455
+ {
456
+ #if defined(__x86_64__) && defined(__BMI__)
457
+ return (unsigned)_tzcnt_u32(x);
458
+
459
+ #elif MSC_VERSION_SINCE(1400)
460
+ /* :FIXME: Is there any way to issue TZCNT instead of BSF, apart from using
461
+ * assembly? Because issuing LZCNT seems possible (see nlz.h). */
462
+ unsigned long r;
463
+ return _BitScanForward(&r, x) ? (int)r : 32;
464
+
465
+ #elif __has_builtin(__builtin_ctz)
466
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT == 32);
467
+ return x ? (unsigned)__builtin_ctz(x) : 32;
468
+
469
+ #else
470
+ return rb_popcount32((~x) & (x-1));
471
+
472
+ #endif
473
+ }
474
+
475
+ static inline int
476
+ ntz_int64(uint64_t x)
477
+ {
478
+ #if defined(__x86_64__) && defined(__BMI__)
479
+ return (unsigned)_tzcnt_u64(x);
480
+
481
+ #elif defined(_WIN64) && MSC_VERSION_SINCE(1400)
482
+ unsigned long r;
483
+ return _BitScanForward64(&r, x) ? (int)r : 64;
484
+
485
+ #elif __has_builtin(__builtin_ctzl)
486
+ if (x == 0) {
487
+ return 64;
488
+ }
489
+ else if (sizeof(long) * CHAR_BIT == 64) {
490
+ return (unsigned)__builtin_ctzl((unsigned long)x);
491
+ }
492
+ else if (sizeof(long long) * CHAR_BIT == 64) {
493
+ return (unsigned)__builtin_ctzll((unsigned long long)x);
494
+ }
495
+ else {
496
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
497
+ UNREACHABLE_RETURN(~0);
498
+ }
499
+
500
+ #else
501
+ return rb_popcount64((~x) & (x-1));
502
+
503
+ #endif
504
+ }
505
+
506
+ static inline int
507
+ ntz_intptr(uintptr_t x)
508
+ {
509
+ if (sizeof(uintptr_t) * CHAR_BIT == 64) {
510
+ return ntz_int64((uint64_t)x);
511
+ }
512
+ else if (sizeof(uintptr_t) * CHAR_BIT == 32) {
513
+ return ntz_int32((uint32_t)x);
514
+ }
515
+ else {
516
+ UNREACHABLE_RETURN(~0);
517
+ }
518
+ }
519
+
520
+ static inline VALUE
521
+ RUBY_BIT_ROTL(VALUE v, int n)
522
+ {
523
+ #if __has_builtin(__builtin_rotateleft32) && (SIZEOF_VALUE * CHAR_BIT == 32)
524
+ return __builtin_rotateleft32(v, n);
525
+
526
+ #elif __has_builtin(__builtin_rotateleft64) && (SIZEOF_VALUE * CHAR_BIT == 64)
527
+ return __builtin_rotateleft64(v, n);
528
+
529
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 32)
530
+ return _rotl(v, n);
531
+
532
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 64)
533
+ return _rotl64(v, n);
534
+
535
+ #elif defined(_lrotl) && (SIZEOF_VALUE == SIZEOF_LONG)
536
+ return _lrotl(v, n);
537
+
538
+ #else
539
+ const int m = (sizeof(VALUE) * CHAR_BIT) - 1;
540
+ return (v << (n & m)) | (v >> (-n & m));
541
+ #endif
542
+ }
543
+
544
+ static inline VALUE
545
+ RUBY_BIT_ROTR(VALUE v, int n)
546
+ {
547
+ #if __has_builtin(__builtin_rotateright32) && (SIZEOF_VALUE * CHAR_BIT == 32)
548
+ return __builtin_rotateright32(v, n);
549
+
550
+ #elif __has_builtin(__builtin_rotateright64) && (SIZEOF_VALUE * CHAR_BIT == 64)
551
+ return __builtin_rotateright64(v, n);
552
+
553
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 32)
554
+ return _rotr(v, n);
555
+
556
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 64)
557
+ return _rotr64(v, n);
558
+
559
+ #elif defined(_lrotr) && (SIZEOF_VALUE == SIZEOF_LONG)
560
+ return _lrotr(v, n);
561
+
562
+ #else
563
+ const int m = (sizeof(VALUE) * CHAR_BIT) - 1;
564
+ return (v << (-n & m)) | (v >> (n & m));
565
+ #endif
566
+ }
567
+
568
+ #endif /* INTERNAL_BITS_H */