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