Skip to content

Commit e1a11b1

Browse files
ZERICO2005mateoconlechuga
authored andcommitted
Fixed behaviour of C++ <bit>
1 parent 6e58912 commit e1a11b1

File tree

5 files changed

+470
-123
lines changed

5 files changed

+470
-123
lines changed

src/libcxx/include/bit

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -289,32 +289,32 @@ int bit_width(_Tp __t) noexcept;
289289

290290
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
291291
int bit_width(unsigned char __t) noexcept {
292-
return 8 - __ez80_clzc(__t);
292+
return std::numeric_limits<unsigned char>::digits- __ez80_clzc(__t);
293293
}
294294

295295
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
296296
int bit_width(unsigned short __t) noexcept {
297-
return 16 - __builtin_clzs(__t);
297+
return std::numeric_limits<unsigned short>::digits - __builtin_clzs(__t);
298298
}
299299

300300
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
301301
int bit_width(unsigned int __t) noexcept {
302-
return 24 - __builtin_clz(__t);
302+
return std::numeric_limits<unsigned int>::digits - __builtin_clz(__t);
303303
}
304304

305305
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
306306
int bit_width(unsigned long __t) noexcept {
307-
return 32 - __builtin_clzl(__t);
307+
return std::numeric_limits<unsigned long>::digits - __builtin_clzl(__t);
308308
}
309309

310310
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
311311
int bit_width(unsigned __int48 __t) noexcept {
312-
return 48 - __ez80_clzi48(__t);
312+
return std::numeric_limits<unsigned __int48>::digits - __ez80_clzi48(__t);
313313
}
314314

315315
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
316316
int bit_width(unsigned long long __t) noexcept {
317-
return 64 - __builtin_clzll(__t);
317+
return std::numeric_limits<unsigned long long>::digits - __builtin_clzll(__t);
318318
}
319319

320320
//------------------------------------------------------------------------------
@@ -327,49 +327,43 @@ _Tp bit_ceil(_Tp __t) noexcept;
327327
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
328328
unsigned char bit_ceil(unsigned char __t) noexcept {
329329
return
330-
(static_cast<signed char>(__t) > 0)
331-
? (static_cast<unsigned char>(1) << bit_width<unsigned char>(__t - 1))
332-
: ((__t == 0) ? 1 : 0);
330+
(__t <= static_cast<unsigned char>(std::numeric_limits<signed char>::min()))
331+
? ((__t != 0) ? (static_cast<unsigned char>(1) << bit_width<unsigned char>(__t - 1)) : 1) : 0;
333332
}
334333

335334
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
336335
unsigned short bit_ceil(unsigned short __t) noexcept {
337336
return
338-
(static_cast<signed short>(__t) > 0)
339-
? (static_cast<unsigned short>(1) << bit_width<unsigned short>(__t - 1))
340-
: ((__t == 0) ? 1 : 0);
337+
(__t <= static_cast<unsigned short>(std::numeric_limits<signed short>::min()))
338+
? ((__t != 0) ? (static_cast<unsigned short>(1) << bit_width<unsigned short>(__t - 1)) : 1) : 0;
341339
}
342340

343341
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
344342
unsigned int bit_ceil(unsigned int __t) noexcept {
345343
return
346-
(static_cast<signed int>(__t) > 0)
347-
? (static_cast<unsigned int>(1) << bit_width<unsigned int>(__t - 1))
348-
: ((__t == 0) ? 1 : 0);
344+
(__t <= static_cast<unsigned int>(std::numeric_limits<signed int>::min()))
345+
? ((__t != 0) ? (static_cast<unsigned int>(1) << bit_width<unsigned int>(__t - 1)) : 1) : 0;
349346
}
350347

351348
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
352349
unsigned long bit_ceil(unsigned long __t) noexcept {
353350
return
354-
(static_cast<signed long>(__t) > 0)
355-
? (static_cast<unsigned long>(1) << bit_width<unsigned long>(__t - 1))
356-
: ((__t == 0) ? 1 : 0);
351+
(__t <= static_cast<unsigned long>(std::numeric_limits<signed long>::min()))
352+
? ((__t != 0) ? (static_cast<unsigned long>(1) << bit_width<unsigned long>(__t - 1)) : 1) : 0;
357353
}
358354

359355
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
360356
unsigned __int48 bit_ceil(unsigned __int48 __t) noexcept {
361357
return
362-
(static_cast<signed __int48>(__t) > 0)
363-
? (static_cast<unsigned __int48>(1) << bit_width<unsigned __int48>(__t - 1))
364-
: ((__t == 0) ? 1 : 0);
358+
(__t <= static_cast<unsigned __int48>(std::numeric_limits<signed __int48>::min()))
359+
? ((__t != 0) ? (static_cast<unsigned __int48>(1) << bit_width<unsigned __int48>(__t - 1)) : 1) : 0;
365360
}
366361

367362
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
368363
unsigned long long bit_ceil(unsigned long long __t) noexcept {
369364
return
370-
(static_cast<signed long long>(__t) > 0)
371-
? (static_cast<unsigned long long>(1) << bit_width<unsigned long long>(__t - 1))
372-
: ((__t == 0) ? 1 : 0);
365+
(__t <= static_cast<unsigned long long>(std::numeric_limits<signed long long>::min()))
366+
? ((__t != 0) ? (static_cast<unsigned long long>(1) << bit_width<unsigned long long>(__t - 1)) : 1) : 0;
373367
}
374368

375369
//------------------------------------------------------------------------------

test/standalone/stdbit/src/data.asm

Lines changed: 69 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,77 @@ _zero_u48:
1616
_zero_u64:
1717
db $00, $00, $00, $00, $00, $00, $00, $00
1818

19-
public _ones_u8
20-
public _ones_u16
21-
public _ones_u24
22-
public _ones_u32
23-
public _ones_u48
24-
public _ones_u64
25-
_ones_u8:
26-
_ones_u16:
27-
_ones_u24:
28-
_ones_u32:
29-
_ones_u48:
30-
_ones_u64:
19+
public _one_u8
20+
public _one_u16
21+
public _one_u24
22+
public _one_u32
23+
public _one_u48
24+
public _one_u64
25+
_one_u8:
26+
_one_u16:
27+
_one_u24:
28+
_one_u32:
29+
_one_u48:
30+
_one_u64:
31+
db $01, $00, $00, $00, $00, $00, $00, $00
32+
33+
public _umax_u8
34+
public _umax_u16
35+
public _umax_u24
36+
public _umax_u32
37+
public _umax_u48
38+
public _umax_u64
39+
_umax_u8:
40+
_umax_u16:
41+
_umax_u24:
42+
_umax_u32:
43+
_umax_u48:
44+
_umax_u64:
3145
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
3246

47+
public _smin_u8
48+
public _smin_u16
49+
public _smin_u24
50+
public _smin_u32
51+
public _smin_u48
52+
public _smin_u64
53+
_smin_u64:
54+
db $00
55+
db $00
56+
_smin_u48:
57+
db $00
58+
db $00
59+
_smin_u32:
60+
db $00
61+
_smin_u24:
62+
db $00
63+
_smin_u16:
64+
db $00
65+
_smin_u8:
66+
db $80
67+
68+
public _smax_u8
69+
public _smax_u16
70+
public _smax_u24
71+
public _smax_u32
72+
public _smax_u48
73+
public _smax_u64
74+
_smax_u64:
75+
db $FF
76+
db $FF
77+
_smax_u48:
78+
db $FF
79+
db $FF
80+
_smax_u32:
81+
db $FF
82+
_smax_u24:
83+
db $FF
84+
_smax_u16:
85+
db $FF
86+
_smax_u8:
87+
db $7F
88+
89+
3390
public _val_0
3491
_val_0:
3592
db 0

test/standalone/stdbit/src/data.h

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,33 @@ extern uint32_t zero_u32;
1717
extern uint48_t zero_u48;
1818
extern uint64_t zero_u64;
1919

20-
extern uint8_t ones_u8;
21-
extern uint16_t ones_u16;
22-
extern uint24_t ones_u24;
23-
extern uint32_t ones_u32;
24-
extern uint48_t ones_u48;
25-
extern uint64_t ones_u64;
20+
extern uint8_t one_u8;
21+
extern uint16_t one_u16;
22+
extern uint24_t one_u24;
23+
extern uint32_t one_u32;
24+
extern uint48_t one_u48;
25+
extern uint64_t one_u64;
26+
27+
extern uint8_t umax_u8;
28+
extern uint16_t umax_u16;
29+
extern uint24_t umax_u24;
30+
extern uint32_t umax_u32;
31+
extern uint48_t umax_u48;
32+
extern uint64_t umax_u64;
33+
34+
extern uint8_t smin_u8;
35+
extern uint16_t smin_u16;
36+
extern uint24_t smin_u24;
37+
extern uint32_t smin_u32;
38+
extern uint48_t smin_u48;
39+
extern uint64_t smin_u64;
40+
41+
extern uint8_t smax_u8;
42+
extern uint16_t smax_u16;
43+
extern uint24_t smax_u24;
44+
extern uint32_t smax_u32;
45+
extern uint48_t smax_u48;
46+
extern uint64_t smax_u64;
2647

2748
extern uint8_t val_0;
2849
extern uint8_t val_1;

0 commit comments

Comments
 (0)