1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -march=amdgcn -mcpu=gfx900 -amdgpu-sroa=0 -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX900 %s 3; RUN: llc -march=amdgcn -mcpu=gfx906 -amdgpu-sroa=0 -mattr=-promote-alloca,+sram-ecc -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX906,NO-D16-HI %s 4; RUN: llc -march=amdgcn -mcpu=fiji -amdgpu-sroa=0 -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX803,NO-D16-HI %s 5 6define <2 x i16> @load_local_lo_v2i16_undeflo(i16 addrspace(3)* %in) #0 { 7; GFX900-LABEL: load_local_lo_v2i16_undeflo: 8; GFX900: ; %bb.0: ; %entry 9; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 10; GFX900-NEXT: ds_read_u16_d16 v0, v0 11; GFX900-NEXT: s_waitcnt lgkmcnt(0) 12; GFX900-NEXT: s_setpc_b64 s[30:31] 13; 14; GFX906-LABEL: load_local_lo_v2i16_undeflo: 15; GFX906: ; %bb.0: ; %entry 16; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 17; GFX906-NEXT: ds_read_u16 v0, v0 18; GFX906-NEXT: s_waitcnt lgkmcnt(0) 19; GFX906-NEXT: s_setpc_b64 s[30:31] 20; 21; GFX803-LABEL: load_local_lo_v2i16_undeflo: 22; GFX803: ; %bb.0: ; %entry 23; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 24; GFX803-NEXT: s_mov_b32 m0, -1 25; GFX803-NEXT: ds_read_u16 v0, v0 26; GFX803-NEXT: s_waitcnt lgkmcnt(0) 27; GFX803-NEXT: s_setpc_b64 s[30:31] 28entry: 29 %load = load i16, i16 addrspace(3)* %in 30 %build = insertelement <2 x i16> undef, i16 %load, i32 0 31 ret <2 x i16> %build 32} 33 34define <2 x i16> @load_local_lo_v2i16_reglo(i16 addrspace(3)* %in, i16 %reg) #0 { 35; GFX900-LABEL: load_local_lo_v2i16_reglo: 36; GFX900: ; %bb.0: ; %entry 37; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 38; GFX900-NEXT: ds_read_u16 v0, v0 39; GFX900-NEXT: s_waitcnt lgkmcnt(0) 40; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 41; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 42; GFX900-NEXT: s_setpc_b64 s[30:31] 43; 44; GFX906-LABEL: load_local_lo_v2i16_reglo: 45; GFX906: ; %bb.0: ; %entry 46; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 47; GFX906-NEXT: ds_read_u16 v0, v0 48; GFX906-NEXT: s_waitcnt lgkmcnt(0) 49; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 50; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 51; GFX906-NEXT: s_setpc_b64 s[30:31] 52; 53; GFX803-LABEL: load_local_lo_v2i16_reglo: 54; GFX803: ; %bb.0: ; %entry 55; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 56; GFX803-NEXT: s_mov_b32 m0, -1 57; GFX803-NEXT: ds_read_u16 v0, v0 58; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 59; GFX803-NEXT: s_waitcnt lgkmcnt(0) 60; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 61; GFX803-NEXT: s_setpc_b64 s[30:31] 62entry: 63 %load = load i16, i16 addrspace(3)* %in 64 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 1 65 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 0 66 ret <2 x i16> %build1 67} 68 69; Show that we get reasonable regalloc without physreg constraints. 70define void @load_local_lo_v2i16_reglo_vreg(i16 addrspace(3)* %in, i16 %reg) #0 { 71; GFX900-LABEL: load_local_lo_v2i16_reglo_vreg: 72; GFX900: ; %bb.0: ; %entry 73; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 74; GFX900-NEXT: ds_read_u16 v0, v0 75; GFX900-NEXT: s_waitcnt lgkmcnt(0) 76; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 77; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 78; GFX900-NEXT: global_store_dword v[0:1], v0, off 79; GFX900-NEXT: s_waitcnt vmcnt(0) 80; GFX900-NEXT: s_setpc_b64 s[30:31] 81; 82; GFX906-LABEL: load_local_lo_v2i16_reglo_vreg: 83; GFX906: ; %bb.0: ; %entry 84; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 85; GFX906-NEXT: ds_read_u16 v0, v0 86; GFX906-NEXT: s_waitcnt lgkmcnt(0) 87; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 88; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 89; GFX906-NEXT: global_store_dword v[0:1], v0, off 90; GFX906-NEXT: s_waitcnt vmcnt(0) 91; GFX906-NEXT: s_setpc_b64 s[30:31] 92; 93; GFX803-LABEL: load_local_lo_v2i16_reglo_vreg: 94; GFX803: ; %bb.0: ; %entry 95; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 96; GFX803-NEXT: s_mov_b32 m0, -1 97; GFX803-NEXT: ds_read_u16 v0, v0 98; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 99; GFX803-NEXT: s_waitcnt lgkmcnt(0) 100; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 101; GFX803-NEXT: flat_store_dword v[0:1], v0 102; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 103; GFX803-NEXT: s_setpc_b64 s[30:31] 104entry: 105 %load = load i16, i16 addrspace(3)* %in 106 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 1 107 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 0 108 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 109 ret void 110} 111 112define <2 x i16> @load_local_lo_v2i16_zerolo(i16 addrspace(3)* %in) #0 { 113; GFX900-LABEL: load_local_lo_v2i16_zerolo: 114; GFX900: ; %bb.0: ; %entry 115; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 116; GFX900-NEXT: v_mov_b32_e32 v1, 0 117; GFX900-NEXT: ds_read_u16_d16 v1, v0 118; GFX900-NEXT: s_waitcnt lgkmcnt(0) 119; GFX900-NEXT: v_mov_b32_e32 v0, v1 120; GFX900-NEXT: s_setpc_b64 s[30:31] 121; 122; GFX906-LABEL: load_local_lo_v2i16_zerolo: 123; GFX906: ; %bb.0: ; %entry 124; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 125; GFX906-NEXT: ds_read_u16 v0, v0 126; GFX906-NEXT: s_waitcnt lgkmcnt(0) 127; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 128; GFX906-NEXT: s_setpc_b64 s[30:31] 129; 130; GFX803-LABEL: load_local_lo_v2i16_zerolo: 131; GFX803: ; %bb.0: ; %entry 132; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 133; GFX803-NEXT: s_mov_b32 m0, -1 134; GFX803-NEXT: ds_read_u16 v0, v0 135; GFX803-NEXT: s_waitcnt lgkmcnt(0) 136; GFX803-NEXT: s_setpc_b64 s[30:31] 137entry: 138 %load = load i16, i16 addrspace(3)* %in 139 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 0 140 ret <2 x i16> %build 141} 142 143define <2 x half> @load_local_lo_v2f16_fpimm(half addrspace(3)* %in) #0 { 144; GFX900-LABEL: load_local_lo_v2f16_fpimm: 145; GFX900: ; %bb.0: ; %entry 146; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 147; GFX900-NEXT: v_mov_b32_e32 v1, 2.0 148; GFX900-NEXT: ds_read_u16_d16 v1, v0 149; GFX900-NEXT: s_waitcnt lgkmcnt(0) 150; GFX900-NEXT: v_mov_b32_e32 v0, v1 151; GFX900-NEXT: s_setpc_b64 s[30:31] 152; 153; GFX906-LABEL: load_local_lo_v2f16_fpimm: 154; GFX906: ; %bb.0: ; %entry 155; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 156; GFX906-NEXT: ds_read_u16 v0, v0 157; GFX906-NEXT: s_movk_i32 s4, 0x4000 158; GFX906-NEXT: s_waitcnt lgkmcnt(0) 159; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 160; GFX906-NEXT: v_lshl_or_b32 v0, s4, 16, v0 161; GFX906-NEXT: s_setpc_b64 s[30:31] 162; 163; GFX803-LABEL: load_local_lo_v2f16_fpimm: 164; GFX803: ; %bb.0: ; %entry 165; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 166; GFX803-NEXT: s_mov_b32 m0, -1 167; GFX803-NEXT: ds_read_u16 v0, v0 168; GFX803-NEXT: s_waitcnt lgkmcnt(0) 169; GFX803-NEXT: v_or_b32_e32 v0, 2.0, v0 170; GFX803-NEXT: s_setpc_b64 s[30:31] 171entry: 172 %load = load half, half addrspace(3)* %in 173 %build = insertelement <2 x half> <half 0.0, half 2.0>, half %load, i32 0 174 ret <2 x half> %build 175} 176 177define void @load_local_lo_v2f16_reghi_vreg(half addrspace(3)* %in, i32 %reg) #0 { 178; GFX900-LABEL: load_local_lo_v2f16_reghi_vreg: 179; GFX900: ; %bb.0: ; %entry 180; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 181; GFX900-NEXT: ds_read_u16_d16 v1, v0 182; GFX900-NEXT: s_waitcnt lgkmcnt(0) 183; GFX900-NEXT: global_store_dword v[0:1], v1, off 184; GFX900-NEXT: s_waitcnt vmcnt(0) 185; GFX900-NEXT: s_setpc_b64 s[30:31] 186; 187; GFX906-LABEL: load_local_lo_v2f16_reghi_vreg: 188; GFX906: ; %bb.0: ; %entry 189; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 190; GFX906-NEXT: ds_read_u16 v0, v0 191; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v1 192; GFX906-NEXT: s_waitcnt lgkmcnt(0) 193; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 194; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 195; GFX906-NEXT: global_store_dword v[0:1], v0, off 196; GFX906-NEXT: s_waitcnt vmcnt(0) 197; GFX906-NEXT: s_setpc_b64 s[30:31] 198; 199; GFX803-LABEL: load_local_lo_v2f16_reghi_vreg: 200; GFX803: ; %bb.0: ; %entry 201; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 202; GFX803-NEXT: s_mov_b32 m0, -1 203; GFX803-NEXT: ds_read_u16 v0, v0 204; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 205; GFX803-NEXT: s_waitcnt lgkmcnt(0) 206; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 207; GFX803-NEXT: flat_store_dword v[0:1], v0 208; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 209; GFX803-NEXT: s_setpc_b64 s[30:31] 210entry: 211 %reg.bc = bitcast i32 %reg to <2 x half> 212 %load = load half, half addrspace(3)* %in 213 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 214 store <2 x half> %build1, <2 x half> addrspace(1)* undef 215 ret void 216} 217 218define void @load_local_lo_v2f16_reglo_vreg(half addrspace(3)* %in, half %reg) #0 { 219; GFX900-LABEL: load_local_lo_v2f16_reglo_vreg: 220; GFX900: ; %bb.0: ; %entry 221; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 222; GFX900-NEXT: ds_read_u16 v0, v0 223; GFX900-NEXT: s_waitcnt lgkmcnt(0) 224; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 225; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 226; GFX900-NEXT: global_store_dword v[0:1], v0, off 227; GFX900-NEXT: s_waitcnt vmcnt(0) 228; GFX900-NEXT: s_setpc_b64 s[30:31] 229; 230; GFX906-LABEL: load_local_lo_v2f16_reglo_vreg: 231; GFX906: ; %bb.0: ; %entry 232; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 233; GFX906-NEXT: ds_read_u16 v0, v0 234; GFX906-NEXT: s_waitcnt lgkmcnt(0) 235; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 236; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 237; GFX906-NEXT: global_store_dword v[0:1], v0, off 238; GFX906-NEXT: s_waitcnt vmcnt(0) 239; GFX906-NEXT: s_setpc_b64 s[30:31] 240; 241; GFX803-LABEL: load_local_lo_v2f16_reglo_vreg: 242; GFX803: ; %bb.0: ; %entry 243; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 244; GFX803-NEXT: s_mov_b32 m0, -1 245; GFX803-NEXT: ds_read_u16 v0, v0 246; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 247; GFX803-NEXT: s_waitcnt lgkmcnt(0) 248; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 249; GFX803-NEXT: flat_store_dword v[0:1], v0 250; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 251; GFX803-NEXT: s_setpc_b64 s[30:31] 252entry: 253 %load = load half, half addrspace(3)* %in 254 %build0 = insertelement <2 x half> undef, half %reg, i32 1 255 %build1 = insertelement <2 x half> %build0, half %load, i32 0 256 store <2 x half> %build1, <2 x half> addrspace(1)* undef 257 ret void 258} 259 260define void @load_local_lo_v2i16_reghi_vreg_zexti8(i8 addrspace(3)* %in, i32 %reg) #0 { 261; GFX900-LABEL: load_local_lo_v2i16_reghi_vreg_zexti8: 262; GFX900: ; %bb.0: ; %entry 263; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 264; GFX900-NEXT: ds_read_u8_d16 v1, v0 265; GFX900-NEXT: s_waitcnt lgkmcnt(0) 266; GFX900-NEXT: global_store_dword v[0:1], v1, off 267; GFX900-NEXT: s_waitcnt vmcnt(0) 268; GFX900-NEXT: s_setpc_b64 s[30:31] 269; 270; GFX906-LABEL: load_local_lo_v2i16_reghi_vreg_zexti8: 271; GFX906: ; %bb.0: ; %entry 272; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 273; GFX906-NEXT: ds_read_u8 v0, v0 274; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 275; GFX906-NEXT: s_waitcnt lgkmcnt(0) 276; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 277; GFX906-NEXT: global_store_dword v[0:1], v0, off 278; GFX906-NEXT: s_waitcnt vmcnt(0) 279; GFX906-NEXT: s_setpc_b64 s[30:31] 280; 281; GFX803-LABEL: load_local_lo_v2i16_reghi_vreg_zexti8: 282; GFX803: ; %bb.0: ; %entry 283; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 284; GFX803-NEXT: s_mov_b32 m0, -1 285; GFX803-NEXT: ds_read_u8 v0, v0 286; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v1 287; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 288; GFX803-NEXT: s_waitcnt lgkmcnt(0) 289; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 290; GFX803-NEXT: flat_store_dword v[0:1], v0 291; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 292; GFX803-NEXT: s_setpc_b64 s[30:31] 293entry: 294 %reg.bc = bitcast i32 %reg to <2 x i16> 295 %load = load i8, i8 addrspace(3)* %in 296 %ext = zext i8 %load to i16 297 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 298 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 299 ret void 300} 301 302define void @load_local_lo_v2i16_reglo_vreg_zexti8(i8 addrspace(3)* %in, i16 %reg) #0 { 303; GFX900-LABEL: load_local_lo_v2i16_reglo_vreg_zexti8: 304; GFX900: ; %bb.0: ; %entry 305; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 306; GFX900-NEXT: ds_read_u8 v0, v0 307; GFX900-NEXT: s_waitcnt lgkmcnt(0) 308; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 309; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 310; GFX900-NEXT: global_store_dword v[0:1], v0, off 311; GFX900-NEXT: s_waitcnt vmcnt(0) 312; GFX900-NEXT: s_setpc_b64 s[30:31] 313; 314; GFX906-LABEL: load_local_lo_v2i16_reglo_vreg_zexti8: 315; GFX906: ; %bb.0: ; %entry 316; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 317; GFX906-NEXT: ds_read_u8 v0, v0 318; GFX906-NEXT: s_waitcnt lgkmcnt(0) 319; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 320; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 321; GFX906-NEXT: global_store_dword v[0:1], v0, off 322; GFX906-NEXT: s_waitcnt vmcnt(0) 323; GFX906-NEXT: s_setpc_b64 s[30:31] 324; 325; GFX803-LABEL: load_local_lo_v2i16_reglo_vreg_zexti8: 326; GFX803: ; %bb.0: ; %entry 327; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 328; GFX803-NEXT: s_mov_b32 m0, -1 329; GFX803-NEXT: ds_read_u8 v0, v0 330; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 331; GFX803-NEXT: s_waitcnt lgkmcnt(0) 332; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 333; GFX803-NEXT: flat_store_dword v[0:1], v0 334; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 335; GFX803-NEXT: s_setpc_b64 s[30:31] 336entry: 337 %load = load i8, i8 addrspace(3)* %in 338 %ext = zext i8 %load to i16 339 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 1 340 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 0 341 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 342 ret void 343} 344 345define void @load_local_lo_v2i16_reghi_vreg_sexti8(i8 addrspace(3)* %in, i32 %reg) #0 { 346; GFX900-LABEL: load_local_lo_v2i16_reghi_vreg_sexti8: 347; GFX900: ; %bb.0: ; %entry 348; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 349; GFX900-NEXT: ds_read_i8_d16 v1, v0 350; GFX900-NEXT: s_waitcnt lgkmcnt(0) 351; GFX900-NEXT: global_store_dword v[0:1], v1, off 352; GFX900-NEXT: s_waitcnt vmcnt(0) 353; GFX900-NEXT: s_setpc_b64 s[30:31] 354; 355; GFX906-LABEL: load_local_lo_v2i16_reghi_vreg_sexti8: 356; GFX906: ; %bb.0: ; %entry 357; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 358; GFX906-NEXT: ds_read_i8 v0, v0 359; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 360; GFX906-NEXT: s_waitcnt lgkmcnt(0) 361; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 362; GFX906-NEXT: global_store_dword v[0:1], v0, off 363; GFX906-NEXT: s_waitcnt vmcnt(0) 364; GFX906-NEXT: s_setpc_b64 s[30:31] 365; 366; GFX803-LABEL: load_local_lo_v2i16_reghi_vreg_sexti8: 367; GFX803: ; %bb.0: ; %entry 368; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 369; GFX803-NEXT: s_mov_b32 m0, -1 370; GFX803-NEXT: ds_read_i8 v0, v0 371; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 372; GFX803-NEXT: s_waitcnt lgkmcnt(0) 373; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 374; GFX803-NEXT: flat_store_dword v[0:1], v0 375; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 376; GFX803-NEXT: s_setpc_b64 s[30:31] 377entry: 378 %reg.bc = bitcast i32 %reg to <2 x i16> 379 %load = load i8, i8 addrspace(3)* %in 380 %ext = sext i8 %load to i16 381 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 382 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 383 ret void 384} 385 386define void @load_local_lo_v2i16_reglo_vreg_sexti8(i8 addrspace(3)* %in, i16 %reg) #0 { 387; GFX900-LABEL: load_local_lo_v2i16_reglo_vreg_sexti8: 388; GFX900: ; %bb.0: ; %entry 389; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 390; GFX900-NEXT: ds_read_i8 v0, v0 391; GFX900-NEXT: s_waitcnt lgkmcnt(0) 392; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 393; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 394; GFX900-NEXT: global_store_dword v[0:1], v0, off 395; GFX900-NEXT: s_waitcnt vmcnt(0) 396; GFX900-NEXT: s_setpc_b64 s[30:31] 397; 398; GFX906-LABEL: load_local_lo_v2i16_reglo_vreg_sexti8: 399; GFX906: ; %bb.0: ; %entry 400; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 401; GFX906-NEXT: ds_read_i8 v0, v0 402; GFX906-NEXT: s_waitcnt lgkmcnt(0) 403; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 404; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 405; GFX906-NEXT: global_store_dword v[0:1], v0, off 406; GFX906-NEXT: s_waitcnt vmcnt(0) 407; GFX906-NEXT: s_setpc_b64 s[30:31] 408; 409; GFX803-LABEL: load_local_lo_v2i16_reglo_vreg_sexti8: 410; GFX803: ; %bb.0: ; %entry 411; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 412; GFX803-NEXT: s_mov_b32 m0, -1 413; GFX803-NEXT: ds_read_i8 v0, v0 414; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 415; GFX803-NEXT: s_waitcnt lgkmcnt(0) 416; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 417; GFX803-NEXT: flat_store_dword v[0:1], v0 418; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 419; GFX803-NEXT: s_setpc_b64 s[30:31] 420entry: 421 %load = load i8, i8 addrspace(3)* %in 422 %ext = sext i8 %load to i16 423 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 1 424 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 0 425 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 426 ret void 427} 428 429define void @load_local_lo_v2f16_reglo_vreg_zexti8(i8 addrspace(3)* %in, half %reg) #0 { 430; GFX900-LABEL: load_local_lo_v2f16_reglo_vreg_zexti8: 431; GFX900: ; %bb.0: ; %entry 432; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 433; GFX900-NEXT: ds_read_u8 v0, v0 434; GFX900-NEXT: s_waitcnt lgkmcnt(0) 435; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 436; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 437; GFX900-NEXT: global_store_dword v[0:1], v0, off 438; GFX900-NEXT: s_waitcnt vmcnt(0) 439; GFX900-NEXT: s_setpc_b64 s[30:31] 440; 441; GFX906-LABEL: load_local_lo_v2f16_reglo_vreg_zexti8: 442; GFX906: ; %bb.0: ; %entry 443; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 444; GFX906-NEXT: ds_read_u8 v0, v0 445; GFX906-NEXT: s_waitcnt lgkmcnt(0) 446; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 447; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 448; GFX906-NEXT: global_store_dword v[0:1], v0, off 449; GFX906-NEXT: s_waitcnt vmcnt(0) 450; GFX906-NEXT: s_setpc_b64 s[30:31] 451; 452; GFX803-LABEL: load_local_lo_v2f16_reglo_vreg_zexti8: 453; GFX803: ; %bb.0: ; %entry 454; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 455; GFX803-NEXT: s_mov_b32 m0, -1 456; GFX803-NEXT: ds_read_u8 v0, v0 457; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 458; GFX803-NEXT: s_waitcnt lgkmcnt(0) 459; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 460; GFX803-NEXT: flat_store_dword v[0:1], v0 461; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 462; GFX803-NEXT: s_setpc_b64 s[30:31] 463entry: 464 %load = load i8, i8 addrspace(3)* %in 465 %ext = zext i8 %load to i16 466 %bitcast = bitcast i16 %ext to half 467 %build0 = insertelement <2 x half> undef, half %reg, i32 1 468 %build1 = insertelement <2 x half> %build0, half %bitcast, i32 0 469 store <2 x half> %build1, <2 x half> addrspace(1)* undef 470 ret void 471} 472 473define void @load_local_lo_v2f16_reglo_vreg_sexti8(i8 addrspace(3)* %in, half %reg) #0 { 474; GFX900-LABEL: load_local_lo_v2f16_reglo_vreg_sexti8: 475; GFX900: ; %bb.0: ; %entry 476; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 477; GFX900-NEXT: ds_read_i8 v0, v0 478; GFX900-NEXT: s_waitcnt lgkmcnt(0) 479; GFX900-NEXT: v_and_b32_e32 v0, 0xffff, v0 480; GFX900-NEXT: v_lshl_or_b32 v0, v1, 16, v0 481; GFX900-NEXT: global_store_dword v[0:1], v0, off 482; GFX900-NEXT: s_waitcnt vmcnt(0) 483; GFX900-NEXT: s_setpc_b64 s[30:31] 484; 485; GFX906-LABEL: load_local_lo_v2f16_reglo_vreg_sexti8: 486; GFX906: ; %bb.0: ; %entry 487; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 488; GFX906-NEXT: ds_read_i8 v0, v0 489; GFX906-NEXT: s_waitcnt lgkmcnt(0) 490; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 491; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 492; GFX906-NEXT: global_store_dword v[0:1], v0, off 493; GFX906-NEXT: s_waitcnt vmcnt(0) 494; GFX906-NEXT: s_setpc_b64 s[30:31] 495; 496; GFX803-LABEL: load_local_lo_v2f16_reglo_vreg_sexti8: 497; GFX803: ; %bb.0: ; %entry 498; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 499; GFX803-NEXT: s_mov_b32 m0, -1 500; GFX803-NEXT: ds_read_i8 v0, v0 501; GFX803-NEXT: v_lshlrev_b32_e32 v1, 16, v1 502; GFX803-NEXT: s_waitcnt lgkmcnt(0) 503; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 504; GFX803-NEXT: flat_store_dword v[0:1], v0 505; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 506; GFX803-NEXT: s_setpc_b64 s[30:31] 507entry: 508 %load = load i8, i8 addrspace(3)* %in 509 %ext = sext i8 %load to i16 510 %bitcast = bitcast i16 %ext to half 511 %build0 = insertelement <2 x half> undef, half %reg, i32 1 512 %build1 = insertelement <2 x half> %build0, half %bitcast, i32 0 513 store <2 x half> %build1, <2 x half> addrspace(1)* undef 514 ret void 515} 516 517define void @load_local_lo_v2i16_reghi_vreg_multi_use_lo(i16 addrspace(3)* %in, <2 x i16> %reg) #0 { 518; GFX900-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lo: 519; GFX900: ; %bb.0: ; %entry 520; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 521; GFX900-NEXT: ds_read_u16 v0, v0 522; GFX900-NEXT: v_mov_b32_e32 v3, 0 523; GFX900-NEXT: v_mov_b32_e32 v2, 0xffff 524; GFX900-NEXT: s_waitcnt lgkmcnt(0) 525; GFX900-NEXT: ds_write_b16 v3, v0 526; GFX900-NEXT: v_bfi_b32 v0, v2, v0, v1 527; GFX900-NEXT: global_store_dword v[0:1], v0, off 528; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 529; GFX900-NEXT: s_setpc_b64 s[30:31] 530; 531; GFX906-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lo: 532; GFX906: ; %bb.0: ; %entry 533; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 534; GFX906-NEXT: ds_read_u16 v0, v0 535; GFX906-NEXT: v_mov_b32_e32 v3, 0 536; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 537; GFX906-NEXT: s_waitcnt lgkmcnt(0) 538; GFX906-NEXT: ds_write_b16 v3, v0 539; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 540; GFX906-NEXT: global_store_dword v[0:1], v0, off 541; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 542; GFX906-NEXT: s_setpc_b64 s[30:31] 543; 544; GFX803-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lo: 545; GFX803: ; %bb.0: ; %entry 546; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 547; GFX803-NEXT: s_mov_b32 m0, -1 548; GFX803-NEXT: ds_read_u16 v0, v0 549; GFX803-NEXT: v_mov_b32_e32 v2, 0 550; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 551; GFX803-NEXT: s_waitcnt lgkmcnt(0) 552; GFX803-NEXT: ds_write_b16 v2, v0 553; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 554; GFX803-NEXT: flat_store_dword v[0:1], v0 555; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 556; GFX803-NEXT: s_setpc_b64 s[30:31] 557entry: 558 %load = load i16, i16 addrspace(3)* %in 559 %elt1 = extractelement <2 x i16> %reg, i32 1 560 store i16 %load, i16 addrspace(3)* null 561 %build1 = insertelement <2 x i16> %reg, i16 %load, i32 0 562 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 563 ret void 564} 565 566define void @load_local_lo_v2i16_reghi_vreg_multi_use_hi(i16 addrspace(3)* %in, <2 x i16> %reg) #0 { 567; GFX900-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_hi: 568; GFX900: ; %bb.0: ; %entry 569; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 570; GFX900-NEXT: v_lshrrev_b32_e32 v2, 16, v1 571; GFX900-NEXT: ds_read_u16_d16 v1, v0 572; GFX900-NEXT: v_mov_b32_e32 v0, 0 573; GFX900-NEXT: ds_write_b16 v0, v2 574; GFX900-NEXT: s_waitcnt lgkmcnt(1) 575; GFX900-NEXT: global_store_dword v[0:1], v1, off 576; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 577; GFX900-NEXT: s_setpc_b64 s[30:31] 578; 579; GFX906-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_hi: 580; GFX906: ; %bb.0: ; %entry 581; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 582; GFX906-NEXT: ds_read_u16 v0, v0 583; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 584; GFX906-NEXT: v_lshrrev_b32_e32 v3, 16, v1 585; GFX906-NEXT: v_mov_b32_e32 v4, 0 586; GFX906-NEXT: ds_write_b16 v4, v3 587; GFX906-NEXT: s_waitcnt lgkmcnt(1) 588; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 589; GFX906-NEXT: global_store_dword v[0:1], v0, off 590; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 591; GFX906-NEXT: s_setpc_b64 s[30:31] 592; 593; GFX803-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_hi: 594; GFX803: ; %bb.0: ; %entry 595; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 596; GFX803-NEXT: s_mov_b32 m0, -1 597; GFX803-NEXT: ds_read_u16 v0, v0 598; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v1 599; GFX803-NEXT: v_lshlrev_b32_e32 v2, 16, v1 600; GFX803-NEXT: v_mov_b32_e32 v3, 0 601; GFX803-NEXT: ds_write_b16 v3, v1 602; GFX803-NEXT: s_waitcnt lgkmcnt(1) 603; GFX803-NEXT: v_or_b32_e32 v0, v0, v2 604; GFX803-NEXT: flat_store_dword v[0:1], v0 605; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 606; GFX803-NEXT: s_setpc_b64 s[30:31] 607entry: 608 %load = load i16, i16 addrspace(3)* %in 609 %elt1 = extractelement <2 x i16> %reg, i32 1 610 store i16 %elt1, i16 addrspace(3)* null 611 %build1 = insertelement <2 x i16> %reg, i16 %load, i32 0 612 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 613 ret void 614} 615 616define void @load_local_lo_v2i16_reghi_vreg_multi_use_lohi(i16 addrspace(3)* noalias %in, <2 x i16> %reg, i16 addrspace(3)* noalias %out0, i16 addrspace(3)* noalias %out1) #0 { 617; GFX900-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lohi: 618; GFX900: ; %bb.0: ; %entry 619; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 620; GFX900-NEXT: ds_read_u16 v0, v0 621; GFX900-NEXT: v_mov_b32_e32 v4, 0xffff 622; GFX900-NEXT: v_lshrrev_b32_e32 v5, 16, v1 623; GFX900-NEXT: s_waitcnt lgkmcnt(0) 624; GFX900-NEXT: ds_write_b16 v2, v0 625; GFX900-NEXT: ds_write_b16 v3, v5 626; GFX900-NEXT: v_bfi_b32 v0, v4, v0, v1 627; GFX900-NEXT: global_store_dword v[0:1], v0, off 628; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 629; GFX900-NEXT: s_setpc_b64 s[30:31] 630; 631; GFX906-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lohi: 632; GFX906: ; %bb.0: ; %entry 633; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 634; GFX906-NEXT: ds_read_u16 v0, v0 635; GFX906-NEXT: v_mov_b32_e32 v4, 0xffff 636; GFX906-NEXT: v_lshrrev_b32_e32 v5, 16, v1 637; GFX906-NEXT: s_waitcnt lgkmcnt(0) 638; GFX906-NEXT: ds_write_b16 v2, v0 639; GFX906-NEXT: ds_write_b16 v3, v5 640; GFX906-NEXT: v_bfi_b32 v0, v4, v0, v1 641; GFX906-NEXT: global_store_dword v[0:1], v0, off 642; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 643; GFX906-NEXT: s_setpc_b64 s[30:31] 644; 645; GFX803-LABEL: load_local_lo_v2i16_reghi_vreg_multi_use_lohi: 646; GFX803: ; %bb.0: ; %entry 647; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 648; GFX803-NEXT: s_mov_b32 m0, -1 649; GFX803-NEXT: ds_read_u16 v0, v0 650; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v1 651; GFX803-NEXT: v_lshlrev_b32_e32 v4, 16, v1 652; GFX803-NEXT: s_waitcnt lgkmcnt(0) 653; GFX803-NEXT: ds_write_b16 v2, v0 654; GFX803-NEXT: ds_write_b16 v3, v1 655; GFX803-NEXT: v_or_b32_sdwa v0, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 656; GFX803-NEXT: flat_store_dword v[0:1], v0 657; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 658; GFX803-NEXT: s_setpc_b64 s[30:31] 659entry: 660 %load = load i16, i16 addrspace(3)* %in 661 %elt1 = extractelement <2 x i16> %reg, i32 1 662 store i16 %load, i16 addrspace(3)* %out0 663 store i16 %elt1, i16 addrspace(3)* %out1 664 %build1 = insertelement <2 x i16> %reg, i16 %load, i32 0 665 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 666 ret void 667} 668 669define void @load_global_lo_v2i16_reglo_vreg(i16 addrspace(1)* %in, i32 %reg) #0 { 670; GFX900-LABEL: load_global_lo_v2i16_reglo_vreg: 671; GFX900: ; %bb.0: ; %entry 672; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 673; GFX900-NEXT: global_load_short_d16 v2, v[0:1], off offset:-4094 674; GFX900-NEXT: s_waitcnt vmcnt(0) 675; GFX900-NEXT: global_store_dword v[0:1], v2, off 676; GFX900-NEXT: s_waitcnt vmcnt(0) 677; GFX900-NEXT: s_setpc_b64 s[30:31] 678; 679; GFX906-LABEL: load_global_lo_v2i16_reglo_vreg: 680; GFX906: ; %bb.0: ; %entry 681; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 682; GFX906-NEXT: global_load_ushort v0, v[0:1], off offset:-4094 683; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 684; GFX906-NEXT: s_waitcnt vmcnt(0) 685; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 686; GFX906-NEXT: global_store_dword v[0:1], v0, off 687; GFX906-NEXT: s_waitcnt vmcnt(0) 688; GFX906-NEXT: s_setpc_b64 s[30:31] 689; 690; GFX803-LABEL: load_global_lo_v2i16_reglo_vreg: 691; GFX803: ; %bb.0: ; %entry 692; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 693; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff002, v0 694; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 695; GFX803-NEXT: flat_load_ushort v0, v[0:1] 696; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 697; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 698; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 699; GFX803-NEXT: flat_store_dword v[0:1], v0 700; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 701; GFX803-NEXT: s_setpc_b64 s[30:31] 702entry: 703 %reg.bc = bitcast i32 %reg to <2 x i16> 704 %gep = getelementptr inbounds i16, i16 addrspace(1)* %in, i64 -2047 705 %load = load i16, i16 addrspace(1)* %gep 706 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 707 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 708 ret void 709} 710 711define void @load_global_lo_v2f16_reglo_vreg(half addrspace(1)* %in, i32 %reg) #0 { 712; GFX900-LABEL: load_global_lo_v2f16_reglo_vreg: 713; GFX900: ; %bb.0: ; %entry 714; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 715; GFX900-NEXT: global_load_short_d16 v2, v[0:1], off offset:-4094 716; GFX900-NEXT: s_waitcnt vmcnt(0) 717; GFX900-NEXT: global_store_dword v[0:1], v2, off 718; GFX900-NEXT: s_waitcnt vmcnt(0) 719; GFX900-NEXT: s_setpc_b64 s[30:31] 720; 721; GFX906-LABEL: load_global_lo_v2f16_reglo_vreg: 722; GFX906: ; %bb.0: ; %entry 723; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 724; GFX906-NEXT: global_load_ushort v0, v[0:1], off offset:-4094 725; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 726; GFX906-NEXT: s_waitcnt vmcnt(0) 727; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 728; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 729; GFX906-NEXT: global_store_dword v[0:1], v0, off 730; GFX906-NEXT: s_waitcnt vmcnt(0) 731; GFX906-NEXT: s_setpc_b64 s[30:31] 732; 733; GFX803-LABEL: load_global_lo_v2f16_reglo_vreg: 734; GFX803: ; %bb.0: ; %entry 735; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 736; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff002, v0 737; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 738; GFX803-NEXT: flat_load_ushort v0, v[0:1] 739; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 740; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 741; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 742; GFX803-NEXT: flat_store_dword v[0:1], v0 743; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 744; GFX803-NEXT: s_setpc_b64 s[30:31] 745entry: 746 %reg.bc = bitcast i32 %reg to <2 x half> 747 %gep = getelementptr inbounds half, half addrspace(1)* %in, i64 -2047 748 %load = load half, half addrspace(1)* %gep 749 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 750 store <2 x half> %build1, <2 x half> addrspace(1)* undef 751 ret void 752} 753 754define void @load_global_lo_v2i16_reglo_vreg_zexti8(i8 addrspace(1)* %in, i32 %reg) #0 { 755; GFX900-LABEL: load_global_lo_v2i16_reglo_vreg_zexti8: 756; GFX900: ; %bb.0: ; %entry 757; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 758; GFX900-NEXT: global_load_ubyte_d16 v2, v[0:1], off offset:-4095 759; GFX900-NEXT: s_waitcnt vmcnt(0) 760; GFX900-NEXT: global_store_dword v[0:1], v2, off 761; GFX900-NEXT: s_waitcnt vmcnt(0) 762; GFX900-NEXT: s_setpc_b64 s[30:31] 763; 764; GFX906-LABEL: load_global_lo_v2i16_reglo_vreg_zexti8: 765; GFX906: ; %bb.0: ; %entry 766; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 767; GFX906-NEXT: global_load_ubyte v0, v[0:1], off offset:-4095 768; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 769; GFX906-NEXT: s_waitcnt vmcnt(0) 770; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 771; GFX906-NEXT: global_store_dword v[0:1], v0, off 772; GFX906-NEXT: s_waitcnt vmcnt(0) 773; GFX906-NEXT: s_setpc_b64 s[30:31] 774; 775; GFX803-LABEL: load_global_lo_v2i16_reglo_vreg_zexti8: 776; GFX803: ; %bb.0: ; %entry 777; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 778; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 779; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 780; GFX803-NEXT: flat_load_ubyte v0, v[0:1] 781; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v2 782; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 783; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 784; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 785; GFX803-NEXT: flat_store_dword v[0:1], v0 786; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 787; GFX803-NEXT: s_setpc_b64 s[30:31] 788entry: 789 %reg.bc = bitcast i32 %reg to <2 x i16> 790 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 791 %load = load i8, i8 addrspace(1)* %gep 792 %ext = zext i8 %load to i16 793 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 794 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 795 ret void 796} 797 798define void @load_global_lo_v2i16_reglo_vreg_sexti8(i8 addrspace(1)* %in, i32 %reg) #0 { 799; GFX900-LABEL: load_global_lo_v2i16_reglo_vreg_sexti8: 800; GFX900: ; %bb.0: ; %entry 801; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 802; GFX900-NEXT: global_load_sbyte_d16 v2, v[0:1], off offset:-4095 803; GFX900-NEXT: s_waitcnt vmcnt(0) 804; GFX900-NEXT: global_store_dword v[0:1], v2, off 805; GFX900-NEXT: s_waitcnt vmcnt(0) 806; GFX900-NEXT: s_setpc_b64 s[30:31] 807; 808; GFX906-LABEL: load_global_lo_v2i16_reglo_vreg_sexti8: 809; GFX906: ; %bb.0: ; %entry 810; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 811; GFX906-NEXT: global_load_sbyte v0, v[0:1], off offset:-4095 812; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 813; GFX906-NEXT: s_waitcnt vmcnt(0) 814; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 815; GFX906-NEXT: global_store_dword v[0:1], v0, off 816; GFX906-NEXT: s_waitcnt vmcnt(0) 817; GFX906-NEXT: s_setpc_b64 s[30:31] 818; 819; GFX803-LABEL: load_global_lo_v2i16_reglo_vreg_sexti8: 820; GFX803: ; %bb.0: ; %entry 821; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 822; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 823; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 824; GFX803-NEXT: flat_load_sbyte v0, v[0:1] 825; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 826; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 827; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 828; GFX803-NEXT: flat_store_dword v[0:1], v0 829; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 830; GFX803-NEXT: s_setpc_b64 s[30:31] 831entry: 832 %reg.bc = bitcast i32 %reg to <2 x i16> 833 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 834 %load = load i8, i8 addrspace(1)* %gep 835 %ext = sext i8 %load to i16 836 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 837 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 838 ret void 839} 840 841define void @load_global_lo_v2f16_reglo_vreg_zexti8(i8 addrspace(1)* %in, i32 %reg) #0 { 842; GFX900-LABEL: load_global_lo_v2f16_reglo_vreg_zexti8: 843; GFX900: ; %bb.0: ; %entry 844; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 845; GFX900-NEXT: global_load_ubyte_d16 v2, v[0:1], off offset:-4095 846; GFX900-NEXT: s_waitcnt vmcnt(0) 847; GFX900-NEXT: global_store_dword v[0:1], v2, off 848; GFX900-NEXT: s_waitcnt vmcnt(0) 849; GFX900-NEXT: s_setpc_b64 s[30:31] 850; 851; GFX906-LABEL: load_global_lo_v2f16_reglo_vreg_zexti8: 852; GFX906: ; %bb.0: ; %entry 853; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 854; GFX906-NEXT: global_load_ubyte v0, v[0:1], off offset:-4095 855; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 856; GFX906-NEXT: s_waitcnt vmcnt(0) 857; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 858; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 859; GFX906-NEXT: global_store_dword v[0:1], v0, off 860; GFX906-NEXT: s_waitcnt vmcnt(0) 861; GFX906-NEXT: s_setpc_b64 s[30:31] 862; 863; GFX803-LABEL: load_global_lo_v2f16_reglo_vreg_zexti8: 864; GFX803: ; %bb.0: ; %entry 865; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 866; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 867; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 868; GFX803-NEXT: flat_load_ubyte v0, v[0:1] 869; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v2 870; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 871; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 872; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 873; GFX803-NEXT: flat_store_dword v[0:1], v0 874; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 875; GFX803-NEXT: s_setpc_b64 s[30:31] 876entry: 877 %reg.bc = bitcast i32 %reg to <2 x half> 878 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 879 %load = load i8, i8 addrspace(1)* %gep 880 %ext = zext i8 %load to i16 881 %bitcast = bitcast i16 %ext to half 882 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 883 store <2 x half> %build1, <2 x half> addrspace(1)* undef 884 ret void 885} 886 887define void @load_global_lo_v2f16_reglo_vreg_sexti8(i8 addrspace(1)* %in, i32 %reg) #0 { 888; GFX900-LABEL: load_global_lo_v2f16_reglo_vreg_sexti8: 889; GFX900: ; %bb.0: ; %entry 890; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 891; GFX900-NEXT: global_load_sbyte_d16 v2, v[0:1], off offset:-4095 892; GFX900-NEXT: s_waitcnt vmcnt(0) 893; GFX900-NEXT: global_store_dword v[0:1], v2, off 894; GFX900-NEXT: s_waitcnt vmcnt(0) 895; GFX900-NEXT: s_setpc_b64 s[30:31] 896; 897; GFX906-LABEL: load_global_lo_v2f16_reglo_vreg_sexti8: 898; GFX906: ; %bb.0: ; %entry 899; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 900; GFX906-NEXT: global_load_sbyte v0, v[0:1], off offset:-4095 901; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 902; GFX906-NEXT: s_waitcnt vmcnt(0) 903; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 904; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 905; GFX906-NEXT: global_store_dword v[0:1], v0, off 906; GFX906-NEXT: s_waitcnt vmcnt(0) 907; GFX906-NEXT: s_setpc_b64 s[30:31] 908; 909; GFX803-LABEL: load_global_lo_v2f16_reglo_vreg_sexti8: 910; GFX803: ; %bb.0: ; %entry 911; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 912; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 913; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 914; GFX803-NEXT: flat_load_sbyte v0, v[0:1] 915; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 916; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 917; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 918; GFX803-NEXT: flat_store_dword v[0:1], v0 919; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 920; GFX803-NEXT: s_setpc_b64 s[30:31] 921entry: 922 %reg.bc = bitcast i32 %reg to <2 x half> 923 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 924 %load = load i8, i8 addrspace(1)* %gep 925 %ext = sext i8 %load to i16 926 %bitcast = bitcast i16 %ext to half 927 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 928 store <2 x half> %build1, <2 x half> addrspace(1)* undef 929 ret void 930} 931 932define void @load_flat_lo_v2i16_reghi_vreg(i16* %in, i32 %reg) #0 { 933; GFX900-LABEL: load_flat_lo_v2i16_reghi_vreg: 934; GFX900: ; %bb.0: ; %entry 935; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 936; GFX900-NEXT: flat_load_short_d16 v2, v[0:1] 937; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 938; GFX900-NEXT: global_store_dword v[0:1], v2, off 939; GFX900-NEXT: s_waitcnt vmcnt(0) 940; GFX900-NEXT: s_setpc_b64 s[30:31] 941; 942; GFX906-LABEL: load_flat_lo_v2i16_reghi_vreg: 943; GFX906: ; %bb.0: ; %entry 944; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 945; GFX906-NEXT: flat_load_ushort v0, v[0:1] 946; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 947; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 948; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 949; GFX906-NEXT: global_store_dword v[0:1], v0, off 950; GFX906-NEXT: s_waitcnt vmcnt(0) 951; GFX906-NEXT: s_setpc_b64 s[30:31] 952; 953; GFX803-LABEL: load_flat_lo_v2i16_reghi_vreg: 954; GFX803: ; %bb.0: ; %entry 955; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 956; GFX803-NEXT: flat_load_ushort v0, v[0:1] 957; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 958; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 959; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 960; GFX803-NEXT: flat_store_dword v[0:1], v0 961; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 962; GFX803-NEXT: s_setpc_b64 s[30:31] 963entry: 964 %reg.bc = bitcast i32 %reg to <2 x i16> 965 %load = load i16, i16* %in 966 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 967 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 968 ret void 969} 970 971define void @load_flat_lo_v2f16_reghi_vreg(half* %in, i32 %reg) #0 { 972; GFX900-LABEL: load_flat_lo_v2f16_reghi_vreg: 973; GFX900: ; %bb.0: ; %entry 974; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 975; GFX900-NEXT: flat_load_short_d16 v2, v[0:1] 976; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 977; GFX900-NEXT: global_store_dword v[0:1], v2, off 978; GFX900-NEXT: s_waitcnt vmcnt(0) 979; GFX900-NEXT: s_setpc_b64 s[30:31] 980; 981; GFX906-LABEL: load_flat_lo_v2f16_reghi_vreg: 982; GFX906: ; %bb.0: ; %entry 983; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 984; GFX906-NEXT: flat_load_ushort v0, v[0:1] 985; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 986; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 987; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 988; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 989; GFX906-NEXT: global_store_dword v[0:1], v0, off 990; GFX906-NEXT: s_waitcnt vmcnt(0) 991; GFX906-NEXT: s_setpc_b64 s[30:31] 992; 993; GFX803-LABEL: load_flat_lo_v2f16_reghi_vreg: 994; GFX803: ; %bb.0: ; %entry 995; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 996; GFX803-NEXT: flat_load_ushort v0, v[0:1] 997; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 998; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 999; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1000; GFX803-NEXT: flat_store_dword v[0:1], v0 1001; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1002; GFX803-NEXT: s_setpc_b64 s[30:31] 1003 1004; FIXME: the and above should be removable 1005entry: 1006 %reg.bc = bitcast i32 %reg to <2 x half> 1007 %load = load half, half* %in 1008 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 1009 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1010 ret void 1011} 1012 1013define void @load_flat_lo_v2i16_reglo_vreg_zexti8(i8* %in, i32 %reg) #0 { 1014; GFX900-LABEL: load_flat_lo_v2i16_reglo_vreg_zexti8: 1015; GFX900: ; %bb.0: ; %entry 1016; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1017; GFX900-NEXT: flat_load_ubyte_d16 v2, v[0:1] 1018; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1019; GFX900-NEXT: global_store_dword v[0:1], v2, off 1020; GFX900-NEXT: s_waitcnt vmcnt(0) 1021; GFX900-NEXT: s_setpc_b64 s[30:31] 1022; 1023; GFX906-LABEL: load_flat_lo_v2i16_reglo_vreg_zexti8: 1024; GFX906: ; %bb.0: ; %entry 1025; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1026; GFX906-NEXT: flat_load_ubyte v0, v[0:1] 1027; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 1028; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1029; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 1030; GFX906-NEXT: global_store_dword v[0:1], v0, off 1031; GFX906-NEXT: s_waitcnt vmcnt(0) 1032; GFX906-NEXT: s_setpc_b64 s[30:31] 1033; 1034; GFX803-LABEL: load_flat_lo_v2i16_reglo_vreg_zexti8: 1035; GFX803: ; %bb.0: ; %entry 1036; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1037; GFX803-NEXT: flat_load_ubyte v0, v[0:1] 1038; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1039; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1040; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1041; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 1042; GFX803-NEXT: flat_store_dword v[0:1], v0 1043; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1044; GFX803-NEXT: s_setpc_b64 s[30:31] 1045entry: 1046 %reg.bc = bitcast i32 %reg to <2 x i16> 1047 %load = load i8, i8* %in 1048 %ext = zext i8 %load to i16 1049 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1050 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1051 ret void 1052} 1053 1054define void @load_flat_lo_v2i16_reglo_vreg_sexti8(i8* %in, i32 %reg) #0 { 1055; GFX900-LABEL: load_flat_lo_v2i16_reglo_vreg_sexti8: 1056; GFX900: ; %bb.0: ; %entry 1057; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1058; GFX900-NEXT: flat_load_sbyte_d16 v2, v[0:1] 1059; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1060; GFX900-NEXT: global_store_dword v[0:1], v2, off 1061; GFX900-NEXT: s_waitcnt vmcnt(0) 1062; GFX900-NEXT: s_setpc_b64 s[30:31] 1063; 1064; GFX906-LABEL: load_flat_lo_v2i16_reglo_vreg_sexti8: 1065; GFX906: ; %bb.0: ; %entry 1066; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1067; GFX906-NEXT: flat_load_sbyte v0, v[0:1] 1068; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 1069; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1070; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 1071; GFX906-NEXT: global_store_dword v[0:1], v0, off 1072; GFX906-NEXT: s_waitcnt vmcnt(0) 1073; GFX906-NEXT: s_setpc_b64 s[30:31] 1074; 1075; GFX803-LABEL: load_flat_lo_v2i16_reglo_vreg_sexti8: 1076; GFX803: ; %bb.0: ; %entry 1077; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1078; GFX803-NEXT: flat_load_sbyte v0, v[0:1] 1079; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 1080; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1081; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1082; GFX803-NEXT: flat_store_dword v[0:1], v0 1083; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1084; GFX803-NEXT: s_setpc_b64 s[30:31] 1085entry: 1086 %reg.bc = bitcast i32 %reg to <2 x i16> 1087 %load = load i8, i8* %in 1088 %ext = sext i8 %load to i16 1089 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1090 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1091 ret void 1092} 1093 1094define void @load_flat_lo_v2f16_reglo_vreg_zexti8(i8* %in, i32 %reg) #0 { 1095; GFX900-LABEL: load_flat_lo_v2f16_reglo_vreg_zexti8: 1096; GFX900: ; %bb.0: ; %entry 1097; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1098; GFX900-NEXT: flat_load_ubyte_d16 v2, v[0:1] 1099; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1100; GFX900-NEXT: global_store_dword v[0:1], v2, off 1101; GFX900-NEXT: s_waitcnt vmcnt(0) 1102; GFX900-NEXT: s_setpc_b64 s[30:31] 1103; 1104; GFX906-LABEL: load_flat_lo_v2f16_reglo_vreg_zexti8: 1105; GFX906: ; %bb.0: ; %entry 1106; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1107; GFX906-NEXT: flat_load_ubyte v0, v[0:1] 1108; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1109; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1110; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1111; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1112; GFX906-NEXT: global_store_dword v[0:1], v0, off 1113; GFX906-NEXT: s_waitcnt vmcnt(0) 1114; GFX906-NEXT: s_setpc_b64 s[30:31] 1115; 1116; GFX803-LABEL: load_flat_lo_v2f16_reglo_vreg_zexti8: 1117; GFX803: ; %bb.0: ; %entry 1118; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1119; GFX803-NEXT: flat_load_ubyte v0, v[0:1] 1120; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1121; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1122; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1123; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 1124; GFX803-NEXT: flat_store_dword v[0:1], v0 1125; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1126; GFX803-NEXT: s_setpc_b64 s[30:31] 1127entry: 1128 %reg.bc = bitcast i32 %reg to <2 x half> 1129 %load = load i8, i8* %in 1130 %ext = zext i8 %load to i16 1131 %bitcast = bitcast i16 %ext to half 1132 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 1133 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1134 ret void 1135} 1136 1137define void @load_flat_lo_v2f16_reglo_vreg_sexti8(i8* %in, i32 %reg) #0 { 1138; GFX900-LABEL: load_flat_lo_v2f16_reglo_vreg_sexti8: 1139; GFX900: ; %bb.0: ; %entry 1140; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1141; GFX900-NEXT: flat_load_sbyte_d16 v2, v[0:1] 1142; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1143; GFX900-NEXT: global_store_dword v[0:1], v2, off 1144; GFX900-NEXT: s_waitcnt vmcnt(0) 1145; GFX900-NEXT: s_setpc_b64 s[30:31] 1146; 1147; GFX906-LABEL: load_flat_lo_v2f16_reglo_vreg_sexti8: 1148; GFX906: ; %bb.0: ; %entry 1149; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1150; GFX906-NEXT: flat_load_sbyte v0, v[0:1] 1151; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1152; GFX906-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1153; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1154; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1155; GFX906-NEXT: global_store_dword v[0:1], v0, off 1156; GFX906-NEXT: s_waitcnt vmcnt(0) 1157; GFX906-NEXT: s_setpc_b64 s[30:31] 1158; 1159; GFX803-LABEL: load_flat_lo_v2f16_reglo_vreg_sexti8: 1160; GFX803: ; %bb.0: ; %entry 1161; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1162; GFX803-NEXT: flat_load_sbyte v0, v[0:1] 1163; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 1164; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1165; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1166; GFX803-NEXT: flat_store_dword v[0:1], v0 1167; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1168; GFX803-NEXT: s_setpc_b64 s[30:31] 1169entry: 1170 %reg.bc = bitcast i32 %reg to <2 x half> 1171 %load = load i8, i8* %in 1172 %ext = sext i8 %load to i16 1173 %bitcast = bitcast i16 %ext to half 1174 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 1175 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1176 ret void 1177} 1178 1179define void @load_private_lo_v2i16_reglo_vreg(i16 addrspace(5)* byval %in, i32 %reg) #0 { 1180; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg: 1181; GFX900: ; %bb.0: ; %entry 1182; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1183; GFX900-NEXT: buffer_load_short_d16 v0, off, s[0:3], s32 offset:4094 1184; GFX900-NEXT: s_waitcnt vmcnt(0) 1185; GFX900-NEXT: global_store_dword v[0:1], v0, off 1186; GFX900-NEXT: s_waitcnt vmcnt(0) 1187; GFX900-NEXT: s_setpc_b64 s[30:31] 1188; 1189; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg: 1190; GFX906: ; %bb.0: ; %entry 1191; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1192; GFX906-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1193; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1194; GFX906-NEXT: s_waitcnt vmcnt(0) 1195; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1196; GFX906-NEXT: global_store_dword v[0:1], v0, off 1197; GFX906-NEXT: s_waitcnt vmcnt(0) 1198; GFX906-NEXT: s_setpc_b64 s[30:31] 1199; 1200; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg: 1201; GFX803: ; %bb.0: ; %entry 1202; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1203; GFX803-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1204; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1205; GFX803-NEXT: s_waitcnt vmcnt(0) 1206; GFX803-NEXT: v_or_b32_e32 v0, v1, v0 1207; GFX803-NEXT: flat_store_dword v[0:1], v0 1208; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1209; GFX803-NEXT: s_setpc_b64 s[30:31] 1210entry: 1211 %reg.bc = bitcast i32 %reg to <2 x i16> 1212 %gep = getelementptr inbounds i16, i16 addrspace(5)* %in, i64 2047 1213 %load = load i16, i16 addrspace(5)* %gep 1214 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 1215 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1216 ret void 1217} 1218 1219define void @load_private_lo_v2i16_reghi_vreg(i16 addrspace(5)* byval %in, i16 %reg) #0 { 1220; GFX900-LABEL: load_private_lo_v2i16_reghi_vreg: 1221; GFX900: ; %bb.0: ; %entry 1222; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1223; GFX900-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1224; GFX900-NEXT: s_waitcnt vmcnt(0) 1225; GFX900-NEXT: v_and_b32_e32 v1, 0xffff, v1 1226; GFX900-NEXT: v_lshl_or_b32 v0, v0, 16, v1 1227; GFX900-NEXT: global_store_dword v[0:1], v0, off 1228; GFX900-NEXT: s_waitcnt vmcnt(0) 1229; GFX900-NEXT: s_setpc_b64 s[30:31] 1230; 1231; GFX906-LABEL: load_private_lo_v2i16_reghi_vreg: 1232; GFX906: ; %bb.0: ; %entry 1233; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1234; GFX906-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1235; GFX906-NEXT: s_waitcnt vmcnt(0) 1236; GFX906-NEXT: v_and_b32_e32 v1, 0xffff, v1 1237; GFX906-NEXT: v_lshl_or_b32 v0, v0, 16, v1 1238; GFX906-NEXT: global_store_dword v[0:1], v0, off 1239; GFX906-NEXT: s_waitcnt vmcnt(0) 1240; GFX906-NEXT: s_setpc_b64 s[30:31] 1241; 1242; GFX803-LABEL: load_private_lo_v2i16_reghi_vreg: 1243; GFX803: ; %bb.0: ; %entry 1244; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1245; GFX803-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1246; GFX803-NEXT: v_lshlrev_b32_e32 v0, 16, v0 1247; GFX803-NEXT: s_waitcnt vmcnt(0) 1248; GFX803-NEXT: v_or_b32_e32 v0, v1, v0 1249; GFX803-NEXT: flat_store_dword v[0:1], v0 1250; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1251; GFX803-NEXT: s_setpc_b64 s[30:31] 1252entry: 1253 %gep = getelementptr inbounds i16, i16 addrspace(5)* %in, i64 2047 1254 %load = load i16, i16 addrspace(5)* %gep 1255 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 1 1256 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 0 1257 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1258 ret void 1259} 1260 1261define void @load_private_lo_v2f16_reglo_vreg(half addrspace(5)* byval %in, i32 %reg) #0 { 1262; GFX900-LABEL: load_private_lo_v2f16_reglo_vreg: 1263; GFX900: ; %bb.0: ; %entry 1264; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1265; GFX900-NEXT: buffer_load_short_d16 v0, off, s[0:3], s32 offset:4094 1266; GFX900-NEXT: s_waitcnt vmcnt(0) 1267; GFX900-NEXT: global_store_dword v[0:1], v0, off 1268; GFX900-NEXT: s_waitcnt vmcnt(0) 1269; GFX900-NEXT: s_setpc_b64 s[30:31] 1270; 1271; GFX906-LABEL: load_private_lo_v2f16_reglo_vreg: 1272; GFX906: ; %bb.0: ; %entry 1273; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1274; GFX906-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1275; GFX906-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1276; GFX906-NEXT: s_waitcnt vmcnt(0) 1277; GFX906-NEXT: v_and_b32_e32 v1, 0xffff, v1 1278; GFX906-NEXT: v_lshl_or_b32 v0, v0, 16, v1 1279; GFX906-NEXT: global_store_dword v[0:1], v0, off 1280; GFX906-NEXT: s_waitcnt vmcnt(0) 1281; GFX906-NEXT: s_setpc_b64 s[30:31] 1282; 1283; GFX803-LABEL: load_private_lo_v2f16_reglo_vreg: 1284; GFX803: ; %bb.0: ; %entry 1285; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1286; GFX803-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1287; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1288; GFX803-NEXT: s_waitcnt vmcnt(0) 1289; GFX803-NEXT: v_or_b32_e32 v0, v1, v0 1290; GFX803-NEXT: flat_store_dword v[0:1], v0 1291; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1292; GFX803-NEXT: s_setpc_b64 s[30:31] 1293entry: 1294 %reg.bc = bitcast i32 %reg to <2 x half> 1295 %gep = getelementptr inbounds half, half addrspace(5)* %in, i64 2047 1296 %load = load half, half addrspace(5)* %gep 1297 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 1298 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1299 ret void 1300} 1301 1302define void @load_private_lo_v2i16_reglo_vreg_nooff(i16 addrspace(5)* %in, i32 %reg) #0 { 1303; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_nooff: 1304; GFX900: ; %bb.0: ; %entry 1305; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1306; GFX900-NEXT: buffer_load_short_d16 v1, off, s[0:3], s33 offset:4094 1307; GFX900-NEXT: s_waitcnt vmcnt(0) 1308; GFX900-NEXT: global_store_dword v[0:1], v1, off 1309; GFX900-NEXT: s_waitcnt vmcnt(0) 1310; GFX900-NEXT: s_setpc_b64 s[30:31] 1311; 1312; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_nooff: 1313; GFX906: ; %bb.0: ; %entry 1314; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1315; GFX906-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1316; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1317; GFX906-NEXT: s_waitcnt vmcnt(0) 1318; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 1319; GFX906-NEXT: global_store_dword v[0:1], v0, off 1320; GFX906-NEXT: s_waitcnt vmcnt(0) 1321; GFX906-NEXT: s_setpc_b64 s[30:31] 1322; 1323; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_nooff: 1324; GFX803: ; %bb.0: ; %entry 1325; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1326; GFX803-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1327; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 1328; GFX803-NEXT: s_waitcnt vmcnt(0) 1329; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1330; GFX803-NEXT: flat_store_dword v[0:1], v0 1331; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1332; GFX803-NEXT: s_setpc_b64 s[30:31] 1333entry: 1334 %reg.bc = bitcast i32 %reg to <2 x i16> 1335 %load = load volatile i16, i16 addrspace(5)* inttoptr (i32 4094 to i16 addrspace(5)*) 1336 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 1337 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1338 ret void 1339} 1340 1341define void @load_private_lo_v2i16_reghi_vreg_nooff(i16 addrspace(5)* %in, i32 %reg) #0 { 1342; GFX900-LABEL: load_private_lo_v2i16_reghi_vreg_nooff: 1343; GFX900: ; %bb.0: ; %entry 1344; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1345; GFX900-NEXT: buffer_load_short_d16 v1, off, s[0:3], s33 offset:4094 1346; GFX900-NEXT: s_waitcnt vmcnt(0) 1347; GFX900-NEXT: global_store_dword v[0:1], v1, off 1348; GFX900-NEXT: s_waitcnt vmcnt(0) 1349; GFX900-NEXT: s_setpc_b64 s[30:31] 1350; 1351; GFX906-LABEL: load_private_lo_v2i16_reghi_vreg_nooff: 1352; GFX906: ; %bb.0: ; %entry 1353; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1354; GFX906-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1355; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1356; GFX906-NEXT: s_waitcnt vmcnt(0) 1357; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 1358; GFX906-NEXT: global_store_dword v[0:1], v0, off 1359; GFX906-NEXT: s_waitcnt vmcnt(0) 1360; GFX906-NEXT: s_setpc_b64 s[30:31] 1361; 1362; GFX803-LABEL: load_private_lo_v2i16_reghi_vreg_nooff: 1363; GFX803: ; %bb.0: ; %entry 1364; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1365; GFX803-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1366; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 1367; GFX803-NEXT: s_waitcnt vmcnt(0) 1368; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1369; GFX803-NEXT: flat_store_dword v[0:1], v0 1370; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1371; GFX803-NEXT: s_setpc_b64 s[30:31] 1372entry: 1373 %reg.bc = bitcast i32 %reg to <2 x i16> 1374 %load = load volatile i16, i16 addrspace(5)* inttoptr (i32 4094 to i16 addrspace(5)*) 1375 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 1376 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1377 ret void 1378} 1379 1380define void @load_private_lo_v2f16_reglo_vreg_nooff(half addrspace(5)* %in, i32 %reg) #0 { 1381; GFX900-LABEL: load_private_lo_v2f16_reglo_vreg_nooff: 1382; GFX900: ; %bb.0: ; %entry 1383; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1384; GFX900-NEXT: buffer_load_short_d16 v1, off, s[0:3], s33 offset:4094 1385; GFX900-NEXT: s_waitcnt vmcnt(0) 1386; GFX900-NEXT: global_store_dword v[0:1], v1, off 1387; GFX900-NEXT: s_waitcnt vmcnt(0) 1388; GFX900-NEXT: s_setpc_b64 s[30:31] 1389; 1390; GFX906-LABEL: load_private_lo_v2f16_reglo_vreg_nooff: 1391; GFX906: ; %bb.0: ; %entry 1392; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1393; GFX906-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1394; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v1 1395; GFX906-NEXT: s_waitcnt vmcnt(0) 1396; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1397; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1398; GFX906-NEXT: global_store_dword v[0:1], v0, off 1399; GFX906-NEXT: s_waitcnt vmcnt(0) 1400; GFX906-NEXT: s_setpc_b64 s[30:31] 1401; 1402; GFX803-LABEL: load_private_lo_v2f16_reglo_vreg_nooff: 1403; GFX803: ; %bb.0: ; %entry 1404; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1405; GFX803-NEXT: buffer_load_ushort v0, off, s[0:3], s33 offset:4094 1406; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 1407; GFX803-NEXT: s_waitcnt vmcnt(0) 1408; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1409; GFX803-NEXT: flat_store_dword v[0:1], v0 1410; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1411; GFX803-NEXT: s_setpc_b64 s[30:31] 1412entry: 1413 %reg.bc = bitcast i32 %reg to <2 x half> 1414 %load = load volatile half, half addrspace(5)* inttoptr (i32 4094 to half addrspace(5)*) 1415 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 1416 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1417 ret void 1418} 1419 1420define void @load_private_lo_v2i16_reglo_vreg_zexti8(i8 addrspace(5)* byval %in, i32 %reg) #0 { 1421; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8: 1422; GFX900: ; %bb.0: ; %entry 1423; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1424; GFX900-NEXT: buffer_load_ubyte_d16 v0, off, s[0:3], s32 offset:4095 1425; GFX900-NEXT: s_waitcnt vmcnt(0) 1426; GFX900-NEXT: global_store_dword v[0:1], v0, off 1427; GFX900-NEXT: s_waitcnt vmcnt(0) 1428; GFX900-NEXT: s_setpc_b64 s[30:31] 1429; 1430; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8: 1431; GFX906: ; %bb.0: ; %entry 1432; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1433; GFX906-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 1434; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1435; GFX906-NEXT: s_waitcnt vmcnt(0) 1436; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1437; GFX906-NEXT: global_store_dword v[0:1], v0, off 1438; GFX906-NEXT: s_waitcnt vmcnt(0) 1439; GFX906-NEXT: s_setpc_b64 s[30:31] 1440; 1441; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8: 1442; GFX803: ; %bb.0: ; %entry 1443; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1444; GFX803-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 1445; GFX803-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1446; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1447; GFX803-NEXT: s_waitcnt vmcnt(0) 1448; GFX803-NEXT: v_perm_b32 v0, v0, v1, s4 1449; GFX803-NEXT: flat_store_dword v[0:1], v0 1450; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1451; GFX803-NEXT: s_setpc_b64 s[30:31] 1452entry: 1453 %reg.bc = bitcast i32 %reg to <2 x i16> 1454 %gep = getelementptr inbounds i8, i8 addrspace(5)* %in, i64 4095 1455 %load = load i8, i8 addrspace(5)* %gep 1456 %ext = zext i8 %load to i16 1457 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1458 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1459 ret void 1460} 1461 1462define void @load_private_lo_v2i16_reglo_vreg_sexti8(i8 addrspace(5)* byval %in, i32 %reg) #0 { 1463; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8: 1464; GFX900: ; %bb.0: ; %entry 1465; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1466; GFX900-NEXT: buffer_load_sbyte_d16 v0, off, s[0:3], s32 offset:4095 1467; GFX900-NEXT: s_waitcnt vmcnt(0) 1468; GFX900-NEXT: global_store_dword v[0:1], v0, off 1469; GFX900-NEXT: s_waitcnt vmcnt(0) 1470; GFX900-NEXT: s_setpc_b64 s[30:31] 1471; 1472; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8: 1473; GFX906: ; %bb.0: ; %entry 1474; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1475; GFX906-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1476; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1477; GFX906-NEXT: s_waitcnt vmcnt(0) 1478; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1479; GFX906-NEXT: global_store_dword v[0:1], v0, off 1480; GFX906-NEXT: s_waitcnt vmcnt(0) 1481; GFX906-NEXT: s_setpc_b64 s[30:31] 1482; 1483; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8: 1484; GFX803: ; %bb.0: ; %entry 1485; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1486; GFX803-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1487; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1488; GFX803-NEXT: s_waitcnt vmcnt(0) 1489; GFX803-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1490; GFX803-NEXT: flat_store_dword v[0:1], v0 1491; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1492; GFX803-NEXT: s_setpc_b64 s[30:31] 1493entry: 1494 %reg.bc = bitcast i32 %reg to <2 x i16> 1495 %gep = getelementptr inbounds i8, i8 addrspace(5)* %in, i64 4095 1496 %load = load i8, i8 addrspace(5)* %gep 1497 %ext = sext i8 %load to i16 1498 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1499 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1500 ret void 1501} 1502 1503define void @load_private_lo_v2i16_reglo_vreg_nooff_zexti8(i8 addrspace(5)* %in, i32 %reg) #0 { 1504; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_zexti8: 1505; GFX900: ; %bb.0: ; %entry 1506; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1507; GFX900-NEXT: buffer_load_ubyte_d16 v1, off, s[0:3], s33 offset:4094 1508; GFX900-NEXT: s_waitcnt vmcnt(0) 1509; GFX900-NEXT: global_store_dword v[0:1], v1, off 1510; GFX900-NEXT: s_waitcnt vmcnt(0) 1511; GFX900-NEXT: s_setpc_b64 s[30:31] 1512; 1513; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_zexti8: 1514; GFX906: ; %bb.0: ; %entry 1515; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1516; GFX906-NEXT: buffer_load_ubyte v0, off, s[0:3], s33 offset:4094 1517; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1518; GFX906-NEXT: s_waitcnt vmcnt(0) 1519; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 1520; GFX906-NEXT: global_store_dword v[0:1], v0, off 1521; GFX906-NEXT: s_waitcnt vmcnt(0) 1522; GFX906-NEXT: s_setpc_b64 s[30:31] 1523; 1524; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_zexti8: 1525; GFX803: ; %bb.0: ; %entry 1526; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1527; GFX803-NEXT: buffer_load_ubyte v0, off, s[0:3], s33 offset:4094 1528; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v1 1529; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1530; GFX803-NEXT: s_waitcnt vmcnt(0) 1531; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 1532; GFX803-NEXT: flat_store_dword v[0:1], v0 1533; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1534; GFX803-NEXT: s_setpc_b64 s[30:31] 1535entry: 1536 %reg.bc = bitcast i32 %reg to <2 x i16> 1537 %load = load volatile i8, i8 addrspace(5)* inttoptr (i32 4094 to i8 addrspace(5)*) 1538 %ext = zext i8 %load to i16 1539 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1540 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1541 ret void 1542} 1543 1544define void @load_private_lo_v2i16_reglo_vreg_nooff_sexti8(i8 addrspace(5)* %in, i32 %reg) #0 { 1545; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_sexti8: 1546; GFX900: ; %bb.0: ; %entry 1547; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1548; GFX900-NEXT: buffer_load_sbyte_d16 v1, off, s[0:3], s33 offset:4094 1549; GFX900-NEXT: s_waitcnt vmcnt(0) 1550; GFX900-NEXT: global_store_dword v[0:1], v1, off 1551; GFX900-NEXT: s_waitcnt vmcnt(0) 1552; GFX900-NEXT: s_setpc_b64 s[30:31] 1553; 1554; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_sexti8: 1555; GFX906: ; %bb.0: ; %entry 1556; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1557; GFX906-NEXT: buffer_load_sbyte v0, off, s[0:3], s33 offset:4094 1558; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1559; GFX906-NEXT: s_waitcnt vmcnt(0) 1560; GFX906-NEXT: v_bfi_b32 v0, v2, v0, v1 1561; GFX906-NEXT: global_store_dword v[0:1], v0, off 1562; GFX906-NEXT: s_waitcnt vmcnt(0) 1563; GFX906-NEXT: s_setpc_b64 s[30:31] 1564; 1565; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_nooff_sexti8: 1566; GFX803: ; %bb.0: ; %entry 1567; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1568; GFX803-NEXT: buffer_load_sbyte v0, off, s[0:3], s33 offset:4094 1569; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v1 1570; GFX803-NEXT: s_waitcnt vmcnt(0) 1571; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1572; GFX803-NEXT: flat_store_dword v[0:1], v0 1573; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1574; GFX803-NEXT: s_setpc_b64 s[30:31] 1575entry: 1576 %reg.bc = bitcast i32 %reg to <2 x i16> 1577 %load = load volatile i8, i8 addrspace(5)* inttoptr (i32 4094 to i8 addrspace(5)*) 1578 %ext = sext i8 %load to i16 1579 %build1 = insertelement <2 x i16> %reg.bc, i16 %ext, i32 0 1580 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1581 ret void 1582} 1583 1584define void @load_private_lo_v2f16_reglo_vreg_nooff_zexti8(i8 addrspace(5)* %in, i32 %reg) #0 { 1585; GFX900-LABEL: load_private_lo_v2f16_reglo_vreg_nooff_zexti8: 1586; GFX900: ; %bb.0: ; %entry 1587; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1588; GFX900-NEXT: buffer_load_ubyte_d16 v1, off, s[0:3], s33 offset:4094 1589; GFX900-NEXT: s_waitcnt vmcnt(0) 1590; GFX900-NEXT: global_store_dword v[0:1], v1, off 1591; GFX900-NEXT: s_waitcnt vmcnt(0) 1592; GFX900-NEXT: s_setpc_b64 s[30:31] 1593; 1594; GFX906-LABEL: load_private_lo_v2f16_reglo_vreg_nooff_zexti8: 1595; GFX906: ; %bb.0: ; %entry 1596; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1597; GFX906-NEXT: buffer_load_ubyte v0, off, s[0:3], s33 offset:4094 1598; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v1 1599; GFX906-NEXT: s_waitcnt vmcnt(0) 1600; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1601; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1602; GFX906-NEXT: global_store_dword v[0:1], v0, off 1603; GFX906-NEXT: s_waitcnt vmcnt(0) 1604; GFX906-NEXT: s_setpc_b64 s[30:31] 1605; 1606; GFX803-LABEL: load_private_lo_v2f16_reglo_vreg_nooff_zexti8: 1607; GFX803: ; %bb.0: ; %entry 1608; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1609; GFX803-NEXT: buffer_load_ubyte v0, off, s[0:3], s33 offset:4094 1610; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v1 1611; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1612; GFX803-NEXT: s_waitcnt vmcnt(0) 1613; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 1614; GFX803-NEXT: flat_store_dword v[0:1], v0 1615; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1616; GFX803-NEXT: s_setpc_b64 s[30:31] 1617entry: 1618 %reg.bc = bitcast i32 %reg to <2 x half> 1619 %load = load volatile i8, i8 addrspace(5)* inttoptr (i32 4094 to i8 addrspace(5)*) 1620 %ext = zext i8 %load to i16 1621 %bc.ext = bitcast i16 %ext to half 1622 %build1 = insertelement <2 x half> %reg.bc, half %bc.ext, i32 0 1623 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1624 ret void 1625} 1626 1627define void @load_constant_lo_v2i16_reglo_vreg(i16 addrspace(4)* %in, i32 %reg) #0 { 1628; GFX900-LABEL: load_constant_lo_v2i16_reglo_vreg: 1629; GFX900: ; %bb.0: ; %entry 1630; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1631; GFX900-NEXT: global_load_short_d16 v2, v[0:1], off offset:-4094 1632; GFX900-NEXT: s_waitcnt vmcnt(0) 1633; GFX900-NEXT: global_store_dword v[0:1], v2, off 1634; GFX900-NEXT: s_waitcnt vmcnt(0) 1635; GFX900-NEXT: s_setpc_b64 s[30:31] 1636; 1637; GFX906-LABEL: load_constant_lo_v2i16_reglo_vreg: 1638; GFX906: ; %bb.0: ; %entry 1639; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1640; GFX906-NEXT: global_load_ushort v0, v[0:1], off offset:-4094 1641; GFX906-NEXT: v_mov_b32_e32 v1, 0xffff 1642; GFX906-NEXT: s_waitcnt vmcnt(0) 1643; GFX906-NEXT: v_bfi_b32 v0, v1, v0, v2 1644; GFX906-NEXT: global_store_dword v[0:1], v0, off 1645; GFX906-NEXT: s_waitcnt vmcnt(0) 1646; GFX906-NEXT: s_setpc_b64 s[30:31] 1647; 1648; GFX803-LABEL: load_constant_lo_v2i16_reglo_vreg: 1649; GFX803: ; %bb.0: ; %entry 1650; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1651; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff002, v0 1652; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 1653; GFX803-NEXT: flat_load_ushort v0, v[0:1] 1654; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 1655; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1656; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1657; GFX803-NEXT: flat_store_dword v[0:1], v0 1658; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1659; GFX803-NEXT: s_setpc_b64 s[30:31] 1660entry: 1661 %reg.bc = bitcast i32 %reg to <2 x i16> 1662 %gep = getelementptr inbounds i16, i16 addrspace(4)* %in, i64 -2047 1663 %load = load i16, i16 addrspace(4)* %gep 1664 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 1665 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1666 ret void 1667} 1668 1669define void @load_constant_lo_v2f16_reglo_vreg(half addrspace(4)* %in, i32 %reg) #0 { 1670; GFX900-LABEL: load_constant_lo_v2f16_reglo_vreg: 1671; GFX900: ; %bb.0: ; %entry 1672; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1673; GFX900-NEXT: global_load_short_d16 v2, v[0:1], off offset:-4094 1674; GFX900-NEXT: s_waitcnt vmcnt(0) 1675; GFX900-NEXT: global_store_dword v[0:1], v2, off 1676; GFX900-NEXT: s_waitcnt vmcnt(0) 1677; GFX900-NEXT: s_setpc_b64 s[30:31] 1678; 1679; GFX906-LABEL: load_constant_lo_v2f16_reglo_vreg: 1680; GFX906: ; %bb.0: ; %entry 1681; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1682; GFX906-NEXT: global_load_ushort v0, v[0:1], off offset:-4094 1683; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1684; GFX906-NEXT: s_waitcnt vmcnt(0) 1685; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1686; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1687; GFX906-NEXT: global_store_dword v[0:1], v0, off 1688; GFX906-NEXT: s_waitcnt vmcnt(0) 1689; GFX906-NEXT: s_setpc_b64 s[30:31] 1690; 1691; GFX803-LABEL: load_constant_lo_v2f16_reglo_vreg: 1692; GFX803: ; %bb.0: ; %entry 1693; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1694; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff002, v0 1695; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 1696; GFX803-NEXT: flat_load_ushort v0, v[0:1] 1697; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 1698; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1699; GFX803-NEXT: v_or_b32_e32 v0, v0, v1 1700; GFX803-NEXT: flat_store_dword v[0:1], v0 1701; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1702; GFX803-NEXT: s_setpc_b64 s[30:31] 1703entry: 1704 %reg.bc = bitcast i32 %reg to <2 x half> 1705 %gep = getelementptr inbounds half, half addrspace(4)* %in, i64 -2047 1706 %load = load half, half addrspace(4)* %gep 1707 %build1 = insertelement <2 x half> %reg.bc, half %load, i32 0 1708 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1709 ret void 1710} 1711 1712define void @load_constant_lo_v2f16_reglo_vreg_zexti8(i8 addrspace(4)* %in, i32 %reg) #0 { 1713; GFX900-LABEL: load_constant_lo_v2f16_reglo_vreg_zexti8: 1714; GFX900: ; %bb.0: ; %entry 1715; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1716; GFX900-NEXT: global_load_ubyte_d16 v2, v[0:1], off offset:-4095 1717; GFX900-NEXT: s_waitcnt vmcnt(0) 1718; GFX900-NEXT: global_store_dword v[0:1], v2, off 1719; GFX900-NEXT: s_waitcnt vmcnt(0) 1720; GFX900-NEXT: s_setpc_b64 s[30:31] 1721; 1722; GFX906-LABEL: load_constant_lo_v2f16_reglo_vreg_zexti8: 1723; GFX906: ; %bb.0: ; %entry 1724; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1725; GFX906-NEXT: global_load_ubyte v0, v[0:1], off offset:-4095 1726; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1727; GFX906-NEXT: s_waitcnt vmcnt(0) 1728; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1729; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1730; GFX906-NEXT: global_store_dword v[0:1], v0, off 1731; GFX906-NEXT: s_waitcnt vmcnt(0) 1732; GFX906-NEXT: s_setpc_b64 s[30:31] 1733; 1734; GFX803-LABEL: load_constant_lo_v2f16_reglo_vreg_zexti8: 1735; GFX803: ; %bb.0: ; %entry 1736; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1737; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 1738; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 1739; GFX803-NEXT: flat_load_ubyte v0, v[0:1] 1740; GFX803-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1741; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1742; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1743; GFX803-NEXT: v_perm_b32 v0, v1, v0, s4 1744; GFX803-NEXT: flat_store_dword v[0:1], v0 1745; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1746; GFX803-NEXT: s_setpc_b64 s[30:31] 1747entry: 1748 %reg.bc = bitcast i32 %reg to <2 x half> 1749 %gep = getelementptr inbounds i8, i8 addrspace(4)* %in, i64 -4095 1750 %load = load i8, i8 addrspace(4)* %gep 1751 %ext = zext i8 %load to i16 1752 %bitcast = bitcast i16 %ext to half 1753 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 1754 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1755 ret void 1756} 1757 1758define void @load_constant_lo_v2f16_reglo_vreg_sexti8(i8 addrspace(4)* %in, i32 %reg) #0 { 1759; GFX900-LABEL: load_constant_lo_v2f16_reglo_vreg_sexti8: 1760; GFX900: ; %bb.0: ; %entry 1761; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1762; GFX900-NEXT: global_load_sbyte_d16 v2, v[0:1], off offset:-4095 1763; GFX900-NEXT: s_waitcnt vmcnt(0) 1764; GFX900-NEXT: global_store_dword v[0:1], v2, off 1765; GFX900-NEXT: s_waitcnt vmcnt(0) 1766; GFX900-NEXT: s_setpc_b64 s[30:31] 1767; 1768; GFX906-LABEL: load_constant_lo_v2f16_reglo_vreg_sexti8: 1769; GFX906: ; %bb.0: ; %entry 1770; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1771; GFX906-NEXT: global_load_sbyte v0, v[0:1], off offset:-4095 1772; GFX906-NEXT: v_lshrrev_b32_e32 v1, 16, v2 1773; GFX906-NEXT: s_waitcnt vmcnt(0) 1774; GFX906-NEXT: v_and_b32_e32 v0, 0xffff, v0 1775; GFX906-NEXT: v_lshl_or_b32 v0, v1, 16, v0 1776; GFX906-NEXT: global_store_dword v[0:1], v0, off 1777; GFX906-NEXT: s_waitcnt vmcnt(0) 1778; GFX906-NEXT: s_setpc_b64 s[30:31] 1779; 1780; GFX803-LABEL: load_constant_lo_v2f16_reglo_vreg_sexti8: 1781; GFX803: ; %bb.0: ; %entry 1782; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1783; GFX803-NEXT: v_add_u32_e32 v0, vcc, 0xfffff001, v0 1784; GFX803-NEXT: v_addc_u32_e32 v1, vcc, -1, v1, vcc 1785; GFX803-NEXT: flat_load_sbyte v0, v[0:1] 1786; GFX803-NEXT: v_and_b32_e32 v1, 0xffff0000, v2 1787; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1788; GFX803-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1789; GFX803-NEXT: flat_store_dword v[0:1], v0 1790; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1791; GFX803-NEXT: s_setpc_b64 s[30:31] 1792entry: 1793 %reg.bc = bitcast i32 %reg to <2 x half> 1794 %gep = getelementptr inbounds i8, i8 addrspace(4)* %in, i64 -4095 1795 %load = load i8, i8 addrspace(4)* %gep 1796 %ext = sext i8 %load to i16 1797 %bitcast = bitcast i16 %ext to half 1798 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 1799 store <2 x half> %build1, <2 x half> addrspace(1)* undef 1800 ret void 1801} 1802 1803define void @load_private_lo_v2i16_reglo_vreg_to_offset(i32 %reg) #0 { 1804; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_to_offset: 1805; GFX900: ; %bb.0: ; %entry 1806; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1807; GFX900-NEXT: v_mov_b32_e32 v1, 0x7b 1808; GFX900-NEXT: buffer_store_dword v1, off, s[0:3], s32 1809; GFX900-NEXT: buffer_load_short_d16 v0, off, s[0:3], s32 offset:4094 1810; GFX900-NEXT: s_waitcnt vmcnt(0) 1811; GFX900-NEXT: global_store_dword v[0:1], v0, off 1812; GFX900-NEXT: s_waitcnt vmcnt(0) 1813; GFX900-NEXT: s_setpc_b64 s[30:31] 1814; 1815; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_to_offset: 1816; GFX906: ; %bb.0: ; %entry 1817; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1818; GFX906-NEXT: v_mov_b32_e32 v1, 0x7b 1819; GFX906-NEXT: buffer_store_dword v1, off, s[0:3], s32 1820; GFX906-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1821; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1822; GFX906-NEXT: s_waitcnt vmcnt(0) 1823; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1824; GFX906-NEXT: global_store_dword v[0:1], v0, off 1825; GFX906-NEXT: s_waitcnt vmcnt(0) 1826; GFX906-NEXT: s_setpc_b64 s[30:31] 1827; 1828; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_to_offset: 1829; GFX803: ; %bb.0: ; %entry 1830; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1831; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b 1832; GFX803-NEXT: buffer_store_dword v1, off, s[0:3], s32 1833; GFX803-NEXT: buffer_load_ushort v1, off, s[0:3], s32 offset:4094 1834; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1835; GFX803-NEXT: s_waitcnt vmcnt(0) 1836; GFX803-NEXT: v_or_b32_e32 v0, v1, v0 1837; GFX803-NEXT: flat_store_dword v[0:1], v0 1838; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1839; GFX803-NEXT: s_setpc_b64 s[30:31] 1840entry: 1841 %obj0 = alloca [10 x i32], align 4, addrspace(5) 1842 %obj1 = alloca [4096 x i16], align 2, addrspace(5) 1843 %reg.bc = bitcast i32 %reg to <2 x i16> 1844 %bc = bitcast [10 x i32] addrspace(5)* %obj0 to i32 addrspace(5)* 1845 store volatile i32 123, i32 addrspace(5)* %bc 1846 %gep = getelementptr inbounds [4096 x i16], [4096 x i16] addrspace(5)* %obj1, i32 0, i32 2027 1847 %load = load volatile i16, i16 addrspace(5)* %gep 1848 %build1 = insertelement <2 x i16> %reg.bc, i16 %load, i32 0 1849 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1850 ret void 1851} 1852 1853define void @load_private_lo_v2i16_reglo_vreg_sexti8_to_offset(i32 %reg) #0 { 1854; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8_to_offset: 1855; GFX900: ; %bb.0: ; %entry 1856; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1857; GFX900-NEXT: v_mov_b32_e32 v1, 0x7b 1858; GFX900-NEXT: buffer_store_dword v1, off, s[0:3], s32 1859; GFX900-NEXT: buffer_load_sbyte_d16 v0, off, s[0:3], s32 offset:4095 1860; GFX900-NEXT: s_waitcnt vmcnt(0) 1861; GFX900-NEXT: global_store_dword v[0:1], v0, off 1862; GFX900-NEXT: s_waitcnt vmcnt(0) 1863; GFX900-NEXT: s_setpc_b64 s[30:31] 1864; 1865; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8_to_offset: 1866; GFX906: ; %bb.0: ; %entry 1867; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1868; GFX906-NEXT: v_mov_b32_e32 v1, 0x7b 1869; GFX906-NEXT: buffer_store_dword v1, off, s[0:3], s32 1870; GFX906-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1871; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1872; GFX906-NEXT: s_waitcnt vmcnt(0) 1873; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1874; GFX906-NEXT: global_store_dword v[0:1], v0, off 1875; GFX906-NEXT: s_waitcnt vmcnt(0) 1876; GFX906-NEXT: s_setpc_b64 s[30:31] 1877; 1878; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_sexti8_to_offset: 1879; GFX803: ; %bb.0: ; %entry 1880; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1881; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b 1882; GFX803-NEXT: buffer_store_dword v1, off, s[0:3], s32 1883; GFX803-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1884; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1885; GFX803-NEXT: s_waitcnt vmcnt(0) 1886; GFX803-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1887; GFX803-NEXT: flat_store_dword v[0:1], v0 1888; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1889; GFX803-NEXT: s_setpc_b64 s[30:31] 1890entry: 1891 %obj0 = alloca [10 x i32], align 4, addrspace(5) 1892 %obj1 = alloca [4096 x i8], align 2, addrspace(5) 1893 %reg.bc = bitcast i32 %reg to <2 x i16> 1894 %bc = bitcast [10 x i32] addrspace(5)* %obj0 to i32 addrspace(5)* 1895 store volatile i32 123, i32 addrspace(5)* %bc 1896 %gep = getelementptr inbounds [4096 x i8], [4096 x i8] addrspace(5)* %obj1, i32 0, i32 4055 1897 %load = load volatile i8, i8 addrspace(5)* %gep 1898 %load.ext = sext i8 %load to i16 1899 %build1 = insertelement <2 x i16> %reg.bc, i16 %load.ext, i32 0 1900 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1901 ret void 1902} 1903 1904define void @load_private_lo_v2i16_reglo_vreg_zexti8_to_offset(i32 %reg) #0 { 1905; GFX900-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8_to_offset: 1906; GFX900: ; %bb.0: ; %entry 1907; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1908; GFX900-NEXT: v_mov_b32_e32 v1, 0x7b 1909; GFX900-NEXT: buffer_store_dword v1, off, s[0:3], s32 1910; GFX900-NEXT: buffer_load_ubyte_d16 v0, off, s[0:3], s32 offset:4095 1911; GFX900-NEXT: s_waitcnt vmcnt(0) 1912; GFX900-NEXT: global_store_dword v[0:1], v0, off 1913; GFX900-NEXT: s_waitcnt vmcnt(0) 1914; GFX900-NEXT: s_setpc_b64 s[30:31] 1915; 1916; GFX906-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8_to_offset: 1917; GFX906: ; %bb.0: ; %entry 1918; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1919; GFX906-NEXT: v_mov_b32_e32 v1, 0x7b 1920; GFX906-NEXT: buffer_store_dword v1, off, s[0:3], s32 1921; GFX906-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 1922; GFX906-NEXT: v_mov_b32_e32 v2, 0xffff 1923; GFX906-NEXT: s_waitcnt vmcnt(0) 1924; GFX906-NEXT: v_bfi_b32 v0, v2, v1, v0 1925; GFX906-NEXT: global_store_dword v[0:1], v0, off 1926; GFX906-NEXT: s_waitcnt vmcnt(0) 1927; GFX906-NEXT: s_setpc_b64 s[30:31] 1928; 1929; GFX803-LABEL: load_private_lo_v2i16_reglo_vreg_zexti8_to_offset: 1930; GFX803: ; %bb.0: ; %entry 1931; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1932; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b 1933; GFX803-NEXT: buffer_store_dword v1, off, s[0:3], s32 1934; GFX803-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 1935; GFX803-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1936; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 1937; GFX803-NEXT: s_waitcnt vmcnt(0) 1938; GFX803-NEXT: v_perm_b32 v0, v0, v1, s4 1939; GFX803-NEXT: flat_store_dword v[0:1], v0 1940; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1941; GFX803-NEXT: s_setpc_b64 s[30:31] 1942entry: 1943 %obj0 = alloca [10 x i32], align 4, addrspace(5) 1944 %obj1 = alloca [4096 x i8], align 2, addrspace(5) 1945 %reg.bc = bitcast i32 %reg to <2 x i16> 1946 %bc = bitcast [10 x i32] addrspace(5)* %obj0 to i32 addrspace(5)* 1947 store volatile i32 123, i32 addrspace(5)* %bc 1948 %gep = getelementptr inbounds [4096 x i8], [4096 x i8] addrspace(5)* %obj1, i32 0, i32 4055 1949 %load = load volatile i8, i8 addrspace(5)* %gep 1950 %load.ext = zext i8 %load to i16 1951 %build1 = insertelement <2 x i16> %reg.bc, i16 %load.ext, i32 0 1952 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 1953 ret void 1954} 1955 1956define void @load_private_lo_v2f16_reglo_vreg_sexti8_to_offset(i32 %reg) #0 { 1957; GFX900-LABEL: load_private_lo_v2f16_reglo_vreg_sexti8_to_offset: 1958; GFX900: ; %bb.0: ; %entry 1959; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1960; GFX900-NEXT: v_mov_b32_e32 v1, 0x7b 1961; GFX900-NEXT: buffer_store_dword v1, off, s[0:3], s32 1962; GFX900-NEXT: buffer_load_sbyte_d16 v0, off, s[0:3], s32 offset:4095 1963; GFX900-NEXT: s_waitcnt vmcnt(0) 1964; GFX900-NEXT: global_store_dword v[0:1], v0, off 1965; GFX900-NEXT: s_waitcnt vmcnt(0) 1966; GFX900-NEXT: s_setpc_b64 s[30:31] 1967; 1968; GFX906-LABEL: load_private_lo_v2f16_reglo_vreg_sexti8_to_offset: 1969; GFX906: ; %bb.0: ; %entry 1970; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1971; GFX906-NEXT: v_mov_b32_e32 v1, 0x7b 1972; GFX906-NEXT: buffer_store_dword v1, off, s[0:3], s32 1973; GFX906-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1974; GFX906-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1975; GFX906-NEXT: s_waitcnt vmcnt(0) 1976; GFX906-NEXT: v_and_b32_e32 v1, 0xffff, v1 1977; GFX906-NEXT: v_lshl_or_b32 v0, v0, 16, v1 1978; GFX906-NEXT: global_store_dword v[0:1], v0, off 1979; GFX906-NEXT: s_waitcnt vmcnt(0) 1980; GFX906-NEXT: s_setpc_b64 s[30:31] 1981; 1982; GFX803-LABEL: load_private_lo_v2f16_reglo_vreg_sexti8_to_offset: 1983; GFX803: ; %bb.0: ; %entry 1984; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1985; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b 1986; GFX803-NEXT: buffer_store_dword v1, off, s[0:3], s32 1987; GFX803-NEXT: buffer_load_sbyte v1, off, s[0:3], s32 offset:4095 1988; GFX803-NEXT: v_and_b32_e32 v0, 0xffff0000, v0 1989; GFX803-NEXT: s_waitcnt vmcnt(0) 1990; GFX803-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 1991; GFX803-NEXT: flat_store_dword v[0:1], v0 1992; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 1993; GFX803-NEXT: s_setpc_b64 s[30:31] 1994entry: 1995 %obj0 = alloca [10 x i32], align 4, addrspace(5) 1996 %obj1 = alloca [4096 x i8], align 2, addrspace(5) 1997 %reg.bc = bitcast i32 %reg to <2 x half> 1998 %bc = bitcast [10 x i32] addrspace(5)* %obj0 to i32 addrspace(5)* 1999 store volatile i32 123, i32 addrspace(5)* %bc 2000 %gep = getelementptr inbounds [4096 x i8], [4096 x i8] addrspace(5)* %obj1, i32 0, i32 4055 2001 %load = load volatile i8, i8 addrspace(5)* %gep 2002 %load.ext = sext i8 %load to i16 2003 %bitcast = bitcast i16 %load.ext to half 2004 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 2005 store <2 x half> %build1, <2 x half> addrspace(1)* undef 2006 ret void 2007} 2008 2009define void @load_private_lo_v2f16_reglo_vreg_zexti8_to_offset(i32 %reg) #0 { 2010; GFX900-LABEL: load_private_lo_v2f16_reglo_vreg_zexti8_to_offset: 2011; GFX900: ; %bb.0: ; %entry 2012; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2013; GFX900-NEXT: v_mov_b32_e32 v1, 0x7b 2014; GFX900-NEXT: buffer_store_dword v1, off, s[0:3], s32 2015; GFX900-NEXT: buffer_load_ubyte_d16 v0, off, s[0:3], s32 offset:4095 2016; GFX900-NEXT: s_waitcnt vmcnt(0) 2017; GFX900-NEXT: global_store_dword v[0:1], v0, off 2018; GFX900-NEXT: s_waitcnt vmcnt(0) 2019; GFX900-NEXT: s_setpc_b64 s[30:31] 2020; 2021; GFX906-LABEL: load_private_lo_v2f16_reglo_vreg_zexti8_to_offset: 2022; GFX906: ; %bb.0: ; %entry 2023; GFX906-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2024; GFX906-NEXT: v_mov_b32_e32 v1, 0x7b 2025; GFX906-NEXT: buffer_store_dword v1, off, s[0:3], s32 2026; GFX906-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 2027; GFX906-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2028; GFX906-NEXT: s_waitcnt vmcnt(0) 2029; GFX906-NEXT: v_and_b32_e32 v1, 0xffff, v1 2030; GFX906-NEXT: v_lshl_or_b32 v0, v0, 16, v1 2031; GFX906-NEXT: global_store_dword v[0:1], v0, off 2032; GFX906-NEXT: s_waitcnt vmcnt(0) 2033; GFX906-NEXT: s_setpc_b64 s[30:31] 2034; 2035; GFX803-LABEL: load_private_lo_v2f16_reglo_vreg_zexti8_to_offset: 2036; GFX803: ; %bb.0: ; %entry 2037; GFX803-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2038; GFX803-NEXT: v_mov_b32_e32 v1, 0x7b 2039; GFX803-NEXT: buffer_store_dword v1, off, s[0:3], s32 2040; GFX803-NEXT: buffer_load_ubyte v1, off, s[0:3], s32 offset:4095 2041; GFX803-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2042; GFX803-NEXT: s_mov_b32 s4, 0x5040c00 2043; GFX803-NEXT: s_waitcnt vmcnt(0) 2044; GFX803-NEXT: v_perm_b32 v0, v0, v1, s4 2045; GFX803-NEXT: flat_store_dword v[0:1], v0 2046; GFX803-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 2047; GFX803-NEXT: s_setpc_b64 s[30:31] 2048entry: 2049 %obj0 = alloca [10 x i32], align 4, addrspace(5) 2050 %obj1 = alloca [4096 x i8], align 2, addrspace(5) 2051 %reg.bc = bitcast i32 %reg to <2 x half> 2052 %bc = bitcast [10 x i32] addrspace(5)* %obj0 to i32 addrspace(5)* 2053 store volatile i32 123, i32 addrspace(5)* %bc 2054 %gep = getelementptr inbounds [4096 x i8], [4096 x i8] addrspace(5)* %obj1, i32 0, i32 4055 2055 %load = load volatile i8, i8 addrspace(5)* %gep 2056 %load.ext = zext i8 %load to i16 2057 %bitcast = bitcast i16 %load.ext to half 2058 %build1 = insertelement <2 x half> %reg.bc, half %bitcast, i32 0 2059 store <2 x half> %build1, <2 x half> addrspace(1)* undef 2060 ret void 2061} 2062 2063attributes #0 = { nounwind } 2064