598 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s4 5; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10-SDAG %s6; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10-GISEL %s7 8; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11-SDAG %s9; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11-GISEL %s10 11; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s12; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s13 14define float @v_constained_fadd_f32_fpexcept_strict(float %x, float %y) #0 {15; GFX9-LABEL: v_constained_fadd_f32_fpexcept_strict:16; GFX9: ; %bb.0:17; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)18; GFX9-NEXT: v_add_f32_e32 v0, v0, v119; GFX9-NEXT: s_setpc_b64 s[30:31]20;21; GFX10PLUS-LABEL: v_constained_fadd_f32_fpexcept_strict:22; GFX10PLUS: ; %bb.0:23; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)24; GFX10PLUS-NEXT: v_add_f32_e32 v0, v0, v125; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]26;27; GFX12-LABEL: v_constained_fadd_f32_fpexcept_strict:28; GFX12: ; %bb.0:29; GFX12-NEXT: s_wait_loadcnt_dscnt 0x030; GFX12-NEXT: s_wait_expcnt 0x031; GFX12-NEXT: s_wait_samplecnt 0x032; GFX12-NEXT: s_wait_bvhcnt 0x033; GFX12-NEXT: s_wait_kmcnt 0x034; GFX12-NEXT: v_add_f32_e32 v0, v0, v135; GFX12-NEXT: s_setpc_b64 s[30:31]36; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict:37; GCN-SDAG: ; %bb.0:38; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v140; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]41; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict:42; GCN-GISEL: ; %bb.0:43; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)44; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v145; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]46 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")47 ret float %val48}49 50define float @v_constained_fadd_f32_fpexcept_ignore(float %x, float %y) #0 {51; GFX9-LABEL: v_constained_fadd_f32_fpexcept_ignore:52; GFX9: ; %bb.0:53; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)54; GFX9-NEXT: v_add_f32_e32 v0, v0, v155; GFX9-NEXT: s_setpc_b64 s[30:31]56;57; GFX10PLUS-LABEL: v_constained_fadd_f32_fpexcept_ignore:58; GFX10PLUS: ; %bb.0:59; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)60; GFX10PLUS-NEXT: v_add_f32_e32 v0, v0, v161; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]62;63; GFX12-LABEL: v_constained_fadd_f32_fpexcept_ignore:64; GFX12: ; %bb.0:65; GFX12-NEXT: s_wait_loadcnt_dscnt 0x066; GFX12-NEXT: s_wait_expcnt 0x067; GFX12-NEXT: s_wait_samplecnt 0x068; GFX12-NEXT: s_wait_bvhcnt 0x069; GFX12-NEXT: s_wait_kmcnt 0x070; GFX12-NEXT: v_add_f32_e32 v0, v0, v171; GFX12-NEXT: s_setpc_b64 s[30:31]72; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_ignore:73; GCN-SDAG: ; %bb.0:74; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v176; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]77; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_ignore:78; GCN-GISEL: ; %bb.0:79; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v181; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]82 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")83 ret float %val84}85 86define float @v_constained_fadd_f32_fpexcept_maytrap(float %x, float %y) #0 {87; GFX9-LABEL: v_constained_fadd_f32_fpexcept_maytrap:88; GFX9: ; %bb.0:89; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)90; GFX9-NEXT: v_add_f32_e32 v0, v0, v191; GFX9-NEXT: s_setpc_b64 s[30:31]92;93; GFX10PLUS-LABEL: v_constained_fadd_f32_fpexcept_maytrap:94; GFX10PLUS: ; %bb.0:95; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)96; GFX10PLUS-NEXT: v_add_f32_e32 v0, v0, v197; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]98;99; GFX12-LABEL: v_constained_fadd_f32_fpexcept_maytrap:100; GFX12: ; %bb.0:101; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0102; GFX12-NEXT: s_wait_expcnt 0x0103; GFX12-NEXT: s_wait_samplecnt 0x0104; GFX12-NEXT: s_wait_bvhcnt 0x0105; GFX12-NEXT: s_wait_kmcnt 0x0106; GFX12-NEXT: v_add_f32_e32 v0, v0, v1107; GFX12-NEXT: s_setpc_b64 s[30:31]108; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_maytrap:109; GCN-SDAG: ; %bb.0:110; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)111; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v1112; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]113; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_maytrap:114; GCN-GISEL: ; %bb.0:115; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v1117; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]118 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")119 ret float %val120}121 122define <2 x float> @v_constained_fadd_v2f32_fpexcept_strict(<2 x float> %x, <2 x float> %y) #0 {123; GFX9-LABEL: v_constained_fadd_v2f32_fpexcept_strict:124; GFX9: ; %bb.0:125; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)126; GFX9-NEXT: v_add_f32_e32 v0, v0, v2127; GFX9-NEXT: v_add_f32_e32 v1, v1, v3128; GFX9-NEXT: s_setpc_b64 s[30:31]129;130; GFX10-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_strict:131; GFX10-SDAG: ; %bb.0:132; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)133; GFX10-SDAG-NEXT: v_add_f32_e32 v0, v0, v2134; GFX10-SDAG-NEXT: v_add_f32_e32 v1, v1, v3135; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]136;137; GFX10-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_strict:138; GFX10-GISEL: ; %bb.0:139; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)140; GFX10-GISEL-NEXT: v_add_f32_e32 v0, v0, v2141; GFX10-GISEL-NEXT: v_add_f32_e32 v1, v1, v3142; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]143;144; GFX11-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_strict:145; GFX11-SDAG: ; %bb.0:146; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)147; GFX11-SDAG-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3148; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31]149;150; GFX11-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_strict:151; GFX11-GISEL: ; %bb.0:152; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)153; GFX11-GISEL-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3154; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]155;156; GFX12-LABEL: v_constained_fadd_v2f32_fpexcept_strict:157; GFX12: ; %bb.0:158; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0159; GFX12-NEXT: s_wait_expcnt 0x0160; GFX12-NEXT: s_wait_samplecnt 0x0161; GFX12-NEXT: s_wait_bvhcnt 0x0162; GFX12-NEXT: s_wait_kmcnt 0x0163; GFX12-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3164; GFX12-NEXT: s_setpc_b64 s[30:31]165; GFX10-LABEL: v_constained_fadd_v2f32_fpexcept_strict:166; GFX10: ; %bb.0:167; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)168; GFX10-NEXT: v_add_f32_e32 v0, v0, v2169; GFX10-NEXT: v_add_f32_e32 v1, v1, v3170; GFX10-NEXT: s_setpc_b64 s[30:31]171; GFX11-LABEL: v_constained_fadd_v2f32_fpexcept_strict:172; GFX11: ; %bb.0:173; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)174; GFX11-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3175; GFX11-NEXT: s_setpc_b64 s[30:31]176; GCN-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_strict:177; GCN-SDAG: ; %bb.0:178; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)179; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v2180; GCN-SDAG-NEXT: v_add_f32_e32 v1, v1, v3181; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]182; GCN-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_strict:183; GCN-GISEL: ; %bb.0:184; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)185; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v2186; GCN-GISEL-NEXT: v_add_f32_e32 v1, v1, v3187; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]188 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")189 ret <2 x float> %val190}191 192define <2 x float> @v_constained_fadd_v2f32_fpexcept_ignore(<2 x float> %x, <2 x float> %y) #0 {193; GFX9-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:194; GFX9: ; %bb.0:195; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)196; GFX9-NEXT: v_add_f32_e32 v0, v0, v2197; GFX9-NEXT: v_add_f32_e32 v1, v1, v3198; GFX9-NEXT: s_setpc_b64 s[30:31]199;200; GFX10-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:201; GFX10-SDAG: ; %bb.0:202; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)203; GFX10-SDAG-NEXT: v_add_f32_e32 v0, v0, v2204; GFX10-SDAG-NEXT: v_add_f32_e32 v1, v1, v3205; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]206;207; GFX10-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:208; GFX10-GISEL: ; %bb.0:209; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)210; GFX10-GISEL-NEXT: v_add_f32_e32 v0, v0, v2211; GFX10-GISEL-NEXT: v_add_f32_e32 v1, v1, v3212; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]213;214; GFX11-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:215; GFX11-SDAG: ; %bb.0:216; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)217; GFX11-SDAG-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3218; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31]219;220; GFX11-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:221; GFX11-GISEL: ; %bb.0:222; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)223; GFX11-GISEL-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3224; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]225;226; GFX12-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:227; GFX12: ; %bb.0:228; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0229; GFX12-NEXT: s_wait_expcnt 0x0230; GFX12-NEXT: s_wait_samplecnt 0x0231; GFX12-NEXT: s_wait_bvhcnt 0x0232; GFX12-NEXT: s_wait_kmcnt 0x0233; GFX12-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3234; GFX12-NEXT: s_setpc_b64 s[30:31]235; GFX10-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:236; GFX10: ; %bb.0:237; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)238; GFX10-NEXT: v_add_f32_e32 v0, v0, v2239; GFX10-NEXT: v_add_f32_e32 v1, v1, v3240; GFX10-NEXT: s_setpc_b64 s[30:31]241; GFX11-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:242; GFX11: ; %bb.0:243; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)244; GFX11-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3245; GFX11-NEXT: s_setpc_b64 s[30:31]246; GCN-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:247; GCN-SDAG: ; %bb.0:248; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)249; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v2250; GCN-SDAG-NEXT: v_add_f32_e32 v1, v1, v3251; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]252; GCN-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_ignore:253; GCN-GISEL: ; %bb.0:254; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)255; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v2256; GCN-GISEL-NEXT: v_add_f32_e32 v1, v1, v3257; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]258 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")259 ret <2 x float> %val260}261 262define <2 x float> @v_constained_fadd_v2f32_fpexcept_maytrap(<2 x float> %x, <2 x float> %y) #0 {263; GFX9-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:264; GFX9: ; %bb.0:265; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)266; GFX9-NEXT: v_add_f32_e32 v0, v0, v2267; GFX9-NEXT: v_add_f32_e32 v1, v1, v3268; GFX9-NEXT: s_setpc_b64 s[30:31]269;270; GFX10-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:271; GFX10-SDAG: ; %bb.0:272; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)273; GFX10-SDAG-NEXT: v_add_f32_e32 v0, v0, v2274; GFX10-SDAG-NEXT: v_add_f32_e32 v1, v1, v3275; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]276;277; GFX10-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:278; GFX10-GISEL: ; %bb.0:279; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)280; GFX10-GISEL-NEXT: v_add_f32_e32 v0, v0, v2281; GFX10-GISEL-NEXT: v_add_f32_e32 v1, v1, v3282; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]283;284; GFX11-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:285; GFX11-SDAG: ; %bb.0:286; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)287; GFX11-SDAG-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3288; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31]289;290; GFX11-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:291; GFX11-GISEL: ; %bb.0:292; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)293; GFX11-GISEL-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3294; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]295;296; GFX12-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:297; GFX12: ; %bb.0:298; 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_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3304; GFX12-NEXT: s_setpc_b64 s[30:31]305; GFX10-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:306; GFX10: ; %bb.0:307; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)308; GFX10-NEXT: v_add_f32_e32 v0, v0, v2309; GFX10-NEXT: v_add_f32_e32 v1, v1, v3310; GFX10-NEXT: s_setpc_b64 s[30:31]311; GFX11-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:312; GFX11: ; %bb.0:313; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)314; GFX11-NEXT: v_dual_add_f32 v0, v0, v2 :: v_dual_add_f32 v1, v1, v3315; GFX11-NEXT: s_setpc_b64 s[30:31]316; GCN-SDAG-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:317; GCN-SDAG: ; %bb.0:318; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)319; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v2320; GCN-SDAG-NEXT: v_add_f32_e32 v1, v1, v3321; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]322; GCN-GISEL-LABEL: v_constained_fadd_v2f32_fpexcept_maytrap:323; GCN-GISEL: ; %bb.0:324; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)325; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v2326; GCN-GISEL-NEXT: v_add_f32_e32 v1, v1, v3327; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]328 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")329 ret <2 x float> %val330}331 332define <3 x float> @v_constained_fadd_v3f32_fpexcept_strict(<3 x float> %x, <3 x float> %y) #0 {333; GFX9-LABEL: v_constained_fadd_v3f32_fpexcept_strict:334; GFX9: ; %bb.0:335; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)336; GFX9-NEXT: v_add_f32_e32 v0, v0, v3337; GFX9-NEXT: v_add_f32_e32 v1, v1, v4338; GFX9-NEXT: v_add_f32_e32 v2, v2, v5339; GFX9-NEXT: s_setpc_b64 s[30:31]340;341; GFX10-SDAG-LABEL: v_constained_fadd_v3f32_fpexcept_strict:342; GFX10-SDAG: ; %bb.0:343; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)344; GFX10-SDAG-NEXT: v_add_f32_e32 v0, v0, v3345; GFX10-SDAG-NEXT: v_add_f32_e32 v1, v1, v4346; GFX10-SDAG-NEXT: v_add_f32_e32 v2, v2, v5347; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]348;349; GFX10-GISEL-LABEL: v_constained_fadd_v3f32_fpexcept_strict:350; GFX10-GISEL: ; %bb.0:351; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)352; GFX10-GISEL-NEXT: v_add_f32_e32 v0, v0, v3353; GFX10-GISEL-NEXT: v_add_f32_e32 v1, v1, v4354; GFX10-GISEL-NEXT: v_add_f32_e32 v2, v2, v5355; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]356;357; GFX11-SDAG-LABEL: v_constained_fadd_v3f32_fpexcept_strict:358; GFX11-SDAG: ; %bb.0:359; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)360; GFX11-SDAG-NEXT: v_dual_add_f32 v0, v0, v3 :: v_dual_add_f32 v1, v1, v4361; GFX11-SDAG-NEXT: v_add_f32_e32 v2, v2, v5362; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31]363;364; GFX11-GISEL-LABEL: v_constained_fadd_v3f32_fpexcept_strict:365; GFX11-GISEL: ; %bb.0:366; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)367; GFX11-GISEL-NEXT: v_dual_add_f32 v0, v0, v3 :: v_dual_add_f32 v1, v1, v4368; GFX11-GISEL-NEXT: v_add_f32_e32 v2, v2, v5369; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]370;371; GFX12-LABEL: v_constained_fadd_v3f32_fpexcept_strict:372; GFX12: ; %bb.0:373; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0374; GFX12-NEXT: s_wait_expcnt 0x0375; GFX12-NEXT: s_wait_samplecnt 0x0376; GFX12-NEXT: s_wait_bvhcnt 0x0377; GFX12-NEXT: s_wait_kmcnt 0x0378; GFX12-NEXT: v_dual_add_f32 v0, v0, v3 :: v_dual_add_f32 v1, v1, v4379; GFX12-NEXT: v_add_f32_e32 v2, v2, v5380; GFX12-NEXT: s_setpc_b64 s[30:31]381; GFX10-LABEL: v_constained_fadd_v3f32_fpexcept_strict:382; GFX10: ; %bb.0:383; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)384; GFX10-NEXT: v_add_f32_e32 v0, v0, v3385; GFX10-NEXT: v_add_f32_e32 v1, v1, v4386; GFX10-NEXT: v_add_f32_e32 v2, v2, v5387; GFX10-NEXT: s_setpc_b64 s[30:31]388; GFX11-LABEL: v_constained_fadd_v3f32_fpexcept_strict:389; GFX11: ; %bb.0:390; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)391; GFX11-NEXT: v_dual_add_f32 v0, v0, v3 :: v_dual_add_f32 v1, v1, v4392; GFX11-NEXT: v_add_f32_e32 v2, v2, v5393; GFX11-NEXT: s_setpc_b64 s[30:31]394; GCN-SDAG-LABEL: v_constained_fadd_v3f32_fpexcept_strict:395; GCN-SDAG: ; %bb.0:396; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)397; GCN-SDAG-NEXT: v_add_f32_e32 v0, v0, v3398; GCN-SDAG-NEXT: v_add_f32_e32 v1, v1, v4399; GCN-SDAG-NEXT: v_add_f32_e32 v2, v2, v5400; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]401; GCN-GISEL-LABEL: v_constained_fadd_v3f32_fpexcept_strict:402; GCN-GISEL: ; %bb.0:403; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)404; GCN-GISEL-NEXT: v_add_f32_e32 v0, v0, v3405; GCN-GISEL-NEXT: v_add_f32_e32 v1, v1, v4406; GCN-GISEL-NEXT: v_add_f32_e32 v2, v2, v5407; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]408 %val = call <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float> %x, <3 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")409 ret <3 x float> %val410}411 412define amdgpu_ps float @s_constained_fadd_f32_fpexcept_strict(float inreg %x, float inreg %y) #0 {413; GFX9-LABEL: s_constained_fadd_f32_fpexcept_strict:414; GFX9: ; %bb.0:415; GFX9-NEXT: v_mov_b32_e32 v0, s3416; GFX9-NEXT: v_add_f32_e32 v0, s2, v0417; GFX9-NEXT: ; return to shader part epilog418;419; GFX10PLUS-LABEL: s_constained_fadd_f32_fpexcept_strict:420; GFX10PLUS: ; %bb.0:421; GFX10PLUS-NEXT: v_add_f32_e64 v0, s2, s3422; GFX10PLUS-NEXT: ; return to shader part epilog423;424; GFX12-LABEL: s_constained_fadd_f32_fpexcept_strict:425; GFX12: ; %bb.0:426; GFX12-NEXT: s_add_f32 s0, s2, s3427; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_3)428; GFX12-NEXT: v_mov_b32_e32 v0, s0429; GFX12-NEXT: ; return to shader part epilog430; GCN-SDAG-LABEL: s_constained_fadd_f32_fpexcept_strict:431; GCN-SDAG: ; %bb.0:432; GCN-SDAG-NEXT: v_mov_b32_e32 v0, s3433; GCN-SDAG-NEXT: v_add_f32_e32 v0, s2, v0434; GCN-SDAG-NEXT: ; return to shader part epilog435; GCN-GISEL-LABEL: s_constained_fadd_f32_fpexcept_strict:436; GCN-GISEL: ; %bb.0:437; GCN-GISEL-NEXT: v_mov_b32_e32 v0, s3438; GCN-GISEL-NEXT: v_add_f32_e32 v0, s2, v0439; GCN-GISEL-NEXT: ; return to shader part epilog440 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")441 ret float %val442}443 444define float @v_constained_fadd_f32_fpexcept_strict_fabs_lhs(float %x, float %y) #0 {445; GFX9-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_lhs:446; GFX9: ; %bb.0:447; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)448; GFX9-NEXT: v_add_f32_e64 v0, |v0|, v1449; GFX9-NEXT: s_setpc_b64 s[30:31]450;451; GFX10PLUS-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_lhs:452; GFX10PLUS: ; %bb.0:453; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)454; GFX10PLUS-NEXT: v_add_f32_e64 v0, |v0|, v1455; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]456;457; GFX12-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_lhs:458; GFX12: ; %bb.0:459; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0460; GFX12-NEXT: s_wait_expcnt 0x0461; GFX12-NEXT: s_wait_samplecnt 0x0462; GFX12-NEXT: s_wait_bvhcnt 0x0463; GFX12-NEXT: s_wait_kmcnt 0x0464; GFX12-NEXT: v_add_f32_e64 v0, |v0|, v1465; GFX12-NEXT: s_setpc_b64 s[30:31]466; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_lhs:467; GCN-SDAG: ; %bb.0:468; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)469; GCN-SDAG-NEXT: v_add_f32_e64 v0, |v0|, v1470; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]471; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_lhs:472; GCN-GISEL: ; %bb.0:473; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)474; GCN-GISEL-NEXT: v_add_f32_e64 v0, |v0|, v1475; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]476 %fabs.x = call float @llvm.fabs.f32(float %x) #0477 %val = call float @llvm.experimental.constrained.fadd.f32(float %fabs.x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")478 ret float %val479}480 481define float @v_constained_fadd_f32_fpexcept_strict_fabs_rhs(float %x, float %y) #0 {482; GFX9-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_rhs:483; GFX9: ; %bb.0:484; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)485; GFX9-NEXT: v_add_f32_e64 v0, v0, |v1|486; GFX9-NEXT: s_setpc_b64 s[30:31]487;488; GFX10PLUS-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_rhs:489; GFX10PLUS: ; %bb.0:490; GFX10PLUS-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)491; GFX10PLUS-NEXT: v_add_f32_e64 v0, v0, |v1|492; GFX10PLUS-NEXT: s_setpc_b64 s[30:31]493;494; GFX12-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_rhs:495; GFX12: ; %bb.0:496; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0497; GFX12-NEXT: s_wait_expcnt 0x0498; GFX12-NEXT: s_wait_samplecnt 0x0499; GFX12-NEXT: s_wait_bvhcnt 0x0500; GFX12-NEXT: s_wait_kmcnt 0x0501; GFX12-NEXT: v_add_f32_e64 v0, v0, |v1|502; GFX12-NEXT: s_setpc_b64 s[30:31]503; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_rhs:504; GCN-SDAG: ; %bb.0:505; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)506; GCN-SDAG-NEXT: v_add_f32_e64 v0, v0, |v1|507; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]508; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fabs_rhs:509; GCN-GISEL: ; %bb.0:510; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)511; GCN-GISEL-NEXT: v_add_f32_e64 v0, v0, |v1|512; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]513 %fabs.y = call float @llvm.fabs.f32(float %y) #0514 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %fabs.y, metadata !"round.tonearest", metadata !"fpexcept.strict")515 ret float %val516}517 518define float @v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs(float %x, float %y) #0 {519; GCN-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:520; GCN-SDAG: ; %bb.0:521; GCN-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)522; GCN-SDAG-NEXT: v_sub_f32_e64 v0, v1, |v0|523; GCN-SDAG-NEXT: s_setpc_b64 s[30:31]524;525; GCN-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:526; GCN-GISEL: ; %bb.0:527; GCN-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)528; GCN-GISEL-NEXT: v_add_f32_e64 v0, -|v0|, v1529; GCN-GISEL-NEXT: s_setpc_b64 s[30:31]530;531; GFX9-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:532; GFX9-SDAG: ; %bb.0:533; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)534; GFX9-SDAG-NEXT: v_sub_f32_e64 v0, v1, |v0|535; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31]536;537; GFX9-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:538; GFX9-GISEL: ; %bb.0:539; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)540; GFX9-GISEL-NEXT: v_add_f32_e64 v0, -|v0|, v1541; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31]542;543; GFX10-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:544; GFX10-SDAG: ; %bb.0:545; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)546; GFX10-SDAG-NEXT: v_sub_f32_e64 v0, v1, |v0|547; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31]548;549; GFX10-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:550; GFX10-GISEL: ; %bb.0:551; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)552; GFX10-GISEL-NEXT: v_add_f32_e64 v0, -|v0|, v1553; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]554;555; GFX11-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:556; GFX11-SDAG: ; %bb.0:557; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)558; GFX11-SDAG-NEXT: v_sub_f32_e64 v0, v1, |v0|559; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31]560;561; GFX11-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:562; GFX11-GISEL: ; %bb.0:563; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)564; GFX11-GISEL-NEXT: v_add_f32_e64 v0, -|v0|, v1565; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31]566;567; GFX12-SDAG-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:568; GFX12-SDAG: ; %bb.0:569; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0570; GFX12-SDAG-NEXT: s_wait_expcnt 0x0571; GFX12-SDAG-NEXT: s_wait_samplecnt 0x0572; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0573; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0574; GFX12-SDAG-NEXT: v_sub_f32_e64 v0, v1, |v0|575; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]576;577; GFX12-GISEL-LABEL: v_constained_fadd_f32_fpexcept_strict_fneg_fabs_lhs:578; GFX12-GISEL: ; %bb.0:579; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0580; GFX12-GISEL-NEXT: s_wait_expcnt 0x0581; GFX12-GISEL-NEXT: s_wait_samplecnt 0x0582; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0583; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0584; GFX12-GISEL-NEXT: v_add_f32_e64 v0, -|v0|, v1585; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]586 %fabs.x = call float @llvm.fabs.f32(float %x) #0587 %neg.fabs.x = fneg float %fabs.x588 %val = call float @llvm.experimental.constrained.fadd.f32(float %neg.fabs.x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")589 ret float %val590}591 592declare float @llvm.fabs.f32(float)593declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)594declare <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float>, <2 x float>, metadata, metadata)595declare <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float>, <3 x float>, metadata, metadata)596 597attributes #0 = { strictfp }598