On Mon, Aug 31, 2026 at 7:37 AM H.J. Lu <[email protected]> wrote:
>
> Double unaligned load store cost for V2QImode and V2HImode when SSE is
> enabled and SSE4.1, which improved support for QImode and HImode, is
> disabled to avoid using inefficient SSE2 instructions to access vector
> elements in V2QImode and V2HImode so that for
>
> extern char *var1;
> extern int var2;
>
> void
> func (void)
> {
>   var2 = var1[1] + var1[0];
> }
>
> we generate
>
> movq var1(%rip), %rdx
> movsbl 1(%rdx), %eax
> movsbl (%rdx), %edx
> addl %edx, %eax
> movl %eax, var2(%rip)
>
> instead of
>
> movq var1(%rip), %rax
> pxor %xmm1, %xmm1
> pinsrw $0, (%rax), %xmm0
> pcmpgtb %xmm0, %xmm1
> punpcklbw %xmm1, %xmm0
> movdqa %xmm0, %xmm1
> psraw $15, %xmm1
> punpcklwd %xmm1, %xmm0
> movd %xmm0, %edx
> pshufd $0xe5, %xmm0, %xmm2
> movd %xmm2, %eax
> addl %edx, %eax
> movl %eax, var2(%rip)
>
> with -O2 -march=x86-64.  With SSE4.1 enabled, we generate
>
> movq var1(%rip), %rax
> pinsrw $0, (%rax), %xmm0
> pmovsxbd %xmm0, %xmm0
> movd %xmm0, %edx
> pextrd $1, %xmm0, %eax
> addl %edx, %eax
> movl %eax, var2(%rip)
>
> Compile PR 125100 tests with -mno-sse since unaligned V2QImode load is no
> longer generated when SSE is enabled without SSE4.1.
It's more like we should adjust cost of {sign,zero}_extend for
vNqi/vNhi->vNsi, vNqi->vNhi since pmovsx/pvmozx are only available
under sse4.1, w/o sse4.1 it takes several instructions.
It's not related to V2QI/V2HI unaligned_load.

>
> gcc/
>
> PR target/126802
> * config/i386/i386.cc (sse_adjust_unaligned_load_cost): New.
> (ix86_default_vector_cost): Call sse_adjust_unaligned_load_cost
> for unaligned load to adjust unaligned load cost.
>
> testsuite/
>
> PR target/126802
> * gcc.target/i386/pr125100-1.c: Add -mno-sse.
> * gcc.target/i386/pr125100-2.c: Likewise.
> * gcc.target/i386/pr125100-3.c: Likewise.
> * gcc.target/i386/pr126802-1a.c: New test.
> * gcc.target/i386/pr126802-1b.c: Likewise.
> * gcc.target/i386/pr126802-1c.c: Likewise.
> * gcc.target/i386/pr126802-2a.c: Likewise.
> * gcc.target/i386/pr126802-2b.c: Likewise.
> * gcc.target/i386/pr126802-2c.c: Likewise.
> * gcc.target/i386/pr126802-3a.c: Likewise.
> * gcc.target/i386/pr126802-3b.c: Likewise.
> * gcc.target/i386/pr126802-3c.c: Likewise.
> * gcc.target/i386/pr126802-4a.c: Likewise.
> * gcc.target/i386/pr126802-4b.c: Likewise.
> * gcc.target/i386/pr126802-4c.c: Likewise.
> --
> H.J.



-- 
BR,
Hongtao

Reply via email to