brintos

brintos / llvm-project-archived public Read only

0
0
Text · 37.5 KiB · 0b09cab Raw
1063 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s3; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefix=GFX8 %s4; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s5; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s6; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s7; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s8 9define float @v_fma_f32(float %x, float %y, float %z) {10; GFX6-LABEL: v_fma_f32:11; GFX6:       ; %bb.0:12; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v214; GFX6-NEXT:    s_setpc_b64 s[30:31]15;16; GFX8-LABEL: v_fma_f32:17; GFX8:       ; %bb.0:18; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)19; GFX8-NEXT:    v_fma_f32 v0, v0, v1, v220; GFX8-NEXT:    s_setpc_b64 s[30:31]21;22; GFX9-LABEL: v_fma_f32:23; GFX9:       ; %bb.0:24; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)25; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v226; GFX9-NEXT:    s_setpc_b64 s[30:31]27;28; GFX10-LABEL: v_fma_f32:29; GFX10:       ; %bb.0:30; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)31; GFX10-NEXT:    v_fma_f32 v0, v0, v1, v232; GFX10-NEXT:    s_setpc_b64 s[30:31]33;34; GFX11-LABEL: v_fma_f32:35; GFX11:       ; %bb.0:36; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)37; GFX11-NEXT:    v_fma_f32 v0, v0, v1, v238; GFX11-NEXT:    s_setpc_b64 s[30:31]39  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)40  ret float %fma41}42 43define <2 x float> @v_fma_v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z) {44; GFX6-LABEL: v_fma_v2f32:45; GFX6:       ; %bb.0:46; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)47; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v448; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v549; GFX6-NEXT:    s_setpc_b64 s[30:31]50;51; GFX8-LABEL: v_fma_v2f32:52; GFX8:       ; %bb.0:53; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)54; GFX8-NEXT:    v_fma_f32 v0, v0, v2, v455; GFX8-NEXT:    v_fma_f32 v1, v1, v3, v556; GFX8-NEXT:    s_setpc_b64 s[30:31]57;58; GFX9-LABEL: v_fma_v2f32:59; GFX9:       ; %bb.0:60; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)61; GFX9-NEXT:    v_fma_f32 v0, v0, v2, v462; GFX9-NEXT:    v_fma_f32 v1, v1, v3, v563; GFX9-NEXT:    s_setpc_b64 s[30:31]64;65; GFX10-LABEL: v_fma_v2f32:66; GFX10:       ; %bb.0:67; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; GFX10-NEXT:    v_fma_f32 v0, v0, v2, v469; GFX10-NEXT:    v_fma_f32 v1, v1, v3, v570; GFX10-NEXT:    s_setpc_b64 s[30:31]71;72; GFX11-LABEL: v_fma_v2f32:73; GFX11:       ; %bb.0:74; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GFX11-NEXT:    v_fma_f32 v0, v0, v2, v476; GFX11-NEXT:    v_fma_f32 v1, v1, v3, v577; GFX11-NEXT:    s_setpc_b64 s[30:31]78  %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z)79  ret <2 x float> %fma80}81 82define half @v_fma_f16(half %x, half %y, half %z) {83; GFX6-LABEL: v_fma_f16:84; GFX6:       ; %bb.0:85; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)86; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v087; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v188; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v289; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v290; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v091; GFX6-NEXT:    s_setpc_b64 s[30:31]92;93; GFX8-LABEL: v_fma_f16:94; GFX8:       ; %bb.0:95; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)96; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v297; GFX8-NEXT:    s_setpc_b64 s[30:31]98;99; GFX9-LABEL: v_fma_f16:100; GFX9:       ; %bb.0:101; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)102; GFX9-NEXT:    v_fma_f16 v0, v0, v1, v2103; GFX9-NEXT:    s_setpc_b64 s[30:31]104;105; GFX10-LABEL: v_fma_f16:106; GFX10:       ; %bb.0:107; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)108; GFX10-NEXT:    v_fma_f16 v0, v0, v1, v2109; GFX10-NEXT:    s_setpc_b64 s[30:31]110;111; GFX11-TRUE16-LABEL: v_fma_f16:112; GFX11-TRUE16:       ; %bb.0:113; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)114; GFX11-TRUE16-NEXT:    v_fmac_f16_e32 v2.l, v0.l, v1.l115; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v2116; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]117;118; GFX11-FAKE16-LABEL: v_fma_f16:119; GFX11-FAKE16:       ; %bb.0:120; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)121; GFX11-FAKE16-NEXT:    v_fma_f16 v0, v0, v1, v2122; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]123  %fma = call half @llvm.fma.f16(half %x, half %y, half %z)124  ret half %fma125}126 127define half @v_fma_f16_fneg_lhs(half %x, half %y, half %z) {128; GFX6-LABEL: v_fma_f16_fneg_lhs:129; GFX6:       ; %bb.0:130; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)131; GFX6-NEXT:    v_cvt_f32_f16_e64 v0, -v0132; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1133; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2134; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2135; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0136; GFX6-NEXT:    s_setpc_b64 s[30:31]137;138; GFX8-LABEL: v_fma_f16_fneg_lhs:139; GFX8:       ; %bb.0:140; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)141; GFX8-NEXT:    v_fma_f16 v0, -v0, v1, v2142; GFX8-NEXT:    s_setpc_b64 s[30:31]143;144; GFX9-LABEL: v_fma_f16_fneg_lhs:145; GFX9:       ; %bb.0:146; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)147; GFX9-NEXT:    v_fma_f16 v0, -v0, v1, v2148; GFX9-NEXT:    s_setpc_b64 s[30:31]149;150; GFX10-LABEL: v_fma_f16_fneg_lhs:151; GFX10:       ; %bb.0:152; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)153; GFX10-NEXT:    v_fma_f16 v0, -v0, v1, v2154; GFX10-NEXT:    s_setpc_b64 s[30:31]155;156; GFX11-TRUE16-LABEL: v_fma_f16_fneg_lhs:157; GFX11-TRUE16:       ; %bb.0:158; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, -v0.l, v1.l, v2.l160; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]161;162; GFX11-FAKE16-LABEL: v_fma_f16_fneg_lhs:163; GFX11-FAKE16:       ; %bb.0:164; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; GFX11-FAKE16-NEXT:    v_fma_f16 v0, -v0, v1, v2166; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]167  %neg.x = fneg half %x168  %fma = call half @llvm.fma.f16(half %neg.x, half %y, half %z)169  ret half %fma170}171 172define half @v_fma_f16_fneg_rhs(half %x, half %y, half %z) {173; GFX6-LABEL: v_fma_f16_fneg_rhs:174; GFX6:       ; %bb.0:175; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)176; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0177; GFX6-NEXT:    v_cvt_f32_f16_e64 v1, -v1178; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2179; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2180; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0181; GFX6-NEXT:    s_setpc_b64 s[30:31]182;183; GFX8-LABEL: v_fma_f16_fneg_rhs:184; GFX8:       ; %bb.0:185; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)186; GFX8-NEXT:    v_fma_f16 v0, v0, -v1, v2187; GFX8-NEXT:    s_setpc_b64 s[30:31]188;189; GFX9-LABEL: v_fma_f16_fneg_rhs:190; GFX9:       ; %bb.0:191; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)192; GFX9-NEXT:    v_fma_f16 v0, v0, -v1, v2193; GFX9-NEXT:    s_setpc_b64 s[30:31]194;195; GFX10-LABEL: v_fma_f16_fneg_rhs:196; GFX10:       ; %bb.0:197; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)198; GFX10-NEXT:    v_fma_f16 v0, v0, -v1, v2199; GFX10-NEXT:    s_setpc_b64 s[30:31]200;201; GFX11-TRUE16-LABEL: v_fma_f16_fneg_rhs:202; GFX11-TRUE16:       ; %bb.0:203; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)204; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, -v1.l, v2.l205; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]206;207; GFX11-FAKE16-LABEL: v_fma_f16_fneg_rhs:208; GFX11-FAKE16:       ; %bb.0:209; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)210; GFX11-FAKE16-NEXT:    v_fma_f16 v0, v0, -v1, v2211; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]212  %neg.y = fneg half %y213  %fma = call half @llvm.fma.f16(half %x, half %neg.y, half %z)214  ret half %fma215}216 217define half @v_fma_f16_fneg_add(half %x, half %y, half %z) {218; GFX6-LABEL: v_fma_f16_fneg_add:219; GFX6:       ; %bb.0:220; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)221; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0222; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1223; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -v2224; GFX6-NEXT:    v_fma_f32 v0, v0, v1, v2225; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0226; GFX6-NEXT:    s_setpc_b64 s[30:31]227;228; GFX8-LABEL: v_fma_f16_fneg_add:229; GFX8:       ; %bb.0:230; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)231; GFX8-NEXT:    v_fma_f16 v0, v0, v1, -v2232; GFX8-NEXT:    s_setpc_b64 s[30:31]233;234; GFX9-LABEL: v_fma_f16_fneg_add:235; GFX9:       ; %bb.0:236; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)237; GFX9-NEXT:    v_fma_f16 v0, v0, v1, -v2238; GFX9-NEXT:    s_setpc_b64 s[30:31]239;240; GFX10-LABEL: v_fma_f16_fneg_add:241; GFX10:       ; %bb.0:242; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)243; GFX10-NEXT:    v_fma_f16 v0, v0, v1, -v2244; GFX10-NEXT:    s_setpc_b64 s[30:31]245;246; GFX11-TRUE16-LABEL: v_fma_f16_fneg_add:247; GFX11-TRUE16:       ; %bb.0:248; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)249; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, v1.l, -v2.l250; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]251;252; GFX11-FAKE16-LABEL: v_fma_f16_fneg_add:253; GFX11-FAKE16:       ; %bb.0:254; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)255; GFX11-FAKE16-NEXT:    v_fma_f16 v0, v0, v1, -v2256; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]257  %neg.z = fneg half %z258  %fma = call half @llvm.fma.f16(half %x, half %y, half %neg.z)259  ret half %fma260}261 262define <2 x half> @v_fma_v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z) {263; GFX6-LABEL: v_fma_v2f16:264; GFX6:       ; %bb.0:265; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)266; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0267; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2268; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4269; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1270; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3271; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5272; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v4273; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0274; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v5275; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1276; GFX6-NEXT:    s_setpc_b64 s[30:31]277;278; GFX8-LABEL: v_fma_v2f16:279; GFX8:       ; %bb.0:280; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0282; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1283; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2284; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2285; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5286; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v1287; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1288; GFX8-NEXT:    s_setpc_b64 s[30:31]289;290; GFX9-LABEL: v_fma_v2f16:291; GFX9:       ; %bb.0:292; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)293; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2294; GFX9-NEXT:    s_setpc_b64 s[30:31]295;296; GFX10-LABEL: v_fma_v2f16:297; GFX10:       ; %bb.0:298; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)299; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2300; GFX10-NEXT:    s_setpc_b64 s[30:31]301;302; GFX11-LABEL: v_fma_v2f16:303; GFX11:       ; %bb.0:304; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)305; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v2306; GFX11-NEXT:    s_setpc_b64 s[30:31]307  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z)308  ret <2 x half> %fma309}310 311define <2 x half> @v_fma_v2f16_fneg_lhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {312; GFX6-LABEL: v_fma_v2f16_fneg_lhs:313; GFX6:       ; %bb.0:314; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)315; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1316; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0317; GFX6-NEXT:    v_or_b32_e32 v0, v1, v0318; GFX6-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0319; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v0320; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0321; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2322; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4323; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1324; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3325; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5326; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v4327; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0328; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v5329; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1330; GFX6-NEXT:    s_setpc_b64 s[30:31]331;332; GFX8-LABEL: v_fma_v2f16_fneg_lhs:333; GFX8:       ; %bb.0:334; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)335; GFX8-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0336; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0337; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1338; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2339; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2340; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5341; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v1342; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1343; GFX8-NEXT:    s_setpc_b64 s[30:31]344;345; GFX9-LABEL: v_fma_v2f16_fneg_lhs:346; GFX9:       ; %bb.0:347; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)348; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0]349; GFX9-NEXT:    s_setpc_b64 s[30:31]350;351; GFX10-LABEL: v_fma_v2f16_fneg_lhs:352; GFX10:       ; %bb.0:353; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)354; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0]355; GFX10-NEXT:    s_setpc_b64 s[30:31]356;357; GFX11-LABEL: v_fma_v2f16_fneg_lhs:358; GFX11:       ; %bb.0:359; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)360; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0]361; GFX11-NEXT:    s_setpc_b64 s[30:31]362  %x.fneg = fneg <2 x half> %x363  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y, <2 x half> %z)364  ret <2 x half> %fma365}366 367define <2 x half> @v_fma_v2f16_fneg_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {368; GFX6-LABEL: v_fma_v2f16_fneg_rhs:369; GFX6:       ; %bb.0:370; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)371; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3372; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2373; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2374; GFX6-NEXT:    v_xor_b32_e32 v2, 0x80008000, v2375; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2376; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0377; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2378; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4379; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1380; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3381; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5382; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v4383; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0384; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v5385; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1386; GFX6-NEXT:    s_setpc_b64 s[30:31]387;388; GFX8-LABEL: v_fma_v2f16_fneg_rhs:389; GFX8:       ; %bb.0:390; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)391; GFX8-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1392; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0393; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1394; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2395; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2396; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5397; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v1398; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1399; GFX8-NEXT:    s_setpc_b64 s[30:31]400;401; GFX9-LABEL: v_fma_v2f16_fneg_rhs:402; GFX9:       ; %bb.0:403; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)404; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0]405; GFX9-NEXT:    s_setpc_b64 s[30:31]406;407; GFX10-LABEL: v_fma_v2f16_fneg_rhs:408; GFX10:       ; %bb.0:409; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)410; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0]411; GFX10-NEXT:    s_setpc_b64 s[30:31]412;413; GFX11-LABEL: v_fma_v2f16_fneg_rhs:414; GFX11:       ; %bb.0:415; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)416; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0]417; GFX11-NEXT:    s_setpc_b64 s[30:31]418  %y.fneg = fneg <2 x half> %y419  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y.fneg, <2 x half> %z)420  ret <2 x half> %fma421}422 423define <2 x half> @v_fma_v2f16_fneg_lhs_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) {424; GFX6-LABEL: v_fma_v2f16_fneg_lhs_rhs:425; GFX6:       ; %bb.0:426; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)427; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0428; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2429; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4430; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1431; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3432; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5433; GFX6-NEXT:    v_fma_f32 v0, v0, v2, v4434; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0435; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v5436; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1437; GFX6-NEXT:    s_setpc_b64 s[30:31]438;439; GFX8-LABEL: v_fma_v2f16_fneg_lhs_rhs:440; GFX8:       ; %bb.0:441; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)442; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v0443; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v1444; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v2445; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2446; GFX8-NEXT:    v_fma_f16 v1, v3, v4, v5447; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v1448; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1449; GFX8-NEXT:    s_setpc_b64 s[30:31]450;451; GFX9-LABEL: v_fma_v2f16_fneg_lhs_rhs:452; GFX9:       ; %bb.0:453; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)454; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v1, v2455; GFX9-NEXT:    s_setpc_b64 s[30:31]456;457; GFX10-LABEL: v_fma_v2f16_fneg_lhs_rhs:458; GFX10:       ; %bb.0:459; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)460; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v1, v2461; GFX10-NEXT:    s_setpc_b64 s[30:31]462;463; GFX11-LABEL: v_fma_v2f16_fneg_lhs_rhs:464; GFX11:       ; %bb.0:465; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)466; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v1, v2467; GFX11-NEXT:    s_setpc_b64 s[30:31]468  %x.fneg = fneg <2 x half> %x469  %y.fneg = fneg <2 x half> %y470  %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y.fneg, <2 x half> %z)471  ret <2 x half> %fma472}473 474define <3 x half> @v_fma_v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z) {475; GFX6-LABEL: v_fma_v3f16:476; GFX6:       ; %bb.0:477; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)478; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0479; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3480; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v6481; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1482; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2483; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5484; GFX6-NEXT:    v_fma_f32 v0, v0, v3, v6485; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v4486; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v7487; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v8488; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0489; GFX6-NEXT:    v_fma_f32 v1, v1, v3, v4490; GFX6-NEXT:    v_fma_f32 v2, v2, v5, v6491; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1492; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2493; GFX6-NEXT:    s_setpc_b64 s[30:31]494;495; GFX8-LABEL: v_fma_v3f16:496; GFX8:       ; %bb.0:497; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)498; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v0499; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v2500; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v4501; GFX8-NEXT:    v_fma_f16 v0, v0, v2, v4502; GFX8-NEXT:    v_fma_f16 v2, v6, v7, v8503; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v2504; GFX8-NEXT:    v_fma_f16 v1, v1, v3, v5505; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2506; GFX8-NEXT:    s_setpc_b64 s[30:31]507;508; GFX9-LABEL: v_fma_v3f16:509; GFX9:       ; %bb.0:510; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)511; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4512; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5513; GFX9-NEXT:    s_setpc_b64 s[30:31]514;515; GFX10-LABEL: v_fma_v3f16:516; GFX10:       ; %bb.0:517; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)518; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4519; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5520; GFX10-NEXT:    s_setpc_b64 s[30:31]521;522; GFX11-LABEL: v_fma_v3f16:523; GFX11:       ; %bb.0:524; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)525; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v2, v4526; GFX11-NEXT:    v_pk_fma_f16 v1, v1, v3, v5527; GFX11-NEXT:    s_setpc_b64 s[30:31]528  %fma = call <3 x half> @llvm.fma.v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z)529  ret <3 x half> %fma530}531 532define <4 x half> @v_fma_v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z) {533; GFX6-LABEL: v_fma_v4f16:534; GFX6:       ; %bb.0:535; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)536; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0537; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4538; GFX6-NEXT:    v_cvt_f32_f16_e32 v8, v8539; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1540; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v5541; GFX6-NEXT:    v_cvt_f32_f16_e32 v9, v9542; GFX6-NEXT:    v_fma_f32 v0, v0, v4, v8543; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2544; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v6545; GFX6-NEXT:    v_fma_f32 v1, v1, v5, v9546; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v10547; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3548; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v7549; GFX6-NEXT:    v_cvt_f32_f16_e32 v7, v11550; GFX6-NEXT:    v_fma_f32 v2, v2, v4, v5551; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0552; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1553; GFX6-NEXT:    v_fma_f32 v3, v3, v6, v7554; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2555; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3556; GFX6-NEXT:    s_setpc_b64 s[30:31]557;558; GFX8-LABEL: v_fma_v4f16:559; GFX8:       ; %bb.0:560; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)561; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v0562; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v2563; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 16, v4564; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v1565; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 16, v3566; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 16, v5567; GFX8-NEXT:    v_fma_f16 v0, v0, v2, v4568; GFX8-NEXT:    v_fma_f16 v2, v6, v8, v10569; GFX8-NEXT:    v_fma_f16 v1, v1, v3, v5570; GFX8-NEXT:    v_fma_f16 v3, v7, v9, v11571; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v2572; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2573; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v3574; GFX8-NEXT:    v_or_b32_e32 v1, v1, v2575; GFX8-NEXT:    s_setpc_b64 s[30:31]576;577; GFX9-LABEL: v_fma_v4f16:578; GFX9:       ; %bb.0:579; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)580; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4581; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5582; GFX9-NEXT:    s_setpc_b64 s[30:31]583;584; GFX10-LABEL: v_fma_v4f16:585; GFX10:       ; %bb.0:586; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)587; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4588; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5589; GFX10-NEXT:    s_setpc_b64 s[30:31]590;591; GFX11-LABEL: v_fma_v4f16:592; GFX11:       ; %bb.0:593; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)594; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v2, v4595; GFX11-NEXT:    v_pk_fma_f16 v1, v1, v3, v5596; GFX11-NEXT:    s_setpc_b64 s[30:31]597  %fma = call <4 x half> @llvm.fma.v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z)598  ret <4 x half> %fma599}600 601define double @v_fma_f64(double %x, double %y, double %z) {602; GFX6-LABEL: v_fma_f64:603; GFX6:       ; %bb.0:604; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)605; GFX6-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]606; GFX6-NEXT:    s_setpc_b64 s[30:31]607;608; GFX8-LABEL: v_fma_f64:609; GFX8:       ; %bb.0:610; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)611; GFX8-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]612; GFX8-NEXT:    s_setpc_b64 s[30:31]613;614; GFX9-LABEL: v_fma_f64:615; GFX9:       ; %bb.0:616; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)617; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]618; GFX9-NEXT:    s_setpc_b64 s[30:31]619;620; GFX10-LABEL: v_fma_f64:621; GFX10:       ; %bb.0:622; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)623; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]624; GFX10-NEXT:    s_setpc_b64 s[30:31]625;626; GFX11-LABEL: v_fma_f64:627; GFX11:       ; %bb.0:628; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)629; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]630; GFX11-NEXT:    s_setpc_b64 s[30:31]631  %fma = call double @llvm.fma.f64(double %x, double %y, double %z)632  ret double %fma633}634 635define double @v_fma_f64_fneg_all(double %x, double %y, double %z) {636; GFX6-LABEL: v_fma_f64_fneg_all:637; GFX6:       ; %bb.0:638; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)639; GFX6-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]640; GFX6-NEXT:    s_setpc_b64 s[30:31]641;642; GFX8-LABEL: v_fma_f64_fneg_all:643; GFX8:       ; %bb.0:644; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)645; GFX8-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]646; GFX8-NEXT:    s_setpc_b64 s[30:31]647;648; GFX9-LABEL: v_fma_f64_fneg_all:649; GFX9:       ; %bb.0:650; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)651; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]652; GFX9-NEXT:    s_setpc_b64 s[30:31]653;654; GFX10-LABEL: v_fma_f64_fneg_all:655; GFX10:       ; %bb.0:656; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)657; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]658; GFX10-NEXT:    s_setpc_b64 s[30:31]659;660; GFX11-LABEL: v_fma_f64_fneg_all:661; GFX11:       ; %bb.0:662; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)663; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]664; GFX11-NEXT:    s_setpc_b64 s[30:31]665  %neg.x = fneg double %x666  %neg.y = fneg double %y667  %neg.z = fneg double %z668  %fma = call double @llvm.fma.f64(double %neg.x, double %neg.y, double %neg.z)669  ret double %fma670}671 672define <2 x double> @v_fma_v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z) {673; GFX6-LABEL: v_fma_v2f64:674; GFX6:       ; %bb.0:675; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)676; GFX6-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]677; GFX6-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]678; GFX6-NEXT:    s_setpc_b64 s[30:31]679;680; GFX8-LABEL: v_fma_v2f64:681; GFX8:       ; %bb.0:682; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)683; GFX8-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]684; GFX8-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]685; GFX8-NEXT:    s_setpc_b64 s[30:31]686;687; GFX9-LABEL: v_fma_v2f64:688; GFX9:       ; %bb.0:689; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)690; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]691; GFX9-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]692; GFX9-NEXT:    s_setpc_b64 s[30:31]693;694; GFX10-LABEL: v_fma_v2f64:695; GFX10:       ; %bb.0:696; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)697; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]698; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]699; GFX10-NEXT:    s_setpc_b64 s[30:31]700;701; GFX11-LABEL: v_fma_v2f64:702; GFX11:       ; %bb.0:703; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)704; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]705; GFX11-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]706; GFX11-NEXT:    s_setpc_b64 s[30:31]707  %fma = call <2 x double> @llvm.fma.v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z)708  ret <2 x double> %fma709}710 711define float @v_fma_f32_fabs_lhs(float %x, float %y, float %z) {712; GFX6-LABEL: v_fma_f32_fabs_lhs:713; GFX6:       ; %bb.0:714; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)715; GFX6-NEXT:    v_fma_f32 v0, |v0|, v1, v2716; GFX6-NEXT:    s_setpc_b64 s[30:31]717;718; GFX8-LABEL: v_fma_f32_fabs_lhs:719; GFX8:       ; %bb.0:720; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)721; GFX8-NEXT:    v_fma_f32 v0, |v0|, v1, v2722; GFX8-NEXT:    s_setpc_b64 s[30:31]723;724; GFX9-LABEL: v_fma_f32_fabs_lhs:725; GFX9:       ; %bb.0:726; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)727; GFX9-NEXT:    v_fma_f32 v0, |v0|, v1, v2728; GFX9-NEXT:    s_setpc_b64 s[30:31]729;730; GFX10-LABEL: v_fma_f32_fabs_lhs:731; GFX10:       ; %bb.0:732; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)733; GFX10-NEXT:    v_fma_f32 v0, |v0|, v1, v2734; GFX10-NEXT:    s_setpc_b64 s[30:31]735;736; GFX11-LABEL: v_fma_f32_fabs_lhs:737; GFX11:       ; %bb.0:738; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)739; GFX11-NEXT:    v_fma_f32 v0, |v0|, v1, v2740; GFX11-NEXT:    s_setpc_b64 s[30:31]741  %fabs.x = call float @llvm.fabs.f32(float %x)742  %fma = call float @llvm.fma.f32(float %fabs.x, float %y, float %z)743  ret float %fma744}745 746define float @v_fma_f32_fabs_rhs(float %x, float %y, float %z) {747; GFX6-LABEL: v_fma_f32_fabs_rhs:748; GFX6:       ; %bb.0:749; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)750; GFX6-NEXT:    v_fma_f32 v0, v0, |v1|, v2751; GFX6-NEXT:    s_setpc_b64 s[30:31]752;753; GFX8-LABEL: v_fma_f32_fabs_rhs:754; GFX8:       ; %bb.0:755; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)756; GFX8-NEXT:    v_fma_f32 v0, v0, |v1|, v2757; GFX8-NEXT:    s_setpc_b64 s[30:31]758;759; GFX9-LABEL: v_fma_f32_fabs_rhs:760; GFX9:       ; %bb.0:761; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)762; GFX9-NEXT:    v_fma_f32 v0, v0, |v1|, v2763; GFX9-NEXT:    s_setpc_b64 s[30:31]764;765; GFX10-LABEL: v_fma_f32_fabs_rhs:766; GFX10:       ; %bb.0:767; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)768; GFX10-NEXT:    v_fma_f32 v0, v0, |v1|, v2769; GFX10-NEXT:    s_setpc_b64 s[30:31]770;771; GFX11-LABEL: v_fma_f32_fabs_rhs:772; GFX11:       ; %bb.0:773; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)774; GFX11-NEXT:    v_fma_f32 v0, v0, |v1|, v2775; GFX11-NEXT:    s_setpc_b64 s[30:31]776  %fabs.y = call float @llvm.fabs.f32(float %y)777  %fma = call float @llvm.fma.f32(float %x, float %fabs.y, float %z)778  ret float %fma779}780 781define float @v_fma_f32_fabs_lhs_rhs(float %x, float %y, float %z) {782; GFX6-LABEL: v_fma_f32_fabs_lhs_rhs:783; GFX6:       ; %bb.0:784; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)785; GFX6-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2786; GFX6-NEXT:    s_setpc_b64 s[30:31]787;788; GFX8-LABEL: v_fma_f32_fabs_lhs_rhs:789; GFX8:       ; %bb.0:790; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)791; GFX8-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2792; GFX8-NEXT:    s_setpc_b64 s[30:31]793;794; GFX9-LABEL: v_fma_f32_fabs_lhs_rhs:795; GFX9:       ; %bb.0:796; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)797; GFX9-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2798; GFX9-NEXT:    s_setpc_b64 s[30:31]799;800; GFX10-LABEL: v_fma_f32_fabs_lhs_rhs:801; GFX10:       ; %bb.0:802; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)803; GFX10-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2804; GFX10-NEXT:    s_setpc_b64 s[30:31]805;806; GFX11-LABEL: v_fma_f32_fabs_lhs_rhs:807; GFX11:       ; %bb.0:808; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)809; GFX11-NEXT:    v_fma_f32 v0, |v0|, |v1|, v2810; GFX11-NEXT:    s_setpc_b64 s[30:31]811  %fabs.x = call float @llvm.fabs.f32(float %x)812  %fabs.y = call float @llvm.fabs.f32(float %y)813  %fma = call float @llvm.fma.f32(float %fabs.x, float %fabs.y, float %z)814  ret float %fma815}816 817define amdgpu_ps float @v_fma_f32_sgpr_vgpr_vgpr(float inreg %x, float %y, float %z) {818; GFX6-LABEL: v_fma_f32_sgpr_vgpr_vgpr:819; GFX6:       ; %bb.0:820; GFX6-NEXT:    v_fma_f32 v0, s0, v0, v1821; GFX6-NEXT:    ; return to shader part epilog822;823; GFX8-LABEL: v_fma_f32_sgpr_vgpr_vgpr:824; GFX8:       ; %bb.0:825; GFX8-NEXT:    v_fma_f32 v0, s0, v0, v1826; GFX8-NEXT:    ; return to shader part epilog827;828; GFX9-LABEL: v_fma_f32_sgpr_vgpr_vgpr:829; GFX9:       ; %bb.0:830; GFX9-NEXT:    v_fma_f32 v0, s0, v0, v1831; GFX9-NEXT:    ; return to shader part epilog832;833; GFX10-LABEL: v_fma_f32_sgpr_vgpr_vgpr:834; GFX10:       ; %bb.0:835; GFX10-NEXT:    v_fma_f32 v0, s0, v0, v1836; GFX10-NEXT:    ; return to shader part epilog837;838; GFX11-LABEL: v_fma_f32_sgpr_vgpr_vgpr:839; GFX11:       ; %bb.0:840; GFX11-NEXT:    v_fma_f32 v0, s0, v0, v1841; GFX11-NEXT:    ; return to shader part epilog842  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)843  ret float %fma844}845 846define amdgpu_ps float @v_fma_f32_vgpr_sgpr_vgpr(float %x, float inreg %y, float %z) {847; GFX6-LABEL: v_fma_f32_vgpr_sgpr_vgpr:848; GFX6:       ; %bb.0:849; GFX6-NEXT:    v_fma_f32 v0, v0, s0, v1850; GFX6-NEXT:    ; return to shader part epilog851;852; GFX8-LABEL: v_fma_f32_vgpr_sgpr_vgpr:853; GFX8:       ; %bb.0:854; GFX8-NEXT:    v_fma_f32 v0, v0, s0, v1855; GFX8-NEXT:    ; return to shader part epilog856;857; GFX9-LABEL: v_fma_f32_vgpr_sgpr_vgpr:858; GFX9:       ; %bb.0:859; GFX9-NEXT:    v_fma_f32 v0, v0, s0, v1860; GFX9-NEXT:    ; return to shader part epilog861;862; GFX10-LABEL: v_fma_f32_vgpr_sgpr_vgpr:863; GFX10:       ; %bb.0:864; GFX10-NEXT:    v_fma_f32 v0, s0, v0, v1865; GFX10-NEXT:    ; return to shader part epilog866;867; GFX11-LABEL: v_fma_f32_vgpr_sgpr_vgpr:868; GFX11:       ; %bb.0:869; GFX11-NEXT:    v_fma_f32 v0, s0, v0, v1870; GFX11-NEXT:    ; return to shader part epilog871  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)872  ret float %fma873}874 875define amdgpu_ps float @v_fma_f32_sgpr_sgpr_sgpr(float inreg %x, float inreg %y, float inreg %z) {876; GFX6-LABEL: v_fma_f32_sgpr_sgpr_sgpr:877; GFX6:       ; %bb.0:878; GFX6-NEXT:    v_mov_b32_e32 v0, s1879; GFX6-NEXT:    v_mov_b32_e32 v1, s2880; GFX6-NEXT:    v_fma_f32 v0, s0, v0, v1881; GFX6-NEXT:    ; return to shader part epilog882;883; GFX8-LABEL: v_fma_f32_sgpr_sgpr_sgpr:884; GFX8:       ; %bb.0:885; GFX8-NEXT:    v_mov_b32_e32 v0, s1886; GFX8-NEXT:    v_mov_b32_e32 v1, s2887; GFX8-NEXT:    v_fma_f32 v0, s0, v0, v1888; GFX8-NEXT:    ; return to shader part epilog889;890; GFX9-LABEL: v_fma_f32_sgpr_sgpr_sgpr:891; GFX9:       ; %bb.0:892; GFX9-NEXT:    v_mov_b32_e32 v0, s1893; GFX9-NEXT:    v_mov_b32_e32 v1, s2894; GFX9-NEXT:    v_fma_f32 v0, s0, v0, v1895; GFX9-NEXT:    ; return to shader part epilog896;897; GFX10-LABEL: v_fma_f32_sgpr_sgpr_sgpr:898; GFX10:       ; %bb.0:899; GFX10-NEXT:    v_mov_b32_e32 v0, s2900; GFX10-NEXT:    v_fma_f32 v0, s1, s0, v0901; GFX10-NEXT:    ; return to shader part epilog902;903; GFX11-LABEL: v_fma_f32_sgpr_sgpr_sgpr:904; GFX11:       ; %bb.0:905; GFX11-NEXT:    v_mov_b32_e32 v0, s2906; GFX11-NEXT:    v_fma_f32 v0, s1, s0, v0907; GFX11-NEXT:    ; return to shader part epilog908  %fma = call float @llvm.fma.f32(float %x, float %y, float %z)909  ret float %fma910}911 912define float @v_fma_f32_fneg_lhs(float %x, float %y, float %z) {913; GFX6-LABEL: v_fma_f32_fneg_lhs:914; GFX6:       ; %bb.0:915; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; GFX6-NEXT:    v_fma_f32 v0, -v0, v1, v2917; GFX6-NEXT:    s_setpc_b64 s[30:31]918;919; GFX8-LABEL: v_fma_f32_fneg_lhs:920; GFX8:       ; %bb.0:921; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)922; GFX8-NEXT:    v_fma_f32 v0, -v0, v1, v2923; GFX8-NEXT:    s_setpc_b64 s[30:31]924;925; GFX9-LABEL: v_fma_f32_fneg_lhs:926; GFX9:       ; %bb.0:927; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)928; GFX9-NEXT:    v_fma_f32 v0, -v0, v1, v2929; GFX9-NEXT:    s_setpc_b64 s[30:31]930;931; GFX10-LABEL: v_fma_f32_fneg_lhs:932; GFX10:       ; %bb.0:933; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)934; GFX10-NEXT:    v_fma_f32 v0, -v0, v1, v2935; GFX10-NEXT:    s_setpc_b64 s[30:31]936;937; GFX11-LABEL: v_fma_f32_fneg_lhs:938; GFX11:       ; %bb.0:939; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)940; GFX11-NEXT:    v_fma_f32 v0, -v0, v1, v2941; GFX11-NEXT:    s_setpc_b64 s[30:31]942  %neg.x = fneg float %x943  %fma = call float @llvm.fma.f32(float %neg.x, float %y, float %z)944  ret float %fma945}946 947define float @v_fma_f32_fneg_rhs(float %x, float %y, float %z) {948; GFX6-LABEL: v_fma_f32_fneg_rhs:949; GFX6:       ; %bb.0:950; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)951; GFX6-NEXT:    v_fma_f32 v0, v0, -v1, v2952; GFX6-NEXT:    s_setpc_b64 s[30:31]953;954; GFX8-LABEL: v_fma_f32_fneg_rhs:955; GFX8:       ; %bb.0:956; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)957; GFX8-NEXT:    v_fma_f32 v0, v0, -v1, v2958; GFX8-NEXT:    s_setpc_b64 s[30:31]959;960; GFX9-LABEL: v_fma_f32_fneg_rhs:961; GFX9:       ; %bb.0:962; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)963; GFX9-NEXT:    v_fma_f32 v0, v0, -v1, v2964; GFX9-NEXT:    s_setpc_b64 s[30:31]965;966; GFX10-LABEL: v_fma_f32_fneg_rhs:967; GFX10:       ; %bb.0:968; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)969; GFX10-NEXT:    v_fma_f32 v0, v0, -v1, v2970; GFX10-NEXT:    s_setpc_b64 s[30:31]971;972; GFX11-LABEL: v_fma_f32_fneg_rhs:973; GFX11:       ; %bb.0:974; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)975; GFX11-NEXT:    v_fma_f32 v0, v0, -v1, v2976; GFX11-NEXT:    s_setpc_b64 s[30:31]977  %neg.y = fneg float %y978  %fma = call float @llvm.fma.f32(float %x, float %neg.y, float %z)979  ret float %fma980}981 982define float @v_fma_f32_fneg_z(float %x, float %y, float %z) {983; GFX6-LABEL: v_fma_f32_fneg_z:984; GFX6:       ; %bb.0:985; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)986; GFX6-NEXT:    v_fma_f32 v0, v0, v1, -v2987; GFX6-NEXT:    s_setpc_b64 s[30:31]988;989; GFX8-LABEL: v_fma_f32_fneg_z:990; GFX8:       ; %bb.0:991; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)992; GFX8-NEXT:    v_fma_f32 v0, v0, v1, -v2993; GFX8-NEXT:    s_setpc_b64 s[30:31]994;995; GFX9-LABEL: v_fma_f32_fneg_z:996; GFX9:       ; %bb.0:997; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)998; GFX9-NEXT:    v_fma_f32 v0, v0, v1, -v2999; GFX9-NEXT:    s_setpc_b64 s[30:31]1000;1001; GFX10-LABEL: v_fma_f32_fneg_z:1002; GFX10:       ; %bb.0:1003; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1004; GFX10-NEXT:    v_fma_f32 v0, v0, v1, -v21005; GFX10-NEXT:    s_setpc_b64 s[30:31]1006;1007; GFX11-LABEL: v_fma_f32_fneg_z:1008; GFX11:       ; %bb.0:1009; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1010; GFX11-NEXT:    v_fma_f32 v0, v0, v1, -v21011; GFX11-NEXT:    s_setpc_b64 s[30:31]1012  %neg.z = fneg float %z1013  %fma = call float @llvm.fma.f32(float %x, float %y, float %neg.z)1014  ret float %fma1015}1016 1017define amdgpu_ps float @dont_crash_after_fma_mix_select_attempt(float inreg %x, float %y, float %z) {1018; GFX6-LABEL: dont_crash_after_fma_mix_select_attempt:1019; GFX6:       ; %bb.0: ; %.entry1020; GFX6-NEXT:    v_fma_f32 v0, |s0|, v0, v11021; GFX6-NEXT:    ; return to shader part epilog1022;1023; GFX8-LABEL: dont_crash_after_fma_mix_select_attempt:1024; GFX8:       ; %bb.0: ; %.entry1025; GFX8-NEXT:    v_fma_f32 v0, |s0|, v0, v11026; GFX8-NEXT:    ; return to shader part epilog1027;1028; GFX9-LABEL: dont_crash_after_fma_mix_select_attempt:1029; GFX9:       ; %bb.0: ; %.entry1030; GFX9-NEXT:    v_fma_f32 v0, |s0|, v0, v11031; GFX9-NEXT:    ; return to shader part epilog1032;1033; GFX10-LABEL: dont_crash_after_fma_mix_select_attempt:1034; GFX10:       ; %bb.0: ; %.entry1035; GFX10-NEXT:    v_fma_f32 v0, |s0|, v0, v11036; GFX10-NEXT:    ; return to shader part epilog1037;1038; GFX11-LABEL: dont_crash_after_fma_mix_select_attempt:1039; GFX11:       ; %bb.0: ; %.entry1040; GFX11-NEXT:    v_fma_f32 v0, |s0|, v0, v11041; GFX11-NEXT:    ; return to shader part epilog1042.entry:1043  %fabs.x = call contract float @llvm.fabs.f32(float %x)1044  %fma = call float @llvm.fma.f32(float %fabs.x, float %y, float %z)1045  ret float %fma1046}1047 1048declare half @llvm.fma.f16(half, half, half) #01049declare float @llvm.fma.f32(float, float, float) #01050declare double @llvm.fma.f64(double, double, double) #01051 1052declare half @llvm.fabs.f16(half) #01053declare float @llvm.fabs.f32(float) #01054 1055declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>) #01056declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) #01057declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #01058 1059declare <3 x half> @llvm.fma.v3f16(<3 x half>, <3 x half>, <3 x half>) #01060declare <4 x half> @llvm.fma.v4f16(<4 x half>, <4 x half>, <4 x half>) #01061 1062attributes #0 = { nounwind readnone speculatable willreturn }1063