diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -373,10 +373,6 @@ defm CLZ_ZPmZ : sve_int_un_pred_arit_1< 0b001, "clz", int_aarch64_sve_clz>; defm CNT_ZPmZ : sve_int_un_pred_arit_1< 0b010, "cnt", int_aarch64_sve_cnt>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_3_Op_Pat(CNT_ZPmZ_H)>; - } - defm CNOT_ZPmZ : sve_int_un_pred_arit_1< 0b011, "cnot", int_aarch64_sve_cnot>; defm NOT_ZPmZ : sve_int_un_pred_arit_1< 0b110, "not", int_aarch64_sve_not>; defm FABS_ZPmZ : sve_int_un_pred_arit_1_fp<0b100, "fabs", AArch64fabs_mt>; @@ -514,11 +510,6 @@ defm CPY_ZPmR : sve_int_perm_cpy_r<"cpy", AArch64dup_mt>; defm CPY_ZPmV : sve_int_perm_cpy_v<"cpy", AArch64dup_mt>; - let Predicates = [HasSVE, HasBF16] in { - def : Pat<(nxv8bf16 (AArch64dup_mt nxv8i1:$pg, bf16:$splat, nxv8bf16:$passthru)), - (CPY_ZPmV_H $passthru, $pg, $splat)>; - } - // Duplicate FP scalar into all vector elements def : Pat<(nxv8f16 (AArch64dup (f16 FPR16:$src))), (DUP_ZZI_H (INSERT_SUBREG (IMPLICIT_DEF), FPR16:$src, hsub), 0)>; @@ -532,10 +523,8 @@ (DUP_ZZI_S (INSERT_SUBREG (IMPLICIT_DEF), FPR32:$src, ssub), 0)>; def : Pat<(nxv2f64 (AArch64dup (f64 FPR64:$src))), (DUP_ZZI_D (INSERT_SUBREG (IMPLICIT_DEF), FPR64:$src, dsub), 0)>; - let Predicates = [HasSVE, HasBF16] in { - def : Pat<(nxv8bf16 (AArch64dup (bf16 FPR16:$src))), - (DUP_ZZI_H (INSERT_SUBREG (IMPLICIT_DEF), FPR16:$src, hsub), 0)>; - } + def : Pat<(nxv8bf16 (AArch64dup (bf16 FPR16:$src))), + (DUP_ZZI_H (INSERT_SUBREG (IMPLICIT_DEF), FPR16:$src, hsub), 0)>; // Duplicate +0.0 into all vector elements def : Pat<(nxv8f16 (AArch64dup (f16 fpimm0))), (DUP_ZI_H 0, 0)>; @@ -544,9 +533,7 @@ def : Pat<(nxv4f32 (AArch64dup (f32 fpimm0))), (DUP_ZI_S 0, 0)>; def : Pat<(nxv2f32 (AArch64dup (f32 fpimm0))), (DUP_ZI_S 0, 0)>; def : Pat<(nxv2f64 (AArch64dup (f64 fpimm0))), (DUP_ZI_D 0, 0)>; - let Predicates = [HasSVE, HasBF16] in { - def : Pat<(nxv8bf16 (AArch64dup (bf16 fpimm0))), (DUP_ZI_H 0, 0)>; - } + def : Pat<(nxv8bf16 (AArch64dup (bf16 fpimm0))), (DUP_ZI_H 0, 0)>; // Duplicate Int immediate into all vector elements def : Pat<(nxv16i8 (AArch64dup (i32 (SVE8BitLslImm i32:$a, i32:$b)))), @@ -579,20 +566,11 @@ defm SPLICE_ZPZ : sve_int_perm_splice<"splice", int_aarch64_sve_splice>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_3_Op_Pat; - def : SVE_3_Op_Pat; - } - defm COMPACT_ZPZ : sve_int_perm_compact<"compact", int_aarch64_sve_compact>; defm INSR_ZR : sve_int_perm_insrs<"insr", AArch64insr>; defm INSR_ZV : sve_int_perm_insrv<"insr", AArch64insr>; defm EXT_ZZI : sve_int_perm_extract_i<"ext", AArch64ext>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_2_Op_Pat; - } - defm RBIT_ZPmZ : sve_int_perm_rev_rbit<"rbit", int_aarch64_sve_rbit>; defm REVB_ZPmZ : sve_int_perm_rev_revb<"revb", int_aarch64_sve_revb, bswap>; defm REVH_ZPmZ : sve_int_perm_rev_revh<"revh", int_aarch64_sve_revh>; @@ -601,10 +579,6 @@ defm REV_PP : sve_int_perm_reverse_p<"rev", AArch64rev>; defm REV_ZZ : sve_int_perm_reverse_z<"rev", AArch64rev>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_1_Op_Pat; - } - defm SUNPKLO_ZZ : sve_int_perm_unpk<0b00, "sunpklo", AArch64sunpklo>; defm SUNPKHI_ZZ : sve_int_perm_unpk<0b01, "sunpkhi", AArch64sunpkhi>; defm UUNPKLO_ZZ : sve_int_perm_unpk<0b10, "uunpklo", AArch64uunpklo>; @@ -661,23 +635,11 @@ defm CLASTA_ZPZ : sve_int_perm_clast_zz<0, "clasta", int_aarch64_sve_clasta>; defm CLASTB_ZPZ : sve_int_perm_clast_zz<1, "clastb", int_aarch64_sve_clastb>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_3_Op_Pat; - def : SVE_3_Op_Pat; - def : SVE_3_Op_Pat; - def : SVE_3_Op_Pat; - } - defm LASTA_RPZ : sve_int_perm_last_r<0, "lasta", AArch64lasta>; defm LASTB_RPZ : sve_int_perm_last_r<1, "lastb", AArch64lastb>; defm LASTA_VPZ : sve_int_perm_last_v<0, "lasta", AArch64lasta>; defm LASTB_VPZ : sve_int_perm_last_v<1, "lastb", AArch64lastb>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - } - // continuous load with reg+immediate defm LD1B_IMM : sve_mem_cld_si<0b0000, "ld1b", Z_b, ZPR8>; defm LD1B_H_IMM : sve_mem_cld_si<0b0001, "ld1b", Z_h, ZPR16>; @@ -1144,10 +1106,6 @@ defm TBL_ZZZ : sve_int_perm_tbl<"tbl", AArch64tbl>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_2_Op_Pat; - } - defm ZIP1_ZZZ : sve_int_perm_bin_perm_zz<0b000, "zip1", AArch64zip1>; defm ZIP2_ZZZ : sve_int_perm_bin_perm_zz<0b001, "zip2", AArch64zip2>; defm UZP1_ZZZ : sve_int_perm_bin_perm_zz<0b010, "uzp1", AArch64uzp1>; @@ -1155,15 +1113,6 @@ defm TRN1_ZZZ : sve_int_perm_bin_perm_zz<0b100, "trn1", AArch64trn1>; defm TRN2_ZZZ : sve_int_perm_bin_perm_zz<0b101, "trn2", AArch64trn2>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - } - defm ZIP1_PPP : sve_int_perm_bin_perm_pp<0b000, "zip1", AArch64zip1>; defm ZIP2_PPP : sve_int_perm_bin_perm_pp<0b001, "zip2", AArch64zip2>; defm UZP1_PPP : sve_int_perm_bin_perm_pp<0b010, "uzp1", AArch64uzp1>; @@ -1187,21 +1136,9 @@ // Extract subvectors from FP SVE vectors def : Pat<(nxv2f16 (extract_subvector (nxv4f16 ZPR:$Zs), (i64 0))), - (UUNPKLO_ZZ_D ZPR:$Zs)>; + (UUNPKLO_ZZ_D ZPR:$Zs)>; def : Pat<(nxv2f16 (extract_subvector (nxv4f16 ZPR:$Zs), (i64 2))), - (UUNPKHI_ZZ_D ZPR:$Zs)>; - - let Predicates = [HasSVE, HasBF16] in { - def : Pat<(nxv2bf16 (extract_subvector (nxv4bf16 ZPR:$Zs), (i64 0))), - (UUNPKLO_ZZ_D ZPR:$Zs)>; - def : Pat<(nxv2bf16 (extract_subvector (nxv4bf16 ZPR:$Zs), (i64 2))), - (UUNPKHI_ZZ_D ZPR:$Zs)>; - def : Pat<(nxv4bf16 (extract_subvector (nxv8bf16 ZPR:$Zs), (i64 0))), - (UUNPKLO_ZZ_S ZPR:$Zs)>; - def : Pat<(nxv4bf16 (extract_subvector (nxv8bf16 ZPR:$Zs), (i64 4))), - (UUNPKHI_ZZ_S ZPR:$Zs)>; - } - + (UUNPKHI_ZZ_D ZPR:$Zs)>; def : Pat<(nxv4f16 (extract_subvector (nxv8f16 ZPR:$Zs), (i64 0))), (UUNPKLO_ZZ_S ZPR:$Zs)>; def : Pat<(nxv4f16 (extract_subvector (nxv8f16 ZPR:$Zs), (i64 4))), @@ -1211,6 +1148,15 @@ def : Pat<(nxv2f32 (extract_subvector (nxv4f32 ZPR:$Zs), (i64 2))), (UUNPKHI_ZZ_D ZPR:$Zs)>; + def : Pat<(nxv2bf16 (extract_subvector (nxv4bf16 ZPR:$Zs), (i64 0))), + (UUNPKLO_ZZ_D ZPR:$Zs)>; + def : Pat<(nxv2bf16 (extract_subvector (nxv4bf16 ZPR:$Zs), (i64 2))), + (UUNPKHI_ZZ_D ZPR:$Zs)>; + def : Pat<(nxv4bf16 (extract_subvector (nxv8bf16 ZPR:$Zs), (i64 0))), + (UUNPKLO_ZZ_S ZPR:$Zs)>; + def : Pat<(nxv4bf16 (extract_subvector (nxv8bf16 ZPR:$Zs), (i64 4))), + (UUNPKHI_ZZ_S ZPR:$Zs)>; + // Concatenate two predicates. def : Pat<(nxv4i1 (concat_vectors nxv2i1:$p1, nxv2i1:$p2)), (UZP1_PPP_S $p1, $p2)>; @@ -1739,15 +1685,7 @@ def : Pat<(nxv2f64 (bitconvert (nxv2i64 ZPR:$src))), (nxv2f64 ZPR:$src)>; def : Pat<(nxv2f64 (bitconvert (nxv8f16 ZPR:$src))), (nxv2f64 ZPR:$src)>; def : Pat<(nxv2f64 (bitconvert (nxv4f32 ZPR:$src))), (nxv2f64 ZPR:$src)>; - } - let Predicates = [IsLE, HasBF16, HasSVE] in { - def : Pat<(nxv2i64 (bitconvert (nxv8bf16 ZPR:$src))), (nxv2i64 ZPR:$src)>; - def : Pat<(nxv8bf16 (bitconvert (nxv2i64 ZPR:$src))), (nxv8bf16 ZPR:$src)>; - def : Pat<(nxv8bf16 (bitconvert (nxv8i16 ZPR:$src))), (nxv8bf16 ZPR:$src)>; - } - - let Predicates = [IsLE, HasSVE, HasBF16] in { def : Pat<(nxv8bf16 (bitconvert (nxv16i8 ZPR:$src))), (nxv8bf16 ZPR:$src)>; def : Pat<(nxv8bf16 (bitconvert (nxv8i16 ZPR:$src))), (nxv8bf16 ZPR:$src)>; def : Pat<(nxv8bf16 (bitconvert (nxv4i32 ZPR:$src))), (nxv8bf16 ZPR:$src)>; @@ -1784,10 +1722,8 @@ def : Pat<(nxv2i64 (reinterpret_cast (nxv2f16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; def : Pat<(nxv4i32 (reinterpret_cast (nxv4f32 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; def : Pat<(nxv4i32 (reinterpret_cast (nxv4f16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; - let Predicates = [HasSVE, HasBF16] in { - def : Pat<(nxv2i64 (reinterpret_cast (nxv2bf16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; - def : Pat<(nxv4i32 (reinterpret_cast (nxv4bf16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; - } + def : Pat<(nxv2i64 (reinterpret_cast (nxv2bf16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; + def : Pat<(nxv4i32 (reinterpret_cast (nxv4bf16 ZPR:$src))), (COPY_TO_REGCLASS ZPR:$src, ZPR)>; def : Pat<(nxv16i1 (and PPR:$Ps1, PPR:$Ps2)), (AND_PPzPP (PTRUE_B 31), PPR:$Ps1, PPR:$Ps2)>; @@ -1841,10 +1777,7 @@ defm : pred_load; defm : pred_load; defm : pred_load; - - let Predicates = [HasBF16, HasSVE] in { - defm : pred_load; - } + defm : pred_load; // 16-element contiguous loads defm : pred_load; @@ -1882,13 +1815,10 @@ defm : pred_store; // 8-element contiguous stores - defm : pred_store; - defm : pred_store; - defm : pred_store; - - let Predicates = [HasBF16, HasSVE] in { - defm : pred_store; - } + defm : pred_store; + defm : pred_store; + defm : pred_store; + defm : pred_store; // 16-element contiguous stores defm : pred_store; @@ -2050,10 +1980,7 @@ defm : ld1; defm : ld1; defm : ld1; - - let Predicates = [HasBF16, HasSVE] in { - defm : ld1; - } + defm : ld1; // 16-element contiguous loads defm : ld1; @@ -2093,10 +2020,7 @@ defm : ldnf1; defm : ldnf1; defm : ldnf1; - - let Predicates = [HasBF16, HasSVE] in { - defm : ldnf1; - } + defm : ldnf1; // 16-element contiguous non-faulting loads defm : ldnf1; @@ -2137,10 +2061,7 @@ defm : ldff1; defm : ldff1; defm : ldff1; - - let Predicates = [HasBF16, HasSVE] in { - defm : ldff1; - } + defm : ldff1; // 16-element contiguous first faulting loads defm : ldff1; @@ -2381,15 +2302,6 @@ defm TRN2_ZZZ_Q : sve_int_perm_bin_perm_128_zz<0b11, 1, "trn2", int_aarch64_sve_trn2q>; } -let Predicates = [HasSVE, HasMatMulFP64, HasBF16] in { - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; - def : SVE_2_Op_Pat; -} - let Predicates = [HasSVE2] in { // SVE2 integer multiply-add (indexed) defm MLA_ZZZI : sve2_int_mla_by_indexed_elem<0b01, 0b0, "mla", int_aarch64_sve_mla_lane>; @@ -2770,13 +2682,6 @@ defm TBL_ZZZZ : sve2_int_perm_tbl<"tbl", int_aarch64_sve_tbl2>; defm TBX_ZZZ : sve2_int_perm_tbx<"tbx", int_aarch64_sve_tbx>; - let Predicates = [HasSVE, HasBF16] in { - def : SVE_3_Op_Pat; - def : Pat<(nxv8bf16 (int_aarch64_sve_tbl2 nxv8bf16:$Op1, nxv8bf16:$Op2, nxv8i16:$Op3)), - (nxv8bf16 (TBL_ZZZZ_H (REG_SEQUENCE ZPR2, nxv8bf16:$Op1, zsub0, nxv8bf16:$Op2, zsub1), - nxv8i16:$Op3))>; - } - // SVE2 integer compare scalar count and limit defm WHILEGE_PWW : sve_int_while4_rr<0b000, "whilege", int_aarch64_sve_whilege>; defm WHILEGT_PWW : sve_int_while4_rr<0b001, "whilegt", int_aarch64_sve_whilegt>; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -1055,6 +1055,8 @@ def : SVE_2_Op_Pat(NAME # _H)>; def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _D)>; + + def : SVE_2_Op_Pat(NAME # _H)>; } multiclass sve2_int_perm_tbl { @@ -1097,6 +1099,11 @@ (nxv2f64 (!cast(NAME # _D) (REG_SEQUENCE ZPR2, nxv2f64:$Op1, zsub0, nxv2f64:$Op2, zsub1), nxv2i64:$Op3))>; + + def : Pat<(nxv8bf16 (op nxv8bf16:$Op1, nxv8bf16:$Op2, nxv8i16:$Op3)), + (nxv8bf16 (!cast(NAME # _H) (REG_SEQUENCE ZPR2, nxv8bf16:$Op1, zsub0, + nxv8bf16:$Op2, zsub1), + nxv8i16:$Op3))>; } class sve2_int_perm_tbx sz8_64, string asm, ZPRRegOp zprty> @@ -1132,6 +1139,8 @@ def : SVE_3_Op_Pat(NAME # _H)>; def : SVE_3_Op_Pat(NAME # _S)>; def : SVE_3_Op_Pat(NAME # _D)>; + + def : SVE_3_Op_Pat(NAME # _H)>; } class sve_int_perm_reverse_z sz8_64, string asm, ZPRRegOp zprty> @@ -1162,6 +1171,8 @@ def : SVE_1_Op_Pat(NAME # _H)>; def : SVE_1_Op_Pat(NAME # _S)>; def : SVE_1_Op_Pat(NAME # _D)>; + + def : SVE_1_Op_Pat(NAME # _H)>; } class sve_int_perm_reverse_p sz8_64, string asm, PPRRegOp pprty> @@ -1274,6 +1285,8 @@ def : SVE_2_Op_Pat(NAME # _H)>; def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _D)>; + + def : SVE_2_Op_Pat(NAME # _H)>; } //===----------------------------------------------------------------------===// @@ -1360,6 +1373,8 @@ def : SVE_3_Op_Pat(NAME # _D)>; def : SVE_3_Op_Pat(NAME # _D)>; + def : SVE_3_Op_Pat(NAME # _H)>; + def : InstAlias<"mov $Zd, $Pg/m, $Zn", (!cast(NAME # _B) ZPR8:$Zd, PPRAny:$Pg, ZPR8:$Zn, ZPR8:$Zd), 1>; def : InstAlias<"mov $Zd, $Pg/m, $Zn", @@ -2254,6 +2269,8 @@ def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _D)>; + + def : SVE_2_Op_Pat(NAME # _H)>; } //===----------------------------------------------------------------------===// @@ -3804,6 +3821,8 @@ def : SVE_3_Op_Pat(NAME # _H)>; def : SVE_3_Op_Pat(NAME # _S)>; def : SVE_3_Op_Pat(NAME # _D)>; + + def : SVE_3_Op_Pat(NAME # _H)>; } multiclass sve_int_un_pred_arit_1_fp opc, string asm, SDPatternOperator op> { @@ -5790,9 +5809,11 @@ def _S : sve_int_perm_clast_vz<0b10, ab, asm, ZPR32, FPR32>; def _D : sve_int_perm_clast_vz<0b11, ab, asm, ZPR64, FPR64>; - def : SVE_3_Op_Pat(NAME # _H)>; - def : SVE_3_Op_Pat(NAME # _S)>; - def : SVE_3_Op_Pat(NAME # _D)>; + def : SVE_3_Op_Pat(NAME # _H)>; + def : SVE_3_Op_Pat(NAME # _S)>; + def : SVE_3_Op_Pat(NAME # _D)>; + + def : SVE_3_Op_Pat(NAME # _H)>; } class sve_int_perm_clast_zz sz8_64, bit ab, string asm, @@ -5832,6 +5853,8 @@ def : SVE_3_Op_Pat(NAME # _H)>; def : SVE_3_Op_Pat(NAME # _S)>; def : SVE_3_Op_Pat(NAME # _D)>; + + def : SVE_3_Op_Pat(NAME # _H)>; } class sve_int_perm_last_r sz8_64, bit ab, string asm, @@ -5894,6 +5917,8 @@ def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _S)>; def : SVE_2_Op_Pat(NAME # _D)>; + + def : SVE_2_Op_Pat(NAME # _H)>; } class sve_int_perm_splice sz8_64, string asm, ZPRRegOp zprty> @@ -5930,6 +5955,8 @@ def : SVE_3_Op_Pat(NAME # _H)>; def : SVE_3_Op_Pat(NAME # _S)>; def : SVE_3_Op_Pat(NAME # _D)>; + + def : SVE_3_Op_Pat(NAME # _H)>; } class sve2_int_perm_splice_cons sz8_64, string asm, @@ -6103,7 +6130,6 @@ def : InstAlias<"mov $Zd, $Pg/m, $Vn", (!cast(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, FPR64:$Vn), 1>; - def : Pat<(nxv8f16 (op nxv8i1:$pg, f16:$splat, nxv8f16:$passthru)), (!cast(NAME # _H) $passthru, $pg, $splat)>; def : Pat<(nxv2f32 (op nxv2i1:$pg, f32:$splat, nxv2f32:$passthru)), @@ -6112,6 +6138,9 @@ (!cast(NAME # _S) $passthru, $pg, $splat)>; def : Pat<(nxv2f64 (op nxv2i1:$pg, f64:$splat, nxv2f64:$passthru)), (!cast(NAME # _D) $passthru, $pg, $splat)>; + + def : Pat<(nxv8bf16 (op nxv8i1:$pg, bf16:$splat, nxv8bf16:$passthru)), + (!cast(NAME # _H) $passthru, $pg, $splat)>; } class sve_int_perm_compact @@ -7905,6 +7934,7 @@ def : SVE_2_Op_Pat(NAME)>; def : SVE_2_Op_Pat(NAME)>; def : SVE_2_Op_Pat(NAME)>; + def : SVE_2_Op_Pat(NAME)>; } /// Addressing modes diff --git a/llvm/test/CodeGen/AArch64/sve2-intrinsics-perm-tb.ll b/llvm/test/CodeGen/AArch64/sve2-intrinsics-perm-tb.ll --- a/llvm/test/CodeGen/AArch64/sve2-intrinsics-perm-tb.ll +++ b/llvm/test/CodeGen/AArch64/sve2-intrinsics-perm-tb.ll @@ -68,6 +68,18 @@ ret %out } +define @tbl2_bf16( %a, %unused, + %b, %c) #0 { +; CHECK-LABEL: tbl2_bf16: +; CHECK: mov z1.d, z0.d +; CHECK-NEXT: tbl z0.h, { z1.h, z2.h }, z3.h +; CHECK-NEXT: ret + %out = call @llvm.aarch64.sve.tbl2.nxv8bf16( %a, + %b, + %c) + ret %out +} + define @tbl2_fs( %a, %unused, %b, %c) { ; CHECK-LABEL: tbl2_fs: @@ -185,6 +197,8 @@ declare @llvm.aarch64.sve.tbl2.nxv4f32(, , ) declare @llvm.aarch64.sve.tbl2.nxv2f64(, , ) +declare @llvm.aarch64.sve.tbl2.nxv8bf16(, , ) + declare @llvm.aarch64.sve.tbx.nxv16i8(, , ) declare @llvm.aarch64.sve.tbx.nxv8i16(, , ) declare @llvm.aarch64.sve.tbx.nxv4i32(, , )