lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Document jit_align.


From: Paulo César Pereira de Andrade
Subject: Re: [PATCH] Document jit_align.
Date: Tue, 16 Aug 2022 15:14:03 -0300

Em dom., 14 de ago. de 2022 às 13:09, Marc Nieper-Wißkirchen
<marc@nieper-wisskirchen.de> escreveu:
>
> I just noticed that the argument to jit_align is asserted to be at most as 
> large as the size of a word in jit_x86.c (line 1596).  To make jit_align 
> suitable for what the documentation was written for, the limit should be 
> increased to, say, jit_get_max_instr().  For that, the nop generator in 
> jit_x86-cpu.c has to be modified to allow longer sequences of nop (e.g. by 
> iterating).

  The idea for jit_align was indeed just to make it just align jump targets
or function prologs.
  Usually jumps to aligned addresses are faster.

  The assertions should be changed.

> I haven't checked the other CPUs.
>
> Am Fr., 12. Aug. 2022 um 18:43 Uhr schrieb Marc Nieper-Wißkirchen 
> <marc@nieper-wisskirchen.de>:
>>
>>
>>
>> Am Fr., 12. Aug. 2022 um 16:49 Uhr schrieb Paulo César Pereira de Andrade 
>> <paulo.cesar.pereira.de.andrade@gmail.com>:
>>>
>>> Em sex., 12 de ago. de 2022 às 10:45, Marc Nieper-Wißkirchen
>>> <marc@nieper-wisskirchen.de> escreveu:
>>>
>>>   Hi,
>>>
>>>   Just commited it and a small change after it.
>>>
>>>   The jit_align() interface was added indeed to align labels
>>> (jump targets), but it might be useful on other uses, like the
>>> one you presented, or if for some reason needs to add
>>> embedded, and aligned, data to the code.
>>>   Other uses of noops are internal. Like possibly misaligned
>>> prolog in arm thumb mode, or implicit alignment of labels in
>>> s390 and x86 backends.
>>
>>
>> Thanks!  I hope the constant of 16 was correct for all ports (i.e. for no 
>> port and for no instruction, lightning issues an alignment larger than 16).
>>
>> Unfortunately, I have found one error in my example code.  In this line
>>
>> https://git.savannah.gnu.org/cgit/lightning.git/tree/doc/body.texi#n675
>>
>> `entry1` must be renamed to `forward`.  Could you correct it on occasion?
>>
>> Thanks,
>>
>> Marc
>>
>>> > * doc/body.texi: Add documentation for jit_align.
>>> > ---
>>> >  ChangeLog     |  5 +++++
>>> >  doc/body.texi | 38 ++++++++++++++++++++++++++++++++++++++
>>> >  2 files changed, 43 insertions(+)
>>> >
>>> > diff --git a/ChangeLog b/ChangeLog
>>> > index a842040..d18c8f8 100644
>>> > --- a/ChangeLog
>>> > +++ b/ChangeLog
>>> > @@ -1,3 +1,8 @@
>>> > +2022-08-12  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
>>> > +
>>> > +       Document jit_align.
>>> > +       * doc/body.texi: Add documentation for jit_align.
>>> > +
>>> >  2022-05-14 Paulo Andrade <pcpa@gnu.org>
>>> >
>>> >         * include/lightning.h.in: Reorder jit_mov{n,z}r in instruction 
>>> > list.
>>> > diff --git a/doc/body.texi b/doc/body.texi
>>> > index c174fcf..677afd8 100644
>>> > --- a/doc/body.texi
>>> > +++ b/doc/body.texi
>>> > @@ -597,6 +597,12 @@ forward   (not specified)                @r{forward 
>>> > label}
>>> >  indirect  (not specified)                @r{special simple label}
>>> >  @end example
>>> >
>>> > +The following instruction is used to specify a minimal alignment for a
>>> > +label:
>>> > +@example
>>> > +align     (not specified)                @r{align code}
>>> > +@end example
>>> > +
>>> >  @code{label} is normally used as @code{patch_at} argument for backward
>>> >  jumps.
>>> >
>>> > @@ -649,6 +655,38 @@ that automatically binds the implicit label added by 
>>> > @code{patch} with
>>> >  the @code{movi}, but on some special conditions it is required to create
>>> >  an "unbound" label.
>>> >
>>> > +@code{align} is useful for creating multiple entry points to a
>>> > +(trampoline) function that are all accessible through a single
>>> > +function pointer.  @code{align} receives an integer argument that
>>> > +defines the minimal alignment of the address of a label directly
>>> > +following the @code{align} instruction.  The integer argument must be
>>> > +a power of two and the effective alignment will be a power of two no
>>> > +less than the argument to @code{align}.  If the argument to
>>> > +@code{align} is 16 or more, the effective alignment will match the
>>> > +specified minimal alignment exactly.
>>> > +
>>> > +@example
>>> > +          jit_node_t *forward, *label1, *label2, jump;
>>> > +          unsigned char *addr1, *addr2;
>>> > +forward = jit_forward();
>>> > +          jit_align(16);
>>> > +label1  = jit_indirect();                @rem{/* first entry point */}
>>> > +jump    = jit_jmpi();                    @rem{/* jump to first handler 
>>> > */}
>>> > +          jit_patch_at(jump, entry1);
>>> > +          jit_align(16);
>>> > +label2  = jit_indirect();                @rem{/* second entry point */}
>>> > +          ...                            @rem{/* second handler */}
>>> > +          jit_jmpr(...);
>>> > +          jit_link(forward);
>>> > +          ...                            @rem{/* first handler /*}
>>> > +          jit_jmpr(...);
>>> > +          ...
>>> > +          jit_emit();
>>> > +          addr1 = jit_address(label1);
>>> > +          addr2 = jit_address(label2);
>>> > +          assert(addr2 - addr1 == 16);   @rem{/* only one of the 
>>> > addresses needs to be remembered */}
>>> > +@end example
>>> > +
>>> >  @item Function prolog
>>> >
>>> >  These macros are used to set up a function prolog.  The @code{allocai}
>>> > --
>>> > 2.34.1
>>> >
>>> >



reply via email to

[Prev in Thread] Current Thread [Next in Thread]