aboutsummaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-06-17 21:12:24 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-06-17 21:12:24 +0000
commitca3f2950267c25a44aa73f8290b5fb407af81260 (patch)
treee814ff4111b16d31e2e72a0a4c64d66ee862eaf5 /gcc/final.c
parent172a84ffae1199c36f0c0c3ac5721f13808d2041 (diff)
downloadgcc-ca3f2950267c25a44aa73f8290b5fb407af81260.zip
gcc-ca3f2950267c25a44aa73f8290b5fb407af81260.tar.gz
gcc-ca3f2950267c25a44aa73f8290b5fb407af81260.tar.bz2
output.h (split_double): Move prototype to rtl.h.
* output.h (split_double): Move prototype to rtl.h. (constructor_static_from_elts_p): Move prototype to tree.c. * rtl.h (split_double): Moved here from output.h. * tree.h (constructor_static_from_elts_p): Moved here from output.h. * final.c (split_double): Move from here ... * rtlanal.c (split_double): ... to here. * expr.c: Do not include output.h. From-SVN: r188714
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c143
1 files changed, 0 insertions, 143 deletions
diff --git a/gcc/final.c b/gcc/final.c
index f940b64..78e9620 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -4068,149 +4068,6 @@ asm_fprintf (FILE *file, const char *p, ...)
va_end (argptr);
}
-/* Split up a CONST_DOUBLE or integer constant rtx
- into two rtx's for single words,
- storing in *FIRST the word that comes first in memory in the target
- and in *SECOND the other. */
-
-void
-split_double (rtx value, rtx *first, rtx *second)
-{
- if (CONST_INT_P (value))
- {
- if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD))
- {
- /* In this case the CONST_INT holds both target words.
- Extract the bits from it into two word-sized pieces.
- Sign extend each half to HOST_WIDE_INT. */
- unsigned HOST_WIDE_INT low, high;
- unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
- unsigned bits_per_word = BITS_PER_WORD;
-
- /* Set sign_bit to the most significant bit of a word. */
- sign_bit = 1;
- sign_bit <<= bits_per_word - 1;
-
- /* Set mask so that all bits of the word are set. We could
- have used 1 << BITS_PER_WORD instead of basing the
- calculation on sign_bit. However, on machines where
- HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
- compiler warning, even though the code would never be
- executed. */
- mask = sign_bit << 1;
- mask--;
-
- /* Set sign_extend as any remaining bits. */
- sign_extend = ~mask;
-
- /* Pick the lower word and sign-extend it. */
- low = INTVAL (value);
- low &= mask;
- if (low & sign_bit)
- low |= sign_extend;
-
- /* Pick the higher word, shifted to the least significant
- bits, and sign-extend it. */
- high = INTVAL (value);
- high >>= bits_per_word - 1;
- high >>= 1;
- high &= mask;
- if (high & sign_bit)
- high |= sign_extend;
-
- /* Store the words in the target machine order. */
- if (WORDS_BIG_ENDIAN)
- {
- *first = GEN_INT (high);
- *second = GEN_INT (low);
- }
- else
- {
- *first = GEN_INT (low);
- *second = GEN_INT (high);
- }
- }
- else
- {
- /* The rule for using CONST_INT for a wider mode
- is that we regard the value as signed.
- So sign-extend it. */
- rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
- if (WORDS_BIG_ENDIAN)
- {
- *first = high;
- *second = value;
- }
- else
- {
- *first = value;
- *second = high;
- }
- }
- }
- else if (GET_CODE (value) != CONST_DOUBLE)
- {
- if (WORDS_BIG_ENDIAN)
- {
- *first = const0_rtx;
- *second = value;
- }
- else
- {
- *first = value;
- *second = const0_rtx;
- }
- }
- else if (GET_MODE (value) == VOIDmode
- /* This is the old way we did CONST_DOUBLE integers. */
- || GET_MODE_CLASS (GET_MODE (value)) == MODE_INT)
- {
- /* In an integer, the words are defined as most and least significant.
- So order them by the target's convention. */
- if (WORDS_BIG_ENDIAN)
- {
- *first = GEN_INT (CONST_DOUBLE_HIGH (value));
- *second = GEN_INT (CONST_DOUBLE_LOW (value));
- }
- else
- {
- *first = GEN_INT (CONST_DOUBLE_LOW (value));
- *second = GEN_INT (CONST_DOUBLE_HIGH (value));
- }
- }
- else
- {
- REAL_VALUE_TYPE r;
- long l[2];
- REAL_VALUE_FROM_CONST_DOUBLE (r, value);
-
- /* Note, this converts the REAL_VALUE_TYPE to the target's
- format, splits up the floating point double and outputs
- exactly 32 bits of it into each of l[0] and l[1] --
- not necessarily BITS_PER_WORD bits. */
- REAL_VALUE_TO_TARGET_DOUBLE (r, l);
-
- /* If 32 bits is an entire word for the target, but not for the host,
- then sign-extend on the host so that the number will look the same
- way on the host that it would on the target. See for instance
- simplify_unary_operation. The #if is needed to avoid compiler
- warnings. */
-
-#if HOST_BITS_PER_LONG > 32
- if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32)
- {
- if (l[0] & ((long) 1 << 31))
- l[0] |= ((long) (-1) << 32);
- if (l[1] & ((long) 1 << 31))
- l[1] |= ((long) (-1) << 32);
- }
-#endif
-
- *first = GEN_INT (l[0]);
- *second = GEN_INT (l[1]);
- }
-}
-
/* Return nonzero if this function has no function calls. */
int