This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add optional GCC-only support for using long doubles on Win32
authorSteve Hay <steve.m.hay@googlemail.com>
Thu, 6 Nov 2014 08:57:35 +0000 (08:57 +0000)
committerSteve Hay <steve.m.hay@googlemail.com>
Thu, 6 Nov 2014 14:23:44 +0000 (14:23 +0000)
win32/Makefile
win32/config.gc
win32/config.vc
win32/config_H.gc
win32/config_sh.PL
win32/makefile.mk

index 16585b2..e5c3c86 100644 (file)
@@ -26,6 +26,7 @@ INST_TOP      = $(INST_DRV)\perl
 #
 # Uncomment if you want to build a 32-bit Perl using a 32-bit compiler
 # on a 64-bit version of Windows.
+#
 #WIN64         = undef
 
 #
@@ -85,12 +86,14 @@ USE_IMP_SYS = define
 # then get a number of fails from make test i.e. bugs - complain to them not us ;-). 
 # You will also be unable to take full advantage of perl5.8's support for multiple 
 # encodings and may see lower IO performance. You have been warned.
+#
 USE_PERLIO     = define
 
 #
 # Comment this out if you don't want to enable large file support for
 # some reason.  Should normally only be changed to maintain compatibility
 # with an older release of perl.
+#
 USE_LARGE_FILES        = define
 
 #
@@ -98,6 +101,7 @@ USE_LARGE_FILES      = define
 # (If you're building a 64-bit perl then you will have 64-bit integers whether
 # or not this is uncommented.)
 # Note: This option is not supported in 32-bit MSVC60 builds.
+#
 #USE_64_BIT_INT        = define
 
 #
index b57a243..de713ee 100644 (file)
@@ -80,15 +80,15 @@ d_Gconvert='sprintf((b),"%.*g",(n),(x))'
 d_PRIEUldbl='undef'
 d_PRIFUldbl='undef'
 d_PRIGUldbl='undef'
-d_PRIXU64='undef'
-d_PRId64='undef'
+d_PRIXU64='define'
+d_PRId64='define'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
 d_PRIgldbl='undef'
-d_PRIi64='undef'
-d_PRIo64='undef'
-d_PRIu64='undef'
-d_PRIx64='undef'
+d_PRIi64='define'
+d_PRIo64='define'
+d_PRIu64='define'
+d_PRIx64='define'
 d_SCNfldbl='undef'
 d__fwalk='undef'
 d_access='define'
@@ -913,19 +913,19 @@ sGMTIME_max="2147483647"
 sGMTIME_min="0"
 sLOCALTIME_max="2147483647"
 sLOCALTIME_min="0"
-sPRIEUldbl='"E"'
-sPRIFUldbl='"F"'
-sPRIGUldbl='"G"'
+sPRIEUldbl='"LE"'
+sPRIFUldbl='"LF"'
+sPRIGUldbl='"LG"'
 sPRIXU64='"lX"'
 sPRId64='"ld"'
-sPRIeldbl='"e"'
-sPRIfldbl='"f"'
-sPRIgldbl='"g"'
+sPRIeldbl='"Le"'
+sPRIfldbl='"Lf"'
+sPRIgldbl='"Lg"'
 sPRIi64='"li"'
 sPRIo64='"lo"'
 sPRIu64='"lu"'
 sPRIx64='"lx"'
-sSCNfldbl='"f"'
+sSCNfldbl='"Lf"'
 sched_yield=''
 scriptdir='~INST_TOP~~INST_VER~\bin'
 scriptdirexp='~INST_TOP~~INST_VER~\bin'
index 4f8375c..9065d0c 100644 (file)
@@ -80,15 +80,15 @@ d_Gconvert='sprintf((b),"%.*g",(n),(x))'
 d_PRIEUldbl='undef'
 d_PRIFUldbl='undef'
 d_PRIGUldbl='undef'
-d_PRIXU64='undef'
-d_PRId64='undef'
+d_PRIXU64='define'
+d_PRId64='define'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
 d_PRIgldbl='undef'
-d_PRIi64='undef'
-d_PRIo64='undef'
-d_PRIu64='undef'
-d_PRIx64='undef'
+d_PRIi64='define'
+d_PRIo64='define'
+d_PRIu64='define'
+d_PRIx64='define'
 d_SCNfldbl='undef'
 d__fwalk='undef'
 d_access='define'
index abb1f9e..e70800a 100644 (file)
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'f') for input.
  */
-/*#define PERL_PRIfldbl        "f"     / **/
-/*#define PERL_PRIgldbl        "g"     / **/
-/*#define PERL_PRIeldbl        "e"     / **/
-/*#define PERL_SCNfldbl        "f"     / **/
+/*#define PERL_PRIfldbl        "Lf"    / **/
+/*#define PERL_PRIgldbl        "Lg"    / **/
+/*#define PERL_PRIeldbl        "Le"    / **/
+/*#define PERL_SCNfldbl        "Lf"    / **/
 
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
index f20be97..035f03f 100644 (file)
@@ -151,12 +151,20 @@ else {
     $opt{ssizetype} = 'int';
     $opt{st_ino_size} = 4;
 }
+
+# set 64-bit-int options
 if ($opt{use64bitint} eq 'define') {
-    $opt{d_nv_preserves_uv} = 'undef';
+    if ($opt{uselongdouble} eq 'define') {
+        $opt{d_nv_preserves_uv} = 'define';
+        $opt{nv_preserves_uv_bits} = 64;
+    }
+    else {
+        $opt{d_nv_preserves_uv} = 'undef';
+        $opt{nv_preserves_uv_bits} = 53;
+    }
     $opt{ivdformat} = qq{"I64d"};
     $opt{ivsize} = 8;
     $opt{ivtype} = $int64;
-    $opt{nv_preserves_uv_bits} = 53;
     $opt{sPRIXU64} = qq{"I64X"};
     $opt{sPRId64} = qq{"I64d"};
     $opt{sPRIi64} = qq{"I64i"};
@@ -190,6 +198,58 @@ else {
     $opt{uvxformat} = '"lx"';
 }
 
+# set long double options
+if ($opt{uselongdouble} eq 'define') {
+    $opt{d_Gconvert} = 'sprintf((b),"%.*""Lg",(n),(x))';
+    $opt{d_PRIEUldbl} = 'define';
+    $opt{d_PRIFUldbl} = 'define';
+    $opt{d_PRIGUldbl} = 'define';
+    $opt{d_frexpl} = 'define';
+    $opt{d_isnanl} = 'define';
+    $opt{d_modfl} = 'define';
+    $opt{d_modflproto} = 'define';
+    $opt{d_sqrtl} = 'define';
+    $opt{d_strtold} = 'define';
+    $opt{d_PRIeldbl} = 'define';
+    $opt{d_PRIfldbl} = 'define';
+    $opt{d_PRIgldbl} = 'define';
+    $opt{d_SCNfldbl} = 'define';
+    $opt{nvsize} = 12;
+    $opt{nvtype} = 'long double';
+    $opt{nv_overflows_integers_at} = '256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0';
+    $opt{nvEUformat} = '"LE"';
+    $opt{nvFUformat} = '"LF"';
+    $opt{nvGUformat} = '"LG"';
+    $opt{nveformat} = '"Le"';
+    $opt{nvfformat} = '"Lf"';
+    $opt{nvgformat} = '"Lg"';
+}
+else {
+    $opt{d_Gconvert} = 'sprintf((b),"%.*g",(n),(x))';
+    $opt{d_PRIEUldbl} = 'undef';
+    $opt{d_PRIFUldbl} = 'undef';
+    $opt{d_PRIGUldbl} = 'undef';
+    $opt{d_frexpl} = 'undef';
+    $opt{d_isnanl} = 'undef';
+    $opt{d_modfl} = 'undef';
+    $opt{d_modflproto} = 'undef';
+    $opt{d_sqrtl} = 'undef';
+    $opt{d_strtold} = 'undef';
+    $opt{d_PRIeldbl} = 'undef';
+    $opt{d_PRIfldbl} = 'undef';
+    $opt{d_PRIgldbl} = 'undef';
+    $opt{d_SCNfldbl} = 'undef';
+    $opt{nvsize} = 8;
+    $opt{nvtype} = 'double';
+    $opt{nv_overflows_integers_at} = '256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0';
+    $opt{nvEUformat} = '"E"';
+    $opt{nvFUformat} = '"F"';
+    $opt{nvGUformat} = '"G"';
+    $opt{nveformat} = '"e"';
+    $opt{nvfformat} = '"f"';
+    $opt{nvgformat} = '"g"';
+}
+
 # change the s{GM|LOCAL}TIME_{min|max} for VS2005 (aka VC 8) and
 # VS2008 (aka VC 9) or higher (presuming that later versions will have
 # at least the range of that).
index 5a69973..17caf4e 100644 (file)
@@ -32,6 +32,7 @@ INST_TOP      *= $(INST_DRV)\perl
 #
 # Uncomment if you want to build a 32-bit Perl using a 32-bit compiler
 # on a 64-bit version of Windows.
+#
 #WIN64         *= undef
 
 #
@@ -91,12 +92,14 @@ USE_IMP_SYS *= define
 # then get a number of fails from make test i.e. bugs - complain to them not us ;-). 
 # You will also be unable to take full advantage of perl5.8's support for multiple 
 # encodings and may see lower IO performance. You have been warned.
+#
 USE_PERLIO     *= define
 
 #
 # Comment this out if you don't want to enable large file support for
 # some reason.  Should normally only be changed to maintain compatibility
 # with an older release of perl.
+#
 USE_LARGE_FILES        *= define
 
 #
@@ -104,9 +107,16 @@ USE_LARGE_FILES    *= define
 # (If you're building a 64-bit perl then you will have 64-bit integers whether
 # or not this is uncommented.)
 # Note: This option is not supported in 32-bit MSVC60 builds.
+#
 #USE_64_BIT_INT        *= define
 
 #
+# Uncomment this if you want to support the use of long doubles in GCC builds.
+# This option is not supported for MSVC builds.
+#
+#USE_LONG_DOUBLE *=define
+
+#
 # uncomment exactly one of the following
 #
 # Visual C++ 6.x (aka Visual C++ 98)
@@ -292,6 +302,7 @@ USE_IMP_SYS *= undef
 USE_PERLIO     *= undef
 USE_LARGE_FILES        *= undef
 USE_64_BIT_INT *= undef
+USE_LONG_DOUBLE        *= undef
 
 .IF "$(USE_IMP_SYS)" == "define"
 PERL_MALLOC    = undef
@@ -358,6 +369,12 @@ CCTYPE             = SDK2003SP1
 USE_64_BIT_INT != undef
 .ENDIF
 
+# Disable the long double option for MSVC builds since that compiler
+# does not support it.
+.IF "$(CCTYPE)" != "GCC"
+USE_LONG_DOUBLE        != undef
+.ENDIF
+
 ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
 .IF "$(ARCHITECTURE)" == "AMD64"
 ARCHITECTURE   = x64
@@ -428,6 +445,11 @@ LIB32              = $(ARCHPREFIX)ar rc
 IMPLIB         = $(ARCHPREFIX)dlltool
 RSC            = $(ARCHPREFIX)windres
 
+.IF "$(USE_LONG_DOUBLE)" == "define"
+BUILDOPT        += -D__USE_MINGW_ANSI_STDIO
+MINIBUILDOPT    += -D__USE_MINGW_ANSI_STDIO
+.ENDIF
+
 GCCWRAPV *= $(shell for /f "delims=. tokens=1,2,3" %i in ('$(CC) -dumpversion') do @if "%i"=="4" (if "%j" geq "3" echo define) else if "%i" geq "5" (echo define))
 
 .IF "$(GCCWRAPV)" == "define"
@@ -949,6 +971,7 @@ CFG_VARS    =                                       \
                usemultiplicity=$(USE_MULTI)    ~       \
                useperlio=$(USE_PERLIO)         ~       \
                use64bitint=$(USE_64_BIT_INT)   ~       \
+               uselongdouble=$(USE_LONG_DOUBLE)        ~       \
                uselargefiles=$(USE_LARGE_FILES)        ~       \
                usesitecustomize=$(USE_SITECUST)        ~       \
                LINK_FLAGS=$(LINK_FLAGS)        ~       \
@@ -1024,6 +1047,7 @@ config.w32 : $(CFGSH_TMPL)
        @echo #undef HAS_ATOLL>>$@
        @echo #undef HAS_STRTOLL>>$@
        @echo #undef HAS_STRTOULL>>$@
+       @echo #undef Size_t_size>>$@
        @echo #undef IVTYPE>>$@
        @echo #undef UVTYPE>>$@
        @echo #undef IVSIZE>>$@
@@ -1036,7 +1060,24 @@ config.w32 : $(CFGSH_TMPL)
        @echo #undef UVxf>>$@
        @echo #undef UVXf>>$@
        @echo #undef USE_64_BIT_INT>>$@
-       @echo #undef Size_t_size>>$@
+       @echo #undef Gconvert>>$@
+       @echo #undef HAS_FREXPL>>$@
+       @echo #undef HAS_ISNANL>>$@
+       @echo #undef HAS_MODFL>>$@
+       @echo #undef HAS_MODFL_PROTO>>$@
+       @echo #undef HAS_SQRTL>>$@
+       @echo #undef HAS_STRTOLD>>$@
+       @echo #undef PERL_PRIfldbl>>$@
+       @echo #undef PERL_PRIgldbl>>$@
+       @echo #undef PERL_PRIeldbl>>$@
+       @echo #undef PERL_SCNfldbl>>$@
+       @echo #undef NVTYPE>>$@
+       @echo #undef NVSIZE>>$@
+       @echo #undef NV_OVERFLOWS_INTEGERS_AT>>$@
+       @echo #undef NVef>>$@
+       @echo #undef NVff>>$@
+       @echo #undef NVgf>>$@
+       @echo #undef USE_LONG_DOUBLE>>$@
 .IF "$(USE_LARGE_FILES)"=="define"
        @echo #define Off_t $(INT64)>>$@
        @echo #define LSEEKSIZE ^8>>$@
@@ -1066,8 +1107,13 @@ config.w32 : $(CFGSH_TMPL)
        @echo #define UVTYPE unsigned $(INT64)>>$@
        @echo #define IVSIZE ^8>>$@
        @echo #define UVSIZE ^8>>$@
+.IF "$(USE_LONG_DOUBLE)"=="define"
+       @echo #define NV_PRESERVES_UV>>$@
+       @echo #define NV_PRESERVES_UV_BITS 64>>$@
+.ELSE
        @echo #undef NV_PRESERVES_UV>>$@
        @echo #define NV_PRESERVES_UV_BITS 53>>$@
+.ENDIF
        @echo #define IVdf "I64d">>$@
        @echo #define UVuf "I64u">>$@
        @echo #define UVof "I64o">>$@
@@ -1088,6 +1134,45 @@ config.w32 : $(CFGSH_TMPL)
        @echo #define UVXf "lX">>$@
        @echo #undef USE_64_BIT_INT>>$@
 .ENDIF
+.IF "$(USE_LONG_DOUBLE)"=="define"
+       @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*""Lg",(n),(x))>>$@
+       @echo #define HAS_FREXPL>>$@
+       @echo #define HAS_ISNANL>>$@
+       @echo #define HAS_MODFL>>$@
+       @echo #define HAS_MODFL_PROTO>>$@
+       @echo #define HAS_SQRTL>>$@
+       @echo #define HAS_STRTOLD>>$@
+       @echo #define PERL_PRIfldbl "Lf">>$@
+       @echo #define PERL_PRIgldbl "Lg">>$@
+       @echo #define PERL_PRIeldbl "Le">>$@
+       @echo #define PERL_SCNfldbl "Lf">>$@
+       @echo #define NVTYPE long double>>$@
+       @echo #define NVSIZE ^12>>$@
+       @echo #define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0>>$@
+       @echo #define NVef "Le">>$@
+       @echo #define NVff "Lf">>$@
+       @echo #define NVgf "Lg">>$@
+       @echo #define USE_LONG_DOUBLE>>$@
+.ELSE
+       @echo #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))>>$@
+       @echo #undef HAS_FREXPL>>$@
+       @echo #undef HAS_ISNANL>>$@
+       @echo #undef HAS_MODFL>>$@
+       @echo #undef HAS_MODFL_PROTO>>$@
+       @echo #undef HAS_SQRTL>>$@
+       @echo #undef HAS_STRTOLD>>$@
+       @echo #undef PERL_PRIfldbl>>$@
+       @echo #undef PERL_PRIgldbl>>$@
+       @echo #undef PERL_PRIeldbl>>$@
+       @echo #undef PERL_SCNfldbl>>$@
+       @echo #define NVTYPE double>>$@
+       @echo #define NVSIZE ^8>>$@
+       @echo #define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0>>$@
+       @echo #define NVef "e">>$@
+       @echo #define NVff "f">>$@
+       @echo #define NVgf "g">>$@
+       @echo #undef USE_LONG_DOUBLE>>$@
+.ENDIF
        @echo #endif>>$@
 
 ..\git_version.h : $(MINIPERL) ..\make_patchnum.pl