This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
get frv-uclinux to build on x86_64-linux-gnu host
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: 25 Oct 2004 05:31:36 -0300
- Subject: get frv-uclinux to build on x86_64-linux-gnu host
- Organization: Red Hat Global Engineering Services Compiler Team
I needed this patch to avoid inappropriate truncation of 64-bit
CONST_INTs. Build-tested on x86_64-linux-gnu and i686-pc-linux-gnu.
I'm checking it in.
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* config/frv/frv.md (movdi, movdf): Handle wide-constant splits
with wider-than-32-bit HOST_WIDE_INTs.
Index: gcc/config/frv/frv.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/frv/frv.md,v
retrieving revision 1.25
diff -u -p -r1.25 frv.md
--- gcc/config/frv/frv.md 11 Oct 2004 12:13:33 -0000 1.25
+++ gcc/config/frv/frv.md 25 Oct 2004 08:27:30 -0000
@@ -1833,7 +1833,7 @@
(match_operand:DI 1 "const_int_operand" ""))]
"reload_completed"
[(set (match_dup 2) (match_dup 4))
- (set (match_dup 3) (match_dup 1))]
+ (set (match_dup 3) (match_dup 5))]
"
{
rtx op0 = operands[0];
@@ -1841,7 +1841,18 @@
operands[2] = gen_highpart (SImode, op0);
operands[3] = gen_lowpart (SImode, op0);
- operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);
+ if (HOST_BITS_PER_WIDE_INT <= 32)
+ {
+ operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);
+ operands[5] = op1;
+ }
+ else
+ {
+ operands[4] = GEN_INT ((((unsigned HOST_WIDE_INT)INTVAL (op1) >> 16)
+ >> 16) ^ ((unsigned HOST_WIDE_INT)1 << 31)
+ - ((unsigned HOST_WIDE_INT)1 << 31));
+ operands[5] = GEN_INT (trunc_int_for_mode (INTVAL (op1), SImode));
+ }
}")
(define_split
@@ -2031,7 +2042,7 @@
(match_operand:DF 1 "const_int_operand" ""))]
"reload_completed"
[(set (match_dup 2) (match_dup 4))
- (set (match_dup 3) (match_dup 1))]
+ (set (match_dup 3) (match_dup 5))]
"
{
rtx op0 = operands[0];
@@ -2039,7 +2050,18 @@
operands[2] = gen_highpart (SImode, op0);
operands[3] = gen_lowpart (SImode, op0);
- operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);
+ if (HOST_BITS_PER_WIDE_INT <= 32)
+ {
+ operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);
+ operands[5] = op1;
+ }
+ else
+ {
+ operands[4] = GEN_INT ((((unsigned HOST_WIDE_INT)INTVAL (op1) >> 16)
+ >> 16) ^ ((unsigned HOST_WIDE_INT)1 << 31)
+ - ((unsigned HOST_WIDE_INT)1 << 31));
+ operands[5] = GEN_INT (trunc_int_for_mode (INTVAL (op1), SImode));
+ }
}")
(define_split
--
Alexandre Oliva http://www.ic.unicamp.br/~oliva/
Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org}