diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-01-24 04:02:40 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-01-24 04:02:40 +0000 |
commit | 915c336f8096591e13a940635c21f960dac8a4be (patch) | |
tree | 01f52c80cc2f9fdea21bd2466e865f0bfdaa9c01 /gcc/emit-rtl.c | |
parent | 8be977998ce3bb8e1040fe5f9b3979ab713fec05 (diff) | |
download | gcc-915c336f8096591e13a940635c21f960dac8a4be.tar.gz |
* alpha/osf.h (TARGET_HAS_XFLOATING_LIBS): Define.
* alpha/osf5.h: New file.
* configure.in (alpha-*-osf5): Add it to tm_file.
* emit-rtl.c (operand_subword): Support TFmode on a 64-bit target.
* alpha-protos.h (alpha_emit_xfloating_arith): Declare.
(alpha_emit_xfloating_cvt, function_arg): Declare.
* alpha.c (alpha_emit_conditional_branch): Call
alpha_emit_xfloating_compare for TFmode compares.
(alpha_lookup_xfloating_lib_func): New.
(alpha_compute_xfloating_mode_arg): New.
(alpha_emit_xfloating_libcall): New.
(alpha_emit_xfloating_arith): New.
(alpha_emit_xfloating_compare): New.
(alpha_emit_xfloating_cvt): New.
(print_operand): Add default abort case.
(function_arg): Mind FUNCTION_ARG_PASS_BY_REFERENCE.
* alpha.h (TARGET_HAS_XFLOATING_LIBS): New.
(BIGGEST_ALIGNMENT): Increase to 128 bits.
(RETURN_IN_MEMORY): True for TF/TCmode.
(ALPHA_ARG_SIZE): TF/TCmode is passed indirect.
(FUNCTION_ARG): Move to function_arg.
(FUNCTION_ARG_PASS_BY_REFERENCE): New.
(ASM_OUTPUT_LONG_DOUBLE): New.
(ASM_OUTPUT_DOUBLE): Always output bits.
* alpha.md (addtf3, divtf3, multf3, subtf3, cmptf): New.
(fix_trunctfdi2, floatditf2, floatunsditf2): New.
(extenddftf2, trunctfdf2): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31579 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 2c763066777..d1e04730764 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1218,9 +1218,9 @@ operand_subword (op, i, validate_address, mode) are defined as returning one or two 32 bit values, respectively, and not values of BITS_PER_WORD bits. */ #ifdef REAL_ARITHMETIC -/* The output is some bits, the width of the target machine's word. - A wider-word host can surely hold them in a CONST_INT. A narrower-word - host can't. */ + /* The output is some bits, the width of the target machine's word. + A wider-word host can surely hold them in a CONST_INT. A narrower-word + host can't. */ if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD && GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE_BITSIZE (mode) == 64 @@ -1271,22 +1271,31 @@ operand_subword (op, i, validate_address, mode) && GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE_BITSIZE (mode) > 64 && GET_CODE (op) == CONST_DOUBLE) - { - long k[4]; - REAL_VALUE_TYPE rv; + { + long k[4]; + REAL_VALUE_TYPE rv; - REAL_VALUE_FROM_CONST_DOUBLE (rv, op); - REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k); + REAL_VALUE_FROM_CONST_DOUBLE (rv, op); + REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k); - if (BITS_PER_WORD == 32) - { - val = k[i]; - val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; - return GEN_INT (val); - } - else - abort (); - } + if (BITS_PER_WORD == 32) + { + val = k[i]; + val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; + return GEN_INT (val); + } +#if HOST_BITS_PER_WIDE_INT >= 64 + else if (BITS_PER_WORD >= 64 && i <= 1) + { + val = k[i*2 + ! WORDS_BIG_ENDIAN]; + val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32; + val |= (HOST_WIDE_INT) k[i*2 + WORDS_BIG_ENDIAN] & 0xffffffff; + return GEN_INT (val); + } +#endif + else + abort (); + } #else /* no REAL_ARITHMETIC */ if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) |