re PR rtl-optimization/9888 (-mcpu=k6 -Os produces out of range loop instructions)

PR optimization/9888
	* config/i386/i386.md (movsi_1): Remove special alternatives
	for %eax register.
	(movhi_1): Likewise.
	* config/i386/i386.c (memory_address_length): Do not use
	short displacement when there is no base.
	(ix86_attr_length_address_default): Handle LEA instructions.

From-SVN: r64228
This commit is contained in:
Eric Botcazou 2003-03-12 10:04:01 +01:00 committed by Eric Botcazou
parent 2e22a8acb3
commit 521381440c
3 changed files with 45 additions and 26 deletions

View File

@ -1,3 +1,13 @@
2003-03-12 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/9888
* config/i386/i386.md (movsi_1): Remove special alternatives
for %eax register.
(movhi_1): Likewise.
* config/i386/i386.c (memory_address_length): Do not use
short displacement when there is no base.
(ix86_attr_length_address_default): Handle LEA instructions.
2003-03-09 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/9888

View File

@ -9939,7 +9939,8 @@ memory_address_length (addr)
if (disp)
{
if (GET_CODE (disp) == CONST_INT
&& CONST_OK_FOR_LETTER_P (INTVAL (disp), 'K'))
&& CONST_OK_FOR_LETTER_P (INTVAL (disp), 'K')
&& base)
len = 1;
else
len = 4;
@ -10002,6 +10003,26 @@ ix86_attr_length_address_default (insn)
rtx insn;
{
int i;
if (get_attr_type (insn) == TYPE_LEA)
{
rtx set = PATTERN (insn);
if (GET_CODE (set) == SET)
;
else if (GET_CODE (set) == PARALLEL
&& GET_CODE (XVECEXP (set, 0, 0)) == SET)
set = XVECEXP (set, 0, 0);
else
{
#ifdef ENABLE_CHECKING
abort ();
#endif
return 0;
}
return memory_address_length (SET_SRC (set));
}
extract_insn_cached (insn);
for (i = recog_data.n_operands - 1; i >= 0; --i)
if (GET_CODE (recog_data.operand[i]) == MEM)

View File

@ -1739,14 +1739,9 @@
(set_attr "mode" "SI")
(set_attr "length_immediate" "1")])
; The first alternative is used only to compute proper length of instruction.
; Reload's algorithm does not take into account the cost of spill instructions
; needed to free register in given class, so avoid it from choosing the first
; alternative when eax is not available.
(define_insn "*movsi_1"
[(set (match_operand:SI 0 "nonimmediate_operand" "=*?a,r,*?a,m,!*y,!rm,!*y,!*Y,!rm,!*Y")
(match_operand:SI 1 "general_operand" "im,rinm,rinm,rin,rm,*y,*y,rm,*Y,*Y"))]
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,m,!*y,!rm,!*y,!*Y,!rm,!*Y")
(match_operand:SI 1 "general_operand" "rinm,rin,rm,*y,*y,rm,*Y,*Y"))]
"GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
{
switch (get_attr_type (insn))
@ -1771,17 +1766,16 @@
}
}
[(set (attr "type")
(cond [(eq_attr "alternative" "4,5,6")
(cond [(eq_attr "alternative" "2,3,4")
(const_string "mmx")
(eq_attr "alternative" "7,8,9")
(eq_attr "alternative" "5,6,7")
(const_string "sse")
(and (ne (symbol_ref "flag_pic") (const_int 0))
(match_operand:SI 1 "symbolic_operand" ""))
(const_string "lea")
]
(const_string "imov")))
(set_attr "modrm" "0,*,0,*,*,*,*,*,*,*")
(set_attr "mode" "SI,SI,SI,SI,SI,SI,DI,TI,SI,SI")])
(set_attr "mode" "SI,SI,SI,SI,DI,TI,SI,SI")])
;; Stores and loads of ax to arbitary constant address.
;; We fake an second form of instruction to force reload to load address
@ -1854,14 +1848,9 @@
[(set_attr "type" "push")
(set_attr "mode" "QI")])
; The first alternative is used only to compute proper length of instruction.
; Reload's algorithm does not take into account the cost of spill instructions
; needed to free register in given class, so avoid it from choosing the first
; alternative when eax is not available.
(define_insn "*movhi_1"
[(set (match_operand:HI 0 "nonimmediate_operand" "=*?a,r,r,*?a,r,m")
(match_operand:HI 1 "general_operand" "i,r,rn,rm,rm,rn"))]
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
(match_operand:HI 1 "general_operand" "r,rn,rm,rn"))]
"GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
{
switch (get_attr_type (insn))
@ -1878,36 +1867,35 @@
}
}
[(set (attr "type")
(cond [(and (eq_attr "alternative" "0,1")
(cond [(and (eq_attr "alternative" "0")
(ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
(const_int 0))
(eq (symbol_ref "TARGET_HIMODE_MATH")
(const_int 0))))
(const_string "imov")
(and (eq_attr "alternative" "2,3,4")
(and (eq_attr "alternative" "1,2")
(match_operand:HI 1 "aligned_operand" ""))
(const_string "imov")
(and (ne (symbol_ref "TARGET_MOVX")
(const_int 0))
(eq_attr "alternative" "0,1,3,4"))
(eq_attr "alternative" "0,2"))
(const_string "imovx")
]
(const_string "imov")))
(set (attr "mode")
(cond [(eq_attr "type" "imovx")
(const_string "SI")
(and (eq_attr "alternative" "2,3,4")
(and (eq_attr "alternative" "1,2")
(match_operand:HI 1 "aligned_operand" ""))
(const_string "SI")
(and (eq_attr "alternative" "0,1")
(and (eq_attr "alternative" "0")
(ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
(const_int 0))
(eq (symbol_ref "TARGET_HIMODE_MATH")
(const_int 0))))
(const_string "SI")
]
(const_string "HI")))
(set_attr "modrm" "0,*,*,0,*,*")])
(const_string "HI")))])
;; Stores and loads of ax to arbitary constant address.
;; We fake an second form of instruction to force reload to load address