brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.9 KiB · 83625a5 Raw
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