788 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -amdgpu-scalarize-global-loads=false -mcpu=kaveri -mtriple=amdgcn--amdhsa < %s | FileCheck -enable-var-scope -check-prefixes=CIVI,CI %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mcpu=tonga -mtriple=amdgcn--amdhsa < %s | FileCheck -enable-var-scope -check-prefixes=CIVI,GFX8 %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mcpu=gfx900 -mtriple=amdgcn--amdhsa < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mcpu=gfx1100 -mattr=+real-true16 -mtriple=amdgcn--amdhsa < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -amdgpu-scalarize-global-loads=false -mcpu=gfx1100 -mattr=-real-true16 -mtriple=amdgcn--amdhsa < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FAKE16 %s7 8; FIXME: Should be able to do scalar op9define amdgpu_kernel void @s_fneg_f16(ptr addrspace(1) %out, half %in) #0 {10; CI-LABEL: s_fneg_f16:11; CI: ; %bb.0:12; CI-NEXT: s_load_dword s2, s[8:9], 0x213; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x014; CI-NEXT: s_add_i32 s12, s12, s1715; CI-NEXT: s_mov_b32 flat_scratch_lo, s1316; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 817; CI-NEXT: s_waitcnt lgkmcnt(0)18; CI-NEXT: s_xor_b32 s2, s2, 0x800019; CI-NEXT: v_mov_b32_e32 v0, s020; CI-NEXT: v_mov_b32_e32 v1, s121; CI-NEXT: v_mov_b32_e32 v2, s222; CI-NEXT: flat_store_short v[0:1], v223; CI-NEXT: s_endpgm24;25; GFX8-LABEL: s_fneg_f16:26; GFX8: ; %bb.0:27; GFX8-NEXT: s_load_dword s2, s[8:9], 0x828; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x029; GFX8-NEXT: s_add_i32 s12, s12, s1730; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s1331; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 832; GFX8-NEXT: s_waitcnt lgkmcnt(0)33; GFX8-NEXT: s_xor_b32 s2, s2, 0x800034; GFX8-NEXT: v_mov_b32_e32 v0, s035; GFX8-NEXT: v_mov_b32_e32 v1, s136; GFX8-NEXT: v_mov_b32_e32 v2, s237; GFX8-NEXT: flat_store_short v[0:1], v238; GFX8-NEXT: s_endpgm39;40; GFX9-LABEL: s_fneg_f16:41; GFX9: ; %bb.0:42; GFX9-NEXT: s_load_dword s2, s[8:9], 0x843; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x044; GFX9-NEXT: v_mov_b32_e32 v0, 045; GFX9-NEXT: s_waitcnt lgkmcnt(0)46; GFX9-NEXT: s_xor_b32 s2, s2, 0x800047; GFX9-NEXT: v_mov_b32_e32 v1, s248; GFX9-NEXT: global_store_short v0, v1, s[0:1]49; GFX9-NEXT: s_endpgm50;51; GFX11-TRUE16-LABEL: s_fneg_f16:52; GFX11-TRUE16: ; %bb.0:53; GFX11-TRUE16-NEXT: s_clause 0x154; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x855; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x056; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 057; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)58; GFX11-TRUE16-NEXT: s_xor_b32 s2, s2, 0x800059; GFX11-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)60; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, s261; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]62; GFX11-TRUE16-NEXT: s_endpgm63;64; GFX11-FAKE16-LABEL: s_fneg_f16:65; GFX11-FAKE16: ; %bb.0:66; GFX11-FAKE16-NEXT: s_clause 0x167; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x868; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x069; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)70; GFX11-FAKE16-NEXT: s_xor_b32 s2, s2, 0x800071; GFX11-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)72; GFX11-FAKE16-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s273; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]74; GFX11-FAKE16-NEXT: s_endpgm75 %fneg = fsub half -0.0, %in76 store half %fneg, ptr addrspace(1) %out77 ret void78}79 80; FIXME: Should be able to use bit operations when illegal type as81; well.82define amdgpu_kernel void @v_fneg_f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {83; CI-LABEL: v_fneg_f16:84; CI: ; %bb.0:85; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x286; CI-NEXT: v_lshlrev_b32_e32 v0, 1, v087; CI-NEXT: s_add_i32 s12, s12, s1788; CI-NEXT: s_mov_b32 flat_scratch_lo, s1389; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 890; CI-NEXT: s_waitcnt lgkmcnt(0)91; CI-NEXT: v_mov_b32_e32 v1, s192; CI-NEXT: v_add_i32_e32 v0, vcc, s0, v093; CI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc94; CI-NEXT: flat_load_ushort v2, v[0:1]95; CI-NEXT: s_waitcnt vmcnt(0)96; CI-NEXT: v_xor_b32_e32 v2, 0x8000, v297; CI-NEXT: flat_store_short v[0:1], v298; CI-NEXT: s_endpgm99;100; GFX8-LABEL: v_fneg_f16:101; GFX8: ; %bb.0:102; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x8103; GFX8-NEXT: v_lshlrev_b32_e32 v0, 1, v0104; GFX8-NEXT: s_add_i32 s12, s12, s17105; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13106; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8107; GFX8-NEXT: s_waitcnt lgkmcnt(0)108; GFX8-NEXT: v_mov_b32_e32 v1, s1109; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0110; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc111; GFX8-NEXT: flat_load_ushort v2, v[0:1]112; GFX8-NEXT: s_waitcnt vmcnt(0)113; GFX8-NEXT: v_xor_b32_e32 v2, 0x8000, v2114; GFX8-NEXT: flat_store_short v[0:1], v2115; GFX8-NEXT: s_endpgm116;117; GFX9-LABEL: v_fneg_f16:118; GFX9: ; %bb.0:119; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x8120; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0121; GFX9-NEXT: s_waitcnt lgkmcnt(0)122; GFX9-NEXT: global_load_ushort v1, v0, s[0:1]123; GFX9-NEXT: s_waitcnt vmcnt(0)124; GFX9-NEXT: v_xor_b32_e32 v1, 0x8000, v1125; GFX9-NEXT: global_store_short v0, v1, s[0:1]126; GFX9-NEXT: s_endpgm127;128; GFX11-TRUE16-LABEL: v_fneg_f16:129; GFX11-TRUE16: ; %bb.0:130; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x8131; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0132; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)133; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0134; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)135; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[0:1]136; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)137; GFX11-TRUE16-NEXT: v_xor_b16 v0.l, 0x8000, v0.l138; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]139; GFX11-TRUE16-NEXT: s_endpgm140;141; GFX11-FAKE16-LABEL: v_fneg_f16:142; GFX11-FAKE16: ; %bb.0:143; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x8144; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0145; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)146; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0147; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)148; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[0:1]149; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)150; GFX11-FAKE16-NEXT: v_xor_b32_e32 v1, 0x8000, v1151; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]152; GFX11-FAKE16-NEXT: s_endpgm153 %tid = call i32 @llvm.amdgcn.workitem.id.x()154 %gep.in = getelementptr inbounds half, ptr addrspace(1) %in, i32 %tid155 %gep.out = getelementptr inbounds half, ptr addrspace(1) %in, i32 %tid156 %val = load half, ptr addrspace(1) %gep.in, align 2157 %fneg = fsub half -0.0, %val158 store half %fneg, ptr addrspace(1) %gep.out159 ret void160}161 162define amdgpu_kernel void @s_fneg_free_f16(ptr addrspace(1) %out, i16 %in) #0 {163; CI-LABEL: s_fneg_free_f16:164; CI: ; %bb.0:165; CI-NEXT: s_load_dword s2, s[8:9], 0x2166; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0167; CI-NEXT: s_add_i32 s12, s12, s17168; CI-NEXT: s_mov_b32 flat_scratch_lo, s13169; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8170; CI-NEXT: s_waitcnt lgkmcnt(0)171; CI-NEXT: s_xor_b32 s2, s2, 0x8000172; CI-NEXT: v_mov_b32_e32 v0, s0173; CI-NEXT: v_mov_b32_e32 v1, s1174; CI-NEXT: v_mov_b32_e32 v2, s2175; CI-NEXT: flat_store_short v[0:1], v2176; CI-NEXT: s_endpgm177;178; GFX8-LABEL: s_fneg_free_f16:179; GFX8: ; %bb.0:180; GFX8-NEXT: s_load_dword s2, s[8:9], 0x8181; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0182; GFX8-NEXT: s_add_i32 s12, s12, s17183; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13184; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8185; GFX8-NEXT: s_waitcnt lgkmcnt(0)186; GFX8-NEXT: s_xor_b32 s2, s2, 0x8000187; GFX8-NEXT: v_mov_b32_e32 v0, s0188; GFX8-NEXT: v_mov_b32_e32 v1, s1189; GFX8-NEXT: v_mov_b32_e32 v2, s2190; GFX8-NEXT: flat_store_short v[0:1], v2191; GFX8-NEXT: s_endpgm192;193; GFX9-LABEL: s_fneg_free_f16:194; GFX9: ; %bb.0:195; GFX9-NEXT: s_load_dword s2, s[8:9], 0x8196; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0197; GFX9-NEXT: v_mov_b32_e32 v0, 0198; GFX9-NEXT: s_waitcnt lgkmcnt(0)199; GFX9-NEXT: s_xor_b32 s2, s2, 0x8000200; GFX9-NEXT: v_mov_b32_e32 v1, s2201; GFX9-NEXT: global_store_short v0, v1, s[0:1]202; GFX9-NEXT: s_endpgm203;204; GFX11-TRUE16-LABEL: s_fneg_free_f16:205; GFX11-TRUE16: ; %bb.0:206; GFX11-TRUE16-NEXT: s_clause 0x1207; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x8208; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x0209; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0210; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)211; GFX11-TRUE16-NEXT: s_xor_b32 s2, s2, 0x8000212; GFX11-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)213; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, s2214; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]215; GFX11-TRUE16-NEXT: s_endpgm216;217; GFX11-FAKE16-LABEL: s_fneg_free_f16:218; GFX11-FAKE16: ; %bb.0:219; GFX11-FAKE16-NEXT: s_clause 0x1220; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x8221; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x0222; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)223; GFX11-FAKE16-NEXT: s_xor_b32 s2, s2, 0x8000224; GFX11-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)225; GFX11-FAKE16-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2226; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]227; GFX11-FAKE16-NEXT: s_endpgm228 %bc = bitcast i16 %in to half229 %fsub = fsub half -0.0, %bc230 store half %fsub, ptr addrspace(1) %out231 ret void232}233 234define amdgpu_kernel void @v_fneg_fold_f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {235; CI-LABEL: v_fneg_fold_f16:236; CI: ; %bb.0:237; CI-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0238; CI-NEXT: s_add_i32 s12, s12, s17239; CI-NEXT: s_mov_b32 flat_scratch_lo, s13240; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8241; CI-NEXT: s_waitcnt lgkmcnt(0)242; CI-NEXT: v_mov_b32_e32 v0, s2243; CI-NEXT: v_mov_b32_e32 v1, s3244; CI-NEXT: flat_load_ushort v0, v[0:1]245; CI-NEXT: s_waitcnt vmcnt(0)246; CI-NEXT: v_cvt_f32_f16_e32 v1, v0247; CI-NEXT: v_cvt_f32_f16_e64 v0, -v0248; CI-NEXT: v_mul_f32_e32 v0, v0, v1249; CI-NEXT: v_cvt_f16_f32_e32 v2, v0250; CI-NEXT: v_mov_b32_e32 v0, s0251; CI-NEXT: v_mov_b32_e32 v1, s1252; CI-NEXT: flat_store_short v[0:1], v2253; CI-NEXT: s_endpgm254;255; GFX8-LABEL: v_fneg_fold_f16:256; GFX8: ; %bb.0:257; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0258; GFX8-NEXT: s_add_i32 s12, s12, s17259; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13260; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8261; GFX8-NEXT: s_waitcnt lgkmcnt(0)262; GFX8-NEXT: v_mov_b32_e32 v0, s2263; GFX8-NEXT: v_mov_b32_e32 v1, s3264; GFX8-NEXT: flat_load_ushort v2, v[0:1]265; GFX8-NEXT: v_mov_b32_e32 v0, s0266; GFX8-NEXT: v_mov_b32_e32 v1, s1267; GFX8-NEXT: s_waitcnt vmcnt(0)268; GFX8-NEXT: v_mul_f16_e64 v2, -v2, v2269; GFX8-NEXT: flat_store_short v[0:1], v2270; GFX8-NEXT: s_endpgm271;272; GFX9-LABEL: v_fneg_fold_f16:273; GFX9: ; %bb.0:274; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0275; GFX9-NEXT: v_mov_b32_e32 v0, 0276; GFX9-NEXT: s_waitcnt lgkmcnt(0)277; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]278; GFX9-NEXT: s_waitcnt vmcnt(0)279; GFX9-NEXT: v_mul_f16_e64 v1, -v1, v1280; GFX9-NEXT: global_store_short v0, v1, s[0:1]281; GFX9-NEXT: s_endpgm282;283; GFX11-TRUE16-LABEL: v_fneg_fold_f16:284; GFX11-TRUE16: ; %bb.0:285; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x0286; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0287; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)288; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]289; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)290; GFX11-TRUE16-NEXT: v_mul_f16_e64 v0.l, -v0.l, v0.l291; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]292; GFX11-TRUE16-NEXT: s_endpgm293;294; GFX11-FAKE16-LABEL: v_fneg_fold_f16:295; GFX11-FAKE16: ; %bb.0:296; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x0297; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, 0298; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)299; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]300; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)301; GFX11-FAKE16-NEXT: v_mul_f16_e64 v1, -v1, v1302; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]303; GFX11-FAKE16-NEXT: s_endpgm304 %val = load half, ptr addrspace(1) %in305 %fsub = fsub half -0.0, %val306 %fmul = fmul half %fsub, %val307 store half %fmul, ptr addrspace(1) %out308 ret void309}310 311define amdgpu_kernel void @s_fneg_v2f16(ptr addrspace(1) %out, <2 x half> %in) #0 {312; CI-LABEL: s_fneg_v2f16:313; CI: ; %bb.0:314; CI-NEXT: s_load_dword s2, s[8:9], 0x2315; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0316; CI-NEXT: s_add_i32 s12, s12, s17317; CI-NEXT: s_mov_b32 flat_scratch_lo, s13318; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8319; CI-NEXT: s_waitcnt lgkmcnt(0)320; CI-NEXT: s_xor_b32 s2, s2, 0x80008000321; CI-NEXT: v_mov_b32_e32 v0, s0322; CI-NEXT: v_mov_b32_e32 v1, s1323; CI-NEXT: v_mov_b32_e32 v2, s2324; CI-NEXT: flat_store_dword v[0:1], v2325; CI-NEXT: s_endpgm326;327; GFX8-LABEL: s_fneg_v2f16:328; GFX8: ; %bb.0:329; GFX8-NEXT: s_load_dword s2, s[8:9], 0x8330; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0331; GFX8-NEXT: s_add_i32 s12, s12, s17332; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13333; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8334; GFX8-NEXT: s_waitcnt lgkmcnt(0)335; GFX8-NEXT: s_xor_b32 s2, s2, 0x80008000336; GFX8-NEXT: v_mov_b32_e32 v0, s0337; GFX8-NEXT: v_mov_b32_e32 v1, s1338; GFX8-NEXT: v_mov_b32_e32 v2, s2339; GFX8-NEXT: flat_store_dword v[0:1], v2340; GFX8-NEXT: s_endpgm341;342; GFX9-LABEL: s_fneg_v2f16:343; GFX9: ; %bb.0:344; GFX9-NEXT: s_load_dword s2, s[8:9], 0x8345; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0346; GFX9-NEXT: v_mov_b32_e32 v0, 0347; GFX9-NEXT: s_waitcnt lgkmcnt(0)348; GFX9-NEXT: s_xor_b32 s2, s2, 0x80008000349; GFX9-NEXT: v_mov_b32_e32 v1, s2350; GFX9-NEXT: global_store_dword v0, v1, s[0:1]351; GFX9-NEXT: s_endpgm352;353; GFX11-LABEL: s_fneg_v2f16:354; GFX11: ; %bb.0:355; GFX11-NEXT: s_clause 0x1356; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x8357; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0358; GFX11-NEXT: s_waitcnt lgkmcnt(0)359; GFX11-NEXT: s_xor_b32 s2, s2, 0x80008000360; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)361; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2362; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]363; GFX11-NEXT: s_endpgm364 %fneg = fsub <2 x half> <half -0.0, half -0.0>, %in365 store <2 x half> %fneg, ptr addrspace(1) %out366 ret void367}368 369define amdgpu_kernel void @s_fneg_v2f16_nonload(ptr addrspace(1) %out) #0 {370; CIVI-LABEL: s_fneg_v2f16_nonload:371; CIVI: ; %bb.0:372; CIVI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0373; CIVI-NEXT: s_add_i32 s12, s12, s17374; CIVI-NEXT: ;;#ASMSTART375; CIVI-NEXT: ; def s2376; CIVI-NEXT: ;;#ASMEND377; CIVI-NEXT: s_xor_b32 s2, s2, 0x80008000378; CIVI-NEXT: s_mov_b32 flat_scratch_lo, s13379; CIVI-NEXT: s_waitcnt lgkmcnt(0)380; CIVI-NEXT: v_mov_b32_e32 v0, s0381; CIVI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8382; CIVI-NEXT: v_mov_b32_e32 v1, s1383; CIVI-NEXT: v_mov_b32_e32 v2, s2384; CIVI-NEXT: flat_store_dword v[0:1], v2385; CIVI-NEXT: s_endpgm386;387; GFX9-LABEL: s_fneg_v2f16_nonload:388; GFX9: ; %bb.0:389; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0390; GFX9-NEXT: ;;#ASMSTART391; GFX9-NEXT: ; def s2392; GFX9-NEXT: ;;#ASMEND393; GFX9-NEXT: s_xor_b32 s2, s2, 0x80008000394; GFX9-NEXT: v_mov_b32_e32 v0, 0395; GFX9-NEXT: v_mov_b32_e32 v1, s2396; GFX9-NEXT: s_waitcnt lgkmcnt(0)397; GFX9-NEXT: global_store_dword v0, v1, s[0:1]398; GFX9-NEXT: s_endpgm399;400; GFX11-LABEL: s_fneg_v2f16_nonload:401; GFX11: ; %bb.0:402; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0403; GFX11-NEXT: ;;#ASMSTART404; GFX11-NEXT: ; def s2405; GFX11-NEXT: ;;#ASMEND406; GFX11-NEXT: s_xor_b32 s2, s2, 0x80008000407; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)408; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2409; GFX11-NEXT: s_waitcnt lgkmcnt(0)410; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]411; GFX11-NEXT: s_endpgm412 %in = call i32 asm sideeffect "; def $0", "=s"()413 %in.bc = bitcast i32 %in to <2 x half>414 %fneg = fsub <2 x half> <half -0.0, half -0.0>, %in.bc415 store <2 x half> %fneg, ptr addrspace(1) %out416 ret void417}418 419define amdgpu_kernel void @v_fneg_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {420; CI-LABEL: v_fneg_v2f16:421; CI: ; %bb.0:422; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x2423; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0424; CI-NEXT: s_add_i32 s12, s12, s17425; CI-NEXT: s_mov_b32 flat_scratch_lo, s13426; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8427; CI-NEXT: s_waitcnt lgkmcnt(0)428; CI-NEXT: v_mov_b32_e32 v1, s1429; CI-NEXT: v_add_i32_e32 v0, vcc, s0, v0430; CI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc431; CI-NEXT: flat_load_dword v2, v[0:1]432; CI-NEXT: s_waitcnt vmcnt(0)433; CI-NEXT: v_xor_b32_e32 v2, 0x80008000, v2434; CI-NEXT: flat_store_dword v[0:1], v2435; CI-NEXT: s_endpgm436;437; GFX8-LABEL: v_fneg_v2f16:438; GFX8: ; %bb.0:439; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x8440; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0441; GFX8-NEXT: s_add_i32 s12, s12, s17442; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13443; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8444; GFX8-NEXT: s_waitcnt lgkmcnt(0)445; GFX8-NEXT: v_mov_b32_e32 v1, s1446; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0447; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc448; GFX8-NEXT: flat_load_dword v2, v[0:1]449; GFX8-NEXT: s_waitcnt vmcnt(0)450; GFX8-NEXT: v_xor_b32_e32 v2, 0x80008000, v2451; GFX8-NEXT: flat_store_dword v[0:1], v2452; GFX8-NEXT: s_endpgm453;454; GFX9-LABEL: v_fneg_v2f16:455; GFX9: ; %bb.0:456; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x8457; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0458; GFX9-NEXT: s_waitcnt lgkmcnt(0)459; GFX9-NEXT: global_load_dword v1, v0, s[0:1]460; GFX9-NEXT: s_waitcnt vmcnt(0)461; GFX9-NEXT: v_xor_b32_e32 v1, 0x80008000, v1462; GFX9-NEXT: global_store_dword v0, v1, s[0:1]463; GFX9-NEXT: s_endpgm464;465; GFX11-LABEL: v_fneg_v2f16:466; GFX11: ; %bb.0:467; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x8468; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0469; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)470; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0471; GFX11-NEXT: s_waitcnt lgkmcnt(0)472; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]473; GFX11-NEXT: s_waitcnt vmcnt(0)474; GFX11-NEXT: v_xor_b32_e32 v1, 0x80008000, v1475; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]476; GFX11-NEXT: s_endpgm477 %tid = call i32 @llvm.amdgcn.workitem.id.x()478 %gep.in = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid479 %gep.out = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid480 %val = load <2 x half>, ptr addrspace(1) %gep.in, align 2481 %fneg = fsub <2 x half> <half -0.0, half -0.0>, %val482 store <2 x half> %fneg, ptr addrspace(1) %gep.out483 ret void484}485 486define amdgpu_kernel void @fneg_free_v2f16(ptr addrspace(1) %out, i32 %in) #0 {487; CI-LABEL: fneg_free_v2f16:488; CI: ; %bb.0:489; CI-NEXT: s_load_dword s2, s[8:9], 0x2490; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0491; CI-NEXT: s_add_i32 s12, s12, s17492; CI-NEXT: s_mov_b32 flat_scratch_lo, s13493; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8494; CI-NEXT: s_waitcnt lgkmcnt(0)495; CI-NEXT: s_xor_b32 s2, s2, 0x80008000496; CI-NEXT: v_mov_b32_e32 v0, s0497; CI-NEXT: v_mov_b32_e32 v1, s1498; CI-NEXT: v_mov_b32_e32 v2, s2499; CI-NEXT: flat_store_dword v[0:1], v2500; CI-NEXT: s_endpgm501;502; GFX8-LABEL: fneg_free_v2f16:503; GFX8: ; %bb.0:504; GFX8-NEXT: s_load_dword s2, s[8:9], 0x8505; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0506; GFX8-NEXT: s_add_i32 s12, s12, s17507; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13508; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8509; GFX8-NEXT: s_waitcnt lgkmcnt(0)510; GFX8-NEXT: s_xor_b32 s2, s2, 0x80008000511; GFX8-NEXT: v_mov_b32_e32 v0, s0512; GFX8-NEXT: v_mov_b32_e32 v1, s1513; GFX8-NEXT: v_mov_b32_e32 v2, s2514; GFX8-NEXT: flat_store_dword v[0:1], v2515; GFX8-NEXT: s_endpgm516;517; GFX9-LABEL: fneg_free_v2f16:518; GFX9: ; %bb.0:519; GFX9-NEXT: s_load_dword s2, s[8:9], 0x8520; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0521; GFX9-NEXT: v_mov_b32_e32 v0, 0522; GFX9-NEXT: s_waitcnt lgkmcnt(0)523; GFX9-NEXT: s_xor_b32 s2, s2, 0x80008000524; GFX9-NEXT: v_mov_b32_e32 v1, s2525; GFX9-NEXT: global_store_dword v0, v1, s[0:1]526; GFX9-NEXT: s_endpgm527;528; GFX11-LABEL: fneg_free_v2f16:529; GFX11: ; %bb.0:530; GFX11-NEXT: s_clause 0x1531; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x8532; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0533; GFX11-NEXT: s_waitcnt lgkmcnt(0)534; GFX11-NEXT: s_xor_b32 s2, s2, 0x80008000535; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)536; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2537; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]538; GFX11-NEXT: s_endpgm539 %bc = bitcast i32 %in to <2 x half>540 %fsub = fsub <2 x half> <half -0.0, half -0.0>, %bc541 store <2 x half> %fsub, ptr addrspace(1) %out542 ret void543}544 545define amdgpu_kernel void @v_fneg_fold_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {546; CI-LABEL: v_fneg_fold_v2f16:547; CI: ; %bb.0:548; CI-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0549; CI-NEXT: s_add_i32 s12, s12, s17550; CI-NEXT: s_mov_b32 flat_scratch_lo, s13551; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8552; CI-NEXT: s_waitcnt lgkmcnt(0)553; CI-NEXT: v_mov_b32_e32 v0, s2554; CI-NEXT: v_mov_b32_e32 v1, s3555; CI-NEXT: flat_load_dword v0, v[0:1]556; CI-NEXT: s_waitcnt vmcnt(0)557; CI-NEXT: v_xor_b32_e32 v2, 0x80008000, v0558; CI-NEXT: v_lshrrev_b32_e32 v1, 16, v0559; CI-NEXT: v_lshrrev_b32_e32 v3, 16, v2560; CI-NEXT: v_cvt_f32_f16_e32 v1, v1561; CI-NEXT: v_cvt_f32_f16_e32 v3, v3562; CI-NEXT: v_cvt_f32_f16_e32 v0, v0563; CI-NEXT: v_cvt_f32_f16_e32 v2, v2564; CI-NEXT: v_mul_f32_e32 v1, v3, v1565; CI-NEXT: v_cvt_f16_f32_e32 v3, v1566; CI-NEXT: v_mul_f32_e32 v0, v2, v0567; CI-NEXT: v_cvt_f16_f32_e32 v2, v0568; CI-NEXT: v_mov_b32_e32 v0, s0569; CI-NEXT: v_lshlrev_b32_e32 v3, 16, v3570; CI-NEXT: v_mov_b32_e32 v1, s1571; CI-NEXT: v_or_b32_e32 v2, v2, v3572; CI-NEXT: flat_store_dword v[0:1], v2573; CI-NEXT: s_endpgm574;575; GFX8-LABEL: v_fneg_fold_v2f16:576; GFX8: ; %bb.0:577; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0578; GFX8-NEXT: s_add_i32 s12, s12, s17579; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13580; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8581; GFX8-NEXT: s_waitcnt lgkmcnt(0)582; GFX8-NEXT: v_mov_b32_e32 v0, s2583; GFX8-NEXT: v_mov_b32_e32 v1, s3584; GFX8-NEXT: flat_load_dword v2, v[0:1]585; GFX8-NEXT: v_mov_b32_e32 v0, s0586; GFX8-NEXT: v_mov_b32_e32 v1, s1587; GFX8-NEXT: s_waitcnt vmcnt(0)588; GFX8-NEXT: v_mul_f16_sdwa v3, -v2, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1589; GFX8-NEXT: v_mul_f16_e64 v2, -v2, v2590; GFX8-NEXT: v_or_b32_e32 v2, v2, v3591; GFX8-NEXT: flat_store_dword v[0:1], v2592; GFX8-NEXT: s_endpgm593;594; GFX9-LABEL: v_fneg_fold_v2f16:595; GFX9: ; %bb.0:596; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0597; GFX9-NEXT: v_mov_b32_e32 v0, 0598; GFX9-NEXT: s_waitcnt lgkmcnt(0)599; GFX9-NEXT: global_load_dword v1, v0, s[2:3]600; GFX9-NEXT: s_waitcnt vmcnt(0)601; GFX9-NEXT: v_pk_mul_f16 v1, v1, v1 neg_lo:[1,0] neg_hi:[1,0]602; GFX9-NEXT: global_store_dword v0, v1, s[0:1]603; GFX9-NEXT: s_endpgm604;605; GFX11-LABEL: v_fneg_fold_v2f16:606; GFX11: ; %bb.0:607; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x0608; GFX11-NEXT: v_mov_b32_e32 v0, 0609; GFX11-NEXT: s_waitcnt lgkmcnt(0)610; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]611; GFX11-NEXT: s_waitcnt vmcnt(0)612; GFX11-NEXT: v_pk_mul_f16 v1, v1, v1 neg_lo:[1,0] neg_hi:[1,0]613; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]614; GFX11-NEXT: s_endpgm615 %val = load <2 x half>, ptr addrspace(1) %in616 %fsub = fsub <2 x half> <half -0.0, half -0.0>, %val617 %fmul = fmul <2 x half> %fsub, %val618 store <2 x half> %fmul, ptr addrspace(1) %out619 ret void620}621 622define amdgpu_kernel void @v_extract_fneg_fold_v2f16(ptr addrspace(1) %in) #0 {623; CI-LABEL: v_extract_fneg_fold_v2f16:624; CI: ; %bb.0:625; CI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0626; CI-NEXT: s_add_i32 s12, s12, s17627; CI-NEXT: s_mov_b32 flat_scratch_lo, s13628; CI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8629; CI-NEXT: s_waitcnt lgkmcnt(0)630; CI-NEXT: v_mov_b32_e32 v0, s0631; CI-NEXT: v_mov_b32_e32 v1, s1632; CI-NEXT: flat_load_dword v0, v[0:1]633; CI-NEXT: s_waitcnt vmcnt(0)634; CI-NEXT: v_lshrrev_b32_e32 v1, 16, v0635; CI-NEXT: v_cvt_f32_f16_e32 v0, v0636; CI-NEXT: v_cvt_f32_f16_e32 v1, v1637; CI-NEXT: v_mul_f32_e32 v0, -4.0, v0638; CI-NEXT: v_sub_f32_e32 v1, 2.0, v1639; CI-NEXT: v_cvt_f16_f32_e32 v0, v0640; CI-NEXT: v_cvt_f16_f32_e32 v1, v1641; CI-NEXT: flat_store_short v[0:1], v0642; CI-NEXT: s_waitcnt vmcnt(0)643; CI-NEXT: flat_store_short v[0:1], v1644; CI-NEXT: s_waitcnt vmcnt(0)645; CI-NEXT: s_endpgm646;647; GFX8-LABEL: v_extract_fneg_fold_v2f16:648; GFX8: ; %bb.0:649; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0650; GFX8-NEXT: s_add_i32 s12, s12, s17651; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13652; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8653; GFX8-NEXT: s_waitcnt lgkmcnt(0)654; GFX8-NEXT: v_mov_b32_e32 v0, s0655; GFX8-NEXT: v_mov_b32_e32 v1, s1656; GFX8-NEXT: flat_load_dword v0, v[0:1]657; GFX8-NEXT: v_mov_b32_e32 v1, 0x4000658; GFX8-NEXT: s_waitcnt vmcnt(0)659; GFX8-NEXT: v_mul_f16_e32 v2, -4.0, v0660; GFX8-NEXT: v_sub_f16_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1661; GFX8-NEXT: flat_store_short v[0:1], v2662; GFX8-NEXT: s_waitcnt vmcnt(0)663; GFX8-NEXT: flat_store_short v[0:1], v0664; GFX8-NEXT: s_waitcnt vmcnt(0)665; GFX8-NEXT: s_endpgm666;667; GFX9-LABEL: v_extract_fneg_fold_v2f16:668; GFX9: ; %bb.0:669; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0670; GFX9-NEXT: v_mov_b32_e32 v0, 0671; GFX9-NEXT: v_mov_b32_e32 v1, 0x4000672; GFX9-NEXT: s_waitcnt lgkmcnt(0)673; GFX9-NEXT: global_load_dword v0, v0, s[0:1]674; GFX9-NEXT: s_waitcnt vmcnt(0)675; GFX9-NEXT: v_mul_f16_e32 v2, -4.0, v0676; GFX9-NEXT: v_sub_f16_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1677; GFX9-NEXT: global_store_short v[0:1], v2, off678; GFX9-NEXT: s_waitcnt vmcnt(0)679; GFX9-NEXT: global_store_short v[0:1], v0, off680; GFX9-NEXT: s_waitcnt vmcnt(0)681; GFX9-NEXT: s_endpgm682;683; GFX11-TRUE16-LABEL: v_extract_fneg_fold_v2f16:684; GFX11-TRUE16: ; %bb.0:685; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x0686; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, 0687; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)688; GFX11-TRUE16-NEXT: global_load_b32 v0, v0, s[0:1]689; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)690; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0691; GFX11-TRUE16-NEXT: v_mul_f16_e32 v0.l, -4.0, v0.l692; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)693; GFX11-TRUE16-NEXT: v_sub_f16_e32 v0.h, 2.0, v1.l694; GFX11-TRUE16-NEXT: global_store_b16 v[0:1], v0, off dlc695; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0696; GFX11-TRUE16-NEXT: global_store_d16_hi_b16 v[0:1], v0, off dlc697; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0698; GFX11-TRUE16-NEXT: s_endpgm699;700; GFX11-FAKE16-LABEL: v_extract_fneg_fold_v2f16:701; GFX11-FAKE16: ; %bb.0:702; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x0703; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, 0704; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)705; GFX11-FAKE16-NEXT: global_load_b32 v0, v0, s[0:1]706; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)707; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0708; GFX11-FAKE16-NEXT: v_mul_f16_e32 v0, -4.0, v0709; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)710; GFX11-FAKE16-NEXT: v_sub_f16_e32 v1, 2.0, v1711; GFX11-FAKE16-NEXT: global_store_b16 v[0:1], v0, off dlc712; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0713; GFX11-FAKE16-NEXT: global_store_b16 v[0:1], v1, off dlc714; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0715; GFX11-FAKE16-NEXT: s_endpgm716 %val = load <2 x half>, ptr addrspace(1) %in717 %fneg = fsub <2 x half> <half -0.0, half -0.0>, %val718 %elt0 = extractelement <2 x half> %fneg, i32 0719 %elt1 = extractelement <2 x half> %fneg, i32 1720 721 %fmul0 = fmul half %elt0, 4.0722 %fadd1 = fadd half %elt1, 2.0723 store volatile half %fmul0, ptr addrspace(1) poison724 store volatile half %fadd1, ptr addrspace(1) poison725 ret void726}727 728define amdgpu_kernel void @v_extract_fneg_no_fold_v2f16(ptr addrspace(1) %in) #0 {729; CIVI-LABEL: v_extract_fneg_no_fold_v2f16:730; CIVI: ; %bb.0:731; CIVI-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0732; CIVI-NEXT: s_add_i32 s12, s12, s17733; CIVI-NEXT: s_mov_b32 flat_scratch_lo, s13734; CIVI-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8735; CIVI-NEXT: s_waitcnt lgkmcnt(0)736; CIVI-NEXT: v_mov_b32_e32 v0, s0737; CIVI-NEXT: v_mov_b32_e32 v1, s1738; CIVI-NEXT: flat_load_dword v0, v[0:1]739; CIVI-NEXT: s_waitcnt vmcnt(0)740; CIVI-NEXT: v_xor_b32_e32 v0, 0x80008000, v0741; CIVI-NEXT: v_lshrrev_b32_e32 v1, 16, v0742; CIVI-NEXT: flat_store_short v[0:1], v0743; CIVI-NEXT: s_waitcnt vmcnt(0)744; CIVI-NEXT: flat_store_short v[0:1], v1745; CIVI-NEXT: s_waitcnt vmcnt(0)746; CIVI-NEXT: s_endpgm747;748; GFX9-LABEL: v_extract_fneg_no_fold_v2f16:749; GFX9: ; %bb.0:750; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0751; GFX9-NEXT: v_mov_b32_e32 v0, 0752; GFX9-NEXT: s_waitcnt lgkmcnt(0)753; GFX9-NEXT: global_load_dword v0, v0, s[0:1]754; GFX9-NEXT: s_waitcnt vmcnt(0)755; GFX9-NEXT: v_xor_b32_e32 v0, 0x80008000, v0756; GFX9-NEXT: global_store_short v[0:1], v0, off757; GFX9-NEXT: s_waitcnt vmcnt(0)758; GFX9-NEXT: global_store_short_d16_hi v[0:1], v0, off759; GFX9-NEXT: s_waitcnt vmcnt(0)760; GFX9-NEXT: s_endpgm761;762; GFX11-LABEL: v_extract_fneg_no_fold_v2f16:763; GFX11: ; %bb.0:764; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0765; GFX11-NEXT: v_mov_b32_e32 v0, 0766; GFX11-NEXT: s_waitcnt lgkmcnt(0)767; GFX11-NEXT: global_load_b32 v0, v0, s[0:1]768; GFX11-NEXT: s_waitcnt vmcnt(0)769; GFX11-NEXT: v_xor_b32_e32 v0, 0x80008000, v0770; GFX11-NEXT: global_store_b16 v[0:1], v0, off dlc771; GFX11-NEXT: s_waitcnt_vscnt null, 0x0772; GFX11-NEXT: global_store_d16_hi_b16 v[0:1], v0, off dlc773; GFX11-NEXT: s_waitcnt_vscnt null, 0x0774; GFX11-NEXT: s_endpgm775 %val = load <2 x half>, ptr addrspace(1) %in776 %fneg = fsub <2 x half> <half -0.0, half -0.0>, %val777 %elt0 = extractelement <2 x half> %fneg, i32 0778 %elt1 = extractelement <2 x half> %fneg, i32 1779 store volatile half %elt0, ptr addrspace(1) poison780 store volatile half %elt1, ptr addrspace(1) poison781 ret void782}783 784declare i32 @llvm.amdgcn.workitem.id.x() #1785 786attributes #0 = { nounwind }787attributes #1 = { nounwind readnone }788