> From: Dipesh Sharma <[email protected]>
> Sent: Monday, July 20, 2026 2:25 AM
>
> diff --git a/gcc/config/i386/avx10v2auxintrin.h
> b/gcc/config/i386/avx10v2auxintrin.h
> index a862f3173eb..bc004a24dfb 100644
> --- a/gcc/config/i386/avx10v2auxintrin.h
> +++ b/gcc/config/i386/avx10v2auxintrin.h
> @@ -1195,6 +1195,187 @@ _mm512_maskz_cvthf8_ps (__mmask16 __U,
> __m128i __A)
> (__mmask16) __U);
> }
>
> +// VCVTBF82BF4S
> +
> +extern __inline __m128i
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtbf8_bf4s (__m128i __A)
The intrin name is not following the naming convention, should be
_mm_cvts_bf8_bf4, similar for all the occurrences in this patch.
> +{
> + return (__m128i) __builtin_ia32_vcvtbf82bf4s128 ((__v16qi) __A);
> +}
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtbf8_bf4s_storeu (void * __P, __m128i __A)
> +{
> + __builtin_ia32_vcvtbf82bf4s128mem ((__v8qi *) __P, (__v16qi) __A);
> +}
We don't need these storeu intrin, vpmovssdb is a kind of move, that is
why we need them.
> diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
> index 1583c59db3b..dd6393cabf9 100644
> --- a/gcc/config/i386/sse.md
> +++ b/gcc/config/i386/sse.md
> @@ -34380,3 +34383,86 @@
> "TARGET_AVX10V2AUX"
>
> "vcvt<convertfp82ps>\t{%1, %0<mask_operand2>|%0<mask_operand2>,%<i
> ptrssebvec_3>1}"
> [(set_attr "prefix" "evex")])
> +
> +;; FP8 to FP4 converts (VCVTBF82BF4S, VCVTHF82BF4S) - no masking
> +
> +(define_int_iterator UNSPEC_CONVERTFP82BF4
> + [UNSPEC_VCVTBF82BF4S UNSPEC_VCVTHF82BF4S])
> +
> +(define_int_attr convertfp82bf4
> + [(UNSPEC_VCVTBF82BF4S "bf82bf4s")
> + (UNSPEC_VCVTHF82BF4S "hf82bf4s")])
please add "s" to iterator to explicit mention its saturate.
> +
> +(define_mode_iterator FP82FP4_PART [V32QI V64QI])
> +
> +(define_mode_attr fp82fp4_dest
> + [(V32QI "V16QI") (V64QI "V32QI")])
VI1_AVX512_3264 and <ssehalfvecmode> is doing the same job.
Please first check if there is existing iterator instead of adding
new ones.
> +(define_expand "vcvt<convertfp82bf4>v16qi"
> + [(set (match_operand:V16QI 0 "register_operand")
> + (vec_concat:V16QI
> + (unspec:V8QI
> + [(match_operand:V16QI 1 "register_operand")]
> + UNSPEC_CONVERTFP82BF4)
> + (match_dup 2)))]
> + "TARGET_AVX10V2AUX"
> + "operands[2] = CONST0_RTX (V8QImode);")
> +
> +(define_insn "*vcvt<convertfp82bf4>v16qi"
> + [(set (match_operand:V16QI 0 "register_operand" "=v")
> + (vec_concat:V16QI
> + (unspec:V8QI
> + [(match_operand:V16QI 1 "register_operand" "v")]
> + UNSPEC_CONVERTFP82BF4)
> + (match_operand:V8QI 2 "const0_operand")))]
> + "TARGET_AVX10V2AUX"
> + "vcvt<convertfp82bf4>\t{%1, %0|%0, %1}"
> + [(set_attr "prefix" "evex")
> + (set_attr "mode" "TI")])
> +
> +(define_insn "vcvt<convertfp82bf4><mode>"
> + [(set (match_operand:<fp82fp4_dest> 0 "register_operand" "=v")
> + (unspec:<fp82fp4_dest>
> + [(match_operand:FP82FP4_PART 1 "register_operand" "v")]
> + UNSPEC_CONVERTFP82BF4))]
> + "TARGET_AVX10V2AUX"
> + "vcvt<convertfp82bf4>\t{%1, %0|%0, %1}"
> + [(set_attr "prefix" "evex")
> + (set_attr "mode" "<sseinsnmode>")])
You need to use similar treatment to memory after eliminating not
needed memory pattern.
> +
> +;; FP4 to FP8 converts (VCVTBF42HF8) with masking
> +
> +(define_mode_iterator FP42FP8_MODE [V16QI V32QI V64QI])
> +
> +(define_mode_attr fp82fp4_src
> + [(V16QI "V16QI") (V32QI "V16QI") (V64QI "V32QI")])
> +
Similar as the previous patch, you could use VI1_AVX512VL and
V16QI.
> +(define_mode_attr iptr_fp42fp8
> + [(V16QI "q") (V32QI "") (V64QI "")])
> +
> +(define_insn "vcvtbf42hf8<mode><mask_name>"
> + [(set (match_operand:FP42FP8_MODE 0 "register_operand" "=v")
> + (unspec:FP42FP8_MODE
> + [(match_operand:<fp82fp4_src> 1 "nonimmediate_operand" "vm")]
> + UNSPEC_VCVTBF42HF8))]
> + "TARGET_AVX10V2AUX"
> +
> "vcvtbf42hf8\t{%1, %0<mask_operand2>|%0<mask_operand2>, %<iptr_fp4
> 2fp8>1}"
> + [(set_attr "prefix" "evex")
> + (set_attr "mode" "<sseinsnmode>")])
Thx,
Haochen