Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 18 additions & 24 deletions src/libcxx/include/bit
Original file line number Diff line number Diff line change
Expand Up @@ -289,32 +289,32 @@ int bit_width(_Tp __t) noexcept;

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

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

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

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

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

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

//------------------------------------------------------------------------------
Expand All @@ -327,49 +327,43 @@ _Tp bit_ceil(_Tp __t) noexcept;
template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned char bit_ceil(unsigned char __t) noexcept {
return
(static_cast<signed char>(__t) > 0)
? (static_cast<unsigned char>(1) << bit_width<unsigned char>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned char>(std::numeric_limits<signed char>::min()))
? ((__t != 0) ? (static_cast<unsigned char>(1) << bit_width<unsigned char>(__t - 1)) : 1) : 0;
}

template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned short bit_ceil(unsigned short __t) noexcept {
return
(static_cast<signed short>(__t) > 0)
? (static_cast<unsigned short>(1) << bit_width<unsigned short>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned short>(std::numeric_limits<signed short>::min()))
? ((__t != 0) ? (static_cast<unsigned short>(1) << bit_width<unsigned short>(__t - 1)) : 1) : 0;
}

template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned int bit_ceil(unsigned int __t) noexcept {
return
(static_cast<signed int>(__t) > 0)
? (static_cast<unsigned int>(1) << bit_width<unsigned int>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned int>(std::numeric_limits<signed int>::min()))
? ((__t != 0) ? (static_cast<unsigned int>(1) << bit_width<unsigned int>(__t - 1)) : 1) : 0;
}

template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned long bit_ceil(unsigned long __t) noexcept {
return
(static_cast<signed long>(__t) > 0)
? (static_cast<unsigned long>(1) << bit_width<unsigned long>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned long>(std::numeric_limits<signed long>::min()))
? ((__t != 0) ? (static_cast<unsigned long>(1) << bit_width<unsigned long>(__t - 1)) : 1) : 0;
}

template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned __int48 bit_ceil(unsigned __int48 __t) noexcept {
return
(static_cast<signed __int48>(__t) > 0)
? (static_cast<unsigned __int48>(1) << bit_width<unsigned __int48>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned __int48>(std::numeric_limits<signed __int48>::min()))
? ((__t != 0) ? (static_cast<unsigned __int48>(1) << bit_width<unsigned __int48>(__t - 1)) : 1) : 0;
}

template <> _EZCXX_NODISCARD _EZCXX_INLINE constexpr
unsigned long long bit_ceil(unsigned long long __t) noexcept {
return
(static_cast<signed long long>(__t) > 0)
? (static_cast<unsigned long long>(1) << bit_width<unsigned long long>(__t - 1))
: ((__t == 0) ? 1 : 0);
(__t <= static_cast<unsigned long long>(std::numeric_limits<signed long long>::min()))
? ((__t != 0) ? (static_cast<unsigned long long>(1) << bit_width<unsigned long long>(__t - 1)) : 1) : 0;
}

//------------------------------------------------------------------------------
Expand Down
81 changes: 69 additions & 12 deletions test/standalone/stdbit/src/data.asm
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,77 @@ _zero_u48:
_zero_u64:
db $00, $00, $00, $00, $00, $00, $00, $00

public _ones_u8
public _ones_u16
public _ones_u24
public _ones_u32
public _ones_u48
public _ones_u64
_ones_u8:
_ones_u16:
_ones_u24:
_ones_u32:
_ones_u48:
_ones_u64:
public _one_u8
public _one_u16
public _one_u24
public _one_u32
public _one_u48
public _one_u64
_one_u8:
_one_u16:
_one_u24:
_one_u32:
_one_u48:
_one_u64:
db $01, $00, $00, $00, $00, $00, $00, $00

public _umax_u8
public _umax_u16
public _umax_u24
public _umax_u32
public _umax_u48
public _umax_u64
_umax_u8:
_umax_u16:
_umax_u24:
_umax_u32:
_umax_u48:
_umax_u64:
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF

public _smin_u8
public _smin_u16
public _smin_u24
public _smin_u32
public _smin_u48
public _smin_u64
_smin_u64:
db $00
db $00
_smin_u48:
db $00
db $00
_smin_u32:
db $00
_smin_u24:
db $00
_smin_u16:
db $00
_smin_u8:
db $80

public _smax_u8
public _smax_u16
public _smax_u24
public _smax_u32
public _smax_u48
public _smax_u64
_smax_u64:
db $FF
db $FF
_smax_u48:
db $FF
db $FF
_smax_u32:
db $FF
_smax_u24:
db $FF
_smax_u16:
db $FF
_smax_u8:
db $7F


public _val_0
_val_0:
db 0
Expand Down
33 changes: 27 additions & 6 deletions test/standalone/stdbit/src/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,33 @@ extern uint32_t zero_u32;
extern uint48_t zero_u48;
extern uint64_t zero_u64;

extern uint8_t ones_u8;
extern uint16_t ones_u16;
extern uint24_t ones_u24;
extern uint32_t ones_u32;
extern uint48_t ones_u48;
extern uint64_t ones_u64;
extern uint8_t one_u8;
extern uint16_t one_u16;
extern uint24_t one_u24;
extern uint32_t one_u32;
extern uint48_t one_u48;
extern uint64_t one_u64;

extern uint8_t umax_u8;
extern uint16_t umax_u16;
extern uint24_t umax_u24;
extern uint32_t umax_u32;
extern uint48_t umax_u48;
extern uint64_t umax_u64;

extern uint8_t smin_u8;
extern uint16_t smin_u16;
extern uint24_t smin_u24;
extern uint32_t smin_u32;
extern uint48_t smin_u48;
extern uint64_t smin_u64;

extern uint8_t smax_u8;
extern uint16_t smax_u16;
extern uint24_t smax_u24;
extern uint32_t smax_u32;
extern uint48_t smax_u48;
extern uint64_t smax_u64;

extern uint8_t val_0;
extern uint8_t val_1;
Expand Down
Loading
Loading