public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "olegendo at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug target/54602] [SH] Register pop insn not put in rts delay slot
Date: Wed, 10 Oct 2012 00:44:00 -0000	[thread overview]
Message-ID: <bug-54602-4-AwUQtb2opG@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-54602-4@http.gcc.gnu.org/bugzilla/>


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54602

Oleg Endo <olegendo at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kkojima at gcc dot gnu.org

--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> 2012-10-10 00:43:39 UTC ---
I was right after all.  The checks in (define_delay (eq_attr "type" "return") 
somehow got lost in parenthesis and the "*movsi_pop" insn is not required after
all.  The following fixes the issue:

Index: gcc/config/sh/sh.md
===================================================================
--- gcc/config/sh/sh.md    (revision 192200)
+++ gcc/config/sh/sh.md    (working copy)
@@ -541,22 +541,22 @@
   (eq_attr "needs_delay_slot" "yes")
   [(eq_attr "in_delay_slot" "yes") (nil) (nil)])

+;; Since a normal return (rts) implicitly uses the PR register,
+;; we can't allow PR register loads in an rts delay slot.
 ;; On the SH and SH2, the rte instruction reads the return pc from the stack,
 ;; and thus we can't put a pop instruction in its delay slot.
 ;; On the SH3 and SH4, the rte instruction does not use the stack, so a pop
-;; instruction can go in the delay slot.
-;; Since a normal return (rts) implicitly uses the PR register,
-;; we can't allow PR register loads in an rts delay slot.
+;; instruction can go in the delay slot, unless it references a banked
+;; register (the register bank is switched by rte).
 (define_delay
   (eq_attr "type" "return")
   [(and (eq_attr "in_delay_slot" "yes")
     (ior (and (eq_attr "interrupt_function" "no")
           (eq_attr "type" "!pload,prset"))
          (and (eq_attr "interrupt_function" "yes")
-          (ior
-           (not (match_test "TARGET_SH3"))
-           (eq_attr "hit_stack" "no")
-           (eq_attr "banked" "no"))))) (nil) (nil)])
+          (ior (match_test "TARGET_SH3") (eq_attr "hit_stack" "no"))
+          (eq_attr "banked" "no"))))
+   (nil) (nil)])

 ;; Since a call implicitly uses the PR register, we can't allow
 ;; a PR register store in a jsr delay slot.
@@ -6186,21 +6186,6 @@
   emit_insn (gen_ashlsi3 (operands[5], operands[0], operands[2]));
 })

-;; Define additional pop for SH1 and SH2 so it does not get 
-;; placed in the delay slot.
-(define_insn "*movsi_pop"
-  [(set (match_operand:SI 0 "register_operand" "=r,x,l")
-        (match_operand:SI 1 "sh_no_delay_pop_operand" ">,>,>"))]
-  "(TARGET_SH1 || TARGET_SH2E || TARGET_SH2A)
-   && ! TARGET_SH3"
-  "@
-    mov.l    %1,%0
-    lds.l    %1,%0
-    lds.l    %1,%0"
-  [(set_attr "type" "load_si,mem_mac,pload")
-   (set_attr "length" "2,2,2")
-   (set_attr "in_delay_slot" "no,no,no")])
-
 ;; t/r must come after r/r, lest reload will try to reload stuff like
 ;; (set (subreg:SI (mem:QI (plus:SI (reg:SI SP_REG) (const_int 12)) 0) 0)
 ;; (made from (set (subreg:SI (reg:QI ###) 0) ) into T.


Kaz, could you please also have a pre-look at this?  I might be missing
something...

Also, I've noticed that on SH4 (which has banked regs R0..R7) the banked regs
are also saved / restored in an interrupt function.  This actually defeats the
purpose of the R0..R7 register bank.  Maybe some historic reason, or just
accident?


  parent reply	other threads:[~2012-10-10  0:44 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-16 15:26 [Bug target/54602] New: " olegendo at gcc dot gnu.org
2012-10-09 22:52 ` [Bug target/54602] " olegendo at gcc dot gnu.org
2012-10-09 22:58 ` olegendo at gcc dot gnu.org
2012-10-10  0:44 ` olegendo at gcc dot gnu.org [this message]
2012-10-10 22:44 ` kkojima at gcc dot gnu.org
2012-10-10 23:24 ` olegendo at gcc dot gnu.org
2012-10-11 13:48 ` olegendo at gcc dot gnu.org
2012-10-12 23:23 ` olegendo at gcc dot gnu.org
2012-10-30  1:26 ` olegendo at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-54602-4-AwUQtb2opG@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).