This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: 19991104 ICE compiling glibc
- To: Alan Modra <alan at SPRI dot Levels dot UniSA dot Edu dot Au>, kenner at nyu dot edu
- Subject: Re: 19991104 ICE compiling glibc
- From: Richard Henderson <rth at cygnus dot com>
- Date: Fri, 5 Nov 1999 10:25:22 -0800
- Cc: gcc-bugs at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- References: <Pine.LNX.4.10.9911052338301.17925-101000@mullet.itr.unisa.edu.au>
On Fri, Nov 05, 1999 at 11:55:26PM +1030, Alan Modra wrote:
> (insn 555 552 116 (set (reg/v:XF 3 ebx)
> (mem:XF (plus:SI (reg:SI 6 ebp)
> (const_int -160 [0xffffff60])) 0)) 86 {*movxf_1} (nil)
> (nil))
> ../sysdeps/libm-ieee754/s_csinhl.c:121: Internal compiler error in
> `reload_cse_simplify_operands', at reload1.c:9186
Fixed thus. It's clear I've never properly tested -msoft-float
with the new ia32 backend. *blush*
Kenner, this is another test case for you where your new regclass
code is making silly choices.
r~
* i386.c (split_xf): New.
* i386-protos.h: Declare it.
* i386.md (movxf_1): Add general regs alternatives.
(movxf_1+1): New splitter for same.
Index: config/i386/i386-protos.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386-protos.h,v
retrieving revision 1.1
diff -c -p -d -r1.1 i386-protos.h
*** i386-protos.h 1999/09/20 10:00:03 1.1
--- i386-protos.h 1999/11/05 18:17:36
*************** extern void print_operand PROTO((FILE*,
*** 73,78 ****
--- 73,79 ----
extern void print_operand_address PROTO((FILE*, rtx));
extern void split_di PROTO((rtx[], int, rtx[], rtx[]));
+ extern void split_xf PROTO((rtx, rtx[3]));
extern char *output_387_binary_op PROTO((rtx, rtx*));
extern char *output_fix_trunc PROTO((rtx, rtx*));
Index: config/i386/i386.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386.c,v
retrieving revision 1.102
diff -c -p -d -r1.102 i386.c
*** i386.c 1999/10/30 19:43:20 1.102
--- i386.c 1999/11/05 18:17:36
*************** split_di (operands, num, lo_half, hi_hal
*** 2995,3000 ****
--- 2995,3020 ----
abort();
}
}
+
+ void
+ split_xf (orig, out)
+ rtx orig;
+ rtx out[3];
+ {
+ if (REG_P (orig))
+ {
+ int regno = REGNO (orig);
+ out[0] = gen_rtx_REG (SImode, regno);
+ out[1] = gen_rtx_REG (SImode, regno + 1);
+ out[2] = gen_rtx_REG (SImode, regno + 2);
+ }
+ else
+ {
+ out[0] = change_address (orig, SImode, NULL_RTX);
+ out[1] = adj_offsettable_operand (out[0], 4);
+ out[2] = adj_offsettable_operand (out[0], 8);
+ }
+ }
/* Output code to perform a 387 binary operation in INSN, one of PLUS,
MINUS, MULT or DIV. OPERANDS are the insn operands, where operands[3]
Index: config/i386/i386.md
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386.md,v
retrieving revision 1.100
diff -c -p -d -r1.100 i386.md
*** i386.md 1999/10/29 21:45:05 1.100
--- i386.md 1999/11/05 18:17:36
***************
*** 1980,1987 ****
}")
(define_insn "*movxf_1"
! [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f")
! (match_operand:XF 1 "general_operand" "fm,f,G"))]
""
"*
{
--- 1980,1987 ----
}")
(define_insn "*movxf_1"
! [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,*r,o")
! (match_operand:XF 1 "general_operand" "fm,f,G,*ro,*r"))]
""
"*
{
***************
*** 2013,2022 ****
--- 2013,2036 ----
return \"fld1\";
}
break;
+
+ case 3: case 4:
+ return \"#\";
}
abort();
}"
[(set_attr "type" "fmov")])
+
+ (define_split
+ [(set (match_operand:XF 0 "nonimmediate_operand" "")
+ (match_operand:XF 1 "nonimmediate_operand" ""))]
+ "(REG_P (operands[0]) && ! FP_REGNO_P (REGNO (operands[0])))
+ || (REG_P (operands[1]) && ! FP_REGNO_P (REGNO (operands[1])))"
+ [(set (match_dup 0) (match_dup 3))
+ (set (match_dup 1) (match_dup 4))
+ (set (match_dup 2) (match_dup 5))]
+ "split_xf (operands[1], &operands[3]);
+ split_xf (operands[0], &operands[0]);")
(define_insn "swapxf"
[(set (match_operand:XF 0 "register_operand" "+f")