https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126160
Bug ID: 126160
Summary: [x86] missed vectorization for __builtin_lrintf
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: liuhongt at gcc dot gnu.org
Target Milestone: ---
#include <cmath>
static inline unsigned short CastValue(float x) {
if (x < 0.0f) x = 0.0f;
if (x > 65535.0f) x = 65535.0f;
return (unsigned short)__builtin_lrintf(x);
}
void kern(const float * __restrict in, unsigned short * __restrict out, long n,
float scale)
{
for (long pxl = 0; pxl < n; ++pxl) {
out[0] = CastValue(in[0] * scale);
out[1] = CastValue(in[1] * scale);
out[2] = CastValue(in[2] * scale)
out[3] = CastValue(in[3] * scale);
in += 4; out += 4;
}
}
options: gcc -Ofast -march=graniterapids
It failed in ix86_builtin_vectorized_function, it only support vcvtpd2dq, but
not vcvtps2qq.
CASE_CFN_IRINT:
CASE_CFN_LRINT:
if (out_mode == SImode && in_mode == DFmode)
{
if (out_n == 4 && in_n == 2)
return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX);
else if (out_n == 8 && in_n == 4)
return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX256);
else if (out_n == 16 && in_n == 8)
return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX512);
}
break;
And we doesn't define lrintvNsfvNdi.