631 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=amdgcn -mcpu=gfx1250 < %s | FileCheck -check-prefix=GFX1250 %s3 4define float @v_mad_mix_f32_bf16lo_bf16lo_bf16lo(bfloat %src0, bfloat %src1, bfloat %src2) #0 {5; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_bf16lo:6; GFX1250: ; %bb.0:7; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x08; GFX1250-NEXT: s_wait_kmcnt 0x09; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,1]10; GFX1250-NEXT: s_set_pc_i64 s[30:31]11 %src0.ext = fpext bfloat %src0 to float12 %src1.ext = fpext bfloat %src1 to float13 %src2.ext = fpext bfloat %src2 to float14 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)15 ret float %result16}17 18define float @v_mad_mix_f32_bf16hi_bf16hi_bf16hi_int(i32 %src0, i32 %src1, i32 %src2) #0 {19; GFX1250-LABEL: v_mad_mix_f32_bf16hi_bf16hi_bf16hi_int:20; GFX1250: ; %bb.0:21; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x022; GFX1250-NEXT: s_wait_kmcnt 0x023; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel:[1,1,1] op_sel_hi:[1,1,1]24; GFX1250-NEXT: s_set_pc_i64 s[30:31]25 %src0.hi = lshr i32 %src0, 1626 %src1.hi = lshr i32 %src1, 1627 %src2.hi = lshr i32 %src2, 1628 %src0.i16 = trunc i32 %src0.hi to i1629 %src1.i16 = trunc i32 %src1.hi to i1630 %src2.i16 = trunc i32 %src2.hi to i1631 %src0.fp16 = bitcast i16 %src0.i16 to bfloat32 %src1.fp16 = bitcast i16 %src1.i16 to bfloat33 %src2.fp16 = bitcast i16 %src2.i16 to bfloat34 %src0.ext = fpext bfloat %src0.fp16 to float35 %src1.ext = fpext bfloat %src1.fp16 to float36 %src2.ext = fpext bfloat %src2.fp16 to float37 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)38 ret float %result39}40 41define float @v_mad_mix_f32_bf16hi_bf16hi_bf16hi_elt(<2 x bfloat> %src0, <2 x bfloat> %src1, <2 x bfloat> %src2) #0 {42; GFX1250-LABEL: v_mad_mix_f32_bf16hi_bf16hi_bf16hi_elt:43; GFX1250: ; %bb.0:44; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x045; GFX1250-NEXT: s_wait_kmcnt 0x046; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel:[1,1,1] op_sel_hi:[1,1,1]47; GFX1250-NEXT: s_set_pc_i64 s[30:31]48 %src0.hi = extractelement <2 x bfloat> %src0, i32 149 %src1.hi = extractelement <2 x bfloat> %src1, i32 150 %src2.hi = extractelement <2 x bfloat> %src2, i32 151 %src0.ext = fpext bfloat %src0.hi to float52 %src1.ext = fpext bfloat %src1.hi to float53 %src2.ext = fpext bfloat %src2.hi to float54 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)55 ret float %result56}57 58define <2 x float> @v_mad_mix_v2f32(<2 x bfloat> %src0, <2 x bfloat> %src1, <2 x bfloat> %src2) #0 {59; GFX1250-LABEL: v_mad_mix_v2f32:60; GFX1250: ; %bb.0:61; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x062; GFX1250-NEXT: s_wait_kmcnt 0x063; GFX1250-NEXT: v_and_b32_e32 v5, 0xffff0000, v064; GFX1250-NEXT: v_dual_lshlrev_b32 v4, 16, v0 :: v_dual_lshlrev_b32 v6, 16, v165; GFX1250-NEXT: v_and_b32_e32 v7, 0xffff0000, v166; GFX1250-NEXT: v_and_b32_e32 v1, 0xffff0000, v267; GFX1250-NEXT: v_lshlrev_b32_e32 v0, 16, v268; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)69; GFX1250-NEXT: v_pk_fma_f32 v[0:1], v[4:5], v[6:7], v[0:1]70; GFX1250-NEXT: s_set_pc_i64 s[30:31]71 %src0.ext = fpext <2 x bfloat> %src0 to <2 x float>72 %src1.ext = fpext <2 x bfloat> %src1 to <2 x float>73 %src2.ext = fpext <2 x bfloat> %src2 to <2 x float>74 %result = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %src0.ext, <2 x float> %src1.ext, <2 x float> %src2.ext)75 ret <2 x float> %result76}77 78define <2 x float> @v_mad_mix_v2f32_shuffle(<2 x bfloat> %src0, <2 x bfloat> %src1, <2 x bfloat> %src2) #0 {79; GFX1250-LABEL: v_mad_mix_v2f32_shuffle:80; GFX1250: ; %bb.0:81; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x082; GFX1250-NEXT: s_wait_kmcnt 0x083; GFX1250-NEXT: v_dual_lshlrev_b32 v5, 16, v0 :: v_dual_lshlrev_b32 v6, 16, v184; GFX1250-NEXT: v_and_b32_e32 v4, 0xffff0000, v085; GFX1250-NEXT: v_and_b32_e32 v7, 0xffff0000, v186; GFX1250-NEXT: v_and_b32_e32 v0, 0xffff0000, v287; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)88; GFX1250-NEXT: v_pk_fma_f32 v[0:1], v[4:5], v[6:7], v[0:1] op_sel_hi:[1,1,0]89; GFX1250-NEXT: s_set_pc_i64 s[30:31]90 %src0.shuf = shufflevector <2 x bfloat> %src0, <2 x bfloat> undef, <2 x i32> <i32 1, i32 0>91 %src1.shuf = shufflevector <2 x bfloat> %src1, <2 x bfloat> undef, <2 x i32> <i32 0, i32 1>92 %src2.shuf = shufflevector <2 x bfloat> %src2, <2 x bfloat> undef, <2 x i32> <i32 1, i32 1>93 %src0.ext = fpext <2 x bfloat> %src0.shuf to <2 x float>94 %src1.ext = fpext <2 x bfloat> %src1.shuf to <2 x float>95 %src2.ext = fpext <2 x bfloat> %src2.shuf to <2 x float>96 %result = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %src0.ext, <2 x float> %src1.ext, <2 x float> %src2.ext)97 ret <2 x float> %result98}99 100define float @v_mad_mix_f32_negbf16lo_bf16lo_bf16lo(bfloat %src0, bfloat %src1, bfloat %src2) #0 {101; GFX1250-LABEL: v_mad_mix_f32_negbf16lo_bf16lo_bf16lo:102; GFX1250: ; %bb.0:103; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0104; GFX1250-NEXT: s_wait_kmcnt 0x0105; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, -v0, v1, v2 op_sel_hi:[1,1,1]106; GFX1250-NEXT: s_set_pc_i64 s[30:31]107 %src0.ext = fpext bfloat %src0 to float108 %src1.ext = fpext bfloat %src1 to float109 %src2.ext = fpext bfloat %src2 to float110 %src0.ext.neg = fneg float %src0.ext111 %result = tail call float @llvm.fmuladd.f32(float %src0.ext.neg, float %src1.ext, float %src2.ext)112 ret float %result113}114 115define float @v_mad_mix_f32_absbf16lo_bf16lo_bf16lo(bfloat %src0, bfloat %src1, bfloat %src2) #0 {116; GFX1250-LABEL: v_mad_mix_f32_absbf16lo_bf16lo_bf16lo:117; GFX1250: ; %bb.0:118; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0119; GFX1250-NEXT: s_wait_kmcnt 0x0120; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, |v0|, v1, v2 op_sel_hi:[1,1,1]121; GFX1250-NEXT: s_set_pc_i64 s[30:31]122 %src0.ext = fpext bfloat %src0 to float123 %src1.ext = fpext bfloat %src1 to float124 %src2.ext = fpext bfloat %src2 to float125 %src0.ext.abs = call float @llvm.fabs.f32(float %src0.ext)126 %result = tail call float @llvm.fmuladd.f32(float %src0.ext.abs, float %src1.ext, float %src2.ext)127 ret float %result128}129 130define float @v_mad_mix_f32_negabsbf16lo_bf16lo_bf16lo(bfloat %src0, bfloat %src1, bfloat %src2) #0 {131; GFX1250-LABEL: v_mad_mix_f32_negabsbf16lo_bf16lo_bf16lo:132; GFX1250: ; %bb.0:133; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0134; GFX1250-NEXT: s_wait_kmcnt 0x0135; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, -|v0|, v1, v2 op_sel_hi:[1,1,1]136; GFX1250-NEXT: s_set_pc_i64 s[30:31]137 %src0.ext = fpext bfloat %src0 to float138 %src1.ext = fpext bfloat %src1 to float139 %src2.ext = fpext bfloat %src2 to float140 %src0.ext.abs = call float @llvm.fabs.f32(float %src0.ext)141 %src0.ext.neg.abs = fneg float %src0.ext.abs142 %result = tail call float @llvm.fmuladd.f32(float %src0.ext.neg.abs, float %src1.ext, float %src2.ext)143 ret float %result144}145 146define float @v_mad_mix_f32_bf16lo_bf16lo_f32(bfloat %src0, bfloat %src1, float %src2) #0 {147; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32:148; GFX1250: ; %bb.0:149; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0150; GFX1250-NEXT: s_wait_kmcnt 0x0151; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,0]152; GFX1250-NEXT: s_set_pc_i64 s[30:31]153 %src0.ext = fpext bfloat %src0 to float154 %src1.ext = fpext bfloat %src1 to float155 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2)156 ret float %result157}158 159define float @v_mad_mix_f32_bf16lo_bf16lo_negf32(bfloat %src0, bfloat %src1, float %src2) #0 {160; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_negf32:161; GFX1250: ; %bb.0:162; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0163; GFX1250-NEXT: s_wait_kmcnt 0x0164; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, -v2 op_sel_hi:[1,1,0]165; GFX1250-NEXT: s_set_pc_i64 s[30:31]166 %src0.ext = fpext bfloat %src0 to float167 %src1.ext = fpext bfloat %src1 to float168 %src2.neg = fneg float %src2169 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.neg)170 ret float %result171}172 173define float @v_mad_mix_f32_bf16lo_bf16lo_absf32(bfloat %src0, bfloat %src1, float %src2) #0 {174; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_absf32:175; GFX1250: ; %bb.0:176; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0177; GFX1250-NEXT: s_wait_kmcnt 0x0178; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, |v2| op_sel_hi:[1,1,0]179; GFX1250-NEXT: s_set_pc_i64 s[30:31]180 %src0.ext = fpext bfloat %src0 to float181 %src1.ext = fpext bfloat %src1 to float182 %src2.abs = call float @llvm.fabs.f32(float %src2)183 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.abs)184 ret float %result185}186 187define float @v_mad_mix_f32_bf16lo_bf16lo_negabsf32(bfloat %src0, bfloat %src1, float %src2) #0 {188; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_negabsf32:189; GFX1250: ; %bb.0:190; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0191; GFX1250-NEXT: s_wait_kmcnt 0x0192; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, -|v2| op_sel_hi:[1,1,0]193; GFX1250-NEXT: s_set_pc_i64 s[30:31]194 %src0.ext = fpext bfloat %src0 to float195 %src1.ext = fpext bfloat %src1 to float196 %src2.abs = call float @llvm.fabs.f32(float %src2)197 %src2.neg.abs = fneg float %src2.abs198 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.neg.abs)199 ret float %result200}201 202define float @v_mad_mix_f32_bf16lo_bf16lo_f32imm1(bfloat %src0, bfloat %src1) #0 {203; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32imm1:204; GFX1250: ; %bb.0:205; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0206; GFX1250-NEXT: s_wait_kmcnt 0x0207; GFX1250-NEXT: s_mov_b32 s0, 1.0208; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1)209; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, s0 op_sel_hi:[1,1,0]210; GFX1250-NEXT: s_set_pc_i64 s[30:31]211 %src0.ext = fpext bfloat %src0 to float212 %src1.ext = fpext bfloat %src1 to float213 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float 1.0)214 ret float %result215}216 217define float @v_mad_mix_f32_bf16lo_bf16lo_f32imminv2pi(bfloat %src0, bfloat %src1) #0 {218; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32imminv2pi:219; GFX1250: ; %bb.0:220; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0221; GFX1250-NEXT: s_wait_kmcnt 0x0222; GFX1250-NEXT: s_mov_b32 s0, 0.15915494223; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1)224; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, s0 op_sel_hi:[1,1,0]225; GFX1250-NEXT: s_set_pc_i64 s[30:31]226 %src0.ext = fpext bfloat %src0 to float227 %src1.ext = fpext bfloat %src1 to float228 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float 0x3FC45F3060000000)229 ret float %result230}231 232define float @v_mad_mix_f32_bf16lo_bf16lo_cvtbf16imminv2pi(bfloat %src0, bfloat %src1) #0 {233; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_cvtbf16imminv2pi:234; GFX1250: ; %bb.0:235; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0236; GFX1250-NEXT: s_wait_kmcnt 0x0237; GFX1250-NEXT: s_mov_b32 s0, 0x3e230000238; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1)239; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, s0 op_sel_hi:[1,1,0]240; GFX1250-NEXT: s_set_pc_i64 s[30:31]241 %src0.ext = fpext bfloat %src0 to float242 %src1.ext = fpext bfloat %src1 to float243 %src2 = fpext bfloat 0xR3e23 to float244 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2)245 ret float %result246}247 248define float @v_mad_mix_f32_bf16lo_bf16lo_cvtbf16imm63(bfloat %src0, bfloat %src1) #0 {249; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_cvtbf16imm63:250; GFX1250: ; %bb.0:251; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0252; GFX1250-NEXT: s_wait_kmcnt 0x0253; GFX1250-NEXT: s_mov_b32 s0, 0x367c0000254; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1)255; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, s0 op_sel_hi:[1,1,0]256; GFX1250-NEXT: s_set_pc_i64 s[30:31]257 %src0.ext = fpext bfloat %src0 to float258 %src1.ext = fpext bfloat %src1 to float259 %src2 = fpext bfloat 0xR367c to float260 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2)261 ret float %result262}263 264define <2 x float> @v_mad_mix_v2f32_f32imm1(<2 x bfloat> %src0, <2 x bfloat> %src1) #0 {265; GFX1250-LABEL: v_mad_mix_v2f32_f32imm1:266; GFX1250: ; %bb.0:267; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0268; GFX1250-NEXT: s_wait_kmcnt 0x0269; GFX1250-NEXT: v_and_b32_e32 v3, 0xffff0000, v0270; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v0 :: v_dual_lshlrev_b32 v4, 16, v1271; GFX1250-NEXT: v_and_b32_e32 v5, 0xffff0000, v1272; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)273; GFX1250-NEXT: v_pk_fma_f32 v[0:1], v[2:3], v[4:5], 1.0 op_sel_hi:[1,1,0]274; GFX1250-NEXT: s_set_pc_i64 s[30:31]275 %src0.ext = fpext <2 x bfloat> %src0 to <2 x float>276 %src1.ext = fpext <2 x bfloat> %src1 to <2 x float>277 %result = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %src0.ext, <2 x float> %src1.ext, <2 x float> <float 1.0, float 1.0>)278 ret <2 x float> %result279}280 281define <2 x float> @v_mad_mix_v2f32_cvtbf16imminv2pi(<2 x bfloat> %src0, <2 x bfloat> %src1) #0 {282; GFX1250-LABEL: v_mad_mix_v2f32_cvtbf16imminv2pi:283; GFX1250: ; %bb.0:284; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0285; GFX1250-NEXT: s_wait_kmcnt 0x0286; GFX1250-NEXT: v_and_b32_e32 v3, 0xffff0000, v0287; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v0 :: v_dual_lshlrev_b32 v4, 16, v1288; GFX1250-NEXT: v_and_b32_e32 v5, 0xffff0000, v1289; GFX1250-NEXT: s_mov_b32 s0, 0x3e230000290; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)291; GFX1250-NEXT: v_pk_fma_f32 v[0:1], v[2:3], v[4:5], s[0:1] op_sel_hi:[1,1,0]292; GFX1250-NEXT: s_set_pc_i64 s[30:31]293 %src0.ext = fpext <2 x bfloat> %src0 to <2 x float>294 %src1.ext = fpext <2 x bfloat> %src1 to <2 x float>295 %src2 = fpext <2 x bfloat> <bfloat 0xR3e23, bfloat 0xR3e23> to <2 x float>296 %result = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %src0.ext, <2 x float> %src1.ext, <2 x float> %src2)297 ret <2 x float> %result298}299 300define <2 x float> @v_mad_mix_v2f32_f32imminv2pi(<2 x bfloat> %src0, <2 x bfloat> %src1) #0 {301; GFX1250-LABEL: v_mad_mix_v2f32_f32imminv2pi:302; GFX1250: ; %bb.0:303; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0304; GFX1250-NEXT: s_wait_kmcnt 0x0305; GFX1250-NEXT: v_and_b32_e32 v3, 0xffff0000, v0306; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v0 :: v_dual_lshlrev_b32 v4, 16, v1307; GFX1250-NEXT: v_and_b32_e32 v5, 0xffff0000, v1308; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)309; GFX1250-NEXT: v_pk_fma_f32 v[0:1], v[2:3], v[4:5], 0.15915494 op_sel_hi:[1,1,0]310; GFX1250-NEXT: s_set_pc_i64 s[30:31]311 %src0.ext = fpext <2 x bfloat> %src0 to <2 x float>312 %src1.ext = fpext <2 x bfloat> %src1 to <2 x float>313 %src2 = fpext <2 x bfloat> <bfloat 0xR3e23, bfloat 0xR3e23> to <2 x float>314 %result = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %src0.ext, <2 x float> %src1.ext, <2 x float> <float 0x3FC45F3060000000, float 0x3FC45F3060000000>)315 ret <2 x float> %result316}317 318define float @v_mad_mix_clamp_f32_bf16hi_bf16hi_bf16hi_elt(<2 x bfloat> %src0, <2 x bfloat> %src1, <2 x bfloat> %src2) #0 {319; GFX1250-LABEL: v_mad_mix_clamp_f32_bf16hi_bf16hi_bf16hi_elt:320; GFX1250: ; %bb.0:321; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0322; GFX1250-NEXT: s_wait_kmcnt 0x0323; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel:[1,1,1] op_sel_hi:[1,1,1] clamp324; GFX1250-NEXT: s_set_pc_i64 s[30:31]325 %src0.hi = extractelement <2 x bfloat> %src0, i32 1326 %src1.hi = extractelement <2 x bfloat> %src1, i32 1327 %src2.hi = extractelement <2 x bfloat> %src2, i32 1328 %src0.ext = fpext bfloat %src0.hi to float329 %src1.ext = fpext bfloat %src1.hi to float330 %src2.ext = fpext bfloat %src2.hi to float331 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)332 %max = call float @llvm.maxnum.f32(float %result, float 0.0)333 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)334 ret float %clamp335}336 337define float @no_mix_simple(float %src0, float %src1, float %src2) #0 {338; GFX1250-LABEL: no_mix_simple:339; GFX1250: ; %bb.0:340; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0341; GFX1250-NEXT: s_wait_kmcnt 0x0342; GFX1250-NEXT: v_fma_f32 v0, v0, v1, v2343; GFX1250-NEXT: s_set_pc_i64 s[30:31]344 %result = call float @llvm.fmuladd.f32(float %src0, float %src1, float %src2)345 ret float %result346}347 348define float @no_mix_simple_fabs(float %src0, float %src1, float %src2) #0 {349; GFX1250-LABEL: no_mix_simple_fabs:350; GFX1250: ; %bb.0:351; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0352; GFX1250-NEXT: s_wait_kmcnt 0x0353; GFX1250-NEXT: v_fma_f32 v0, |v0|, v1, v2354; GFX1250-NEXT: s_set_pc_i64 s[30:31]355 %src0.fabs = call float @llvm.fabs.f32(float %src0)356 %result = call float @llvm.fmuladd.f32(float %src0.fabs, float %src1, float %src2)357 ret float %result358}359 360define float @v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_denormals(bfloat %src0, bfloat %src1, bfloat %src2) #1 {361; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_denormals:362; GFX1250: ; %bb.0:363; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0364; GFX1250-NEXT: s_wait_kmcnt 0x0365; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,1]366; GFX1250-NEXT: s_set_pc_i64 s[30:31]367 %src0.ext = fpext bfloat %src0 to float368 %src1.ext = fpext bfloat %src1 to float369 %src2.ext = fpext bfloat %src2 to float370 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)371 ret float %result372}373 374define float @v_mad_mix_f32_bf16lo_bf16lo_f32_denormals(bfloat %src0, bfloat %src1, float %src2) #1 {375; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32_denormals:376; GFX1250: ; %bb.0:377; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0378; GFX1250-NEXT: s_wait_kmcnt 0x0379; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,0]380; GFX1250-NEXT: s_set_pc_i64 s[30:31]381 %src0.ext = fpext bfloat %src0 to float382 %src1.ext = fpext bfloat %src1 to float383 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2)384 ret float %result385}386 387define float @v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_denormals_fmulfadd(bfloat %src0, bfloat %src1, bfloat %src2) #1 {388; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_denormals_fmulfadd:389; GFX1250: ; %bb.0:390; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0391; GFX1250-NEXT: s_wait_kmcnt 0x0392; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1393; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)394; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v2 :: v_dual_mul_f32 v0, v0, v1395; GFX1250-NEXT: v_add_f32_e32 v0, v0, v2396; GFX1250-NEXT: s_set_pc_i64 s[30:31]397 %src0.ext = fpext bfloat %src0 to float398 %src1.ext = fpext bfloat %src1 to float399 %src2.ext = fpext bfloat %src2 to float400 %mul = fmul float %src0.ext, %src1.ext401 %result = fadd float %mul, %src2.ext402 ret float %result403}404 405define float @v_mad_mix_f32_bf16lo_bf16lo_f32_denormals_fmulfadd(bfloat %src0, bfloat %src1, float %src2) #1 {406; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32_denormals_fmulfadd:407; GFX1250: ; %bb.0:408; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0409; GFX1250-NEXT: s_wait_kmcnt 0x0410; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1411; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)412; GFX1250-NEXT: v_mul_f32_e32 v0, v0, v1413; GFX1250-NEXT: v_add_f32_e32 v0, v0, v2414; GFX1250-NEXT: s_set_pc_i64 s[30:31]415 %src0.ext = fpext bfloat %src0 to float416 %src1.ext = fpext bfloat %src1 to float417 %mul = fmul float %src0.ext, %src1.ext418 %result = fadd float %mul, %src2419 ret float %result420}421 422define float @v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_flush_fmulfadd(bfloat %src0, bfloat %src1, bfloat %src2) #0 {423; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_bf16lo_f32_flush_fmulfadd:424; GFX1250: ; %bb.0:425; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0426; GFX1250-NEXT: s_wait_kmcnt 0x0427; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,1]428; GFX1250-NEXT: s_set_pc_i64 s[30:31]429 %src0.ext = fpext bfloat %src0 to float430 %src1.ext = fpext bfloat %src1 to float431 %src2.ext = fpext bfloat %src2 to float432 %mul = fmul contract float %src0.ext, %src1.ext433 %result = fadd contract float %mul, %src2.ext434 ret float %result435}436 437define float @v_mad_mix_f32_bf16lo_bf16lo_f32_flush_fmulfadd(bfloat %src0, bfloat %src1, float %src2) #0 {438; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_f32_flush_fmulfadd:439; GFX1250: ; %bb.0:440; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0441; GFX1250-NEXT: s_wait_kmcnt 0x0442; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[1,1,0]443; GFX1250-NEXT: s_set_pc_i64 s[30:31]444 %src0.ext = fpext bfloat %src0 to float445 %src1.ext = fpext bfloat %src1 to float446 %mul = fmul contract float %src0.ext, %src1.ext447 %result = fadd contract float %mul, %src2448 ret float %result449}450 451define float @v_mad_mix_f32_negprecvtbf16lo_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {452; GFX1250-LABEL: v_mad_mix_f32_negprecvtbf16lo_bf16lo_bf16lo:453; GFX1250: ; %bb.0:454; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0455; GFX1250-NEXT: s_wait_kmcnt 0x0456; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, -v0, v1, v2 op_sel_hi:[1,1,1]457; GFX1250-NEXT: s_set_pc_i64 s[30:31]458 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>459 %src0 = extractelement <2 x bfloat> %src0.arg.bc, i32 0460 %src0.neg = fneg bfloat %src0461 %src0.ext = fpext bfloat %src0.neg to float462 %src1.ext = fpext bfloat %src1 to float463 %src2.ext = fpext bfloat %src2 to float464 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)465 ret float %result466}467 468define float @v_mad_mix_f32_precvtnegbf16hi_abs_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {469; GFX1250-LABEL: v_mad_mix_f32_precvtnegbf16hi_abs_bf16lo_bf16lo:470; GFX1250: ; %bb.0:471; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0472; GFX1250-NEXT: s_wait_kmcnt 0x0473; GFX1250-NEXT: v_lshrrev_b32_e32 v0, 16, v0474; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)475; GFX1250-NEXT: v_xor_b32_e32 v0, 0x8000, v0476; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, |v0|, v1, v2 op_sel_hi:[1,1,1]477; GFX1250-NEXT: s_set_pc_i64 s[30:31]478 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>479 %src0 = extractelement <2 x bfloat> %src0.arg.bc, i32 1480 %src0.neg = fneg bfloat %src0481 %src0.ext = fpext bfloat %src0.neg to float482 %src0.ext.abs = call float @llvm.fabs.f32(float %src0.ext)483 %src1.ext = fpext bfloat %src1 to float484 %src2.ext = fpext bfloat %src2 to float485 %result = tail call float @llvm.fmuladd.f32(float %src0.ext.abs, float %src1.ext, float %src2.ext)486 ret float %result487}488 489define float @v_mad_mix_f32_precvtabsbf16hi_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {490; GFX1250-LABEL: v_mad_mix_f32_precvtabsbf16hi_bf16lo_bf16lo:491; GFX1250: ; %bb.0:492; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0493; GFX1250-NEXT: s_wait_kmcnt 0x0494; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, |v0|, v1, v2 op_sel:[1,0,0] op_sel_hi:[1,1,1]495; GFX1250-NEXT: s_set_pc_i64 s[30:31]496 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>497 %src0 = extractelement <2 x bfloat> %src0.arg.bc, i32 1498 %src0.abs = call bfloat @llvm.fabs.bf16(bfloat %src0)499 %src0.ext = fpext bfloat %src0.abs to float500 %src1.ext = fpext bfloat %src1 to float501 %src2.ext = fpext bfloat %src2 to float502 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)503 ret float %result504}505 506define float @v_mad_mix_f32_preextractfneg_bf16hi_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {507; GFX1250-LABEL: v_mad_mix_f32_preextractfneg_bf16hi_bf16lo_bf16lo:508; GFX1250: ; %bb.0:509; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0510; GFX1250-NEXT: s_wait_kmcnt 0x0511; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, -v0, v1, v2 op_sel:[1,0,0] op_sel_hi:[1,1,1]512; GFX1250-NEXT: s_set_pc_i64 s[30:31]513 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>514 %fneg = fneg <2 x bfloat> %src0.arg.bc515 %src0 = extractelement <2 x bfloat> %fneg, i32 1516 %src0.ext = fpext bfloat %src0 to float517 %src1.ext = fpext bfloat %src1 to float518 %src2.ext = fpext bfloat %src2 to float519 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)520 ret float %result521}522 523define float @v_mad_mix_f32_preextractfabs_bf16hi_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {524; GFX1250-LABEL: v_mad_mix_f32_preextractfabs_bf16hi_bf16lo_bf16lo:525; GFX1250: ; %bb.0:526; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0527; GFX1250-NEXT: s_wait_kmcnt 0x0528; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, |v0|, v1, v2 op_sel:[1,0,0] op_sel_hi:[1,1,1]529; GFX1250-NEXT: s_set_pc_i64 s[30:31]530 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>531 %fabs = call <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat> %src0.arg.bc)532 %src0 = extractelement <2 x bfloat> %fabs, i32 1533 %src0.ext = fpext bfloat %src0 to float534 %src1.ext = fpext bfloat %src1 to float535 %src2.ext = fpext bfloat %src2 to float536 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)537 ret float %result538}539 540define float @v_mad_mix_f32_preextractfabsfneg_bf16hi_bf16lo_bf16lo(i32 %src0.arg, bfloat %src1, bfloat %src2) #0 {541; GFX1250-LABEL: v_mad_mix_f32_preextractfabsfneg_bf16hi_bf16lo_bf16lo:542; GFX1250: ; %bb.0:543; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0544; GFX1250-NEXT: s_wait_kmcnt 0x0545; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, -|v0|, v1, v2 op_sel:[1,0,0] op_sel_hi:[1,1,1]546; GFX1250-NEXT: s_set_pc_i64 s[30:31]547 %src0.arg.bc = bitcast i32 %src0.arg to <2 x bfloat>548 %fabs = call <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat> %src0.arg.bc)549 %fneg.fabs = fneg <2 x bfloat> %fabs550 %src0 = extractelement <2 x bfloat> %fneg.fabs, i32 1551 %src0.ext = fpext bfloat %src0 to float552 %src1.ext = fpext bfloat %src1 to float553 %src2.ext = fpext bfloat %src2 to float554 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)555 ret float %result556}557 558define float @v_mad_mix_f32_bf16lo_bf16lo_bf16lo_all_cast_from_half(half %src0, half %src1, half %src2) #0 {559; GFX1250-LABEL: v_mad_mix_f32_bf16lo_bf16lo_bf16lo_all_cast_from_half:560; GFX1250: ; %bb.0:561; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0562; GFX1250-NEXT: s_wait_kmcnt 0x0563; GFX1250-NEXT: v_dual_lshlrev_b32 v3, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1564; GFX1250-NEXT: v_lshlrev_b32_e32 v0, 16, v2565; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)566; GFX1250-NEXT: v_fmac_f32_e32 v0, v3, v1567; GFX1250-NEXT: s_set_pc_i64 s[30:31]568 %src0.bf16 = bitcast half %src0 to bfloat569 %src1.bf16 = bitcast half %src1 to bfloat570 %src2.bf16 = bitcast half %src2 to bfloat571 %src0.ext = fpext bfloat %src0.bf16 to float572 %src1.ext = fpext bfloat %src1.bf16 to float573 %src2.ext = fpext bfloat %src2.bf16 to float574 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)575 ret float %result576}577 578define float @v_mad_mix_f32_bf16lo_cast_from_half_bf16lo_bf16lo(half %src0, bfloat %src1, bfloat %src2) #0 {579; GFX1250-LABEL: v_mad_mix_f32_bf16lo_cast_from_half_bf16lo_bf16lo:580; GFX1250: ; %bb.0:581; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0582; GFX1250-NEXT: s_wait_kmcnt 0x0583; GFX1250-NEXT: v_lshlrev_b32_e32 v0, 16, v0584; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)585; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, v0, v1, v2 op_sel_hi:[0,1,1]586; GFX1250-NEXT: s_set_pc_i64 s[30:31]587 %src0.bf16 = bitcast half %src0 to bfloat588 %src0.ext = fpext bfloat %src0.bf16 to float589 %src1.ext = fpext bfloat %src1 to float590 %src2.ext = fpext bfloat %src2 to float591 %result = tail call float @llvm.fmuladd.f32(float %src0.ext, float %src1.ext, float %src2.ext)592 ret float %result593}594 595define amdgpu_kernel void @test_fma_mix_f32_bf16_src2_bf16lo(float %x, i32 %y, ptr addrspace(1) %out) {596; GFX1250-LABEL: test_fma_mix_f32_bf16_src2_bf16lo:597; GFX1250: ; %bb.0: ; %entry598; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1599; GFX1250-NEXT: s_load_b128 s[0:3], s[4:5], 0x24600; GFX1250-NEXT: s_wait_kmcnt 0x0601; GFX1250-NEXT: v_fma_mix_f32_bf16 v0, s0, 0, s1 op_sel_hi:[0,0,1]602; GFX1250-NEXT: s_mov_b32 s0, 0603; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_2)604; GFX1250-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, s0605; GFX1250-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v0606; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo607; GFX1250-NEXT: global_store_b64 v2, v[0:1], s[2:3]608; GFX1250-NEXT: s_endpgm609entry:610 %v0 = shl i32 %y, 16611 %v1 = bitcast i32 %v0 to float612 %mul7 = fmul contract float %x, 0.000000e+00613 %add2 = fadd contract float %mul7, %v1614 %v2 = fcmp uno float %add2, 0.000000e+00615 %v3 = select i1 %v2, i64 1, i64 0616 store i64 %v3, ptr addrspace(1) %out, align 8617 ret void618}619 620declare bfloat @llvm.fabs.bf16(bfloat) #2621declare <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat>) #2622declare float @llvm.fabs.f32(float) #2623declare float @llvm.minnum.f32(float, float) #2624declare float @llvm.maxnum.f32(float, float) #2625declare float @llvm.fmuladd.f32(float, float, float) #2626declare <2 x float> @llvm.fmuladd.v2f32(<2 x float>, <2 x float>, <2 x float>) #2627 628attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }629attributes #1 = { nounwind "denormal-fp-math-f32"="ieee,ieee" }630attributes #2 = { nounwind readnone speculatable }631