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

--- Comment #14 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
https://compiler-explorer.com/z/e1zeofG9T

test_v8hf_round:

   2 = (double) _1;
  _3 = __builtin_round (_2);
  _4 = (_Float16) _3;
  _5 = BIT_FIELD_REF <x_65(D), 16, 16>;
  _6 = (double) _5;
  _7 = __builtin_round (_6);
  _8 = (_Float16) _7;
  _9 = BIT_FIELD_REF <x_65(D), 16, 32>;
  _10 = (double) _9;
  _11 = __builtin_round (_10);
  _12 = (_Float16) _11;
  _13 = BIT_FIELD_REF <x_65(D), 16, 48>;
  _14 = (double) _13;
  _15 = __builtin_round (_14);
  _16 = (_Float16) _15;
  _17 = BIT_FIELD_REF <x_65(D), 16, 64>;
  _18 = (double) _17;
  _19 = __builtin_round (_18);
  _20 = (_Float16) _19;
  _21 = BIT_FIELD_REF <x_65(D), 16, 80>;
  _22 = (double) _21;
  _23 = __builtin_round (_22);
  _24 = (_Float16) _23;
  _25 = BIT_FIELD_REF <x_65(D), 16, 96>;
  _26 = (double) _25;
  _27 = __builtin_round (_26);
  _28 = (_Float16) _27;
  _29 = BIT_FIELD_REF <x_65(D), 16, 112>;
  _30 = (double) _29;
  _31 = __builtin_round (_30);
  _32 = (_Float16) _31;
  _33 = BIT_FIELD_REF <x_65(D), 16, 128>;
  _34 = (double) _33;
  _35 = __builtin_round (_34);
  _36 = (_Float16) _35;
  _37 = BIT_FIELD_REF <x_65(D), 16, 144>;
  _38 = (double) _37;
  _39 = __builtin_round (_38);
  _40 = (_Float16) _39;
  _41 = BIT_FIELD_REF <x_65(D), 16, 160>;
  _42 = (double) _41;
  _43 = __builtin_round (_42);
  _44 = (_Float16) _43;
  _45 = BIT_FIELD_REF <x_65(D), 16, 176>;
  _46 = (double) _45;
  _47 = __builtin_round (_46);
  _48 = (_Float16) _47;
  _49 = BIT_FIELD_REF <x_65(D), 16, 192>;

Why
   _46 = (double) _45;
  _47 = __builtin_round (_46);
  _48 = (_Float16) _47;

is not transformed to .ROUND? It's because the backend doesn't has any
round<mode>2 for HF/SF/DF, and it's the same reason that why we generate an
additional jmp for test_v16sf_round.

float __vector(16) round<float __vector(16)>(float __vector(16))":
        vbroadcastss    zmm2, DWORD PTR .LC5[rip]
        vmovaps zmm1, zmm0
        vpternlogd      zmm1, zmm2, DWORD PTR .LC7[rip]{1to16}, 236
        vaddps  zmm0, zmm0, zmm1
        vrndscaleps     zmm0, zmm0, 3
        ret
"test_v16sf_round(float __vector(16))":
        jmp     "float __vector(16) round<float __vector(16)>(float
__vector(16))"


So besides adjust the condition of vector patterns to align with scalar ones,
we may need to support round{hf,sf,df}2 to solve the upper issue.
   .

Reply via email to