[Libre-soc-dev] change sv ld/st to allow non-zero immediates for unit-strided load/store

lkcl luke.leighton at gmail.com
Tue Oct 11 10:51:42 BST 2022


On Tue, Oct 11, 2022 at 10:28 AM Jacob Lifshay <programmerjake at gmail.com> wrote:
>
> this will be very common in spill code or other code with vectors stored in a struct or on stack:
> sv.ld/unitstrided *r120, -32(r1) # load from local stack var in redzone
> sv.ld/unitstrided *r32, 64(r1) # load from function arguments
> sv.ld/unitstrided *r64, 32(r3) # load from struct member that starts at offset 32

pretty much every single (contiguous) load-process-store loop
will be able to use it.
https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=openpower/isa/pifixedload.mdwn;hb=HEAD

example:

https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=media/video/libvpx/variance_svp64_real.s;hb=HEAD

these can go from the inner loop as they'd be part of the
post-update:

    60 addi src_col, src_col, 8 # Increment src, ref by 8 bytes
    61 addi ref_col, ref_col, 8

and replace these:

  48         sv.lha  *src, 0(src_col)                # Load 4 ints
from (src_ptr)
  49         sv.lha  *ref, 0(ref_col)                # Load 4 ints
from (ref_ptr)

with these:

  48         sv.lhaup  *src, 4(src_col)    # Load 4 ints from
(src_ptr) post-inc RA
  49         sv.lhaup  *ref, 4(ref_col)     # Load 4 ints from
(ref_ptr) post-inc RA

only thing is, have to disable the auto-calculation of offset-immediates
(the multiply by index) otherwise it gets weird.

> sorry this is not very detailed, it's 2:30 am here...

no problem i'm pretty blurry myself.

l.



More information about the Libre-soc-dev mailing list