diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-05-08 13:13:59 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-05-08 13:13:59 +0000 |
commit | 53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b (patch) | |
tree | 3fb5f2cf3b52eb73fc88051ccaecab5bf4d526f2 /gcc/f/com.c | |
parent | db7948c2d8dc5ac573bfb3516fa34c2ba086dabc (diff) | |
download | gcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.zip gcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.tar.gz gcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.tar.bz2 |
re PR fortran/8485 (g77 doesn't accept INTEGER*8 constant in PARAMETER multiplication)
PR fortran/8485
* target.h (FFETARGET_REAL_VALUE_FROM_INT_): Cast to
HOST_WIDE_INT instead of long.
(FFETARGET_REAL_VALUE_FROM_LONGLONG_): New macro.
(FFETARGET_LONGLONG_FROM_INTS_): New macro.
(ffetarget_convert_complex1_integer4): Implement.
(ffetarget_convert_complex2_integer4): Implement.
(ffetarget_convert_integer4_complex1): Implement.
(ffetarget_convert_integer4_complex2): Implement.
(ffetarget_convert_integer4_real1): Implement.
(ffetarget_convert_integer4_real2): Implement.
(ffetarget_convert_real1_integer4): Implement.
(ffetarget_convert_real2_integer4): Implement.
* com.c (ffecom_constantunion): Handle INTEGER*8.
(ffecom_constantunion_with_type): Likewise.
* g77.f-torture/compile/8485.f: New test case.
From-SVN: r66596
Diffstat (limited to 'gcc/f/com.c')
-rw-r--r-- | gcc/f/com.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/gcc/f/com.c b/gcc/f/com.c index 36658f2..7ec1813 100644 --- a/gcc/f/com.c +++ b/gcc/f/com.c @@ -10325,31 +10325,43 @@ ffecom_constantunion (ffebldConstantUnion *cu, ffeinfoBasictype bt, { case FFEINFO_basictypeINTEGER: { - int val; + HOST_WIDE_INT hi, lo; switch (kt) { #if FFETARGET_okINTEGER1 case FFEINFO_kindtypeINTEGER1: - val = ffebld_cu_val_integer1 (*cu); + lo = ffebld_cu_val_integer1 (*cu); + hi = (lo < 0) ? -1 : 0; break; #endif #if FFETARGET_okINTEGER2 case FFEINFO_kindtypeINTEGER2: - val = ffebld_cu_val_integer2 (*cu); + lo = ffebld_cu_val_integer2 (*cu); + hi = (lo < 0) ? -1 : 0; break; #endif #if FFETARGET_okINTEGER3 case FFEINFO_kindtypeINTEGER3: - val = ffebld_cu_val_integer3 (*cu); + lo = ffebld_cu_val_integer3 (*cu); + hi = (lo < 0) ? -1 : 0; break; #endif #if FFETARGET_okINTEGER4 case FFEINFO_kindtypeINTEGER4: - val = ffebld_cu_val_integer4 (*cu); +#if HOST_BITS_PER_LONGLONG > HOST_BITS_PER_WIDE_INT + { + long long int big = ffebld_cu_val_integer4 (*cu); + hi = (HOST_WIDE_INT) (big >> HOST_BITS_PER_WIDE_INT); + lo = (HOST_WIDE_INT) big; + } +#else + lo = ffebld_cu_val_integer4 (*cu); + hi = (lo < 0) ? -1 : 0; +#endif break; #endif @@ -10359,7 +10371,7 @@ ffecom_constantunion (ffebldConstantUnion *cu, ffeinfoBasictype bt, case FFEINFO_kindtypeANY: return error_mark_node; } - item = build_int_2 (val, (val < 0) ? -1 : 0); + item = build_int_2 (lo, hi); TREE_TYPE (item) = tree_type; } break; @@ -10614,8 +10626,17 @@ ffecom_constantunion_with_type (ffebldConstantUnion *cu, #endif #if FFETARGET_okINTEGER4 case FFEBLD_constINTEGER4: +#if HOST_BITS_PER_LONGLONG > HOST_BITS_PER_WIDE_INT + { + long long int big = ffebld_cu_val_integer4 (*cu); + item = build_int_2 ((HOST_WIDE_INT) big, + (HOST_WIDE_INT) + (big >> HOST_BITS_PER_WIDE_INT)); + } +#else val = ffebld_cu_val_integer4 (*cu); item = build_int_2 (val, (val < 0) ? -1 : 0); +#endif break; #endif #if FFETARGET_okLOGICAL1 |