[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]