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