1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX7 %s 3; RUN: llc -mtriple=amdgcn -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX8 %s 4; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9-NODL %s 5; RUN: llc -mtriple=amdgcn -mcpu=gfx906 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9-DL %s 6; RUN: llc -mtriple=amdgcn -mcpu=gfx1011 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-DL %s 7; RUN: llc -mtriple=amdgcn -mcpu=gfx1012 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-DL %s 8 9; add(mul(S0.x, S1.y), 10; add (mul (S0.y, S1.y), S3)) -> v_dot2_{I|U}32_{I|U}16(S1, S2, S3) 11 12define amdgpu_kernel void @udot2(<2 x i16> addrspace(1)* %src1, 13; GFX7-LABEL: udot2: 14; GFX7: ; %bb.0: ; %entry 15; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 16; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 17; GFX7-NEXT: s_mov_b32 s8, 0xffff 18; GFX7-NEXT: s_mov_b32 s3, 0xf000 19; GFX7-NEXT: s_mov_b32 s2, -1 20; GFX7-NEXT: s_waitcnt lgkmcnt(0) 21; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 22; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 23; GFX7-NEXT: s_waitcnt lgkmcnt(0) 24; GFX7-NEXT: s_lshr_b32 s6, s4, 16 25; GFX7-NEXT: s_lshr_b32 s7, s5, 16 26; GFX7-NEXT: s_and_b32 s4, s4, s8 27; GFX7-NEXT: s_and_b32 s5, s5, s8 28; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 29; GFX7-NEXT: v_mov_b32_e32 v0, s6 30; GFX7-NEXT: s_waitcnt lgkmcnt(0) 31; GFX7-NEXT: v_mov_b32_e32 v1, s8 32; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 33; GFX7-NEXT: v_mov_b32_e32 v1, s4 34; GFX7-NEXT: v_mad_u32_u24 v0, s5, v1, v0 35; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 36; GFX7-NEXT: s_endpgm 37; 38; GFX8-LABEL: udot2: 39; GFX8: ; %bb.0: ; %entry 40; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 41; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 42; GFX8-NEXT: s_mov_b32 s2, 0xffff 43; GFX8-NEXT: s_waitcnt lgkmcnt(0) 44; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 45; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 46; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 47; GFX8-NEXT: s_waitcnt lgkmcnt(0) 48; GFX8-NEXT: s_and_b32 s6, s3, s2 49; GFX8-NEXT: s_lshr_b32 s3, s3, 16 50; GFX8-NEXT: s_and_b32 s2, s4, s2 51; GFX8-NEXT: s_lshr_b32 s4, s4, 16 52; GFX8-NEXT: v_mov_b32_e32 v0, s5 53; GFX8-NEXT: v_mov_b32_e32 v1, s3 54; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 55; GFX8-NEXT: v_mov_b32_e32 v1, s6 56; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 57; GFX8-NEXT: v_mov_b32_e32 v0, s0 58; GFX8-NEXT: v_mov_b32_e32 v1, s1 59; GFX8-NEXT: flat_store_dword v[0:1], v2 60; GFX8-NEXT: s_endpgm 61; 62; GFX9-NODL-LABEL: udot2: 63; GFX9-NODL: ; %bb.0: ; %entry 64; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 65; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 66; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 67; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 68; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 69; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 70; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 71; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 72; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 73; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 74; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 75; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 76; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 77; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 78; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 79; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 80; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 81; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 82; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 83; GFX9-NODL-NEXT: s_endpgm 84; 85; GFX9-DL-LABEL: udot2: 86; GFX9-DL: ; %bb.0: ; %entry 87; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 88; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 89; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 90; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 91; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 92; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 93; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 94; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 95; GFX9-DL-NEXT: v_mov_b32_e32 v1, s2 96; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 97; GFX9-DL-NEXT: v_dot2_u32_u16 v1, s4, v1, v2 98; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 99; GFX9-DL-NEXT: s_endpgm 100; 101; GFX10-DL-LABEL: udot2: 102; GFX10-DL: ; %bb.0: ; %entry 103; GFX10-DL-NEXT: s_clause 0x1 104; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 105; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 106; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 107; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 108; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 109; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 110; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 111; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 112; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 113; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 114; GFX10-DL-NEXT: v_dot2_u32_u16 v0, s1, s0, v0 115; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 116; GFX10-DL-NEXT: s_endpgm 117 <2 x i16> addrspace(1)* %src2, 118 i32 addrspace(1)* nocapture %dst) { 119entry: 120 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 121 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 122 123 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 124 %conv = zext i16 %s1.elt1 to i32 125 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 126 %conv2 = zext i16 %s2.elt1 to i32 127 %mul1 = mul nuw i32 %conv2, %conv 128 129 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 130 %conv3 = zext i16 %s1.elt2 to i32 131 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 132 %conv4 = zext i16 %s2.elt2 to i32 133 %mul2 = mul nuw i32 %conv4, %conv3 134 135 %s3 = load i32, i32 addrspace(1)* %dst, align 4 136 %add = add i32 %mul2, %s3 137 %add6 = add i32 %add, %mul1 138 store i32 %add6, i32 addrspace(1)* %dst, align 4 139 ret void 140} 141 142; TODO: Support this pattern 143; add(S3, 144; add (mul (S0.y, S1.y), mul (S0.y, S1.y))) -> v_dot2_{I|U}32_{I|U}16(S1, S2, S3) 145define amdgpu_kernel void @udot2_MulMul(<2 x i16> addrspace(1)* %src1, 146; GFX7-LABEL: udot2_MulMul: 147; GFX7: ; %bb.0: ; %entry 148; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 149; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 150; GFX7-NEXT: s_mov_b32 s8, 0xffff 151; GFX7-NEXT: s_mov_b32 s3, 0xf000 152; GFX7-NEXT: s_mov_b32 s2, -1 153; GFX7-NEXT: s_waitcnt lgkmcnt(0) 154; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 155; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 156; GFX7-NEXT: s_waitcnt lgkmcnt(0) 157; GFX7-NEXT: s_lshr_b32 s6, s4, 16 158; GFX7-NEXT: s_and_b32 s4, s4, s8 159; GFX7-NEXT: v_mov_b32_e32 v0, s4 160; GFX7-NEXT: s_load_dword s4, s[0:1], 0x0 161; GFX7-NEXT: s_lshr_b32 s7, s5, 16 162; GFX7-NEXT: s_and_b32 s5, s5, s8 163; GFX7-NEXT: v_mul_u32_u24_e32 v0, s5, v0 164; GFX7-NEXT: v_mov_b32_e32 v1, s6 165; GFX7-NEXT: v_mad_u32_u24 v0, s7, v1, v0 166; GFX7-NEXT: s_waitcnt lgkmcnt(0) 167; GFX7-NEXT: v_add_i32_e32 v0, vcc, s4, v0 168; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 169; GFX7-NEXT: s_endpgm 170; 171; GFX8-LABEL: udot2_MulMul: 172; GFX8: ; %bb.0: ; %entry 173; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 174; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 175; GFX8-NEXT: s_mov_b32 s2, 0xffff 176; GFX8-NEXT: s_waitcnt lgkmcnt(0) 177; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 178; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 179; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 180; GFX8-NEXT: s_waitcnt lgkmcnt(0) 181; GFX8-NEXT: s_and_b32 s6, s3, s2 182; GFX8-NEXT: s_and_b32 s2, s4, s2 183; GFX8-NEXT: v_mov_b32_e32 v0, s6 184; GFX8-NEXT: s_lshr_b32 s3, s3, 16 185; GFX8-NEXT: s_lshr_b32 s4, s4, 16 186; GFX8-NEXT: v_mov_b32_e32 v1, s3 187; GFX8-NEXT: v_mul_u32_u24_e32 v0, s2, v0 188; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 189; GFX8-NEXT: v_add_u32_e32 v2, vcc, s5, v0 190; GFX8-NEXT: v_mov_b32_e32 v0, s0 191; GFX8-NEXT: v_mov_b32_e32 v1, s1 192; GFX8-NEXT: flat_store_dword v[0:1], v2 193; GFX8-NEXT: s_endpgm 194; 195; GFX9-NODL-LABEL: udot2_MulMul: 196; GFX9-NODL: ; %bb.0: ; %entry 197; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 198; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 199; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 200; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 201; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 202; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 203; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 204; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 205; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 206; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 207; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 208; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s6 209; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 210; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 211; GFX9-NODL-NEXT: v_mul_u32_u24_e32 v1, s2, v1 212; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s3 213; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 214; GFX9-NODL-NEXT: v_add_u32_e32 v1, s5, v1 215; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 216; GFX9-NODL-NEXT: s_endpgm 217; 218; GFX9-DL-LABEL: udot2_MulMul: 219; GFX9-DL: ; %bb.0: ; %entry 220; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 221; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 222; GFX9-DL-NEXT: s_mov_b32 s2, 0xffff 223; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 224; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 225; GFX9-DL-NEXT: s_load_dword s3, s[4:5], 0x0 226; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 227; GFX9-DL-NEXT: s_load_dword s5, s[0:1], 0x0 228; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 229; GFX9-DL-NEXT: s_and_b32 s6, s3, s2 230; GFX9-DL-NEXT: s_and_b32 s2, s4, s2 231; GFX9-DL-NEXT: v_mov_b32_e32 v1, s6 232; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 233; GFX9-DL-NEXT: s_lshr_b32 s4, s4, 16 234; GFX9-DL-NEXT: v_mul_u32_u24_e32 v1, s2, v1 235; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 236; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 237; GFX9-DL-NEXT: v_add_u32_e32 v1, s5, v1 238; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 239; GFX9-DL-NEXT: s_endpgm 240; 241; GFX10-DL-LABEL: udot2_MulMul: 242; GFX10-DL: ; %bb.0: ; %entry 243; GFX10-DL-NEXT: s_clause 0x1 244; GFX10-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 245; GFX10-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 246; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 247; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 248; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 249; GFX10-DL-NEXT: s_load_dword s2, s[4:5], 0x0 250; GFX10-DL-NEXT: s_load_dword s3, s[6:7], 0x0 251; GFX10-DL-NEXT: s_load_dword s4, s[0:1], 0x0 252; GFX10-DL-NEXT: s_mov_b32 s5, 0xffff 253; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 254; GFX10-DL-NEXT: s_and_b32 s6, s2, s5 255; GFX10-DL-NEXT: s_and_b32 s5, s3, s5 256; GFX10-DL-NEXT: s_lshr_b32 s2, s2, 16 257; GFX10-DL-NEXT: v_mul_u32_u24_e64 v0, s5, s6 258; GFX10-DL-NEXT: s_lshr_b32 s3, s3, 16 259; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s2, v0 260; GFX10-DL-NEXT: v_add_nc_u32_e32 v0, s4, v0 261; GFX10-DL-NEXT: global_store_dword v1, v0, s[0:1] 262; GFX10-DL-NEXT: s_endpgm 263 <2 x i16> addrspace(1)* %src2, 264 i32 addrspace(1)* nocapture %dst) { 265entry: 266 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 267 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 268 269 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 270 %conv = zext i16 %s1.elt1 to i32 271 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 272 %conv2 = zext i16 %s2.elt1 to i32 273 %mul1 = mul nuw i32 %conv2, %conv 274 275 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 276 %conv3 = zext i16 %s1.elt2 to i32 277 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 278 %conv4 = zext i16 %s2.elt2 to i32 279 %mul2 = mul nuw i32 %conv4, %conv3 280 %s3 = load i32, i32 addrspace(1)* %dst, align 4 281 %add = add i32 %mul2, %mul1 282 %add6 = add i32 %add, %s3 283 store i32 %add6, i32 addrspace(1)* %dst, align 4 284 ret void 285} 286 287define amdgpu_kernel void @idot2(<2 x i16> addrspace(1)* %src1, 288; GFX7-LABEL: idot2: 289; GFX7: ; %bb.0: ; %entry 290; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 291; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 292; GFX7-NEXT: s_mov_b32 s3, 0xf000 293; GFX7-NEXT: s_mov_b32 s2, -1 294; GFX7-NEXT: s_waitcnt lgkmcnt(0) 295; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 296; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 297; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 298; GFX7-NEXT: s_waitcnt lgkmcnt(0) 299; GFX7-NEXT: s_sext_i32_i16 s7, s4 300; GFX7-NEXT: s_ashr_i32 s4, s4, 16 301; GFX7-NEXT: s_sext_i32_i16 s8, s5 302; GFX7-NEXT: s_ashr_i32 s5, s5, 16 303; GFX7-NEXT: v_mov_b32_e32 v0, s4 304; GFX7-NEXT: v_mov_b32_e32 v1, s6 305; GFX7-NEXT: v_mad_i32_i24 v0, s5, v0, v1 306; GFX7-NEXT: v_mov_b32_e32 v1, s7 307; GFX7-NEXT: v_mad_i32_i24 v0, s8, v1, v0 308; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 309; GFX7-NEXT: s_endpgm 310; 311; GFX8-LABEL: idot2: 312; GFX8: ; %bb.0: ; %entry 313; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 314; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 315; GFX8-NEXT: s_waitcnt lgkmcnt(0) 316; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 317; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 318; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 319; GFX8-NEXT: s_waitcnt lgkmcnt(0) 320; GFX8-NEXT: s_sext_i32_i16 s5, s2 321; GFX8-NEXT: s_ashr_i32 s2, s2, 16 322; GFX8-NEXT: s_sext_i32_i16 s6, s3 323; GFX8-NEXT: s_ashr_i32 s3, s3, 16 324; GFX8-NEXT: v_mov_b32_e32 v0, s4 325; GFX8-NEXT: v_mov_b32_e32 v1, s2 326; GFX8-NEXT: v_mov_b32_e32 v2, s5 327; GFX8-NEXT: v_mad_i32_i24 v0, s3, v1, v0 328; GFX8-NEXT: v_mad_i32_i24 v2, s6, v2, v0 329; GFX8-NEXT: v_mov_b32_e32 v0, s0 330; GFX8-NEXT: v_mov_b32_e32 v1, s1 331; GFX8-NEXT: flat_store_dword v[0:1], v2 332; GFX8-NEXT: s_endpgm 333; 334; GFX9-NODL-LABEL: idot2: 335; GFX9-NODL: ; %bb.0: ; %entry 336; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 337; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 338; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 339; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 340; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 341; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 342; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 343; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 344; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 345; GFX9-NODL-NEXT: s_ashr_i32 s2, s2, 16 346; GFX9-NODL-NEXT: s_sext_i32_i16 s6, s3 347; GFX9-NODL-NEXT: s_ashr_i32 s3, s3, 16 348; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 349; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 350; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 351; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 352; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 353; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 354; GFX9-NODL-NEXT: s_endpgm 355; 356; GFX9-DL-LABEL: idot2: 357; GFX9-DL: ; %bb.0: ; %entry 358; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 359; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 360; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 361; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 362; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 363; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 364; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 365; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 366; GFX9-DL-NEXT: v_mov_b32_e32 v1, s2 367; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 368; GFX9-DL-NEXT: v_dot2_i32_i16 v1, s4, v1, v2 369; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 370; GFX9-DL-NEXT: s_endpgm 371; 372; GFX10-DL-LABEL: idot2: 373; GFX10-DL: ; %bb.0: ; %entry 374; GFX10-DL-NEXT: s_clause 0x1 375; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 376; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 377; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 378; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 379; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 380; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 381; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 382; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 383; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 384; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 385; GFX10-DL-NEXT: v_dot2_i32_i16 v0, s1, s0, v0 386; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 387; GFX10-DL-NEXT: s_endpgm 388 <2 x i16> addrspace(1)* %src2, 389 i32 addrspace(1)* nocapture %dst) { 390entry: 391 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 392 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 393 394 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 395 %conv = sext i16 %s1.elt1 to i32 396 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 397 %conv2 = sext i16 %s2.elt1 to i32 398 %mul1 = mul nuw i32 %conv2, %conv 399 400 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 401 %conv3 = sext i16 %s1.elt2 to i32 402 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 403 %conv4 = sext i16 %s2.elt2 to i32 404 %mul2 = mul nuw i32 %conv4, %conv3 405 406 %s3 = load i32, i32 addrspace(1)* %dst, align 4 407 %add = add i32 %mul2, %s3 408 %add6 = add i32 %add, %mul1 409 store i32 %add6, i32 addrspace(1)* %dst, align 4 410 ret void 411} 412 413define amdgpu_kernel void @idot2_MixedTypedMul(<2 x i16> addrspace(1)* %src1, 414; GFX7-LABEL: idot2_MixedTypedMul: 415; GFX7: ; %bb.0: ; %entry 416; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 417; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 418; GFX7-NEXT: s_mov_b32 s3, 0xf000 419; GFX7-NEXT: s_mov_b32 s2, -1 420; GFX7-NEXT: s_waitcnt lgkmcnt(0) 421; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 422; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 423; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 424; GFX7-NEXT: s_waitcnt lgkmcnt(0) 425; GFX7-NEXT: s_lshr_b32 s7, s4, 16 426; GFX7-NEXT: s_lshr_b32 s8, s5, 16 427; GFX7-NEXT: s_sext_i32_i16 s4, s4 428; GFX7-NEXT: v_mov_b32_e32 v0, s7 429; GFX7-NEXT: v_mov_b32_e32 v1, s6 430; GFX7-NEXT: v_mad_u32_u24 v0, s8, v0, v1 431; GFX7-NEXT: s_sext_i32_i16 s5, s5 432; GFX7-NEXT: v_mov_b32_e32 v1, s4 433; GFX7-NEXT: v_mad_i32_i24 v0, s5, v1, v0 434; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 435; GFX7-NEXT: s_endpgm 436; 437; GFX8-LABEL: idot2_MixedTypedMul: 438; GFX8: ; %bb.0: ; %entry 439; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 440; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 441; GFX8-NEXT: s_waitcnt lgkmcnt(0) 442; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 443; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 444; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 445; GFX8-NEXT: s_waitcnt lgkmcnt(0) 446; GFX8-NEXT: s_sext_i32_i16 s5, s2 447; GFX8-NEXT: s_lshr_b32 s2, s2, 16 448; GFX8-NEXT: s_sext_i32_i16 s6, s3 449; GFX8-NEXT: s_lshr_b32 s3, s3, 16 450; GFX8-NEXT: v_mov_b32_e32 v0, s4 451; GFX8-NEXT: v_mov_b32_e32 v1, s2 452; GFX8-NEXT: v_mov_b32_e32 v2, s5 453; GFX8-NEXT: v_mad_u32_u24 v0, s3, v1, v0 454; GFX8-NEXT: v_mad_i32_i24 v2, s6, v2, v0 455; GFX8-NEXT: v_mov_b32_e32 v0, s0 456; GFX8-NEXT: v_mov_b32_e32 v1, s1 457; GFX8-NEXT: flat_store_dword v[0:1], v2 458; GFX8-NEXT: s_endpgm 459; 460; GFX9-NODL-LABEL: idot2_MixedTypedMul: 461; GFX9-NODL: ; %bb.0: ; %entry 462; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 463; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 464; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 465; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 466; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 467; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 468; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 469; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 470; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 471; GFX9-NODL-NEXT: s_lshr_b32 s2, s2, 16 472; GFX9-NODL-NEXT: s_sext_i32_i16 s6, s3 473; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 474; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 475; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 476; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s3, v2, v1 477; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 478; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 479; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 480; GFX9-NODL-NEXT: s_endpgm 481; 482; GFX9-DL-LABEL: idot2_MixedTypedMul: 483; GFX9-DL: ; %bb.0: ; %entry 484; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 485; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 486; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 487; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 488; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 489; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 490; GFX9-DL-NEXT: s_load_dword s4, s[0:1], 0x0 491; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 492; GFX9-DL-NEXT: s_sext_i32_i16 s5, s2 493; GFX9-DL-NEXT: s_lshr_b32 s2, s2, 16 494; GFX9-DL-NEXT: s_sext_i32_i16 s6, s3 495; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 496; GFX9-DL-NEXT: v_mov_b32_e32 v1, s4 497; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 498; GFX9-DL-NEXT: v_mad_u32_u24 v1, s3, v2, v1 499; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 500; GFX9-DL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 501; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 502; GFX9-DL-NEXT: s_endpgm 503; 504; GFX10-DL-LABEL: idot2_MixedTypedMul: 505; GFX10-DL: ; %bb.0: ; %entry 506; GFX10-DL-NEXT: s_clause 0x1 507; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 508; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 509; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 510; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 511; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 512; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 513; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 514; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 515; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 516; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 517; GFX10-DL-NEXT: s_lshr_b32 s2, s0, 16 518; GFX10-DL-NEXT: s_lshr_b32 s3, s1, 16 519; GFX10-DL-NEXT: s_sext_i32_i16 s0, s0 520; GFX10-DL-NEXT: s_sext_i32_i16 s1, s1 521; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s2, v0 522; GFX10-DL-NEXT: v_mad_i32_i24 v0, s1, s0, v0 523; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 524; GFX10-DL-NEXT: s_endpgm 525 <2 x i16> addrspace(1)* %src2, 526 i32 addrspace(1)* nocapture %dst) { 527entry: 528 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 529 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 530 531 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 532 %conv = sext i16 %s1.elt1 to i32 533 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 534 %conv2 = sext i16 %s2.elt1 to i32 535 %mul1 = mul nuw i32 %conv2, %conv 536 537 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 538 %conv3 = zext i16 %s1.elt2 to i32 539 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 540 %conv4 = zext i16 %s2.elt2 to i32 541 %mul2 = mul nuw i32 %conv4, %conv3 542 543 %s3 = load i32, i32 addrspace(1)* %dst, align 4 544 %add = add i32 %mul2, %s3 545 %add6 = add i32 %add, %mul1 546 store i32 %add6, i32 addrspace(1)* %dst, align 4 547 ret void 548} 549 550define amdgpu_kernel void @udot2_alt_AddOperands(<2 x i16> addrspace(1)* %src1, 551; GFX7-LABEL: udot2_alt_AddOperands: 552; GFX7: ; %bb.0: ; %entry 553; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 554; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 555; GFX7-NEXT: s_mov_b32 s8, 0xffff 556; GFX7-NEXT: s_mov_b32 s3, 0xf000 557; GFX7-NEXT: s_mov_b32 s2, -1 558; GFX7-NEXT: s_waitcnt lgkmcnt(0) 559; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 560; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 561; GFX7-NEXT: s_waitcnt lgkmcnt(0) 562; GFX7-NEXT: s_lshr_b32 s6, s4, 16 563; GFX7-NEXT: s_lshr_b32 s7, s5, 16 564; GFX7-NEXT: s_and_b32 s4, s4, s8 565; GFX7-NEXT: s_and_b32 s5, s5, s8 566; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 567; GFX7-NEXT: v_mov_b32_e32 v0, s6 568; GFX7-NEXT: s_waitcnt lgkmcnt(0) 569; GFX7-NEXT: v_mov_b32_e32 v1, s8 570; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 571; GFX7-NEXT: v_mov_b32_e32 v1, s4 572; GFX7-NEXT: v_mad_u32_u24 v0, s5, v1, v0 573; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 574; GFX7-NEXT: s_endpgm 575; 576; GFX8-LABEL: udot2_alt_AddOperands: 577; GFX8: ; %bb.0: ; %entry 578; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 579; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 580; GFX8-NEXT: s_mov_b32 s2, 0xffff 581; GFX8-NEXT: s_waitcnt lgkmcnt(0) 582; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 583; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 584; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 585; GFX8-NEXT: s_waitcnt lgkmcnt(0) 586; GFX8-NEXT: s_and_b32 s6, s3, s2 587; GFX8-NEXT: s_lshr_b32 s3, s3, 16 588; GFX8-NEXT: s_and_b32 s2, s4, s2 589; GFX8-NEXT: s_lshr_b32 s4, s4, 16 590; GFX8-NEXT: v_mov_b32_e32 v0, s5 591; GFX8-NEXT: v_mov_b32_e32 v1, s3 592; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 593; GFX8-NEXT: v_mov_b32_e32 v1, s6 594; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 595; GFX8-NEXT: v_mov_b32_e32 v0, s0 596; GFX8-NEXT: v_mov_b32_e32 v1, s1 597; GFX8-NEXT: flat_store_dword v[0:1], v2 598; GFX8-NEXT: s_endpgm 599; 600; GFX9-NODL-LABEL: udot2_alt_AddOperands: 601; GFX9-NODL: ; %bb.0: ; %entry 602; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 603; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 604; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 605; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 606; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 607; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 608; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 609; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 610; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 611; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 612; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 613; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 614; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 615; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 616; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 617; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 618; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 619; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 620; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 621; GFX9-NODL-NEXT: s_endpgm 622; 623; GFX9-DL-LABEL: udot2_alt_AddOperands: 624; GFX9-DL: ; %bb.0: ; %entry 625; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 626; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 627; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 628; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 629; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 630; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 631; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 632; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 633; GFX9-DL-NEXT: v_mov_b32_e32 v1, s2 634; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 635; GFX9-DL-NEXT: v_dot2_u32_u16 v1, s4, v1, v2 636; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 637; GFX9-DL-NEXT: s_endpgm 638; 639; GFX10-DL-LABEL: udot2_alt_AddOperands: 640; GFX10-DL: ; %bb.0: ; %entry 641; GFX10-DL-NEXT: s_clause 0x1 642; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 643; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 644; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 645; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 646; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 647; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 648; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 649; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 650; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 651; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 652; GFX10-DL-NEXT: v_dot2_u32_u16 v0, s1, s0, v0 653; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 654; GFX10-DL-NEXT: s_endpgm 655 <2 x i16> addrspace(1)* %src2, 656 i32 addrspace(1)* nocapture %dst) { 657entry: 658 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 659 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 660 661 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 662 %conv = zext i16 %s1.elt1 to i32 663 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 664 %conv2 = zext i16 %s2.elt1 to i32 665 %mul1 = mul nuw i32 %conv2, %conv 666 667 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 668 %conv3 = zext i16 %s1.elt2 to i32 669 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 670 %conv4 = zext i16 %s2.elt2 to i32 671 %mul2 = mul nuw i32 %conv4, %conv3 672 673 %s3 = load i32, i32 addrspace(1)* %dst, align 4 674 %add = add i32 %s3, %mul2 675 %add6 = add i32 %mul1, %add 676 store i32 %add6, i32 addrspace(1)* %dst, align 4 677 ret void 678} 679 680define amdgpu_kernel void @idot2_MixedExt(<2 x i16> addrspace(1)* %src1, 681; GFX7-LABEL: idot2_MixedExt: 682; GFX7: ; %bb.0: ; %entry 683; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 684; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 685; GFX7-NEXT: s_mov_b32 s3, 0xf000 686; GFX7-NEXT: s_mov_b32 s2, -1 687; GFX7-NEXT: s_waitcnt lgkmcnt(0) 688; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 689; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 690; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 691; GFX7-NEXT: s_waitcnt lgkmcnt(0) 692; GFX7-NEXT: s_sext_i32_i16 s7, s4 693; GFX7-NEXT: s_ashr_i32 s4, s4, 16 694; GFX7-NEXT: s_and_b32 s8, s5, 0xffff 695; GFX7-NEXT: s_ashr_i32 s5, s5, 16 696; GFX7-NEXT: v_mov_b32_e32 v0, s4 697; GFX7-NEXT: v_mov_b32_e32 v1, s6 698; GFX7-NEXT: v_mad_i32_i24 v0, s5, v0, v1 699; GFX7-NEXT: v_mov_b32_e32 v1, s7 700; GFX7-NEXT: v_mad_i32_i24 v0, s8, v1, v0 701; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 702; GFX7-NEXT: s_endpgm 703; 704; GFX8-LABEL: idot2_MixedExt: 705; GFX8: ; %bb.0: ; %entry 706; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 707; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 708; GFX8-NEXT: s_waitcnt lgkmcnt(0) 709; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 710; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 711; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 712; GFX8-NEXT: s_waitcnt lgkmcnt(0) 713; GFX8-NEXT: s_sext_i32_i16 s5, s2 714; GFX8-NEXT: s_ashr_i32 s2, s2, 16 715; GFX8-NEXT: s_and_b32 s6, s3, 0xffff 716; GFX8-NEXT: s_ashr_i32 s3, s3, 16 717; GFX8-NEXT: v_mov_b32_e32 v0, s4 718; GFX8-NEXT: v_mov_b32_e32 v1, s2 719; GFX8-NEXT: v_mov_b32_e32 v2, s5 720; GFX8-NEXT: v_mad_i32_i24 v0, s3, v1, v0 721; GFX8-NEXT: v_mad_i32_i24 v2, s6, v2, v0 722; GFX8-NEXT: v_mov_b32_e32 v0, s0 723; GFX8-NEXT: v_mov_b32_e32 v1, s1 724; GFX8-NEXT: flat_store_dword v[0:1], v2 725; GFX8-NEXT: s_endpgm 726; 727; GFX9-NODL-LABEL: idot2_MixedExt: 728; GFX9-NODL: ; %bb.0: ; %entry 729; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 730; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 731; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 732; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 733; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 734; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 735; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 736; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 737; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 738; GFX9-NODL-NEXT: s_ashr_i32 s2, s2, 16 739; GFX9-NODL-NEXT: s_and_b32 s6, s3, 0xffff 740; GFX9-NODL-NEXT: s_ashr_i32 s3, s3, 16 741; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 742; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 743; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 744; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 745; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 746; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 747; GFX9-NODL-NEXT: s_endpgm 748; 749; GFX9-DL-LABEL: idot2_MixedExt: 750; GFX9-DL: ; %bb.0: ; %entry 751; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 752; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 753; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 754; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 755; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 756; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 757; GFX9-DL-NEXT: s_load_dword s4, s[0:1], 0x0 758; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 759; GFX9-DL-NEXT: s_sext_i32_i16 s5, s2 760; GFX9-DL-NEXT: s_ashr_i32 s2, s2, 16 761; GFX9-DL-NEXT: s_and_b32 s6, s3, 0xffff 762; GFX9-DL-NEXT: s_ashr_i32 s3, s3, 16 763; GFX9-DL-NEXT: v_mov_b32_e32 v1, s4 764; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 765; GFX9-DL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 766; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 767; GFX9-DL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 768; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 769; GFX9-DL-NEXT: s_endpgm 770; 771; GFX10-DL-LABEL: idot2_MixedExt: 772; GFX10-DL: ; %bb.0: ; %entry 773; GFX10-DL-NEXT: s_clause 0x1 774; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 775; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 776; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 777; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 778; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 779; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 780; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 781; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 782; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 783; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 784; GFX10-DL-NEXT: s_ashr_i32 s2, s0, 16 785; GFX10-DL-NEXT: s_ashr_i32 s3, s1, 16 786; GFX10-DL-NEXT: s_sext_i32_i16 s0, s0 787; GFX10-DL-NEXT: s_and_b32 s1, s1, 0xffff 788; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 789; GFX10-DL-NEXT: v_mad_i32_i24 v0, s1, s0, v0 790; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 791; GFX10-DL-NEXT: s_endpgm 792 <2 x i16> addrspace(1)* %src2, 793 i32 addrspace(1)* nocapture %dst) { 794entry: 795 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 796 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 797 798 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 799 %conv = sext i16 %s1.elt1 to i32 800 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 801 %conv2 = zext i16 %s2.elt1 to i32 802 %mul1 = mul nuw i32 %conv2, %conv 803 804 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 805 %conv3 = sext i16 %s1.elt2 to i32 806 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 807 %conv4 = sext i16 %s2.elt2 to i32 808 %mul2 = mul nuw i32 %conv4, %conv3 809 810 %s3 = load i32, i32 addrspace(1)* %dst, align 4 811 %add = add i32 %mul2, %s3 812 %add6 = add i32 %add, %mul1 813 store i32 %add6, i32 addrspace(1)* %dst, align 4 814 ret void 815} 816 817define amdgpu_kernel void @notudot2_SameVec(<2 x i16> addrspace(1)* %src1, 818; GFX7-LABEL: notudot2_SameVec: 819; GFX7: ; %bb.0: ; %entry 820; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 821; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 822; GFX7-NEXT: s_mov_b32 s3, 0xf000 823; GFX7-NEXT: s_mov_b32 s2, -1 824; GFX7-NEXT: s_waitcnt lgkmcnt(0) 825; GFX7-NEXT: s_load_dword s6, s[6:7], 0x0 826; GFX7-NEXT: s_load_dword s7, s[0:1], 0x0 827; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 828; GFX7-NEXT: s_waitcnt lgkmcnt(0) 829; GFX7-NEXT: s_lshr_b32 s5, s6, 16 830; GFX7-NEXT: v_mov_b32_e32 v0, s7 831; GFX7-NEXT: s_and_b32 s4, s4, 0xffff 832; GFX7-NEXT: v_mad_u32_u24 v0, s5, s5, v0 833; GFX7-NEXT: v_mad_u32_u24 v0, s4, s4, v0 834; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 835; GFX7-NEXT: s_endpgm 836; 837; GFX8-LABEL: notudot2_SameVec: 838; GFX8: ; %bb.0: ; %entry 839; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 840; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 841; GFX8-NEXT: s_waitcnt lgkmcnt(0) 842; GFX8-NEXT: s_load_dword s2, s[6:7], 0x0 843; GFX8-NEXT: s_load_dword s3, s[0:1], 0x0 844; GFX8-NEXT: s_load_dword s4, s[4:5], 0x0 845; GFX8-NEXT: s_waitcnt lgkmcnt(0) 846; GFX8-NEXT: s_lshr_b32 s2, s2, 16 847; GFX8-NEXT: v_mov_b32_e32 v0, s3 848; GFX8-NEXT: s_and_b32 s4, s4, 0xffff 849; GFX8-NEXT: v_mad_u32_u24 v0, s2, s2, v0 850; GFX8-NEXT: v_mad_u32_u24 v2, s4, s4, v0 851; GFX8-NEXT: v_mov_b32_e32 v0, s0 852; GFX8-NEXT: v_mov_b32_e32 v1, s1 853; GFX8-NEXT: flat_store_dword v[0:1], v2 854; GFX8-NEXT: s_endpgm 855; 856; GFX9-NODL-LABEL: notudot2_SameVec: 857; GFX9-NODL: ; %bb.0: ; %entry 858; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 859; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 860; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 861; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 862; GFX9-NODL-NEXT: s_load_dword s2, s[6:7], 0x0 863; GFX9-NODL-NEXT: s_load_dword s3, s[0:1], 0x0 864; GFX9-NODL-NEXT: s_load_dword s4, s[4:5], 0x0 865; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 866; GFX9-NODL-NEXT: s_lshr_b32 s2, s2, 16 867; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 868; GFX9-NODL-NEXT: s_and_b32 s4, s4, 0xffff 869; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, s2, v1 870; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, s4, v1 871; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 872; GFX9-NODL-NEXT: s_endpgm 873; 874; GFX9-DL-LABEL: notudot2_SameVec: 875; GFX9-DL: ; %bb.0: ; %entry 876; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 877; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 878; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 879; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 880; GFX9-DL-NEXT: s_load_dword s2, s[6:7], 0x0 881; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 882; GFX9-DL-NEXT: s_load_dword s4, s[4:5], 0x0 883; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 884; GFX9-DL-NEXT: s_lshr_b32 s2, s2, 16 885; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 886; GFX9-DL-NEXT: s_and_b32 s4, s4, 0xffff 887; GFX9-DL-NEXT: v_mad_u32_u24 v1, s2, s2, v1 888; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, s4, v1 889; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 890; GFX9-DL-NEXT: s_endpgm 891; 892; GFX10-DL-LABEL: notudot2_SameVec: 893; GFX10-DL: ; %bb.0: ; %entry 894; GFX10-DL-NEXT: s_clause 0x1 895; GFX10-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 896; GFX10-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 897; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 898; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 899; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 900; GFX10-DL-NEXT: s_load_dword s2, s[6:7], 0x0 901; GFX10-DL-NEXT: s_load_dword s3, s[0:1], 0x0 902; GFX10-DL-NEXT: s_load_dword s4, s[4:5], 0x0 903; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 904; GFX10-DL-NEXT: s_lshr_b32 s2, s2, 16 905; GFX10-DL-NEXT: v_mad_u32_u24 v0, s2, s2, s3 906; GFX10-DL-NEXT: s_and_b32 s2, s4, 0xffff 907; GFX10-DL-NEXT: v_mad_u32_u24 v0, s2, s2, v0 908; GFX10-DL-NEXT: global_store_dword v1, v0, s[0:1] 909; GFX10-DL-NEXT: s_endpgm 910 <2 x i16> addrspace(1)* %src2, 911 i32 addrspace(1)* nocapture %dst) { 912entry: 913 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 914 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 915 916 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 917 %conv = zext i16 %s1.elt1 to i32 918 %s2.elt1 = extractelement <2 x i16> %vec1, i64 0 919 %conv2 = zext i16 %s2.elt1 to i32 920 %mul1 = mul i32 %conv2, %conv 921 922 %s1.elt2 = extractelement <2 x i16> %vec2, i64 1 923 %conv3 = zext i16 %s1.elt2 to i32 924 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 925 %conv4 = zext i16 %s2.elt2 to i32 926 %mul2 = mul i32 %conv4, %conv3 927 928 %s3 = load i32, i32 addrspace(1)* %dst, align 4 929 %add = add i32 %mul2, %s3 930 %add6 = add i32 %add, %mul1 931 store i32 %add6, i32 addrspace(1)* %dst, align 4 932 ret void 933} 934 935define amdgpu_kernel void @udot2_v4i16(<4 x i16> addrspace(1)* %src1, 936; GFX7-LABEL: udot2_v4i16: 937; GFX7: ; %bb.0: ; %entry 938; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 939; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 940; GFX7-NEXT: s_mov_b32 s8, 0xffff 941; GFX7-NEXT: s_mov_b32 s3, 0xf000 942; GFX7-NEXT: s_mov_b32 s2, -1 943; GFX7-NEXT: s_waitcnt lgkmcnt(0) 944; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 945; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 946; GFX7-NEXT: s_waitcnt lgkmcnt(0) 947; GFX7-NEXT: s_and_b32 s6, s4, s8 948; GFX7-NEXT: s_and_b32 s7, s5, s8 949; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 950; GFX7-NEXT: s_lshr_b32 s4, s4, 16 951; GFX7-NEXT: s_lshr_b32 s5, s5, 16 952; GFX7-NEXT: v_mov_b32_e32 v0, s4 953; GFX7-NEXT: s_waitcnt lgkmcnt(0) 954; GFX7-NEXT: v_mov_b32_e32 v1, s8 955; GFX7-NEXT: v_mad_u32_u24 v0, s5, v0, v1 956; GFX7-NEXT: v_mov_b32_e32 v1, s6 957; GFX7-NEXT: v_mad_u32_u24 v0, s7, v1, v0 958; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 959; GFX7-NEXT: s_endpgm 960; 961; GFX8-LABEL: udot2_v4i16: 962; GFX8: ; %bb.0: ; %entry 963; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 964; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 965; GFX8-NEXT: s_mov_b32 s2, 0xffff 966; GFX8-NEXT: s_waitcnt lgkmcnt(0) 967; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 968; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 969; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 970; GFX8-NEXT: s_waitcnt lgkmcnt(0) 971; GFX8-NEXT: s_and_b32 s6, s3, s2 972; GFX8-NEXT: s_lshr_b32 s3, s3, 16 973; GFX8-NEXT: s_and_b32 s2, s4, s2 974; GFX8-NEXT: s_lshr_b32 s4, s4, 16 975; GFX8-NEXT: v_mov_b32_e32 v0, s5 976; GFX8-NEXT: v_mov_b32_e32 v1, s3 977; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 978; GFX8-NEXT: v_mov_b32_e32 v1, s6 979; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 980; GFX8-NEXT: v_mov_b32_e32 v0, s0 981; GFX8-NEXT: v_mov_b32_e32 v1, s1 982; GFX8-NEXT: flat_store_dword v[0:1], v2 983; GFX8-NEXT: s_endpgm 984; 985; GFX9-NODL-LABEL: udot2_v4i16: 986; GFX9-NODL: ; %bb.0: ; %entry 987; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 988; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 989; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 990; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 991; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 992; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 993; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 994; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 995; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 996; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 997; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 998; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 999; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 1000; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1001; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1002; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 1003; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1004; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 1005; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1006; GFX9-NODL-NEXT: s_endpgm 1007; 1008; GFX9-DL-LABEL: udot2_v4i16: 1009; GFX9-DL: ; %bb.0: ; %entry 1010; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1011; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1012; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1013; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1014; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 1015; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 1016; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 1017; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1018; GFX9-DL-NEXT: v_mov_b32_e32 v1, s2 1019; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 1020; GFX9-DL-NEXT: v_dot2_u32_u16 v1, s4, v1, v2 1021; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1022; GFX9-DL-NEXT: s_endpgm 1023; 1024; GFX10-DL-LABEL: udot2_v4i16: 1025; GFX10-DL: ; %bb.0: ; %entry 1026; GFX10-DL-NEXT: s_clause 0x1 1027; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1028; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1029; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 1030; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1031; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1032; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1033; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 1034; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 1035; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1036; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1037; GFX10-DL-NEXT: v_dot2_u32_u16 v0, s1, s0, v0 1038; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 1039; GFX10-DL-NEXT: s_endpgm 1040 <4 x i16> addrspace(1)* %src2, 1041 i32 addrspace(1)* nocapture %dst) { 1042entry: 1043 %vec1 = load <4 x i16>, <4 x i16> addrspace(1)* %src1 1044 %vec2 = load <4 x i16>, <4 x i16> addrspace(1)* %src2 1045 1046 %s1.elt1 = extractelement <4 x i16> %vec1, i64 0 1047 %conv = zext i16 %s1.elt1 to i32 1048 %s2.elt1 = extractelement <4 x i16> %vec2, i64 0 1049 %conv2 = zext i16 %s2.elt1 to i32 1050 %mul1 = mul i32 %conv2, %conv 1051 1052 %s1.elt2 = extractelement <4 x i16> %vec1, i64 1 1053 %conv3 = zext i16 %s1.elt2 to i32 1054 %s2.elt2 = extractelement <4 x i16> %vec2, i64 1 1055 %conv4 = zext i16 %s2.elt2 to i32 1056 %mul2 = mul i32 %conv4, %conv3 1057 1058 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1059 %add = add i32 %mul2, %s3 1060 %add6 = add i32 %add, %mul1 1061 store i32 %add6, i32 addrspace(1)* %dst, align 4 1062 ret void 1063} 1064 1065define amdgpu_kernel void @udot2_v4i16_Hi(<4 x i16> addrspace(1)* %src1, 1066; GFX7-LABEL: udot2_v4i16_Hi: 1067; GFX7: ; %bb.0: ; %entry 1068; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1069; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1070; GFX7-NEXT: s_mov_b32 s8, 0xffff 1071; GFX7-NEXT: s_mov_b32 s3, 0xf000 1072; GFX7-NEXT: s_mov_b32 s2, -1 1073; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1074; GFX7-NEXT: s_load_dword s4, s[4:5], 0x1 1075; GFX7-NEXT: s_load_dword s5, s[6:7], 0x1 1076; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1077; GFX7-NEXT: s_and_b32 s6, s4, s8 1078; GFX7-NEXT: s_and_b32 s7, s5, s8 1079; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1080; GFX7-NEXT: s_lshr_b32 s4, s4, 16 1081; GFX7-NEXT: s_lshr_b32 s5, s5, 16 1082; GFX7-NEXT: v_mov_b32_e32 v0, s4 1083; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1084; GFX7-NEXT: v_mov_b32_e32 v1, s8 1085; GFX7-NEXT: v_mad_u32_u24 v0, s5, v0, v1 1086; GFX7-NEXT: v_mov_b32_e32 v1, s6 1087; GFX7-NEXT: v_mad_u32_u24 v0, s7, v1, v0 1088; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1089; GFX7-NEXT: s_endpgm 1090; 1091; GFX8-LABEL: udot2_v4i16_Hi: 1092; GFX8: ; %bb.0: ; %entry 1093; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1094; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1095; GFX8-NEXT: s_mov_b32 s2, 0xffff 1096; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1097; GFX8-NEXT: s_load_dword s3, s[4:5], 0x4 1098; GFX8-NEXT: s_load_dword s4, s[6:7], 0x4 1099; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 1100; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1101; GFX8-NEXT: s_and_b32 s6, s3, s2 1102; GFX8-NEXT: s_lshr_b32 s3, s3, 16 1103; GFX8-NEXT: s_and_b32 s2, s4, s2 1104; GFX8-NEXT: s_lshr_b32 s4, s4, 16 1105; GFX8-NEXT: v_mov_b32_e32 v0, s5 1106; GFX8-NEXT: v_mov_b32_e32 v1, s3 1107; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 1108; GFX8-NEXT: v_mov_b32_e32 v1, s6 1109; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 1110; GFX8-NEXT: v_mov_b32_e32 v0, s0 1111; GFX8-NEXT: v_mov_b32_e32 v1, s1 1112; GFX8-NEXT: flat_store_dword v[0:1], v2 1113; GFX8-NEXT: s_endpgm 1114; 1115; GFX9-NODL-LABEL: udot2_v4i16_Hi: 1116; GFX9-NODL: ; %bb.0: ; %entry 1117; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1118; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1119; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 1120; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1121; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1122; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x4 1123; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x4 1124; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 1125; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1126; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 1127; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 1128; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 1129; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 1130; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1131; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1132; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 1133; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1134; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 1135; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1136; GFX9-NODL-NEXT: s_endpgm 1137; 1138; GFX9-DL-LABEL: udot2_v4i16_Hi: 1139; GFX9-DL: ; %bb.0: ; %entry 1140; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1141; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1142; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1143; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1144; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x4 1145; GFX9-DL-NEXT: s_load_dword s3, s[0:1], 0x0 1146; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x4 1147; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1148; GFX9-DL-NEXT: v_mov_b32_e32 v1, s2 1149; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 1150; GFX9-DL-NEXT: v_dot2_u32_u16 v1, s4, v1, v2 1151; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1152; GFX9-DL-NEXT: s_endpgm 1153; 1154; GFX10-DL-LABEL: udot2_v4i16_Hi: 1155; GFX10-DL: ; %bb.0: ; %entry 1156; GFX10-DL-NEXT: s_clause 0x1 1157; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1158; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1159; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 1160; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1161; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1162; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1163; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x4 1164; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x4 1165; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1166; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1167; GFX10-DL-NEXT: v_dot2_u32_u16 v0, s1, s0, v0 1168; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 1169; GFX10-DL-NEXT: s_endpgm 1170 <4 x i16> addrspace(1)* %src2, 1171 i32 addrspace(1)* nocapture %dst) { 1172entry: 1173 %vec1 = load <4 x i16>, <4 x i16> addrspace(1)* %src1 1174 %vec2 = load <4 x i16>, <4 x i16> addrspace(1)* %src2 1175 1176 %s1.elt1 = extractelement <4 x i16> %vec1, i64 2 1177 %conv = zext i16 %s1.elt1 to i32 1178 %s2.elt1 = extractelement <4 x i16> %vec2, i64 2 1179 %conv2 = zext i16 %s2.elt1 to i32 1180 %mul1 = mul i32 %conv2, %conv 1181 1182 %s1.elt2 = extractelement <4 x i16> %vec1, i64 3 1183 %conv3 = zext i16 %s1.elt2 to i32 1184 %s2.elt2 = extractelement <4 x i16> %vec2, i64 3 1185 %conv4 = zext i16 %s2.elt2 to i32 1186 %mul2 = mul i32 %conv4, %conv3 1187 1188 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1189 %add = add i32 %mul2, %s3 1190 %add6 = add i32 %add, %mul1 1191 store i32 %add6, i32 addrspace(1)* %dst, align 4 1192 ret void 1193} 1194 1195define amdgpu_kernel void @notudot2_v4i16_Even(<4 x i16> addrspace(1)* %src1, 1196; GFX7-LABEL: notudot2_v4i16_Even: 1197; GFX7: ; %bb.0: ; %entry 1198; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1199; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1200; GFX7-NEXT: s_mov_b32 s8, 0xffff 1201; GFX7-NEXT: s_mov_b32 s3, 0xf000 1202; GFX7-NEXT: s_mov_b32 s2, -1 1203; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1204; GFX7-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 1205; GFX7-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0 1206; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1207; GFX7-NEXT: s_and_b32 s5, s5, s8 1208; GFX7-NEXT: s_and_b32 s4, s4, s8 1209; GFX7-NEXT: s_and_b32 s6, s6, s8 1210; GFX7-NEXT: s_and_b32 s7, s7, s8 1211; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1212; GFX7-NEXT: v_mov_b32_e32 v0, s5 1213; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1214; GFX7-NEXT: v_mov_b32_e32 v1, s8 1215; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 1216; GFX7-NEXT: v_mov_b32_e32 v1, s4 1217; GFX7-NEXT: v_mad_u32_u24 v0, s6, v1, v0 1218; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1219; GFX7-NEXT: s_endpgm 1220; 1221; GFX8-LABEL: notudot2_v4i16_Even: 1222; GFX8: ; %bb.0: ; %entry 1223; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1224; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1225; GFX8-NEXT: s_mov_b32 s8, 0xffff 1226; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1227; GFX8-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1228; GFX8-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1229; GFX8-NEXT: s_load_dword s6, s[0:1], 0x0 1230; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1231; GFX8-NEXT: s_and_b32 s3, s3, s8 1232; GFX8-NEXT: s_and_b32 s2, s2, s8 1233; GFX8-NEXT: s_and_b32 s5, s5, s8 1234; GFX8-NEXT: v_mov_b32_e32 v0, s6 1235; GFX8-NEXT: v_mov_b32_e32 v1, s3 1236; GFX8-NEXT: v_mad_u32_u24 v0, s5, v1, v0 1237; GFX8-NEXT: s_and_b32 s4, s4, s8 1238; GFX8-NEXT: v_mov_b32_e32 v1, s2 1239; GFX8-NEXT: v_mad_u32_u24 v2, s4, v1, v0 1240; GFX8-NEXT: v_mov_b32_e32 v0, s0 1241; GFX8-NEXT: v_mov_b32_e32 v1, s1 1242; GFX8-NEXT: flat_store_dword v[0:1], v2 1243; GFX8-NEXT: s_endpgm 1244; 1245; GFX9-NODL-LABEL: notudot2_v4i16_Even: 1246; GFX9-NODL: ; %bb.0: ; %entry 1247; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1248; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1249; GFX9-NODL-NEXT: s_mov_b32 s8, 0xffff 1250; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1251; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1252; GFX9-NODL-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1253; GFX9-NODL-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1254; GFX9-NODL-NEXT: s_load_dword s6, s[0:1], 0x0 1255; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1256; GFX9-NODL-NEXT: s_and_b32 s3, s3, s8 1257; GFX9-NODL-NEXT: s_and_b32 s2, s2, s8 1258; GFX9-NODL-NEXT: s_and_b32 s5, s5, s8 1259; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1260; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1261; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s5, v1, v2 1262; GFX9-NODL-NEXT: s_and_b32 s4, s4, s8 1263; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 1264; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 1265; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1266; GFX9-NODL-NEXT: s_endpgm 1267; 1268; GFX9-DL-LABEL: notudot2_v4i16_Even: 1269; GFX9-DL: ; %bb.0: ; %entry 1270; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1271; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1272; GFX9-DL-NEXT: s_mov_b32 s8, 0xffff 1273; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1274; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1275; GFX9-DL-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1276; GFX9-DL-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1277; GFX9-DL-NEXT: s_load_dword s6, s[0:1], 0x0 1278; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1279; GFX9-DL-NEXT: s_and_b32 s3, s3, s8 1280; GFX9-DL-NEXT: s_and_b32 s2, s2, s8 1281; GFX9-DL-NEXT: s_and_b32 s5, s5, s8 1282; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 1283; GFX9-DL-NEXT: v_mov_b32_e32 v2, s6 1284; GFX9-DL-NEXT: v_mad_u32_u24 v1, s5, v1, v2 1285; GFX9-DL-NEXT: s_and_b32 s4, s4, s8 1286; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 1287; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 1288; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1289; GFX9-DL-NEXT: s_endpgm 1290; 1291; GFX10-DL-LABEL: notudot2_v4i16_Even: 1292; GFX10-DL: ; %bb.0: ; %entry 1293; GFX10-DL-NEXT: s_clause 0x1 1294; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1295; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1296; GFX10-DL-NEXT: s_mov_b32 s7, 0xffff 1297; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 1298; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1299; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1300; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1301; GFX10-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1302; GFX10-DL-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x0 1303; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1304; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1305; GFX10-DL-NEXT: s_and_b32 s1, s1, s7 1306; GFX10-DL-NEXT: s_and_b32 s3, s3, s7 1307; GFX10-DL-NEXT: s_and_b32 s0, s0, s7 1308; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s1, v0 1309; GFX10-DL-NEXT: s_and_b32 s1, s2, s7 1310; GFX10-DL-NEXT: v_mad_u32_u24 v0, s1, s0, v0 1311; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 1312; GFX10-DL-NEXT: s_endpgm 1313 <4 x i16> addrspace(1)* %src2, 1314 i32 addrspace(1)* nocapture %dst) { 1315entry: 1316 %vec1 = load <4 x i16>, <4 x i16> addrspace(1)* %src1 1317 %vec2 = load <4 x i16>, <4 x i16> addrspace(1)* %src2 1318 1319 %s1.elt1 = extractelement <4 x i16> %vec1, i64 0 1320 %conv = zext i16 %s1.elt1 to i32 1321 %s2.elt1 = extractelement <4 x i16> %vec2, i64 0 1322 %conv2 = zext i16 %s2.elt1 to i32 1323 %mul1 = mul i32 %conv2, %conv 1324 1325 %s1.elt2 = extractelement <4 x i16> %vec1, i64 2 1326 %conv3 = zext i16 %s1.elt2 to i32 1327 %s2.elt2 = extractelement <4 x i16> %vec2, i64 2 1328 %conv4 = zext i16 %s2.elt2 to i32 1329 %mul2 = mul i32 %conv4, %conv3 1330 1331 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1332 %add = add i32 %mul2, %s3 1333 %add6 = add i32 %add, %mul1 1334 store i32 %add6, i32 addrspace(1)* %dst, align 4 1335 ret void 1336} 1337 1338define amdgpu_kernel void @notudot2_v4i16_Middle(<4 x i16> addrspace(1)* %src1, 1339; GFX7-LABEL: notudot2_v4i16_Middle: 1340; GFX7: ; %bb.0: ; %entry 1341; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1342; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1343; GFX7-NEXT: s_mov_b32 s8, 0xffff 1344; GFX7-NEXT: s_mov_b32 s3, 0xf000 1345; GFX7-NEXT: s_mov_b32 s2, -1 1346; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1347; GFX7-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 1348; GFX7-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0 1349; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1350; GFX7-NEXT: s_and_b32 s5, s5, s8 1351; GFX7-NEXT: s_and_b32 s7, s7, s8 1352; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1353; GFX7-NEXT: s_lshr_b32 s4, s4, 16 1354; GFX7-NEXT: v_mov_b32_e32 v0, s5 1355; GFX7-NEXT: s_lshr_b32 s6, s6, 16 1356; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1357; GFX7-NEXT: v_mov_b32_e32 v1, s8 1358; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 1359; GFX7-NEXT: v_mov_b32_e32 v1, s4 1360; GFX7-NEXT: v_mad_u32_u24 v0, s6, v1, v0 1361; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1362; GFX7-NEXT: s_endpgm 1363; 1364; GFX8-LABEL: notudot2_v4i16_Middle: 1365; GFX8: ; %bb.0: ; %entry 1366; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1367; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1368; GFX8-NEXT: s_mov_b32 s8, 0xffff 1369; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1370; GFX8-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1371; GFX8-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1372; GFX8-NEXT: s_load_dword s6, s[0:1], 0x0 1373; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1374; GFX8-NEXT: s_and_b32 s3, s3, s8 1375; GFX8-NEXT: s_lshr_b32 s2, s2, 16 1376; GFX8-NEXT: s_and_b32 s5, s5, s8 1377; GFX8-NEXT: v_mov_b32_e32 v0, s6 1378; GFX8-NEXT: v_mov_b32_e32 v1, s3 1379; GFX8-NEXT: v_mad_u32_u24 v0, s5, v1, v0 1380; GFX8-NEXT: s_lshr_b32 s4, s4, 16 1381; GFX8-NEXT: v_mov_b32_e32 v1, s2 1382; GFX8-NEXT: v_mad_u32_u24 v2, s4, v1, v0 1383; GFX8-NEXT: v_mov_b32_e32 v0, s0 1384; GFX8-NEXT: v_mov_b32_e32 v1, s1 1385; GFX8-NEXT: flat_store_dword v[0:1], v2 1386; GFX8-NEXT: s_endpgm 1387; 1388; GFX9-NODL-LABEL: notudot2_v4i16_Middle: 1389; GFX9-NODL: ; %bb.0: ; %entry 1390; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1391; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1392; GFX9-NODL-NEXT: s_mov_b32 s8, 0xffff 1393; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1394; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1395; GFX9-NODL-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1396; GFX9-NODL-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1397; GFX9-NODL-NEXT: s_load_dword s6, s[0:1], 0x0 1398; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1399; GFX9-NODL-NEXT: s_and_b32 s3, s3, s8 1400; GFX9-NODL-NEXT: s_lshr_b32 s2, s2, 16 1401; GFX9-NODL-NEXT: s_and_b32 s5, s5, s8 1402; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1403; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1404; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s5, v1, v2 1405; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 1406; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 1407; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 1408; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1409; GFX9-NODL-NEXT: s_endpgm 1410; 1411; GFX9-DL-LABEL: notudot2_v4i16_Middle: 1412; GFX9-DL: ; %bb.0: ; %entry 1413; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1414; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1415; GFX9-DL-NEXT: s_mov_b32 s8, 0xffff 1416; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1417; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1418; GFX9-DL-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x0 1419; GFX9-DL-NEXT: s_load_dwordx2 s[4:5], s[6:7], 0x0 1420; GFX9-DL-NEXT: s_load_dword s6, s[0:1], 0x0 1421; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1422; GFX9-DL-NEXT: s_and_b32 s3, s3, s8 1423; GFX9-DL-NEXT: s_lshr_b32 s2, s2, 16 1424; GFX9-DL-NEXT: s_and_b32 s5, s5, s8 1425; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 1426; GFX9-DL-NEXT: v_mov_b32_e32 v2, s6 1427; GFX9-DL-NEXT: v_mad_u32_u24 v1, s5, v1, v2 1428; GFX9-DL-NEXT: s_lshr_b32 s4, s4, 16 1429; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 1430; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, v2, v1 1431; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1432; GFX9-DL-NEXT: s_endpgm 1433; 1434; GFX10-DL-LABEL: notudot2_v4i16_Middle: 1435; GFX10-DL: ; %bb.0: ; %entry 1436; GFX10-DL-NEXT: s_clause 0x1 1437; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1438; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1439; GFX10-DL-NEXT: s_mov_b32 s7, 0xffff 1440; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 1441; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1442; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1443; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1444; GFX10-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1445; GFX10-DL-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x0 1446; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1447; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1448; GFX10-DL-NEXT: s_and_b32 s1, s1, s7 1449; GFX10-DL-NEXT: s_and_b32 s3, s3, s7 1450; GFX10-DL-NEXT: s_lshr_b32 s0, s0, 16 1451; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s1, v0 1452; GFX10-DL-NEXT: s_lshr_b32 s1, s2, 16 1453; GFX10-DL-NEXT: v_mad_u32_u24 v0, s1, s0, v0 1454; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 1455; GFX10-DL-NEXT: s_endpgm 1456 <4 x i16> addrspace(1)* %src2, 1457 i32 addrspace(1)* nocapture %dst) { 1458entry: 1459 %vec1 = load <4 x i16>, <4 x i16> addrspace(1)* %src1 1460 %vec2 = load <4 x i16>, <4 x i16> addrspace(1)* %src2 1461 1462 %s1.elt1 = extractelement <4 x i16> %vec1, i64 1 1463 %conv = zext i16 %s1.elt1 to i32 1464 %s2.elt1 = extractelement <4 x i16> %vec2, i64 1 1465 %conv2 = zext i16 %s2.elt1 to i32 1466 %mul1 = mul i32 %conv2, %conv 1467 1468 %s1.elt2 = extractelement <4 x i16> %vec1, i64 2 1469 %conv3 = zext i16 %s1.elt2 to i32 1470 %s2.elt2 = extractelement <4 x i16> %vec2, i64 2 1471 %conv4 = zext i16 %s2.elt2 to i32 1472 %mul2 = mul i32 %conv4, %conv3 1473 1474 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1475 %add = add i32 %mul2, %s3 1476 %add6 = add i32 %add, %mul1 1477 store i32 %add6, i32 addrspace(1)* %dst, align 4 1478 ret void 1479} 1480 1481define amdgpu_kernel void @notudot2_DiffIndex(<2 x i16> addrspace(1)* %src1, 1482; GFX7-LABEL: notudot2_DiffIndex: 1483; GFX7: ; %bb.0: ; %entry 1484; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1485; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1486; GFX7-NEXT: s_mov_b32 s8, 0xffff 1487; GFX7-NEXT: s_mov_b32 s3, 0xf000 1488; GFX7-NEXT: s_mov_b32 s2, -1 1489; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1490; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 1491; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 1492; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1493; GFX7-NEXT: s_lshr_b32 s6, s4, 16 1494; GFX7-NEXT: s_lshr_b32 s7, s5, 16 1495; GFX7-NEXT: s_and_b32 s4, s4, s8 1496; GFX7-NEXT: s_and_b32 s5, s5, s8 1497; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1498; GFX7-NEXT: v_mov_b32_e32 v0, s6 1499; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1500; GFX7-NEXT: v_mov_b32_e32 v1, s8 1501; GFX7-NEXT: v_mad_u32_u24 v0, s5, v0, v1 1502; GFX7-NEXT: v_mov_b32_e32 v1, s4 1503; GFX7-NEXT: v_mad_u32_u24 v0, s7, v1, v0 1504; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1505; GFX7-NEXT: s_endpgm 1506; 1507; GFX8-LABEL: notudot2_DiffIndex: 1508; GFX8: ; %bb.0: ; %entry 1509; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1510; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1511; GFX8-NEXT: s_mov_b32 s2, 0xffff 1512; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1513; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 1514; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 1515; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 1516; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1517; GFX8-NEXT: s_and_b32 s6, s3, s2 1518; GFX8-NEXT: s_lshr_b32 s3, s3, 16 1519; GFX8-NEXT: s_and_b32 s2, s4, s2 1520; GFX8-NEXT: v_mov_b32_e32 v0, s5 1521; GFX8-NEXT: v_mov_b32_e32 v1, s3 1522; GFX8-NEXT: v_mad_u32_u24 v0, s2, v1, v0 1523; GFX8-NEXT: s_lshr_b32 s7, s4, 16 1524; GFX8-NEXT: v_mov_b32_e32 v1, s6 1525; GFX8-NEXT: v_mad_u32_u24 v2, s7, v1, v0 1526; GFX8-NEXT: v_mov_b32_e32 v0, s0 1527; GFX8-NEXT: v_mov_b32_e32 v1, s1 1528; GFX8-NEXT: flat_store_dword v[0:1], v2 1529; GFX8-NEXT: s_endpgm 1530; 1531; GFX9-NODL-LABEL: notudot2_DiffIndex: 1532; GFX9-NODL: ; %bb.0: ; %entry 1533; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1534; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1535; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 1536; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1537; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1538; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 1539; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 1540; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 1541; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1542; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 1543; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 1544; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 1545; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1546; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1547; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v1, v2 1548; GFX9-NODL-NEXT: s_lshr_b32 s7, s4, 16 1549; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1550; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s7, v2, v1 1551; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1552; GFX9-NODL-NEXT: s_endpgm 1553; 1554; GFX9-DL-LABEL: notudot2_DiffIndex: 1555; GFX9-DL: ; %bb.0: ; %entry 1556; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1557; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1558; GFX9-DL-NEXT: s_mov_b32 s2, 0xffff 1559; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1560; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1561; GFX9-DL-NEXT: s_load_dword s3, s[4:5], 0x0 1562; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 1563; GFX9-DL-NEXT: s_load_dword s5, s[0:1], 0x0 1564; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1565; GFX9-DL-NEXT: s_and_b32 s6, s3, s2 1566; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 1567; GFX9-DL-NEXT: s_and_b32 s2, s4, s2 1568; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 1569; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 1570; GFX9-DL-NEXT: v_mad_u32_u24 v1, s2, v1, v2 1571; GFX9-DL-NEXT: s_lshr_b32 s7, s4, 16 1572; GFX9-DL-NEXT: v_mov_b32_e32 v2, s6 1573; GFX9-DL-NEXT: v_mad_u32_u24 v1, s7, v2, v1 1574; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1575; GFX9-DL-NEXT: s_endpgm 1576; 1577; GFX10-DL-LABEL: notudot2_DiffIndex: 1578; GFX10-DL: ; %bb.0: ; %entry 1579; GFX10-DL-NEXT: s_clause 0x1 1580; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1581; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1582; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 1583; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1584; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1585; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1586; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 1587; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 1588; GFX10-DL-NEXT: s_mov_b32 s2, 0xffff 1589; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1590; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1591; GFX10-DL-NEXT: s_lshr_b32 s3, s0, 16 1592; GFX10-DL-NEXT: s_and_b32 s6, s1, s2 1593; GFX10-DL-NEXT: s_and_b32 s0, s0, s2 1594; GFX10-DL-NEXT: s_lshr_b32 s1, s1, 16 1595; GFX10-DL-NEXT: v_mad_u32_u24 v0, s6, s3, v0 1596; GFX10-DL-NEXT: v_mad_u32_u24 v0, s1, s0, v0 1597; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 1598; GFX10-DL-NEXT: s_endpgm 1599 <2 x i16> addrspace(1)* %src2, 1600 i32 addrspace(1)* nocapture %dst) { 1601entry: 1602 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 1603 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 1604 1605 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 1606 %conv = zext i16 %s1.elt1 to i32 1607 %s2.elt1 = extractelement <2 x i16> %vec2, i64 1 1608 %conv2 = zext i16 %s2.elt1 to i32 1609 %mul1 = mul i32 %conv2, %conv 1610 1611 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 1612 %conv3 = zext i16 %s1.elt2 to i32 1613 %s2.elt2 = extractelement <2 x i16> %vec2, i64 0 1614 %conv4 = zext i16 %s2.elt2 to i32 1615 %mul2 = mul i32 %conv4, %conv3 1616 1617 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1618 %add = add i32 %mul2, %s3 1619 %add6 = add i32 %add, %mul1 1620 store i32 %add6, i32 addrspace(1)* %dst, align 4 1621 ret void 1622} 1623 1624define amdgpu_kernel void @udot2_MultipleUses_add1(<2 x i16> addrspace(1)* %src1, 1625; GFX7-LABEL: udot2_MultipleUses_add1: 1626; GFX7: ; %bb.0: ; %entry 1627; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1628; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1629; GFX7-NEXT: s_mov_b32 s8, 0xffff 1630; GFX7-NEXT: s_mov_b32 s3, 0xf000 1631; GFX7-NEXT: s_mov_b32 s2, -1 1632; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1633; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 1634; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 1635; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1636; GFX7-NEXT: s_lshr_b32 s6, s4, 16 1637; GFX7-NEXT: s_lshr_b32 s7, s5, 16 1638; GFX7-NEXT: s_and_b32 s4, s4, s8 1639; GFX7-NEXT: s_and_b32 s5, s5, s8 1640; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1641; GFX7-NEXT: v_mov_b32_e32 v0, s6 1642; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1643; GFX7-NEXT: v_mov_b32_e32 v1, s8 1644; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 1645; GFX7-NEXT: v_mov_b32_e32 v1, s4 1646; GFX7-NEXT: v_mad_u32_u24 v1, s5, v1, v0 1647; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v1 1648; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1649; GFX7-NEXT: s_endpgm 1650; 1651; GFX8-LABEL: udot2_MultipleUses_add1: 1652; GFX8: ; %bb.0: ; %entry 1653; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1654; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1655; GFX8-NEXT: s_mov_b32 s2, 0xffff 1656; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1657; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 1658; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 1659; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 1660; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1661; GFX8-NEXT: s_and_b32 s6, s3, s2 1662; GFX8-NEXT: s_lshr_b32 s3, s3, 16 1663; GFX8-NEXT: s_and_b32 s2, s4, s2 1664; GFX8-NEXT: s_lshr_b32 s4, s4, 16 1665; GFX8-NEXT: v_mov_b32_e32 v0, s5 1666; GFX8-NEXT: v_mov_b32_e32 v1, s3 1667; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 1668; GFX8-NEXT: v_mov_b32_e32 v1, s6 1669; GFX8-NEXT: v_mad_u32_u24 v1, s2, v1, v0 1670; GFX8-NEXT: v_add_u32_e32 v2, vcc, v0, v1 1671; GFX8-NEXT: v_mov_b32_e32 v0, s0 1672; GFX8-NEXT: v_mov_b32_e32 v1, s1 1673; GFX8-NEXT: flat_store_dword v[0:1], v2 1674; GFX8-NEXT: s_endpgm 1675; 1676; GFX9-NODL-LABEL: udot2_MultipleUses_add1: 1677; GFX9-NODL: ; %bb.0: ; %entry 1678; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1679; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1680; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 1681; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1682; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1683; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 1684; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 1685; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 1686; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1687; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 1688; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 1689; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 1690; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 1691; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 1692; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1693; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 1694; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 1695; GFX9-NODL-NEXT: v_mad_u32_u24 v2, s2, v2, v1 1696; GFX9-NODL-NEXT: v_add_u32_e32 v1, v2, v1 1697; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1698; GFX9-NODL-NEXT: s_endpgm 1699; 1700; GFX9-DL-LABEL: udot2_MultipleUses_add1: 1701; GFX9-DL: ; %bb.0: ; %entry 1702; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1703; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1704; GFX9-DL-NEXT: s_mov_b32 s2, 0xffff 1705; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1706; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1707; GFX9-DL-NEXT: s_load_dword s3, s[4:5], 0x0 1708; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 1709; GFX9-DL-NEXT: s_load_dword s5, s[0:1], 0x0 1710; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1711; GFX9-DL-NEXT: s_and_b32 s6, s3, s2 1712; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 1713; GFX9-DL-NEXT: s_and_b32 s2, s4, s2 1714; GFX9-DL-NEXT: s_lshr_b32 s4, s4, 16 1715; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 1716; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 1717; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 1718; GFX9-DL-NEXT: v_mov_b32_e32 v2, s6 1719; GFX9-DL-NEXT: v_mad_u32_u24 v2, s2, v2, v1 1720; GFX9-DL-NEXT: v_add_u32_e32 v1, v2, v1 1721; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1722; GFX9-DL-NEXT: s_endpgm 1723; 1724; GFX10-DL-LABEL: udot2_MultipleUses_add1: 1725; GFX10-DL: ; %bb.0: ; %entry 1726; GFX10-DL-NEXT: s_clause 0x1 1727; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1728; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1729; GFX10-DL-NEXT: v_mov_b32_e32 v2, 0 1730; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1731; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1732; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1733; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 1734; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 1735; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1736; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1737; GFX10-DL-NEXT: s_lshr_b32 s2, s0, 16 1738; GFX10-DL-NEXT: s_lshr_b32 s3, s1, 16 1739; GFX10-DL-NEXT: s_mov_b32 s6, 0xffff 1740; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s2, v0 1741; GFX10-DL-NEXT: s_and_b32 s0, s0, s6 1742; GFX10-DL-NEXT: s_and_b32 s1, s1, s6 1743; GFX10-DL-NEXT: v_mad_u32_u24 v1, s1, s0, v0 1744; GFX10-DL-NEXT: v_add_nc_u32_e32 v0, v1, v0 1745; GFX10-DL-NEXT: global_store_dword v2, v0, s[4:5] 1746; GFX10-DL-NEXT: s_endpgm 1747 <2 x i16> addrspace(1)* %src2, 1748 i32 addrspace(1)* nocapture %dst) { 1749entry: 1750 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 1751 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 1752 1753 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 1754 %conv = zext i16 %s1.elt1 to i32 1755 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 1756 %conv2 = zext i16 %s2.elt1 to i32 1757 %mul1 = mul i32 %conv2, %conv 1758 1759 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 1760 %conv3 = zext i16 %s1.elt2 to i32 1761 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 1762 %conv4 = zext i16 %s2.elt2 to i32 1763 %mul2 = mul i32 %conv4, %conv3 1764 1765 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1766 %add1 = add i32 %mul2, %s3 1767 %add2 = add i32 %add1, %mul1 1768 1769 %res = add i32 %add2, %add1 1770 store i32 %res, i32 addrspace(1)* %dst, align 4 1771 ret void 1772} 1773 1774define amdgpu_kernel void @idot2_MultipleUses_add1(<2 x i16> addrspace(1)* %src1, 1775; GFX7-LABEL: idot2_MultipleUses_add1: 1776; GFX7: ; %bb.0: ; %entry 1777; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1778; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1779; GFX7-NEXT: s_mov_b32 s3, 0xf000 1780; GFX7-NEXT: s_mov_b32 s2, -1 1781; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1782; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 1783; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 1784; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 1785; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1786; GFX7-NEXT: s_sext_i32_i16 s7, s4 1787; GFX7-NEXT: s_ashr_i32 s4, s4, 16 1788; GFX7-NEXT: s_sext_i32_i16 s8, s5 1789; GFX7-NEXT: s_ashr_i32 s5, s5, 16 1790; GFX7-NEXT: v_mov_b32_e32 v0, s4 1791; GFX7-NEXT: v_mov_b32_e32 v1, s6 1792; GFX7-NEXT: v_mad_i32_i24 v0, s5, v0, v1 1793; GFX7-NEXT: v_mov_b32_e32 v1, s7 1794; GFX7-NEXT: v_mad_i32_i24 v1, s8, v1, v0 1795; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v1 1796; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1797; GFX7-NEXT: s_endpgm 1798; 1799; GFX8-LABEL: idot2_MultipleUses_add1: 1800; GFX8: ; %bb.0: ; %entry 1801; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1802; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1803; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1804; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 1805; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 1806; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 1807; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1808; GFX8-NEXT: s_sext_i32_i16 s5, s2 1809; GFX8-NEXT: s_ashr_i32 s2, s2, 16 1810; GFX8-NEXT: s_sext_i32_i16 s6, s3 1811; GFX8-NEXT: s_ashr_i32 s3, s3, 16 1812; GFX8-NEXT: v_mov_b32_e32 v0, s4 1813; GFX8-NEXT: v_mov_b32_e32 v1, s2 1814; GFX8-NEXT: v_mov_b32_e32 v2, s5 1815; GFX8-NEXT: v_mad_i32_i24 v0, s3, v1, v0 1816; GFX8-NEXT: v_mad_i32_i24 v1, s6, v2, v0 1817; GFX8-NEXT: v_add_u32_e32 v2, vcc, v0, v1 1818; GFX8-NEXT: v_mov_b32_e32 v0, s0 1819; GFX8-NEXT: v_mov_b32_e32 v1, s1 1820; GFX8-NEXT: flat_store_dword v[0:1], v2 1821; GFX8-NEXT: s_endpgm 1822; 1823; GFX9-NODL-LABEL: idot2_MultipleUses_add1: 1824; GFX9-NODL: ; %bb.0: ; %entry 1825; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1826; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1827; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1828; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1829; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 1830; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 1831; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 1832; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1833; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 1834; GFX9-NODL-NEXT: s_ashr_i32 s2, s2, 16 1835; GFX9-NODL-NEXT: s_sext_i32_i16 s6, s3 1836; GFX9-NODL-NEXT: s_ashr_i32 s3, s3, 16 1837; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 1838; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 1839; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 1840; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1841; GFX9-NODL-NEXT: v_mad_i32_i24 v2, s6, v2, v1 1842; GFX9-NODL-NEXT: v_add_u32_e32 v1, v2, v1 1843; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1844; GFX9-NODL-NEXT: s_endpgm 1845; 1846; GFX9-DL-LABEL: idot2_MultipleUses_add1: 1847; GFX9-DL: ; %bb.0: ; %entry 1848; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1849; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1850; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 1851; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1852; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 1853; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 1854; GFX9-DL-NEXT: s_load_dword s4, s[0:1], 0x0 1855; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 1856; GFX9-DL-NEXT: s_sext_i32_i16 s5, s2 1857; GFX9-DL-NEXT: s_ashr_i32 s2, s2, 16 1858; GFX9-DL-NEXT: s_sext_i32_i16 s6, s3 1859; GFX9-DL-NEXT: s_ashr_i32 s3, s3, 16 1860; GFX9-DL-NEXT: v_mov_b32_e32 v1, s4 1861; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 1862; GFX9-DL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 1863; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 1864; GFX9-DL-NEXT: v_mad_i32_i24 v2, s6, v2, v1 1865; GFX9-DL-NEXT: v_add_u32_e32 v1, v2, v1 1866; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 1867; GFX9-DL-NEXT: s_endpgm 1868; 1869; GFX10-DL-LABEL: idot2_MultipleUses_add1: 1870; GFX10-DL: ; %bb.0: ; %entry 1871; GFX10-DL-NEXT: s_clause 0x1 1872; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 1873; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1874; GFX10-DL-NEXT: v_mov_b32_e32 v2, 0 1875; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 1876; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1877; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 1878; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 1879; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 1880; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 1881; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 1882; GFX10-DL-NEXT: s_ashr_i32 s2, s0, 16 1883; GFX10-DL-NEXT: s_ashr_i32 s3, s1, 16 1884; GFX10-DL-NEXT: s_sext_i32_i16 s0, s0 1885; GFX10-DL-NEXT: s_sext_i32_i16 s1, s1 1886; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 1887; GFX10-DL-NEXT: v_mad_i32_i24 v1, s1, s0, v0 1888; GFX10-DL-NEXT: v_add_nc_u32_e32 v0, v1, v0 1889; GFX10-DL-NEXT: global_store_dword v2, v0, s[4:5] 1890; GFX10-DL-NEXT: s_endpgm 1891 <2 x i16> addrspace(1)* %src2, 1892 i32 addrspace(1)* nocapture %dst) { 1893entry: 1894 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 1895 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 1896 1897 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 1898 %conv = sext i16 %s1.elt1 to i32 1899 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 1900 %conv2 = sext i16 %s2.elt1 to i32 1901 %mul1 = mul i32 %conv2, %conv 1902 1903 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 1904 %conv3 = sext i16 %s1.elt2 to i32 1905 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 1906 %conv4 = sext i16 %s2.elt2 to i32 1907 %mul2 = mul i32 %conv4, %conv3 1908 1909 %s3 = load i32, i32 addrspace(1)* %dst, align 4 1910 %add1 = add i32 %mul2, %s3 1911 %add2 = add i32 %add1, %mul1 1912 1913 %res = add i32 %add2, %add1 1914 store i32 %res, i32 addrspace(1)* %dst, align 4 1915 ret void 1916} 1917 1918define amdgpu_kernel void @udot2_MultipleUses_mul1(<2 x i16> addrspace(1)* %src1, 1919; GFX7-LABEL: udot2_MultipleUses_mul1: 1920; GFX7: ; %bb.0: ; %entry 1921; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1922; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 1923; GFX7-NEXT: s_mov_b32 s8, 0xffff 1924; GFX7-NEXT: s_mov_b32 s3, 0xf000 1925; GFX7-NEXT: s_mov_b32 s2, -1 1926; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1927; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 1928; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 1929; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1930; GFX7-NEXT: s_lshr_b32 s6, s4, 16 1931; GFX7-NEXT: s_lshr_b32 s7, s5, 16 1932; GFX7-NEXT: s_and_b32 s4, s4, s8 1933; GFX7-NEXT: s_and_b32 s5, s5, s8 1934; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 1935; GFX7-NEXT: v_mov_b32_e32 v0, s4 1936; GFX7-NEXT: v_mov_b32_e32 v2, s6 1937; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1938; GFX7-NEXT: v_mov_b32_e32 v1, s8 1939; GFX7-NEXT: v_mad_u32_u24 v1, s5, v0, v1 1940; GFX7-NEXT: v_mad_u32_u24 v1, s7, v2, v1 1941; GFX7-NEXT: v_mad_u32_u24 v0, s5, v0, v1 1942; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 1943; GFX7-NEXT: s_endpgm 1944; 1945; GFX8-LABEL: udot2_MultipleUses_mul1: 1946; GFX8: ; %bb.0: ; %entry 1947; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1948; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1949; GFX8-NEXT: s_mov_b32 s2, 0xffff 1950; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1951; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 1952; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 1953; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 1954; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1955; GFX8-NEXT: s_and_b32 s6, s3, s2 1956; GFX8-NEXT: s_and_b32 s2, s4, s2 1957; GFX8-NEXT: s_lshr_b32 s3, s3, 16 1958; GFX8-NEXT: v_mov_b32_e32 v0, s5 1959; GFX8-NEXT: v_mov_b32_e32 v1, s6 1960; GFX8-NEXT: s_lshr_b32 s4, s4, 16 1961; GFX8-NEXT: v_mad_u32_u24 v0, s2, v1, v0 1962; GFX8-NEXT: v_mov_b32_e32 v2, s3 1963; GFX8-NEXT: v_mad_u32_u24 v0, s4, v2, v0 1964; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 1965; GFX8-NEXT: v_mov_b32_e32 v0, s0 1966; GFX8-NEXT: v_mov_b32_e32 v1, s1 1967; GFX8-NEXT: flat_store_dword v[0:1], v2 1968; GFX8-NEXT: s_endpgm 1969; 1970; GFX9-NODL-LABEL: udot2_MultipleUses_mul1: 1971; GFX9-NODL: ; %bb.0: ; %entry 1972; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1973; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1974; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 1975; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 1976; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1977; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 1978; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 1979; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 1980; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 1981; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 1982; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 1983; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 1984; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s6 1985; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 1986; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 1987; GFX9-NODL-NEXT: v_mad_u32_u24 v2, s2, v1, v2 1988; GFX9-NODL-NEXT: v_mov_b32_e32 v3, s3 1989; GFX9-NODL-NEXT: v_mad_u32_u24 v2, s4, v3, v2 1990; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v1, v2 1991; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 1992; GFX9-NODL-NEXT: s_endpgm 1993; 1994; GFX9-DL-LABEL: udot2_MultipleUses_mul1: 1995; GFX9-DL: ; %bb.0: ; %entry 1996; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1997; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 1998; GFX9-DL-NEXT: s_mov_b32 s2, 0xffff 1999; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2000; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2001; GFX9-DL-NEXT: s_load_dword s3, s[4:5], 0x0 2002; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 2003; GFX9-DL-NEXT: s_load_dword s5, s[0:1], 0x0 2004; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2005; GFX9-DL-NEXT: s_and_b32 s6, s3, s2 2006; GFX9-DL-NEXT: s_and_b32 s2, s4, s2 2007; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 2008; GFX9-DL-NEXT: v_mov_b32_e32 v1, s6 2009; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 2010; GFX9-DL-NEXT: s_lshr_b32 s4, s4, 16 2011; GFX9-DL-NEXT: v_mad_u32_u24 v2, s2, v1, v2 2012; GFX9-DL-NEXT: v_mov_b32_e32 v3, s3 2013; GFX9-DL-NEXT: v_mad_u32_u24 v2, s4, v3, v2 2014; GFX9-DL-NEXT: v_mad_u32_u24 v1, s2, v1, v2 2015; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 2016; GFX9-DL-NEXT: s_endpgm 2017; 2018; GFX10-DL-LABEL: udot2_MultipleUses_mul1: 2019; GFX10-DL: ; %bb.0: ; %entry 2020; GFX10-DL-NEXT: s_clause 0x1 2021; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 2022; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2023; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 2024; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2025; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2026; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 2027; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 2028; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 2029; GFX10-DL-NEXT: s_mov_b32 s2, 0xffff 2030; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2031; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 2032; GFX10-DL-NEXT: s_and_b32 s3, s0, s2 2033; GFX10-DL-NEXT: s_and_b32 s2, s1, s2 2034; GFX10-DL-NEXT: s_lshr_b32 s0, s0, 16 2035; GFX10-DL-NEXT: s_lshr_b32 s1, s1, 16 2036; GFX10-DL-NEXT: v_mad_u32_u24 v0, s2, s3, v0 2037; GFX10-DL-NEXT: v_mad_u32_u24 v0, s1, s0, v0 2038; GFX10-DL-NEXT: v_mad_u32_u24 v0, s2, s3, v0 2039; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 2040; GFX10-DL-NEXT: s_endpgm 2041 <2 x i16> addrspace(1)* %src2, 2042 i32 addrspace(1)* nocapture %dst) { 2043entry: 2044 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 2045 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 2046 2047 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 2048 %conv = zext i16 %s1.elt1 to i32 2049 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 2050 %conv2 = zext i16 %s2.elt1 to i32 2051 %mul1 = mul i32 %conv2, %conv 2052 2053 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 2054 %conv3 = zext i16 %s1.elt2 to i32 2055 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 2056 %conv4 = zext i16 %s2.elt2 to i32 2057 %mul2 = mul i32 %conv4, %conv3 2058 2059 %s3 = load i32, i32 addrspace(1)* %dst, align 4 2060 %add0 = add i32 %mul1, %s3 2061 2062 %add1 = add i32 %mul2, %add0 2063 %add2 = add i32 %add1, %mul1 2064 2065 store i32 %add2, i32 addrspace(1)* %dst, align 4 2066 ret void 2067} 2068 2069define amdgpu_kernel void @idot2_MultipleUses_mul1(<2 x i16> addrspace(1)* %src1, 2070; GFX7-LABEL: idot2_MultipleUses_mul1: 2071; GFX7: ; %bb.0: ; %entry 2072; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 2073; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 2074; GFX7-NEXT: s_mov_b32 s3, 0xf000 2075; GFX7-NEXT: s_mov_b32 s2, -1 2076; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2077; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 2078; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 2079; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 2080; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2081; GFX7-NEXT: s_sext_i32_i16 s7, s4 2082; GFX7-NEXT: s_sext_i32_i16 s8, s5 2083; GFX7-NEXT: s_ashr_i32 s4, s4, 16 2084; GFX7-NEXT: v_mov_b32_e32 v0, s7 2085; GFX7-NEXT: v_mov_b32_e32 v1, s6 2086; GFX7-NEXT: s_ashr_i32 s5, s5, 16 2087; GFX7-NEXT: v_mad_i32_i24 v1, s8, v0, v1 2088; GFX7-NEXT: v_mov_b32_e32 v2, s4 2089; GFX7-NEXT: v_mad_i32_i24 v1, s5, v2, v1 2090; GFX7-NEXT: v_mad_i32_i24 v0, s8, v0, v1 2091; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 2092; GFX7-NEXT: s_endpgm 2093; 2094; GFX8-LABEL: idot2_MultipleUses_mul1: 2095; GFX8: ; %bb.0: ; %entry 2096; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2097; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2098; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2099; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 2100; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 2101; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 2102; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2103; GFX8-NEXT: s_sext_i32_i16 s5, s2 2104; GFX8-NEXT: s_sext_i32_i16 s6, s3 2105; GFX8-NEXT: s_ashr_i32 s2, s2, 16 2106; GFX8-NEXT: v_mov_b32_e32 v0, s4 2107; GFX8-NEXT: v_mov_b32_e32 v1, s5 2108; GFX8-NEXT: s_ashr_i32 s3, s3, 16 2109; GFX8-NEXT: v_mov_b32_e32 v2, s2 2110; GFX8-NEXT: v_mad_i32_i24 v0, s6, v1, v0 2111; GFX8-NEXT: v_mad_i32_i24 v0, s3, v2, v0 2112; GFX8-NEXT: v_mad_i32_i24 v2, s6, v1, v0 2113; GFX8-NEXT: v_mov_b32_e32 v0, s0 2114; GFX8-NEXT: v_mov_b32_e32 v1, s1 2115; GFX8-NEXT: flat_store_dword v[0:1], v2 2116; GFX8-NEXT: s_endpgm 2117; 2118; GFX9-NODL-LABEL: idot2_MultipleUses_mul1: 2119; GFX9-NODL: ; %bb.0: ; %entry 2120; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2121; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2122; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 2123; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2124; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 2125; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 2126; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 2127; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2128; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 2129; GFX9-NODL-NEXT: s_sext_i32_i16 s6, s3 2130; GFX9-NODL-NEXT: s_ashr_i32 s2, s2, 16 2131; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 2132; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 2133; GFX9-NODL-NEXT: s_ashr_i32 s3, s3, 16 2134; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2135; GFX9-NODL-NEXT: v_mov_b32_e32 v3, s2 2136; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v3, v1 2137; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2138; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 2139; GFX9-NODL-NEXT: s_endpgm 2140; 2141; GFX9-DL-LABEL: idot2_MultipleUses_mul1: 2142; GFX9-DL: ; %bb.0: ; %entry 2143; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2144; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2145; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2146; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2147; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 2148; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 2149; GFX9-DL-NEXT: s_load_dword s4, s[0:1], 0x0 2150; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2151; GFX9-DL-NEXT: s_sext_i32_i16 s5, s2 2152; GFX9-DL-NEXT: s_sext_i32_i16 s6, s3 2153; GFX9-DL-NEXT: s_ashr_i32 s2, s2, 16 2154; GFX9-DL-NEXT: v_mov_b32_e32 v1, s4 2155; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 2156; GFX9-DL-NEXT: s_ashr_i32 s3, s3, 16 2157; GFX9-DL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2158; GFX9-DL-NEXT: v_mov_b32_e32 v3, s2 2159; GFX9-DL-NEXT: v_mad_i32_i24 v1, s3, v3, v1 2160; GFX9-DL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2161; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 2162; GFX9-DL-NEXT: s_endpgm 2163; 2164; GFX10-DL-LABEL: idot2_MultipleUses_mul1: 2165; GFX10-DL: ; %bb.0: ; %entry 2166; GFX10-DL-NEXT: s_clause 0x1 2167; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 2168; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2169; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 2170; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2171; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2172; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 2173; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 2174; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 2175; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2176; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 2177; GFX10-DL-NEXT: s_sext_i32_i16 s2, s0 2178; GFX10-DL-NEXT: s_sext_i32_i16 s3, s1 2179; GFX10-DL-NEXT: s_ashr_i32 s0, s0, 16 2180; GFX10-DL-NEXT: s_ashr_i32 s1, s1, 16 2181; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 2182; GFX10-DL-NEXT: v_mad_i32_i24 v0, s1, s0, v0 2183; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 2184; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 2185; GFX10-DL-NEXT: s_endpgm 2186 <2 x i16> addrspace(1)* %src2, 2187 i32 addrspace(1)* nocapture %dst) { 2188entry: 2189 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 2190 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 2191 2192 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 2193 %conv = sext i16 %s1.elt1 to i32 2194 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 2195 %conv2 = sext i16 %s2.elt1 to i32 2196 %mul1 = mul i32 %conv2, %conv 2197 2198 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 2199 %conv3 = sext i16 %s1.elt2 to i32 2200 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 2201 %conv4 = sext i16 %s2.elt2 to i32 2202 %mul2 = mul i32 %conv4, %conv3 2203 2204 %s3 = load i32, i32 addrspace(1)* %dst, align 4 2205 %add0 = add i32 %mul1, %s3 2206 2207 %add1 = add i32 %mul2, %add0 2208 %add2 = add i32 %add1, %mul1 2209 2210 store i32 %add2, i32 addrspace(1)* %dst, align 4 2211 ret void 2212} 2213 2214define amdgpu_kernel void @udot2_MultipleUses_mul2(<2 x i16> addrspace(1)* %src1, 2215; GFX7-LABEL: udot2_MultipleUses_mul2: 2216; GFX7: ; %bb.0: ; %entry 2217; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 2218; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 2219; GFX7-NEXT: s_mov_b32 s8, 0xffff 2220; GFX7-NEXT: s_mov_b32 s3, 0xf000 2221; GFX7-NEXT: s_mov_b32 s2, -1 2222; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2223; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 2224; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 2225; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2226; GFX7-NEXT: s_lshr_b32 s6, s4, 16 2227; GFX7-NEXT: s_lshr_b32 s7, s5, 16 2228; GFX7-NEXT: s_and_b32 s4, s4, s8 2229; GFX7-NEXT: s_and_b32 s5, s5, s8 2230; GFX7-NEXT: s_load_dword s8, s[0:1], 0x0 2231; GFX7-NEXT: v_mov_b32_e32 v0, s6 2232; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2233; GFX7-NEXT: v_mov_b32_e32 v1, s8 2234; GFX7-NEXT: v_mad_u32_u24 v1, s7, v0, v1 2235; GFX7-NEXT: v_mad_u32_u24 v0, s7, v0, v1 2236; GFX7-NEXT: v_mov_b32_e32 v1, s4 2237; GFX7-NEXT: v_mad_u32_u24 v0, s5, v1, v0 2238; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 2239; GFX7-NEXT: s_endpgm 2240; 2241; GFX8-LABEL: udot2_MultipleUses_mul2: 2242; GFX8: ; %bb.0: ; %entry 2243; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2244; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2245; GFX8-NEXT: s_mov_b32 s2, 0xffff 2246; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2247; GFX8-NEXT: s_load_dword s3, s[4:5], 0x0 2248; GFX8-NEXT: s_load_dword s4, s[6:7], 0x0 2249; GFX8-NEXT: s_load_dword s5, s[0:1], 0x0 2250; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2251; GFX8-NEXT: s_and_b32 s6, s3, s2 2252; GFX8-NEXT: s_lshr_b32 s3, s3, 16 2253; GFX8-NEXT: s_and_b32 s2, s4, s2 2254; GFX8-NEXT: s_lshr_b32 s4, s4, 16 2255; GFX8-NEXT: v_mov_b32_e32 v0, s5 2256; GFX8-NEXT: v_mov_b32_e32 v1, s3 2257; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 2258; GFX8-NEXT: v_mad_u32_u24 v0, s4, v1, v0 2259; GFX8-NEXT: v_mov_b32_e32 v1, s6 2260; GFX8-NEXT: v_mad_u32_u24 v2, s2, v1, v0 2261; GFX8-NEXT: v_mov_b32_e32 v0, s0 2262; GFX8-NEXT: v_mov_b32_e32 v1, s1 2263; GFX8-NEXT: flat_store_dword v[0:1], v2 2264; GFX8-NEXT: s_endpgm 2265; 2266; GFX9-NODL-LABEL: udot2_MultipleUses_mul2: 2267; GFX9-NODL: ; %bb.0: ; %entry 2268; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2269; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2270; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 2271; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 2272; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2273; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 2274; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 2275; GFX9-NODL-NEXT: s_load_dword s5, s[0:1], 0x0 2276; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2277; GFX9-NODL-NEXT: s_and_b32 s6, s3, s2 2278; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 2279; GFX9-NODL-NEXT: s_and_b32 s2, s4, s2 2280; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 2281; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s3 2282; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 2283; GFX9-NODL-NEXT: v_mad_u32_u24 v2, s4, v1, v2 2284; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 2285; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s6 2286; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 2287; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 2288; GFX9-NODL-NEXT: s_endpgm 2289; 2290; GFX9-DL-LABEL: udot2_MultipleUses_mul2: 2291; GFX9-DL: ; %bb.0: ; %entry 2292; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2293; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2294; GFX9-DL-NEXT: s_mov_b32 s2, 0xffff 2295; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2296; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2297; GFX9-DL-NEXT: s_load_dword s3, s[4:5], 0x0 2298; GFX9-DL-NEXT: s_load_dword s4, s[6:7], 0x0 2299; GFX9-DL-NEXT: s_load_dword s5, s[0:1], 0x0 2300; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2301; GFX9-DL-NEXT: s_and_b32 s6, s3, s2 2302; GFX9-DL-NEXT: s_lshr_b32 s3, s3, 16 2303; GFX9-DL-NEXT: s_and_b32 s2, s4, s2 2304; GFX9-DL-NEXT: s_lshr_b32 s4, s4, 16 2305; GFX9-DL-NEXT: v_mov_b32_e32 v1, s3 2306; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 2307; GFX9-DL-NEXT: v_mad_u32_u24 v2, s4, v1, v2 2308; GFX9-DL-NEXT: v_mad_u32_u24 v1, s4, v1, v2 2309; GFX9-DL-NEXT: v_mov_b32_e32 v2, s6 2310; GFX9-DL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 2311; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 2312; GFX9-DL-NEXT: s_endpgm 2313; 2314; GFX10-DL-LABEL: udot2_MultipleUses_mul2: 2315; GFX10-DL: ; %bb.0: ; %entry 2316; GFX10-DL-NEXT: s_clause 0x1 2317; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 2318; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2319; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 2320; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2321; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2322; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 2323; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 2324; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 2325; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2326; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 2327; GFX10-DL-NEXT: s_lshr_b32 s2, s0, 16 2328; GFX10-DL-NEXT: s_lshr_b32 s3, s1, 16 2329; GFX10-DL-NEXT: s_mov_b32 s6, 0xffff 2330; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s2, v0 2331; GFX10-DL-NEXT: s_and_b32 s0, s0, s6 2332; GFX10-DL-NEXT: s_and_b32 s1, s1, s6 2333; GFX10-DL-NEXT: v_mad_u32_u24 v0, s3, s2, v0 2334; GFX10-DL-NEXT: v_mad_u32_u24 v0, s1, s0, v0 2335; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 2336; GFX10-DL-NEXT: s_endpgm 2337 <2 x i16> addrspace(1)* %src2, 2338 i32 addrspace(1)* nocapture %dst) { 2339entry: 2340 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 2341 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 2342 2343 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 2344 %conv = zext i16 %s1.elt1 to i32 2345 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 2346 %conv2 = zext i16 %s2.elt1 to i32 2347 %mul1 = mul i32 %conv2, %conv 2348 2349 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 2350 %conv3 = zext i16 %s1.elt2 to i32 2351 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 2352 %conv4 = zext i16 %s2.elt2 to i32 2353 %mul2 = mul i32 %conv4, %conv3 2354 2355 %s3 = load i32, i32 addrspace(1)* %dst, align 4 2356 %add0 = add i32 %mul2, %s3 2357 2358 %add1 = add i32 %mul2, %add0 2359 %add2 = add i32 %add1, %mul1 2360 2361 store i32 %add2, i32 addrspace(1)* %dst, align 4 2362 ret void 2363} 2364 2365define amdgpu_kernel void @idot2_MultipleUses_mul2(<2 x i16> addrspace(1)* %src1, 2366; GFX7-LABEL: idot2_MultipleUses_mul2: 2367; GFX7: ; %bb.0: ; %entry 2368; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 2369; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 2370; GFX7-NEXT: s_mov_b32 s3, 0xf000 2371; GFX7-NEXT: s_mov_b32 s2, -1 2372; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2373; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 2374; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 2375; GFX7-NEXT: s_load_dword s6, s[0:1], 0x0 2376; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2377; GFX7-NEXT: s_sext_i32_i16 s7, s4 2378; GFX7-NEXT: s_ashr_i32 s4, s4, 16 2379; GFX7-NEXT: s_sext_i32_i16 s8, s5 2380; GFX7-NEXT: s_ashr_i32 s5, s5, 16 2381; GFX7-NEXT: v_mov_b32_e32 v0, s4 2382; GFX7-NEXT: v_mov_b32_e32 v1, s6 2383; GFX7-NEXT: v_mad_i32_i24 v1, s5, v0, v1 2384; GFX7-NEXT: v_mad_i32_i24 v0, s5, v0, v1 2385; GFX7-NEXT: v_mov_b32_e32 v1, s7 2386; GFX7-NEXT: v_mad_i32_i24 v0, s8, v1, v0 2387; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 2388; GFX7-NEXT: s_endpgm 2389; 2390; GFX8-LABEL: idot2_MultipleUses_mul2: 2391; GFX8: ; %bb.0: ; %entry 2392; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2393; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2394; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2395; GFX8-NEXT: s_load_dword s2, s[4:5], 0x0 2396; GFX8-NEXT: s_load_dword s3, s[6:7], 0x0 2397; GFX8-NEXT: s_load_dword s4, s[0:1], 0x0 2398; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2399; GFX8-NEXT: s_sext_i32_i16 s5, s2 2400; GFX8-NEXT: s_ashr_i32 s2, s2, 16 2401; GFX8-NEXT: s_sext_i32_i16 s6, s3 2402; GFX8-NEXT: s_ashr_i32 s3, s3, 16 2403; GFX8-NEXT: v_mov_b32_e32 v0, s4 2404; GFX8-NEXT: v_mov_b32_e32 v1, s2 2405; GFX8-NEXT: v_mad_i32_i24 v0, s3, v1, v0 2406; GFX8-NEXT: v_mov_b32_e32 v2, s5 2407; GFX8-NEXT: v_mad_i32_i24 v0, s3, v1, v0 2408; GFX8-NEXT: v_mad_i32_i24 v2, s6, v2, v0 2409; GFX8-NEXT: v_mov_b32_e32 v0, s0 2410; GFX8-NEXT: v_mov_b32_e32 v1, s1 2411; GFX8-NEXT: flat_store_dword v[0:1], v2 2412; GFX8-NEXT: s_endpgm 2413; 2414; GFX9-NODL-LABEL: idot2_MultipleUses_mul2: 2415; GFX9-NODL: ; %bb.0: ; %entry 2416; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2417; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2418; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 2419; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2420; GFX9-NODL-NEXT: s_load_dword s2, s[4:5], 0x0 2421; GFX9-NODL-NEXT: s_load_dword s3, s[6:7], 0x0 2422; GFX9-NODL-NEXT: s_load_dword s4, s[0:1], 0x0 2423; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2424; GFX9-NODL-NEXT: s_sext_i32_i16 s5, s2 2425; GFX9-NODL-NEXT: s_ashr_i32 s2, s2, 16 2426; GFX9-NODL-NEXT: s_sext_i32_i16 s6, s3 2427; GFX9-NODL-NEXT: s_ashr_i32 s3, s3, 16 2428; GFX9-NODL-NEXT: v_mov_b32_e32 v1, s4 2429; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s2 2430; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 2431; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 2432; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 2433; GFX9-NODL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2434; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 2435; GFX9-NODL-NEXT: s_endpgm 2436; 2437; GFX9-DL-LABEL: idot2_MultipleUses_mul2: 2438; GFX9-DL: ; %bb.0: ; %entry 2439; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2440; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2441; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2442; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2443; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 2444; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 2445; GFX9-DL-NEXT: s_load_dword s4, s[0:1], 0x0 2446; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2447; GFX9-DL-NEXT: s_sext_i32_i16 s5, s2 2448; GFX9-DL-NEXT: s_ashr_i32 s2, s2, 16 2449; GFX9-DL-NEXT: s_sext_i32_i16 s6, s3 2450; GFX9-DL-NEXT: s_ashr_i32 s3, s3, 16 2451; GFX9-DL-NEXT: v_mov_b32_e32 v1, s4 2452; GFX9-DL-NEXT: v_mov_b32_e32 v2, s2 2453; GFX9-DL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 2454; GFX9-DL-NEXT: v_mad_i32_i24 v1, s3, v2, v1 2455; GFX9-DL-NEXT: v_mov_b32_e32 v2, s5 2456; GFX9-DL-NEXT: v_mad_i32_i24 v1, s6, v2, v1 2457; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 2458; GFX9-DL-NEXT: s_endpgm 2459; 2460; GFX10-DL-LABEL: idot2_MultipleUses_mul2: 2461; GFX10-DL: ; %bb.0: ; %entry 2462; GFX10-DL-NEXT: s_clause 0x1 2463; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 2464; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2465; GFX10-DL-NEXT: v_mov_b32_e32 v1, 0 2466; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2467; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2468; GFX10-DL-NEXT: s_load_dword s6, s[4:5], 0x0 2469; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 2470; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 2471; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2472; GFX10-DL-NEXT: v_mov_b32_e32 v0, s6 2473; GFX10-DL-NEXT: s_ashr_i32 s2, s0, 16 2474; GFX10-DL-NEXT: s_ashr_i32 s3, s1, 16 2475; GFX10-DL-NEXT: s_sext_i32_i16 s0, s0 2476; GFX10-DL-NEXT: s_sext_i32_i16 s1, s1 2477; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 2478; GFX10-DL-NEXT: v_mad_i32_i24 v0, s3, s2, v0 2479; GFX10-DL-NEXT: v_mad_i32_i24 v0, s1, s0, v0 2480; GFX10-DL-NEXT: global_store_dword v1, v0, s[4:5] 2481; GFX10-DL-NEXT: s_endpgm 2482 <2 x i16> addrspace(1)* %src2, 2483 i32 addrspace(1)* nocapture %dst) { 2484entry: 2485 %vec1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 2486 %vec2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 2487 2488 %s1.elt1 = extractelement <2 x i16> %vec1, i64 0 2489 %conv = sext i16 %s1.elt1 to i32 2490 %s2.elt1 = extractelement <2 x i16> %vec2, i64 0 2491 %conv2 = sext i16 %s2.elt1 to i32 2492 %mul1 = mul i32 %conv2, %conv 2493 2494 %s1.elt2 = extractelement <2 x i16> %vec1, i64 1 2495 %conv3 = sext i16 %s1.elt2 to i32 2496 %s2.elt2 = extractelement <2 x i16> %vec2, i64 1 2497 %conv4 = sext i16 %s2.elt2 to i32 2498 %mul2 = mul i32 %conv4, %conv3 2499 2500 %s3 = load i32, i32 addrspace(1)* %dst, align 4 2501 %add0 = add i32 %mul2, %s3 2502 2503 %add1 = add i32 %mul2, %add0 2504 %add2 = add i32 %add1, %mul1 2505 2506 store i32 %add2, i32 addrspace(1)* %dst, align 4 2507 ret void 2508} 2509 2510define amdgpu_kernel void @udot2_acc16(<2 x i16> addrspace(1)* %src1, 2511; GFX7-LABEL: udot2_acc16: 2512; GFX7: ; %bb.0: ; %entry 2513; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 2514; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xd 2515; GFX7-NEXT: s_mov_b32 s3, 0xf000 2516; GFX7-NEXT: s_mov_b32 s2, -1 2517; GFX7-NEXT: s_mov_b32 s8, 0xffff 2518; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2519; GFX7-NEXT: buffer_load_ushort v0, off, s[0:3], 0 2520; GFX7-NEXT: s_load_dword s4, s[4:5], 0x0 2521; GFX7-NEXT: s_load_dword s5, s[6:7], 0x0 2522; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2523; GFX7-NEXT: s_lshr_b32 s6, s4, 16 2524; GFX7-NEXT: s_lshr_b32 s7, s5, 16 2525; GFX7-NEXT: v_mov_b32_e32 v1, s7 2526; GFX7-NEXT: s_and_b32 s5, s5, s8 2527; GFX7-NEXT: s_and_b32 s4, s4, s8 2528; GFX7-NEXT: s_waitcnt vmcnt(0) 2529; GFX7-NEXT: v_mad_u32_u24 v0, s6, v1, v0 2530; GFX7-NEXT: v_mov_b32_e32 v1, s5 2531; GFX7-NEXT: v_mad_u32_u24 v0, s4, v1, v0 2532; GFX7-NEXT: buffer_store_short v0, off, s[0:3], 0 2533; GFX7-NEXT: s_endpgm 2534; 2535; GFX8-LABEL: udot2_acc16: 2536; GFX8: ; %bb.0: ; %entry 2537; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2538; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2539; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2540; GFX8-NEXT: v_mov_b32_e32 v0, s0 2541; GFX8-NEXT: v_mov_b32_e32 v1, s1 2542; GFX8-NEXT: flat_load_ushort v2, v[0:1] 2543; GFX8-NEXT: s_load_dword s1, s[4:5], 0x0 2544; GFX8-NEXT: s_load_dword s2, s[6:7], 0x0 2545; GFX8-NEXT: s_mov_b32 s0, 0xffff 2546; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2547; GFX8-NEXT: s_and_b32 s3, s2, s0 2548; GFX8-NEXT: s_lshr_b32 s2, s2, 16 2549; GFX8-NEXT: s_and_b32 s0, s1, s0 2550; GFX8-NEXT: s_lshr_b32 s1, s1, 16 2551; GFX8-NEXT: v_mov_b32_e32 v3, s2 2552; GFX8-NEXT: s_waitcnt vmcnt(0) 2553; GFX8-NEXT: v_mad_u32_u24 v2, s1, v3, v2 2554; GFX8-NEXT: v_mov_b32_e32 v3, s3 2555; GFX8-NEXT: v_mad_u32_u24 v2, s0, v3, v2 2556; GFX8-NEXT: flat_store_short v[0:1], v2 2557; GFX8-NEXT: s_endpgm 2558; 2559; GFX9-NODL-LABEL: udot2_acc16: 2560; GFX9-NODL: ; %bb.0: ; %entry 2561; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2562; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2563; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 2564; GFX9-NODL-NEXT: s_mov_b32 s2, 0xffff 2565; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2566; GFX9-NODL-NEXT: global_load_ushort v1, v0, s[0:1] 2567; GFX9-NODL-NEXT: s_load_dword s3, s[4:5], 0x0 2568; GFX9-NODL-NEXT: s_load_dword s4, s[6:7], 0x0 2569; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2570; GFX9-NODL-NEXT: s_and_b32 s5, s4, s2 2571; GFX9-NODL-NEXT: s_lshr_b32 s4, s4, 16 2572; GFX9-NODL-NEXT: s_and_b32 s2, s3, s2 2573; GFX9-NODL-NEXT: s_lshr_b32 s3, s3, 16 2574; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s4 2575; GFX9-NODL-NEXT: s_waitcnt vmcnt(0) 2576; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s3, v2, v1 2577; GFX9-NODL-NEXT: v_mov_b32_e32 v2, s5 2578; GFX9-NODL-NEXT: v_mad_u32_u24 v1, s2, v2, v1 2579; GFX9-NODL-NEXT: global_store_short v0, v1, s[0:1] 2580; GFX9-NODL-NEXT: s_endpgm 2581; 2582; GFX9-DL-LABEL: udot2_acc16: 2583; GFX9-DL: ; %bb.0: ; %entry 2584; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2585; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2586; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2587; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2588; GFX9-DL-NEXT: s_load_dword s2, s[4:5], 0x0 2589; GFX9-DL-NEXT: s_load_dword s3, s[6:7], 0x0 2590; GFX9-DL-NEXT: global_load_ushort v1, v0, s[0:1] 2591; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2592; GFX9-DL-NEXT: v_mov_b32_e32 v2, s3 2593; GFX9-DL-NEXT: s_waitcnt vmcnt(0) 2594; GFX9-DL-NEXT: v_dot2_u32_u16 v1, s2, v2, v1 2595; GFX9-DL-NEXT: global_store_short v0, v1, s[0:1] 2596; GFX9-DL-NEXT: s_endpgm 2597; 2598; GFX10-DL-LABEL: udot2_acc16: 2599; GFX10-DL: ; %bb.0: ; %entry 2600; GFX10-DL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 2601; GFX10-DL-NEXT: v_mov_b32_e32 v0, 0 2602; GFX10-DL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2603; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2604; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2605; GFX10-DL-NEXT: global_load_ushort v1, v0, s[4:5] 2606; GFX10-DL-NEXT: s_load_dword s0, s[0:1], 0x0 2607; GFX10-DL-NEXT: s_load_dword s1, s[2:3], 0x0 2608; GFX10-DL-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 2609; GFX10-DL-NEXT: v_dot2_u32_u16 v1, s0, s1, v1 2610; GFX10-DL-NEXT: global_store_short v0, v1, s[4:5] 2611; GFX10-DL-NEXT: s_endpgm 2612 <2 x i16> addrspace(1)* %src2, 2613 i16 addrspace(1)* nocapture %dst) { 2614entry: 2615 %v1 = load <2 x i16>, <2 x i16> addrspace(1)* %src1 2616 %v2 = load <2 x i16>, <2 x i16> addrspace(1)* %src2 2617 2618 %v1e1 = extractelement <2 x i16> %v1, i64 0 2619 %v2e1 = extractelement <2 x i16> %v2, i64 0 2620 %mul1 = mul i16 %v1e1, %v2e1 2621 2622 %v1e2 = extractelement <2 x i16> %v1, i64 1 2623 %v2e2 = extractelement <2 x i16> %v2, i64 1 2624 %mul2 = mul i16 %v1e2, %v2e2 2625 2626 %s2 = load i16, i16 addrspace(1)* %dst, align 2 2627 %add1 = add i16 %mul2, %s2 2628 %add2 = add i16 %add1, %mul1 2629 store i16 %add2, i16 addrspace(1)* %dst, align 2 2630 ret void 2631} 2632 2633define amdgpu_kernel void @notsdot2_sext8(<2 x i8> addrspace(1)* %src1, 2634; GFX7-LABEL: notsdot2_sext8: 2635; GFX7: ; %bb.0: ; %entry 2636; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 2637; GFX7-NEXT: s_load_dwordx2 s[8:9], s[0:1], 0xd 2638; GFX7-NEXT: s_mov_b32 s3, 0xf000 2639; GFX7-NEXT: s_mov_b32 s2, -1 2640; GFX7-NEXT: s_mov_b32 s10, s2 2641; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2642; GFX7-NEXT: s_mov_b32 s0, s4 2643; GFX7-NEXT: s_mov_b32 s1, s5 2644; GFX7-NEXT: s_mov_b32 s4, s6 2645; GFX7-NEXT: s_mov_b32 s5, s7 2646; GFX7-NEXT: s_mov_b32 s6, s2 2647; GFX7-NEXT: s_mov_b32 s7, s3 2648; GFX7-NEXT: buffer_load_ushort v0, off, s[0:3], 0 2649; GFX7-NEXT: buffer_load_ushort v1, off, s[4:7], 0 2650; GFX7-NEXT: s_load_dword s0, s[8:9], 0x0 2651; GFX7-NEXT: s_mov_b32 s11, s3 2652; GFX7-NEXT: s_waitcnt vmcnt(1) 2653; GFX7-NEXT: v_bfe_i32 v2, v0, 0, 8 2654; GFX7-NEXT: s_waitcnt vmcnt(0) 2655; GFX7-NEXT: v_bfe_i32 v3, v1, 0, 8 2656; GFX7-NEXT: v_bfe_i32 v0, v0, 8, 8 2657; GFX7-NEXT: v_bfe_i32 v1, v1, 8, 8 2658; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2659; GFX7-NEXT: v_mad_i32_i24 v0, v1, v0, s0 2660; GFX7-NEXT: v_mad_i32_i24 v0, v3, v2, v0 2661; GFX7-NEXT: buffer_store_dword v0, off, s[8:11], 0 2662; GFX7-NEXT: s_endpgm 2663; 2664; GFX8-LABEL: notsdot2_sext8: 2665; GFX8: ; %bb.0: ; %entry 2666; GFX8-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2667; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2668; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2669; GFX8-NEXT: v_mov_b32_e32 v0, s4 2670; GFX8-NEXT: v_mov_b32_e32 v1, s5 2671; GFX8-NEXT: v_mov_b32_e32 v2, s6 2672; GFX8-NEXT: v_mov_b32_e32 v3, s7 2673; GFX8-NEXT: flat_load_ushort v0, v[0:1] 2674; GFX8-NEXT: flat_load_ushort v1, v[2:3] 2675; GFX8-NEXT: s_load_dword s2, s[0:1], 0x0 2676; GFX8-NEXT: s_waitcnt vmcnt(1) 2677; GFX8-NEXT: v_bfe_i32 v2, v0, 0, 8 2678; GFX8-NEXT: v_lshrrev_b16_e32 v0, 8, v0 2679; GFX8-NEXT: s_waitcnt vmcnt(0) 2680; GFX8-NEXT: v_bfe_i32 v3, v1, 0, 8 2681; GFX8-NEXT: v_lshrrev_b16_e32 v1, 8, v1 2682; GFX8-NEXT: v_bfe_i32 v0, v0, 0, 8 2683; GFX8-NEXT: v_bfe_i32 v1, v1, 0, 8 2684; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2685; GFX8-NEXT: v_mad_i32_i24 v0, v1, v0, s2 2686; GFX8-NEXT: v_mad_i32_i24 v2, v3, v2, v0 2687; GFX8-NEXT: v_mov_b32_e32 v0, s0 2688; GFX8-NEXT: v_mov_b32_e32 v1, s1 2689; GFX8-NEXT: flat_store_dword v[0:1], v2 2690; GFX8-NEXT: s_endpgm 2691; 2692; GFX9-NODL-LABEL: notsdot2_sext8: 2693; GFX9-NODL: ; %bb.0: ; %entry 2694; GFX9-NODL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2695; GFX9-NODL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2696; GFX9-NODL-NEXT: v_mov_b32_e32 v0, 0 2697; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2698; GFX9-NODL-NEXT: global_load_ushort v1, v0, s[4:5] 2699; GFX9-NODL-NEXT: global_load_ushort v2, v0, s[6:7] 2700; GFX9-NODL-NEXT: s_load_dword s2, s[0:1], 0x0 2701; GFX9-NODL-NEXT: s_waitcnt vmcnt(1) 2702; GFX9-NODL-NEXT: v_bfe_i32 v3, v1, 0, 8 2703; GFX9-NODL-NEXT: v_lshrrev_b16_e32 v1, 8, v1 2704; GFX9-NODL-NEXT: s_waitcnt vmcnt(0) 2705; GFX9-NODL-NEXT: v_bfe_i32 v4, v2, 0, 8 2706; GFX9-NODL-NEXT: v_lshrrev_b16_e32 v2, 8, v2 2707; GFX9-NODL-NEXT: v_bfe_i32 v1, v1, 0, 8 2708; GFX9-NODL-NEXT: v_bfe_i32 v2, v2, 0, 8 2709; GFX9-NODL-NEXT: s_waitcnt lgkmcnt(0) 2710; GFX9-NODL-NEXT: v_mad_i32_i24 v1, v2, v1, s2 2711; GFX9-NODL-NEXT: v_mad_i32_i24 v1, v4, v3, v1 2712; GFX9-NODL-NEXT: global_store_dword v0, v1, s[0:1] 2713; GFX9-NODL-NEXT: s_endpgm 2714; 2715; GFX9-DL-LABEL: notsdot2_sext8: 2716; GFX9-DL: ; %bb.0: ; %entry 2717; GFX9-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2718; GFX9-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2719; GFX9-DL-NEXT: v_mov_b32_e32 v0, 0 2720; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2721; GFX9-DL-NEXT: global_load_ushort v1, v0, s[4:5] 2722; GFX9-DL-NEXT: global_load_ushort v2, v0, s[6:7] 2723; GFX9-DL-NEXT: s_load_dword s2, s[0:1], 0x0 2724; GFX9-DL-NEXT: s_waitcnt vmcnt(1) 2725; GFX9-DL-NEXT: v_bfe_i32 v3, v1, 0, 8 2726; GFX9-DL-NEXT: v_lshrrev_b16_e32 v1, 8, v1 2727; GFX9-DL-NEXT: s_waitcnt vmcnt(0) 2728; GFX9-DL-NEXT: v_bfe_i32 v4, v2, 0, 8 2729; GFX9-DL-NEXT: v_lshrrev_b16_e32 v2, 8, v2 2730; GFX9-DL-NEXT: v_bfe_i32 v1, v1, 0, 8 2731; GFX9-DL-NEXT: v_bfe_i32 v2, v2, 0, 8 2732; GFX9-DL-NEXT: s_waitcnt lgkmcnt(0) 2733; GFX9-DL-NEXT: v_mad_i32_i24 v1, v2, v1, s2 2734; GFX9-DL-NEXT: v_mad_i32_i24 v1, v4, v3, v1 2735; GFX9-DL-NEXT: global_store_dword v0, v1, s[0:1] 2736; GFX9-DL-NEXT: s_endpgm 2737; 2738; GFX10-DL-LABEL: notsdot2_sext8: 2739; GFX10-DL: ; %bb.0: ; %entry 2740; GFX10-DL-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 2741; GFX10-DL-NEXT: v_mov_b32_e32 v0, 0 2742; GFX10-DL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x34 2743; GFX10-DL-NEXT: ; implicit-def: $vcc_hi 2744; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2745; GFX10-DL-NEXT: s_clause 0x1 2746; GFX10-DL-NEXT: global_load_ushort v1, v0, s[4:5] 2747; GFX10-DL-NEXT: global_load_ushort v2, v0, s[6:7] 2748; GFX10-DL-NEXT: s_load_dword s2, s[0:1], 0x0 2749; GFX10-DL-NEXT: s_waitcnt vmcnt(1) 2750; GFX10-DL-NEXT: v_lshrrev_b16_e64 v3, 8, v1 2751; GFX10-DL-NEXT: s_waitcnt vmcnt(0) 2752; GFX10-DL-NEXT: v_lshrrev_b16_e64 v4, 8, v2 2753; GFX10-DL-NEXT: v_bfe_i32 v1, v1, 0, 8 2754; GFX10-DL-NEXT: v_bfe_i32 v2, v2, 0, 8 2755; GFX10-DL-NEXT: v_bfe_i32 v3, v3, 0, 8 2756; GFX10-DL-NEXT: v_bfe_i32 v4, v4, 0, 8 2757; GFX10-DL-NEXT: s_waitcnt lgkmcnt(0) 2758; GFX10-DL-NEXT: v_mad_i32_i24 v3, v4, v3, s2 2759; GFX10-DL-NEXT: v_mad_i32_i24 v1, v2, v1, v3 2760; GFX10-DL-NEXT: global_store_dword v0, v1, s[0:1] 2761; GFX10-DL-NEXT: s_endpgm 2762 <2 x i8> addrspace(1)* %src2, 2763 i32 addrspace(1)* nocapture %dst) { 2764entry: 2765 %vec1 = load <2 x i8>, <2 x i8> addrspace(1)* %src1 2766 %vec2 = load <2 x i8>, <2 x i8> addrspace(1)* %src2 2767 2768 %s1.elt1 = extractelement <2 x i8> %vec1, i64 0 2769 %conv = sext i8 %s1.elt1 to i32 2770 %s2.elt1 = extractelement <2 x i8> %vec2, i64 0 2771 %conv2 = sext i8 %s2.elt1 to i32 2772 %mul1 = mul nuw i32 %conv2, %conv 2773 2774 %s1.elt2 = extractelement <2 x i8> %vec1, i64 1 2775 %conv3 = sext i8 %s1.elt2 to i32 2776 %s2.elt2 = extractelement <2 x i8> %vec2, i64 1 2777 %conv4 = sext i8 %s2.elt2 to i32 2778 %mul2 = mul nuw i32 %conv4, %conv3 2779 2780 %s3 = load i32, i32 addrspace(1)* %dst, align 4 2781 %add = add i32 %mul2, %s3 2782 %add6 = add i32 %add, %mul1 2783 store i32 %add6, i32 addrspace(1)* %dst, align 4 2784 ret void 2785} 2786