libstdc++: Optimize C++20 comparison category types
authorJonathan Wakely <jwakely@redhat.com>
Thu, 6 Feb 2020 13:31:36 +0000 (13:31 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 7 Feb 2020 14:09:03 +0000 (14:09 +0000)
commit0d57370c9cc3c1fb68be96b8cc15b92496c4dd21
treeb30d5474e4cbbf0241e2178fee75a909338e8777
parent82aee6dd61e2a5b4e4b124f896c8403169688f41
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.
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/compare
libstdc++-v3/testsuite/18_support/comparisons/categories/partialord.cc [new file with mode: 0644]
libstdc++-v3/testsuite/18_support/comparisons/categories/strongord.cc [new file with mode: 0644]
libstdc++-v3/testsuite/18_support/comparisons/categories/weakord.cc [new file with mode: 0644]