diff options
Diffstat (limited to 'gcc/config/ia64')
-rw-r--r-- | gcc/config/ia64/ia64-modes.def | 18 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 4 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 4 |
3 files changed, 13 insertions, 13 deletions
diff --git a/gcc/config/ia64/ia64-modes.def b/gcc/config/ia64/ia64-modes.def index 17688bd9b85..1cb59ad021d 100644 --- a/gcc/config/ia64/ia64-modes.def +++ b/gcc/config/ia64/ia64-modes.def @@ -22,35 +22,35 @@ Boston, MA 02111-1307, USA. */ /* IA64 requires both XF and TF modes. XFmode is __float80 is IEEE extended; TFmode is __float128 - is IEEE quad. + is IEEE quad. Both these modes occupy 16 bytes, but XFmode + only has 80 significant bits. */ - IEEE extended is 128 bits wide, except in ILP32 mode, but we - have to say it's 12 bytes so that the bitsize and wider_mode - tables are correctly set up. We correct its size below. */ - -FLOAT_MODE (XF, 12, ieee_extended_intel_128_format); +FRACTIONAL_FLOAT_MODE (XF, 80, 16, ieee_extended_intel_128_format); FLOAT_MODE (TF, 16, ieee_quad_format); /* The above produces: mode ILP32 size/align LP64 size/align - XF 12/4 12/4 + XF 16/16 16/16 TF 16/16 16/16 psABI expectations: mode ILP32 size/align LP64 size/align - XF - 16/16 + XF 12/4 - TF - - HPUX expectations: mode ILP32 size/align LP64 size/align - XF 16/16 16/16 + XF - - TF 16/8 - We fix this up here. */ +ADJUST_FLOAT_FORMAT (XF, (TARGET_ILP32 && !TARGET_HPUX) + ? &ieee_extended_intel_96_format + : &ieee_extended_intel_128_format); ADJUST_BYTESIZE (XF, (TARGET_ILP32 && !TARGET_HPUX) ? 12 : 16); ADJUST_ALIGNMENT (XF, (TARGET_ILP32 && !TARGET_HPUX) ? 4 : 16); diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index d88b8e7dc96..2899c0f611f 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -8138,13 +8138,13 @@ ia64_init_builtins (void) fpreg_type = make_node (REAL_TYPE); /* ??? The back end should know to load/save __fpreg variables using the ldf.fill and stf.spill instructions. */ - TYPE_PRECISION (fpreg_type) = 96; + TYPE_PRECISION (fpreg_type) = 80; layout_type (fpreg_type); (*lang_hooks.types.register_builtin_type) (fpreg_type, "__fpreg"); /* The __float80 type. */ float80_type = make_node (REAL_TYPE); - TYPE_PRECISION (float80_type) = 96; + TYPE_PRECISION (float80_type) = 80; layout_type (float80_type); (*lang_hooks.types.register_builtin_type) (float80_type, "__float80"); diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 00d35ea149f..8bc4e3ba3b7 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -448,10 +448,10 @@ while (0) #define DOUBLE_TYPE_SIZE 64 /* long double is XFmode normally, TFmode for HPUX. */ -#define LONG_DOUBLE_TYPE_SIZE (TARGET_HPUX ? 128 : 96) +#define LONG_DOUBLE_TYPE_SIZE (TARGET_HPUX ? 128 : 80) /* We always want the XFmode operations from libgcc2.c. */ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96 +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 #define DEFAULT_SIGNED_CHAR 1 |