This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How do you emit RTL for a jump to a mem/symbol instead of an asm label?


On Wed, Aug 24, 2016 at 02:47:41AM -0500, Daniel Santos wrote:
> On 08/21/2016 05:59 PM, Segher Boessenkool wrote:
> >On Sun, Aug 21, 2016 at 02:04:49PM -0500, Daniel Santos wrote:
> >>Thanks for the response! Perhaps an UNSPEC insn is needed here because I
> >>have work to do on other passes too. For example, when the debug info is
> >>created, it's giving the wrong location (on the stack) for where some
> >>registers were saved.
> >Don't worry about this until you have the basics working.  It is fiddly
> >work but not really hard.

You have the basics working now, right?  ;-)

> Then I've added a pattern for it 
> and it's matching on the below RTL and emitting the jump I want! :) My 
> question now is can you see anything that I'm missing or doing wrong in 
> this? I'm telling what registers I'm restoring, where they are read from 
> and what changes I'm making to the stack pointer.
> 
> (jump_insn 27 26 28 2 (parallel [
>             (simple_return)
>             (use (symbol_ref:DI ("__msabi_restore_odd")))
>             (set (reg:DI 4 si)
>                 (mem/c:DI (plus:DI (reg/f:DI 7 sp)
>                         (const_int 0 [0])) [2  S8 A8]))
>             (set (reg:V4SF 27 xmm6)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 8 [0x8])) [2  S16 A8]))
>             (set (reg:V4SF 28 xmm7)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 24 [0x18])) [2  S16 A8]))
>             (set (reg:V4SF 45 xmm8)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 40 [0x28])) [2  S16 A8]))
>             (set (reg:V4SF 46 xmm9)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 56 [0x38])) [2  S16 A8]))
>             (set (reg:V4SF 47 xmm10)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 72 [0x48])) [2  S16 A8]))
>             (set (reg:V4SF 48 xmm11)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 88 [0x58])) [2  S16 A8]))
>             (set (reg:V4SF 49 xmm12)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 104 [0x68])) [2  S16 A8]))
>             (set (reg:V4SF 50 xmm13)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 120 [0x78])) [2  S16 A8]))
>             (set (reg:V4SF 51 xmm14)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 136 [0x88])) [2  S16 A8]))
>             (set (reg:V4SF 52 xmm15)
>                 (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
>                         (const_int 152 [0x98])) [2  S16 A8]))
>             (set (reg:DI 5 di)
>                 (mem/c:DI (plus:DI (reg/f:DI 7 sp)
>                         (const_int 168 [0xa8])) [2  S8 A8]))
>             (set (reg/f:DI 7 sp)
>                 (plus:DI (reg/f:DI 7 sp)
>                     (const_int 176 [0xb0])))
>         ]) ../a.c:9 -1
>      (expr_list:REG_CFA_ADJUST_CFA (set (reg/f:DI 7 sp)
>             (plus:DI (reg/f:DI 7 sp)
>                 (const_int 176 [0xb0])))
>         (nil))
>  -> simple_return)

You now need to add REG_CFA_RESTORE notes for the registers you restore
from stack, as well.  The REG_CFA_ADJUST_CFA note is done automatically
it seems, but the REG_CFA_RESTORE need to be done by hand.

You also should check if the prologue has the correct notes; usually
you don't need more than just setting RTX_FRAME_RELATED_P on the relevant
insns (and arms of the parallel).  That flag shows up as "/f" in the RTL
dumps.


Segher


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]