diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-06 13:31:36 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-07 14:09:03 +0000 |
commit | 0d57370c9cc3c1fb68be96b8cc15b92496c4dd21 (patch) | |
tree | b30d5474e4cbbf0241e2178fee75a909338e8777 /gcc | |
parent | 82aee6dd61e2a5b4e4b124f896c8403169688f41 (diff) | |
download | gcc-0d57370c9cc3c1fb68be96b8cc15b92496c4dd21.zip gcc-0d57370c9cc3c1fb68be96b8cc15b92496c4dd21.tar.gz gcc-0d57370c9cc3c1fb68be96b8cc15b92496c4dd21.tar.bz2 |
libstdc++: Optimize C++20 comparison category types
This reduces the size and alignment of all three comparison category
types to a single byte. The partial_ordering::_M_is_ordered flag is
replaced by the value 0x02 in the _M_value member.
This also optimizes conversion and comparison operators to avoid
conditional branches where possible, by comparing _M_value to constants
or using bitwise operations to correctly handle the unordered state.
* libsupc++/compare (__cmp_cat::type): Define typedef for underlying
type of enumerations and comparison category types.
(__cmp_cat::_Ord, __cmp_cat::_Ncmp): Add underlying type.
(__cmp_cat::_Ncmp::unordered): Change value to 2.
(partial_ordering::_M_value, weak_ordering::_M_value)
(strong_ordering::_M_value): Change type to __cmp_cat::type.
(partial_ordering::_M_is_ordered): Remove data member.
(partial_ordering): Use second bit of _M_value for unordered. Adjust
comparison operators.
(weak_ordering::operator partial_ordering): Simplify to remove
branches.
(operator<=>(unspecified, weak_ordering)): Likewise.
(strong_ordering::operator partial_ordering): Likewise.
(strong_ordering::operator weak_ordering): Likewise.
(operator<=>(unspecified, strong_ordering)): Likewise.
* testsuite/18_support/comparisons/categories/partialord.cc: New test.
* testsuite/18_support/comparisons/categories/strongord.cc: New test.
* testsuite/18_support/comparisons/categories/weakord.cc: New test.
Diffstat (limited to 'gcc')
0 files changed, 0 insertions, 0 deletions