Per the cxx_status documentation:<div><br></div><div>"<font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="background-color:rgba(255,255,255,0)"><code>__int128</code> is not treated as an extended integer type, because changing<code>intmax_t</code> would be an ABI-incompatible change."</span></font></div>
<div><font size="3"><span style><br></span></font></div><div><font size="3"><span style>With this in mind, I don't think it makes sense for these intrinsics to accept __int128.<br></span></font><br>On Sunday, March 2, 2014, Stephan Tolksdorf <<a href="mailto:st@quanttec.com">st@quanttec.com</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi mclow.lists,<br>
<br>
<br>
I've added _LIBCPP_INT128 and _LIBCPP_UINT128 macros to __config to make it easy to support 128-bit integers that are not spelled __int128_t and __uint128_t.<br>
<br>
I was't sure whether the __SIZEOF_INT128__ check should be moved into the compiler-dependent sections of __config or not. AFAIK, 128-bit integer types are currently only supported by GCC-compatible compilers.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D2917" target="_blank">http://llvm-reviews.chandlerc.com/D2917</a><br>
<br>
Files:<br>
  include/__config<br>
  include/type_traits<br>
  test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp<br>
  test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp<br>
  test/utilities/meta/meta.unary/<a href="http://meta.unary.cat/integral.pass.cpp" target="_blank">meta.unary.cat/integral.pass.cpp</a><br>
  test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp<br>
  test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp<br>
  test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp<br>
<br>
Index: include/__config<br>
===================================================================<br>
--- include/__config<br>
+++ include/__config<br>
@@ -485,6 +485,11 @@<br>
 typedef unsigned int   char32_t;<br>
 #endif  // _LIBCPP_HAS_NO_UNICODE_CHARS<br>
<br>
+#ifdef __SIZEOF_INT128__<br>
+#define _LIBCPP_INT128   __int128_t<br>
+#define _LIBCPP_UINT128 __uint128_t<br>
+#endif<br>
+<br>
 #ifdef _LIBCPP_HAS_NO_STATIC_ASSERT<br>
<br>
 template <bool> struct __static_assert_test;<br>
Index: include/type_traits<br>
===================================================================<br>
--- include/type_traits<br>
+++ include/type_traits<br>
@@ -324,6 +324,10 @@<br>
 template <>          struct __libcpp_is_integral<unsigned long>      : public true_type {};<br>
 template <>          struct __libcpp_is_integral<long long>          : public true_type {};<br>
 template <>          struct __libcpp_is_integral<unsigned long long> : public true_type {};<br>
+#ifdef _LIBCPP_INT128<br>
+template <>          struct __libcpp_is_integral<_LIBCPP_INT128>     : public true_type {};<br>
+template <>          struct __libcpp_is_integral<_LIBCPP_UINT128>    : public true_type {};<br>
+#endif<br>
<br>
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_integral<br>
     : public __libcpp_is_integral<typename remove_cv<_Tp>::type> {};<br>
@@ -1239,16 +1243,24 @@<br>
     __type_list<signed int,<br>
     __type_list<signed long,<br>
     __type_list<signed long long,<br>
+#ifdef _LIBCPP_INT128<br>
+    __type_list<_LIBCPP_INT128, __nat><br>
+#else<br>
     __nat<br>
+#endif<br>
     > > > > > __signed_types;<br>
<br>
 typedef<br>
     __type_list<unsigned char,<br>
     __type_list<unsigned short,<br>
     __type_list<unsigned int,<br>
     __type_list<unsigned long,<br>
     __type_list<unsigned long long,<br>
+#ifdef _LIBCPP_UINT128<br>
+    __type_list<_LIBCPP_UINT128, __nat><br>
+#else<br>
     __nat<br>
+#endif<br>
     > > > > > __unsigned_types;<br>
<br>
 template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first;<br>
@@ -1332,6 +1344,10 @@<br>
 template <> struct __make_signed<unsigned long,      true> {typedef long      type;};<br>
 template <> struct __make_signed<  signed long long, true> {typedef long long type;};<br>
 template <> struct __make_signed<unsigned long long, true> {typedef long long type;};<br>
+#ifdef _LIBCPP_INT128<br>
+template <> struct __make_signed<_LIBCPP_INT128,     true> {typedef _LIBCPP_INT128 type;};<br>
+template <> struct __make_signed<_LIBCPP_UINT128,    true> {typedef _LIBCPP_INT128 type;};<br>
+#endif<br>
<br>
 template <class _Tp><br>
 struct _LIBCPP_TYPE_VIS_ONLY make_signed<br>
@@ -1361,6 +1377,10 @@<br>
 template <> struct __make_unsigned<unsigned long,      true> {typedef unsigned long      type;};<br>
 template <> struct __make_unsigned<  signed long long, true> {typedef unsigned long long type;};<br>
 template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;};<br>
+#ifdef _LIBCPP_INT128<br>
+template <> struct __make_unsigned<_LIBCPP_INT128,     true> {typedef _LIBCPP_UINT128    type;};<br>
+template <> struct __make_unsigned<_LIBCPP_UINT128,    true> {typedef _LIBCPP_UINT128    type;};<br>
+#endif<br>
<br>
 template <class _Tp><br>
 struct _LIBCPP_TYPE_VIS_ONLY make_unsigned<br>
Index: test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp<br>
===================================================================<br>
--- test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp<br>
+++ test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp<br>
@@ -21,6 +21,13 @@<br>
     big = 0xFFFFFFFFFFFFFFFFULL<br>
 };<br>
<br>
+#ifdef _LIBCPP_INT128<br>
+enum HugeEnum : _LIBCPP_UINT128<br>
+{<br>
+    hugezero<br>
+};<br>
+#endif<br>
+<br>
 template <class T, class U><br>
 void test_make_signed()<br>
 {<br>
@@ -47,4 +54,9 @@<br>
     test_make_signed< const wchar_t, std::conditional<sizeof(wchar_t) == 4, const int, const short>::type >();<br>
     test_make_signed< const Enum, const int >();<br>
     test_make_signed< BigEnum, std::conditional<sizeof(long) == 4, long long, long>::type >();<br>
+#ifdef _LIBCPP_INT128<br>
+    test_make_signed< _LIBCPP_INT128, _LIBCPP_INT128 >();<br>
+    test_make_signed< _LIBCPP_UINT128, _LIBCPP_INT128 >();<br>
+    test_make_signed< HugeEnum, _LIBCPP_INT128 >();<br>
+#endif<br>
 }<br>
Index: test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp<br>
===================================================================<br>
--- test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp<br>
+++ test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp<br>
@@ -21,6 +21,13 @@<br>
     big = 0xFFFFFFFFFFFFFFFFULL<br>
 };<br>
<br>
+#ifdef _LIBCPP_INT128<br>
+enum HugeEnum : _LIBCPP_INT128<br>
+{<br>
+    hugezero<br>
+};<br>
+#endif<br>
+<br>
 template <class T, class U><br>
 void test_make_unsigned()<br>
 {<br>
@@ -48,4 +55,9 @@<br>
     test_make_unsigned<const Enum, const unsigned int> ();<br>
     test_make_unsigned<BigEnum,<br>
                    std::conditional<sizeof(long) == 4, unsigned long long, unsigned long>::type> ();<br>
+#ifdef _LIBCPP_INT128<br>
+    test_make_unsigned<_LIBCPP_INT128, _LIBCPP_UINT128>();<br>
+    test_make_unsigned<_LIBCPP_UINT128, _LIBCPP_UINT128>();<br>
+    test_make_unsigned<HugeEnum, _LIBCPP_UINT128>();<br>
+#endif<br>
 }<br>
Index: test/utilities/meta/meta.unary/<a href="http://meta.unary.cat/integral.pass.cpp" target="_blank">meta.unary.cat/integral.pass.cpp</a><br>
===================================================================<br>
--- test/utilities/meta/meta.unary/<a href="http://meta.unary.cat/integral.pass.cpp" target="_blank">meta.unary.cat/integral.pass.cpp</a><br>
+++ test/utilities/meta/meta.unary/<a href="http://meta.unary.cat/integral.pass.cpp" target="_blank">meta.unary.cat/integral.pass.cpp</a><br>
@@ -58,4 +58,8 @@<br>
     test_integral<unsigned long>();<br>
     test_integral<long long>();<br>
     test_integral<unsigned long long>();<br>
+#ifdef _LIBCPP_INT128<br>
+    test_integral<_LIBCPP_INT128>();<br>
+    test_integral<_LIBCPP_UINT128>();<br>
+#endif<br>
 }<br>
Index: test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp<br>
===================================================================<br>
--- test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp<br>
+++ test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp<br>
@@ -49,4 +49,8 @@<br>
     test_integral<unsigned long>();<br>
     test_integral<long long>();<br>
     test_integral<unsigned long long>();<br>
+#ifdef _LIBCPP_INT128<br>
+    test_integral<_LIBCPP_INT128>();<br>
+    test_integral<_LIBCPP_UINT128>();<br>
+#endif<br>
 }<br>
Index: test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp<br>
===================================================================<br>
--- test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp<br>
+++ test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp<br>
@@ -51,4 +51,9 @@<br>
<br>
     test_is_signed<int>();<br>
     test_is_signed<double>();<br>
+<br>
+#ifdef _LIBCPP_INT128<br>
+    test_is_signed<_LIBCPP_INT128>();<br>
+    test_is_not_signed<_LIBCPP_UINT128>();<br>
+#endif<br>
 }<br>
Index: test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp<br>
===================================================================<br>
--- test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp<br>
+++ test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp<br>
@@ -51,4 +51,9 @@<br>
<br>
     test_is_unsigned<bool>();<br>
     test_is_unsigned<unsigned>();<br>
+<br>
+#ifdef _LIBCPP_INT128<br>
+    test_is_unsigned<_LIBCPP_UINT128>();<br>
+    test_is_not_unsigned<_LIBCPP_INT128>();<br>
+#endif<br>
 }<br>
</blockquote></div>