aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1997-09-15 15:36:34 -0700
committerJim Wilson <wilson@gcc.gnu.org>1997-09-15 15:36:34 -0700
commit4bb437245c40db0a3c3e5bf330892bbe76d015a8 (patch)
treeae5ba0bc3fb1155697a5cebbb5cdadc4a541e02d /gcc
parent0d24ff5d2450f8de4c1b6aa1e7b727cf49bc2e1b (diff)
downloadgcc-4bb437245c40db0a3c3e5bf330892bbe76d015a8.zip
gcc-4bb437245c40db0a3c3e5bf330892bbe76d015a8.tar.gz
gcc-4bb437245c40db0a3c3e5bf330892bbe76d015a8.tar.bz2
Patch from Richard Henderson for alpha-linux ld.so bug.
* alpha.md (movdi): Handle CONST_DOUBLE for TARGET_BUILD_CONSTANTS. From-SVN: r15459
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/config/alpha/alpha.md47
2 files changed, 31 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0fd4105..a6daaa8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,7 @@
Mon Sep 15 15:24:00 1997 Richard Henderson <rth@cygnus.com>
+ * alpha.md (movdi): Handle CONST_DOUBLE for TARGET_BUILD_CONSTANTS.
+
* alpha/alpha.c (output_prolog): New variable sa_reg. Use it for
out-or-range reg_offset.
(output_epilog): Likewise.
diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md
index ce45183..d718481 100644
--- a/gcc/config/alpha/alpha.md
+++ b/gcc/config/alpha/alpha.md
@@ -3830,30 +3830,41 @@
else
operands[1] = tem;
}
- else if (TARGET_BUILD_CONSTANTS
- && GET_CODE (operands[1]) == CONST_INT)
+ else if (CONSTANT_P (operands[1]))
{
+ if (TARGET_BUILD_CONSTANTS)
+ {
#if HOST_BITS_PER_WIDE_INT == 64
- tem = alpha_emit_set_long_const (operands[0], INTVAL (operands[1]));
- if (rtx_equal_p (tem, operands[0]))
- DONE;
- else
- operands[1] = tem;
+ HOST_WIDE_INT i;
+
+ if (GET_CODE (operands[1]) == CONST_INT)
+ i = INTVAL (operands[1]);
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ i = CONST_DOUBLE_LOW (operands[1]);
+ else
+ abort();
+
+ tem = alpha_emit_set_long_const (operands[0], i);
+ if (rtx_equal_p (tem, operands[0]))
+ DONE;
+ else
+ operands[1] = tem;
#else
- abort();
+ abort();
#endif
- }
- else if (CONSTANT_P (operands[1]))
- {
- operands[1] = force_const_mem (DImode, operands[1]);
- if (reload_in_progress)
- {
- emit_move_insn (operands[0], XEXP (operands[1], 0));
- operands[1] = copy_rtx (operands[1]);
- XEXP (operands[1], 0) = operands[0];
}
else
- operands[1] = validize_mem (operands[1]);
+ {
+ operands[1] = force_const_mem (DImode, operands[1]);
+ if (reload_in_progress)
+ {
+ emit_move_insn (operands[0], XEXP (operands[1], 0));
+ operands[1] = copy_rtx (operands[1]);
+ XEXP (operands[1], 0) = operands[0];
+ }
+ else
+ operands[1] = validize_mem (operands[1]);
+ }
}
else
abort ();