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.

Reply via email to