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
