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

            Bug ID: 125270
           Summary: z13: Inefficient emulation for vec_abs on vector
                    signed __int128
           Product: gcc
           Version: 15.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jens.seifert at de dot ibm.com
  Target Milestone: ---

#include <vecintrin.h>

vector signed __int128 abs(vector signed __int128 in)
{
    return vec_abs(in);
}

gcc creates for z13 (and < z17):
abs(__int128 __vector(1)):
        vzero   %v2
        vchlg   %v4,%v2,%v24
        vceqg   %v0,%v2,%v24
        vpdi    %v6,%v4,%v4,4
        vchg    %v3,%v2,%v24
        vn      %v1,%v0,%v6
        vo      %v5,%v3,%v1
        vrepg   %v7,%v5,0
        vsq     %v16,%v2,%v24
        vsel    %v24,%v16,%v24,%v7
        br      %r14

Optimal code for z13 would look like this:

vector signed __int128 abs_z13(vector signed __int128 in)
{
    vector signed char v8 = vec_splat(((vector signed char)in) >> 7,0);
    vector signed __int128 vsign = (vector signed __int128)v8;
    return (in ^ vsign) - vsign;
}

abs_z13(__int128 __vector(1)):
        vesrab  %v0,%v24,7
        vrepb   %v2,%v0,0
        vx      %v24,%v24,%v2
        vsq     %v24,%v24,%v2
        br      %r14

Reply via email to