336 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12 %s3; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12 %s4 5define float @test_amdgcn_dot4_f32_fp8_bf8(i32 %a, i32 %b, float %c) {6; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_bf8:7; GFX12: ; %bb.0: ; %entry8; GFX12-NEXT: s_wait_loadcnt_dscnt 0x09; GFX12-NEXT: s_wait_expcnt 0x010; GFX12-NEXT: s_wait_samplecnt 0x011; GFX12-NEXT: s_wait_bvhcnt 0x012; GFX12-NEXT: s_wait_kmcnt 0x013; GFX12-NEXT: v_dot4_f32_fp8_bf8 v0, v0, v1, v214; GFX12-NEXT: s_setpc_b64 s[30:31]15entry:16 %ret = call float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %c)17 ret float %ret18}19 20define float @test_amdgcn_dot4_f32_fp8_bf8_fabs(i32 %a, i32 %b, float %c) {21; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_bf8_fabs:22; GFX12: ; %bb.0: ; %entry23; GFX12-NEXT: s_wait_loadcnt_dscnt 0x024; GFX12-NEXT: s_wait_expcnt 0x025; GFX12-NEXT: s_wait_samplecnt 0x026; GFX12-NEXT: s_wait_bvhcnt 0x027; GFX12-NEXT: s_wait_kmcnt 0x028; GFX12-NEXT: v_dot4_f32_fp8_bf8 v0, v0, v1, v2 neg_hi:[0,0,1]29; GFX12-NEXT: s_setpc_b64 s[30:31]30entry:31 %fabs.c = call float @llvm.fabs.f32(float %c)32 %ret = call float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %fabs.c)33 ret float %ret34}35 36define float @test_amdgcn_dot4_f32_fp8_bf8_fneg(i32 %a, i32 %b, float %c) {37; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_bf8_fneg:38; GFX12: ; %bb.0: ; %entry39; GFX12-NEXT: s_wait_loadcnt_dscnt 0x040; GFX12-NEXT: s_wait_expcnt 0x041; GFX12-NEXT: s_wait_samplecnt 0x042; GFX12-NEXT: s_wait_bvhcnt 0x043; GFX12-NEXT: s_wait_kmcnt 0x044; GFX12-NEXT: v_dot4_f32_fp8_bf8 v0, v0, v1, v2 neg_lo:[0,0,1]45; GFX12-NEXT: s_setpc_b64 s[30:31]46entry:47 %fneg.c = fneg float %c48 %ret = call float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %fneg.c)49 ret float %ret50}51 52define float @test_amdgcn_dot4_f32_fp8_bf8_fabs_fneg(i32 %a, i32 %b, float %c) {53; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_bf8_fabs_fneg:54; GFX12: ; %bb.0: ; %entry55; GFX12-NEXT: s_wait_loadcnt_dscnt 0x056; GFX12-NEXT: s_wait_expcnt 0x057; GFX12-NEXT: s_wait_samplecnt 0x058; GFX12-NEXT: s_wait_bvhcnt 0x059; GFX12-NEXT: s_wait_kmcnt 0x060; GFX12-NEXT: v_dot4_f32_fp8_bf8 v0, v0, v1, v2 neg_hi:[0,0,1]61; GFX12-NEXT: s_setpc_b64 s[30:31]62entry:63 %fneg.c = fneg float %c64 %fabs.fneg.c = call float @llvm.fabs.f32(float %fneg.c)65 %ret = call float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %fabs.fneg.c)66 ret float %ret67}68 69define float @test_amdgcn_dot4_f32_fp8_bf8_fneg_fabs(i32 %a, i32 %b, float %c) {70; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_bf8_fneg_fabs:71; GFX12: ; %bb.0: ; %entry72; GFX12-NEXT: s_wait_loadcnt_dscnt 0x073; GFX12-NEXT: s_wait_expcnt 0x074; GFX12-NEXT: s_wait_samplecnt 0x075; GFX12-NEXT: s_wait_bvhcnt 0x076; GFX12-NEXT: s_wait_kmcnt 0x077; GFX12-NEXT: v_dot4_f32_fp8_bf8 v0, v0, v1, v2 neg_lo:[0,0,1] neg_hi:[0,0,1]78; GFX12-NEXT: s_setpc_b64 s[30:31]79entry:80 %fabs.c = call float @llvm.fabs.f32(float %c)81 %fneg.fabs.c = fneg float %fabs.c82 %ret = call float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %fneg.fabs.c)83 ret float %ret84}85 86define float @test_amdgcn_dot4_f32_bf8_fp8(i32 %a, i32 %b, float %c) {87; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_fp8:88; GFX12: ; %bb.0: ; %entry89; GFX12-NEXT: s_wait_loadcnt_dscnt 0x090; GFX12-NEXT: s_wait_expcnt 0x091; GFX12-NEXT: s_wait_samplecnt 0x092; GFX12-NEXT: s_wait_bvhcnt 0x093; GFX12-NEXT: s_wait_kmcnt 0x094; GFX12-NEXT: v_dot4_f32_bf8_fp8 v0, v0, v1, v295; GFX12-NEXT: s_setpc_b64 s[30:31]96entry:97 %ret = call float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %c)98 ret float %ret99}100 101define float @test_amdgcn_dot4_f32_bf8_fp8_fabs(i32 %a, i32 %b, float %c) {102; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_fp8_fabs:103; GFX12: ; %bb.0: ; %entry104; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0105; GFX12-NEXT: s_wait_expcnt 0x0106; GFX12-NEXT: s_wait_samplecnt 0x0107; GFX12-NEXT: s_wait_bvhcnt 0x0108; GFX12-NEXT: s_wait_kmcnt 0x0109; GFX12-NEXT: v_dot4_f32_bf8_fp8 v0, v0, v1, v2 neg_hi:[0,0,1]110; GFX12-NEXT: s_setpc_b64 s[30:31]111entry:112 %fabs.c = call float @llvm.fabs.f32(float %c)113 %ret = call float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %fabs.c)114 ret float %ret115}116 117define float @test_amdgcn_dot4_f32_bf8_fp8_fneg(i32 %a, i32 %b, float %c) {118; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_fp8_fneg:119; GFX12: ; %bb.0: ; %entry120; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0121; GFX12-NEXT: s_wait_expcnt 0x0122; GFX12-NEXT: s_wait_samplecnt 0x0123; GFX12-NEXT: s_wait_bvhcnt 0x0124; GFX12-NEXT: s_wait_kmcnt 0x0125; GFX12-NEXT: v_dot4_f32_bf8_fp8 v0, v0, v1, v2 neg_lo:[0,0,1]126; GFX12-NEXT: s_setpc_b64 s[30:31]127entry:128 %fneg.c = fneg float %c129 %ret = call float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %fneg.c)130 ret float %ret131}132 133define float @test_amdgcn_dot4_f32_bf8_fp8_fabs_fneg(i32 %a, i32 %b, float %c) {134; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_fp8_fabs_fneg:135; GFX12: ; %bb.0: ; %entry136; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0137; GFX12-NEXT: s_wait_expcnt 0x0138; GFX12-NEXT: s_wait_samplecnt 0x0139; GFX12-NEXT: s_wait_bvhcnt 0x0140; GFX12-NEXT: s_wait_kmcnt 0x0141; GFX12-NEXT: v_dot4_f32_bf8_fp8 v0, v0, v1, v2 neg_hi:[0,0,1]142; GFX12-NEXT: s_setpc_b64 s[30:31]143entry:144 %fneg.c = fneg float %c145 %fabs.fneg.c = call float @llvm.fabs.f32(float %fneg.c)146 %ret = call float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %fabs.fneg.c)147 ret float %ret148}149 150define float @test_amdgcn_dot4_f32_bf8_fp8_fneg_fabs(i32 %a, i32 %b, float %c) {151; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_fp8_fneg_fabs:152; GFX12: ; %bb.0: ; %entry153; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0154; GFX12-NEXT: s_wait_expcnt 0x0155; GFX12-NEXT: s_wait_samplecnt 0x0156; GFX12-NEXT: s_wait_bvhcnt 0x0157; GFX12-NEXT: s_wait_kmcnt 0x0158; GFX12-NEXT: v_dot4_f32_bf8_fp8 v0, v0, v1, v2 neg_lo:[0,0,1] neg_hi:[0,0,1]159; GFX12-NEXT: s_setpc_b64 s[30:31]160entry:161 %fabs.c = call float @llvm.fabs.f32(float %c)162 %fneg.fabs.c = fneg float %fabs.c163 %ret = call float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %fneg.fabs.c)164 ret float %ret165}166 167define float @test_amdgcn_dot4_f32_fp8_fp8(i32 %a, i32 %b, float %c) {168; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_fp8:169; GFX12: ; %bb.0: ; %entry170; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0171; GFX12-NEXT: s_wait_expcnt 0x0172; GFX12-NEXT: s_wait_samplecnt 0x0173; GFX12-NEXT: s_wait_bvhcnt 0x0174; GFX12-NEXT: s_wait_kmcnt 0x0175; GFX12-NEXT: v_dot4_f32_fp8_fp8 v0, v0, v1, v2176; GFX12-NEXT: s_setpc_b64 s[30:31]177entry:178 %ret = call float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %c)179 ret float %ret180}181 182define float @test_amdgcn_dot4_f32_fp8_fp8_fabs(i32 %a, i32 %b, float %c) {183; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_fp8_fabs:184; GFX12: ; %bb.0: ; %entry185; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0186; GFX12-NEXT: s_wait_expcnt 0x0187; GFX12-NEXT: s_wait_samplecnt 0x0188; GFX12-NEXT: s_wait_bvhcnt 0x0189; GFX12-NEXT: s_wait_kmcnt 0x0190; GFX12-NEXT: v_dot4_f32_fp8_fp8 v0, v0, v1, v2 neg_hi:[0,0,1]191; GFX12-NEXT: s_setpc_b64 s[30:31]192entry:193 %fabs.c = call float @llvm.fabs.f32(float %c)194 %ret = call float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %fabs.c)195 ret float %ret196}197 198define float @test_amdgcn_dot4_f32_fp8_fp8_fneg(i32 %a, i32 %b, float %c) {199; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_fp8_fneg:200; GFX12: ; %bb.0: ; %entry201; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0202; GFX12-NEXT: s_wait_expcnt 0x0203; GFX12-NEXT: s_wait_samplecnt 0x0204; GFX12-NEXT: s_wait_bvhcnt 0x0205; GFX12-NEXT: s_wait_kmcnt 0x0206; GFX12-NEXT: v_dot4_f32_fp8_fp8 v0, v0, v1, v2 neg_lo:[0,0,1]207; GFX12-NEXT: s_setpc_b64 s[30:31]208entry:209 %fneg.c = fneg float %c210 %ret = call float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %fneg.c)211 ret float %ret212}213 214define float @test_amdgcn_dot4_f32_fp8_fp8_fabs_fneg(i32 %a, i32 %b, float %c) {215; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_fp8_fabs_fneg:216; GFX12: ; %bb.0: ; %entry217; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0218; GFX12-NEXT: s_wait_expcnt 0x0219; GFX12-NEXT: s_wait_samplecnt 0x0220; GFX12-NEXT: s_wait_bvhcnt 0x0221; GFX12-NEXT: s_wait_kmcnt 0x0222; GFX12-NEXT: v_dot4_f32_fp8_fp8 v0, v0, v1, v2 neg_hi:[0,0,1]223; GFX12-NEXT: s_setpc_b64 s[30:31]224entry:225 %fneg.c = fneg float %c226 %fabs.fneg.c = call float @llvm.fabs.f32(float %fneg.c)227 %ret = call float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %fabs.fneg.c)228 ret float %ret229}230 231define float @test_amdgcn_dot4_f32_fp8_fp8_fneg_fabs(i32 %a, i32 %b, float %c) {232; GFX12-LABEL: test_amdgcn_dot4_f32_fp8_fp8_fneg_fabs:233; GFX12: ; %bb.0: ; %entry234; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0235; GFX12-NEXT: s_wait_expcnt 0x0236; GFX12-NEXT: s_wait_samplecnt 0x0237; GFX12-NEXT: s_wait_bvhcnt 0x0238; GFX12-NEXT: s_wait_kmcnt 0x0239; GFX12-NEXT: v_dot4_f32_fp8_fp8 v0, v0, v1, v2 neg_lo:[0,0,1] neg_hi:[0,0,1]240; GFX12-NEXT: s_setpc_b64 s[30:31]241entry:242 %fabs.c = call float @llvm.fabs.f32(float %c)243 %fneg.fabs.c = fneg float %fabs.c244 %ret = call float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %fneg.fabs.c)245 ret float %ret246}247 248define float @test_amdgcn_dot4_f32_bf8_bf8(i32 %a, i32 %b, float %c) {249; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_bf8:250; GFX12: ; %bb.0: ; %entry251; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0252; GFX12-NEXT: s_wait_expcnt 0x0253; GFX12-NEXT: s_wait_samplecnt 0x0254; GFX12-NEXT: s_wait_bvhcnt 0x0255; GFX12-NEXT: s_wait_kmcnt 0x0256; GFX12-NEXT: v_dot4_f32_bf8_bf8 v0, v0, v1, v2257; GFX12-NEXT: s_setpc_b64 s[30:31]258entry:259 %ret = call float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %c)260 ret float %ret261}262 263define float @test_amdgcn_dot4_f32_bf8_bf8_fabs(i32 %a, i32 %b, float %c) {264; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_bf8_fabs:265; GFX12: ; %bb.0: ; %entry266; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0267; GFX12-NEXT: s_wait_expcnt 0x0268; GFX12-NEXT: s_wait_samplecnt 0x0269; GFX12-NEXT: s_wait_bvhcnt 0x0270; GFX12-NEXT: s_wait_kmcnt 0x0271; GFX12-NEXT: v_dot4_f32_bf8_bf8 v0, v0, v1, v2 neg_hi:[0,0,1]272; GFX12-NEXT: s_setpc_b64 s[30:31]273entry:274 %fabs.c = call float @llvm.fabs.f32(float %c)275 %ret = call float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %fabs.c)276 ret float %ret277}278 279define float @test_amdgcn_dot4_f32_bf8_bf8_fneg(i32 %a, i32 %b, float %c) {280; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_bf8_fneg:281; GFX12: ; %bb.0: ; %entry282; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0283; GFX12-NEXT: s_wait_expcnt 0x0284; GFX12-NEXT: s_wait_samplecnt 0x0285; GFX12-NEXT: s_wait_bvhcnt 0x0286; GFX12-NEXT: s_wait_kmcnt 0x0287; GFX12-NEXT: v_dot4_f32_bf8_bf8 v0, v0, v1, v2 neg_lo:[0,0,1]288; GFX12-NEXT: s_setpc_b64 s[30:31]289entry:290 %fneg.c = fneg float %c291 %ret = call float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %fneg.c)292 ret float %ret293}294 295define float @test_amdgcn_dot4_f32_bf8_bf8_fabs_fneg(i32 %a, i32 %b, float %c) {296; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_bf8_fabs_fneg:297; GFX12: ; %bb.0: ; %entry298; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0299; GFX12-NEXT: s_wait_expcnt 0x0300; GFX12-NEXT: s_wait_samplecnt 0x0301; GFX12-NEXT: s_wait_bvhcnt 0x0302; GFX12-NEXT: s_wait_kmcnt 0x0303; GFX12-NEXT: v_dot4_f32_bf8_bf8 v0, v0, v1, v2 neg_hi:[0,0,1]304; GFX12-NEXT: s_setpc_b64 s[30:31]305entry:306 %fneg.c = fneg float %c307 %fabs.fneg.c = call float @llvm.fabs.f32(float %fneg.c)308 %ret = call float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %fabs.fneg.c)309 ret float %ret310}311 312define float @test_amdgcn_dot4_f32_bf8_bf8_fneg_fabs(i32 %a, i32 %b, float %c) {313; GFX12-LABEL: test_amdgcn_dot4_f32_bf8_bf8_fneg_fabs:314; GFX12: ; %bb.0: ; %entry315; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0316; GFX12-NEXT: s_wait_expcnt 0x0317; GFX12-NEXT: s_wait_samplecnt 0x0318; GFX12-NEXT: s_wait_bvhcnt 0x0319; GFX12-NEXT: s_wait_kmcnt 0x0320; GFX12-NEXT: v_dot4_f32_bf8_bf8 v0, v0, v1, v2 neg_lo:[0,0,1] neg_hi:[0,0,1]321; GFX12-NEXT: s_setpc_b64 s[30:31]322entry:323 %fabs.c = call float @llvm.fabs.f32(float %c)324 %fneg.fabs.c = fneg float %fabs.c325 %ret = call float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %fneg.fabs.c)326 ret float %ret327}328 329declare float @llvm.amdgcn.dot4.f32.fp8.bf8(i32 %a, i32 %b, float %c)330declare float @llvm.amdgcn.dot4.f32.bf8.fp8(i32 %a, i32 %b, float %c)331declare float @llvm.amdgcn.dot4.f32.fp8.fp8(i32 %a, i32 %b, float %c)332declare float @llvm.amdgcn.dot4.f32.bf8.bf8(i32 %a, i32 %b, float %c)333 334declare float @llvm.fabs.f32(float %a)335 336