Subject: Re: bug#8794: (b) make the 64bit-on-32bit the default (if supported)

From: Paul Eggert <[email-masked]>
Date: Fri, 03 Jun 2011 12:29:20 -0700

Almost all of this is documentation change.  The only code change
is the lisp.h change to the default.

=== modified file 'doc/emacs/ChangeLog'
--- doc/emacs/ChangeLog	2011-05-28 18:22:08 +0000
+++ doc/emacs/ChangeLog	2011-06-03 18:47:14 +0000
@@ -1,3 +1,9 @@
+2011-06-02  Paul Eggert  <[email-masked]>
+
+	Document wide integers better.
+	* buffers.texi (Buffers):
+	* files.texi (Visiting): Default buffer maximum is now 2 EiB typically.
+
 2011-05-28  Chong Yidong  <[email-masked]>
 
 	* custom.texi (Hooks): Reorganize.  Mention Prog mode.

=== modified file 'doc/emacs/buffers.texi'
--- doc/emacs/buffers.texi	2011-01-25 04:08:28 +0000
+++ doc/emacs/buffers.texi	2011-06-03 18:47:14 +0000
@@ -43,8 +43,11 @@
   A buffer's size cannot be larger than some maximum, which is defined
 by the largest buffer position representable by the @dfn{Emacs
 integer} data type.  This is because Emacs tracks buffer positions
-using that data type.  For 32-bit machines, the largest buffer size is
-512 megabytes.
+using that data type.  For most machines, the maximum buffer size
+enforced by the data types is @math{2^61 - 2} bytes, or about 2 EiB.
+For some older machines, the maximum is @math{2^29 - 2} bytes, or
+about 512 MiB.  Buffer sizes are also limited by the size of Emacs's
+virtual memory.
 
 @menu
 * Select Buffer::       Creating a new buffer or reselecting an old one.

=== modified file 'doc/emacs/files.texi'
--- doc/emacs/files.texi	2011-01-31 23:54:50 +0000
+++ doc/emacs/files.texi	2011-06-03 18:47:14 +0000
@@ -209,7 +209,8 @@
 about 10 megabytes), Emacs asks you for confirmation first.  You can
 answer @kbd{y} to proceed with visiting the file.  Note, however, that
 Emacs cannot visit files that are larger than the maximum Emacs buffer
-size, which is around 512 megabytes on 32-bit machines
+size, which is limited by the amount of memory Emacs can allocate
+and by the integers that Emacs can represent
 (@pxref{Buffers}).  If you try, Emacs will display an error message
 saying that the maximum buffer size has been exceeded.

=== modified file 'doc/lispref/ChangeLog'
--- doc/lispref/ChangeLog	2011-05-31 18:40:00 +0000
+++ doc/lispref/ChangeLog	2011-06-03 18:49:33 +0000
@@ -1,3 +1,12 @@
+2011-06-03  Paul Eggert  <[email-masked]>
+
+	Document wide integers better.
+	* files.texi (File Attributes): Document ino_t values better.
+	* numbers.texi (Integer Basics, Integer Basics, Arithmetic Operations):
+	(Bitwise Operations):
+	* objects.texi (Integer Type): Integers are typically 62 bits now.
+	* os.texi (Time Conversion): Document time_t values better.
+
 2011-05-31  Lars Magne Ingebrigtsen  <[email-masked]>
 
 	* processes.texi (Process Information): Document

=== modified file 'doc/lispref/files.texi'
--- doc/lispref/files.texi	2011-05-12 07:07:06 +0000
+++ doc/lispref/files.texi	2011-06-03 18:49:33 +0000
@@ -1236,12 +1236,13 @@
 
 @item
 The file's inode number.  If possible, this is an integer.  If the
-inode number is too large to be represented as an integer in Emacs
-Lisp, but still fits into a 32-bit integer, then the value has the
-form @code{(@var{high} . @var{low})}, where @var{low} holds the low 16
-bits.  If the inode is wider than 32 bits, the value is of the form
+inode number @math{N} is too large to be represented as an integer in
+Emacs Lisp, but @math{N / 2^16} is representable, then the value has
+the form @code{(@var{high} . @var{low})}, where @var{high} holds the
+high bits (i.e., excluding the low-order bits) and @var{low} the low
+16 bits.  If the inode number is even larger, the value is of the form
 @code{(@var{high} @var{middle} . @var{low})}, where @code{high} holds
-the high 24 bits, @var{middle} the next 24 bits, and @var{low} the low
+the high bits, @var{middle} the next 24 bits, and @var{low} the low
 16 bits.
 
 @item

=== modified file 'doc/lispref/numbers.texi'
--- doc/lispref/numbers.texi	2011-05-05 06:31:14 +0000
+++ doc/lispref/numbers.texi	2011-06-03 18:49:33 +0000
@@ -36,22 +36,24 @@
 @section Integer Basics
 
   The range of values for an integer depends on the machine.  The
-minimum range is @minus{}536870912 to 536870911 (30 bits; i.e.,
+typical range is @minus{}2305843009213693952 to 2305843009213693951
+(62 bits; i.e.,
 @ifnottex
--2**29
+-2**61
 @end ifnottex
 @tex
-@math{-2^{29}}
+@math{-2^{61}}
 @end tex
 to
 @ifnottex
-2**29 - 1),
+2**61 - 1)
 @end ifnottex
 @tex
-@math{2^{29}-1}),
+@math{2^{61}-1})
 @end tex
-but some machines may provide a wider range.  Many examples in this
-chapter assume an integer has 30 bits.
+but some older machines provide only 30 bits.  Many examples in this
+chapter assume that an integer has 62 bits and that floating point
+numbers are IEEE double precision.
 @cindex overflow
 
   The Lisp reader reads an integer as a sequence of digits with optional
@@ -63,7 +65,8 @@
  1.              ; @r{The integer 1.}
 +1               ; @r{Also the integer 1.}
 -1               ; @r{The integer @minus{}1.}
- 1073741825      ; @r{The floating point number 1073741825.0.}
+ 4611686018427387904
+                 ; @r{The floating point number 4.611686018427388e+18.}
  0               ; @r{The integer 0.}
 -0               ; @r{The integer 0.}
 @end example
@@ -94,25 +97,21 @@
 bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
 view the numbers in their binary form.
 
-  In 30-bit binary, the decimal integer 5 looks like this:
+  In 62-bit binary, the decimal integer 5 looks like this:
 
 @example
-00 0000  0000 0000  0000 0000  0000 0101
+0000...000101 (62 bits total)
 @end example
 
-@noindent
-(We have inserted spaces between groups of 4 bits, and two spaces
-between groups of 8 bits, to make the binary integer easier to read.)
-
   The integer @minus{}1 looks like this:
 
 @example
-11 1111  1111 1111  1111 1111  1111 1111
+1111...111111 (62 bits total)
 @end example
 
 @noindent
 @cindex two's complement
-@minus{}1 is represented as 30 ones.  (This is called @dfn{two's
+@minus{}1 is represented as 62 ones.  (This is called @dfn{two's
 complement} notation.)
 
   The negative integer, @minus{}5, is creating by subtracting 4 from
@@ -120,24 +119,24 @@
 @minus{}5 looks like this:
 
 @example
-11 1111  1111 1111  1111 1111  1111 1011
+1111...111011 (62 bits total)
 @end example
 
-  In this implementation, the largest 30-bit binary integer value is
-536,870,911 in decimal.  In binary, it looks like this:
+  In this implementation, the largest 62-bit binary integer value is
+2,305,843,009,213,693,951 in decimal.  In binary, it looks like this:
 
 @example
-01 1111  1111 1111  1111 1111  1111 1111
+0111...111111 (62 bits total)
 @end example
 
   Since the arithmetic functions do not check whether integers go
-outside their range, when you add 1 to 536,870,911, the value is the
-negative integer @minus{}536,870,912:
+outside their range, when you add 1 to 2,305,843,009,213,693,951, the value is the
+negative integer @minus{}2,305,843,009,213,693,952:
 
 @example
-(+ 1 536870911)
-     @result{} -536870912
-     @result{} 10 0000  0000 0000  0000 0000  0000 0000
+(+ 1 2305843009213693951)
+     @result{} -2305843009213693952
+     @result{} 1000...000000 (62 bits total)
 @end example
 
   Many of the functions described in this chapter accept markers for
@@ -508,8 +507,8 @@
 if any argument is floating.
 
   It is important to note that in Emacs Lisp, arithmetic functions
-do not check for overflow.  Thus @code{(1+ 268435455)} may evaluate to
-@minus{}268435456, depending on your hardware.
+do not check for overflow.  Thus @code{(1+ 2305843009213693951)} may
+evaluate to @minus{}2305843009213693952, depending on your hardware.
 
 @defun 1+ number-or-marker
 This function returns @var{number-or-marker} plus 1.
@@ -829,19 +828,19 @@
 The function @code{lsh}, like all Emacs Lisp arithmetic functions, does
 not check for overflow, so shifting left can discard significant bits
 and change the sign of the number.  For example, left shifting
-536,870,911 produces @minus{}2 on a 30-bit machine:
+2,305,843,009,213,693,951 produces @minus{}2 on a typical machine:
 
 @example
-(lsh 536870911 1)          ; @r{left shift}
+(lsh 2305843009213693951 1)  ; @r{left shift}
      @result{} -2
 @end example
 
-In binary, in the 30-bit implementation, the argument looks like this:
+In binary, in the 62-bit implementation, the argument looks like this:
 
 @example
 @group
-;; @r{Decimal 536,870,911}
-01 1111  1111 1111  1111 1111  1111 1111
+;; @r{Decimal 2,305,843,009,213,693,951}
+0111...111111 (62 bits total)
 @end group
 @end example
 
@@ -851,7 +850,7 @@
 @example
 @group
 ;; @r{Decimal @minus{}2}
-11 1111  1111 1111  1111 1111  1111 1110
+1111...111110 (62 bits total)
 @end group
 @end example
 @end defun
@@ -874,9 +873,9 @@
 @group
 (ash -6 -1) @result{} -3
 ;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
-11 1111  1111 1111  1111 1111  1111 1010
+1111...111010 (62 bits total)
      @result{}
-11 1111  1111 1111  1111 1111  1111 1101
+1111...111101 (62 bits total)
 @end group
 @end example
 
@@ -885,11 +884,11 @@
 
 @example
 @group
-(lsh -6 -1) @result{} 536870909
-;; @r{Decimal @minus{}6 becomes decimal 536,870,909.}
-11 1111  1111 1111  1111 1111  1111 1010
+(lsh -6 -1) @result{} 2305843009213693949
+;; @r{Decimal @minus{}6 becomes decimal 2,305,843,009,213,693,949.}
+1111...111010 (62 bits total)
      @result{}
-01 1111  1111 1111  1111 1111  1111 1101
+0111...111101 (62 bits total)
 @end group
 @end example
 
@@ -899,34 +898,35 @@
 @c     with smallbook but not with regular book! --rjc 16mar92
 @smallexample
 @group
-                   ;  @r{             30-bit binary values}
+                   ;  @r{       62-bit binary values}
 
-(lsh 5 2)          ;   5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 20         ;      =  @r{00 0000  0000 0000  0000 0000  0001 0100}
+(lsh 5 2)          ;   5  =  @r{0000...000101}
+     @result{} 20         ;      =  @r{0000...010100}
 @end group
 @group
 (ash 5 2)
      @result{} 20
-(lsh -5 2)         ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} -20        ;      =  @r{11 1111  1111 1111  1111 1111  1110 1100}
+(lsh -5 2)         ;  -5  =  @r{1111...111011}
+     @result{} -20        ;      =  @r{1111...101100}
 (ash -5 2)
      @result{} -20
 @end group
 @group
-(lsh 5 -2)         ;   5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 1          ;      =  @r{00 0000  0000 0000  0000 0000  0000 0001}
+(lsh 5 -2)         ;   5  =  @r{0000...000101}
+     @result{} 1          ;      =  @r{0000...000001}
 @end group
 @group
 (ash 5 -2)
      @result{} 1
 @end group
 @group
-(lsh -5 -2)        ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} 268435454  ;      =  @r{00 0111  1111 1111  1111 1111  1111 1110}
+(lsh -5 -2)        ;  -5  =  @r{1111...111011}
+     @result{} 1152921504606846974
+                   ;      =  @r{0011...111110}
 @end group
 @group
-(ash -5 -2)        ;  -5  =  @r{11 1111  1111 1111  1111 1111  1111 1011}
-     @result{} -2         ;      =  @r{11 1111  1111 1111  1111 1111  1111 1110}
+(ash -5 -2)        ;  -5  =  @r{1111...111011}
+     @result{} -2         ;      =  @r{1111...111110}
 @end group
 @end smallexample
 @end defun
@@ -961,23 +961,23 @@
 
 @smallexample
 @group
-                   ; @r{               30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logand 14 13)     ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
-                   ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
-     @result{} 12         ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
+(logand 14 13)     ; 14  =  @r{0000...001110}
+                   ; 13  =  @r{0000...001101}
+     @result{} 12         ; 12  =  @r{0000...001100}
 @end group
 
 @group
-(logand 14 13 4)   ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
-                   ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
-                   ;  4  =  @r{00 0000  0000 0000  0000 0000  0000 0100}
-     @result{} 4          ;  4  =  @r{00 0000  0000 0000  0000 0000  0000 0100}
+(logand 14 13 4)   ; 14  =  @r{0000...001110}
+                   ; 13  =  @r{0000...001101}
+                   ;  4  =  @r{0000...000100}
+     @result{} 4          ;  4  =  @r{0000...000100}
 @end group
 
 @group
 (logand)
-     @result{} -1         ; -1  =  @r{11 1111  1111 1111  1111 1111  1111 1111}
+     @result{} -1         ; -1  =  @r{1111...111111}
 @end group
 @end smallexample
 @end defun
@@ -991,18 +991,18 @@
 
 @smallexample
 @group
-                   ; @r{              30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logior 12 5)      ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 13         ; 13  =  @r{00 0000  0000 0000  0000 0000  0000 1101}
+(logior 12 5)      ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+     @result{} 13         ; 13  =  @r{0000...001101}
 @end group
 
 @group
-(logior 12 5 7)    ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-                   ;  7  =  @r{00 0000  0000 0000  0000 0000  0000 0111}
-     @result{} 15         ; 15  =  @r{00 0000  0000 0000  0000 0000  0000 1111}
+(logior 12 5 7)    ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+                   ;  7  =  @r{0000...000111}
+     @result{} 15         ; 15  =  @r{0000...001111}
 @end group
 @end smallexample
 @end defun
@@ -1016,18 +1016,18 @@
 
 @smallexample
 @group
-                   ; @r{              30-bit binary values}
+                   ; @r{       62-bit binary values}
 
-(logxor 12 5)      ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-     @result{} 9          ;  9  =  @r{00 0000  0000 0000  0000 0000  0000 1001}
+(logxor 12 5)      ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+     @result{} 9          ;  9  =  @r{0000...001001}
 @end group
 
 @group
-(logxor 12 5 7)    ; 12  =  @r{00 0000  0000 0000  0000 0000  0000 1100}
-                   ;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
-                   ;  7  =  @r{00 0000  0000 0000  0000 0000  0000 0111}
-     @result{} 14         ; 14  =  @r{00 0000  0000 0000  0000 0000  0000 1110}
+(logxor 12 5 7)    ; 12  =  @r{0000...001100}
+                   ;  5  =  @r{0000...000101}
+                   ;  7  =  @r{0000...000111}
+     @result{} 14         ; 14  =  @r{0000...001110}
 @end group
 @end smallexample
 @end defun
@@ -1040,9 +1040,9 @@
 @example
 (lognot 5)
      @result{} -6
-;;  5  =  @r{00 0000  0000 0000  0000 0000  0000 0101}
+;;  5  =  @r{0000...000101} (62 bits total)
 ;; @r{becomes}
-;; -6  =  @r{11 1111  1111 1111  1111 1111  1111 1010}
+;; -6  =  @r{1111...111010} (62 bits total)
 @end example
 @end defun

=== modified file 'doc/lispref/objects.texi'
--- doc/lispref/objects.texi	2011-05-05 06:31:14 +0000
+++ doc/lispref/objects.texi	2011-06-03 18:49:33 +0000
@@ -164,25 +164,25 @@
 @node Integer Type
 @subsection Integer Type
 
-  The range of values for integers in Emacs Lisp is @minus{}536870912 to
-536870911 (30 bits; i.e.,
+  The range of values for integers in Emacs Lisp is
+@minus{}2305843009213693952 to 2305843009213693951 (62 bits; i.e.,
 @ifnottex
--2**29
+-2**61
 @end ifnottex
 @tex
-@math{-2^{29}}
+@math{-2^{61}}
 @end tex
 to
 @ifnottex
-2**29 - 1)
+2**61 - 1)
 @end ifnottex
 @tex
-@math{2^{29}-1})
+@math{2^{61}-1})
 @end tex
-on most machines.  (Some machines may provide a wider range.)  It is
-important to note that the Emacs Lisp arithmetic functions do not check
-for overflow.  Thus @code{(1+ 536870911)} is @minus{}536870912 on most
-machines.
+on most machines.  Some machines may provide a narrower or wider
+range; all machines provide at least 30 bits.  Emacs Lisp arithmetic
+functions do not check for overflow.  Thus @code{(1+
+2305843009213693951)} is @minus{}2305843009213693952 on most machines.
 
   The read syntax for integers is a sequence of (base ten) digits with an
 optional sign at the beginning and an optional period at the end.  The
@@ -195,7 +195,6 @@
 1                ; @r{The integer 1.}
 1.               ; @r{Also the integer 1.}
 +1               ; @r{Also the integer 1.}
-1073741825       ; @r{Also the integer 1 on a 30-bit implementation.}
 @end group
 @end example
 
@@ -203,8 +202,8 @@
 As a special exception, if a sequence of digits specifies an integer
 too large or too small to be a valid integer object, the Lisp reader
 reads it as a floating-point number (@pxref{Floating Point Type}).
-For instance, on most machines @code{536870912} is read as the
-floating-point number @code{536870912.0}.
+For instance, on most machines @code{2305843009213693952} is read as the
+floating-point number @code{2.305843009213694e+18}.
 
   @xref{Numbers}, for more information.

=== modified file 'doc/lispref/os.texi'
--- doc/lispref/os.texi	2011-02-01 07:23:48 +0000
+++ doc/lispref/os.texi	2011-06-03 18:49:33 +0000
@@ -1193,11 +1193,11 @@
 from the functions @code{current-time} (@pxref{Time of Day}) and
 @code{file-attributes} (@pxref{Definition of file-attributes}).
 
-  Many operating systems are limited to time values that contain 32 bits
+  Many 32-bit operating systems are limited to time values that contain 32 bits
 of information; these systems typically handle only the times from
-1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC.  However, some
-operating systems have larger time values, and can represent times far
-in the past or future.
+1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC.  However, 64-bit
+and some 32-bit operating systems have larger time values, and can
+represent times far in the past or future.
 
   Time conversion functions always use the Gregorian calendar, even
 for dates before the Gregorian calendar was introduced.  Year numbers

=== modified file 'etc/ChangeLog'
--- etc/ChangeLog	2011-05-24 14:22:44 +0000
+++ etc/ChangeLog	2011-06-03 18:42:04 +0000
@@ -1,3 +1,7 @@
+2011-06-03  Paul Eggert  <[email-masked]>
+
+	* NEWS: 62-bit integers are typical now.
+
 2011-05-24  Leo Liu  <[email-masked]>
 
 	* NEWS: Mention the new primitive sha1 and the removal of sha1.el.

=== modified file 'etc/NEWS'
--- etc/NEWS	2011-06-01 15:34:41 +0000
+++ etc/NEWS	2011-06-03 18:42:04 +0000
@@ -902,6 +902,14 @@
 *** New function `special-variable-p' to check whether a variable is
 declared as dynamically bound.
 
+** Emacs integers have a wider range on typical 32-bit hosts.
+Previously, they were limited to a 30-bit range (-2**29 .. 2**29-1).
+Now, they are limited to a 62-bit range (-2**61 .. 2**61-1), the
+same as on 64-bit hosts.  This increased range comes from the Emacs
+interpreter using 64-bit native integer types that are available
+on typical modern 32-bit platforms.  Older 32-bit hosts that lack
+64-bit integers have the same 30-bit range as before.
+
 ** pre/post-command-hook are not reset to nil upon error.
 Instead, the offending function is removed.

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2011-06-03 18:22:12 +0000
+++ src/ChangeLog	2011-06-03 18:42:59 +0000
@@ -1,5 +1,14 @@
 2011-06-03  Paul Eggert  <[email-masked]>
 
+	Fix doc for machines with wider system times such as time_t.
+	On such machines, it's now safe to assume that EMACS_INT is as
+	wide as the system times, so that shifting right by 16 will
+	result in an integer that always fits in EMACS_INT.
+	* dired.c (Ffile_attributes): Document large inode number handling.
+	* termhooks.h: Fix comment for large time stamp handling.
+
+	* lisp.h (WIDE_EMACS_INT): Now defaults to 1.
+
 	* xselect.c: Use 'unsigned' more consistently.
 	(selection_data_to_lisp_data, lisp_data_to_selection_data):
 	Use 'unsigned' consistently when computing sizes of unsigned objects.

=== modified file 'src/dired.c'
--- src/dired.c	2011-06-02 06:21:13 +0000
+++ src/dired.c	2011-06-03 18:42:59 +0000
@@ -901,10 +901,10 @@
  8. File modes, as a string of ten letters or dashes as in ls -l.
  9. t if file's gid would change if file were deleted and recreated.
 10. inode number.  If inode number is larger than what Emacs integer
-  can hold, but still fits into a 32-bit number, this is a cons cell
+  can hold, but all but the bottom 16 bits still fits, this is a cons cell
   containing two integers: first the high part, then the low 16 bits.
-  If the inode number is wider than 32 bits, this is of the form
-  (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
+  If the inode number is still wider, this is of the form
+  (HIGH MIDDLE . LOW): first the high bits, then the middle 24 bits,
   and finally the low 16 bits.
 11. Filesystem device number.  If it is larger than what the Emacs
   integer can hold, this is a cons cell, similar to the inode number.
@@ -1008,8 +1008,8 @@
 			make_number ((EMACS_INT)(s.st_ino & 0xffff)));
   else
     {
-      /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
-	 high parts and a 16-bit bottom part.
+      /* To allow inode numbers beyond what INTEGER_TO_CONS can handle,
+	 separate into 2 24-bit high parts and a 16-bit bottom part.
 	 The code on the next line avoids a compiler warning on
 	 systems where st_ino is 32 bit wide. (bug#766).  */
       EMACS_INT high_ino = s.st_ino >> 31 >> 1;

=== modified file 'src/lisp.h'
--- src/lisp.h	2011-06-03 18:14:49 +0000
+++ src/lisp.h	2011-06-03 18:28:20 +0000
@@ -36,13 +36,14 @@
 #define CHECK_CONS_LIST() ((void) 0)
 #endif
 
-/* Temporarily disable wider-than-pointer integers until they're tested more.
-   Build with CFLAGS='-DWIDE_EMACS_INT' to try them out.  */
-/* #undef WIDE_EMACS_INT */
+/* To disable wider-than-pointer integers, build with -DWIDE_EMACS_INT=0.  */
+#ifndef WIDE_EMACS_INT
+#define WIDE_EMACS_INT 1
+#endif
 
 /* These are default choices for the types to use.  */
 #ifndef EMACS_INT
-# if BITS_PER_LONG < BITS_PER_LONG_LONG && defined WIDE_EMACS_INT
+# if BITS_PER_LONG < BITS_PER_LONG_LONG && WIDE_EMACS_INT
 #  define EMACS_INT long long
 #  define BITS_PER_EMACS_INT BITS_PER_LONG_LONG
 #  define pI "ll"

=== modified file 'src/termhooks.h'
--- src/termhooks.h	2011-05-27 16:17:59 +0000
+++ src/termhooks.h	2011-06-03 18:42:59 +0000
@@ -342,8 +342,8 @@
      SELECTION-VALUE is the value that emacs owns for that selection.
       It may be any kind of Lisp object.
      SELECTION-TIMESTAMP is the time at which emacs began owning this
-      selection, as a cons of two 16-bit numbers (making a 32 bit
-      time.)
+      selection, as an Emacs integer; or if that doesn't fit, as a
+      cons of two 16-bit integers (making a 32 bit time.)
      FRAME is the frame for which we made the selection.  If there is
       an entry in this alist, then it can be assumed that Emacs owns
       that selection.