╭ amxtf32intrin.h ──────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
.. llvm_libc_wrappers/ openmp_wrappers/ ppc_wrappers/ __clang_spirv_builtins.h __float_float.h __float_header_macro.h __float_infinity_nan.h __stdarg___gnuc_va_list.h __stdarg___va_copy.h __stdarg_header_macro.h __stdarg_va_arg.h __stdarg_va_copy.h __stdarg_va_list.h __stddef_header_macro.h __stddef_max_align_t.h __stddef_null.h __stddef_nullptr_t.h __stddef_offsetof.h __stddef_ptrdiff_t.h __stddef_rsize_t.h __stddef_size_t.h __stddef_unreachable.h __stddef_wchar_t.h __stddef_wint_t.h __wmmintrin_aes.h __wmmintrin_pclmul.h adcintrin.h adxintrin.h altivec.h ammintrin.h amo.h amxavx512intrin.h amxcomplexintrin.h amxfp16intrin.h amxfp8intrin.h amxintrin.h amxmovrsintrin.h ╭─────────────────────────────────╮ │amxtf32intrin.h │ ╰─────────────────────────────────╯ andes_vector.h arm64intr.h arm_acle.h arm_bf16.h arm_cde.h arm_cmse.h arm_fp16.h arm_mve.h arm_neon.h arm_neon_sve_bridge.h arm_sme.h arm_sve.h arm_vector_types.h armintr.h avx10_2_512bf16intrin.h avx10_2_512convertintrin.h avx10_2_512minmaxintrin.h avx10_2_512niintrin.h avx10_2_512satcvtdsintrin.h avx10_2_512satcvtintrin.h avx10_2bf16intrin.h avx10_2convertintrin.h avx10_2copyintrin.h avx10_2minmaxintrin.h avx10_2niintrin.h avx10_2satcvtdsintrin.h avx10_2satcvtintrin.h avx2intrin.h avx512bf16intrin.h avx512bitalgintrin.h avx512bwintrin.h avx512cdintrin.h avx512dqintrin.h avx512fintrin.h avx512fp16intrin.h avx512ifmaintrin.h avx512ifmavlintrin.h avx512vbmi2intrin.h avx512vbmiintrin.h avx512vbmivlintrin.h avx512vlbf16intrin.h avx512vlbitalgintrin.h avx512vlbwintrin.h avx512vlcdintrin.h avx512vldqintrin.h avx512vlfp16intrin.h avx512vlintrin.h avx512vlvbmi2intrin.h avx512vlvnniintrin.h avx512vlvp2intersectintrin.h avx512vnniintrin.h avx512vp2intersectintrin.h avx512vpopcntdqintrin.h avx512vpopcntdqvlintrin.h avxifmaintrin.h avxintrin.h avxneconvertintrin.h avxvnniint16intrin.h avxvnniint8intrin.h avxvnniintrin.h bmi2intrin.h bmiintrin.h builtins.h cet.h cetintrin.h cldemoteintrin.h clflushoptintrin.h clwbintrin.h clzerointrin.h cmpccxaddintrin.h cpuid.h crc32intrin.h emmintrin.h enqcmdintrin.h f16cintrin.h float.h fma4intrin.h fmaintrin.h fxsrintrin.h gfniintrin.h hexagon_circ_brev_intrinsics.h hexagon_protos.h hexagon_types.h hresetintrin.h htmintrin.h htmxlintrin.h hvx_hexagon_protos.h ia32intrin.h immintrin.h intrin.h intrin0.h inttypes.h invpcidintrin.h iso646.h keylockerintrin.h larchintrin.h lasxintrin.h limits.h lsxintrin.h lwpintrin.h lzcntintrin.h mm3dnow.h mm_malloc.h mmintrin.h module.modulemap movdirintrin.h movrs_avx10_2_512intrin.h movrs_avx10_2intrin.h movrsintrin.h msa.h mwaitxintrin.h nmmintrin.h pconfigintrin.h pkuintrin.h pmmintrin.h popcntintrin.h prfchiintrin.h prfchwintrin.h ptrauth.h ptwriteintrin.h raointintrin.h rdpruintrin.h rdseedintrin.h riscv_bitmanip.h riscv_corev_alu.h riscv_crypto.h riscv_mips.h riscv_nds.h riscv_ntlh.h riscv_vector.h rtmintrin.h s390intrin.h serializeintrin.h sgxintrin.h sha512intrin.h shaintrin.h sifive_vector.h sm3intrin.h sm4evexintrin.h sm4intrin.h smmintrin.h spirvintrin.h stdalign.h stdarg.h stdatomic.h stdbool.h stdckdint.h stdcountof.h stddef.h stddefer.h stdint.h stdnoreturn.h tbmintrin.h tgmath.h tmmintrin.h tsxldtrkintrin.h uintrintrin.h unwind.h usermsrintrin.h vadefs.h vaesintrin.h varargs.h vecintrin.h velintrin.h velintrin_approx.h velintrin_gen.h vpclmulqdqintrin.h waitpkgintrin.h wasm_simd128.h wbnoinvdintrin.h wmmintrin.h x86gprintrin.h x86intrin.h xmmintrin.h xopintrin.h xsavecintrin.h xsaveintrin.h xsaveoptintrin.h xsavesintrin.h xtestintrin.h yvals_core.h
1 /*===------------- amxtf32intrin.h - AMX_TF32 intrinsics -*- C++ -*---------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===------------------------------------------------------------------------=== 8 */ 9 10 #ifndef __IMMINTRIN_H 11 #error "Never use <amxtf32intrin.h> directly; include <immintrin.h> instead." 12 #endif // __IMMINTRIN_H 13 14 #ifndef __AMX_TF32INTRIN_H 15 #define __AMX_TF32INTRIN_H 16 #ifdef __x86_64__ 17 18 #define __DEFAULT_FN_ATTRS_TF32 \ 19 __attribute__((__always_inline__, __nodebug__, __target__("amx-tf32"))) 20 21 /// Do Matrix Multiplication of \a a and \a b, and then do Matrix Plus 22 /// with \a srcdst. 23 /// All the calculation is base on float32 but with the lower 13-bit set to 0. 24 /// 25 /// \headerfile <immintrin.h> 26 /// 27 /// \code 28 /// void _tile_mmultf32ps(constexpr int srcdst, constexpr int a, \ 29 /// constexpr int b); 30 /// \endcode 31 /// 32 /// This intrinsic corresponds to the <c> TMMULTF32PS </c> instruction. 33 /// 34 /// \param srcdst 35 /// The destination tile. Max size is 1024 Bytes. 36 /// \param a 37 /// The 1st source tile. Max size is 1024 Bytes. 38 /// \param b 39 /// The 2nd source tile. Max size is 1024 Bytes. 40 /// 41 /// \code{.operation} 42 /// DEFINE zero_lower_mantissa_bits_fp32(x[31:0]) { 43 /// dword[12:0] := 0 44 /// dword[31:13] := x[31:13] 45 /// return dword 46 /// } 47 /// 48 /// DEFINE silence_snan_fp32(x[31:0]) { 49 /// IF (x.exponent == 255 and x.fraction != 0 and x.fraction[22] == 0) 50 /// x.fraction[22] := 1 51 /// return x 52 /// } 53 /// 54 /// elements_a := a.colsb / 4 55 /// elements_dest := srcdst.colsb / 4 56 /// 57 /// FOR m = 0 TO (srcdst.rows-1) 58 /// tmp[511:0] := 0 59 /// FOR k = 0 TO (elements_a-1) 60 /// FOR n = 0 TO (elements_dest-1) 61 /// af := silence_snan_fp32(a.row[m].fp32[k]) 62 /// bf := silence_snan_fp32(b.row[k].fp32[n]) 63 /// tmp.fp32[n] += zero_lower_mantissa_bits_fp32(af) 64 /// * zero_lower_mantissa_bits_fp32(bf) 65 /// ENDFOR 66 /// ENDFOR 67 /// 68 /// FOR n = 0 TO (elements_dest-1) 69 /// tmp.fp32[n] += srcdst.row[m].fp32[n] 70 /// ENDFOR 71 /// write_row_and_zero(srcdst, m, tmp, srcdst.colsb) 72 /// 73 /// ENDFOR 74 /// 75 /// zero_upper_rows(srcdst, srcdst.rows) 76 /// zero_tileconfig_start() 77 /// \endcode 78 #define _tile_mmultf32ps(srcdst, a, b) \ 79 __builtin_ia32_tmmultf32ps((srcdst), (a), (b)) 80 81 static __inline__ _tile1024i __DEFAULT_FN_ATTRS_TF32 82 _tile_mmultf32ps_internal(unsigned short m, unsigned short n, unsigned short k, 83 _tile1024i dst, _tile1024i src1, _tile1024i src2) { 84 return __builtin_ia32_tmmultf32ps_internal(m, n, k, dst, src1, src2); 85 } 86 87 /// Do Matrix Multiplication of src0 and src1, and then do Matrix Plus with dst. 88 /// All the calculation is base on float32 but with the lower 13-bit set to 0. 89 /// 90 /// \headerfile <immintrin.h> 91 /// 92 /// This intrinsic corresponds to the <c> TMMULTF32PS </c> instruction. 93 /// 94 /// \param dst 95 /// The destination tile. Max size is 1024 Bytes. 96 /// \param src0 97 /// The 1st source tile. Max size is 1024 Bytes. 98 /// \param src1 99 /// The 2nd source tile. Max size is 1024 Bytes. 100 __DEFAULT_FN_ATTRS_TF32 101 static void __tile_mmultf32ps(__tile1024i *dst, __tile1024i src0, 102 __tile1024i src1) { 103 dst->tile = _tile_mmultf32ps_internal(src0.row, src1.col, src0.col, dst->tile, 104 src0.tile, src1.tile); 105 } 106 107 #endif // __x86_64__ 108 #endif // __AMX_TF32INTRIN_H 109