[Bug target/95524] Subtimal codegen for shift by constant for v16qi/v32qi under -march=skylake

crazylht at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Jun 15 13:16:02 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95524

--- Comment #3 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Hongtao.liu from comment #0)

> icc has
> ---
> ashift(char __vector(16)):
>         vpsllw    xmm1, xmm0, 5                                 #9.16
>         vpand     xmm0, xmm1, XMMWORD PTR .L_2il0floatpacket.0[rip] #9.16
>         ret                                                     #9.16
> ashift2(char __vector(32), char __vector(32)):
>         vpsllw    ymm2, ymm0, 5                                 #15.16
>         vpand     ymm0, ymm2, YMMWORD PTR .L_2il0floatpacket.1[rip] #15.16
>         ret                                                     #15.16
> ashiftrt(char __vector(16)):
>         vpsrlw    xmm1, xmm0, 5                                 #21.16
>         vpand     xmm0, xmm1, XMMWORD PTR .L_2il0floatpacket.2[rip] #21.16
>         ret                                                     #21.16
> arshiftrt2(char __vector(32)):
>         vpsrlw    ymm1, ymm0, 5                                 #27.16
>         vpand     ymm0, ymm1, YMMWORD PTR .L_2il0floatpacket.3[rip] #27.16
>         ret                                                     #27.16
>         .long  
> 

ICC seems to generate inaccurate instructions for ashiftrt, but clang is right,
still better than gcc, refer to https://godbolt.org/z/ttV5xY


More information about the Gcc-bugs mailing list