ruby-changes:29327
From: akr <ko1@a...>
Date: Tue, 18 Jun 2013 18:46:14 +0900 (JST)
Subject: [ruby-changes:29327] akr:r41379 (trunk): * configure.in: Check __int128.
akr 2013-06-18 18:46:01 +0900 (Tue, 18 Jun 2013) New Revision: 41379 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=41379 Log: * configure.in: Check __int128. * include/ruby/defines.h (BDIGIT_DBL): Use uint128_t if it is available. (BDIGIT): Use uint64_t if uint128_t is available. (SIZEOF_BDIGITS): Defined for above case. (BDIGIT_DBL_SIGNED): Ditto. (PRI_BDIGIT_PREFIX): Ditto. * include/ruby/ruby.h (PRI_64_PREFIX): Defined. * bignum.c (rb_big_pow): Don't use BITSPERDIG for the condition which rb_big_pow returns Float or Bignum. [ruby-dev:47413] [Feature #8509] Modified files: trunk/ChangeLog trunk/bignum.c trunk/configure.in trunk/include/ruby/defines.h trunk/include/ruby/ruby.h Index: include/ruby/defines.h =================================================================== --- include/ruby/defines.h (revision 41378) +++ include/ruby/defines.h (revision 41379) @@ -141,7 +141,13 @@ void xfree(void*); https://github.com/ruby/ruby/blob/trunk/include/ruby/defines.h#L141 # define SIZEOF_LONG_LONG SIZEOF___INT64 #endif -#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG +#if defined(HAVE_INT64_T) && defined(HAVE_INT128_T) +# define BDIGIT uint64_t +# define SIZEOF_BDIGITS SIZEOF_INT64_T +# define BDIGIT_DBL uint128_t +# define BDIGIT_DBL_SIGNED int128_t +# define PRI_BDIGIT_PREFIX PRI_64_PREFIX +#elif SIZEOF_INT*2 <= SIZEOF_LONG_LONG # define BDIGIT unsigned int # define SIZEOF_BDIGITS SIZEOF_INT # define BDIGIT_DBL unsigned LONG_LONG Index: include/ruby/ruby.h =================================================================== --- include/ruby/ruby.h (revision 41378) +++ include/ruby/ruby.h (revision 41379) @@ -115,6 +115,12 @@ typedef char ruby_check_sizeof_voidp[SIZ https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L115 #define PRI_LONG_PREFIX "l" #endif +#if SIZEOF_LONG == 8 +#define PRI_64_PREFIX PRI_LONG_PREFIX +#elif SIZEOF_LONG_LONG == 8 +#define PRI_64_PREFIX PRI_LL_PREFIX +#endif + #if defined PRIdPTR && !defined PRI_VALUE_PREFIX #define PRIdVALUE PRIdPTR #define PRIoVALUE PRIoPTR Index: configure.in =================================================================== --- configure.in (revision 41378) +++ configure.in (revision 41379) @@ -1155,6 +1155,7 @@ RUBY_CHECK_SIZEOF(short) https://github.com/ruby/ruby/blob/trunk/configure.in#L1155 RUBY_CHECK_SIZEOF(long, [int], [ILP LP]) RUBY_CHECK_SIZEOF(long long) RUBY_CHECK_SIZEOF(__int64) +RUBY_CHECK_SIZEOF(__int128) RUBY_CHECK_SIZEOF(off_t) RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP]) RUBY_CHECK_SIZEOF(float) @@ -1577,6 +1578,7 @@ typedef $1 t; int s = sizeof(t) == 42;]) https://github.com/ruby/ruby/blob/trunk/configure.in#L1578 ["$ac_cv_sizeof_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long"], ["$ac_cv_sizeof_long_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long long"], ["$ac_cv_sizeof___int64"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int64"], + ["$ac_cv_sizeof___int128"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int128"], [ rb_cv_type_$1=no])])]) if test "${rb_cv_type_$1}" != no; then AC_DEFINE([HAVE_]AS_TR_CPP($1), 1) Index: ChangeLog =================================================================== --- ChangeLog (revision 41378) +++ ChangeLog (revision 41379) @@ -1,3 +1,20 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Tue Jun 18 18:39:58 2013 Tanaka Akira <akr@f...> + + * configure.in: Check __int128. + + * include/ruby/defines.h (BDIGIT_DBL): Use uint128_t if it is available. + (BDIGIT): Use uint64_t if uint128_t is available. + (SIZEOF_BDIGITS): Defined for above case. + (BDIGIT_DBL_SIGNED): Ditto. + (PRI_BDIGIT_PREFIX): Ditto. + + * include/ruby/ruby.h (PRI_64_PREFIX): Defined. + + * bignum.c (rb_big_pow): Don't use BITSPERDIG for the condition which + rb_big_pow returns Float or Bignum. + + [ruby-dev:47413] [Feature #8509] + Tue Jun 18 16:43:44 2013 Nobuyoshi Nakada <nobu@r...> * parse.y (parser_heredoc_restore): clear lex_strterm always to get Index: bignum.c =================================================================== --- bignum.c (revision 41378) +++ bignum.c (revision 41379) @@ -4332,7 +4332,7 @@ rb_big_pow(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L4332 SIGNED_VALUE mask; const long xlen = RBIGNUM_LEN(x); const long xbits = BITSPERDIG*xlen - nlz(RBIGNUM_DIGITS(x)[xlen-1]); - const long BIGLEN_LIMIT = BITSPERDIG*1024*1024; + const long BIGLEN_LIMIT = 32*1024*1024; if ((xbits > BIGLEN_LIMIT) || (xbits * yy > BIGLEN_LIMIT)) { rb_warn("in a**b, b may be too big"); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/