2302 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 -mtriple=amdgcn -mcpu=fiji -amdgpu-sdwa-peephole=0 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,NOSDWA %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -amdgpu-sdwa-peephole < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SDWA,GFX89 %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx900 -amdgpu-sdwa-peephole < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SDWA,GFX9_10,GFX9 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1010 -amdgpu-sdwa-peephole < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SDWA,GFX9_10,GFX10 %s6 7define amdgpu_kernel void @add_shr_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {8; NOSDWA-LABEL: add_shr_i32:9; NOSDWA: ; %bb.0:10; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2411; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)12; NOSDWA-NEXT: v_mov_b32_e32 v0, s213; NOSDWA-NEXT: v_mov_b32_e32 v1, s314; NOSDWA-NEXT: flat_load_dword v2, v[0:1]15; NOSDWA-NEXT: v_mov_b32_e32 v0, s016; NOSDWA-NEXT: v_mov_b32_e32 v1, s117; NOSDWA-NEXT: s_waitcnt vmcnt(0)18; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v219; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, v3, v220; NOSDWA-NEXT: flat_store_dword v[0:1], v221; NOSDWA-NEXT: s_endpgm22;23; GFX89-LABEL: add_shr_i32:24; GFX89: ; %bb.0:25; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2426; GFX89-NEXT: s_waitcnt lgkmcnt(0)27; GFX89-NEXT: v_mov_b32_e32 v0, s228; GFX89-NEXT: v_mov_b32_e32 v1, s329; GFX89-NEXT: flat_load_dword v2, v[0:1]30; GFX89-NEXT: v_mov_b32_e32 v0, s031; GFX89-NEXT: v_mov_b32_e32 v1, s132; GFX89-NEXT: s_waitcnt vmcnt(0)33; GFX89-NEXT: v_add_u32_sdwa v2, vcc, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD34; GFX89-NEXT: flat_store_dword v[0:1], v235; GFX89-NEXT: s_endpgm36;37; GFX9-LABEL: add_shr_i32:38; GFX9: ; %bb.0:39; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2440; GFX9-NEXT: v_mov_b32_e32 v0, 041; GFX9-NEXT: s_waitcnt lgkmcnt(0)42; GFX9-NEXT: global_load_dword v1, v0, s[2:3]43; GFX9-NEXT: s_waitcnt vmcnt(0)44; GFX9-NEXT: v_add_u32_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_145; GFX9-NEXT: global_store_dword v0, v1, s[0:1]46; GFX9-NEXT: s_endpgm47;48; GFX10-LABEL: add_shr_i32:49; GFX10: ; %bb.0:50; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2451; GFX10-NEXT: v_mov_b32_e32 v0, 052; GFX10-NEXT: s_waitcnt lgkmcnt(0)53; GFX10-NEXT: global_load_dword v1, v0, s[2:3]54; GFX10-NEXT: s_waitcnt vmcnt(0)55; GFX10-NEXT: v_add_nc_u32_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_156; GFX10-NEXT: global_store_dword v0, v1, s[0:1]57; GFX10-NEXT: s_endpgm58 %a = load i32, ptr addrspace(1) %in, align 459 %shr = lshr i32 %a, 1660 %add = add i32 %a, %shr61 store i32 %add, ptr addrspace(1) %out, align 462 ret void63}64 65define amdgpu_kernel void @sub_shr_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {66; NOSDWA-LABEL: sub_shr_i32:67; NOSDWA: ; %bb.0:68; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2469; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)70; NOSDWA-NEXT: v_mov_b32_e32 v0, s271; NOSDWA-NEXT: v_mov_b32_e32 v1, s372; NOSDWA-NEXT: flat_load_dword v2, v[0:1]73; NOSDWA-NEXT: v_mov_b32_e32 v0, s074; NOSDWA-NEXT: v_mov_b32_e32 v1, s175; NOSDWA-NEXT: s_waitcnt vmcnt(0)76; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v277; NOSDWA-NEXT: v_sub_u32_e32 v2, vcc, v3, v278; NOSDWA-NEXT: flat_store_dword v[0:1], v279; NOSDWA-NEXT: s_endpgm80;81; GFX89-LABEL: sub_shr_i32:82; GFX89: ; %bb.0:83; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2484; GFX89-NEXT: s_waitcnt lgkmcnt(0)85; GFX89-NEXT: v_mov_b32_e32 v0, s286; GFX89-NEXT: v_mov_b32_e32 v1, s387; GFX89-NEXT: flat_load_dword v2, v[0:1]88; GFX89-NEXT: v_mov_b32_e32 v0, s089; GFX89-NEXT: v_mov_b32_e32 v1, s190; GFX89-NEXT: s_waitcnt vmcnt(0)91; GFX89-NEXT: v_sub_u32_sdwa v2, vcc, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD92; GFX89-NEXT: flat_store_dword v[0:1], v293; GFX89-NEXT: s_endpgm94;95; GFX9-LABEL: sub_shr_i32:96; GFX9: ; %bb.0:97; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2498; GFX9-NEXT: v_mov_b32_e32 v0, 099; GFX9-NEXT: s_waitcnt lgkmcnt(0)100; GFX9-NEXT: global_load_dword v1, v0, s[2:3]101; GFX9-NEXT: s_waitcnt vmcnt(0)102; GFX9-NEXT: v_sub_u32_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD103; GFX9-NEXT: global_store_dword v0, v1, s[0:1]104; GFX9-NEXT: s_endpgm105;106; GFX10-LABEL: sub_shr_i32:107; GFX10: ; %bb.0:108; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24109; GFX10-NEXT: v_mov_b32_e32 v0, 0110; GFX10-NEXT: s_waitcnt lgkmcnt(0)111; GFX10-NEXT: global_load_dword v1, v0, s[2:3]112; GFX10-NEXT: s_waitcnt vmcnt(0)113; GFX10-NEXT: v_sub_nc_u32_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD114; GFX10-NEXT: global_store_dword v0, v1, s[0:1]115; GFX10-NEXT: s_endpgm116 %a = load i32, ptr addrspace(1) %in, align 4117 %shr = lshr i32 %a, 16118 %sub = sub i32 %shr, %a119 store i32 %sub, ptr addrspace(1) %out, align 4120 ret void121}122 123define amdgpu_kernel void @mul_shr_i32(ptr addrspace(1) %out, ptr addrspace(1) %in1, ptr addrspace(1) %in2) #0 {124; NOSDWA-LABEL: mul_shr_i32:125; NOSDWA: ; %bb.0:126; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24127; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34128; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 2, v0129; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)130; NOSDWA-NEXT: v_mov_b32_e32 v1, s3131; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v2132; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc133; NOSDWA-NEXT: v_mov_b32_e32 v3, s5134; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v2135; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc136; NOSDWA-NEXT: flat_load_dword v4, v[0:1]137; NOSDWA-NEXT: flat_load_dword v2, v[2:3]138; NOSDWA-NEXT: v_mov_b32_e32 v0, s0139; NOSDWA-NEXT: v_mov_b32_e32 v1, s1140; NOSDWA-NEXT: s_waitcnt vmcnt(1)141; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v4142; NOSDWA-NEXT: s_waitcnt vmcnt(0)143; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v2144; NOSDWA-NEXT: v_mul_u32_u24_e32 v2, v3, v2145; NOSDWA-NEXT: flat_store_dword v[0:1], v2146; NOSDWA-NEXT: s_endpgm147;148; GFX89-LABEL: mul_shr_i32:149; GFX89: ; %bb.0:150; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24151; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34152; GFX89-NEXT: v_lshlrev_b32_e32 v2, 2, v0153; GFX89-NEXT: s_waitcnt lgkmcnt(0)154; GFX89-NEXT: v_mov_b32_e32 v1, s3155; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v2156; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc157; GFX89-NEXT: v_mov_b32_e32 v3, s5158; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v2159; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc160; GFX89-NEXT: flat_load_dword v4, v[0:1]161; GFX89-NEXT: flat_load_dword v2, v[2:3]162; GFX89-NEXT: v_mov_b32_e32 v0, s0163; GFX89-NEXT: v_mov_b32_e32 v1, s1164; GFX89-NEXT: s_waitcnt vmcnt(0)165; GFX89-NEXT: v_mul_u32_u24_sdwa v2, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1166; GFX89-NEXT: flat_store_dword v[0:1], v2167; GFX89-NEXT: s_endpgm168;169; GFX9-LABEL: mul_shr_i32:170; GFX9: ; %bb.0:171; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24172; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34173; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0174; GFX9-NEXT: s_waitcnt lgkmcnt(0)175; GFX9-NEXT: global_load_dword v1, v0, s[2:3]176; GFX9-NEXT: global_load_dword v2, v0, s[6:7]177; GFX9-NEXT: v_mov_b32_e32 v0, 0178; GFX9-NEXT: s_waitcnt vmcnt(0)179; GFX9-NEXT: v_mul_u32_u24_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1180; GFX9-NEXT: global_store_dword v0, v1, s[0:1]181; GFX9-NEXT: s_endpgm182;183; GFX10-LABEL: mul_shr_i32:184; GFX10: ; %bb.0:185; GFX10-NEXT: s_clause 0x1186; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24187; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34188; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0189; GFX10-NEXT: s_waitcnt lgkmcnt(0)190; GFX10-NEXT: s_clause 0x1191; GFX10-NEXT: global_load_dword v1, v0, s[2:3]192; GFX10-NEXT: global_load_dword v2, v0, s[6:7]193; GFX10-NEXT: v_mov_b32_e32 v0, 0194; GFX10-NEXT: s_waitcnt vmcnt(0)195; GFX10-NEXT: v_mul_u32_u24_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1196; GFX10-NEXT: global_store_dword v0, v1, s[0:1]197; GFX10-NEXT: s_endpgm198 %idx = call i32 @llvm.amdgcn.workitem.id.x()199 %gep1 = getelementptr i32, ptr addrspace(1) %in1, i32 %idx200 %gep2 = getelementptr i32, ptr addrspace(1) %in2, i32 %idx201 %a = load i32, ptr addrspace(1) %gep1, align 4202 %b = load i32, ptr addrspace(1) %gep2, align 4203 %shra = lshr i32 %a, 16204 %shrb = lshr i32 %b, 16205 %mul = mul i32 %shra, %shrb206 store i32 %mul, ptr addrspace(1) %out, align 4207 ret void208}209 210define amdgpu_kernel void @mul_i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {211; NOSDWA-LABEL: mul_i16:212; NOSDWA: ; %bb.0: ; %entry213; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24214; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34215; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 1, v0216; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)217; NOSDWA-NEXT: v_mov_b32_e32 v1, s3218; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v2219; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc220; NOSDWA-NEXT: v_mov_b32_e32 v3, s5221; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v2222; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc223; NOSDWA-NEXT: flat_load_ushort v4, v[0:1]224; NOSDWA-NEXT: flat_load_ushort v2, v[2:3]225; NOSDWA-NEXT: v_mov_b32_e32 v0, s0226; NOSDWA-NEXT: v_mov_b32_e32 v1, s1227; NOSDWA-NEXT: s_waitcnt vmcnt(0)228; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v4, v2229; NOSDWA-NEXT: flat_store_short v[0:1], v2230; NOSDWA-NEXT: s_endpgm231;232; GFX89-LABEL: mul_i16:233; GFX89: ; %bb.0: ; %entry234; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24235; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34236; GFX89-NEXT: v_lshlrev_b32_e32 v2, 1, v0237; GFX89-NEXT: s_waitcnt lgkmcnt(0)238; GFX89-NEXT: v_mov_b32_e32 v1, s3239; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v2240; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc241; GFX89-NEXT: v_mov_b32_e32 v3, s5242; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v2243; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc244; GFX89-NEXT: flat_load_ushort v4, v[0:1]245; GFX89-NEXT: flat_load_ushort v2, v[2:3]246; GFX89-NEXT: v_mov_b32_e32 v0, s0247; GFX89-NEXT: v_mov_b32_e32 v1, s1248; GFX89-NEXT: s_waitcnt vmcnt(0)249; GFX89-NEXT: v_mul_lo_u16_e32 v2, v4, v2250; GFX89-NEXT: flat_store_short v[0:1], v2251; GFX89-NEXT: s_endpgm252;253; GFX9-LABEL: mul_i16:254; GFX9: ; %bb.0: ; %entry255; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24256; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34257; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0258; GFX9-NEXT: s_waitcnt lgkmcnt(0)259; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]260; GFX9-NEXT: global_load_ushort v2, v0, s[6:7]261; GFX9-NEXT: v_mov_b32_e32 v0, 0262; GFX9-NEXT: s_waitcnt vmcnt(0)263; GFX9-NEXT: v_mul_lo_u16_e32 v1, v1, v2264; GFX9-NEXT: global_store_short v0, v1, s[0:1]265; GFX9-NEXT: s_endpgm266;267; GFX10-LABEL: mul_i16:268; GFX10: ; %bb.0: ; %entry269; GFX10-NEXT: s_clause 0x1270; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24271; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34272; GFX10-NEXT: v_lshlrev_b32_e32 v0, 1, v0273; GFX10-NEXT: s_waitcnt lgkmcnt(0)274; GFX10-NEXT: s_clause 0x1275; GFX10-NEXT: global_load_ushort v1, v0, s[2:3]276; GFX10-NEXT: global_load_ushort v2, v0, s[6:7]277; GFX10-NEXT: v_mov_b32_e32 v0, 0278; GFX10-NEXT: s_waitcnt vmcnt(0)279; GFX10-NEXT: v_mul_lo_u16 v1, v1, v2280; GFX10-NEXT: global_store_short v0, v1, s[0:1]281; GFX10-NEXT: s_endpgm282entry:283 %idx = call i32 @llvm.amdgcn.workitem.id.x()284 %gepa = getelementptr i16, ptr addrspace(1) %ina, i32 %idx285 %gepb = getelementptr i16, ptr addrspace(1) %inb, i32 %idx286 %a = load i16, ptr addrspace(1) %gepa, align 4287 %b = load i16, ptr addrspace(1) %gepb, align 4288 %mul = mul i16 %a, %b289 store i16 %mul, ptr addrspace(1) %out, align 4290 ret void291}292 293define amdgpu_kernel void @mul_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {294; NOSDWA-LABEL: mul_v2i16:295; NOSDWA: ; %bb.0: ; %entry296; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24297; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34298; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 2, v0299; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)300; NOSDWA-NEXT: v_mov_b32_e32 v1, s3301; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v2302; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc303; NOSDWA-NEXT: v_mov_b32_e32 v3, s5304; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v2305; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc306; NOSDWA-NEXT: flat_load_dword v4, v[0:1]307; NOSDWA-NEXT: flat_load_dword v2, v[2:3]308; NOSDWA-NEXT: v_mov_b32_e32 v0, s0309; NOSDWA-NEXT: v_mov_b32_e32 v1, s1310; NOSDWA-NEXT: s_waitcnt vmcnt(0)311; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v4, v2312; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v2313; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v4314; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v4, v2315; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 16, v2316; NOSDWA-NEXT: v_or_b32_e32 v2, v3, v2317; NOSDWA-NEXT: flat_store_dword v[0:1], v2318; NOSDWA-NEXT: s_endpgm319;320; GFX89-LABEL: mul_v2i16:321; GFX89: ; %bb.0: ; %entry322; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24323; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34324; GFX89-NEXT: v_lshlrev_b32_e32 v2, 2, v0325; GFX89-NEXT: s_waitcnt lgkmcnt(0)326; GFX89-NEXT: v_mov_b32_e32 v1, s3327; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v2328; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc329; GFX89-NEXT: v_mov_b32_e32 v3, s5330; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v2331; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc332; GFX89-NEXT: flat_load_dword v4, v[0:1]333; GFX89-NEXT: flat_load_dword v2, v[2:3]334; GFX89-NEXT: v_mov_b32_e32 v0, s0335; GFX89-NEXT: v_mov_b32_e32 v1, s1336; GFX89-NEXT: s_waitcnt vmcnt(0)337; GFX89-NEXT: v_mul_lo_u16_e32 v3, v4, v2338; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1339; GFX89-NEXT: v_or_b32_e32 v2, v3, v2340; GFX89-NEXT: flat_store_dword v[0:1], v2341; GFX89-NEXT: s_endpgm342;343; GFX9-LABEL: mul_v2i16:344; GFX9: ; %bb.0: ; %entry345; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24346; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34347; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0348; GFX9-NEXT: s_waitcnt lgkmcnt(0)349; GFX9-NEXT: global_load_dword v1, v0, s[2:3]350; GFX9-NEXT: global_load_dword v2, v0, s[6:7]351; GFX9-NEXT: v_mov_b32_e32 v0, 0352; GFX9-NEXT: s_waitcnt vmcnt(0)353; GFX9-NEXT: v_pk_mul_lo_u16 v1, v1, v2354; GFX9-NEXT: global_store_dword v0, v1, s[0:1]355; GFX9-NEXT: s_endpgm356;357; GFX10-LABEL: mul_v2i16:358; GFX10: ; %bb.0: ; %entry359; GFX10-NEXT: s_clause 0x1360; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24361; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34362; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0363; GFX10-NEXT: s_waitcnt lgkmcnt(0)364; GFX10-NEXT: s_clause 0x1365; GFX10-NEXT: global_load_dword v1, v0, s[2:3]366; GFX10-NEXT: global_load_dword v2, v0, s[6:7]367; GFX10-NEXT: v_mov_b32_e32 v0, 0368; GFX10-NEXT: s_waitcnt vmcnt(0)369; GFX10-NEXT: v_pk_mul_lo_u16 v1, v1, v2370; GFX10-NEXT: global_store_dword v0, v1, s[0:1]371; GFX10-NEXT: s_endpgm372entry:373 %idx = call i32 @llvm.amdgcn.workitem.id.x()374 %gepa = getelementptr <2 x i16>, ptr addrspace(1) %ina, i32 %idx375 %gepb = getelementptr <2 x i16>, ptr addrspace(1) %inb, i32 %idx376 %a = load <2 x i16>, ptr addrspace(1) %gepa, align 4377 %b = load <2 x i16>, ptr addrspace(1) %gepb, align 4378 %mul = mul <2 x i16> %a, %b379 store <2 x i16> %mul, ptr addrspace(1) %out, align 4380 ret void381}382 383define amdgpu_kernel void @mul_v4i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {384; NOSDWA-LABEL: mul_v4i16:385; NOSDWA: ; %bb.0: ; %entry386; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24387; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34388; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 3, v0389; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)390; NOSDWA-NEXT: v_mov_b32_e32 v1, s3391; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v2392; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc393; NOSDWA-NEXT: v_mov_b32_e32 v3, s5394; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v2395; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc396; NOSDWA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]397; NOSDWA-NEXT: flat_load_dwordx2 v[2:3], v[2:3]398; NOSDWA-NEXT: v_mov_b32_e32 v4, s0399; NOSDWA-NEXT: v_mov_b32_e32 v5, s1400; NOSDWA-NEXT: s_waitcnt vmcnt(0)401; NOSDWA-NEXT: v_mul_lo_u16_e32 v6, v1, v3402; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v3403; NOSDWA-NEXT: v_lshrrev_b32_e32 v1, 16, v1404; NOSDWA-NEXT: v_mul_lo_u16_e32 v7, v0, v2405; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v2406; NOSDWA-NEXT: v_lshrrev_b32_e32 v0, 16, v0407; NOSDWA-NEXT: v_mul_lo_u16_e32 v1, v1, v3408; NOSDWA-NEXT: v_mul_lo_u16_e32 v0, v0, v2409; NOSDWA-NEXT: v_lshlrev_b32_e32 v1, 16, v1410; NOSDWA-NEXT: v_lshlrev_b32_e32 v0, 16, v0411; NOSDWA-NEXT: v_or_b32_e32 v1, v6, v1412; NOSDWA-NEXT: v_or_b32_e32 v0, v7, v0413; NOSDWA-NEXT: flat_store_dwordx2 v[4:5], v[0:1]414; NOSDWA-NEXT: s_endpgm415;416; GFX89-LABEL: mul_v4i16:417; GFX89: ; %bb.0: ; %entry418; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24419; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34420; GFX89-NEXT: v_lshlrev_b32_e32 v2, 3, v0421; GFX89-NEXT: s_waitcnt lgkmcnt(0)422; GFX89-NEXT: v_mov_b32_e32 v1, s3423; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v2424; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc425; GFX89-NEXT: v_mov_b32_e32 v3, s5426; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v2427; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc428; GFX89-NEXT: flat_load_dwordx2 v[0:1], v[0:1]429; GFX89-NEXT: flat_load_dwordx2 v[2:3], v[2:3]430; GFX89-NEXT: v_mov_b32_e32 v4, s0431; GFX89-NEXT: v_mov_b32_e32 v5, s1432; GFX89-NEXT: s_waitcnt vmcnt(0)433; GFX89-NEXT: v_mul_lo_u16_e32 v6, v1, v3434; GFX89-NEXT: v_mul_lo_u16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1435; GFX89-NEXT: v_mul_lo_u16_e32 v3, v0, v2436; GFX89-NEXT: v_mul_lo_u16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1437; GFX89-NEXT: v_or_b32_e32 v1, v6, v1438; GFX89-NEXT: v_or_b32_e32 v0, v3, v0439; GFX89-NEXT: flat_store_dwordx2 v[4:5], v[0:1]440; GFX89-NEXT: s_endpgm441;442; GFX9-LABEL: mul_v4i16:443; GFX9: ; %bb.0: ; %entry444; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24445; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34446; GFX9-NEXT: v_lshlrev_b32_e32 v4, 3, v0447; GFX9-NEXT: s_waitcnt lgkmcnt(0)448; GFX9-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]449; GFX9-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]450; GFX9-NEXT: v_mov_b32_e32 v4, 0451; GFX9-NEXT: s_waitcnt vmcnt(0)452; GFX9-NEXT: v_pk_mul_lo_u16 v1, v1, v3453; GFX9-NEXT: v_pk_mul_lo_u16 v0, v0, v2454; GFX9-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]455; GFX9-NEXT: s_endpgm456;457; GFX10-LABEL: mul_v4i16:458; GFX10: ; %bb.0: ; %entry459; GFX10-NEXT: s_clause 0x1460; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24461; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34462; GFX10-NEXT: v_lshlrev_b32_e32 v4, 3, v0463; GFX10-NEXT: s_waitcnt lgkmcnt(0)464; GFX10-NEXT: s_clause 0x1465; GFX10-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]466; GFX10-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]467; GFX10-NEXT: v_mov_b32_e32 v4, 0468; GFX10-NEXT: s_waitcnt vmcnt(0)469; GFX10-NEXT: v_pk_mul_lo_u16 v1, v1, v3470; GFX10-NEXT: v_pk_mul_lo_u16 v0, v0, v2471; GFX10-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]472; GFX10-NEXT: s_endpgm473entry:474 %idx = call i32 @llvm.amdgcn.workitem.id.x()475 %gepa = getelementptr <4 x i16>, ptr addrspace(1) %ina, i32 %idx476 %gepb = getelementptr <4 x i16>, ptr addrspace(1) %inb, i32 %idx477 %a = load <4 x i16>, ptr addrspace(1) %gepa, align 4478 %b = load <4 x i16>, ptr addrspace(1) %gepb, align 4479 %mul = mul <4 x i16> %a, %b480 store <4 x i16> %mul, ptr addrspace(1) %out, align 4481 ret void482}483 484define amdgpu_kernel void @mul_v8i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {485; NOSDWA-LABEL: mul_v8i16:486; NOSDWA: ; %bb.0: ; %entry487; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24488; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34489; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 4, v0490; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)491; NOSDWA-NEXT: v_mov_b32_e32 v1, s3492; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v2493; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc494; NOSDWA-NEXT: v_mov_b32_e32 v3, s5495; NOSDWA-NEXT: v_add_u32_e32 v4, vcc, s4, v2496; NOSDWA-NEXT: v_addc_u32_e32 v5, vcc, 0, v3, vcc497; NOSDWA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]498; NOSDWA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]499; NOSDWA-NEXT: v_mov_b32_e32 v8, s0500; NOSDWA-NEXT: v_mov_b32_e32 v9, s1501; NOSDWA-NEXT: s_waitcnt vmcnt(0)502; NOSDWA-NEXT: v_mul_lo_u16_e32 v10, v3, v7503; NOSDWA-NEXT: v_lshrrev_b32_e32 v7, 16, v7504; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v3505; NOSDWA-NEXT: v_mul_lo_u16_e32 v11, v2, v6506; NOSDWA-NEXT: v_lshrrev_b32_e32 v6, 16, v6507; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v2508; NOSDWA-NEXT: v_mul_lo_u16_e32 v12, v1, v5509; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v5510; NOSDWA-NEXT: v_lshrrev_b32_e32 v1, 16, v1511; NOSDWA-NEXT: v_mul_lo_u16_e32 v13, v0, v4512; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v4513; NOSDWA-NEXT: v_lshrrev_b32_e32 v0, 16, v0514; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v3, v7515; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v2, v6516; NOSDWA-NEXT: v_mul_lo_u16_e32 v1, v1, v5517; NOSDWA-NEXT: v_mul_lo_u16_e32 v0, v0, v4518; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v3519; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 16, v2520; NOSDWA-NEXT: v_lshlrev_b32_e32 v1, 16, v1521; NOSDWA-NEXT: v_lshlrev_b32_e32 v0, 16, v0522; NOSDWA-NEXT: v_or_b32_e32 v3, v10, v3523; NOSDWA-NEXT: v_or_b32_e32 v2, v11, v2524; NOSDWA-NEXT: v_or_b32_e32 v1, v12, v1525; NOSDWA-NEXT: v_or_b32_e32 v0, v13, v0526; NOSDWA-NEXT: flat_store_dwordx4 v[8:9], v[0:3]527; NOSDWA-NEXT: s_endpgm528;529; GFX89-LABEL: mul_v8i16:530; GFX89: ; %bb.0: ; %entry531; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24532; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34533; GFX89-NEXT: v_lshlrev_b32_e32 v2, 4, v0534; GFX89-NEXT: s_waitcnt lgkmcnt(0)535; GFX89-NEXT: v_mov_b32_e32 v1, s3536; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v2537; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc538; GFX89-NEXT: v_mov_b32_e32 v3, s5539; GFX89-NEXT: v_add_u32_e32 v4, vcc, s4, v2540; GFX89-NEXT: v_addc_u32_e32 v5, vcc, 0, v3, vcc541; GFX89-NEXT: flat_load_dwordx4 v[0:3], v[0:1]542; GFX89-NEXT: flat_load_dwordx4 v[4:7], v[4:5]543; GFX89-NEXT: v_mov_b32_e32 v8, s0544; GFX89-NEXT: v_mov_b32_e32 v9, s1545; GFX89-NEXT: s_waitcnt vmcnt(0)546; GFX89-NEXT: v_mul_lo_u16_e32 v10, v3, v7547; GFX89-NEXT: v_mul_lo_u16_sdwa v3, v3, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1548; GFX89-NEXT: v_mul_lo_u16_e32 v7, v2, v6549; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v2, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1550; GFX89-NEXT: v_mul_lo_u16_e32 v6, v1, v5551; GFX89-NEXT: v_mul_lo_u16_sdwa v1, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1552; GFX89-NEXT: v_mul_lo_u16_e32 v5, v0, v4553; GFX89-NEXT: v_mul_lo_u16_sdwa v0, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1554; GFX89-NEXT: v_or_b32_e32 v3, v10, v3555; GFX89-NEXT: v_or_b32_e32 v2, v7, v2556; GFX89-NEXT: v_or_b32_e32 v1, v6, v1557; GFX89-NEXT: v_or_b32_e32 v0, v5, v0558; GFX89-NEXT: flat_store_dwordx4 v[8:9], v[0:3]559; GFX89-NEXT: s_endpgm560;561; GFX9-LABEL: mul_v8i16:562; GFX9: ; %bb.0: ; %entry563; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24564; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34565; GFX9-NEXT: v_lshlrev_b32_e32 v8, 4, v0566; GFX9-NEXT: s_waitcnt lgkmcnt(0)567; GFX9-NEXT: global_load_dwordx4 v[0:3], v8, s[2:3]568; GFX9-NEXT: global_load_dwordx4 v[4:7], v8, s[6:7]569; GFX9-NEXT: v_mov_b32_e32 v8, 0570; GFX9-NEXT: s_waitcnt vmcnt(0)571; GFX9-NEXT: v_pk_mul_lo_u16 v3, v3, v7572; GFX9-NEXT: v_pk_mul_lo_u16 v2, v2, v6573; GFX9-NEXT: v_pk_mul_lo_u16 v1, v1, v5574; GFX9-NEXT: v_pk_mul_lo_u16 v0, v0, v4575; GFX9-NEXT: global_store_dwordx4 v8, v[0:3], s[0:1]576; GFX9-NEXT: s_endpgm577;578; GFX10-LABEL: mul_v8i16:579; GFX10: ; %bb.0: ; %entry580; GFX10-NEXT: s_clause 0x1581; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24582; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34583; GFX10-NEXT: v_lshlrev_b32_e32 v8, 4, v0584; GFX10-NEXT: s_waitcnt lgkmcnt(0)585; GFX10-NEXT: s_clause 0x1586; GFX10-NEXT: global_load_dwordx4 v[0:3], v8, s[2:3]587; GFX10-NEXT: global_load_dwordx4 v[4:7], v8, s[6:7]588; GFX10-NEXT: v_mov_b32_e32 v8, 0589; GFX10-NEXT: s_waitcnt vmcnt(0)590; GFX10-NEXT: v_pk_mul_lo_u16 v3, v3, v7591; GFX10-NEXT: v_pk_mul_lo_u16 v2, v2, v6592; GFX10-NEXT: v_pk_mul_lo_u16 v1, v1, v5593; GFX10-NEXT: v_pk_mul_lo_u16 v0, v0, v4594; GFX10-NEXT: global_store_dwordx4 v8, v[0:3], s[0:1]595; GFX10-NEXT: s_endpgm596entry:597 %idx = call i32 @llvm.amdgcn.workitem.id.x()598 %gepa = getelementptr <8 x i16>, ptr addrspace(1) %ina, i32 %idx599 %gepb = getelementptr <8 x i16>, ptr addrspace(1) %inb, i32 %idx600 %a = load <8 x i16>, ptr addrspace(1) %gepa, align 4601 %b = load <8 x i16>, ptr addrspace(1) %gepb, align 4602 %mul = mul <8 x i16> %a, %b603 store <8 x i16> %mul, ptr addrspace(1) %out, align 4604 ret void605}606 607define amdgpu_kernel void @mul_half(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {608; NOSDWA-LABEL: mul_half:609; NOSDWA: ; %bb.0: ; %entry610; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24611; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34612; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)613; NOSDWA-NEXT: v_mov_b32_e32 v0, s2614; NOSDWA-NEXT: v_mov_b32_e32 v1, s3615; NOSDWA-NEXT: v_mov_b32_e32 v2, s4616; NOSDWA-NEXT: v_mov_b32_e32 v3, s5617; NOSDWA-NEXT: flat_load_ushort v4, v[0:1]618; NOSDWA-NEXT: flat_load_ushort v2, v[2:3]619; NOSDWA-NEXT: v_mov_b32_e32 v0, s0620; NOSDWA-NEXT: v_mov_b32_e32 v1, s1621; NOSDWA-NEXT: s_waitcnt vmcnt(0)622; NOSDWA-NEXT: v_mul_f16_e32 v2, v4, v2623; NOSDWA-NEXT: flat_store_short v[0:1], v2624; NOSDWA-NEXT: s_endpgm625;626; GFX89-LABEL: mul_half:627; GFX89: ; %bb.0: ; %entry628; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24629; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34630; GFX89-NEXT: s_waitcnt lgkmcnt(0)631; GFX89-NEXT: v_mov_b32_e32 v0, s2632; GFX89-NEXT: v_mov_b32_e32 v1, s3633; GFX89-NEXT: v_mov_b32_e32 v2, s4634; GFX89-NEXT: v_mov_b32_e32 v3, s5635; GFX89-NEXT: flat_load_ushort v4, v[0:1]636; GFX89-NEXT: flat_load_ushort v2, v[2:3]637; GFX89-NEXT: v_mov_b32_e32 v0, s0638; GFX89-NEXT: v_mov_b32_e32 v1, s1639; GFX89-NEXT: s_waitcnt vmcnt(0)640; GFX89-NEXT: v_mul_f16_e32 v2, v4, v2641; GFX89-NEXT: flat_store_short v[0:1], v2642; GFX89-NEXT: s_endpgm643;644; GFX9-LABEL: mul_half:645; GFX9: ; %bb.0: ; %entry646; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24647; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34648; GFX9-NEXT: v_mov_b32_e32 v0, 0649; GFX9-NEXT: s_waitcnt lgkmcnt(0)650; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]651; GFX9-NEXT: global_load_ushort v2, v0, s[6:7]652; GFX9-NEXT: s_waitcnt vmcnt(0)653; GFX9-NEXT: v_mul_f16_e32 v1, v1, v2654; GFX9-NEXT: global_store_short v0, v1, s[0:1]655; GFX9-NEXT: s_endpgm656;657; GFX10-LABEL: mul_half:658; GFX10: ; %bb.0: ; %entry659; GFX10-NEXT: s_clause 0x1660; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24661; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34662; GFX10-NEXT: v_mov_b32_e32 v0, 0663; GFX10-NEXT: s_waitcnt lgkmcnt(0)664; GFX10-NEXT: s_clause 0x1665; GFX10-NEXT: global_load_ushort v1, v0, s[2:3]666; GFX10-NEXT: global_load_ushort v2, v0, s[6:7]667; GFX10-NEXT: s_waitcnt vmcnt(0)668; GFX10-NEXT: v_mul_f16_e32 v1, v1, v2669; GFX10-NEXT: global_store_short v0, v1, s[0:1]670; GFX10-NEXT: s_endpgm671entry:672 %a = load half, ptr addrspace(1) %ina, align 4673 %b = load half, ptr addrspace(1) %inb, align 4674 %mul = fmul half %a, %b675 store half %mul, ptr addrspace(1) %out, align 4676 ret void677}678 679define amdgpu_kernel void @mul_v2half(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {680; NOSDWA-LABEL: mul_v2half:681; NOSDWA: ; %bb.0: ; %entry682; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24683; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34684; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)685; NOSDWA-NEXT: v_mov_b32_e32 v0, s2686; NOSDWA-NEXT: v_mov_b32_e32 v2, s4687; NOSDWA-NEXT: v_mov_b32_e32 v3, s5688; NOSDWA-NEXT: v_mov_b32_e32 v1, s3689; NOSDWA-NEXT: flat_load_dword v2, v[2:3]690; NOSDWA-NEXT: flat_load_dword v3, v[0:1]691; NOSDWA-NEXT: v_mov_b32_e32 v0, s0692; NOSDWA-NEXT: v_mov_b32_e32 v1, s1693; NOSDWA-NEXT: s_waitcnt vmcnt(1)694; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v2695; NOSDWA-NEXT: s_waitcnt vmcnt(0)696; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v3697; NOSDWA-NEXT: v_mul_f16_e32 v4, v5, v4698; NOSDWA-NEXT: v_lshlrev_b32_e32 v4, 16, v4699; NOSDWA-NEXT: v_mul_f16_e32 v2, v3, v2700; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v4701; NOSDWA-NEXT: flat_store_dword v[0:1], v2702; NOSDWA-NEXT: s_endpgm703;704; GFX89-LABEL: mul_v2half:705; GFX89: ; %bb.0: ; %entry706; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24707; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34708; GFX89-NEXT: s_waitcnt lgkmcnt(0)709; GFX89-NEXT: v_mov_b32_e32 v0, s2710; GFX89-NEXT: v_mov_b32_e32 v1, s3711; GFX89-NEXT: v_mov_b32_e32 v2, s4712; GFX89-NEXT: v_mov_b32_e32 v3, s5713; GFX89-NEXT: flat_load_dword v4, v[0:1]714; GFX89-NEXT: flat_load_dword v2, v[2:3]715; GFX89-NEXT: v_mov_b32_e32 v0, s0716; GFX89-NEXT: v_mov_b32_e32 v1, s1717; GFX89-NEXT: s_waitcnt vmcnt(0)718; GFX89-NEXT: v_mul_f16_sdwa v3, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1719; GFX89-NEXT: v_mul_f16_e32 v2, v4, v2720; GFX89-NEXT: v_or_b32_e32 v2, v2, v3721; GFX89-NEXT: flat_store_dword v[0:1], v2722; GFX89-NEXT: s_endpgm723;724; GFX9-LABEL: mul_v2half:725; GFX9: ; %bb.0: ; %entry726; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24727; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34728; GFX9-NEXT: v_mov_b32_e32 v0, 0729; GFX9-NEXT: s_waitcnt lgkmcnt(0)730; GFX9-NEXT: global_load_dword v1, v0, s[2:3]731; GFX9-NEXT: global_load_dword v2, v0, s[6:7]732; GFX9-NEXT: s_waitcnt vmcnt(0)733; GFX9-NEXT: v_pk_mul_f16 v1, v1, v2734; GFX9-NEXT: global_store_dword v0, v1, s[0:1]735; GFX9-NEXT: s_endpgm736;737; GFX10-LABEL: mul_v2half:738; GFX10: ; %bb.0: ; %entry739; GFX10-NEXT: s_clause 0x1740; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24741; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34742; GFX10-NEXT: v_mov_b32_e32 v0, 0743; GFX10-NEXT: s_waitcnt lgkmcnt(0)744; GFX10-NEXT: s_clause 0x1745; GFX10-NEXT: global_load_dword v1, v0, s[2:3]746; GFX10-NEXT: global_load_dword v2, v0, s[6:7]747; GFX10-NEXT: s_waitcnt vmcnt(0)748; GFX10-NEXT: v_pk_mul_f16 v1, v1, v2749; GFX10-NEXT: global_store_dword v0, v1, s[0:1]750; GFX10-NEXT: s_endpgm751entry:752 %a = load <2 x half>, ptr addrspace(1) %ina, align 4753 %b = load <2 x half>, ptr addrspace(1) %inb, align 4754 %mul = fmul <2 x half> %a, %b755 store <2 x half> %mul, ptr addrspace(1) %out, align 4756 ret void757}758 759define amdgpu_kernel void @mul_v4half(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {760; NOSDWA-LABEL: mul_v4half:761; NOSDWA: ; %bb.0: ; %entry762; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24763; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34764; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)765; NOSDWA-NEXT: v_mov_b32_e32 v0, s2766; NOSDWA-NEXT: v_mov_b32_e32 v1, s3767; NOSDWA-NEXT: v_mov_b32_e32 v2, s4768; NOSDWA-NEXT: v_mov_b32_e32 v3, s5769; NOSDWA-NEXT: flat_load_dwordx2 v[2:3], v[2:3]770; NOSDWA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]771; NOSDWA-NEXT: v_mov_b32_e32 v4, s0772; NOSDWA-NEXT: v_mov_b32_e32 v5, s1773; NOSDWA-NEXT: s_waitcnt vmcnt(1)774; NOSDWA-NEXT: v_lshrrev_b32_e32 v6, 16, v3775; NOSDWA-NEXT: s_waitcnt vmcnt(0)776; NOSDWA-NEXT: v_lshrrev_b32_e32 v7, 16, v1777; NOSDWA-NEXT: v_mul_f16_e32 v1, v1, v3778; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v2779; NOSDWA-NEXT: v_lshrrev_b32_e32 v8, 16, v0780; NOSDWA-NEXT: v_mul_f16_e32 v0, v0, v2781; NOSDWA-NEXT: v_mul_f16_e32 v2, v7, v6782; NOSDWA-NEXT: v_mul_f16_e32 v3, v8, v3783; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 16, v2784; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v3785; NOSDWA-NEXT: v_or_b32_e32 v1, v1, v2786; NOSDWA-NEXT: v_or_b32_e32 v0, v0, v3787; NOSDWA-NEXT: flat_store_dwordx2 v[4:5], v[0:1]788; NOSDWA-NEXT: s_endpgm789;790; GFX89-LABEL: mul_v4half:791; GFX89: ; %bb.0: ; %entry792; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24793; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34794; GFX89-NEXT: s_waitcnt lgkmcnt(0)795; GFX89-NEXT: v_mov_b32_e32 v0, s2796; GFX89-NEXT: v_mov_b32_e32 v1, s3797; GFX89-NEXT: v_mov_b32_e32 v2, s4798; GFX89-NEXT: v_mov_b32_e32 v3, s5799; GFX89-NEXT: flat_load_dwordx2 v[0:1], v[0:1]800; GFX89-NEXT: flat_load_dwordx2 v[2:3], v[2:3]801; GFX89-NEXT: v_mov_b32_e32 v4, s0802; GFX89-NEXT: v_mov_b32_e32 v5, s1803; GFX89-NEXT: s_waitcnt vmcnt(0)804; GFX89-NEXT: v_mul_f16_sdwa v6, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1805; GFX89-NEXT: v_mul_f16_e32 v1, v1, v3806; GFX89-NEXT: v_mul_f16_sdwa v3, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1807; GFX89-NEXT: v_mul_f16_e32 v0, v0, v2808; GFX89-NEXT: v_or_b32_e32 v1, v1, v6809; GFX89-NEXT: v_or_b32_e32 v0, v0, v3810; GFX89-NEXT: flat_store_dwordx2 v[4:5], v[0:1]811; GFX89-NEXT: s_endpgm812;813; GFX9-LABEL: mul_v4half:814; GFX9: ; %bb.0: ; %entry815; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24816; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34817; GFX9-NEXT: v_mov_b32_e32 v4, 0818; GFX9-NEXT: s_waitcnt lgkmcnt(0)819; GFX9-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]820; GFX9-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]821; GFX9-NEXT: s_waitcnt vmcnt(0)822; GFX9-NEXT: v_pk_mul_f16 v1, v1, v3823; GFX9-NEXT: v_pk_mul_f16 v0, v0, v2824; GFX9-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]825; GFX9-NEXT: s_endpgm826;827; GFX10-LABEL: mul_v4half:828; GFX10: ; %bb.0: ; %entry829; GFX10-NEXT: s_clause 0x1830; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24831; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34832; GFX10-NEXT: v_mov_b32_e32 v4, 0833; GFX10-NEXT: s_waitcnt lgkmcnt(0)834; GFX10-NEXT: s_clause 0x1835; GFX10-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]836; GFX10-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]837; GFX10-NEXT: s_waitcnt vmcnt(0)838; GFX10-NEXT: v_pk_mul_f16 v1, v1, v3839; GFX10-NEXT: v_pk_mul_f16 v0, v0, v2840; GFX10-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]841; GFX10-NEXT: s_endpgm842entry:843 %a = load <4 x half>, ptr addrspace(1) %ina, align 4844 %b = load <4 x half>, ptr addrspace(1) %inb, align 4845 %mul = fmul <4 x half> %a, %b846 store <4 x half> %mul, ptr addrspace(1) %out, align 4847 ret void848}849 850define amdgpu_kernel void @mul_v8half(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {851; NOSDWA-LABEL: mul_v8half:852; NOSDWA: ; %bb.0: ; %entry853; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24854; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34855; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)856; NOSDWA-NEXT: v_mov_b32_e32 v4, s2857; NOSDWA-NEXT: v_mov_b32_e32 v5, s3858; NOSDWA-NEXT: v_mov_b32_e32 v0, s4859; NOSDWA-NEXT: v_mov_b32_e32 v1, s5860; NOSDWA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]861; NOSDWA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]862; NOSDWA-NEXT: v_mov_b32_e32 v8, s0863; NOSDWA-NEXT: v_mov_b32_e32 v9, s1864; NOSDWA-NEXT: s_waitcnt vmcnt(1)865; NOSDWA-NEXT: v_lshrrev_b32_e32 v10, 16, v3866; NOSDWA-NEXT: s_waitcnt vmcnt(0)867; NOSDWA-NEXT: v_lshrrev_b32_e32 v11, 16, v7868; NOSDWA-NEXT: v_mul_f16_e32 v3, v7, v3869; NOSDWA-NEXT: v_lshrrev_b32_e32 v7, 16, v2870; NOSDWA-NEXT: v_lshrrev_b32_e32 v12, 16, v6871; NOSDWA-NEXT: v_mul_f16_e32 v2, v6, v2872; NOSDWA-NEXT: v_lshrrev_b32_e32 v6, 16, v1873; NOSDWA-NEXT: v_lshrrev_b32_e32 v13, 16, v5874; NOSDWA-NEXT: v_mul_f16_e32 v1, v5, v1875; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v0876; NOSDWA-NEXT: v_mul_f16_e32 v0, v4, v0877; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v4878; NOSDWA-NEXT: v_mul_f16_e32 v10, v11, v10879; NOSDWA-NEXT: v_mul_f16_e32 v7, v12, v7880; NOSDWA-NEXT: v_mul_f16_e32 v6, v13, v6881; NOSDWA-NEXT: v_mul_f16_e32 v4, v4, v5882; NOSDWA-NEXT: v_lshlrev_b32_e32 v5, 16, v10883; NOSDWA-NEXT: v_lshlrev_b32_e32 v7, 16, v7884; NOSDWA-NEXT: v_lshlrev_b32_e32 v6, 16, v6885; NOSDWA-NEXT: v_lshlrev_b32_e32 v4, 16, v4886; NOSDWA-NEXT: v_or_b32_e32 v3, v3, v5887; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v7888; NOSDWA-NEXT: v_or_b32_e32 v1, v1, v6889; NOSDWA-NEXT: v_or_b32_e32 v0, v0, v4890; NOSDWA-NEXT: flat_store_dwordx4 v[8:9], v[0:3]891; NOSDWA-NEXT: s_endpgm892;893; GFX89-LABEL: mul_v8half:894; GFX89: ; %bb.0: ; %entry895; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24896; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34897; GFX89-NEXT: s_waitcnt lgkmcnt(0)898; GFX89-NEXT: v_mov_b32_e32 v0, s2899; GFX89-NEXT: v_mov_b32_e32 v1, s3900; GFX89-NEXT: v_mov_b32_e32 v4, s4901; GFX89-NEXT: v_mov_b32_e32 v5, s5902; GFX89-NEXT: flat_load_dwordx4 v[0:3], v[0:1]903; GFX89-NEXT: flat_load_dwordx4 v[4:7], v[4:5]904; GFX89-NEXT: v_mov_b32_e32 v8, s0905; GFX89-NEXT: v_mov_b32_e32 v9, s1906; GFX89-NEXT: s_waitcnt vmcnt(0)907; GFX89-NEXT: v_mul_f16_sdwa v10, v3, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1908; GFX89-NEXT: v_mul_f16_e32 v3, v3, v7909; GFX89-NEXT: v_mul_f16_sdwa v7, v2, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1910; GFX89-NEXT: v_mul_f16_e32 v2, v2, v6911; GFX89-NEXT: v_mul_f16_sdwa v6, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1912; GFX89-NEXT: v_mul_f16_e32 v1, v1, v5913; GFX89-NEXT: v_mul_f16_sdwa v5, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1914; GFX89-NEXT: v_mul_f16_e32 v0, v0, v4915; GFX89-NEXT: v_or_b32_e32 v3, v3, v10916; GFX89-NEXT: v_or_b32_e32 v2, v2, v7917; GFX89-NEXT: v_or_b32_e32 v1, v1, v6918; GFX89-NEXT: v_or_b32_e32 v0, v0, v5919; GFX89-NEXT: flat_store_dwordx4 v[8:9], v[0:3]920; GFX89-NEXT: s_endpgm921;922; GFX9-LABEL: mul_v8half:923; GFX9: ; %bb.0: ; %entry924; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24925; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34926; GFX9-NEXT: v_mov_b32_e32 v8, 0927; GFX9-NEXT: s_waitcnt lgkmcnt(0)928; GFX9-NEXT: global_load_dwordx4 v[0:3], v8, s[2:3]929; GFX9-NEXT: global_load_dwordx4 v[4:7], v8, s[6:7]930; GFX9-NEXT: s_waitcnt vmcnt(0)931; GFX9-NEXT: v_pk_mul_f16 v3, v3, v7932; GFX9-NEXT: v_pk_mul_f16 v2, v2, v6933; GFX9-NEXT: v_pk_mul_f16 v1, v1, v5934; GFX9-NEXT: v_pk_mul_f16 v0, v0, v4935; GFX9-NEXT: global_store_dwordx4 v8, v[0:3], s[0:1]936; GFX9-NEXT: s_endpgm937;938; GFX10-LABEL: mul_v8half:939; GFX10: ; %bb.0: ; %entry940; GFX10-NEXT: s_clause 0x1941; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24942; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34943; GFX10-NEXT: v_mov_b32_e32 v8, 0944; GFX10-NEXT: s_waitcnt lgkmcnt(0)945; GFX10-NEXT: s_clause 0x1946; GFX10-NEXT: global_load_dwordx4 v[0:3], v8, s[2:3]947; GFX10-NEXT: global_load_dwordx4 v[4:7], v8, s[6:7]948; GFX10-NEXT: s_waitcnt vmcnt(0)949; GFX10-NEXT: v_pk_mul_f16 v3, v3, v7950; GFX10-NEXT: v_pk_mul_f16 v2, v2, v6951; GFX10-NEXT: v_pk_mul_f16 v1, v1, v5952; GFX10-NEXT: v_pk_mul_f16 v0, v0, v4953; GFX10-NEXT: global_store_dwordx4 v8, v[0:3], s[0:1]954; GFX10-NEXT: s_endpgm955entry:956 %a = load <8 x half>, ptr addrspace(1) %ina, align 4957 %b = load <8 x half>, ptr addrspace(1) %inb, align 4958 %mul = fmul <8 x half> %a, %b959 store <8 x half> %mul, ptr addrspace(1) %out, align 4960 ret void961}962 963define amdgpu_kernel void @mul_i8(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {964; NOSDWA-LABEL: mul_i8:965; NOSDWA: ; %bb.0: ; %entry966; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24967; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34968; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)969; NOSDWA-NEXT: v_mov_b32_e32 v2, s3970; NOSDWA-NEXT: v_add_u32_e32 v1, vcc, s2, v0971; NOSDWA-NEXT: v_addc_u32_e32 v2, vcc, 0, v2, vcc972; NOSDWA-NEXT: v_mov_b32_e32 v4, s5973; NOSDWA-NEXT: v_add_u32_e32 v3, vcc, s4, v0974; NOSDWA-NEXT: v_addc_u32_e32 v4, vcc, 0, v4, vcc975; NOSDWA-NEXT: flat_load_ubyte v2, v[1:2]976; NOSDWA-NEXT: flat_load_ubyte v3, v[3:4]977; NOSDWA-NEXT: v_mov_b32_e32 v0, s0978; NOSDWA-NEXT: v_mov_b32_e32 v1, s1979; NOSDWA-NEXT: s_waitcnt vmcnt(0)980; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v2, v3981; NOSDWA-NEXT: flat_store_byte v[0:1], v2982; NOSDWA-NEXT: s_endpgm983;984; GFX89-LABEL: mul_i8:985; GFX89: ; %bb.0: ; %entry986; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24987; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x34988; GFX89-NEXT: s_waitcnt lgkmcnt(0)989; GFX89-NEXT: v_mov_b32_e32 v2, s3990; GFX89-NEXT: v_add_u32_e32 v1, vcc, s2, v0991; GFX89-NEXT: v_addc_u32_e32 v2, vcc, 0, v2, vcc992; GFX89-NEXT: v_mov_b32_e32 v4, s5993; GFX89-NEXT: v_add_u32_e32 v3, vcc, s4, v0994; GFX89-NEXT: v_addc_u32_e32 v4, vcc, 0, v4, vcc995; GFX89-NEXT: flat_load_ubyte v2, v[1:2]996; GFX89-NEXT: flat_load_ubyte v3, v[3:4]997; GFX89-NEXT: v_mov_b32_e32 v0, s0998; GFX89-NEXT: v_mov_b32_e32 v1, s1999; GFX89-NEXT: s_waitcnt vmcnt(0)1000; GFX89-NEXT: v_mul_lo_u16_e32 v2, v2, v31001; GFX89-NEXT: flat_store_byte v[0:1], v21002; GFX89-NEXT: s_endpgm1003;1004; GFX9-LABEL: mul_i8:1005; GFX9: ; %bb.0: ; %entry1006; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241007; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341008; GFX9-NEXT: s_waitcnt lgkmcnt(0)1009; GFX9-NEXT: global_load_ubyte v1, v0, s[2:3]1010; GFX9-NEXT: global_load_ubyte v2, v0, s[6:7]1011; GFX9-NEXT: v_mov_b32_e32 v0, 01012; GFX9-NEXT: s_waitcnt vmcnt(0)1013; GFX9-NEXT: v_mul_lo_u16_e32 v1, v1, v21014; GFX9-NEXT: global_store_byte v0, v1, s[0:1]1015; GFX9-NEXT: s_endpgm1016;1017; GFX10-LABEL: mul_i8:1018; GFX10: ; %bb.0: ; %entry1019; GFX10-NEXT: s_clause 0x11020; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241021; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341022; GFX10-NEXT: s_waitcnt lgkmcnt(0)1023; GFX10-NEXT: s_clause 0x11024; GFX10-NEXT: global_load_ubyte v1, v0, s[2:3]1025; GFX10-NEXT: global_load_ubyte v2, v0, s[6:7]1026; GFX10-NEXT: v_mov_b32_e32 v0, 01027; GFX10-NEXT: s_waitcnt vmcnt(0)1028; GFX10-NEXT: v_mul_lo_u16 v1, v1, v21029; GFX10-NEXT: global_store_byte v0, v1, s[0:1]1030; GFX10-NEXT: s_endpgm1031entry:1032 %idx = call i32 @llvm.amdgcn.workitem.id.x()1033 %gepa = getelementptr i8, ptr addrspace(1) %ina, i32 %idx1034 %gepb = getelementptr i8, ptr addrspace(1) %inb, i32 %idx1035 %a = load i8, ptr addrspace(1) %gepa, align 41036 %b = load i8, ptr addrspace(1) %gepb, align 41037 %mul = mul i8 %a, %b1038 store i8 %mul, ptr addrspace(1) %out, align 41039 ret void1040}1041 1042define amdgpu_kernel void @mul_v2i8(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1043; NOSDWA-LABEL: mul_v2i8:1044; NOSDWA: ; %bb.0: ; %entry1045; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241046; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341047; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 1, v01048; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1049; NOSDWA-NEXT: v_mov_b32_e32 v1, s31050; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v21051; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1052; NOSDWA-NEXT: v_mov_b32_e32 v3, s51053; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v21054; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1055; NOSDWA-NEXT: flat_load_ushort v4, v[0:1]1056; NOSDWA-NEXT: flat_load_ushort v2, v[2:3]1057; NOSDWA-NEXT: v_mov_b32_e32 v0, s01058; NOSDWA-NEXT: v_mov_b32_e32 v1, s11059; NOSDWA-NEXT: s_waitcnt vmcnt(1)1060; NOSDWA-NEXT: v_lshrrev_b16_e32 v3, 8, v41061; NOSDWA-NEXT: s_waitcnt vmcnt(0)1062; NOSDWA-NEXT: v_lshrrev_b16_e32 v5, 8, v21063; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v4, v21064; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v3, v51065; NOSDWA-NEXT: v_and_b32_e32 v2, 0xff, v21066; NOSDWA-NEXT: v_lshlrev_b16_e32 v3, 8, v31067; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v31068; NOSDWA-NEXT: flat_store_short v[0:1], v21069; NOSDWA-NEXT: s_endpgm1070;1071; GFX89-LABEL: mul_v2i8:1072; GFX89: ; %bb.0: ; %entry1073; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241074; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341075; GFX89-NEXT: v_lshlrev_b32_e32 v2, 1, v01076; GFX89-NEXT: s_waitcnt lgkmcnt(0)1077; GFX89-NEXT: v_mov_b32_e32 v1, s31078; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v21079; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1080; GFX89-NEXT: v_mov_b32_e32 v3, s51081; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v21082; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1083; GFX89-NEXT: flat_load_ushort v4, v[0:1]1084; GFX89-NEXT: flat_load_ushort v2, v[2:3]1085; GFX89-NEXT: v_mov_b32_e32 v0, s01086; GFX89-NEXT: v_mov_b32_e32 v1, s11087; GFX89-NEXT: s_waitcnt vmcnt(0)1088; GFX89-NEXT: v_mul_lo_u16_e32 v3, v4, v21089; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v4, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11090; GFX89-NEXT: v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1091; GFX89-NEXT: flat_store_short v[0:1], v21092; GFX89-NEXT: s_endpgm1093;1094; GFX9-LABEL: mul_v2i8:1095; GFX9: ; %bb.0: ; %entry1096; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241097; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341098; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v01099; GFX9-NEXT: s_waitcnt lgkmcnt(0)1100; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]1101; GFX9-NEXT: global_load_ushort v2, v0, s[6:7]1102; GFX9-NEXT: v_mov_b32_e32 v0, 01103; GFX9-NEXT: s_waitcnt vmcnt(0)1104; GFX9-NEXT: v_mul_lo_u16_e32 v3, v1, v21105; GFX9-NEXT: v_mul_lo_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11106; GFX9-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1107; GFX9-NEXT: global_store_short v0, v1, s[0:1]1108; GFX9-NEXT: s_endpgm1109;1110; GFX10-LABEL: mul_v2i8:1111; GFX10: ; %bb.0: ; %entry1112; GFX10-NEXT: s_clause 0x11113; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241114; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341115; GFX10-NEXT: v_lshlrev_b32_e32 v0, 1, v01116; GFX10-NEXT: s_waitcnt lgkmcnt(0)1117; GFX10-NEXT: s_clause 0x11118; GFX10-NEXT: global_load_ushort v1, v0, s[2:3]1119; GFX10-NEXT: global_load_ushort v2, v0, s[6:7]1120; GFX10-NEXT: s_waitcnt vmcnt(1)1121; GFX10-NEXT: v_lshrrev_b16 v0, 8, v11122; GFX10-NEXT: s_waitcnt vmcnt(0)1123; GFX10-NEXT: v_lshrrev_b16 v3, 8, v21124; GFX10-NEXT: v_mul_lo_u16 v1, v1, v21125; GFX10-NEXT: v_mov_b32_e32 v2, 01126; GFX10-NEXT: v_mul_lo_u16 v0, v0, v31127; GFX10-NEXT: v_lshlrev_b16 v0, 8, v01128; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1129; GFX10-NEXT: global_store_short v2, v0, s[0:1]1130; GFX10-NEXT: s_endpgm1131entry:1132 %idx = call i32 @llvm.amdgcn.workitem.id.x()1133 %gepa = getelementptr <2 x i8>, ptr addrspace(1) %ina, i32 %idx1134 %gepb = getelementptr <2 x i8>, ptr addrspace(1) %inb, i32 %idx1135 %a = load <2 x i8>, ptr addrspace(1) %gepa, align 41136 %b = load <2 x i8>, ptr addrspace(1) %gepb, align 41137 %mul = mul <2 x i8> %a, %b1138 store <2 x i8> %mul, ptr addrspace(1) %out, align 41139 ret void1140}1141 1142define amdgpu_kernel void @mul_v4i8(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1143; NOSDWA-LABEL: mul_v4i8:1144; NOSDWA: ; %bb.0: ; %entry1145; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241146; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341147; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 2, v01148; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1149; NOSDWA-NEXT: v_mov_b32_e32 v1, s31150; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v21151; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1152; NOSDWA-NEXT: v_mov_b32_e32 v3, s51153; NOSDWA-NEXT: flat_load_dword v4, v[0:1]1154; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s4, v21155; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1156; NOSDWA-NEXT: flat_load_dword v2, v[0:1]1157; NOSDWA-NEXT: v_mov_b32_e32 v0, s01158; NOSDWA-NEXT: v_mov_b32_e32 v1, s11159; NOSDWA-NEXT: s_waitcnt vmcnt(1)1160; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v41161; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 24, v41162; NOSDWA-NEXT: v_lshrrev_b16_e32 v6, 8, v41163; NOSDWA-NEXT: s_waitcnt vmcnt(0)1164; NOSDWA-NEXT: v_lshrrev_b32_e32 v7, 16, v21165; NOSDWA-NEXT: v_lshrrev_b32_e32 v8, 24, v21166; NOSDWA-NEXT: v_lshrrev_b16_e32 v9, 8, v21167; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v4, v21168; NOSDWA-NEXT: v_mul_lo_u16_e32 v4, v6, v91169; NOSDWA-NEXT: v_mul_lo_u16_e32 v5, v5, v81170; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v3, v71171; NOSDWA-NEXT: v_and_b32_e32 v2, 0xff, v21172; NOSDWA-NEXT: v_lshlrev_b16_e32 v4, 8, v41173; NOSDWA-NEXT: v_lshlrev_b16_e32 v5, 8, v51174; NOSDWA-NEXT: v_and_b32_e32 v3, 0xff, v31175; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v41176; NOSDWA-NEXT: v_or_b32_e32 v3, v3, v51177; NOSDWA-NEXT: v_and_b32_e32 v2, 0xffff, v21178; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v31179; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v31180; NOSDWA-NEXT: flat_store_dword v[0:1], v21181; NOSDWA-NEXT: s_endpgm1182;1183; GFX89-LABEL: mul_v4i8:1184; GFX89: ; %bb.0: ; %entry1185; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241186; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341187; GFX89-NEXT: v_lshlrev_b32_e32 v2, 2, v01188; GFX89-NEXT: s_waitcnt lgkmcnt(0)1189; GFX89-NEXT: v_mov_b32_e32 v1, s31190; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v21191; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1192; GFX89-NEXT: v_mov_b32_e32 v3, s51193; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v21194; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1195; GFX89-NEXT: flat_load_dword v4, v[0:1]1196; GFX89-NEXT: flat_load_dword v2, v[2:3]1197; GFX89-NEXT: v_mov_b32_e32 v0, s01198; GFX89-NEXT: v_mov_b32_e32 v1, s11199; GFX89-NEXT: s_waitcnt vmcnt(0)1200; GFX89-NEXT: v_mul_lo_u16_e32 v3, v4, v21201; GFX89-NEXT: v_mul_lo_u16_sdwa v5, v4, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11202; GFX89-NEXT: v_mul_lo_u16_sdwa v6, v4, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31203; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11204; GFX89-NEXT: v_or_b32_sdwa v3, v3, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1205; GFX89-NEXT: v_or_b32_sdwa v2, v2, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1206; GFX89-NEXT: v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1207; GFX89-NEXT: flat_store_dword v[0:1], v21208; GFX89-NEXT: s_endpgm1209;1210; GFX9-LABEL: mul_v4i8:1211; GFX9: ; %bb.0: ; %entry1212; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241213; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341214; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01215; GFX9-NEXT: s_waitcnt lgkmcnt(0)1216; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1217; GFX9-NEXT: global_load_dword v2, v0, s[6:7]1218; GFX9-NEXT: v_mov_b32_e32 v0, 01219; GFX9-NEXT: s_waitcnt vmcnt(0)1220; GFX9-NEXT: v_mul_lo_u16_e32 v3, v1, v21221; GFX9-NEXT: v_mul_lo_u16_sdwa v4, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11222; GFX9-NEXT: v_mul_lo_u16_sdwa v5, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31223; GFX9-NEXT: v_mul_lo_u16_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11224; GFX9-NEXT: v_or_b32_sdwa v2, v3, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1225; GFX9-NEXT: v_or_b32_sdwa v1, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1226; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1227; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1228; GFX9-NEXT: s_endpgm1229;1230; GFX10-LABEL: mul_v4i8:1231; GFX10: ; %bb.0: ; %entry1232; GFX10-NEXT: s_clause 0x11233; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241234; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341235; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01236; GFX10-NEXT: s_waitcnt lgkmcnt(0)1237; GFX10-NEXT: s_clause 0x11238; GFX10-NEXT: global_load_dword v1, v0, s[2:3]1239; GFX10-NEXT: global_load_dword v2, v0, s[6:7]1240; GFX10-NEXT: s_waitcnt vmcnt(1)1241; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v11242; GFX10-NEXT: v_lshrrev_b16 v3, 8, v11243; GFX10-NEXT: s_waitcnt vmcnt(0)1244; GFX10-NEXT: v_lshrrev_b16 v4, 8, v21245; GFX10-NEXT: v_lshrrev_b32_e32 v5, 24, v21246; GFX10-NEXT: v_lshrrev_b32_e32 v6, 16, v11247; GFX10-NEXT: v_lshrrev_b32_e32 v7, 16, v21248; GFX10-NEXT: v_mul_lo_u16 v1, v1, v21249; GFX10-NEXT: v_mul_lo_u16 v3, v3, v41250; GFX10-NEXT: v_mul_lo_u16 v0, v0, v51251; GFX10-NEXT: v_mul_lo_u16 v2, v6, v71252; GFX10-NEXT: v_lshlrev_b16 v3, 8, v31253; GFX10-NEXT: v_lshlrev_b16 v0, 8, v01254; GFX10-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1255; GFX10-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1256; GFX10-NEXT: v_mov_b32_e32 v2, 01257; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1258; GFX10-NEXT: global_store_dword v2, v0, s[0:1]1259; GFX10-NEXT: s_endpgm1260entry:1261 %idx = call i32 @llvm.amdgcn.workitem.id.x()1262 %gepa = getelementptr <4 x i8>, ptr addrspace(1) %ina, i32 %idx1263 %gepb = getelementptr <4 x i8>, ptr addrspace(1) %inb, i32 %idx1264 %a = load <4 x i8>, ptr addrspace(1) %gepa, align 41265 %b = load <4 x i8>, ptr addrspace(1) %gepb, align 41266 %mul = mul <4 x i8> %a, %b1267 store <4 x i8> %mul, ptr addrspace(1) %out, align 41268 ret void1269}1270 1271define amdgpu_kernel void @mul_v8i8(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1272; NOSDWA-LABEL: mul_v8i8:1273; NOSDWA: ; %bb.0: ; %entry1274; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241275; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341276; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 3, v01277; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1278; NOSDWA-NEXT: v_mov_b32_e32 v1, s31279; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v21280; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1281; NOSDWA-NEXT: v_mov_b32_e32 v3, s51282; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v21283; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1284; NOSDWA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1285; NOSDWA-NEXT: flat_load_dwordx2 v[2:3], v[2:3]1286; NOSDWA-NEXT: v_mov_b32_e32 v4, s01287; NOSDWA-NEXT: v_mov_b32_e32 v5, s11288; NOSDWA-NEXT: s_waitcnt vmcnt(1)1289; NOSDWA-NEXT: v_lshrrev_b32_e32 v6, 16, v01290; NOSDWA-NEXT: v_lshrrev_b32_e32 v7, 24, v01291; NOSDWA-NEXT: v_lshrrev_b16_e32 v8, 8, v01292; NOSDWA-NEXT: v_lshrrev_b32_e32 v9, 16, v11293; NOSDWA-NEXT: v_lshrrev_b32_e32 v10, 24, v11294; NOSDWA-NEXT: v_lshrrev_b16_e32 v11, 8, v11295; NOSDWA-NEXT: s_waitcnt vmcnt(0)1296; NOSDWA-NEXT: v_lshrrev_b32_e32 v12, 16, v21297; NOSDWA-NEXT: v_lshrrev_b32_e32 v13, 24, v21298; NOSDWA-NEXT: v_lshrrev_b16_e32 v14, 8, v21299; NOSDWA-NEXT: v_lshrrev_b32_e32 v15, 16, v31300; NOSDWA-NEXT: v_lshrrev_b32_e32 v16, 24, v31301; NOSDWA-NEXT: v_lshrrev_b16_e32 v17, 8, v31302; NOSDWA-NEXT: v_mul_lo_u16_e32 v1, v1, v31303; NOSDWA-NEXT: v_mul_lo_u16_e32 v0, v0, v21304; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v11, v171305; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v10, v161306; NOSDWA-NEXT: v_mul_lo_u16_e32 v9, v9, v151307; NOSDWA-NEXT: v_mul_lo_u16_e32 v8, v8, v141308; NOSDWA-NEXT: v_mul_lo_u16_e32 v7, v7, v131309; NOSDWA-NEXT: v_mul_lo_u16_e32 v6, v6, v121310; NOSDWA-NEXT: v_and_b32_e32 v1, 0xff, v11311; NOSDWA-NEXT: v_and_b32_e32 v0, 0xff, v01312; NOSDWA-NEXT: v_lshlrev_b16_e32 v2, 8, v21313; NOSDWA-NEXT: v_lshlrev_b16_e32 v3, 8, v31314; NOSDWA-NEXT: v_and_b32_e32 v9, 0xff, v91315; NOSDWA-NEXT: v_lshlrev_b16_e32 v8, 8, v81316; NOSDWA-NEXT: v_lshlrev_b16_e32 v7, 8, v71317; NOSDWA-NEXT: v_and_b32_e32 v6, 0xff, v61318; NOSDWA-NEXT: v_or_b32_e32 v1, v1, v21319; NOSDWA-NEXT: v_or_b32_e32 v2, v9, v31320; NOSDWA-NEXT: v_or_b32_e32 v0, v0, v81321; NOSDWA-NEXT: v_or_b32_e32 v3, v6, v71322; NOSDWA-NEXT: v_and_b32_e32 v1, 0xffff, v11323; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 16, v21324; NOSDWA-NEXT: v_and_b32_e32 v0, 0xffff, v01325; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v31326; NOSDWA-NEXT: v_or_b32_e32 v1, v1, v21327; NOSDWA-NEXT: v_or_b32_e32 v0, v0, v31328; NOSDWA-NEXT: flat_store_dwordx2 v[4:5], v[0:1]1329; NOSDWA-NEXT: s_endpgm1330;1331; GFX89-LABEL: mul_v8i8:1332; GFX89: ; %bb.0: ; %entry1333; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241334; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341335; GFX89-NEXT: v_lshlrev_b32_e32 v2, 3, v01336; GFX89-NEXT: s_waitcnt lgkmcnt(0)1337; GFX89-NEXT: v_mov_b32_e32 v1, s31338; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v21339; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1340; GFX89-NEXT: v_mov_b32_e32 v3, s51341; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v21342; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1343; GFX89-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1344; GFX89-NEXT: flat_load_dwordx2 v[2:3], v[2:3]1345; GFX89-NEXT: v_mov_b32_e32 v4, s01346; GFX89-NEXT: v_mov_b32_e32 v5, s11347; GFX89-NEXT: s_waitcnt vmcnt(0)1348; GFX89-NEXT: v_mul_lo_u16_e32 v6, v1, v31349; GFX89-NEXT: v_mul_lo_u16_sdwa v7, v1, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11350; GFX89-NEXT: v_mul_lo_u16_sdwa v8, v1, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31351; GFX89-NEXT: v_mul_lo_u16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11352; GFX89-NEXT: v_mul_lo_u16_e32 v3, v0, v21353; GFX89-NEXT: v_mul_lo_u16_sdwa v9, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11354; GFX89-NEXT: v_mul_lo_u16_sdwa v10, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31355; GFX89-NEXT: v_mul_lo_u16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11356; GFX89-NEXT: v_or_b32_sdwa v2, v6, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1357; GFX89-NEXT: v_or_b32_sdwa v1, v1, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1358; GFX89-NEXT: v_or_b32_sdwa v3, v3, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1359; GFX89-NEXT: v_or_b32_sdwa v0, v0, v10 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1360; GFX89-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1361; GFX89-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1362; GFX89-NEXT: flat_store_dwordx2 v[4:5], v[0:1]1363; GFX89-NEXT: s_endpgm1364;1365; GFX9-LABEL: mul_v8i8:1366; GFX9: ; %bb.0: ; %entry1367; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241368; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341369; GFX9-NEXT: v_lshlrev_b32_e32 v4, 3, v01370; GFX9-NEXT: s_waitcnt lgkmcnt(0)1371; GFX9-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]1372; GFX9-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]1373; GFX9-NEXT: v_mov_b32_e32 v4, 01374; GFX9-NEXT: s_waitcnt vmcnt(0)1375; GFX9-NEXT: v_mul_lo_u16_e32 v5, v1, v31376; GFX9-NEXT: v_mul_lo_u16_sdwa v6, v1, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11377; GFX9-NEXT: v_mul_lo_u16_sdwa v7, v1, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31378; GFX9-NEXT: v_mul_lo_u16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11379; GFX9-NEXT: v_mul_lo_u16_e32 v3, v0, v21380; GFX9-NEXT: v_mul_lo_u16_sdwa v8, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11381; GFX9-NEXT: v_mul_lo_u16_sdwa v9, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_31382; GFX9-NEXT: v_mul_lo_u16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11383; GFX9-NEXT: v_or_b32_sdwa v2, v5, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1384; GFX9-NEXT: v_or_b32_sdwa v1, v1, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1385; GFX9-NEXT: v_or_b32_sdwa v3, v3, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1386; GFX9-NEXT: v_or_b32_sdwa v0, v0, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1387; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1388; GFX9-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1389; GFX9-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]1390; GFX9-NEXT: s_endpgm1391;1392; GFX10-LABEL: mul_v8i8:1393; GFX10: ; %bb.0: ; %entry1394; GFX10-NEXT: s_clause 0x11395; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241396; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341397; GFX10-NEXT: v_lshlrev_b32_e32 v4, 3, v01398; GFX10-NEXT: s_waitcnt lgkmcnt(0)1399; GFX10-NEXT: s_clause 0x11400; GFX10-NEXT: global_load_dwordx2 v[0:1], v4, s[2:3]1401; GFX10-NEXT: global_load_dwordx2 v[2:3], v4, s[6:7]1402; GFX10-NEXT: s_waitcnt vmcnt(1)1403; GFX10-NEXT: v_lshrrev_b32_e32 v5, 24, v01404; GFX10-NEXT: v_lshrrev_b16 v6, 8, v01405; GFX10-NEXT: v_lshrrev_b32_e32 v8, 24, v11406; GFX10-NEXT: v_lshrrev_b16 v9, 8, v11407; GFX10-NEXT: s_waitcnt vmcnt(0)1408; GFX10-NEXT: v_lshrrev_b32_e32 v11, 24, v21409; GFX10-NEXT: v_lshrrev_b16 v12, 8, v21410; GFX10-NEXT: v_lshrrev_b16 v13, 8, v31411; GFX10-NEXT: v_lshrrev_b32_e32 v14, 24, v31412; GFX10-NEXT: v_lshrrev_b32_e32 v4, 16, v01413; GFX10-NEXT: v_lshrrev_b32_e32 v7, 16, v11414; GFX10-NEXT: v_lshrrev_b32_e32 v10, 16, v21415; GFX10-NEXT: v_lshrrev_b32_e32 v15, 16, v31416; GFX10-NEXT: v_mul_lo_u16 v1, v1, v31417; GFX10-NEXT: v_mul_lo_u16 v0, v0, v21418; GFX10-NEXT: v_mul_lo_u16 v2, v9, v131419; GFX10-NEXT: v_mul_lo_u16 v3, v8, v141420; GFX10-NEXT: v_mul_lo_u16 v6, v6, v121421; GFX10-NEXT: v_mul_lo_u16 v5, v5, v111422; GFX10-NEXT: v_mul_lo_u16 v7, v7, v151423; GFX10-NEXT: v_mul_lo_u16 v4, v4, v101424; GFX10-NEXT: v_lshlrev_b16 v2, 8, v21425; GFX10-NEXT: v_lshlrev_b16 v3, 8, v31426; GFX10-NEXT: v_lshlrev_b16 v6, 8, v61427; GFX10-NEXT: v_lshlrev_b16 v5, 8, v51428; GFX10-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1429; GFX10-NEXT: v_or_b32_sdwa v2, v7, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1430; GFX10-NEXT: v_or_b32_sdwa v0, v0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1431; GFX10-NEXT: v_or_b32_sdwa v3, v4, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1432; GFX10-NEXT: v_mov_b32_e32 v4, 01433; GFX10-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1434; GFX10-NEXT: v_or_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1435; GFX10-NEXT: global_store_dwordx2 v4, v[0:1], s[0:1]1436; GFX10-NEXT: s_endpgm1437entry:1438 %idx = call i32 @llvm.amdgcn.workitem.id.x()1439 %gepa = getelementptr <8 x i8>, ptr addrspace(1) %ina, i32 %idx1440 %gepb = getelementptr <8 x i8>, ptr addrspace(1) %inb, i32 %idx1441 %a = load <8 x i8>, ptr addrspace(1) %gepa, align 41442 %b = load <8 x i8>, ptr addrspace(1) %gepb, align 41443 %mul = mul <8 x i8> %a, %b1444 store <8 x i8> %mul, ptr addrspace(1) %out, align 41445 ret void1446}1447 1448; FIXME: Should be able to avoid or1449define amdgpu_kernel void @sitofp_v2i16_to_v2f16(1450; NOSDWA-LABEL: sitofp_v2i16_to_v2f16:1451; NOSDWA: ; %bb.0: ; %entry1452; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241453; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1454; NOSDWA-NEXT: v_mov_b32_e32 v0, s21455; NOSDWA-NEXT: v_mov_b32_e32 v1, s31456; NOSDWA-NEXT: flat_load_dword v2, v[0:1]1457; NOSDWA-NEXT: v_mov_b32_e32 v0, s01458; NOSDWA-NEXT: v_mov_b32_e32 v1, s11459; NOSDWA-NEXT: s_waitcnt vmcnt(0)1460; NOSDWA-NEXT: v_lshrrev_b32_e32 v3, 16, v21461; NOSDWA-NEXT: v_cvt_f16_i16_e32 v3, v31462; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v31463; NOSDWA-NEXT: v_cvt_f16_i16_e32 v2, v21464; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v31465; NOSDWA-NEXT: flat_store_dword v[0:1], v21466; NOSDWA-NEXT: s_endpgm1467;1468; GFX89-LABEL: sitofp_v2i16_to_v2f16:1469; GFX89: ; %bb.0: ; %entry1470; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241471; GFX89-NEXT: s_waitcnt lgkmcnt(0)1472; GFX89-NEXT: v_mov_b32_e32 v0, s21473; GFX89-NEXT: v_mov_b32_e32 v1, s31474; GFX89-NEXT: flat_load_dword v2, v[0:1]1475; GFX89-NEXT: v_mov_b32_e32 v0, s01476; GFX89-NEXT: v_mov_b32_e32 v1, s11477; GFX89-NEXT: s_waitcnt vmcnt(0)1478; GFX89-NEXT: v_cvt_f16_i16_sdwa v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_11479; GFX89-NEXT: v_cvt_f16_i16_e32 v2, v21480; GFX89-NEXT: v_or_b32_e32 v2, v2, v31481; GFX89-NEXT: flat_store_dword v[0:1], v21482; GFX89-NEXT: s_endpgm1483;1484; GFX9-LABEL: sitofp_v2i16_to_v2f16:1485; GFX9: ; %bb.0: ; %entry1486; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241487; GFX9-NEXT: v_mov_b32_e32 v0, 01488; GFX9-NEXT: s_waitcnt lgkmcnt(0)1489; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1490; GFX9-NEXT: s_waitcnt vmcnt(0)1491; GFX9-NEXT: v_cvt_f16_i16_e32 v2, v11492; GFX9-NEXT: v_cvt_f16_i16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_11493; GFX9-NEXT: v_lshl_or_b32 v1, v1, 16, v21494; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1495; GFX9-NEXT: s_endpgm1496;1497; GFX10-LABEL: sitofp_v2i16_to_v2f16:1498; GFX10: ; %bb.0: ; %entry1499; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241500; GFX10-NEXT: v_mov_b32_e32 v0, 01501; GFX10-NEXT: s_waitcnt lgkmcnt(0)1502; GFX10-NEXT: global_load_dword v1, v0, s[2:3]1503; GFX10-NEXT: s_waitcnt vmcnt(0)1504; GFX10-NEXT: v_cvt_f16_i16_e32 v2, v11505; GFX10-NEXT: v_cvt_f16_i16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_11506; GFX10-NEXT: v_and_b32_e32 v2, 0xffff, v21507; GFX10-NEXT: v_lshl_or_b32 v1, v1, 16, v21508; GFX10-NEXT: global_store_dword v0, v1, s[0:1]1509; GFX10-NEXT: s_endpgm1510 ptr addrspace(1) %r,1511 ptr addrspace(1) %a) #0 {1512entry:1513 %a.val = load <2 x i16>, ptr addrspace(1) %a1514 %r.val = sitofp <2 x i16> %a.val to <2 x half>1515 store <2 x half> %r.val, ptr addrspace(1) %r1516 ret void1517}1518 1519define amdgpu_kernel void @mac_v2half(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1520; NOSDWA-LABEL: mac_v2half:1521; NOSDWA: ; %bb.0: ; %entry1522; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241523; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341524; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1525; NOSDWA-NEXT: v_mov_b32_e32 v0, s21526; NOSDWA-NEXT: v_mov_b32_e32 v2, s41527; NOSDWA-NEXT: v_mov_b32_e32 v3, s51528; NOSDWA-NEXT: v_mov_b32_e32 v1, s31529; NOSDWA-NEXT: flat_load_dword v2, v[2:3]1530; NOSDWA-NEXT: flat_load_dword v3, v[0:1]1531; NOSDWA-NEXT: v_mov_b32_e32 v0, s01532; NOSDWA-NEXT: v_mov_b32_e32 v1, s11533; NOSDWA-NEXT: s_waitcnt vmcnt(1)1534; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v21535; NOSDWA-NEXT: s_waitcnt vmcnt(0)1536; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v31537; NOSDWA-NEXT: v_mac_f16_e32 v4, v5, v41538; NOSDWA-NEXT: v_lshlrev_b32_e32 v4, 16, v41539; NOSDWA-NEXT: v_mac_f16_e32 v2, v3, v21540; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v41541; NOSDWA-NEXT: flat_store_dword v[0:1], v21542; NOSDWA-NEXT: s_endpgm1543;1544; GFX89-LABEL: mac_v2half:1545; GFX89: ; %bb.0: ; %entry1546; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241547; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341548; GFX89-NEXT: s_waitcnt lgkmcnt(0)1549; GFX89-NEXT: v_mov_b32_e32 v0, s21550; GFX89-NEXT: v_mov_b32_e32 v2, s41551; GFX89-NEXT: v_mov_b32_e32 v3, s51552; GFX89-NEXT: v_mov_b32_e32 v1, s31553; GFX89-NEXT: flat_load_dword v2, v[2:3]1554; GFX89-NEXT: flat_load_dword v3, v[0:1]1555; GFX89-NEXT: v_mov_b32_e32 v0, s01556; GFX89-NEXT: v_mov_b32_e32 v1, s11557; GFX89-NEXT: s_waitcnt vmcnt(1)1558; GFX89-NEXT: v_lshrrev_b32_e32 v4, 16, v21559; GFX89-NEXT: s_waitcnt vmcnt(0)1560; GFX89-NEXT: v_mac_f16_sdwa v4, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11561; GFX89-NEXT: v_lshlrev_b32_e32 v4, 16, v41562; GFX89-NEXT: v_mac_f16_e32 v2, v3, v21563; GFX89-NEXT: v_or_b32_e32 v2, v2, v41564; GFX89-NEXT: flat_store_dword v[0:1], v21565; GFX89-NEXT: s_endpgm1566;1567; GFX9-LABEL: mac_v2half:1568; GFX9: ; %bb.0: ; %entry1569; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241570; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341571; GFX9-NEXT: v_mov_b32_e32 v0, 01572; GFX9-NEXT: s_waitcnt lgkmcnt(0)1573; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1574; GFX9-NEXT: global_load_dword v2, v0, s[6:7]1575; GFX9-NEXT: s_waitcnt vmcnt(0)1576; GFX9-NEXT: v_pk_mul_f16 v1, v1, v21577; GFX9-NEXT: v_pk_add_f16 v1, v1, v21578; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1579; GFX9-NEXT: s_endpgm1580;1581; GFX10-LABEL: mac_v2half:1582; GFX10: ; %bb.0: ; %entry1583; GFX10-NEXT: s_clause 0x11584; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241585; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341586; GFX10-NEXT: v_mov_b32_e32 v0, 01587; GFX10-NEXT: s_waitcnt lgkmcnt(0)1588; GFX10-NEXT: s_clause 0x11589; GFX10-NEXT: global_load_dword v1, v0, s[2:3]1590; GFX10-NEXT: global_load_dword v2, v0, s[6:7]1591; GFX10-NEXT: s_waitcnt vmcnt(0)1592; GFX10-NEXT: v_pk_mul_f16 v1, v1, v21593; GFX10-NEXT: v_pk_add_f16 v1, v1, v21594; GFX10-NEXT: global_store_dword v0, v1, s[0:1]1595; GFX10-NEXT: s_endpgm1596entry:1597 %a = load <2 x half>, ptr addrspace(1) %ina, align 41598 %b = load <2 x half>, ptr addrspace(1) %inb, align 41599 %mul = fmul <2 x half> %a, %b1600 %mac = fadd <2 x half> %mul, %b1601 store <2 x half> %mac, ptr addrspace(1) %out, align 41602 ret void1603}1604 1605define amdgpu_kernel void @immediate_mul_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {1606; NOSDWA-LABEL: immediate_mul_v2i16:1607; NOSDWA: ; %bb.0: ; %entry1608; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241609; NOSDWA-NEXT: v_lshlrev_b32_e32 v0, 2, v01610; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1611; NOSDWA-NEXT: v_mov_b32_e32 v1, s31612; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v01613; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1614; NOSDWA-NEXT: flat_load_dword v2, v[0:1]1615; NOSDWA-NEXT: v_mov_b32_e32 v0, s01616; NOSDWA-NEXT: v_mov_b32_e32 v1, s11617; NOSDWA-NEXT: s_waitcnt vmcnt(0)1618; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, 0x7b, v21619; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v21620; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, 0x141, v21621; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 16, v21622; NOSDWA-NEXT: v_or_b32_e32 v2, v3, v21623; NOSDWA-NEXT: flat_store_dword v[0:1], v21624; NOSDWA-NEXT: s_endpgm1625;1626; GFX89-LABEL: immediate_mul_v2i16:1627; GFX89: ; %bb.0: ; %entry1628; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241629; GFX89-NEXT: v_lshlrev_b32_e32 v0, 2, v01630; GFX89-NEXT: v_mov_b32_e32 v3, 0x1411631; GFX89-NEXT: s_waitcnt lgkmcnt(0)1632; GFX89-NEXT: v_mov_b32_e32 v1, s31633; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v01634; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1635; GFX89-NEXT: flat_load_dword v2, v[0:1]1636; GFX89-NEXT: v_mov_b32_e32 v0, s01637; GFX89-NEXT: v_mov_b32_e32 v1, s11638; GFX89-NEXT: s_waitcnt vmcnt(0)1639; GFX89-NEXT: v_mul_lo_u16_e32 v4, 0x7b, v21640; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1641; GFX89-NEXT: v_or_b32_e32 v2, v4, v21642; GFX89-NEXT: flat_store_dword v[0:1], v21643; GFX89-NEXT: s_endpgm1644;1645; GFX9-LABEL: immediate_mul_v2i16:1646; GFX9: ; %bb.0: ; %entry1647; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241648; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01649; GFX9-NEXT: v_mov_b32_e32 v1, 01650; GFX9-NEXT: s_waitcnt lgkmcnt(0)1651; GFX9-NEXT: global_load_dword v0, v0, s[2:3]1652; GFX9-NEXT: s_mov_b32 s2, 0x141007b1653; GFX9-NEXT: s_waitcnt vmcnt(0)1654; GFX9-NEXT: v_pk_mul_lo_u16 v0, v0, s21655; GFX9-NEXT: global_store_dword v1, v0, s[0:1]1656; GFX9-NEXT: s_endpgm1657;1658; GFX10-LABEL: immediate_mul_v2i16:1659; GFX10: ; %bb.0: ; %entry1660; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241661; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01662; GFX10-NEXT: v_mov_b32_e32 v1, 01663; GFX10-NEXT: s_waitcnt lgkmcnt(0)1664; GFX10-NEXT: global_load_dword v0, v0, s[2:3]1665; GFX10-NEXT: s_waitcnt vmcnt(0)1666; GFX10-NEXT: v_pk_mul_lo_u16 v0, 0x141007b, v01667; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1668; GFX10-NEXT: s_endpgm1669entry:1670 %idx = call i32 @llvm.amdgcn.workitem.id.x()1671 %gep = getelementptr <2 x i16>, ptr addrspace(1) %in, i32 %idx1672 %a = load <2 x i16>, ptr addrspace(1) %gep, align 41673 %mul = mul <2 x i16> %a, <i16 123, i16 321>1674 store <2 x i16> %mul, ptr addrspace(1) %out, align 41675 ret void1676}1677 1678; Double use of same src - should not convert it1679define amdgpu_kernel void @mulmul_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1680; NOSDWA-LABEL: mulmul_v2i16:1681; NOSDWA: ; %bb.0: ; %entry1682; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241683; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341684; NOSDWA-NEXT: v_lshlrev_b32_e32 v2, 2, v01685; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1686; NOSDWA-NEXT: v_mov_b32_e32 v1, s31687; NOSDWA-NEXT: v_add_u32_e32 v0, vcc, s2, v21688; NOSDWA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1689; NOSDWA-NEXT: v_mov_b32_e32 v3, s51690; NOSDWA-NEXT: v_add_u32_e32 v2, vcc, s4, v21691; NOSDWA-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1692; NOSDWA-NEXT: flat_load_dword v2, v[2:3]1693; NOSDWA-NEXT: flat_load_dword v3, v[0:1]1694; NOSDWA-NEXT: v_mov_b32_e32 v0, s01695; NOSDWA-NEXT: v_mov_b32_e32 v1, s11696; NOSDWA-NEXT: s_waitcnt vmcnt(1)1697; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v21698; NOSDWA-NEXT: s_waitcnt vmcnt(0)1699; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v31700; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v3, v21701; NOSDWA-NEXT: v_mul_lo_u16_e32 v5, v5, v41702; NOSDWA-NEXT: v_mul_lo_u16_e32 v2, v3, v21703; NOSDWA-NEXT: v_mul_lo_u16_e32 v3, v5, v41704; NOSDWA-NEXT: v_lshlrev_b32_e32 v3, 16, v31705; NOSDWA-NEXT: v_or_b32_e32 v2, v2, v31706; NOSDWA-NEXT: flat_store_dword v[0:1], v21707; NOSDWA-NEXT: s_endpgm1708;1709; GFX89-LABEL: mulmul_v2i16:1710; GFX89: ; %bb.0: ; %entry1711; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241712; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341713; GFX89-NEXT: v_lshlrev_b32_e32 v2, 2, v01714; GFX89-NEXT: s_waitcnt lgkmcnt(0)1715; GFX89-NEXT: v_mov_b32_e32 v1, s31716; GFX89-NEXT: v_add_u32_e32 v0, vcc, s2, v21717; GFX89-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1718; GFX89-NEXT: v_mov_b32_e32 v3, s51719; GFX89-NEXT: v_add_u32_e32 v2, vcc, s4, v21720; GFX89-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1721; GFX89-NEXT: flat_load_dword v4, v[0:1]1722; GFX89-NEXT: flat_load_dword v2, v[2:3]1723; GFX89-NEXT: v_mov_b32_e32 v0, s01724; GFX89-NEXT: v_mov_b32_e32 v1, s11725; GFX89-NEXT: s_waitcnt vmcnt(0)1726; GFX89-NEXT: v_mul_lo_u16_sdwa v3, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11727; GFX89-NEXT: v_mul_lo_u16_e32 v4, v4, v21728; GFX89-NEXT: v_mul_lo_u16_e32 v4, v4, v21729; GFX89-NEXT: v_mul_lo_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_11730; GFX89-NEXT: v_or_b32_e32 v2, v4, v21731; GFX89-NEXT: flat_store_dword v[0:1], v21732; GFX89-NEXT: s_endpgm1733;1734; GFX9-LABEL: mulmul_v2i16:1735; GFX9: ; %bb.0: ; %entry1736; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241737; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341738; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01739; GFX9-NEXT: s_waitcnt lgkmcnt(0)1740; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1741; GFX9-NEXT: global_load_dword v2, v0, s[6:7]1742; GFX9-NEXT: v_mov_b32_e32 v0, 01743; GFX9-NEXT: s_waitcnt vmcnt(0)1744; GFX9-NEXT: v_pk_mul_lo_u16 v1, v1, v21745; GFX9-NEXT: v_pk_mul_lo_u16 v1, v1, v21746; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1747; GFX9-NEXT: s_endpgm1748;1749; GFX10-LABEL: mulmul_v2i16:1750; GFX10: ; %bb.0: ; %entry1751; GFX10-NEXT: s_clause 0x11752; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241753; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341754; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01755; GFX10-NEXT: s_waitcnt lgkmcnt(0)1756; GFX10-NEXT: s_clause 0x11757; GFX10-NEXT: global_load_dword v1, v0, s[2:3]1758; GFX10-NEXT: global_load_dword v2, v0, s[6:7]1759; GFX10-NEXT: s_waitcnt vmcnt(0)1760; GFX10-NEXT: v_pk_mul_lo_u16 v0, v1, v21761; GFX10-NEXT: v_mov_b32_e32 v1, 01762; GFX10-NEXT: v_pk_mul_lo_u16 v0, v0, v21763; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1764; GFX10-NEXT: s_endpgm1765entry:1766 %idx = call i32 @llvm.amdgcn.workitem.id.x()1767 %gepa = getelementptr <2 x i16>, ptr addrspace(1) %ina, i32 %idx1768 %gepb = getelementptr <2 x i16>, ptr addrspace(1) %inb, i32 %idx1769 %a = load <2 x i16>, ptr addrspace(1) %gepa, align 41770 %b = load <2 x i16>, ptr addrspace(1) %gepb, align 41771 %mul = mul <2 x i16> %a, %b1772 %mul2 = mul <2 x i16> %mul, %b1773 store <2 x i16> %mul2, ptr addrspace(1) %out, align 41774 ret void1775}1776 1777define amdgpu_kernel void @add_bb_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {1778; NOSDWA-LABEL: add_bb_v2i16:1779; NOSDWA: ; %bb.0: ; %entry1780; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241781; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341782; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1783; NOSDWA-NEXT: v_mov_b32_e32 v0, s21784; NOSDWA-NEXT: v_mov_b32_e32 v1, s31785; NOSDWA-NEXT: v_mov_b32_e32 v2, s41786; NOSDWA-NEXT: v_mov_b32_e32 v3, s51787; NOSDWA-NEXT: flat_load_dword v1, v[0:1]1788; NOSDWA-NEXT: flat_load_dword v2, v[2:3]1789; NOSDWA-NEXT: v_mov_b32_e32 v0, s01790; NOSDWA-NEXT: s_waitcnt vmcnt(0)1791; NOSDWA-NEXT: v_add_u32_e32 v3, vcc, v1, v21792; NOSDWA-NEXT: v_lshrrev_b32_e32 v2, 16, v21793; NOSDWA-NEXT: v_lshrrev_b32_e32 v1, 16, v11794; NOSDWA-NEXT: v_add_u32_e32 v1, vcc, v1, v21795; NOSDWA-NEXT: v_and_b32_e32 v3, 0xffff, v31796; NOSDWA-NEXT: v_lshlrev_b32_e32 v1, 16, v11797; NOSDWA-NEXT: v_or_b32_e32 v2, v3, v11798; NOSDWA-NEXT: v_mov_b32_e32 v1, s11799; NOSDWA-NEXT: flat_store_dword v[0:1], v21800; NOSDWA-NEXT: s_endpgm1801;1802; GFX89-LABEL: add_bb_v2i16:1803; GFX89: ; %bb.0: ; %entry1804; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241805; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x341806; GFX89-NEXT: s_waitcnt lgkmcnt(0)1807; GFX89-NEXT: v_mov_b32_e32 v0, s21808; GFX89-NEXT: v_mov_b32_e32 v1, s31809; GFX89-NEXT: v_mov_b32_e32 v2, s41810; GFX89-NEXT: v_mov_b32_e32 v3, s51811; GFX89-NEXT: flat_load_dword v1, v[0:1]1812; GFX89-NEXT: flat_load_dword v2, v[2:3]1813; GFX89-NEXT: v_mov_b32_e32 v0, s01814; GFX89-NEXT: s_waitcnt vmcnt(0)1815; GFX89-NEXT: v_add_u32_e32 v3, vcc, v1, v21816; GFX89-NEXT: v_add_u32_sdwa v1, vcc, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11817; GFX89-NEXT: v_or_b32_sdwa v2, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1818; GFX89-NEXT: v_mov_b32_e32 v1, s11819; GFX89-NEXT: flat_store_dword v[0:1], v21820; GFX89-NEXT: s_endpgm1821;1822; GFX9-LABEL: add_bb_v2i16:1823; GFX9: ; %bb.0: ; %entry1824; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241825; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341826; GFX9-NEXT: v_mov_b32_e32 v0, 01827; GFX9-NEXT: s_waitcnt lgkmcnt(0)1828; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1829; GFX9-NEXT: global_load_dword v2, v0, s[6:7]1830; GFX9-NEXT: s_waitcnt vmcnt(0)1831; GFX9-NEXT: v_pk_add_u16 v1, v1, v21832; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1833; GFX9-NEXT: s_endpgm1834;1835; GFX10-LABEL: add_bb_v2i16:1836; GFX10: ; %bb.0: ; %entry1837; GFX10-NEXT: s_clause 0x11838; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241839; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x341840; GFX10-NEXT: v_mov_b32_e32 v0, 01841; GFX10-NEXT: s_waitcnt lgkmcnt(0)1842; GFX10-NEXT: s_clause 0x11843; GFX10-NEXT: global_load_dword v1, v0, s[2:3]1844; GFX10-NEXT: global_load_dword v2, v0, s[6:7]1845; GFX10-NEXT: s_waitcnt vmcnt(0)1846; GFX10-NEXT: v_pk_add_u16 v1, v1, v21847; GFX10-NEXT: global_store_dword v0, v1, s[0:1]1848; GFX10-NEXT: s_endpgm1849entry:1850 %a = load <2 x i16>, ptr addrspace(1) %ina, align 41851 %b = load <2 x i16>, ptr addrspace(1) %inb, align 41852 br label %add_label1853add_label:1854 %add = add <2 x i16> %a, %b1855 br label %store_label1856store_label:1857 store <2 x i16> %add, ptr addrspace(1) %out, align 41858 ret void1859}1860 1861; Check that "pulling out" SDWA operands works correctly.1862define amdgpu_kernel void @pulled_out_test(ptr addrspace(1) %sourceA, ptr addrspace(1) %destValues) #0 {1863; NOSDWA-LABEL: pulled_out_test:1864; NOSDWA: ; %bb.0: ; %entry1865; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241866; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)1867; NOSDWA-NEXT: v_mov_b32_e32 v0, s01868; NOSDWA-NEXT: v_mov_b32_e32 v1, s11869; NOSDWA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1870; NOSDWA-NEXT: v_mov_b32_e32 v3, s31871; NOSDWA-NEXT: v_mov_b32_e32 v2, s21872; NOSDWA-NEXT: s_waitcnt vmcnt(0)1873; NOSDWA-NEXT: v_readfirstlane_b32 s0, v11874; NOSDWA-NEXT: v_readfirstlane_b32 s1, v01875; NOSDWA-NEXT: s_lshr_b32 s3, s1, 241876; NOSDWA-NEXT: s_lshr_b32 s5, s0, 241877; NOSDWA-NEXT: s_and_b32 s2, s1, 0xffff1878; NOSDWA-NEXT: s_bfe_u32 s1, s1, 0x800101879; NOSDWA-NEXT: s_and_b32 s4, s0, 0xffff1880; NOSDWA-NEXT: s_bfe_u32 s0, s0, 0x800101881; NOSDWA-NEXT: s_lshl_b32 s3, s3, 81882; NOSDWA-NEXT: s_lshl_b32 s5, s5, 81883; NOSDWA-NEXT: s_or_b32 s1, s1, s31884; NOSDWA-NEXT: s_or_b32 s0, s0, s51885; NOSDWA-NEXT: s_lshl_b32 s1, s1, 161886; NOSDWA-NEXT: s_lshl_b32 s0, s0, 161887; NOSDWA-NEXT: s_or_b32 s1, s2, s11888; NOSDWA-NEXT: s_or_b32 s0, s4, s01889; NOSDWA-NEXT: v_mov_b32_e32 v0, s11890; NOSDWA-NEXT: v_mov_b32_e32 v1, s01891; NOSDWA-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1892; NOSDWA-NEXT: s_endpgm1893;1894; GFX89-LABEL: pulled_out_test:1895; GFX89: ; %bb.0: ; %entry1896; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241897; GFX89-NEXT: s_waitcnt lgkmcnt(0)1898; GFX89-NEXT: v_mov_b32_e32 v0, s01899; GFX89-NEXT: v_mov_b32_e32 v1, s11900; GFX89-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1901; GFX89-NEXT: v_mov_b32_e32 v3, s31902; GFX89-NEXT: v_mov_b32_e32 v2, s21903; GFX89-NEXT: s_waitcnt vmcnt(0)1904; GFX89-NEXT: v_readfirstlane_b32 s0, v11905; GFX89-NEXT: v_readfirstlane_b32 s1, v01906; GFX89-NEXT: s_lshr_b32 s3, s1, 241907; GFX89-NEXT: s_lshr_b32 s5, s0, 241908; GFX89-NEXT: s_and_b32 s2, s1, 0xffff1909; GFX89-NEXT: s_bfe_u32 s1, s1, 0x800101910; GFX89-NEXT: s_and_b32 s4, s0, 0xffff1911; GFX89-NEXT: s_bfe_u32 s0, s0, 0x800101912; GFX89-NEXT: s_lshl_b32 s3, s3, 81913; GFX89-NEXT: s_lshl_b32 s5, s5, 81914; GFX89-NEXT: s_or_b32 s1, s1, s31915; GFX89-NEXT: s_or_b32 s0, s0, s51916; GFX89-NEXT: s_lshl_b32 s1, s1, 161917; GFX89-NEXT: s_lshl_b32 s0, s0, 161918; GFX89-NEXT: s_or_b32 s1, s2, s11919; GFX89-NEXT: s_or_b32 s0, s4, s01920; GFX89-NEXT: v_mov_b32_e32 v0, s11921; GFX89-NEXT: v_mov_b32_e32 v1, s01922; GFX89-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1923; GFX89-NEXT: s_endpgm1924;1925; GFX9-LABEL: pulled_out_test:1926; GFX9: ; %bb.0: ; %entry1927; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241928; GFX9-NEXT: v_mov_b32_e32 v2, 01929; GFX9-NEXT: s_waitcnt lgkmcnt(0)1930; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1931; GFX9-NEXT: s_waitcnt vmcnt(0)1932; GFX9-NEXT: v_readfirstlane_b32 s0, v11933; GFX9-NEXT: v_readfirstlane_b32 s1, v01934; GFX9-NEXT: s_lshr_b32 s5, s1, 241935; GFX9-NEXT: s_lshr_b32 s7, s0, 241936; GFX9-NEXT: s_and_b32 s4, s1, 0xffff1937; GFX9-NEXT: s_bfe_u32 s1, s1, 0x800101938; GFX9-NEXT: s_and_b32 s6, s0, 0xffff1939; GFX9-NEXT: s_bfe_u32 s0, s0, 0x800101940; GFX9-NEXT: s_lshl_b32 s5, s5, 81941; GFX9-NEXT: s_lshl_b32 s7, s7, 81942; GFX9-NEXT: s_or_b32 s1, s1, s51943; GFX9-NEXT: s_or_b32 s0, s0, s71944; GFX9-NEXT: s_lshl_b32 s1, s1, 161945; GFX9-NEXT: s_lshl_b32 s0, s0, 161946; GFX9-NEXT: s_or_b32 s1, s4, s11947; GFX9-NEXT: s_or_b32 s0, s6, s01948; GFX9-NEXT: v_mov_b32_e32 v0, s11949; GFX9-NEXT: v_mov_b32_e32 v1, s01950; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]1951; GFX9-NEXT: s_endpgm1952;1953; GFX10-LABEL: pulled_out_test:1954; GFX10: ; %bb.0: ; %entry1955; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241956; GFX10-NEXT: v_mov_b32_e32 v2, 01957; GFX10-NEXT: s_waitcnt lgkmcnt(0)1958; GFX10-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1959; GFX10-NEXT: s_waitcnt vmcnt(0)1960; GFX10-NEXT: v_readfirstlane_b32 s0, v01961; GFX10-NEXT: v_readfirstlane_b32 s1, v11962; GFX10-NEXT: s_lshr_b32 s5, s0, 241963; GFX10-NEXT: s_lshr_b32 s7, s1, 241964; GFX10-NEXT: s_and_b32 s4, s0, 0xffff1965; GFX10-NEXT: s_bfe_u32 s0, s0, 0x800101966; GFX10-NEXT: s_and_b32 s6, s1, 0xffff1967; GFX10-NEXT: s_bfe_u32 s1, s1, 0x800101968; GFX10-NEXT: s_lshl_b32 s5, s5, 81969; GFX10-NEXT: s_lshl_b32 s7, s7, 81970; GFX10-NEXT: s_or_b32 s0, s0, s51971; GFX10-NEXT: s_or_b32 s1, s1, s71972; GFX10-NEXT: s_lshl_b32 s0, s0, 161973; GFX10-NEXT: s_lshl_b32 s1, s1, 161974; GFX10-NEXT: s_or_b32 s0, s4, s01975; GFX10-NEXT: s_or_b32 s1, s6, s11976; GFX10-NEXT: v_mov_b32_e32 v0, s01977; GFX10-NEXT: v_mov_b32_e32 v1, s11978; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]1979; GFX10-NEXT: s_endpgm1980entry:1981 %idxprom = ashr exact i64 15, 321982 %arrayidx = getelementptr inbounds <8 x i8>, ptr addrspace(1) %sourceA, i64 %idxprom1983 %tmp = load <8 x i8>, ptr addrspace(1) %arrayidx, align 81984 1985 %tmp1 = extractelement <8 x i8> %tmp, i32 01986 %tmp2 = extractelement <8 x i8> %tmp, i32 11987 %tmp3 = extractelement <8 x i8> %tmp, i32 21988 %tmp4 = extractelement <8 x i8> %tmp, i32 31989 %tmp5 = extractelement <8 x i8> %tmp, i32 41990 %tmp6 = extractelement <8 x i8> %tmp, i32 51991 %tmp7 = extractelement <8 x i8> %tmp, i32 61992 %tmp8 = extractelement <8 x i8> %tmp, i32 71993 1994 %tmp9 = insertelement <2 x i8> poison, i8 %tmp1, i32 01995 %tmp10 = insertelement <2 x i8> %tmp9, i8 %tmp2, i32 11996 %tmp11 = insertelement <2 x i8> poison, i8 %tmp3, i32 01997 %tmp12 = insertelement <2 x i8> %tmp11, i8 %tmp4, i32 11998 %tmp13 = insertelement <2 x i8> poison, i8 %tmp5, i32 01999 %tmp14 = insertelement <2 x i8> %tmp13, i8 %tmp6, i32 12000 %tmp15 = insertelement <2 x i8> poison, i8 %tmp7, i32 02001 %tmp16 = insertelement <2 x i8> %tmp15, i8 %tmp8, i32 12002 2003 %tmp17 = shufflevector <2 x i8> %tmp10, <2 x i8> %tmp12, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2004 %tmp18 = shufflevector <2 x i8> %tmp14, <2 x i8> %tmp16, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2005 %tmp19 = shufflevector <4 x i8> %tmp17, <4 x i8> %tmp18, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2006 2007 %arrayidx5 = getelementptr inbounds <8 x i8>, ptr addrspace(1) %destValues, i64 %idxprom2008 store <8 x i8> %tmp19, ptr addrspace(1) %arrayidx5, align 82009 ret void2010}2011 2012; TODO: Why is the constant not peepholed into the v_or_b32_e32?2013define amdgpu_kernel void @sdwa_crash_inlineasm_def() #0 {2014; NOSDWA-LABEL: sdwa_crash_inlineasm_def:2015; NOSDWA: ; %bb.0: ; %bb2016; NOSDWA-NEXT: s_mov_b32 s0, 0xffff2017; NOSDWA-NEXT: s_and_b64 vcc, exec, -12018; NOSDWA-NEXT: .LBB21_1: ; %bb12019; NOSDWA-NEXT: ; =>This Inner Loop Header: Depth=12020; NOSDWA-NEXT: ;;#ASMSTART2021; NOSDWA-NEXT: v_and_b32_e32 v0, s0, v02022; NOSDWA-NEXT: ;;#ASMEND2023; NOSDWA-NEXT: v_or_b32_e32 v0, 0x10000, v02024; NOSDWA-NEXT: flat_store_dwordx2 v[0:1], v[0:1]2025; NOSDWA-NEXT: s_waitcnt vmcnt(0)2026; NOSDWA-NEXT: s_mov_b64 vcc, vcc2027; NOSDWA-NEXT: s_cbranch_vccnz .LBB21_12028; NOSDWA-NEXT: ; %bb.2: ; %DummyReturnBlock2029; NOSDWA-NEXT: s_endpgm2030;2031; GFX89-LABEL: sdwa_crash_inlineasm_def:2032; GFX89: ; %bb.0: ; %bb2033; GFX89-NEXT: s_mov_b32 s0, 0xffff2034; GFX89-NEXT: s_and_b64 vcc, exec, -12035; GFX89-NEXT: .LBB21_1: ; %bb12036; GFX89-NEXT: ; =>This Inner Loop Header: Depth=12037; GFX89-NEXT: ;;#ASMSTART2038; GFX89-NEXT: v_and_b32_e32 v0, s0, v02039; GFX89-NEXT: ;;#ASMEND2040; GFX89-NEXT: v_or_b32_e32 v0, 0x10000, v02041; GFX89-NEXT: flat_store_dwordx2 v[0:1], v[0:1]2042; GFX89-NEXT: s_waitcnt vmcnt(0)2043; GFX89-NEXT: s_mov_b64 vcc, vcc2044; GFX89-NEXT: s_cbranch_vccnz .LBB21_12045; GFX89-NEXT: ; %bb.2: ; %DummyReturnBlock2046; GFX89-NEXT: s_endpgm2047;2048; GFX9-LABEL: sdwa_crash_inlineasm_def:2049; GFX9: ; %bb.0: ; %bb2050; GFX9-NEXT: s_mov_b32 s0, 0xffff2051; GFX9-NEXT: s_and_b64 vcc, exec, -12052; GFX9-NEXT: .LBB21_1: ; %bb12053; GFX9-NEXT: ; =>This Inner Loop Header: Depth=12054; GFX9-NEXT: ;;#ASMSTART2055; GFX9-NEXT: v_and_b32_e32 v0, s0, v02056; GFX9-NEXT: ;;#ASMEND2057; GFX9-NEXT: v_or_b32_e32 v0, 0x10000, v02058; GFX9-NEXT: global_store_dwordx2 v[0:1], v[0:1], off2059; GFX9-NEXT: s_waitcnt vmcnt(0)2060; GFX9-NEXT: s_mov_b64 vcc, vcc2061; GFX9-NEXT: s_cbranch_vccnz .LBB21_12062; GFX9-NEXT: ; %bb.2: ; %DummyReturnBlock2063; GFX9-NEXT: s_endpgm2064;2065; GFX10-LABEL: sdwa_crash_inlineasm_def:2066; GFX10: ; %bb.0: ; %bb2067; GFX10-NEXT: s_mov_b32 s0, 0xffff2068; GFX10-NEXT: s_mov_b32 vcc_lo, exec_lo2069; GFX10-NEXT: .LBB21_1: ; %bb12070; GFX10-NEXT: ; =>This Inner Loop Header: Depth=12071; GFX10-NEXT: ;;#ASMSTART2072; GFX10-NEXT: v_and_b32_e32 v0, s0, v02073; GFX10-NEXT: ;;#ASMEND2074; GFX10-NEXT: v_or_b32_e32 v0, 0x10000, v02075; GFX10-NEXT: global_store_dwordx2 v[0:1], v[0:1], off2076; GFX10-NEXT: s_waitcnt_vscnt null, 0x02077; GFX10-NEXT: s_cbranch_vccnz .LBB21_12078; GFX10-NEXT: ; %bb.2: ; %DummyReturnBlock2079; GFX10-NEXT: s_endpgm2080bb:2081 br label %bb12082 2083bb1: ; preds = %bb11, %bb2084 %tmp = phi <2 x i32> [ %tmp12, %bb11 ], [ poison, %bb ]2085 br i1 true, label %bb2, label %bb112086 2087bb2: ; preds = %bb12088 %tmp3 = call i32 asm "v_and_b32_e32 $0, $1, $2", "=v,s,v"(i32 65535, i32 poison) #12089 %tmp5 = or i32 %tmp3, 655362090 %tmp6 = insertelement <2 x i32> %tmp, i32 %tmp5, i64 02091 br label %bb112092 2093bb11: ; preds = %bb10, %bb22094 %tmp12 = phi <2 x i32> [ %tmp6, %bb2 ], [ %tmp, %bb1 ]2095 store volatile <2 x i32> %tmp12, ptr addrspace(1) poison2096 br label %bb12097}2098 2099define void @crash_lshlrevb16_not_reg_op() {2100; NOSDWA-LABEL: crash_lshlrevb16_not_reg_op:2101; NOSDWA: ; %bb.0: ; %bb02102; NOSDWA-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2103; NOSDWA-NEXT: s_bitset1_b32 s4, 82104; NOSDWA-NEXT: s_and_b32 s6, s4, 0x1ff2105; NOSDWA-NEXT: s_mov_b64 s[4:5], 02106; NOSDWA-NEXT: s_and_b64 vcc, exec, -12107; NOSDWA-NEXT: .LBB22_1: ; %bb12108; NOSDWA-NEXT: ; =>This Inner Loop Header: Depth=12109; NOSDWA-NEXT: s_lshl_b32 s7, s4, 32110; NOSDWA-NEXT: v_mov_b32_e32 v0, s42111; NOSDWA-NEXT: s_lshr_b32 s7, s6, s72112; NOSDWA-NEXT: v_mov_b32_e32 v1, s52113; NOSDWA-NEXT: s_mov_b64 s[4:5], 12114; NOSDWA-NEXT: v_mov_b32_e32 v2, s72115; NOSDWA-NEXT: flat_store_byte v[0:1], v22116; NOSDWA-NEXT: s_mov_b64 vcc, vcc2117; NOSDWA-NEXT: s_cbranch_vccnz .LBB22_12118; NOSDWA-NEXT: ; %bb.2: ; %DummyReturnBlock2119; NOSDWA-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)2120; NOSDWA-NEXT: s_setpc_b64 s[30:31]2121;2122; GFX89-LABEL: crash_lshlrevb16_not_reg_op:2123; GFX89: ; %bb.0: ; %bb02124; GFX89-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2125; GFX89-NEXT: s_bitset1_b32 s4, 82126; GFX89-NEXT: s_and_b32 s6, s4, 0x1ff2127; GFX89-NEXT: s_mov_b64 s[4:5], 02128; GFX89-NEXT: s_and_b64 vcc, exec, -12129; GFX89-NEXT: .LBB22_1: ; %bb12130; GFX89-NEXT: ; =>This Inner Loop Header: Depth=12131; GFX89-NEXT: s_lshl_b32 s7, s4, 32132; GFX89-NEXT: v_mov_b32_e32 v0, s42133; GFX89-NEXT: s_lshr_b32 s7, s6, s72134; GFX89-NEXT: v_mov_b32_e32 v1, s52135; GFX89-NEXT: s_mov_b64 s[4:5], 12136; GFX89-NEXT: v_mov_b32_e32 v2, s72137; GFX89-NEXT: flat_store_byte v[0:1], v22138; GFX89-NEXT: s_mov_b64 vcc, vcc2139; GFX89-NEXT: s_cbranch_vccnz .LBB22_12140; GFX89-NEXT: ; %bb.2: ; %DummyReturnBlock2141; GFX89-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)2142; GFX89-NEXT: s_setpc_b64 s[30:31]2143;2144; GFX9-LABEL: crash_lshlrevb16_not_reg_op:2145; GFX9: ; %bb.0: ; %bb02146; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2147; GFX9-NEXT: s_bitset1_b32 s4, 82148; GFX9-NEXT: s_and_b32 s6, s4, 0x1ff2149; GFX9-NEXT: s_mov_b64 s[4:5], 02150; GFX9-NEXT: s_and_b64 vcc, exec, -12151; GFX9-NEXT: .LBB22_1: ; %bb12152; GFX9-NEXT: ; =>This Inner Loop Header: Depth=12153; GFX9-NEXT: s_lshl_b32 s7, s4, 32154; GFX9-NEXT: v_mov_b32_e32 v0, s42155; GFX9-NEXT: s_lshr_b32 s7, s6, s72156; GFX9-NEXT: v_mov_b32_e32 v1, s52157; GFX9-NEXT: s_mov_b64 s[4:5], 12158; GFX9-NEXT: v_mov_b32_e32 v2, s72159; GFX9-NEXT: flat_store_byte v[0:1], v22160; GFX9-NEXT: s_mov_b64 vcc, vcc2161; GFX9-NEXT: s_cbranch_vccnz .LBB22_12162; GFX9-NEXT: ; %bb.2: ; %DummyReturnBlock2163; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)2164; GFX9-NEXT: s_setpc_b64 s[30:31]2165;2166; GFX10-LABEL: crash_lshlrevb16_not_reg_op:2167; GFX10: ; %bb.0: ; %bb02168; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2169; GFX10-NEXT: s_bitset1_b32 s4, 82170; GFX10-NEXT: s_mov_b32 vcc_lo, exec_lo2171; GFX10-NEXT: s_and_b32 s6, s4, 0x1ff2172; GFX10-NEXT: s_mov_b64 s[4:5], 02173; GFX10-NEXT: .LBB22_1: ; %bb12174; GFX10-NEXT: ; =>This Inner Loop Header: Depth=12175; GFX10-NEXT: s_lshl_b32 s7, s4, 32176; GFX10-NEXT: v_mov_b32_e32 v0, s42177; GFX10-NEXT: v_mov_b32_e32 v1, s52178; GFX10-NEXT: s_lshr_b32 s4, s6, s72179; GFX10-NEXT: v_mov_b32_e32 v2, s42180; GFX10-NEXT: s_mov_b64 s[4:5], 12181; GFX10-NEXT: flat_store_byte v[0:1], v22182; GFX10-NEXT: s_cbranch_vccnz .LBB22_12183; GFX10-NEXT: ; %bb.2: ; %DummyReturnBlock2184; GFX10-NEXT: s_waitcnt lgkmcnt(0)2185; GFX10-NEXT: s_setpc_b64 s[30:31]2186 %1 = alloca [2 x i8], align 1, addrspace(5)2187 %2 = getelementptr [2 x i8], ptr addrspace(5) %1, i32 0, i32 12188 br label %bb02189 2190bb0:2191 store i8 1, ptr addrspace(5) %2, align 12192 br label %bb12193 2194bb1:2195 %3 = phi i64 [ 1, %bb1 ], [ 0, %bb0 ]2196 %4 = trunc i64 %3 to i322197 %5 = getelementptr i8, ptr addrspace(5) %1, i32 %42198 %6 = load i8, ptr addrspace(5) %5, align 12199 %7 = getelementptr i8, ptr null, i64 %32200 store i8 %6, ptr %7, align 12201 br i1 false, label %bb2, label %bb12202 2203bb2:2204 br label %bb02205}2206 2207define amdgpu_kernel void @mac_v2half_same_srcop(ptr addrspace(1) %out, ptr addrspace(1) %ina, ptr addrspace(1) %inb) #0 {2208; NOSDWA-LABEL: mac_v2half_same_srcop:2209; NOSDWA: ; %bb.0: ; %entry2210; NOSDWA-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242211; NOSDWA-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x342212; NOSDWA-NEXT: s_waitcnt lgkmcnt(0)2213; NOSDWA-NEXT: v_mov_b32_e32 v0, s22214; NOSDWA-NEXT: v_mov_b32_e32 v2, s42215; NOSDWA-NEXT: v_mov_b32_e32 v3, s52216; NOSDWA-NEXT: v_mov_b32_e32 v1, s32217; NOSDWA-NEXT: flat_load_dword v2, v[2:3]2218; NOSDWA-NEXT: flat_load_dword v3, v[0:1]2219; NOSDWA-NEXT: v_mov_b32_e32 v0, s02220; NOSDWA-NEXT: v_mov_b32_e32 v1, s12221; NOSDWA-NEXT: s_waitcnt vmcnt(1)2222; NOSDWA-NEXT: v_lshrrev_b32_e32 v4, 16, v22223; NOSDWA-NEXT: s_waitcnt vmcnt(0)2224; NOSDWA-NEXT: v_lshrrev_b32_e32 v5, 16, v32225; NOSDWA-NEXT: v_mac_f16_e32 v5, v4, v42226; NOSDWA-NEXT: v_lshlrev_b32_e32 v4, 16, v52227; NOSDWA-NEXT: v_mac_f16_e32 v3, v2, v22228; NOSDWA-NEXT: v_or_b32_e32 v2, v3, v42229; NOSDWA-NEXT: flat_store_dword v[0:1], v22230; NOSDWA-NEXT: s_endpgm2231;2232; GFX89-LABEL: mac_v2half_same_srcop:2233; GFX89: ; %bb.0: ; %entry2234; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242235; GFX89-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x342236; GFX89-NEXT: s_waitcnt lgkmcnt(0)2237; GFX89-NEXT: v_mov_b32_e32 v0, s22238; GFX89-NEXT: v_mov_b32_e32 v1, s32239; GFX89-NEXT: v_mov_b32_e32 v2, s42240; GFX89-NEXT: v_mov_b32_e32 v3, s52241; GFX89-NEXT: flat_load_dword v4, v[0:1]2242; GFX89-NEXT: flat_load_dword v2, v[2:3]2243; GFX89-NEXT: v_mov_b32_e32 v0, s02244; GFX89-NEXT: v_mov_b32_e32 v1, s12245; GFX89-NEXT: s_waitcnt vmcnt(1)2246; GFX89-NEXT: v_lshrrev_b32_e32 v3, 16, v42247; GFX89-NEXT: s_waitcnt vmcnt(0)2248; GFX89-NEXT: v_mac_f16_sdwa v3, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_12249; GFX89-NEXT: v_lshlrev_b32_e32 v3, 16, v32250; GFX89-NEXT: v_mac_f16_e32 v4, v2, v22251; GFX89-NEXT: v_or_b32_e32 v2, v4, v32252; GFX89-NEXT: flat_store_dword v[0:1], v22253; GFX89-NEXT: s_endpgm2254;2255; GFX9-LABEL: mac_v2half_same_srcop:2256; GFX9: ; %bb.0: ; %entry2257; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x342258; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242259; GFX9-NEXT: v_mov_b32_e32 v0, 02260; GFX9-NEXT: s_waitcnt lgkmcnt(0)2261; GFX9-NEXT: global_load_dword v1, v0, s[6:7]2262; GFX9-NEXT: global_load_dword v2, v0, s[2:3]2263; GFX9-NEXT: s_waitcnt vmcnt(1)2264; GFX9-NEXT: v_pk_mul_f16 v1, v1, v12265; GFX9-NEXT: s_waitcnt vmcnt(0)2266; GFX9-NEXT: v_pk_add_f16 v1, v1, v22267; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2268; GFX9-NEXT: s_endpgm2269;2270; GFX10-LABEL: mac_v2half_same_srcop:2271; GFX10: ; %bb.0: ; %entry2272; GFX10-NEXT: s_clause 0x12273; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x342274; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242275; GFX10-NEXT: v_mov_b32_e32 v0, 02276; GFX10-NEXT: s_waitcnt lgkmcnt(0)2277; GFX10-NEXT: s_clause 0x12278; GFX10-NEXT: global_load_dword v1, v0, s[6:7]2279; GFX10-NEXT: global_load_dword v2, v0, s[2:3]2280; GFX10-NEXT: s_waitcnt vmcnt(1)2281; GFX10-NEXT: v_pk_mul_f16 v1, v1, v12282; GFX10-NEXT: s_waitcnt vmcnt(0)2283; GFX10-NEXT: v_pk_add_f16 v1, v1, v22284; GFX10-NEXT: global_store_dword v0, v1, s[0:1]2285; GFX10-NEXT: s_endpgm2286entry:2287 %a = load <2 x half>, ptr addrspace(1) %ina, align 42288 %b = load <2 x half>, ptr addrspace(1) %inb, align 42289 %mul = fmul <2 x half> %b, %b2290 %mac = fadd <2 x half> %mul, %a2291 store <2 x half> %mac, ptr addrspace(1) %out, align 42292 ret void2293}2294 2295declare i32 @llvm.amdgcn.workitem.id.x()2296 2297attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" }2298;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:2299; GCN: {{.*}}2300; GFX9_10: {{.*}}2301; SDWA: {{.*}}2302