1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel -march=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s 3; RUN: llc -global-isel -march=amdgcn -mcpu=fiji < %s | FileCheck -check-prefix=GFX8 %s 4; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s 5; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s 6 7define float @v_fma_f32(float %x, float %y, float %z) { 8; GFX6-LABEL: v_fma_f32: 9; GFX6: ; %bb.0: 10; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 11; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 12; GFX6-NEXT: s_setpc_b64 s[30:31] 13; 14; GFX8-LABEL: v_fma_f32: 15; GFX8: ; %bb.0: 16; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 17; GFX8-NEXT: v_fma_f32 v0, v0, v1, v2 18; GFX8-NEXT: s_setpc_b64 s[30:31] 19; 20; GFX9-LABEL: v_fma_f32: 21; GFX9: ; %bb.0: 22; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 23; GFX9-NEXT: v_fma_f32 v0, v0, v1, v2 24; GFX9-NEXT: s_setpc_b64 s[30:31] 25; 26; GFX10-LABEL: v_fma_f32: 27; GFX10: ; %bb.0: 28; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 29; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 30; GFX10-NEXT: v_fma_f32 v0, v0, v1, v2 31; GFX10-NEXT: s_setpc_b64 s[30:31] 32 %fma = call float @llvm.fma.f32(float %x, float %y, float %z) 33 ret float %fma 34} 35 36define <2 x float> @v_fma_v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z) { 37; GFX6-LABEL: v_fma_v2f32: 38; GFX6: ; %bb.0: 39; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 40; GFX6-NEXT: v_fma_f32 v0, v0, v2, v4 41; GFX6-NEXT: v_fma_f32 v1, v1, v3, v5 42; GFX6-NEXT: s_setpc_b64 s[30:31] 43; 44; GFX8-LABEL: v_fma_v2f32: 45; GFX8: ; %bb.0: 46; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 47; GFX8-NEXT: v_fma_f32 v0, v0, v2, v4 48; GFX8-NEXT: v_fma_f32 v1, v1, v3, v5 49; GFX8-NEXT: s_setpc_b64 s[30:31] 50; 51; GFX9-LABEL: v_fma_v2f32: 52; GFX9: ; %bb.0: 53; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 54; GFX9-NEXT: v_fma_f32 v0, v0, v2, v4 55; GFX9-NEXT: v_fma_f32 v1, v1, v3, v5 56; GFX9-NEXT: s_setpc_b64 s[30:31] 57; 58; GFX10-LABEL: v_fma_v2f32: 59; GFX10: ; %bb.0: 60; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 61; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 62; GFX10-NEXT: v_fma_f32 v0, v0, v2, v4 63; GFX10-NEXT: v_fma_f32 v1, v1, v3, v5 64; GFX10-NEXT: s_setpc_b64 s[30:31] 65 %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z) 66 ret <2 x float> %fma 67} 68 69define half @v_fma_f16(half %x, half %y, half %z) { 70; GFX6-LABEL: v_fma_f16: 71; GFX6: ; %bb.0: 72; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 73; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 74; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 75; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 76; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 77; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 78; GFX6-NEXT: s_setpc_b64 s[30:31] 79; 80; GFX8-LABEL: v_fma_f16: 81; GFX8: ; %bb.0: 82; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 83; GFX8-NEXT: v_fma_f16 v0, v0, v1, v2 84; GFX8-NEXT: s_setpc_b64 s[30:31] 85; 86; GFX9-LABEL: v_fma_f16: 87; GFX9: ; %bb.0: 88; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 89; GFX9-NEXT: v_fma_f16 v0, v0, v1, v2 90; GFX9-NEXT: s_setpc_b64 s[30:31] 91; 92; GFX10-LABEL: v_fma_f16: 93; GFX10: ; %bb.0: 94; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 95; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 96; GFX10-NEXT: v_fmac_f16_e32 v2, v0, v1 97; GFX10-NEXT: v_mov_b32_e32 v0, v2 98; GFX10-NEXT: s_setpc_b64 s[30:31] 99 %fma = call half @llvm.fma.f16(half %x, half %y, half %z) 100 ret half %fma 101} 102 103define <2 x half> @v_fma_v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z) { 104; GFX6-LABEL: v_fma_v2f16: 105; GFX6: ; %bb.0: 106; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 107; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v0 108; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v1 109; GFX6-NEXT: v_lshrrev_b32_e32 v5, 16, v2 110; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 111; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 112; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 113; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 114; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v4 115; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v5 116; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 117; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 118; GFX6-NEXT: v_fma_f32 v1, v3, v4, v5 119; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1 120; GFX6-NEXT: v_bfe_u32 v0, v0, 0, 16 121; GFX6-NEXT: v_bfe_u32 v1, v1, 0, 16 122; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1 123; GFX6-NEXT: v_or_b32_e32 v0, v0, v1 124; GFX6-NEXT: s_setpc_b64 s[30:31] 125; 126; GFX8-LABEL: v_fma_v2f16: 127; GFX8: ; %bb.0: 128; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 129; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v0 130; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v1 131; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v2 132; GFX8-NEXT: v_fma_f16 v0, v0, v1, v2 133; GFX8-NEXT: v_fma_f16 v1, v3, v4, v5 134; GFX8-NEXT: v_mov_b32_e32 v2, 16 135; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 136; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 137; GFX8-NEXT: s_setpc_b64 s[30:31] 138; 139; GFX9-LABEL: v_fma_v2f16: 140; GFX9: ; %bb.0: 141; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 142; GFX9-NEXT: v_pk_fma_f16 v0, v0, v1, v2 143; GFX9-NEXT: s_setpc_b64 s[30:31] 144; 145; GFX10-LABEL: v_fma_v2f16: 146; GFX10: ; %bb.0: 147; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 148; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 149; GFX10-NEXT: v_pk_fma_f16 v0, v0, v1, v2 150; GFX10-NEXT: s_setpc_b64 s[30:31] 151 %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z) 152 ret <2 x half> %fma 153} 154 155define <2 x half> @v_fma_v2f16_fneg_lhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) { 156; GFX6-LABEL: v_fma_v2f16_fneg_lhs: 157; GFX6: ; %bb.0: 158; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 159; GFX6-NEXT: v_xor_b32_e32 v0, 0x80008000, v0 160; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v0 161; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v1 162; GFX6-NEXT: v_lshrrev_b32_e32 v5, 16, v2 163; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 164; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 165; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 166; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 167; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v4 168; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v5 169; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 170; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 171; GFX6-NEXT: v_fma_f32 v1, v3, v4, v5 172; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1 173; GFX6-NEXT: v_bfe_u32 v0, v0, 0, 16 174; GFX6-NEXT: v_bfe_u32 v1, v1, 0, 16 175; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1 176; GFX6-NEXT: v_or_b32_e32 v0, v0, v1 177; GFX6-NEXT: s_setpc_b64 s[30:31] 178; 179; GFX8-LABEL: v_fma_v2f16_fneg_lhs: 180; GFX8: ; %bb.0: 181; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 182; GFX8-NEXT: v_xor_b32_e32 v0, 0x80008000, v0 183; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v0 184; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v1 185; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v2 186; GFX8-NEXT: v_fma_f16 v0, v0, v1, v2 187; GFX8-NEXT: v_fma_f16 v1, v3, v4, v5 188; GFX8-NEXT: v_mov_b32_e32 v2, 16 189; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 190; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 191; GFX8-NEXT: s_setpc_b64 s[30:31] 192; 193; GFX9-LABEL: v_fma_v2f16_fneg_lhs: 194; GFX9: ; %bb.0: 195; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 196; GFX9-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0] 197; GFX9-NEXT: s_setpc_b64 s[30:31] 198; 199; GFX10-LABEL: v_fma_v2f16_fneg_lhs: 200; GFX10: ; %bb.0: 201; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 202; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 203; GFX10-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,0,0] neg_hi:[1,0,0] 204; GFX10-NEXT: s_setpc_b64 s[30:31] 205 %x.fneg = fneg <2 x half> %x 206 %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y, <2 x half> %z) 207 ret <2 x half> %fma 208} 209 210define <2 x half> @v_fma_v2f16_fneg_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) { 211; GFX6-LABEL: v_fma_v2f16_fneg_rhs: 212; GFX6: ; %bb.0: 213; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 214; GFX6-NEXT: v_xor_b32_e32 v1, 0x80008000, v1 215; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v0 216; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v1 217; GFX6-NEXT: v_lshrrev_b32_e32 v5, 16, v2 218; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 219; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 220; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 221; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 222; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v4 223; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v5 224; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 225; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 226; GFX6-NEXT: v_fma_f32 v1, v3, v4, v5 227; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1 228; GFX6-NEXT: v_bfe_u32 v0, v0, 0, 16 229; GFX6-NEXT: v_bfe_u32 v1, v1, 0, 16 230; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1 231; GFX6-NEXT: v_or_b32_e32 v0, v0, v1 232; GFX6-NEXT: s_setpc_b64 s[30:31] 233; 234; GFX8-LABEL: v_fma_v2f16_fneg_rhs: 235; GFX8: ; %bb.0: 236; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 237; GFX8-NEXT: v_xor_b32_e32 v1, 0x80008000, v1 238; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v0 239; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v1 240; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v2 241; GFX8-NEXT: v_fma_f16 v0, v0, v1, v2 242; GFX8-NEXT: v_fma_f16 v1, v3, v4, v5 243; GFX8-NEXT: v_mov_b32_e32 v2, 16 244; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 245; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 246; GFX8-NEXT: s_setpc_b64 s[30:31] 247; 248; GFX9-LABEL: v_fma_v2f16_fneg_rhs: 249; GFX9: ; %bb.0: 250; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 251; GFX9-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0] 252; GFX9-NEXT: s_setpc_b64 s[30:31] 253; 254; GFX10-LABEL: v_fma_v2f16_fneg_rhs: 255; GFX10: ; %bb.0: 256; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 257; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 258; GFX10-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[0,1,0] neg_hi:[0,1,0] 259; GFX10-NEXT: s_setpc_b64 s[30:31] 260 %y.fneg = fneg <2 x half> %y 261 %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y.fneg, <2 x half> %z) 262 ret <2 x half> %fma 263} 264 265define <2 x half> @v_fma_v2f16_fneg_lhs_rhs(<2 x half> %x, <2 x half> %y, <2 x half> %z) { 266; GFX6-LABEL: v_fma_v2f16_fneg_lhs_rhs: 267; GFX6: ; %bb.0: 268; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 269; GFX6-NEXT: s_mov_b32 s4, 0x80008000 270; GFX6-NEXT: v_xor_b32_e32 v0, s4, v0 271; GFX6-NEXT: v_xor_b32_e32 v1, s4, v1 272; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v0 273; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v1 274; GFX6-NEXT: v_lshrrev_b32_e32 v5, 16, v2 275; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 276; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 277; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 278; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 279; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v4 280; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v5 281; GFX6-NEXT: v_fma_f32 v0, v0, v1, v2 282; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 283; GFX6-NEXT: v_fma_f32 v1, v3, v4, v5 284; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1 285; GFX6-NEXT: v_bfe_u32 v0, v0, 0, 16 286; GFX6-NEXT: v_bfe_u32 v1, v1, 0, 16 287; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1 288; GFX6-NEXT: v_or_b32_e32 v0, v0, v1 289; GFX6-NEXT: s_setpc_b64 s[30:31] 290; 291; GFX8-LABEL: v_fma_v2f16_fneg_lhs_rhs: 292; GFX8: ; %bb.0: 293; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 294; GFX8-NEXT: s_mov_b32 s4, 0x80008000 295; GFX8-NEXT: v_xor_b32_e32 v0, s4, v0 296; GFX8-NEXT: v_xor_b32_e32 v1, s4, v1 297; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v0 298; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v1 299; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v2 300; GFX8-NEXT: v_fma_f16 v0, v0, v1, v2 301; GFX8-NEXT: v_fma_f16 v1, v3, v4, v5 302; GFX8-NEXT: v_mov_b32_e32 v2, 16 303; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 304; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 305; GFX8-NEXT: s_setpc_b64 s[30:31] 306; 307; GFX9-LABEL: v_fma_v2f16_fneg_lhs_rhs: 308; GFX9: ; %bb.0: 309; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 310; GFX9-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0] 311; GFX9-NEXT: s_setpc_b64 s[30:31] 312; 313; GFX10-LABEL: v_fma_v2f16_fneg_lhs_rhs: 314; GFX10: ; %bb.0: 315; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 316; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 317; GFX10-NEXT: v_pk_fma_f16 v0, v0, v1, v2 neg_lo:[1,1,0] neg_hi:[1,1,0] 318; GFX10-NEXT: s_setpc_b64 s[30:31] 319 %x.fneg = fneg <2 x half> %x 320 %y.fneg = fneg <2 x half> %y 321 %fma = call <2 x half> @llvm.fma.v2f16(<2 x half> %x.fneg, <2 x half> %y.fneg, <2 x half> %z) 322 ret <2 x half> %fma 323} 324 325; FIXME: 326; define <3 x half> @v_fma_v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z) { 327; %fma = call <3 x half> @llvm.fma.v3f16(<3 x half> %x, <3 x half> %y, <3 x half> %z) 328; ret <3 x half> %fma 329; } 330 331define <4 x half> @v_fma_v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z) { 332; GFX6-LABEL: v_fma_v4f16: 333; GFX6: ; %bb.0: 334; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 335; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0 336; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v4 337; GFX6-NEXT: v_cvt_f32_f16_e32 v8, v8 338; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1 339; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v5 340; GFX6-NEXT: v_cvt_f32_f16_e32 v9, v9 341; GFX6-NEXT: v_fma_f32 v0, v0, v4, v8 342; GFX6-NEXT: v_cvt_f32_f16_e32 v4, v6 343; GFX6-NEXT: v_cvt_f32_f16_e32 v6, v7 344; GFX6-NEXT: v_fma_f32 v1, v1, v5, v9 345; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 346; GFX6-NEXT: v_cvt_f32_f16_e32 v5, v10 347; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 348; GFX6-NEXT: v_cvt_f32_f16_e32 v7, v11 349; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0 350; GFX6-NEXT: v_fma_f32 v2, v2, v4, v5 351; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1 352; GFX6-NEXT: v_fma_f32 v3, v3, v6, v7 353; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 354; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 355; GFX6-NEXT: s_setpc_b64 s[30:31] 356; 357; GFX8-LABEL: v_fma_v4f16: 358; GFX8: ; %bb.0: 359; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 360; GFX8-NEXT: v_lshrrev_b32_e32 v6, 16, v0 361; GFX8-NEXT: v_lshrrev_b32_e32 v8, 16, v2 362; GFX8-NEXT: v_lshrrev_b32_e32 v10, 16, v4 363; GFX8-NEXT: v_fma_f16 v0, v0, v2, v4 364; GFX8-NEXT: v_lshrrev_b32_e32 v7, 16, v1 365; GFX8-NEXT: v_lshrrev_b32_e32 v9, 16, v3 366; GFX8-NEXT: v_lshrrev_b32_e32 v11, 16, v5 367; GFX8-NEXT: v_fma_f16 v2, v6, v8, v10 368; GFX8-NEXT: v_mov_b32_e32 v4, 16 369; GFX8-NEXT: v_fma_f16 v1, v1, v3, v5 370; GFX8-NEXT: v_lshlrev_b32_sdwa v2, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 371; GFX8-NEXT: v_fma_f16 v3, v7, v9, v11 372; GFX8-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 373; GFX8-NEXT: v_lshlrev_b32_sdwa v2, v4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0 374; GFX8-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 375; GFX8-NEXT: s_setpc_b64 s[30:31] 376; 377; GFX9-LABEL: v_fma_v4f16: 378; GFX9: ; %bb.0: 379; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 380; GFX9-NEXT: v_pk_fma_f16 v0, v0, v2, v4 381; GFX9-NEXT: v_pk_fma_f16 v1, v1, v3, v5 382; GFX9-NEXT: s_setpc_b64 s[30:31] 383; 384; GFX10-LABEL: v_fma_v4f16: 385; GFX10: ; %bb.0: 386; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 387; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 388; GFX10-NEXT: v_pk_fma_f16 v0, v0, v2, v4 389; GFX10-NEXT: v_pk_fma_f16 v1, v1, v3, v5 390; GFX10-NEXT: s_setpc_b64 s[30:31] 391 %fma = call <4 x half> @llvm.fma.v4f16(<4 x half> %x, <4 x half> %y, <4 x half> %z) 392 ret <4 x half> %fma 393} 394 395define double @v_fma_f64(double %x, double %y, double %z) { 396; GFX6-LABEL: v_fma_f64: 397; GFX6: ; %bb.0: 398; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 399; GFX6-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5] 400; GFX6-NEXT: s_setpc_b64 s[30:31] 401; 402; GFX8-LABEL: v_fma_f64: 403; GFX8: ; %bb.0: 404; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 405; GFX8-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5] 406; GFX8-NEXT: s_setpc_b64 s[30:31] 407; 408; GFX9-LABEL: v_fma_f64: 409; GFX9: ; %bb.0: 410; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 411; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5] 412; GFX9-NEXT: s_setpc_b64 s[30:31] 413; 414; GFX10-LABEL: v_fma_f64: 415; GFX10: ; %bb.0: 416; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 417; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 418; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5] 419; GFX10-NEXT: s_setpc_b64 s[30:31] 420 %fma = call double @llvm.fma.f64(double %x, double %y, double %z) 421 ret double %fma 422} 423 424define double @v_fma_f64_fneg_all(double %x, double %y, double %z) { 425; GFX6-LABEL: v_fma_f64_fneg_all: 426; GFX6: ; %bb.0: 427; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 428; GFX6-NEXT: v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5] 429; GFX6-NEXT: s_setpc_b64 s[30:31] 430; 431; GFX8-LABEL: v_fma_f64_fneg_all: 432; GFX8: ; %bb.0: 433; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 434; GFX8-NEXT: v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5] 435; GFX8-NEXT: s_setpc_b64 s[30:31] 436; 437; GFX9-LABEL: v_fma_f64_fneg_all: 438; GFX9: ; %bb.0: 439; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 440; GFX9-NEXT: v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5] 441; GFX9-NEXT: s_setpc_b64 s[30:31] 442; 443; GFX10-LABEL: v_fma_f64_fneg_all: 444; GFX10: ; %bb.0: 445; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 446; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 447; GFX10-NEXT: v_fma_f64 v[0:1], -v[0:1], -v[2:3], -v[4:5] 448; GFX10-NEXT: s_setpc_b64 s[30:31] 449 %neg.x = fneg double %x 450 %neg.y = fneg double %y 451 %neg.z = fneg double %z 452 %fma = call double @llvm.fma.f64(double %neg.x, double %neg.y, double %neg.z) 453 ret double %fma 454} 455 456define <2 x double> @v_fma_v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z) { 457; GFX6-LABEL: v_fma_v2f64: 458; GFX6: ; %bb.0: 459; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 460; GFX6-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9] 461; GFX6-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11] 462; GFX6-NEXT: s_setpc_b64 s[30:31] 463; 464; GFX8-LABEL: v_fma_v2f64: 465; GFX8: ; %bb.0: 466; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 467; GFX8-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9] 468; GFX8-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11] 469; GFX8-NEXT: s_setpc_b64 s[30:31] 470; 471; GFX9-LABEL: v_fma_v2f64: 472; GFX9: ; %bb.0: 473; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 474; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9] 475; GFX9-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11] 476; GFX9-NEXT: s_setpc_b64 s[30:31] 477; 478; GFX10-LABEL: v_fma_v2f64: 479; GFX10: ; %bb.0: 480; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 481; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 482; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9] 483; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11] 484; GFX10-NEXT: s_setpc_b64 s[30:31] 485 %fma = call <2 x double> @llvm.fma.v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z) 486 ret <2 x double> %fma 487} 488 489define float @v_fma_f32_fabs_lhs(float %x, float %y, float %z) { 490; GFX6-LABEL: v_fma_f32_fabs_lhs: 491; GFX6: ; %bb.0: 492; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 493; GFX6-NEXT: v_fma_f32 v0, |v0|, v1, v2 494; GFX6-NEXT: s_setpc_b64 s[30:31] 495; 496; GFX8-LABEL: v_fma_f32_fabs_lhs: 497; GFX8: ; %bb.0: 498; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 499; GFX8-NEXT: v_fma_f32 v0, |v0|, v1, v2 500; GFX8-NEXT: s_setpc_b64 s[30:31] 501; 502; GFX9-LABEL: v_fma_f32_fabs_lhs: 503; GFX9: ; %bb.0: 504; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 505; GFX9-NEXT: v_fma_f32 v0, |v0|, v1, v2 506; GFX9-NEXT: s_setpc_b64 s[30:31] 507; 508; GFX10-LABEL: v_fma_f32_fabs_lhs: 509; GFX10: ; %bb.0: 510; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 511; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 512; GFX10-NEXT: v_fma_f32 v0, v1, |v0|, v2 513; GFX10-NEXT: s_setpc_b64 s[30:31] 514 %fabs.x = call float @llvm.fabs.f32(float %x) 515 %fma = call float @llvm.fma.f32(float %fabs.x, float %y, float %z) 516 ret float %fma 517} 518 519define float @v_fma_f32_fabs_rhs(float %x, float %y, float %z) { 520; GFX6-LABEL: v_fma_f32_fabs_rhs: 521; GFX6: ; %bb.0: 522; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 523; GFX6-NEXT: v_fma_f32 v0, v0, |v1|, v2 524; GFX6-NEXT: s_setpc_b64 s[30:31] 525; 526; GFX8-LABEL: v_fma_f32_fabs_rhs: 527; GFX8: ; %bb.0: 528; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 529; GFX8-NEXT: v_fma_f32 v0, v0, |v1|, v2 530; GFX8-NEXT: s_setpc_b64 s[30:31] 531; 532; GFX9-LABEL: v_fma_f32_fabs_rhs: 533; GFX9: ; %bb.0: 534; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 535; GFX9-NEXT: v_fma_f32 v0, v0, |v1|, v2 536; GFX9-NEXT: s_setpc_b64 s[30:31] 537; 538; GFX10-LABEL: v_fma_f32_fabs_rhs: 539; GFX10: ; %bb.0: 540; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 541; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 542; GFX10-NEXT: v_fma_f32 v0, |v1|, v0, v2 543; GFX10-NEXT: s_setpc_b64 s[30:31] 544 %fabs.y = call float @llvm.fabs.f32(float %y) 545 %fma = call float @llvm.fma.f32(float %x, float %fabs.y, float %z) 546 ret float %fma 547} 548 549define float @v_fma_f32_fabs_lhs_rhs(float %x, float %y, float %z) { 550; GFX6-LABEL: v_fma_f32_fabs_lhs_rhs: 551; GFX6: ; %bb.0: 552; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 553; GFX6-NEXT: v_fma_f32 v0, |v0|, |v1|, v2 554; GFX6-NEXT: s_setpc_b64 s[30:31] 555; 556; GFX8-LABEL: v_fma_f32_fabs_lhs_rhs: 557; GFX8: ; %bb.0: 558; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 559; GFX8-NEXT: v_fma_f32 v0, |v0|, |v1|, v2 560; GFX8-NEXT: s_setpc_b64 s[30:31] 561; 562; GFX9-LABEL: v_fma_f32_fabs_lhs_rhs: 563; GFX9: ; %bb.0: 564; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 565; GFX9-NEXT: v_fma_f32 v0, |v0|, |v1|, v2 566; GFX9-NEXT: s_setpc_b64 s[30:31] 567; 568; GFX10-LABEL: v_fma_f32_fabs_lhs_rhs: 569; GFX10: ; %bb.0: 570; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 571; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 572; GFX10-NEXT: v_fma_f32 v0, |v1|, |v0|, v2 573; GFX10-NEXT: s_setpc_b64 s[30:31] 574 %fabs.x = call float @llvm.fabs.f32(float %x) 575 %fabs.y = call float @llvm.fabs.f32(float %y) 576 %fma = call float @llvm.fma.f32(float %fabs.x, float %fabs.y, float %z) 577 ret float %fma 578} 579 580define amdgpu_ps float @v_fma_f32_sgpr_vgpr_vgpr(float inreg %x, float %y, float %z) { 581; GFX6-LABEL: v_fma_f32_sgpr_vgpr_vgpr: 582; GFX6: ; %bb.0: 583; GFX6-NEXT: v_fma_f32 v0, s0, v0, v1 584; GFX6-NEXT: ; return to shader part epilog 585; 586; GFX8-LABEL: v_fma_f32_sgpr_vgpr_vgpr: 587; GFX8: ; %bb.0: 588; GFX8-NEXT: v_fma_f32 v0, s0, v0, v1 589; GFX8-NEXT: ; return to shader part epilog 590; 591; GFX9-LABEL: v_fma_f32_sgpr_vgpr_vgpr: 592; GFX9: ; %bb.0: 593; GFX9-NEXT: v_fma_f32 v0, s0, v0, v1 594; GFX9-NEXT: ; return to shader part epilog 595; 596; GFX10-LABEL: v_fma_f32_sgpr_vgpr_vgpr: 597; GFX10: ; %bb.0: 598; GFX10-NEXT: v_fma_f32 v0, s0, v0, v1 599; GFX10-NEXT: ; return to shader part epilog 600 %fma = call float @llvm.fma.f32(float %x, float %y, float %z) 601 ret float %fma 602} 603 604define amdgpu_ps float @v_fma_f32_vgpr_sgpr_vgpr(float %x, float inreg %y, float %z) { 605; GFX6-LABEL: v_fma_f32_vgpr_sgpr_vgpr: 606; GFX6: ; %bb.0: 607; GFX6-NEXT: v_fma_f32 v0, v0, s0, v1 608; GFX6-NEXT: ; return to shader part epilog 609; 610; GFX8-LABEL: v_fma_f32_vgpr_sgpr_vgpr: 611; GFX8: ; %bb.0: 612; GFX8-NEXT: v_fma_f32 v0, v0, s0, v1 613; GFX8-NEXT: ; return to shader part epilog 614; 615; GFX9-LABEL: v_fma_f32_vgpr_sgpr_vgpr: 616; GFX9: ; %bb.0: 617; GFX9-NEXT: v_fma_f32 v0, v0, s0, v1 618; GFX9-NEXT: ; return to shader part epilog 619; 620; GFX10-LABEL: v_fma_f32_vgpr_sgpr_vgpr: 621; GFX10: ; %bb.0: 622; GFX10-NEXT: v_fma_f32 v0, s0, v0, v1 623; GFX10-NEXT: ; return to shader part epilog 624 %fma = call float @llvm.fma.f32(float %x, float %y, float %z) 625 ret float %fma 626} 627 628define amdgpu_ps float @v_fma_f32_sgpr_sgpr_sgpr(float inreg %x, float inreg %y, float inreg %z) { 629; GFX6-LABEL: v_fma_f32_sgpr_sgpr_sgpr: 630; GFX6: ; %bb.0: 631; GFX6-NEXT: v_mov_b32_e32 v0, s1 632; GFX6-NEXT: v_mov_b32_e32 v1, s2 633; GFX6-NEXT: v_fma_f32 v0, s0, v0, v1 634; GFX6-NEXT: ; return to shader part epilog 635; 636; GFX8-LABEL: v_fma_f32_sgpr_sgpr_sgpr: 637; GFX8: ; %bb.0: 638; GFX8-NEXT: v_mov_b32_e32 v0, s1 639; GFX8-NEXT: v_mov_b32_e32 v1, s2 640; GFX8-NEXT: v_fma_f32 v0, s0, v0, v1 641; GFX8-NEXT: ; return to shader part epilog 642; 643; GFX9-LABEL: v_fma_f32_sgpr_sgpr_sgpr: 644; GFX9: ; %bb.0: 645; GFX9-NEXT: v_mov_b32_e32 v0, s1 646; GFX9-NEXT: v_mov_b32_e32 v1, s2 647; GFX9-NEXT: v_fma_f32 v0, s0, v0, v1 648; GFX9-NEXT: ; return to shader part epilog 649; 650; GFX10-LABEL: v_fma_f32_sgpr_sgpr_sgpr: 651; GFX10: ; %bb.0: 652; GFX10-NEXT: v_mov_b32_e32 v0, s2 653; GFX10-NEXT: v_fma_f32 v0, s1, s0, v0 654; GFX10-NEXT: ; return to shader part epilog 655 %fma = call float @llvm.fma.f32(float %x, float %y, float %z) 656 ret float %fma 657} 658 659define float @v_fma_f32_fneg_lhs(float %x, float %y, float %z) { 660; GFX6-LABEL: v_fma_f32_fneg_lhs: 661; GFX6: ; %bb.0: 662; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 663; GFX6-NEXT: v_fma_f32 v0, -v0, v1, v2 664; GFX6-NEXT: s_setpc_b64 s[30:31] 665; 666; GFX8-LABEL: v_fma_f32_fneg_lhs: 667; GFX8: ; %bb.0: 668; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 669; GFX8-NEXT: v_fma_f32 v0, -v0, v1, v2 670; GFX8-NEXT: s_setpc_b64 s[30:31] 671; 672; GFX9-LABEL: v_fma_f32_fneg_lhs: 673; GFX9: ; %bb.0: 674; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 675; GFX9-NEXT: v_fma_f32 v0, -v0, v1, v2 676; GFX9-NEXT: s_setpc_b64 s[30:31] 677; 678; GFX10-LABEL: v_fma_f32_fneg_lhs: 679; GFX10: ; %bb.0: 680; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 681; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 682; GFX10-NEXT: v_fma_f32 v0, v1, -v0, v2 683; GFX10-NEXT: s_setpc_b64 s[30:31] 684 %neg.x = fneg float %x 685 %fma = call float @llvm.fma.f32(float %neg.x, float %y, float %z) 686 ret float %fma 687} 688 689define float @v_fma_f32_fneg_rhs(float %x, float %y, float %z) { 690; GFX6-LABEL: v_fma_f32_fneg_rhs: 691; GFX6: ; %bb.0: 692; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 693; GFX6-NEXT: v_fma_f32 v0, v0, -v1, v2 694; GFX6-NEXT: s_setpc_b64 s[30:31] 695; 696; GFX8-LABEL: v_fma_f32_fneg_rhs: 697; GFX8: ; %bb.0: 698; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 699; GFX8-NEXT: v_fma_f32 v0, v0, -v1, v2 700; GFX8-NEXT: s_setpc_b64 s[30:31] 701; 702; GFX9-LABEL: v_fma_f32_fneg_rhs: 703; GFX9: ; %bb.0: 704; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 705; GFX9-NEXT: v_fma_f32 v0, v0, -v1, v2 706; GFX9-NEXT: s_setpc_b64 s[30:31] 707; 708; GFX10-LABEL: v_fma_f32_fneg_rhs: 709; GFX10: ; %bb.0: 710; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 711; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 712; GFX10-NEXT: v_fma_f32 v0, -v1, v0, v2 713; GFX10-NEXT: s_setpc_b64 s[30:31] 714 %neg.y = fneg float %y 715 %fma = call float @llvm.fma.f32(float %x, float %neg.y, float %z) 716 ret float %fma 717} 718 719define float @v_fma_f32_fneg_z(float %x, float %y, float %z) { 720; GFX6-LABEL: v_fma_f32_fneg_z: 721; GFX6: ; %bb.0: 722; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 723; GFX6-NEXT: v_fma_f32 v0, v0, v1, -v2 724; GFX6-NEXT: s_setpc_b64 s[30:31] 725; 726; GFX8-LABEL: v_fma_f32_fneg_z: 727; GFX8: ; %bb.0: 728; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 729; GFX8-NEXT: v_fma_f32 v0, v0, v1, -v2 730; GFX8-NEXT: s_setpc_b64 s[30:31] 731; 732; GFX9-LABEL: v_fma_f32_fneg_z: 733; GFX9: ; %bb.0: 734; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 735; GFX9-NEXT: v_fma_f32 v0, v0, v1, -v2 736; GFX9-NEXT: s_setpc_b64 s[30:31] 737; 738; GFX10-LABEL: v_fma_f32_fneg_z: 739; GFX10: ; %bb.0: 740; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 741; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 742; GFX10-NEXT: v_fma_f32 v0, v0, v1, -v2 743; GFX10-NEXT: s_setpc_b64 s[30:31] 744 %neg.z = fneg float %z 745 %fma = call float @llvm.fma.f32(float %x, float %y, float %neg.z) 746 ret float %fma 747} 748 749declare half @llvm.fma.f16(half, half, half) #0 750declare float @llvm.fma.f32(float, float, float) #0 751declare double @llvm.fma.f64(double, double, double) #0 752 753declare half @llvm.fabs.f16(half) #0 754declare float @llvm.fabs.f32(float) #0 755 756declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>) #0 757declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) #0 758declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0 759 760declare <3 x half> @llvm.fma.v3f16(<3 x half>, <3 x half>, <3 x half>) #0 761declare <4 x half> @llvm.fma.v4f16(<4 x half>, <4 x half>, <4 x half>) #0 762 763attributes #0 = { nounwind readnone speculatable willreturn } 764