diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6de0aaf785c..e16a2a87e4d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-07-09 Eric Botcazou + + * config/sparc/sparc.md (return): Rewrite length formula. + * config/sparc/sparc.c (output_return): Pass 1 as 5th + argument to final_scan_insn when in a delay slot. + (output_sibcall): Likewise. + 2004-07-09 Richard Earnshaw * arm.c (arm_cpp_interwork): New variable. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 26c9e1e35f3..cfaa34aaaae 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4553,7 +4553,7 @@ output_return (rtx insn) epilogue_renumber (&pat, 0); fprintf (asm_out_file, "\treturn\t%%i7+%d\n", sparc_skip_caller_unimp ? 12 : 8); - final_scan_insn (delay, asm_out_file, 1, 0, 0, NULL); + final_scan_insn (delay, asm_out_file, 1, 0, 1, NULL); } else { @@ -4614,7 +4614,7 @@ output_sibcall (rtx insn, rtx call_operand) output_asm_insn ("sethi\t%%hi(%a0), %%g1", operands); output_asm_insn ("jmp\t%%g1 + %%lo(%a0)", operands); - final_scan_insn (delay, asm_out_file, 1, 0, 0, NULL); + final_scan_insn (delay, asm_out_file, 1, 0, 1, NULL); PATTERN (delay) = gen_blockage (); INSN_CODE (delay) = -1; diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index bccb4eab8e2..dc7ef6e80c0 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -7708,23 +7708,23 @@ "* return output_return (insn);" [(set_attr "type" "return") (set (attr "length") - (if_then_else (eq_attr "leaf_function" "true") - (if_then_else (eq_attr "empty_delay_slot" "true") - (const_int 2) - (const_int 1)) - (if_then_else (eq_attr "calls_eh_return" "true") - (if_then_else (eq_attr "delayed_branch" "true") - (if_then_else (eq_attr "isa" "v9") - (const_int 2) - (const_int 3)) - (if_then_else (eq_attr "isa" "v9") - (const_int 3) - (const_int 4))) - (if_then_else (eq_attr "empty_delay_slot" "true") - (if_then_else (eq_attr "delayed_branch" "true") - (const_int 2) - (const_int 3)) - (const_int 1)))))]) + (cond [(eq_attr "leaf_function" "true") + (if_then_else (eq_attr "empty_delay_slot" "true") + (const_int 2) + (const_int 1)) + (eq_attr "calls_eh_return" "true") + (if_then_else (eq_attr "delayed_branch" "true") + (if_then_else (eq_attr "isa" "v9") + (const_int 2) + (const_int 3)) + (if_then_else (eq_attr "isa" "v9") + (const_int 3) + (const_int 4))) + (eq_attr "empty_delay_slot" "true") + (if_then_else (eq_attr "delayed_branch" "true") + (const_int 2) + (const_int 3)) + ] (const_int 1)))]) ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and ;; all of memory. This blocks insns from being moved across this point.