[Bug target/106598] New: s390: Inefficient branchless conditionals for int
jens.seifert at de dot ibm.com
gcc-bugzilla@gcc.gnu.org
Fri Aug 12 15:38:34 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106598
Bug ID: 106598
Summary: s390: Inefficient branchless conditionals for int
Product: gcc
Version: 11.2.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: ---
int lt(int a, int b)
{
return a < b;
}
generates:
cr %r2,%r3
lhi %r1,1
lhi %r2,0
locrnl %r1,%r2
lgfr %r2,%r1
br %r14
int ltOpt(int a, int b)
{
long long x = a;
long long y = b;
return ((unsigned long long)(x - y)) >> 63;
}
better:
sgr %r2,%r3
srlg %r2,%r2,63
br %r14
int ltMask(int a, int b)
{
return -(a < b);
}
generates:
cr %r2,%r3
lhi %r1,1
lhi %r2,0
locrnl %r1,%r2
sllg %r1,%r1,63
srag %r2,%r1,63
int ltMaskOpt(int a, int b)
{
long long x = a;
long long y = b;
return (x - y) >> 63;
}
better:
sgr %r2,%r3
srag %r2,%r2,63
br %r14
int leMask(int a, int b)
{
return -(a <= b);
}
generates:
cr %r2,%r3
lhi %r1,1
lhi %r2,0
locrnle %r1,%r2
sllg %r1,%r1,63
srag %r2,%r1,63
br %r14
int leMaskOpt(int a, int b)
{
int c;
__asm__("cr %1,%2\n\tslbgr %0,%0":"=r"(c):"r"(a),"r"(b):"cc");
// slbgr create a 64-bit mask => lgfr would not be required
return c;
}
better:
cr %r2,%r3
slbgr %r2,%r2
lgfr %r2,%r2 <= not necessary
br %r14
int le(int a, int b)
{
return a <= b;
}
generates:
cr %r2,%r3
lhi %r1,1
lhi %r2,0
locrnle %r1,%r2
lgfr %r2,%r1
br %r14
int leOpt(int a, int b)
{
unsigned long long c;
__asm__("cr %1,%2\n\tslbgr %0,%0":"=r"(c):"r"(a),"r"(b):"cc");
return (c >> 63);
}
better:
cr %r2,%r3
slbgr %r2,%r2
srlg %r2,%r2,63
br %r14
More information about the Gcc-bugs
mailing list