This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: problem with generating epilogue
On Thu, Aug 03, 2000 at 08:59:12PM -0700, Richard Henderson wrote:
> On Thu, Aug 03, 2000 at 06:49:05PM +0100, Herman ten Brugge wrote:
> > - emit_indirect_jump (ecx);
> > + emit_insn (gen_indirect_jump (ecx));
>
> This is not quite correct. You should use emit_jump_insn.
Actually, I take that back -- you really have to use some
form of "return" instruction. That is, some pattern containing
(return). E.g.
(jump_insn 20 19 21 (parallel[
(return)
(use (reg:SI 2 ecx))
] ) 300 {return_indirect_internal} (insn_list 17 (nil))
(expr_list:REG_DEAD (reg:SI 2 ecx)
(nil)))
I'm committing the following patch to cure the x86 failure.
r~
* i386.md (return_indirect_internal): New.
* i386.c (ix86_expand_epilogue): Use it.
Index: i386.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386.c,v
retrieving revision 1.167
diff -c -p -d -r1.167 i386.c
*** i386.c 2000/08/02 17:01:11 1.167
--- i386.c 2000/08/04 04:10:59
*************** ix86_expand_epilogue (emit_return)
*** 2138,2144 ****
emit_insn (gen_popsi1 (ecx));
emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
! emit_indirect_jump (ecx);
}
else
emit_jump_insn (gen_return_pop_internal (popc));
--- 2138,2144 ----
emit_insn (gen_popsi1 (ecx));
emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
! emit_jump_insn (gen_return_indirect_internal (ecx));
}
else
emit_jump_insn (gen_return_pop_internal (popc));
Index: i386.md
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386.md,v
retrieving revision 1.170
diff -c -p -d -r1.170 i386.md
*** i386.md 2000/08/02 14:02:15 1.170
--- i386.md 2000/08/04 04:10:59
***************
*** 8681,8686 ****
--- 8681,8694 ----
(set_attr "length_immediate" "2")
(set_attr "modrm" "0")])
+ (define_insn "return_indirect_internal"
+ [(return)
+ (use (match_operand:SI 0 "register_operand" "r"))]
+ "reload_completed"
+ "jmp\\t%*%0"
+ [(set_attr "type" "ibr")
+ (set_attr "length_immediate" "0")])
+
(define_insn "nop"
[(const_int 0)]
""