summaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-24 04:02:40 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-24 04:02:40 +0000
commit915c336f8096591e13a940635c21f960dac8a4be (patch)
tree01f52c80cc2f9fdea21bd2466e865f0bfdaa9c01 /gcc/emit-rtl.c
parent8be977998ce3bb8e1040fe5f9b3979ab713fec05 (diff)
downloadgcc-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.c43
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)