Patchwork [RFC,i386] : ICE: in final_scan_insn due to late split

login
register
mail settings
Submitter Uros Bizjak
Date March 24, 2011, 8:50 p.m.
Message ID <AANLkTikh-bMDLw-LMR71gKfXcyv6T9UUCRLu_KNQ=kEH@mail.gmail.com>
Download mbox | patch
Permalink /patch/88274/
State New
Headers show

Comments

Uros Bizjak - March 24, 2011, 8:50 p.m.
On Thu, Mar 24, 2011 at 8:59 PM, Rainer Orth
<ro@cebitec.uni-bielefeld.de> wrote:
> Uros Bizjak <ubizjak@gmail.com> writes:
>
>> 2011-03-23  Uros Bizjak  <ubizjak@gmail.com>
>>
>>       PR target/48237
>>       * config/i386/i386.md (*movdf_internal_rex64): Do not split
>>       alternatives that can be handled with movq or movabsq insn.
>>       (*movdf_internal): Disable for !TARGET_64BIT.
>>       (*movdf_internal_nointeger): Ditto.
>>       * config/i386/i386.c (ix86_print_operand): Handle DFmode immediates.
>
> This patch broke Solaris/x86 bootstrap:
>
> /vol/gcc/src/hg/trunk/local/gcc/config/i386/i386.c: In function 'ix86_print_operand':
> /vol/gcc/src/hg/trunk/local/gcc/config/i386/i386.c:14416:2: error: format '%lld' expects argument of type 'long long int', but argument 3 has type 'long int' [-Werror=format]

Fixed by attached patch that removes all fancy conditional handling.

2011-03-24  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.md (ix86_print_operand): Output DFmode const_double
	correctly.

Tested on x86_64-pc-linux-gnu, committed to mainline.

Uros.
>
>        Rainer
>
> --
> -----------------------------------------------------------------------------
> Rainer Orth, Center for Biotechnology, Bielefeld University
>

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 171422)
+++ config/i386/i386.c	(working copy)
@@ -14408,12 +14408,7 @@  ix86_print_operand (FILE *file, rtx x, i
 
       if (ASSEMBLER_DIALECT == ASM_ATT)
 	putc ('$', file);
-      /* We can use %d if the number is <32 bits and positive.  */
-      if (l[1] || l[0] < 0)
-	fprintf (file, "0x%lx%08lx",
-		 (unsigned long) l[1], (unsigned long) l[0]);
-      else
-	fprintf (file, HOST_WIDE_INT_PRINT_DEC, l[0]);
+      fprintf (file, "0x%lx%08lx", l[1] & 0xffffffff, l[0] & 0xffffffff);
     }
 
   /* These float cases don't actually occur as immediate operands.  */