On Wed, Jul 29, 2026 at 10:28 AM H.J. Lu <[email protected]> wrote:
>
> On some targets, TImode structs are placed in TImode PARALLEL for function
> return and parameter passing:
>
> (parallel:TI [
>         (expr_list:REG_DEP_TRUE (reg:DI 20 xmm0 [ arg ])
>             (const_int 0 [0]))
>         (expr_list:REG_DEP_TRUE (reg:DI 21 xmm1 [ arg+8 ])
>             (const_int 8 [0x8]))
>     ])
>
> (parallel:TI [
>         (expr_list:REG_DEP_TRUE (reg:SI 5 di [ arg ])
>             (const_int 0 [0]))
>         (expr_list:REG_DEP_TRUE (reg:DI 4 si [ arg+8 ])
>             (const_int 8 [0x8]))
>     ])
>
> (parallel:BLK [
>         (expr_list:REG_DEP_TRUE (reg:TI 102 [ <retval> ])
>             (const_int 0 [0]))
>     ])
>
> We generate very bad code sequences for moving between such PARALLELs
> and register or memory since the backend doesn't see the whole picture.
> Add parallel_mov optab to move between PARALLEL and register or memory.
> Implement parallel_mov patterns for TImode in x86 backend.

Why is what you do in the x86 implementation in any way special to x86?
Can this not be done directly in the middle-end and for all targets?

Richard.

> gcc/
>
> PR target/114134
> PR target/120588
> PR target/126403
> PR target/126424
> * expr.cc (emit_group_load): Try parallel_mov optab for
> PARALLEL destination.
> (emit_group_store): Try parallel_mov optab for PARALLEL source.
> * optabs.def (parallel_mov_optab): New.
> (ix86_expand_parallel_move): New.
> * config/i386/i386-protos.h (ix86_expand_parallel_move): Likewise.
> * config/i386/i386.md (parallel_movti): Likewise.
> (parallel_movblk): Likewise.
> * config/i386/predicates.md (any_parallel_operand): Likewise.
> * config/i386/sse.md (*vec_extractv2di_1 splitter): New.
> * doc/md.texi: Document parallel_mov.
>
> gcc/testsuite/
>
> PR target/114134
> PR target/120588
> PR target/126403
> PR target/126424
> * g++.target/i386/pr126424-1.C: New test.
> * gcc.target/i386/pr114134-1.c: Likewise.
> * gcc.target/i386/pr114134-2.c: Likewise.
> * gcc.target/i386/pr114134-3.c: Likewise.
> * gcc.target/i386/pr120588-1.c: Likewise.
> * gcc.target/i386/pr120588-2.c: Likewise.
> * gcc.target/i386/pr120588-3.c: Likewise.
> * gcc.target/i386/pr120588-4.c: Likewise.
> * gcc.target/i386/pr120588-5.c: Likewise.
> * gcc.target/i386/pr120588-6.c: Likewise.
> * gcc.target/i386/pr120588-7.c: Likewise.
> * gcc.target/i386/pr120588-8.c: Likewise.
> * gcc.target/i386/pr120588-9.c: Likewise.
> * gcc.target/i386/pr120588-10.c: Likewise.
> * gcc.target/i386/pr120588-11.c: Likewise.
> * gcc.target/i386/pr120588-12.c: Likewise.
> * gcc.target/i386/pr120588-13.c: Likewise.
> * gcc.target/i386/pr120588-14.c: Likewise.
> * gcc.target/i386/pr120588-15.c: Likewise.
> * gcc.target/i386/pr120588-16.c: Likewise.
> * gcc.target/i386/pr120588-17.c: Likewise.
> * gcc.target/i386/pr120588-18.c: Likewise.
> * gcc.target/i386/pr120588-19.c: Likewise.
> * gcc.target/i386/pr120588-20.c: Likewise.
> * gcc.target/i386/pr126403-1.c: Likewise.
> * gcc.target/i386/pr126403-2.c: Likewise.
> * gcc.target/i386/pr126403-3.c: Likewise.
> * gcc.target/i386/pr126403-4.c: Likewise.
> * gcc.target/i386/zext-sse-2.c: Updated.
>
> --
> H.J.

Reply via email to