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. .
