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; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s 6 7define amdgpu_ps i8 @extractelement_sgpr_v4i8_sgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) { 8; GCN-LABEL: extractelement_sgpr_v4i8_sgpr_idx: 9; GCN: ; %bb.0: 10; GCN-NEXT: s_load_dword s0, s[2:3], 0x0 11; GCN-NEXT: s_movk_i32 s5, 0xff 12; GCN-NEXT: s_waitcnt lgkmcnt(0) 13; GCN-NEXT: s_lshr_b32 s1, s0, 8 14; GCN-NEXT: s_and_b32 s1, s1, s5 15; GCN-NEXT: s_lshr_b32 s2, s0, 16 16; GCN-NEXT: s_lshr_b32 s3, s0, 24 17; GCN-NEXT: s_and_b32 s0, s0, s5 18; GCN-NEXT: s_lshl_b32 s1, s1, 8 19; GCN-NEXT: s_or_b32 s0, s0, s1 20; GCN-NEXT: s_and_b32 s1, s2, s5 21; GCN-NEXT: s_lshl_b32 s1, s1, 16 22; GCN-NEXT: s_or_b32 s0, s0, s1 23; GCN-NEXT: s_lshl_b32 s1, s3, 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; 30; GFX10-LABEL: extractelement_sgpr_v4i8_sgpr_idx: 31; GFX10: ; %bb.0: 32; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 33; GFX10-NEXT: s_movk_i32 s1, 0xff 34; GFX10-NEXT: s_waitcnt lgkmcnt(0) 35; GFX10-NEXT: s_lshr_b32 s2, s0, 8 36; GFX10-NEXT: s_lshr_b32 s3, s0, 16 37; GFX10-NEXT: s_and_b32 s2, s2, s1 38; GFX10-NEXT: s_lshr_b32 s5, s0, 24 39; GFX10-NEXT: s_and_b32 s0, s0, s1 40; GFX10-NEXT: s_and_b32 s1, s3, s1 41; GFX10-NEXT: s_lshl_b32 s2, s2, 8 42; GFX10-NEXT: s_lshl_b32 s1, s1, 16 43; GFX10-NEXT: s_or_b32 s0, s0, s2 44; GFX10-NEXT: s_lshl_b32 s2, s5, 24 45; GFX10-NEXT: s_or_b32 s0, s0, s1 46; GFX10-NEXT: s_and_b32 s1, s4, 3 47; GFX10-NEXT: s_or_b32 s0, s0, s2 48; GFX10-NEXT: s_lshl_b32 s1, s1, 3 49; GFX10-NEXT: s_lshr_b32 s0, s0, s1 50; GFX10-NEXT: ; return to shader part epilog 51 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 52 %element = extractelement <4 x i8> %vector, i32 %idx 53 ret i8 %element 54} 55 56define amdgpu_ps i8 @extractelement_vgpr_v4i8_sgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 inreg %idx) { 57; GFX9-LABEL: extractelement_vgpr_v4i8_sgpr_idx: 58; GFX9: ; %bb.0: 59; GFX9-NEXT: global_load_dword v0, v[0:1], off 60; GFX9-NEXT: s_mov_b32 s0, 8 61; GFX9-NEXT: s_movk_i32 s1, 0xff 62; GFX9-NEXT: s_and_b32 s2, s2, 3 63; GFX9-NEXT: s_waitcnt vmcnt(0) 64; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 65; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 66; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 67; GFX9-NEXT: v_and_b32_sdwa v3, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 68; GFX9-NEXT: v_lshlrev_b32_e32 v2, 24, v2 69; GFX9-NEXT: v_and_or_b32 v0, v0, s1, v1 70; GFX9-NEXT: v_or3_b32 v0, v0, v3, v2 71; GFX9-NEXT: s_lshl_b32 s0, s2, 3 72; GFX9-NEXT: v_lshrrev_b32_e32 v0, s0, v0 73; GFX9-NEXT: v_readfirstlane_b32 s0, v0 74; GFX9-NEXT: ; return to shader part epilog 75; 76; GFX8-LABEL: extractelement_vgpr_v4i8_sgpr_idx: 77; GFX8: ; %bb.0: 78; GFX8-NEXT: flat_load_dword v0, v[0:1] 79; GFX8-NEXT: s_movk_i32 s0, 0xff 80; GFX8-NEXT: v_mov_b32_e32 v1, 8 81; GFX8-NEXT: v_mov_b32_e32 v2, s0 82; GFX8-NEXT: s_and_b32 s0, s2, 3 83; GFX8-NEXT: s_lshl_b32 s0, s0, 3 84; GFX8-NEXT: s_waitcnt vmcnt(0) 85; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 86; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 87; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 88; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 89; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 90; GFX8-NEXT: v_lshlrev_b32_e32 v3, 24, v4 91; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 92; GFX8-NEXT: v_or_b32_e32 v0, v0, v3 93; GFX8-NEXT: v_lshrrev_b32_e32 v0, s0, v0 94; GFX8-NEXT: v_readfirstlane_b32 s0, v0 95; GFX8-NEXT: ; return to shader part epilog 96; 97; GFX7-LABEL: extractelement_vgpr_v4i8_sgpr_idx: 98; GFX7: ; %bb.0: 99; GFX7-NEXT: s_mov_b32 s6, 0 100; GFX7-NEXT: s_mov_b32 s7, 0xf000 101; GFX7-NEXT: s_mov_b64 s[4:5], 0 102; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 103; GFX7-NEXT: s_movk_i32 s0, 0xff 104; GFX7-NEXT: s_and_b32 s1, s2, 3 105; GFX7-NEXT: s_waitcnt vmcnt(0) 106; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 107; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 108; GFX7-NEXT: v_and_b32_e32 v1, s0, v1 109; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 110; GFX7-NEXT: v_and_b32_e32 v2, s0, v2 111; GFX7-NEXT: v_and_b32_e32 v0, s0, v0 112; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 113; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 114; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 115; GFX7-NEXT: v_lshlrev_b32_e32 v3, 24, v3 116; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 117; GFX7-NEXT: v_or_b32_e32 v0, v0, v3 118; GFX7-NEXT: s_lshl_b32 s0, s1, 3 119; GFX7-NEXT: v_lshrrev_b32_e32 v0, s0, v0 120; GFX7-NEXT: v_readfirstlane_b32 s0, v0 121; GFX7-NEXT: ; return to shader part epilog 122; 123; GFX10-LABEL: extractelement_vgpr_v4i8_sgpr_idx: 124; GFX10: ; %bb.0: 125; GFX10-NEXT: global_load_dword v0, v[0:1], off 126; GFX10-NEXT: s_mov_b32 s0, 8 127; GFX10-NEXT: s_waitcnt vmcnt(0) 128; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 129; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 130; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 131; GFX10-NEXT: s_movk_i32 s0, 0xff 132; GFX10-NEXT: v_and_b32_sdwa v3, v0, s0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 133; GFX10-NEXT: v_and_or_b32 v0, v0, s0, v1 134; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 135; GFX10-NEXT: s_and_b32 s0, s2, 3 136; GFX10-NEXT: s_lshl_b32 s0, s0, 3 137; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 138; GFX10-NEXT: v_lshrrev_b32_e32 v0, s0, v0 139; GFX10-NEXT: v_readfirstlane_b32 s0, v0 140; GFX10-NEXT: ; return to shader part epilog 141 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 142 %element = extractelement <4 x i8> %vector, i32 %idx 143 ret i8 %element 144} 145 146define i8 @extractelement_vgpr_v4i8_vgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 %idx) { 147; GFX9-LABEL: extractelement_vgpr_v4i8_vgpr_idx: 148; GFX9: ; %bb.0: 149; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 150; GFX9-NEXT: global_load_dword v0, v[0:1], off 151; GFX9-NEXT: v_and_b32_e32 v1, 3, v2 152; GFX9-NEXT: s_mov_b32 s4, 8 153; GFX9-NEXT: s_movk_i32 s5, 0xff 154; GFX9-NEXT: v_lshlrev_b32_e32 v1, 3, v1 155; GFX9-NEXT: s_waitcnt vmcnt(0) 156; GFX9-NEXT: v_lshrrev_b32_e32 v2, 8, v0 157; GFX9-NEXT: v_lshrrev_b32_e32 v3, 24, v0 158; GFX9-NEXT: v_lshlrev_b32_sdwa v2, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 159; GFX9-NEXT: v_and_b32_sdwa v4, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 160; GFX9-NEXT: v_lshlrev_b32_e32 v3, 24, v3 161; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v2 162; GFX9-NEXT: v_or3_b32 v0, v0, v4, v3 163; GFX9-NEXT: v_lshrrev_b32_e32 v0, v1, v0 164; GFX9-NEXT: s_setpc_b64 s[30:31] 165; 166; GFX8-LABEL: extractelement_vgpr_v4i8_vgpr_idx: 167; GFX8: ; %bb.0: 168; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 169; GFX8-NEXT: flat_load_dword v0, v[0:1] 170; GFX8-NEXT: s_movk_i32 s4, 0xff 171; GFX8-NEXT: v_mov_b32_e32 v1, 8 172; GFX8-NEXT: v_mov_b32_e32 v3, s4 173; GFX8-NEXT: v_and_b32_e32 v2, 3, v2 174; GFX8-NEXT: s_waitcnt vmcnt(0) 175; GFX8-NEXT: v_lshrrev_b32_e32 v4, 8, v0 176; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 177; GFX8-NEXT: v_lshrrev_b32_e32 v5, 24, v0 178; GFX8-NEXT: v_and_b32_sdwa v3, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 179; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 180; GFX8-NEXT: v_lshlrev_b32_e32 v4, 24, v5 181; GFX8-NEXT: v_or_b32_e32 v0, v0, v3 182; GFX8-NEXT: v_or_b32_e32 v0, v0, v4 183; GFX8-NEXT: v_lshlrev_b32_e32 v1, 3, v2 184; GFX8-NEXT: v_lshrrev_b32_e32 v0, v1, v0 185; GFX8-NEXT: s_setpc_b64 s[30:31] 186; 187; GFX7-LABEL: extractelement_vgpr_v4i8_vgpr_idx: 188; GFX7: ; %bb.0: 189; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 190; GFX7-NEXT: s_mov_b32 s6, 0 191; GFX7-NEXT: s_mov_b32 s7, 0xf000 192; GFX7-NEXT: s_mov_b64 s[4:5], 0 193; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 194; GFX7-NEXT: v_and_b32_e32 v1, 3, v2 195; GFX7-NEXT: s_movk_i32 s4, 0xff 196; GFX7-NEXT: v_lshlrev_b32_e32 v1, 3, v1 197; GFX7-NEXT: s_waitcnt vmcnt(0) 198; GFX7-NEXT: v_lshrrev_b32_e32 v2, 8, v0 199; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v0 200; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 201; GFX7-NEXT: v_lshrrev_b32_e32 v4, 24, v0 202; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 203; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 204; GFX7-NEXT: v_lshlrev_b32_e32 v2, 8, v2 205; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v3 206; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 207; GFX7-NEXT: v_lshlrev_b32_e32 v4, 24, v4 208; GFX7-NEXT: v_or_b32_e32 v0, v0, v3 209; GFX7-NEXT: v_or_b32_e32 v0, v0, v4 210; GFX7-NEXT: v_lshrrev_b32_e32 v0, v1, v0 211; GFX7-NEXT: s_setpc_b64 s[30:31] 212; 213; GFX10-LABEL: extractelement_vgpr_v4i8_vgpr_idx: 214; GFX10: ; %bb.0: 215; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 216; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 217; GFX10-NEXT: global_load_dword v0, v[0:1], off 218; GFX10-NEXT: s_mov_b32 s4, 8 219; GFX10-NEXT: s_waitcnt vmcnt(0) 220; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 221; GFX10-NEXT: v_lshrrev_b32_e32 v3, 24, v0 222; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 223; GFX10-NEXT: s_movk_i32 s4, 0xff 224; GFX10-NEXT: v_lshlrev_b32_e32 v3, 24, v3 225; GFX10-NEXT: v_and_b32_sdwa v4, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 226; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 227; GFX10-NEXT: v_and_b32_e32 v1, 3, v2 228; GFX10-NEXT: v_or3_b32 v0, v0, v4, v3 229; GFX10-NEXT: v_lshlrev_b32_e32 v1, 3, v1 230; GFX10-NEXT: v_lshrrev_b32_e32 v0, v1, v0 231; GFX10-NEXT: s_setpc_b64 s[30:31] 232 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 233 %element = extractelement <4 x i8> %vector, i32 %idx 234 ret i8 %element 235} 236 237define amdgpu_ps i8 @extractelement_sgpr_v4i8_vgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 %idx) { 238; GFX9-LABEL: extractelement_sgpr_v4i8_vgpr_idx: 239; GFX9: ; %bb.0: 240; GFX9-NEXT: s_load_dword s0, s[2:3], 0x0 241; GFX9-NEXT: s_movk_i32 s4, 0xff 242; GFX9-NEXT: v_and_b32_e32 v0, 3, v0 243; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v0 244; GFX9-NEXT: s_waitcnt lgkmcnt(0) 245; GFX9-NEXT: s_lshr_b32 s1, s0, 8 246; GFX9-NEXT: s_and_b32 s1, s1, s4 247; GFX9-NEXT: s_lshr_b32 s2, s0, 16 248; GFX9-NEXT: s_lshr_b32 s3, s0, 24 249; GFX9-NEXT: s_and_b32 s0, s0, s4 250; GFX9-NEXT: s_lshl_b32 s1, s1, 8 251; GFX9-NEXT: s_or_b32 s0, s0, s1 252; GFX9-NEXT: s_and_b32 s1, s2, s4 253; GFX9-NEXT: s_lshl_b32 s1, s1, 16 254; GFX9-NEXT: s_or_b32 s0, s0, s1 255; GFX9-NEXT: s_lshl_b32 s1, s3, 24 256; GFX9-NEXT: s_or_b32 s0, s0, s1 257; GFX9-NEXT: v_lshrrev_b32_e64 v0, v0, s0 258; GFX9-NEXT: v_readfirstlane_b32 s0, v0 259; GFX9-NEXT: ; return to shader part epilog 260; 261; GFX8-LABEL: extractelement_sgpr_v4i8_vgpr_idx: 262; GFX8: ; %bb.0: 263; GFX8-NEXT: s_load_dword s0, s[2:3], 0x0 264; GFX8-NEXT: s_movk_i32 s4, 0xff 265; GFX8-NEXT: v_and_b32_e32 v0, 3, v0 266; GFX8-NEXT: v_lshlrev_b32_e32 v0, 3, v0 267; GFX8-NEXT: s_waitcnt lgkmcnt(0) 268; GFX8-NEXT: s_lshr_b32 s1, s0, 8 269; GFX8-NEXT: s_and_b32 s1, s1, s4 270; GFX8-NEXT: s_lshr_b32 s2, s0, 16 271; GFX8-NEXT: s_lshr_b32 s3, s0, 24 272; GFX8-NEXT: s_and_b32 s0, s0, s4 273; GFX8-NEXT: s_lshl_b32 s1, s1, 8 274; GFX8-NEXT: s_or_b32 s0, s0, s1 275; GFX8-NEXT: s_and_b32 s1, s2, s4 276; GFX8-NEXT: s_lshl_b32 s1, s1, 16 277; GFX8-NEXT: s_or_b32 s0, s0, s1 278; GFX8-NEXT: s_lshl_b32 s1, s3, 24 279; GFX8-NEXT: s_or_b32 s0, s0, s1 280; GFX8-NEXT: v_lshrrev_b32_e64 v0, v0, s0 281; GFX8-NEXT: v_readfirstlane_b32 s0, v0 282; GFX8-NEXT: ; return to shader part epilog 283; 284; GFX7-LABEL: extractelement_sgpr_v4i8_vgpr_idx: 285; GFX7: ; %bb.0: 286; GFX7-NEXT: s_load_dword s0, s[2:3], 0x0 287; GFX7-NEXT: s_movk_i32 s4, 0xff 288; GFX7-NEXT: v_and_b32_e32 v0, 3, v0 289; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0 290; GFX7-NEXT: s_waitcnt lgkmcnt(0) 291; GFX7-NEXT: s_lshr_b32 s1, s0, 8 292; GFX7-NEXT: s_and_b32 s1, s1, s4 293; GFX7-NEXT: s_lshr_b32 s2, s0, 16 294; GFX7-NEXT: s_lshr_b32 s3, s0, 24 295; GFX7-NEXT: s_and_b32 s0, s0, s4 296; GFX7-NEXT: s_lshl_b32 s1, s1, 8 297; GFX7-NEXT: s_or_b32 s0, s0, s1 298; GFX7-NEXT: s_and_b32 s1, s2, s4 299; GFX7-NEXT: s_lshl_b32 s1, s1, 16 300; GFX7-NEXT: s_or_b32 s0, s0, s1 301; GFX7-NEXT: s_lshl_b32 s1, s3, 24 302; GFX7-NEXT: s_or_b32 s0, s0, s1 303; GFX7-NEXT: v_lshr_b32_e32 v0, s0, v0 304; GFX7-NEXT: v_readfirstlane_b32 s0, v0 305; GFX7-NEXT: ; return to shader part epilog 306; 307; GFX10-LABEL: extractelement_sgpr_v4i8_vgpr_idx: 308; GFX10: ; %bb.0: 309; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 310; GFX10-NEXT: s_movk_i32 s1, 0xff 311; GFX10-NEXT: v_and_b32_e32 v0, 3, v0 312; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0 313; GFX10-NEXT: s_waitcnt lgkmcnt(0) 314; GFX10-NEXT: s_lshr_b32 s2, s0, 8 315; GFX10-NEXT: s_lshr_b32 s3, s0, 16 316; GFX10-NEXT: s_and_b32 s2, s2, s1 317; GFX10-NEXT: s_and_b32 s4, s0, s1 318; GFX10-NEXT: s_and_b32 s1, s3, s1 319; GFX10-NEXT: s_lshl_b32 s2, s2, 8 320; GFX10-NEXT: s_lshr_b32 s0, s0, 24 321; GFX10-NEXT: s_lshl_b32 s1, s1, 16 322; GFX10-NEXT: s_or_b32 s2, s4, s2 323; GFX10-NEXT: s_lshl_b32 s0, s0, 24 324; GFX10-NEXT: s_or_b32 s1, s2, s1 325; GFX10-NEXT: s_or_b32 s0, s1, s0 326; GFX10-NEXT: v_lshrrev_b32_e64 v0, v0, s0 327; GFX10-NEXT: v_readfirstlane_b32 s0, v0 328; GFX10-NEXT: ; return to shader part epilog 329 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 330 %element = extractelement <4 x i8> %vector, i32 %idx 331 ret i8 %element 332} 333 334define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx0(<4 x i8> addrspace(4)* inreg %ptr) { 335; GCN-LABEL: extractelement_sgpr_v4i8_idx0: 336; GCN: ; %bb.0: 337; GCN-NEXT: s_load_dword s1, s[2:3], 0x0 338; GCN-NEXT: s_movk_i32 s0, 0xff 339; GCN-NEXT: s_waitcnt lgkmcnt(0) 340; GCN-NEXT: s_lshr_b32 s2, s1, 8 341; GCN-NEXT: s_and_b32 s2, s2, s0 342; GCN-NEXT: s_lshr_b32 s3, s1, 16 343; GCN-NEXT: s_lshr_b32 s4, s1, 24 344; GCN-NEXT: s_and_b32 s1, s1, s0 345; GCN-NEXT: s_and_b32 s0, s3, s0 346; GCN-NEXT: s_lshl_b32 s2, s2, 8 347; GCN-NEXT: s_or_b32 s1, s1, s2 348; GCN-NEXT: s_lshl_b32 s0, s0, 16 349; GCN-NEXT: s_or_b32 s0, s1, s0 350; GCN-NEXT: s_lshl_b32 s1, s4, 24 351; GCN-NEXT: s_or_b32 s0, s0, s1 352; GCN-NEXT: ; return to shader part epilog 353; 354; GFX10-LABEL: extractelement_sgpr_v4i8_idx0: 355; GFX10: ; %bb.0: 356; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 357; GFX10-NEXT: s_movk_i32 s1, 0xff 358; GFX10-NEXT: s_waitcnt lgkmcnt(0) 359; GFX10-NEXT: s_lshr_b32 s2, s0, 8 360; GFX10-NEXT: s_lshr_b32 s3, s0, 16 361; GFX10-NEXT: s_and_b32 s2, s2, s1 362; GFX10-NEXT: s_and_b32 s4, s0, s1 363; GFX10-NEXT: s_and_b32 s1, s3, s1 364; GFX10-NEXT: s_lshl_b32 s2, s2, 8 365; GFX10-NEXT: s_lshr_b32 s0, s0, 24 366; GFX10-NEXT: s_lshl_b32 s1, s1, 16 367; GFX10-NEXT: s_or_b32 s2, s4, s2 368; GFX10-NEXT: s_lshl_b32 s0, s0, 24 369; GFX10-NEXT: s_or_b32 s1, s2, s1 370; GFX10-NEXT: s_or_b32 s0, s1, s0 371; GFX10-NEXT: ; return to shader part epilog 372 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 373 %element = extractelement <4 x i8> %vector, i32 0 374 ret i8 %element 375} 376 377define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx1(<4 x i8> addrspace(4)* inreg %ptr) { 378; GCN-LABEL: extractelement_sgpr_v4i8_idx1: 379; GCN: ; %bb.0: 380; GCN-NEXT: s_load_dword s1, s[2:3], 0x0 381; GCN-NEXT: s_movk_i32 s0, 0xff 382; GCN-NEXT: s_waitcnt lgkmcnt(0) 383; GCN-NEXT: s_lshr_b32 s2, s1, 8 384; GCN-NEXT: s_and_b32 s2, s2, s0 385; GCN-NEXT: s_lshr_b32 s3, s1, 16 386; GCN-NEXT: s_lshr_b32 s4, s1, 24 387; GCN-NEXT: s_and_b32 s1, s1, s0 388; GCN-NEXT: s_and_b32 s0, s3, s0 389; GCN-NEXT: s_lshl_b32 s2, s2, 8 390; GCN-NEXT: s_or_b32 s1, s1, s2 391; GCN-NEXT: s_lshl_b32 s0, s0, 16 392; GCN-NEXT: s_or_b32 s0, s1, s0 393; GCN-NEXT: s_lshl_b32 s1, s4, 24 394; GCN-NEXT: s_or_b32 s0, s0, s1 395; GCN-NEXT: s_lshr_b32 s0, s0, 8 396; GCN-NEXT: ; return to shader part epilog 397; 398; GFX10-LABEL: extractelement_sgpr_v4i8_idx1: 399; GFX10: ; %bb.0: 400; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 401; GFX10-NEXT: s_movk_i32 s1, 0xff 402; GFX10-NEXT: s_waitcnt lgkmcnt(0) 403; GFX10-NEXT: s_lshr_b32 s2, s0, 8 404; GFX10-NEXT: s_lshr_b32 s3, s0, 16 405; GFX10-NEXT: s_and_b32 s2, s2, s1 406; GFX10-NEXT: s_and_b32 s4, s0, s1 407; GFX10-NEXT: s_and_b32 s1, s3, s1 408; GFX10-NEXT: s_lshl_b32 s2, s2, 8 409; GFX10-NEXT: s_lshr_b32 s0, s0, 24 410; GFX10-NEXT: s_lshl_b32 s1, s1, 16 411; GFX10-NEXT: s_or_b32 s2, s4, s2 412; GFX10-NEXT: s_lshl_b32 s0, s0, 24 413; GFX10-NEXT: s_or_b32 s1, s2, s1 414; GFX10-NEXT: s_or_b32 s0, s1, s0 415; GFX10-NEXT: s_lshr_b32 s0, s0, 8 416; GFX10-NEXT: ; return to shader part epilog 417 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 418 %element = extractelement <4 x i8> %vector, i32 1 419 ret i8 %element 420} 421 422define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx2(<4 x i8> addrspace(4)* inreg %ptr) { 423; GCN-LABEL: extractelement_sgpr_v4i8_idx2: 424; GCN: ; %bb.0: 425; GCN-NEXT: s_load_dword s1, s[2:3], 0x0 426; GCN-NEXT: s_movk_i32 s0, 0xff 427; GCN-NEXT: s_waitcnt lgkmcnt(0) 428; GCN-NEXT: s_lshr_b32 s2, s1, 8 429; GCN-NEXT: s_and_b32 s2, s2, s0 430; GCN-NEXT: s_lshr_b32 s3, s1, 16 431; GCN-NEXT: s_lshr_b32 s4, s1, 24 432; GCN-NEXT: s_and_b32 s1, s1, s0 433; GCN-NEXT: s_and_b32 s0, s3, s0 434; GCN-NEXT: s_lshl_b32 s2, s2, 8 435; GCN-NEXT: s_or_b32 s1, s1, s2 436; GCN-NEXT: s_lshl_b32 s0, s0, 16 437; GCN-NEXT: s_or_b32 s0, s1, s0 438; GCN-NEXT: s_lshl_b32 s1, s4, 24 439; GCN-NEXT: s_or_b32 s0, s0, s1 440; GCN-NEXT: s_lshr_b32 s0, s0, 16 441; GCN-NEXT: ; return to shader part epilog 442; 443; GFX10-LABEL: extractelement_sgpr_v4i8_idx2: 444; GFX10: ; %bb.0: 445; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 446; GFX10-NEXT: s_movk_i32 s1, 0xff 447; GFX10-NEXT: s_waitcnt lgkmcnt(0) 448; GFX10-NEXT: s_lshr_b32 s2, s0, 8 449; GFX10-NEXT: s_lshr_b32 s3, s0, 16 450; GFX10-NEXT: s_and_b32 s2, s2, s1 451; GFX10-NEXT: s_and_b32 s4, s0, s1 452; GFX10-NEXT: s_and_b32 s1, s3, s1 453; GFX10-NEXT: s_lshl_b32 s2, s2, 8 454; GFX10-NEXT: s_lshr_b32 s0, s0, 24 455; GFX10-NEXT: s_lshl_b32 s1, s1, 16 456; GFX10-NEXT: s_or_b32 s2, s4, s2 457; GFX10-NEXT: s_lshl_b32 s0, s0, 24 458; GFX10-NEXT: s_or_b32 s1, s2, s1 459; GFX10-NEXT: s_or_b32 s0, s1, s0 460; GFX10-NEXT: s_lshr_b32 s0, s0, 16 461; GFX10-NEXT: ; return to shader part epilog 462 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 463 %element = extractelement <4 x i8> %vector, i32 2 464 ret i8 %element 465} 466 467define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx3(<4 x i8> addrspace(4)* inreg %ptr) { 468; GCN-LABEL: extractelement_sgpr_v4i8_idx3: 469; GCN: ; %bb.0: 470; GCN-NEXT: s_load_dword s1, s[2:3], 0x0 471; GCN-NEXT: s_movk_i32 s0, 0xff 472; GCN-NEXT: s_waitcnt lgkmcnt(0) 473; GCN-NEXT: s_lshr_b32 s2, s1, 8 474; GCN-NEXT: s_and_b32 s2, s2, s0 475; GCN-NEXT: s_lshr_b32 s3, s1, 16 476; GCN-NEXT: s_lshr_b32 s4, s1, 24 477; GCN-NEXT: s_and_b32 s1, s1, s0 478; GCN-NEXT: s_and_b32 s0, s3, s0 479; GCN-NEXT: s_lshl_b32 s2, s2, 8 480; GCN-NEXT: s_or_b32 s1, s1, s2 481; GCN-NEXT: s_lshl_b32 s0, s0, 16 482; GCN-NEXT: s_or_b32 s0, s1, s0 483; GCN-NEXT: s_lshl_b32 s1, s4, 24 484; GCN-NEXT: s_or_b32 s0, s0, s1 485; GCN-NEXT: s_lshr_b32 s0, s0, 24 486; GCN-NEXT: ; return to shader part epilog 487; 488; GFX10-LABEL: extractelement_sgpr_v4i8_idx3: 489; GFX10: ; %bb.0: 490; GFX10-NEXT: s_load_dword s0, s[2:3], 0x0 491; GFX10-NEXT: s_movk_i32 s1, 0xff 492; GFX10-NEXT: s_waitcnt lgkmcnt(0) 493; GFX10-NEXT: s_lshr_b32 s2, s0, 8 494; GFX10-NEXT: s_lshr_b32 s3, s0, 16 495; GFX10-NEXT: s_and_b32 s2, s2, s1 496; GFX10-NEXT: s_and_b32 s4, s0, s1 497; GFX10-NEXT: s_and_b32 s1, s3, s1 498; GFX10-NEXT: s_lshl_b32 s2, s2, 8 499; GFX10-NEXT: s_lshr_b32 s0, s0, 24 500; GFX10-NEXT: s_lshl_b32 s1, s1, 16 501; GFX10-NEXT: s_or_b32 s2, s4, s2 502; GFX10-NEXT: s_lshl_b32 s0, s0, 24 503; GFX10-NEXT: s_or_b32 s1, s2, s1 504; GFX10-NEXT: s_or_b32 s0, s1, s0 505; GFX10-NEXT: s_lshr_b32 s0, s0, 24 506; GFX10-NEXT: ; return to shader part epilog 507 %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr 508 %element = extractelement <4 x i8> %vector, i32 3 509 ret i8 %element 510} 511 512define i8 @extractelement_vgpr_v4i8_idx0(<4 x i8> addrspace(1)* %ptr) { 513; GFX9-LABEL: extractelement_vgpr_v4i8_idx0: 514; GFX9: ; %bb.0: 515; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 516; GFX9-NEXT: global_load_dword v0, v[0:1], off 517; GFX9-NEXT: s_mov_b32 s4, 8 518; GFX9-NEXT: s_movk_i32 s5, 0xff 519; GFX9-NEXT: s_waitcnt vmcnt(0) 520; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 521; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 522; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 523; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 524; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 525; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 526; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 527; GFX9-NEXT: s_setpc_b64 s[30:31] 528; 529; GFX8-LABEL: extractelement_vgpr_v4i8_idx0: 530; GFX8: ; %bb.0: 531; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 532; GFX8-NEXT: flat_load_dword v0, v[0:1] 533; GFX8-NEXT: s_movk_i32 s4, 0xff 534; GFX8-NEXT: v_mov_b32_e32 v1, 8 535; GFX8-NEXT: v_mov_b32_e32 v2, s4 536; GFX8-NEXT: s_waitcnt vmcnt(0) 537; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 538; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 539; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 540; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 541; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 542; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 543; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 544; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 545; GFX8-NEXT: s_setpc_b64 s[30:31] 546; 547; GFX7-LABEL: extractelement_vgpr_v4i8_idx0: 548; GFX7: ; %bb.0: 549; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 550; GFX7-NEXT: s_mov_b32 s6, 0 551; GFX7-NEXT: s_mov_b32 s7, 0xf000 552; GFX7-NEXT: s_mov_b64 s[4:5], 0 553; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 554; GFX7-NEXT: s_movk_i32 s4, 0xff 555; GFX7-NEXT: s_waitcnt vmcnt(0) 556; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 557; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 558; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 559; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 560; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 561; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 562; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 563; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 564; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 565; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 566; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 567; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 568; GFX7-NEXT: s_setpc_b64 s[30:31] 569; 570; GFX10-LABEL: extractelement_vgpr_v4i8_idx0: 571; GFX10: ; %bb.0: 572; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 573; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 574; GFX10-NEXT: global_load_dword v0, v[0:1], off 575; GFX10-NEXT: s_mov_b32 s4, 8 576; GFX10-NEXT: s_waitcnt vmcnt(0) 577; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 578; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 579; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 580; GFX10-NEXT: s_movk_i32 s4, 0xff 581; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 582; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 583; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 584; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 585; GFX10-NEXT: s_setpc_b64 s[30:31] 586 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 587 %element = extractelement <4 x i8> %vector, i32 0 588 ret i8 %element 589} 590 591define i8 @extractelement_vgpr_v4i8_idx1(<4 x i8> addrspace(1)* %ptr) { 592; GFX9-LABEL: extractelement_vgpr_v4i8_idx1: 593; GFX9: ; %bb.0: 594; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 595; GFX9-NEXT: global_load_dword v0, v[0:1], off 596; GFX9-NEXT: s_mov_b32 s4, 8 597; GFX9-NEXT: s_movk_i32 s5, 0xff 598; GFX9-NEXT: s_waitcnt vmcnt(0) 599; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 600; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 601; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 602; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 603; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 604; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 605; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 606; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 607; GFX9-NEXT: s_setpc_b64 s[30:31] 608; 609; GFX8-LABEL: extractelement_vgpr_v4i8_idx1: 610; GFX8: ; %bb.0: 611; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 612; GFX8-NEXT: flat_load_dword v0, v[0:1] 613; GFX8-NEXT: s_movk_i32 s4, 0xff 614; GFX8-NEXT: v_mov_b32_e32 v1, 8 615; GFX8-NEXT: v_mov_b32_e32 v2, s4 616; GFX8-NEXT: s_waitcnt vmcnt(0) 617; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 618; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 619; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 620; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 621; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 622; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 623; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 624; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 625; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 626; GFX8-NEXT: s_setpc_b64 s[30:31] 627; 628; GFX7-LABEL: extractelement_vgpr_v4i8_idx1: 629; GFX7: ; %bb.0: 630; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 631; GFX7-NEXT: s_mov_b32 s6, 0 632; GFX7-NEXT: s_mov_b32 s7, 0xf000 633; GFX7-NEXT: s_mov_b64 s[4:5], 0 634; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 635; GFX7-NEXT: s_movk_i32 s4, 0xff 636; GFX7-NEXT: s_waitcnt vmcnt(0) 637; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 638; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 639; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 640; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 641; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 642; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 643; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 644; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 645; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 646; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 647; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 648; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 649; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 650; GFX7-NEXT: s_setpc_b64 s[30:31] 651; 652; GFX10-LABEL: extractelement_vgpr_v4i8_idx1: 653; GFX10: ; %bb.0: 654; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 655; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 656; GFX10-NEXT: global_load_dword v0, v[0:1], off 657; GFX10-NEXT: s_mov_b32 s4, 8 658; GFX10-NEXT: s_waitcnt vmcnt(0) 659; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 660; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 661; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 662; GFX10-NEXT: s_movk_i32 s4, 0xff 663; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 664; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 665; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 666; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 667; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 668; GFX10-NEXT: s_setpc_b64 s[30:31] 669 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 670 %element = extractelement <4 x i8> %vector, i32 1 671 ret i8 %element 672} 673 674define i8 @extractelement_vgpr_v4i8_idx2(<4 x i8> addrspace(1)* %ptr) { 675; GFX9-LABEL: extractelement_vgpr_v4i8_idx2: 676; GFX9: ; %bb.0: 677; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 678; GFX9-NEXT: global_load_dword v0, v[0:1], off 679; GFX9-NEXT: s_mov_b32 s4, 8 680; GFX9-NEXT: s_movk_i32 s5, 0xff 681; GFX9-NEXT: s_waitcnt vmcnt(0) 682; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 683; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 684; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 685; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 686; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 687; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 688; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 689; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 690; GFX9-NEXT: s_setpc_b64 s[30:31] 691; 692; GFX8-LABEL: extractelement_vgpr_v4i8_idx2: 693; GFX8: ; %bb.0: 694; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 695; GFX8-NEXT: flat_load_dword v0, v[0:1] 696; GFX8-NEXT: s_movk_i32 s4, 0xff 697; GFX8-NEXT: v_mov_b32_e32 v1, 8 698; GFX8-NEXT: v_mov_b32_e32 v2, s4 699; GFX8-NEXT: s_waitcnt vmcnt(0) 700; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 701; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 702; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 703; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 704; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 705; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 706; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 707; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 708; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 709; GFX8-NEXT: s_setpc_b64 s[30:31] 710; 711; GFX7-LABEL: extractelement_vgpr_v4i8_idx2: 712; GFX7: ; %bb.0: 713; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 714; GFX7-NEXT: s_mov_b32 s6, 0 715; GFX7-NEXT: s_mov_b32 s7, 0xf000 716; GFX7-NEXT: s_mov_b64 s[4:5], 0 717; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 718; GFX7-NEXT: s_movk_i32 s4, 0xff 719; GFX7-NEXT: s_waitcnt vmcnt(0) 720; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 721; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 722; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 723; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 724; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 725; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 726; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 727; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 728; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 729; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 730; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 731; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 732; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 733; GFX7-NEXT: s_setpc_b64 s[30:31] 734; 735; GFX10-LABEL: extractelement_vgpr_v4i8_idx2: 736; GFX10: ; %bb.0: 737; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 738; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 739; GFX10-NEXT: global_load_dword v0, v[0:1], off 740; GFX10-NEXT: s_mov_b32 s4, 8 741; GFX10-NEXT: s_waitcnt vmcnt(0) 742; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 743; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 744; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 745; GFX10-NEXT: s_movk_i32 s4, 0xff 746; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 747; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 748; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 749; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 750; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 751; GFX10-NEXT: s_setpc_b64 s[30:31] 752 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 753 %element = extractelement <4 x i8> %vector, i32 2 754 ret i8 %element 755} 756 757define i8 @extractelement_vgpr_v4i8_idx3(<4 x i8> addrspace(1)* %ptr) { 758; GFX9-LABEL: extractelement_vgpr_v4i8_idx3: 759; GFX9: ; %bb.0: 760; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 761; GFX9-NEXT: global_load_dword v0, v[0:1], off 762; GFX9-NEXT: s_mov_b32 s4, 8 763; GFX9-NEXT: s_movk_i32 s5, 0xff 764; GFX9-NEXT: s_waitcnt vmcnt(0) 765; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 766; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 767; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 768; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 769; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 770; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 771; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 772; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 773; GFX9-NEXT: s_setpc_b64 s[30:31] 774; 775; GFX8-LABEL: extractelement_vgpr_v4i8_idx3: 776; GFX8: ; %bb.0: 777; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 778; GFX8-NEXT: flat_load_dword v0, v[0:1] 779; GFX8-NEXT: s_movk_i32 s4, 0xff 780; GFX8-NEXT: v_mov_b32_e32 v1, 8 781; GFX8-NEXT: v_mov_b32_e32 v2, s4 782; GFX8-NEXT: s_waitcnt vmcnt(0) 783; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 784; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 785; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 786; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 787; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 788; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 789; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 790; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 791; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 792; GFX8-NEXT: s_setpc_b64 s[30:31] 793; 794; GFX7-LABEL: extractelement_vgpr_v4i8_idx3: 795; GFX7: ; %bb.0: 796; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 797; GFX7-NEXT: s_mov_b32 s6, 0 798; GFX7-NEXT: s_mov_b32 s7, 0xf000 799; GFX7-NEXT: s_mov_b64 s[4:5], 0 800; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 801; GFX7-NEXT: s_movk_i32 s4, 0xff 802; GFX7-NEXT: s_waitcnt vmcnt(0) 803; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 804; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 805; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 806; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 807; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 808; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 809; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 810; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 811; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 812; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 813; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 814; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 815; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 816; GFX7-NEXT: s_setpc_b64 s[30:31] 817; 818; GFX10-LABEL: extractelement_vgpr_v4i8_idx3: 819; GFX10: ; %bb.0: 820; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 821; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 822; GFX10-NEXT: global_load_dword v0, v[0:1], off 823; GFX10-NEXT: s_mov_b32 s4, 8 824; GFX10-NEXT: s_waitcnt vmcnt(0) 825; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 826; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 827; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 828; GFX10-NEXT: s_movk_i32 s4, 0xff 829; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 830; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 831; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 832; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 833; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 834; GFX10-NEXT: s_setpc_b64 s[30:31] 835 %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr 836 %element = extractelement <4 x i8> %vector, i32 3 837 ret i8 %element 838} 839 840define amdgpu_ps i8 @extractelement_sgpr_v8i8_sgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) { 841; GCN-LABEL: extractelement_sgpr_v8i8_sgpr_idx: 842; GCN: ; %bb.0: 843; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 844; GCN-NEXT: s_movk_i32 s9, 0xff 845; GCN-NEXT: s_waitcnt lgkmcnt(0) 846; GCN-NEXT: s_lshr_b32 s2, s0, 8 847; GCN-NEXT: s_and_b32 s2, s2, s9 848; GCN-NEXT: s_lshr_b32 s3, s0, 16 849; GCN-NEXT: s_lshr_b32 s5, s0, 24 850; GCN-NEXT: s_and_b32 s0, s0, s9 851; GCN-NEXT: s_lshl_b32 s2, s2, 8 852; GCN-NEXT: s_or_b32 s0, s0, s2 853; GCN-NEXT: s_and_b32 s2, s3, s9 854; GCN-NEXT: s_lshl_b32 s2, s2, 16 855; GCN-NEXT: s_or_b32 s0, s0, s2 856; GCN-NEXT: s_lshl_b32 s2, s5, 24 857; GCN-NEXT: s_lshr_b32 s6, s1, 8 858; GCN-NEXT: s_or_b32 s0, s0, s2 859; GCN-NEXT: s_and_b32 s2, s6, s9 860; GCN-NEXT: s_lshr_b32 s7, s1, 16 861; GCN-NEXT: s_lshr_b32 s8, s1, 24 862; GCN-NEXT: s_and_b32 s1, s1, s9 863; GCN-NEXT: s_lshl_b32 s2, s2, 8 864; GCN-NEXT: s_or_b32 s1, s1, s2 865; GCN-NEXT: s_and_b32 s2, s7, s9 866; GCN-NEXT: s_lshl_b32 s2, s2, 16 867; GCN-NEXT: s_or_b32 s1, s1, s2 868; GCN-NEXT: s_lshl_b32 s2, s8, 24 869; GCN-NEXT: s_or_b32 s1, s1, s2 870; GCN-NEXT: s_lshr_b32 s2, s4, 2 871; GCN-NEXT: s_cmp_eq_u32 s2, 1 872; GCN-NEXT: s_cselect_b32 s0, s1, s0 873; GCN-NEXT: s_and_b32 s1, s4, 3 874; GCN-NEXT: s_lshl_b32 s1, s1, 3 875; GCN-NEXT: s_lshr_b32 s0, s0, s1 876; GCN-NEXT: ; return to shader part epilog 877; 878; GFX10-LABEL: extractelement_sgpr_v8i8_sgpr_idx: 879; GFX10: ; %bb.0: 880; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 881; GFX10-NEXT: s_movk_i32 s2, 0xff 882; GFX10-NEXT: s_lshr_b32 s3, s4, 2 883; GFX10-NEXT: s_waitcnt lgkmcnt(0) 884; GFX10-NEXT: s_lshr_b32 s5, s0, 8 885; GFX10-NEXT: s_lshr_b32 s8, s1, 8 886; GFX10-NEXT: s_lshr_b32 s6, s0, 16 887; GFX10-NEXT: s_and_b32 s5, s5, s2 888; GFX10-NEXT: s_and_b32 s8, s8, s2 889; GFX10-NEXT: s_lshr_b32 s9, s1, 16 890; GFX10-NEXT: s_lshr_b32 s7, s0, 24 891; GFX10-NEXT: s_and_b32 s6, s6, s2 892; GFX10-NEXT: s_lshr_b32 s10, s1, 24 893; GFX10-NEXT: s_and_b32 s0, s0, s2 894; GFX10-NEXT: s_and_b32 s1, s1, s2 895; GFX10-NEXT: s_and_b32 s2, s9, s2 896; GFX10-NEXT: s_lshl_b32 s5, s5, 8 897; GFX10-NEXT: s_lshl_b32 s8, s8, 8 898; GFX10-NEXT: s_lshl_b32 s6, s6, 16 899; GFX10-NEXT: s_or_b32 s0, s0, s5 900; GFX10-NEXT: s_lshl_b32 s2, s2, 16 901; GFX10-NEXT: s_or_b32 s1, s1, s8 902; GFX10-NEXT: s_lshl_b32 s7, s7, 24 903; GFX10-NEXT: s_or_b32 s0, s0, s6 904; GFX10-NEXT: s_lshl_b32 s9, s10, 24 905; GFX10-NEXT: s_or_b32 s1, s1, s2 906; GFX10-NEXT: s_or_b32 s0, s0, s7 907; GFX10-NEXT: s_or_b32 s1, s1, s9 908; GFX10-NEXT: s_cmp_eq_u32 s3, 1 909; GFX10-NEXT: s_cselect_b32 s0, s1, s0 910; GFX10-NEXT: s_and_b32 s1, s4, 3 911; GFX10-NEXT: s_lshl_b32 s1, s1, 3 912; GFX10-NEXT: s_lshr_b32 s0, s0, s1 913; GFX10-NEXT: ; return to shader part epilog 914 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 915 %element = extractelement <8 x i8> %vector, i32 %idx 916 ret i8 %element 917} 918 919define amdgpu_ps i8 @extractelement_vgpr_v8i8_sgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 inreg %idx) { 920; GFX9-LABEL: extractelement_vgpr_v8i8_sgpr_idx: 921; GFX9: ; %bb.0: 922; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 923; GFX9-NEXT: s_mov_b32 s0, 8 924; GFX9-NEXT: s_movk_i32 s1, 0xff 925; GFX9-NEXT: s_lshr_b32 s3, s2, 2 926; GFX9-NEXT: s_and_b32 s2, s2, 3 927; GFX9-NEXT: v_cmp_eq_u32_e64 vcc, s3, 1 928; GFX9-NEXT: s_waitcnt vmcnt(0) 929; GFX9-NEXT: v_lshrrev_b32_e32 v2, 8, v0 930; GFX9-NEXT: v_lshrrev_b32_e32 v4, 8, v1 931; GFX9-NEXT: v_lshrrev_b32_e32 v3, 24, v0 932; GFX9-NEXT: v_lshrrev_b32_e32 v5, 24, v1 933; GFX9-NEXT: v_lshlrev_b32_sdwa v2, s0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 934; GFX9-NEXT: v_lshlrev_b32_sdwa v4, s0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 935; GFX9-NEXT: v_and_b32_sdwa v6, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 936; GFX9-NEXT: v_and_b32_sdwa v7, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 937; GFX9-NEXT: v_lshlrev_b32_e32 v3, 24, v3 938; GFX9-NEXT: v_and_or_b32 v0, v0, s1, v2 939; GFX9-NEXT: v_lshlrev_b32_e32 v5, 24, v5 940; GFX9-NEXT: v_and_or_b32 v1, v1, s1, v4 941; GFX9-NEXT: v_or3_b32 v0, v0, v6, v3 942; GFX9-NEXT: v_or3_b32 v1, v1, v7, v5 943; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 944; GFX9-NEXT: s_lshl_b32 s0, s2, 3 945; GFX9-NEXT: v_lshrrev_b32_e32 v0, s0, v0 946; GFX9-NEXT: v_readfirstlane_b32 s0, v0 947; GFX9-NEXT: ; return to shader part epilog 948; 949; GFX8-LABEL: extractelement_vgpr_v8i8_sgpr_idx: 950; GFX8: ; %bb.0: 951; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 952; GFX8-NEXT: s_movk_i32 s0, 0xff 953; GFX8-NEXT: v_mov_b32_e32 v2, 8 954; GFX8-NEXT: v_mov_b32_e32 v3, 8 955; GFX8-NEXT: v_mov_b32_e32 v4, s0 956; GFX8-NEXT: s_lshr_b32 s0, s2, 2 957; GFX8-NEXT: s_and_b32 s1, s2, 3 958; GFX8-NEXT: v_cmp_eq_u32_e64 vcc, s0, 1 959; GFX8-NEXT: s_lshl_b32 s0, s1, 3 960; GFX8-NEXT: s_waitcnt vmcnt(0) 961; GFX8-NEXT: v_lshrrev_b32_e32 v5, 8, v0 962; GFX8-NEXT: v_lshrrev_b32_e32 v7, 8, v1 963; GFX8-NEXT: v_lshlrev_b32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 964; GFX8-NEXT: v_lshlrev_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 965; GFX8-NEXT: v_lshrrev_b32_e32 v6, 24, v0 966; GFX8-NEXT: v_and_b32_sdwa v9, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 967; GFX8-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 968; GFX8-NEXT: v_lshrrev_b32_e32 v8, 24, v1 969; GFX8-NEXT: v_and_b32_sdwa v4, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 970; GFX8-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 971; GFX8-NEXT: v_lshlrev_b32_e32 v5, 24, v6 972; GFX8-NEXT: v_or_b32_e32 v0, v0, v9 973; GFX8-NEXT: v_lshlrev_b32_e32 v6, 24, v8 974; GFX8-NEXT: v_or_b32_e32 v1, v1, v4 975; GFX8-NEXT: v_or_b32_e32 v0, v0, v5 976; GFX8-NEXT: v_or_b32_e32 v1, v1, v6 977; GFX8-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 978; GFX8-NEXT: v_lshrrev_b32_e32 v0, s0, v0 979; GFX8-NEXT: v_readfirstlane_b32 s0, v0 980; GFX8-NEXT: ; return to shader part epilog 981; 982; GFX7-LABEL: extractelement_vgpr_v8i8_sgpr_idx: 983; GFX7: ; %bb.0: 984; GFX7-NEXT: s_mov_b32 s6, 0 985; GFX7-NEXT: s_mov_b32 s7, 0xf000 986; GFX7-NEXT: s_mov_b64 s[4:5], 0 987; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 988; GFX7-NEXT: s_movk_i32 s0, 0xff 989; GFX7-NEXT: s_lshr_b32 s1, s2, 2 990; GFX7-NEXT: s_and_b32 s2, s2, 3 991; GFX7-NEXT: v_cmp_eq_u32_e64 vcc, s1, 1 992; GFX7-NEXT: s_waitcnt vmcnt(0) 993; GFX7-NEXT: v_lshrrev_b32_e32 v2, 8, v0 994; GFX7-NEXT: v_lshrrev_b32_e32 v5, 8, v1 995; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v0 996; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v1 997; GFX7-NEXT: v_and_b32_e32 v2, s0, v2 998; GFX7-NEXT: v_and_b32_e32 v5, s0, v5 999; GFX7-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1000; GFX7-NEXT: v_lshrrev_b32_e32 v7, 24, v1 1001; GFX7-NEXT: v_and_b32_e32 v3, s0, v3 1002; GFX7-NEXT: v_and_b32_e32 v6, s0, v6 1003; GFX7-NEXT: v_and_b32_e32 v0, s0, v0 1004; GFX7-NEXT: v_and_b32_e32 v1, s0, v1 1005; GFX7-NEXT: v_lshlrev_b32_e32 v2, 8, v2 1006; GFX7-NEXT: v_lshlrev_b32_e32 v5, 8, v5 1007; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v3 1008; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 1009; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v6 1010; GFX7-NEXT: v_or_b32_e32 v1, v1, v5 1011; GFX7-NEXT: v_lshlrev_b32_e32 v4, 24, v4 1012; GFX7-NEXT: v_or_b32_e32 v0, v0, v3 1013; GFX7-NEXT: v_lshlrev_b32_e32 v7, 24, v7 1014; GFX7-NEXT: v_or_b32_e32 v1, v1, v6 1015; GFX7-NEXT: v_or_b32_e32 v0, v0, v4 1016; GFX7-NEXT: v_or_b32_e32 v1, v1, v7 1017; GFX7-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 1018; GFX7-NEXT: s_lshl_b32 s0, s2, 3 1019; GFX7-NEXT: v_lshrrev_b32_e32 v0, s0, v0 1020; GFX7-NEXT: v_readfirstlane_b32 s0, v0 1021; GFX7-NEXT: ; return to shader part epilog 1022; 1023; GFX10-LABEL: extractelement_vgpr_v8i8_sgpr_idx: 1024; GFX10: ; %bb.0: 1025; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1026; GFX10-NEXT: s_mov_b32 s0, 8 1027; GFX10-NEXT: s_movk_i32 s1, 0xff 1028; GFX10-NEXT: s_waitcnt vmcnt(0) 1029; GFX10-NEXT: v_lshrrev_b32_e32 v2, 8, v0 1030; GFX10-NEXT: v_lshrrev_b32_e32 v3, 8, v1 1031; GFX10-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1032; GFX10-NEXT: v_lshrrev_b32_e32 v5, 24, v1 1033; GFX10-NEXT: v_and_b32_sdwa v6, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1034; GFX10-NEXT: v_lshlrev_b32_sdwa v2, s0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1035; GFX10-NEXT: v_lshlrev_b32_sdwa v3, s0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1036; GFX10-NEXT: v_and_b32_sdwa v7, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1037; GFX10-NEXT: v_lshlrev_b32_e32 v4, 24, v4 1038; GFX10-NEXT: v_lshlrev_b32_e32 v5, 24, v5 1039; GFX10-NEXT: v_and_or_b32 v0, v0, s1, v2 1040; GFX10-NEXT: v_and_or_b32 v1, v1, s1, v3 1041; GFX10-NEXT: s_lshr_b32 s0, s2, 2 1042; GFX10-NEXT: v_cmp_eq_u32_e64 vcc_lo, s0, 1 1043; GFX10-NEXT: v_or3_b32 v0, v0, v6, v4 1044; GFX10-NEXT: v_or3_b32 v1, v1, v7, v5 1045; GFX10-NEXT: s_and_b32 s0, s2, 3 1046; GFX10-NEXT: s_lshl_b32 s0, s0, 3 1047; GFX10-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo 1048; GFX10-NEXT: v_lshrrev_b32_e32 v0, s0, v0 1049; GFX10-NEXT: v_readfirstlane_b32 s0, v0 1050; GFX10-NEXT: ; return to shader part epilog 1051 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1052 %element = extractelement <8 x i8> %vector, i32 %idx 1053 ret i8 %element 1054} 1055 1056define i8 @extractelement_vgpr_v8i8_vgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 %idx) { 1057; GFX9-LABEL: extractelement_vgpr_v8i8_vgpr_idx: 1058; GFX9: ; %bb.0: 1059; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1060; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1061; GFX9-NEXT: s_mov_b32 s4, 8 1062; GFX9-NEXT: s_movk_i32 s5, 0xff 1063; GFX9-NEXT: v_lshrrev_b32_e32 v3, 2, v2 1064; GFX9-NEXT: v_and_b32_e32 v2, 3, v2 1065; GFX9-NEXT: v_cmp_eq_u32_e32 vcc, 1, v3 1066; GFX9-NEXT: s_waitcnt vmcnt(0) 1067; GFX9-NEXT: v_lshrrev_b32_e32 v4, 8, v0 1068; GFX9-NEXT: v_lshrrev_b32_e32 v6, 8, v1 1069; GFX9-NEXT: v_lshrrev_b32_e32 v5, 24, v0 1070; GFX9-NEXT: v_lshrrev_b32_e32 v7, 24, v1 1071; GFX9-NEXT: v_lshlrev_b32_sdwa v4, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1072; GFX9-NEXT: v_lshlrev_b32_sdwa v6, s4, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1073; GFX9-NEXT: v_and_b32_sdwa v8, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1074; GFX9-NEXT: v_and_b32_sdwa v9, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1075; GFX9-NEXT: v_lshlrev_b32_e32 v5, 24, v5 1076; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v4 1077; GFX9-NEXT: v_lshlrev_b32_e32 v7, 24, v7 1078; GFX9-NEXT: v_and_or_b32 v1, v1, s5, v6 1079; GFX9-NEXT: v_or3_b32 v0, v0, v8, v5 1080; GFX9-NEXT: v_or3_b32 v1, v1, v9, v7 1081; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 1082; GFX9-NEXT: v_lshlrev_b32_e32 v1, 3, v2 1083; GFX9-NEXT: v_lshrrev_b32_e32 v0, v1, v0 1084; GFX9-NEXT: s_setpc_b64 s[30:31] 1085; 1086; GFX8-LABEL: extractelement_vgpr_v8i8_vgpr_idx: 1087; GFX8: ; %bb.0: 1088; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1089; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1090; GFX8-NEXT: s_movk_i32 s4, 0xff 1091; GFX8-NEXT: v_mov_b32_e32 v3, 8 1092; GFX8-NEXT: v_mov_b32_e32 v4, 8 1093; GFX8-NEXT: v_mov_b32_e32 v5, s4 1094; GFX8-NEXT: v_lshrrev_b32_e32 v6, 2, v2 1095; GFX8-NEXT: v_and_b32_e32 v2, 3, v2 1096; GFX8-NEXT: v_cmp_eq_u32_e32 vcc, 1, v6 1097; GFX8-NEXT: s_waitcnt vmcnt(0) 1098; GFX8-NEXT: v_lshrrev_b32_e32 v7, 8, v0 1099; GFX8-NEXT: v_lshrrev_b32_e32 v9, 8, v1 1100; GFX8-NEXT: v_lshlrev_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1101; GFX8-NEXT: v_lshlrev_b32_sdwa v4, v4, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1102; GFX8-NEXT: v_lshrrev_b32_e32 v8, 24, v0 1103; GFX8-NEXT: v_and_b32_sdwa v11, v0, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1104; GFX8-NEXT: v_or_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1105; GFX8-NEXT: v_lshrrev_b32_e32 v10, 24, v1 1106; GFX8-NEXT: v_and_b32_sdwa v5, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1107; GFX8-NEXT: v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1108; GFX8-NEXT: v_lshlrev_b32_e32 v7, 24, v8 1109; GFX8-NEXT: v_or_b32_e32 v0, v0, v11 1110; GFX8-NEXT: v_lshlrev_b32_e32 v8, 24, v10 1111; GFX8-NEXT: v_or_b32_e32 v1, v1, v5 1112; GFX8-NEXT: v_or_b32_e32 v0, v0, v7 1113; GFX8-NEXT: v_or_b32_e32 v1, v1, v8 1114; GFX8-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 1115; GFX8-NEXT: v_lshlrev_b32_e32 v1, 3, v2 1116; GFX8-NEXT: v_lshrrev_b32_e32 v0, v1, v0 1117; GFX8-NEXT: s_setpc_b64 s[30:31] 1118; 1119; GFX7-LABEL: extractelement_vgpr_v8i8_vgpr_idx: 1120; GFX7: ; %bb.0: 1121; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1122; GFX7-NEXT: s_mov_b32 s6, 0 1123; GFX7-NEXT: s_mov_b32 s7, 0xf000 1124; GFX7-NEXT: s_mov_b64 s[4:5], 0 1125; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 1126; GFX7-NEXT: s_movk_i32 s4, 0xff 1127; GFX7-NEXT: v_lshrrev_b32_e32 v3, 2, v2 1128; GFX7-NEXT: v_and_b32_e32 v2, 3, v2 1129; GFX7-NEXT: v_cmp_eq_u32_e32 vcc, 1, v3 1130; GFX7-NEXT: s_waitcnt vmcnt(0) 1131; GFX7-NEXT: v_lshrrev_b32_e32 v4, 8, v0 1132; GFX7-NEXT: v_lshrrev_b32_e32 v7, 8, v1 1133; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v0 1134; GFX7-NEXT: v_lshrrev_b32_e32 v8, 16, v1 1135; GFX7-NEXT: v_and_b32_e32 v4, s4, v4 1136; GFX7-NEXT: v_and_b32_e32 v7, s4, v7 1137; GFX7-NEXT: v_lshrrev_b32_e32 v6, 24, v0 1138; GFX7-NEXT: v_lshrrev_b32_e32 v9, 24, v1 1139; GFX7-NEXT: v_and_b32_e32 v5, s4, v5 1140; GFX7-NEXT: v_and_b32_e32 v8, s4, v8 1141; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 1142; GFX7-NEXT: v_lshlrev_b32_e32 v4, 8, v4 1143; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 1144; GFX7-NEXT: v_lshlrev_b32_e32 v7, 8, v7 1145; GFX7-NEXT: v_lshlrev_b32_e32 v5, 16, v5 1146; GFX7-NEXT: v_or_b32_e32 v0, v0, v4 1147; GFX7-NEXT: v_lshlrev_b32_e32 v8, 16, v8 1148; GFX7-NEXT: v_or_b32_e32 v1, v1, v7 1149; GFX7-NEXT: v_lshlrev_b32_e32 v6, 24, v6 1150; GFX7-NEXT: v_or_b32_e32 v0, v0, v5 1151; GFX7-NEXT: v_lshlrev_b32_e32 v9, 24, v9 1152; GFX7-NEXT: v_or_b32_e32 v1, v1, v8 1153; GFX7-NEXT: v_or_b32_e32 v0, v0, v6 1154; GFX7-NEXT: v_or_b32_e32 v1, v1, v9 1155; GFX7-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 1156; GFX7-NEXT: v_lshlrev_b32_e32 v1, 3, v2 1157; GFX7-NEXT: v_lshrrev_b32_e32 v0, v1, v0 1158; GFX7-NEXT: s_setpc_b64 s[30:31] 1159; 1160; GFX10-LABEL: extractelement_vgpr_v8i8_vgpr_idx: 1161; GFX10: ; %bb.0: 1162; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1163; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 1164; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1165; GFX10-NEXT: s_mov_b32 s4, 8 1166; GFX10-NEXT: s_movk_i32 s5, 0xff 1167; GFX10-NEXT: s_waitcnt vmcnt(0) 1168; GFX10-NEXT: v_lshrrev_b32_e32 v3, 8, v0 1169; GFX10-NEXT: v_lshrrev_b32_e32 v4, 8, v1 1170; GFX10-NEXT: v_lshrrev_b32_e32 v5, 24, v0 1171; GFX10-NEXT: v_lshrrev_b32_e32 v6, 24, v1 1172; GFX10-NEXT: v_and_b32_sdwa v7, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1173; GFX10-NEXT: v_lshlrev_b32_sdwa v3, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1174; GFX10-NEXT: v_lshlrev_b32_sdwa v4, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1175; GFX10-NEXT: v_and_b32_sdwa v8, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1176; GFX10-NEXT: v_lshlrev_b32_e32 v5, 24, v5 1177; GFX10-NEXT: v_lshlrev_b32_e32 v6, 24, v6 1178; GFX10-NEXT: v_and_or_b32 v0, v0, s5, v3 1179; GFX10-NEXT: v_and_or_b32 v1, v1, s5, v4 1180; GFX10-NEXT: v_lshrrev_b32_e32 v3, 2, v2 1181; GFX10-NEXT: v_and_b32_e32 v2, 3, v2 1182; GFX10-NEXT: v_or3_b32 v0, v0, v7, v5 1183; GFX10-NEXT: v_or3_b32 v1, v1, v8, v6 1184; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v3 1185; GFX10-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo 1186; GFX10-NEXT: v_lshlrev_b32_e32 v1, 3, v2 1187; GFX10-NEXT: v_lshrrev_b32_e32 v0, v1, v0 1188; GFX10-NEXT: s_setpc_b64 s[30:31] 1189 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1190 %element = extractelement <8 x i8> %vector, i32 %idx 1191 ret i8 %element 1192} 1193 1194define amdgpu_ps i8 @extractelement_sgpr_v8i8_vgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 %idx) { 1195; GCN-LABEL: extractelement_sgpr_v8i8_vgpr_idx: 1196; GCN: ; %bb.0: 1197; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1198; GCN-NEXT: s_movk_i32 s8, 0xff 1199; GCN-NEXT: v_lshrrev_b32_e32 v1, 2, v0 1200; GCN-NEXT: v_and_b32_e32 v0, 3, v0 1201; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v1 1202; GCN-NEXT: s_waitcnt lgkmcnt(0) 1203; GCN-NEXT: s_lshr_b32 s2, s0, 8 1204; GCN-NEXT: s_and_b32 s2, s2, s8 1205; GCN-NEXT: s_lshr_b32 s3, s0, 16 1206; GCN-NEXT: s_lshr_b32 s4, s0, 24 1207; GCN-NEXT: s_and_b32 s0, s0, s8 1208; GCN-NEXT: s_lshl_b32 s2, s2, 8 1209; GCN-NEXT: s_or_b32 s0, s0, s2 1210; GCN-NEXT: s_and_b32 s2, s3, s8 1211; GCN-NEXT: s_lshl_b32 s2, s2, 16 1212; GCN-NEXT: s_or_b32 s0, s0, s2 1213; GCN-NEXT: s_lshl_b32 s2, s4, 24 1214; GCN-NEXT: s_lshr_b32 s5, s1, 8 1215; GCN-NEXT: s_or_b32 s0, s0, s2 1216; GCN-NEXT: s_and_b32 s2, s5, s8 1217; GCN-NEXT: s_lshr_b32 s6, s1, 16 1218; GCN-NEXT: s_lshr_b32 s7, s1, 24 1219; GCN-NEXT: s_and_b32 s1, s1, s8 1220; GCN-NEXT: s_lshl_b32 s2, s2, 8 1221; GCN-NEXT: s_or_b32 s1, s1, s2 1222; GCN-NEXT: s_and_b32 s2, s6, s8 1223; GCN-NEXT: s_lshl_b32 s2, s2, 16 1224; GCN-NEXT: s_or_b32 s1, s1, s2 1225; GCN-NEXT: s_lshl_b32 s2, s7, 24 1226; GCN-NEXT: s_or_b32 s1, s1, s2 1227; GCN-NEXT: v_mov_b32_e32 v2, s0 1228; GCN-NEXT: v_mov_b32_e32 v3, s1 1229; GCN-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc 1230; GCN-NEXT: v_lshlrev_b32_e32 v0, 3, v0 1231; GCN-NEXT: v_lshrrev_b32_e32 v0, v0, v1 1232; GCN-NEXT: v_readfirstlane_b32 s0, v0 1233; GCN-NEXT: ; return to shader part epilog 1234; 1235; GFX10-LABEL: extractelement_sgpr_v8i8_vgpr_idx: 1236; GFX10: ; %bb.0: 1237; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1238; GFX10-NEXT: s_movk_i32 s2, 0xff 1239; GFX10-NEXT: v_lshrrev_b32_e32 v1, 2, v0 1240; GFX10-NEXT: v_and_b32_e32 v0, 3, v0 1241; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v1 1242; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0 1243; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1244; GFX10-NEXT: s_lshr_b32 s6, s1, 8 1245; GFX10-NEXT: s_lshr_b32 s3, s0, 8 1246; GFX10-NEXT: s_lshr_b32 s4, s0, 16 1247; GFX10-NEXT: s_and_b32 s6, s6, s2 1248; GFX10-NEXT: s_lshr_b32 s7, s1, 16 1249; GFX10-NEXT: s_lshr_b32 s5, s0, 24 1250; GFX10-NEXT: s_and_b32 s3, s3, s2 1251; GFX10-NEXT: s_lshr_b32 s8, s1, 24 1252; GFX10-NEXT: s_and_b32 s0, s0, s2 1253; GFX10-NEXT: s_and_b32 s1, s1, s2 1254; GFX10-NEXT: s_and_b32 s4, s4, s2 1255; GFX10-NEXT: s_and_b32 s2, s7, s2 1256; GFX10-NEXT: s_lshl_b32 s6, s6, 8 1257; GFX10-NEXT: s_lshl_b32 s2, s2, 16 1258; GFX10-NEXT: s_or_b32 s1, s1, s6 1259; GFX10-NEXT: s_lshl_b32 s7, s8, 24 1260; GFX10-NEXT: s_or_b32 s1, s1, s2 1261; GFX10-NEXT: s_lshl_b32 s3, s3, 8 1262; GFX10-NEXT: s_or_b32 s1, s1, s7 1263; GFX10-NEXT: s_lshl_b32 s2, s4, 16 1264; GFX10-NEXT: s_or_b32 s0, s0, s3 1265; GFX10-NEXT: v_mov_b32_e32 v2, s1 1266; GFX10-NEXT: s_lshl_b32 s5, s5, 24 1267; GFX10-NEXT: s_or_b32 s0, s0, s2 1268; GFX10-NEXT: s_or_b32 s0, s0, s5 1269; GFX10-NEXT: v_cndmask_b32_e32 v1, s0, v2, vcc_lo 1270; GFX10-NEXT: v_lshrrev_b32_e32 v0, v0, v1 1271; GFX10-NEXT: v_readfirstlane_b32 s0, v0 1272; GFX10-NEXT: ; return to shader part epilog 1273 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1274 %element = extractelement <8 x i8> %vector, i32 %idx 1275 ret i8 %element 1276} 1277 1278define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx0(<8 x i8> addrspace(4)* inreg %ptr) { 1279; GCN-LABEL: extractelement_sgpr_v8i8_idx0: 1280; GCN: ; %bb.0: 1281; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1282; GCN-NEXT: s_movk_i32 s4, 0xff 1283; GCN-NEXT: s_waitcnt lgkmcnt(0) 1284; GCN-NEXT: s_lshr_b32 s1, s0, 8 1285; GCN-NEXT: s_and_b32 s1, s1, s4 1286; GCN-NEXT: s_lshr_b32 s2, s0, 16 1287; GCN-NEXT: s_lshr_b32 s3, s0, 24 1288; GCN-NEXT: s_and_b32 s0, s0, s4 1289; GCN-NEXT: s_lshl_b32 s1, s1, 8 1290; GCN-NEXT: s_or_b32 s0, s0, s1 1291; GCN-NEXT: s_and_b32 s1, s2, s4 1292; GCN-NEXT: s_lshl_b32 s1, s1, 16 1293; GCN-NEXT: s_or_b32 s0, s0, s1 1294; GCN-NEXT: s_lshl_b32 s1, s3, 24 1295; GCN-NEXT: s_or_b32 s0, s0, s1 1296; GCN-NEXT: ; return to shader part epilog 1297; 1298; GFX10-LABEL: extractelement_sgpr_v8i8_idx0: 1299; GFX10: ; %bb.0: 1300; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1301; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1302; GFX10-NEXT: s_movk_i32 s1, 0xff 1303; GFX10-NEXT: s_lshr_b32 s2, s0, 8 1304; GFX10-NEXT: s_lshr_b32 s3, s0, 16 1305; GFX10-NEXT: s_and_b32 s2, s2, s1 1306; GFX10-NEXT: s_and_b32 s4, s0, s1 1307; GFX10-NEXT: s_and_b32 s1, s3, s1 1308; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1309; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1310; GFX10-NEXT: s_lshl_b32 s1, s1, 16 1311; GFX10-NEXT: s_or_b32 s2, s4, s2 1312; GFX10-NEXT: s_lshl_b32 s0, s0, 24 1313; GFX10-NEXT: s_or_b32 s1, s2, s1 1314; GFX10-NEXT: s_or_b32 s0, s1, s0 1315; GFX10-NEXT: ; return to shader part epilog 1316 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1317 %element = extractelement <8 x i8> %vector, i32 0 1318 ret i8 %element 1319} 1320 1321define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx1(<8 x i8> addrspace(4)* inreg %ptr) { 1322; GCN-LABEL: extractelement_sgpr_v8i8_idx1: 1323; GCN: ; %bb.0: 1324; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1325; GCN-NEXT: s_movk_i32 s4, 0xff 1326; GCN-NEXT: s_waitcnt lgkmcnt(0) 1327; GCN-NEXT: s_lshr_b32 s1, s0, 8 1328; GCN-NEXT: s_and_b32 s1, s1, s4 1329; GCN-NEXT: s_lshr_b32 s2, s0, 16 1330; GCN-NEXT: s_lshr_b32 s3, s0, 24 1331; GCN-NEXT: s_and_b32 s0, s0, s4 1332; GCN-NEXT: s_lshl_b32 s1, s1, 8 1333; GCN-NEXT: s_or_b32 s0, s0, s1 1334; GCN-NEXT: s_and_b32 s1, s2, s4 1335; GCN-NEXT: s_lshl_b32 s1, s1, 16 1336; GCN-NEXT: s_or_b32 s0, s0, s1 1337; GCN-NEXT: s_lshl_b32 s1, s3, 24 1338; GCN-NEXT: s_or_b32 s0, s0, s1 1339; GCN-NEXT: s_lshr_b32 s0, s0, 8 1340; GCN-NEXT: ; return to shader part epilog 1341; 1342; GFX10-LABEL: extractelement_sgpr_v8i8_idx1: 1343; GFX10: ; %bb.0: 1344; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1345; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1346; GFX10-NEXT: s_movk_i32 s1, 0xff 1347; GFX10-NEXT: s_lshr_b32 s2, s0, 8 1348; GFX10-NEXT: s_lshr_b32 s3, s0, 16 1349; GFX10-NEXT: s_and_b32 s2, s2, s1 1350; GFX10-NEXT: s_and_b32 s4, s0, s1 1351; GFX10-NEXT: s_and_b32 s1, s3, s1 1352; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1353; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1354; GFX10-NEXT: s_lshl_b32 s1, s1, 16 1355; GFX10-NEXT: s_or_b32 s2, s4, s2 1356; GFX10-NEXT: s_lshl_b32 s0, s0, 24 1357; GFX10-NEXT: s_or_b32 s1, s2, s1 1358; GFX10-NEXT: s_or_b32 s0, s1, s0 1359; GFX10-NEXT: s_lshr_b32 s0, s0, 8 1360; GFX10-NEXT: ; return to shader part epilog 1361 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1362 %element = extractelement <8 x i8> %vector, i32 1 1363 ret i8 %element 1364} 1365 1366define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx2(<8 x i8> addrspace(4)* inreg %ptr) { 1367; GCN-LABEL: extractelement_sgpr_v8i8_idx2: 1368; GCN: ; %bb.0: 1369; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1370; GCN-NEXT: s_movk_i32 s4, 0xff 1371; GCN-NEXT: s_waitcnt lgkmcnt(0) 1372; GCN-NEXT: s_lshr_b32 s1, s0, 8 1373; GCN-NEXT: s_and_b32 s1, s1, s4 1374; GCN-NEXT: s_lshr_b32 s2, s0, 16 1375; GCN-NEXT: s_lshr_b32 s3, s0, 24 1376; GCN-NEXT: s_and_b32 s0, s0, s4 1377; GCN-NEXT: s_lshl_b32 s1, s1, 8 1378; GCN-NEXT: s_or_b32 s0, s0, s1 1379; GCN-NEXT: s_and_b32 s1, s2, s4 1380; GCN-NEXT: s_lshl_b32 s1, s1, 16 1381; GCN-NEXT: s_or_b32 s0, s0, s1 1382; GCN-NEXT: s_lshl_b32 s1, s3, 24 1383; GCN-NEXT: s_or_b32 s0, s0, s1 1384; GCN-NEXT: s_lshr_b32 s0, s0, 16 1385; GCN-NEXT: ; return to shader part epilog 1386; 1387; GFX10-LABEL: extractelement_sgpr_v8i8_idx2: 1388; GFX10: ; %bb.0: 1389; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1390; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1391; GFX10-NEXT: s_movk_i32 s1, 0xff 1392; GFX10-NEXT: s_lshr_b32 s2, s0, 8 1393; GFX10-NEXT: s_lshr_b32 s3, s0, 16 1394; GFX10-NEXT: s_and_b32 s2, s2, s1 1395; GFX10-NEXT: s_and_b32 s4, s0, s1 1396; GFX10-NEXT: s_and_b32 s1, s3, s1 1397; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1398; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1399; GFX10-NEXT: s_lshl_b32 s1, s1, 16 1400; GFX10-NEXT: s_or_b32 s2, s4, s2 1401; GFX10-NEXT: s_lshl_b32 s0, s0, 24 1402; GFX10-NEXT: s_or_b32 s1, s2, s1 1403; GFX10-NEXT: s_or_b32 s0, s1, s0 1404; GFX10-NEXT: s_lshr_b32 s0, s0, 16 1405; GFX10-NEXT: ; return to shader part epilog 1406 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1407 %element = extractelement <8 x i8> %vector, i32 2 1408 ret i8 %element 1409} 1410 1411define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx3(<8 x i8> addrspace(4)* inreg %ptr) { 1412; GCN-LABEL: extractelement_sgpr_v8i8_idx3: 1413; GCN: ; %bb.0: 1414; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1415; GCN-NEXT: s_movk_i32 s4, 0xff 1416; GCN-NEXT: s_waitcnt lgkmcnt(0) 1417; GCN-NEXT: s_lshr_b32 s1, s0, 8 1418; GCN-NEXT: s_and_b32 s1, s1, s4 1419; GCN-NEXT: s_lshr_b32 s2, s0, 16 1420; GCN-NEXT: s_lshr_b32 s3, s0, 24 1421; GCN-NEXT: s_and_b32 s0, s0, s4 1422; GCN-NEXT: s_lshl_b32 s1, s1, 8 1423; GCN-NEXT: s_or_b32 s0, s0, s1 1424; GCN-NEXT: s_and_b32 s1, s2, s4 1425; GCN-NEXT: s_lshl_b32 s1, s1, 16 1426; GCN-NEXT: s_or_b32 s0, s0, s1 1427; GCN-NEXT: s_lshl_b32 s1, s3, 24 1428; GCN-NEXT: s_or_b32 s0, s0, s1 1429; GCN-NEXT: s_lshr_b32 s0, s0, 24 1430; GCN-NEXT: ; return to shader part epilog 1431; 1432; GFX10-LABEL: extractelement_sgpr_v8i8_idx3: 1433; GFX10: ; %bb.0: 1434; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1435; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1436; GFX10-NEXT: s_movk_i32 s1, 0xff 1437; GFX10-NEXT: s_lshr_b32 s2, s0, 8 1438; GFX10-NEXT: s_lshr_b32 s3, s0, 16 1439; GFX10-NEXT: s_and_b32 s2, s2, s1 1440; GFX10-NEXT: s_and_b32 s4, s0, s1 1441; GFX10-NEXT: s_and_b32 s1, s3, s1 1442; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1443; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1444; GFX10-NEXT: s_lshl_b32 s1, s1, 16 1445; GFX10-NEXT: s_or_b32 s2, s4, s2 1446; GFX10-NEXT: s_lshl_b32 s0, s0, 24 1447; GFX10-NEXT: s_or_b32 s1, s2, s1 1448; GFX10-NEXT: s_or_b32 s0, s1, s0 1449; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1450; GFX10-NEXT: ; return to shader part epilog 1451 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1452 %element = extractelement <8 x i8> %vector, i32 3 1453 ret i8 %element 1454} 1455 1456define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx4(<8 x i8> addrspace(4)* inreg %ptr) { 1457; GCN-LABEL: extractelement_sgpr_v8i8_idx4: 1458; GCN: ; %bb.0: 1459; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1460; GCN-NEXT: s_movk_i32 s4, 0xff 1461; GCN-NEXT: s_waitcnt lgkmcnt(0) 1462; GCN-NEXT: s_lshr_b32 s0, s1, 8 1463; GCN-NEXT: s_and_b32 s0, s0, s4 1464; GCN-NEXT: s_lshr_b32 s2, s1, 16 1465; GCN-NEXT: s_lshr_b32 s3, s1, 24 1466; GCN-NEXT: s_and_b32 s1, s1, s4 1467; GCN-NEXT: s_lshl_b32 s0, s0, 8 1468; GCN-NEXT: s_or_b32 s0, s1, s0 1469; GCN-NEXT: s_and_b32 s1, s2, s4 1470; GCN-NEXT: s_lshl_b32 s1, s1, 16 1471; GCN-NEXT: s_or_b32 s0, s0, s1 1472; GCN-NEXT: s_lshl_b32 s1, s3, 24 1473; GCN-NEXT: s_or_b32 s0, s0, s1 1474; GCN-NEXT: ; return to shader part epilog 1475; 1476; GFX10-LABEL: extractelement_sgpr_v8i8_idx4: 1477; GFX10: ; %bb.0: 1478; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1479; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1480; GFX10-NEXT: s_movk_i32 s0, 0xff 1481; GFX10-NEXT: s_lshr_b32 s2, s1, 8 1482; GFX10-NEXT: s_lshr_b32 s3, s1, 16 1483; GFX10-NEXT: s_and_b32 s2, s2, s0 1484; GFX10-NEXT: s_and_b32 s4, s1, s0 1485; GFX10-NEXT: s_and_b32 s0, s3, s0 1486; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1487; GFX10-NEXT: s_lshr_b32 s1, s1, 24 1488; GFX10-NEXT: s_lshl_b32 s0, s0, 16 1489; GFX10-NEXT: s_or_b32 s2, s4, s2 1490; GFX10-NEXT: s_lshl_b32 s1, s1, 24 1491; GFX10-NEXT: s_or_b32 s0, s2, s0 1492; GFX10-NEXT: s_or_b32 s0, s0, s1 1493; GFX10-NEXT: ; return to shader part epilog 1494 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1495 %element = extractelement <8 x i8> %vector, i32 4 1496 ret i8 %element 1497} 1498 1499define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx5(<8 x i8> addrspace(4)* inreg %ptr) { 1500; GCN-LABEL: extractelement_sgpr_v8i8_idx5: 1501; GCN: ; %bb.0: 1502; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1503; GCN-NEXT: s_movk_i32 s4, 0xff 1504; GCN-NEXT: s_waitcnt lgkmcnt(0) 1505; GCN-NEXT: s_lshr_b32 s0, s1, 8 1506; GCN-NEXT: s_and_b32 s0, s0, s4 1507; GCN-NEXT: s_lshr_b32 s2, s1, 16 1508; GCN-NEXT: s_lshr_b32 s3, s1, 24 1509; GCN-NEXT: s_and_b32 s1, s1, s4 1510; GCN-NEXT: s_lshl_b32 s0, s0, 8 1511; GCN-NEXT: s_or_b32 s0, s1, s0 1512; GCN-NEXT: s_and_b32 s1, s2, s4 1513; GCN-NEXT: s_lshl_b32 s1, s1, 16 1514; GCN-NEXT: s_or_b32 s0, s0, s1 1515; GCN-NEXT: s_lshl_b32 s1, s3, 24 1516; GCN-NEXT: s_or_b32 s0, s0, s1 1517; GCN-NEXT: s_lshr_b32 s0, s0, 8 1518; GCN-NEXT: ; return to shader part epilog 1519; 1520; GFX10-LABEL: extractelement_sgpr_v8i8_idx5: 1521; GFX10: ; %bb.0: 1522; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1523; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1524; GFX10-NEXT: s_movk_i32 s0, 0xff 1525; GFX10-NEXT: s_lshr_b32 s2, s1, 8 1526; GFX10-NEXT: s_lshr_b32 s3, s1, 16 1527; GFX10-NEXT: s_and_b32 s2, s2, s0 1528; GFX10-NEXT: s_and_b32 s4, s1, s0 1529; GFX10-NEXT: s_and_b32 s0, s3, s0 1530; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1531; GFX10-NEXT: s_lshr_b32 s1, s1, 24 1532; GFX10-NEXT: s_lshl_b32 s0, s0, 16 1533; GFX10-NEXT: s_or_b32 s2, s4, s2 1534; GFX10-NEXT: s_lshl_b32 s1, s1, 24 1535; GFX10-NEXT: s_or_b32 s0, s2, s0 1536; GFX10-NEXT: s_or_b32 s0, s0, s1 1537; GFX10-NEXT: s_lshr_b32 s0, s0, 8 1538; GFX10-NEXT: ; return to shader part epilog 1539 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1540 %element = extractelement <8 x i8> %vector, i32 5 1541 ret i8 %element 1542} 1543 1544define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx6(<8 x i8> addrspace(4)* inreg %ptr) { 1545; GCN-LABEL: extractelement_sgpr_v8i8_idx6: 1546; GCN: ; %bb.0: 1547; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1548; GCN-NEXT: s_movk_i32 s4, 0xff 1549; GCN-NEXT: s_waitcnt lgkmcnt(0) 1550; GCN-NEXT: s_lshr_b32 s0, s1, 8 1551; GCN-NEXT: s_and_b32 s0, s0, s4 1552; GCN-NEXT: s_lshr_b32 s2, s1, 16 1553; GCN-NEXT: s_lshr_b32 s3, s1, 24 1554; GCN-NEXT: s_and_b32 s1, s1, s4 1555; GCN-NEXT: s_lshl_b32 s0, s0, 8 1556; GCN-NEXT: s_or_b32 s0, s1, s0 1557; GCN-NEXT: s_and_b32 s1, s2, s4 1558; GCN-NEXT: s_lshl_b32 s1, s1, 16 1559; GCN-NEXT: s_or_b32 s0, s0, s1 1560; GCN-NEXT: s_lshl_b32 s1, s3, 24 1561; GCN-NEXT: s_or_b32 s0, s0, s1 1562; GCN-NEXT: s_lshr_b32 s0, s0, 16 1563; GCN-NEXT: ; return to shader part epilog 1564; 1565; GFX10-LABEL: extractelement_sgpr_v8i8_idx6: 1566; GFX10: ; %bb.0: 1567; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1568; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1569; GFX10-NEXT: s_movk_i32 s0, 0xff 1570; GFX10-NEXT: s_lshr_b32 s2, s1, 8 1571; GFX10-NEXT: s_lshr_b32 s3, s1, 16 1572; GFX10-NEXT: s_and_b32 s2, s2, s0 1573; GFX10-NEXT: s_and_b32 s4, s1, s0 1574; GFX10-NEXT: s_and_b32 s0, s3, s0 1575; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1576; GFX10-NEXT: s_lshr_b32 s1, s1, 24 1577; GFX10-NEXT: s_lshl_b32 s0, s0, 16 1578; GFX10-NEXT: s_or_b32 s2, s4, s2 1579; GFX10-NEXT: s_lshl_b32 s1, s1, 24 1580; GFX10-NEXT: s_or_b32 s0, s2, s0 1581; GFX10-NEXT: s_or_b32 s0, s0, s1 1582; GFX10-NEXT: s_lshr_b32 s0, s0, 16 1583; GFX10-NEXT: ; return to shader part epilog 1584 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1585 %element = extractelement <8 x i8> %vector, i32 6 1586 ret i8 %element 1587} 1588 1589define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx7(<8 x i8> addrspace(4)* inreg %ptr) { 1590; GCN-LABEL: extractelement_sgpr_v8i8_idx7: 1591; GCN: ; %bb.0: 1592; GCN-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1593; GCN-NEXT: s_movk_i32 s4, 0xff 1594; GCN-NEXT: s_waitcnt lgkmcnt(0) 1595; GCN-NEXT: s_lshr_b32 s0, s1, 8 1596; GCN-NEXT: s_and_b32 s0, s0, s4 1597; GCN-NEXT: s_lshr_b32 s2, s1, 16 1598; GCN-NEXT: s_lshr_b32 s3, s1, 24 1599; GCN-NEXT: s_and_b32 s1, s1, s4 1600; GCN-NEXT: s_lshl_b32 s0, s0, 8 1601; GCN-NEXT: s_or_b32 s0, s1, s0 1602; GCN-NEXT: s_and_b32 s1, s2, s4 1603; GCN-NEXT: s_lshl_b32 s1, s1, 16 1604; GCN-NEXT: s_or_b32 s0, s0, s1 1605; GCN-NEXT: s_lshl_b32 s1, s3, 24 1606; GCN-NEXT: s_or_b32 s0, s0, s1 1607; GCN-NEXT: s_lshr_b32 s0, s0, 24 1608; GCN-NEXT: ; return to shader part epilog 1609; 1610; GFX10-LABEL: extractelement_sgpr_v8i8_idx7: 1611; GFX10: ; %bb.0: 1612; GFX10-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x0 1613; GFX10-NEXT: s_waitcnt lgkmcnt(0) 1614; GFX10-NEXT: s_movk_i32 s0, 0xff 1615; GFX10-NEXT: s_lshr_b32 s2, s1, 8 1616; GFX10-NEXT: s_lshr_b32 s3, s1, 16 1617; GFX10-NEXT: s_and_b32 s2, s2, s0 1618; GFX10-NEXT: s_and_b32 s4, s1, s0 1619; GFX10-NEXT: s_and_b32 s0, s3, s0 1620; GFX10-NEXT: s_lshl_b32 s2, s2, 8 1621; GFX10-NEXT: s_lshr_b32 s1, s1, 24 1622; GFX10-NEXT: s_lshl_b32 s0, s0, 16 1623; GFX10-NEXT: s_or_b32 s2, s4, s2 1624; GFX10-NEXT: s_lshl_b32 s1, s1, 24 1625; GFX10-NEXT: s_or_b32 s0, s2, s0 1626; GFX10-NEXT: s_or_b32 s0, s0, s1 1627; GFX10-NEXT: s_lshr_b32 s0, s0, 24 1628; GFX10-NEXT: ; return to shader part epilog 1629 %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr 1630 %element = extractelement <8 x i8> %vector, i32 7 1631 ret i8 %element 1632} 1633 1634define i8 @extractelement_vgpr_v8i8_idx0(<8 x i8> addrspace(1)* %ptr) { 1635; GFX9-LABEL: extractelement_vgpr_v8i8_idx0: 1636; GFX9: ; %bb.0: 1637; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1638; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1639; GFX9-NEXT: s_mov_b32 s4, 8 1640; GFX9-NEXT: s_movk_i32 s5, 0xff 1641; GFX9-NEXT: s_waitcnt vmcnt(0) 1642; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1643; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1644; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1645; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1646; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 1647; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1648; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 1649; GFX9-NEXT: s_setpc_b64 s[30:31] 1650; 1651; GFX8-LABEL: extractelement_vgpr_v8i8_idx0: 1652; GFX8: ; %bb.0: 1653; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1654; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1655; GFX8-NEXT: s_movk_i32 s4, 0xff 1656; GFX8-NEXT: s_waitcnt vmcnt(0) 1657; GFX8-NEXT: v_mov_b32_e32 v1, 8 1658; GFX8-NEXT: v_mov_b32_e32 v2, s4 1659; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 1660; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1661; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1662; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1663; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1664; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 1665; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 1666; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 1667; GFX8-NEXT: s_setpc_b64 s[30:31] 1668; 1669; GFX7-LABEL: extractelement_vgpr_v8i8_idx0: 1670; GFX7: ; %bb.0: 1671; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1672; GFX7-NEXT: s_mov_b32 s6, 0 1673; GFX7-NEXT: s_mov_b32 s7, 0xf000 1674; GFX7-NEXT: s_mov_b64 s[4:5], 0 1675; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 1676; GFX7-NEXT: s_movk_i32 s4, 0xff 1677; GFX7-NEXT: s_waitcnt vmcnt(0) 1678; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1679; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 1680; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 1681; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 1682; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 1683; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 1684; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 1685; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1686; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 1687; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 1688; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 1689; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1690; GFX7-NEXT: s_setpc_b64 s[30:31] 1691; 1692; GFX10-LABEL: extractelement_vgpr_v8i8_idx0: 1693; GFX10: ; %bb.0: 1694; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1695; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 1696; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1697; GFX10-NEXT: s_mov_b32 s4, 8 1698; GFX10-NEXT: s_waitcnt vmcnt(0) 1699; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1700; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1701; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1702; GFX10-NEXT: s_movk_i32 s4, 0xff 1703; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1704; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 1705; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1706; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 1707; GFX10-NEXT: s_setpc_b64 s[30:31] 1708 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1709 %element = extractelement <8 x i8> %vector, i32 0 1710 ret i8 %element 1711} 1712 1713define i8 @extractelement_vgpr_v8i8_idx1(<8 x i8> addrspace(1)* %ptr) { 1714; GFX9-LABEL: extractelement_vgpr_v8i8_idx1: 1715; GFX9: ; %bb.0: 1716; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1717; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1718; GFX9-NEXT: s_mov_b32 s4, 8 1719; GFX9-NEXT: s_movk_i32 s5, 0xff 1720; GFX9-NEXT: s_waitcnt vmcnt(0) 1721; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1722; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1723; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1724; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1725; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 1726; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1727; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 1728; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 1729; GFX9-NEXT: s_setpc_b64 s[30:31] 1730; 1731; GFX8-LABEL: extractelement_vgpr_v8i8_idx1: 1732; GFX8: ; %bb.0: 1733; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1734; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1735; GFX8-NEXT: s_movk_i32 s4, 0xff 1736; GFX8-NEXT: s_waitcnt vmcnt(0) 1737; GFX8-NEXT: v_mov_b32_e32 v1, 8 1738; GFX8-NEXT: v_mov_b32_e32 v2, s4 1739; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 1740; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1741; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1742; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1743; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1744; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 1745; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 1746; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 1747; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 1748; GFX8-NEXT: s_setpc_b64 s[30:31] 1749; 1750; GFX7-LABEL: extractelement_vgpr_v8i8_idx1: 1751; GFX7: ; %bb.0: 1752; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1753; GFX7-NEXT: s_mov_b32 s6, 0 1754; GFX7-NEXT: s_mov_b32 s7, 0xf000 1755; GFX7-NEXT: s_mov_b64 s[4:5], 0 1756; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 1757; GFX7-NEXT: s_movk_i32 s4, 0xff 1758; GFX7-NEXT: s_waitcnt vmcnt(0) 1759; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1760; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 1761; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 1762; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 1763; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 1764; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 1765; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 1766; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1767; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 1768; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 1769; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 1770; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1771; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 1772; GFX7-NEXT: s_setpc_b64 s[30:31] 1773; 1774; GFX10-LABEL: extractelement_vgpr_v8i8_idx1: 1775; GFX10: ; %bb.0: 1776; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1777; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 1778; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1779; GFX10-NEXT: s_mov_b32 s4, 8 1780; GFX10-NEXT: s_waitcnt vmcnt(0) 1781; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1782; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1783; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1784; GFX10-NEXT: s_movk_i32 s4, 0xff 1785; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1786; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 1787; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1788; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 1789; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 1790; GFX10-NEXT: s_setpc_b64 s[30:31] 1791 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1792 %element = extractelement <8 x i8> %vector, i32 1 1793 ret i8 %element 1794} 1795 1796define i8 @extractelement_vgpr_v8i8_idx2(<8 x i8> addrspace(1)* %ptr) { 1797; GFX9-LABEL: extractelement_vgpr_v8i8_idx2: 1798; GFX9: ; %bb.0: 1799; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1800; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1801; GFX9-NEXT: s_mov_b32 s4, 8 1802; GFX9-NEXT: s_movk_i32 s5, 0xff 1803; GFX9-NEXT: s_waitcnt vmcnt(0) 1804; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1805; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1806; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1807; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1808; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 1809; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1810; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 1811; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1812; GFX9-NEXT: s_setpc_b64 s[30:31] 1813; 1814; GFX8-LABEL: extractelement_vgpr_v8i8_idx2: 1815; GFX8: ; %bb.0: 1816; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1817; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1818; GFX8-NEXT: s_movk_i32 s4, 0xff 1819; GFX8-NEXT: s_waitcnt vmcnt(0) 1820; GFX8-NEXT: v_mov_b32_e32 v1, 8 1821; GFX8-NEXT: v_mov_b32_e32 v2, s4 1822; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 1823; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1824; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1825; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1826; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1827; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 1828; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 1829; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 1830; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1831; GFX8-NEXT: s_setpc_b64 s[30:31] 1832; 1833; GFX7-LABEL: extractelement_vgpr_v8i8_idx2: 1834; GFX7: ; %bb.0: 1835; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1836; GFX7-NEXT: s_mov_b32 s6, 0 1837; GFX7-NEXT: s_mov_b32 s7, 0xf000 1838; GFX7-NEXT: s_mov_b64 s[4:5], 0 1839; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 1840; GFX7-NEXT: s_movk_i32 s4, 0xff 1841; GFX7-NEXT: s_waitcnt vmcnt(0) 1842; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1843; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 1844; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 1845; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 1846; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 1847; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 1848; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 1849; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1850; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 1851; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 1852; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 1853; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1854; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1855; GFX7-NEXT: s_setpc_b64 s[30:31] 1856; 1857; GFX10-LABEL: extractelement_vgpr_v8i8_idx2: 1858; GFX10: ; %bb.0: 1859; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1860; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 1861; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1862; GFX10-NEXT: s_mov_b32 s4, 8 1863; GFX10-NEXT: s_waitcnt vmcnt(0) 1864; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1865; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1866; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1867; GFX10-NEXT: s_movk_i32 s4, 0xff 1868; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1869; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 1870; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1871; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 1872; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 1873; GFX10-NEXT: s_setpc_b64 s[30:31] 1874 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1875 %element = extractelement <8 x i8> %vector, i32 2 1876 ret i8 %element 1877} 1878 1879define i8 @extractelement_vgpr_v8i8_idx3(<8 x i8> addrspace(1)* %ptr) { 1880; GFX9-LABEL: extractelement_vgpr_v8i8_idx3: 1881; GFX9: ; %bb.0: 1882; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1883; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1884; GFX9-NEXT: s_mov_b32 s4, 8 1885; GFX9-NEXT: s_movk_i32 s5, 0xff 1886; GFX9-NEXT: s_waitcnt vmcnt(0) 1887; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1888; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1889; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1890; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1891; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 1892; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1893; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 1894; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 1895; GFX9-NEXT: s_setpc_b64 s[30:31] 1896; 1897; GFX8-LABEL: extractelement_vgpr_v8i8_idx3: 1898; GFX8: ; %bb.0: 1899; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1900; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1901; GFX8-NEXT: s_movk_i32 s4, 0xff 1902; GFX8-NEXT: s_waitcnt vmcnt(0) 1903; GFX8-NEXT: v_mov_b32_e32 v1, 8 1904; GFX8-NEXT: v_mov_b32_e32 v2, s4 1905; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 1906; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1907; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 1908; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1909; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1910; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 1911; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 1912; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 1913; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 1914; GFX8-NEXT: s_setpc_b64 s[30:31] 1915; 1916; GFX7-LABEL: extractelement_vgpr_v8i8_idx3: 1917; GFX7: ; %bb.0: 1918; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1919; GFX7-NEXT: s_mov_b32 s6, 0 1920; GFX7-NEXT: s_mov_b32 s7, 0xf000 1921; GFX7-NEXT: s_mov_b64 s[4:5], 0 1922; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 1923; GFX7-NEXT: s_movk_i32 s4, 0xff 1924; GFX7-NEXT: s_waitcnt vmcnt(0) 1925; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1926; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 1927; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 1928; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 1929; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 1930; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 1931; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 1932; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1933; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 1934; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 1935; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 1936; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 1937; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 1938; GFX7-NEXT: s_setpc_b64 s[30:31] 1939; 1940; GFX10-LABEL: extractelement_vgpr_v8i8_idx3: 1941; GFX10: ; %bb.0: 1942; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1943; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 1944; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1945; GFX10-NEXT: s_mov_b32 s4, 8 1946; GFX10-NEXT: s_waitcnt vmcnt(0) 1947; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 1948; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 1949; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1950; GFX10-NEXT: s_movk_i32 s4, 0xff 1951; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1952; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 1953; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1954; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 1955; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 1956; GFX10-NEXT: s_setpc_b64 s[30:31] 1957 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 1958 %element = extractelement <8 x i8> %vector, i32 3 1959 ret i8 %element 1960} 1961 1962define i8 @extractelement_vgpr_v8i8_idx4(<8 x i8> addrspace(1)* %ptr) { 1963; GFX9-LABEL: extractelement_vgpr_v8i8_idx4: 1964; GFX9: ; %bb.0: 1965; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1966; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 1967; GFX9-NEXT: s_mov_b32 s4, 8 1968; GFX9-NEXT: s_movk_i32 s5, 0xff 1969; GFX9-NEXT: s_waitcnt vmcnt(0) 1970; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 1971; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1972; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 1973; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1974; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 1975; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 1976; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 1977; GFX9-NEXT: s_setpc_b64 s[30:31] 1978; 1979; GFX8-LABEL: extractelement_vgpr_v8i8_idx4: 1980; GFX8: ; %bb.0: 1981; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1982; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 1983; GFX8-NEXT: s_movk_i32 s4, 0xff 1984; GFX8-NEXT: s_waitcnt vmcnt(0) 1985; GFX8-NEXT: v_mov_b32_e32 v0, 8 1986; GFX8-NEXT: v_mov_b32_e32 v2, s4 1987; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 1988; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 1989; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 1990; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1991; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 1992; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 1993; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 1994; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 1995; GFX8-NEXT: s_setpc_b64 s[30:31] 1996; 1997; GFX7-LABEL: extractelement_vgpr_v8i8_idx4: 1998; GFX7: ; %bb.0: 1999; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2000; GFX7-NEXT: s_mov_b32 s6, 0 2001; GFX7-NEXT: s_mov_b32 s7, 0xf000 2002; GFX7-NEXT: s_mov_b64 s[4:5], 0 2003; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 2004; GFX7-NEXT: s_movk_i32 s4, 0xff 2005; GFX7-NEXT: s_waitcnt vmcnt(0) 2006; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2007; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 2008; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 2009; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 2010; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 2011; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 2012; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 2013; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 2014; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2015; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 2016; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 2017; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 2018; GFX7-NEXT: s_setpc_b64 s[30:31] 2019; 2020; GFX10-LABEL: extractelement_vgpr_v8i8_idx4: 2021; GFX10: ; %bb.0: 2022; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2023; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 2024; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2025; GFX10-NEXT: s_mov_b32 s4, 8 2026; GFX10-NEXT: s_waitcnt vmcnt(0) 2027; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2028; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2029; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2030; GFX10-NEXT: s_movk_i32 s4, 0xff 2031; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2032; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 2033; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2034; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 2035; GFX10-NEXT: s_setpc_b64 s[30:31] 2036 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 2037 %element = extractelement <8 x i8> %vector, i32 4 2038 ret i8 %element 2039} 2040 2041define i8 @extractelement_vgpr_v8i8_idx5(<8 x i8> addrspace(1)* %ptr) { 2042; GFX9-LABEL: extractelement_vgpr_v8i8_idx5: 2043; GFX9: ; %bb.0: 2044; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2045; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2046; GFX9-NEXT: s_mov_b32 s4, 8 2047; GFX9-NEXT: s_movk_i32 s5, 0xff 2048; GFX9-NEXT: s_waitcnt vmcnt(0) 2049; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2050; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2051; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2052; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2053; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 2054; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2055; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 2056; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 2057; GFX9-NEXT: s_setpc_b64 s[30:31] 2058; 2059; GFX8-LABEL: extractelement_vgpr_v8i8_idx5: 2060; GFX8: ; %bb.0: 2061; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2062; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 2063; GFX8-NEXT: s_movk_i32 s4, 0xff 2064; GFX8-NEXT: s_waitcnt vmcnt(0) 2065; GFX8-NEXT: v_mov_b32_e32 v0, 8 2066; GFX8-NEXT: v_mov_b32_e32 v2, s4 2067; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 2068; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2069; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 2070; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2071; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2072; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 2073; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 2074; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 2075; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 2076; GFX8-NEXT: s_setpc_b64 s[30:31] 2077; 2078; GFX7-LABEL: extractelement_vgpr_v8i8_idx5: 2079; GFX7: ; %bb.0: 2080; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2081; GFX7-NEXT: s_mov_b32 s6, 0 2082; GFX7-NEXT: s_mov_b32 s7, 0xf000 2083; GFX7-NEXT: s_mov_b64 s[4:5], 0 2084; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 2085; GFX7-NEXT: s_movk_i32 s4, 0xff 2086; GFX7-NEXT: s_waitcnt vmcnt(0) 2087; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2088; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 2089; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 2090; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 2091; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 2092; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 2093; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 2094; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 2095; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2096; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 2097; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 2098; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 2099; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 2100; GFX7-NEXT: s_setpc_b64 s[30:31] 2101; 2102; GFX10-LABEL: extractelement_vgpr_v8i8_idx5: 2103; GFX10: ; %bb.0: 2104; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2105; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 2106; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2107; GFX10-NEXT: s_mov_b32 s4, 8 2108; GFX10-NEXT: s_waitcnt vmcnt(0) 2109; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2110; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2111; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2112; GFX10-NEXT: s_movk_i32 s4, 0xff 2113; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2114; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 2115; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2116; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 2117; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 2118; GFX10-NEXT: s_setpc_b64 s[30:31] 2119 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 2120 %element = extractelement <8 x i8> %vector, i32 5 2121 ret i8 %element 2122} 2123 2124define i8 @extractelement_vgpr_v8i8_idx6(<8 x i8> addrspace(1)* %ptr) { 2125; GFX9-LABEL: extractelement_vgpr_v8i8_idx6: 2126; GFX9: ; %bb.0: 2127; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2128; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2129; GFX9-NEXT: s_mov_b32 s4, 8 2130; GFX9-NEXT: s_movk_i32 s5, 0xff 2131; GFX9-NEXT: s_waitcnt vmcnt(0) 2132; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2133; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2134; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2135; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2136; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 2137; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2138; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 2139; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2140; GFX9-NEXT: s_setpc_b64 s[30:31] 2141; 2142; GFX8-LABEL: extractelement_vgpr_v8i8_idx6: 2143; GFX8: ; %bb.0: 2144; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2145; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 2146; GFX8-NEXT: s_movk_i32 s4, 0xff 2147; GFX8-NEXT: s_waitcnt vmcnt(0) 2148; GFX8-NEXT: v_mov_b32_e32 v0, 8 2149; GFX8-NEXT: v_mov_b32_e32 v2, s4 2150; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 2151; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2152; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 2153; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2154; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2155; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 2156; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 2157; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 2158; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2159; GFX8-NEXT: s_setpc_b64 s[30:31] 2160; 2161; GFX7-LABEL: extractelement_vgpr_v8i8_idx6: 2162; GFX7: ; %bb.0: 2163; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2164; GFX7-NEXT: s_mov_b32 s6, 0 2165; GFX7-NEXT: s_mov_b32 s7, 0xf000 2166; GFX7-NEXT: s_mov_b64 s[4:5], 0 2167; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 2168; GFX7-NEXT: s_movk_i32 s4, 0xff 2169; GFX7-NEXT: s_waitcnt vmcnt(0) 2170; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2171; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 2172; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 2173; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 2174; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 2175; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 2176; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 2177; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 2178; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2179; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 2180; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 2181; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 2182; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2183; GFX7-NEXT: s_setpc_b64 s[30:31] 2184; 2185; GFX10-LABEL: extractelement_vgpr_v8i8_idx6: 2186; GFX10: ; %bb.0: 2187; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2188; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 2189; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2190; GFX10-NEXT: s_mov_b32 s4, 8 2191; GFX10-NEXT: s_waitcnt vmcnt(0) 2192; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2193; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2194; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2195; GFX10-NEXT: s_movk_i32 s4, 0xff 2196; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2197; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 2198; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2199; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 2200; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 2201; GFX10-NEXT: s_setpc_b64 s[30:31] 2202 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 2203 %element = extractelement <8 x i8> %vector, i32 6 2204 ret i8 %element 2205} 2206 2207define i8 @extractelement_vgpr_v8i8_idx7(<8 x i8> addrspace(1)* %ptr) { 2208; GFX9-LABEL: extractelement_vgpr_v8i8_idx7: 2209; GFX9: ; %bb.0: 2210; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2211; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2212; GFX9-NEXT: s_mov_b32 s4, 8 2213; GFX9-NEXT: s_movk_i32 s5, 0xff 2214; GFX9-NEXT: s_waitcnt vmcnt(0) 2215; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2216; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2217; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2218; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2219; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 2220; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2221; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 2222; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 2223; GFX9-NEXT: s_setpc_b64 s[30:31] 2224; 2225; GFX8-LABEL: extractelement_vgpr_v8i8_idx7: 2226; GFX8: ; %bb.0: 2227; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2228; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 2229; GFX8-NEXT: s_movk_i32 s4, 0xff 2230; GFX8-NEXT: s_waitcnt vmcnt(0) 2231; GFX8-NEXT: v_mov_b32_e32 v0, 8 2232; GFX8-NEXT: v_mov_b32_e32 v2, s4 2233; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 2234; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2235; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 2236; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2237; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2238; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 2239; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 2240; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 2241; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 2242; GFX8-NEXT: s_setpc_b64 s[30:31] 2243; 2244; GFX7-LABEL: extractelement_vgpr_v8i8_idx7: 2245; GFX7: ; %bb.0: 2246; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2247; GFX7-NEXT: s_mov_b32 s6, 0 2248; GFX7-NEXT: s_mov_b32 s7, 0xf000 2249; GFX7-NEXT: s_mov_b64 s[4:5], 0 2250; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64 2251; GFX7-NEXT: s_movk_i32 s4, 0xff 2252; GFX7-NEXT: s_waitcnt vmcnt(0) 2253; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2254; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 2255; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 2256; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 2257; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 2258; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 2259; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 2260; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 2261; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2262; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 2263; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 2264; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 2265; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 2266; GFX7-NEXT: s_setpc_b64 s[30:31] 2267; 2268; GFX10-LABEL: extractelement_vgpr_v8i8_idx7: 2269; GFX10: ; %bb.0: 2270; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2271; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 2272; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off 2273; GFX10-NEXT: s_mov_b32 s4, 8 2274; GFX10-NEXT: s_waitcnt vmcnt(0) 2275; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 2276; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 2277; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2278; GFX10-NEXT: s_movk_i32 s4, 0xff 2279; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2280; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 2281; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 2282; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 2283; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 2284; GFX10-NEXT: s_setpc_b64 s[30:31] 2285 %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr 2286 %element = extractelement <8 x i8> %vector, i32 7 2287 ret i8 %element 2288} 2289 2290define amdgpu_ps i8 @extractelement_sgpr_v16i8_sgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) { 2291; GCN-LABEL: extractelement_sgpr_v16i8_sgpr_idx: 2292; GCN: ; %bb.0: 2293; GCN-NEXT: s_load_dwordx4 s[0:3], s[2:3], 0x0 2294; GCN-NEXT: s_movk_i32 s17, 0xff 2295; GCN-NEXT: s_waitcnt lgkmcnt(0) 2296; GCN-NEXT: s_lshr_b32 s5, s0, 8 2297; GCN-NEXT: s_and_b32 s5, s5, s17 2298; GCN-NEXT: s_lshr_b32 s6, s0, 16 2299; GCN-NEXT: s_lshr_b32 s7, s0, 24 2300; GCN-NEXT: s_and_b32 s0, s0, s17 2301; GCN-NEXT: s_lshl_b32 s5, s5, 8 2302; GCN-NEXT: s_or_b32 s0, s0, s5 2303; GCN-NEXT: s_and_b32 s5, s6, s17 2304; GCN-NEXT: s_lshl_b32 s5, s5, 16 2305; GCN-NEXT: s_or_b32 s0, s0, s5 2306; GCN-NEXT: s_lshl_b32 s5, s7, 24 2307; GCN-NEXT: s_lshr_b32 s8, s1, 8 2308; GCN-NEXT: s_or_b32 s0, s0, s5 2309; GCN-NEXT: s_and_b32 s5, s8, s17 2310; GCN-NEXT: s_lshr_b32 s9, s1, 16 2311; GCN-NEXT: s_lshr_b32 s10, s1, 24 2312; GCN-NEXT: s_and_b32 s1, s1, s17 2313; GCN-NEXT: s_lshl_b32 s5, s5, 8 2314; GCN-NEXT: s_or_b32 s1, s1, s5 2315; GCN-NEXT: s_and_b32 s5, s9, s17 2316; GCN-NEXT: s_lshl_b32 s5, s5, 16 2317; GCN-NEXT: s_or_b32 s1, s1, s5 2318; GCN-NEXT: s_lshl_b32 s5, s10, 24 2319; GCN-NEXT: s_lshr_b32 s11, s2, 8 2320; GCN-NEXT: s_or_b32 s1, s1, s5 2321; GCN-NEXT: s_and_b32 s5, s11, s17 2322; GCN-NEXT: s_lshr_b32 s12, s2, 16 2323; GCN-NEXT: s_lshr_b32 s13, s2, 24 2324; GCN-NEXT: s_and_b32 s2, s2, s17 2325; GCN-NEXT: s_lshl_b32 s5, s5, 8 2326; GCN-NEXT: s_or_b32 s2, s2, s5 2327; GCN-NEXT: s_and_b32 s5, s12, s17 2328; GCN-NEXT: s_lshl_b32 s5, s5, 16 2329; GCN-NEXT: s_or_b32 s2, s2, s5 2330; GCN-NEXT: s_lshl_b32 s5, s13, 24 2331; GCN-NEXT: s_lshr_b32 s14, s3, 8 2332; GCN-NEXT: s_or_b32 s2, s2, s5 2333; GCN-NEXT: s_and_b32 s5, s14, s17 2334; GCN-NEXT: s_lshr_b32 s15, s3, 16 2335; GCN-NEXT: s_lshr_b32 s16, s3, 24 2336; GCN-NEXT: s_and_b32 s3, s3, s17 2337; GCN-NEXT: s_lshl_b32 s5, s5, 8 2338; GCN-NEXT: s_or_b32 s3, s3, s5 2339; GCN-NEXT: s_and_b32 s5, s15, s17 2340; GCN-NEXT: s_lshl_b32 s5, s5, 16 2341; GCN-NEXT: s_or_b32 s3, s3, s5 2342; GCN-NEXT: s_lshl_b32 s5, s16, 24 2343; GCN-NEXT: s_or_b32 s3, s3, s5 2344; GCN-NEXT: s_lshr_b32 s5, s4, 2 2345; GCN-NEXT: s_cmp_eq_u32 s5, 1 2346; GCN-NEXT: s_cselect_b32 s0, s1, s0 2347; GCN-NEXT: s_cmp_eq_u32 s5, 2 2348; GCN-NEXT: s_cselect_b32 s0, s2, s0 2349; GCN-NEXT: s_cmp_eq_u32 s5, 3 2350; GCN-NEXT: s_cselect_b32 s0, s3, s0 2351; GCN-NEXT: s_and_b32 s1, s4, 3 2352; GCN-NEXT: s_lshl_b32 s1, s1, 3 2353; GCN-NEXT: s_lshr_b32 s0, s0, s1 2354; GCN-NEXT: ; return to shader part epilog 2355; 2356; GFX10-LABEL: extractelement_sgpr_v16i8_sgpr_idx: 2357; GFX10: ; %bb.0: 2358; GFX10-NEXT: s_load_dwordx4 s[0:3], s[2:3], 0x0 2359; GFX10-NEXT: s_movk_i32 s5, 0xff 2360; GFX10-NEXT: s_waitcnt lgkmcnt(0) 2361; GFX10-NEXT: s_lshr_b32 s6, s0, 8 2362; GFX10-NEXT: s_lshr_b32 s7, s0, 16 2363; GFX10-NEXT: s_and_b32 s6, s6, s5 2364; GFX10-NEXT: s_lshr_b32 s8, s0, 24 2365; GFX10-NEXT: s_and_b32 s7, s7, s5 2366; GFX10-NEXT: s_and_b32 s0, s0, s5 2367; GFX10-NEXT: s_lshl_b32 s6, s6, 8 2368; GFX10-NEXT: s_lshr_b32 s12, s2, 8 2369; GFX10-NEXT: s_lshl_b32 s7, s7, 16 2370; GFX10-NEXT: s_or_b32 s0, s0, s6 2371; GFX10-NEXT: s_lshr_b32 s13, s2, 16 2372; GFX10-NEXT: s_or_b32 s0, s0, s7 2373; GFX10-NEXT: s_and_b32 s7, s12, s5 2374; GFX10-NEXT: s_lshl_b32 s8, s8, 24 2375; GFX10-NEXT: s_lshr_b32 s9, s1, 8 2376; GFX10-NEXT: s_lshr_b32 s14, s2, 24 2377; GFX10-NEXT: s_or_b32 s0, s0, s8 2378; GFX10-NEXT: s_and_b32 s2, s2, s5 2379; GFX10-NEXT: s_lshl_b32 s7, s7, 8 2380; GFX10-NEXT: s_and_b32 s8, s13, s5 2381; GFX10-NEXT: s_lshr_b32 s10, s1, 16 2382; GFX10-NEXT: s_and_b32 s9, s9, s5 2383; GFX10-NEXT: s_or_b32 s2, s2, s7 2384; GFX10-NEXT: s_lshl_b32 s7, s8, 16 2385; GFX10-NEXT: s_lshr_b32 s15, s3, 8 2386; GFX10-NEXT: s_lshr_b32 s11, s1, 24 2387; GFX10-NEXT: s_and_b32 s10, s10, s5 2388; GFX10-NEXT: s_and_b32 s1, s1, s5 2389; GFX10-NEXT: s_lshl_b32 s9, s9, 8 2390; GFX10-NEXT: s_or_b32 s2, s2, s7 2391; GFX10-NEXT: s_and_b32 s7, s15, s5 2392; GFX10-NEXT: s_lshr_b32 s16, s3, 16 2393; GFX10-NEXT: s_lshl_b32 s10, s10, 16 2394; GFX10-NEXT: s_or_b32 s1, s1, s9 2395; GFX10-NEXT: s_lshr_b32 s17, s3, 24 2396; GFX10-NEXT: s_and_b32 s3, s3, s5 2397; GFX10-NEXT: s_and_b32 s5, s16, s5 2398; GFX10-NEXT: s_lshl_b32 s7, s7, 8 2399; GFX10-NEXT: s_or_b32 s1, s1, s10 2400; GFX10-NEXT: s_lshl_b32 s6, s11, 24 2401; GFX10-NEXT: s_or_b32 s3, s3, s7 2402; GFX10-NEXT: s_lshl_b32 s5, s5, 16 2403; GFX10-NEXT: s_or_b32 s1, s1, s6 2404; GFX10-NEXT: s_lshl_b32 s6, s14, 24 2405; GFX10-NEXT: s_or_b32 s3, s3, s5 2406; GFX10-NEXT: s_lshl_b32 s5, s17, 24 2407; GFX10-NEXT: s_or_b32 s2, s2, s6 2408; GFX10-NEXT: s_lshr_b32 s6, s4, 2 2409; GFX10-NEXT: s_or_b32 s3, s3, s5 2410; GFX10-NEXT: s_cmp_eq_u32 s6, 1 2411; GFX10-NEXT: s_cselect_b32 s0, s1, s0 2412; GFX10-NEXT: s_cmp_eq_u32 s6, 2 2413; GFX10-NEXT: s_cselect_b32 s0, s2, s0 2414; GFX10-NEXT: s_cmp_eq_u32 s6, 3 2415; GFX10-NEXT: s_cselect_b32 s0, s3, s0 2416; GFX10-NEXT: s_and_b32 s1, s4, 3 2417; GFX10-NEXT: s_lshl_b32 s1, s1, 3 2418; GFX10-NEXT: s_lshr_b32 s0, s0, s1 2419; GFX10-NEXT: ; return to shader part epilog 2420 %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr 2421 %element = extractelement <16 x i8> %vector, i32 %idx 2422 ret i8 %element 2423} 2424 2425define amdgpu_ps i8 @extractelement_vgpr_v16i8_sgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 inreg %idx) { 2426; GFX9-LABEL: extractelement_vgpr_v16i8_sgpr_idx: 2427; GFX9: ; %bb.0: 2428; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 2429; GFX9-NEXT: s_mov_b32 s0, 8 2430; GFX9-NEXT: v_mov_b32_e32 v5, 8 2431; GFX9-NEXT: s_movk_i32 s1, 0xff 2432; GFX9-NEXT: s_lshr_b32 s3, s2, 2 2433; GFX9-NEXT: v_mov_b32_e32 v4, 0xff 2434; GFX9-NEXT: v_cmp_eq_u32_e64 vcc, s3, 1 2435; GFX9-NEXT: s_and_b32 s2, s2, 3 2436; GFX9-NEXT: s_waitcnt vmcnt(0) 2437; GFX9-NEXT: v_lshrrev_b32_e32 v6, 8, v0 2438; GFX9-NEXT: v_lshrrev_b32_e32 v8, 8, v1 2439; GFX9-NEXT: v_lshrrev_b32_e32 v7, 24, v0 2440; GFX9-NEXT: v_lshrrev_b32_e32 v9, 24, v1 2441; GFX9-NEXT: v_lshrrev_b32_e32 v10, 8, v2 2442; GFX9-NEXT: v_lshlrev_b32_sdwa v6, s0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2443; GFX9-NEXT: v_lshlrev_b32_sdwa v8, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2444; GFX9-NEXT: v_lshrrev_b32_e32 v11, 24, v2 2445; GFX9-NEXT: v_and_b32_sdwa v14, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2446; GFX9-NEXT: v_and_b32_sdwa v15, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2447; GFX9-NEXT: v_lshrrev_b32_e32 v12, 8, v3 2448; GFX9-NEXT: v_lshlrev_b32_sdwa v10, v5, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2449; GFX9-NEXT: v_lshlrev_b32_e32 v7, 24, v7 2450; GFX9-NEXT: v_and_or_b32 v0, v0, s1, v6 2451; GFX9-NEXT: v_lshlrev_b32_e32 v9, 24, v9 2452; GFX9-NEXT: v_and_or_b32 v1, v1, s1, v8 2453; GFX9-NEXT: v_and_b32_sdwa v16, v2, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2454; GFX9-NEXT: v_lshrrev_b32_e32 v13, 24, v3 2455; GFX9-NEXT: v_lshlrev_b32_sdwa v5, v5, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2456; GFX9-NEXT: v_lshlrev_b32_e32 v11, 24, v11 2457; GFX9-NEXT: v_and_or_b32 v2, v2, s1, v10 2458; GFX9-NEXT: v_or3_b32 v0, v0, v14, v7 2459; GFX9-NEXT: v_or3_b32 v1, v1, v15, v9 2460; GFX9-NEXT: v_and_b32_sdwa v17, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2461; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 2462; GFX9-NEXT: v_lshlrev_b32_e32 v12, 24, v13 2463; GFX9-NEXT: v_and_or_b32 v3, v3, v4, v5 2464; GFX9-NEXT: v_or3_b32 v2, v2, v16, v11 2465; GFX9-NEXT: v_cmp_eq_u32_e64 vcc, s3, 2 2466; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc 2467; GFX9-NEXT: v_or3_b32 v3, v3, v17, v12 2468; GFX9-NEXT: v_cmp_eq_u32_e64 vcc, s3, 3 2469; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v3, vcc 2470; GFX9-NEXT: s_lshl_b32 s0, s2, 3 2471; GFX9-NEXT: v_lshrrev_b32_e32 v0, s0, v0 2472; GFX9-NEXT: v_readfirstlane_b32 s0, v0 2473; GFX9-NEXT: ; return to shader part epilog 2474; 2475; GFX8-LABEL: extractelement_vgpr_v16i8_sgpr_idx: 2476; GFX8: ; %bb.0: 2477; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 2478; GFX8-NEXT: s_movk_i32 s0, 0xff 2479; GFX8-NEXT: v_mov_b32_e32 v5, 8 2480; GFX8-NEXT: v_mov_b32_e32 v6, 8 2481; GFX8-NEXT: v_mov_b32_e32 v7, s0 2482; GFX8-NEXT: v_mov_b32_e32 v4, 0xff 2483; GFX8-NEXT: s_lshr_b32 s0, s2, 2 2484; GFX8-NEXT: v_cmp_eq_u32_e64 vcc, s0, 1 2485; GFX8-NEXT: s_and_b32 s1, s2, 3 2486; GFX8-NEXT: s_waitcnt vmcnt(0) 2487; GFX8-NEXT: v_lshrrev_b32_e32 v8, 8, v0 2488; GFX8-NEXT: v_lshrrev_b32_e32 v9, 24, v0 2489; GFX8-NEXT: v_lshrrev_b32_e32 v10, 8, v1 2490; GFX8-NEXT: v_lshlrev_b32_sdwa v5, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2491; GFX8-NEXT: v_lshlrev_b32_e32 v8, 24, v9 2492; GFX8-NEXT: v_lshrrev_b32_e32 v11, 24, v1 2493; GFX8-NEXT: v_lshlrev_b32_sdwa v9, v6, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2494; GFX8-NEXT: v_lshrrev_b32_e32 v12, 8, v2 2495; GFX8-NEXT: v_and_b32_sdwa v16, v0, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2496; GFX8-NEXT: v_or_b32_sdwa v0, v0, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2497; GFX8-NEXT: v_and_b32_sdwa v7, v1, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2498; GFX8-NEXT: v_or_b32_sdwa v1, v1, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2499; GFX8-NEXT: v_lshlrev_b32_e32 v10, 24, v11 2500; GFX8-NEXT: v_lshrrev_b32_e32 v14, 8, v3 2501; GFX8-NEXT: v_lshlrev_b32_sdwa v11, v6, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2502; GFX8-NEXT: v_or_b32_e32 v0, v0, v16 2503; GFX8-NEXT: v_or_b32_e32 v1, v1, v7 2504; GFX8-NEXT: v_lshrrev_b32_e32 v13, 24, v2 2505; GFX8-NEXT: v_and_b32_sdwa v17, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2506; GFX8-NEXT: v_or_b32_sdwa v2, v2, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2507; GFX8-NEXT: v_lshlrev_b32_sdwa v6, v6, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2508; GFX8-NEXT: v_lshrrev_b32_e32 v15, 24, v3 2509; GFX8-NEXT: v_and_b32_sdwa v4, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2510; GFX8-NEXT: v_or_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2511; GFX8-NEXT: v_lshlrev_b32_e32 v12, 24, v13 2512; GFX8-NEXT: v_or_b32_e32 v2, v2, v17 2513; GFX8-NEXT: v_or_b32_e32 v0, v0, v8 2514; GFX8-NEXT: v_or_b32_e32 v1, v1, v10 2515; GFX8-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 2516; GFX8-NEXT: v_lshlrev_b32_e32 v13, 24, v15 2517; GFX8-NEXT: v_or_b32_e32 v3, v3, v4 2518; GFX8-NEXT: v_or_b32_e32 v2, v2, v12 2519; GFX8-NEXT: v_cmp_eq_u32_e64 vcc, s0, 2 2520; GFX8-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc 2521; GFX8-NEXT: v_cmp_eq_u32_e64 vcc, s0, 3 2522; GFX8-NEXT: v_or_b32_e32 v3, v3, v13 2523; GFX8-NEXT: v_cndmask_b32_e32 v0, v0, v3, vcc 2524; GFX8-NEXT: s_lshl_b32 s0, s1, 3 2525; GFX8-NEXT: v_lshrrev_b32_e32 v0, s0, v0 2526; GFX8-NEXT: v_readfirstlane_b32 s0, v0 2527; GFX8-NEXT: ; return to shader part epilog 2528; 2529; GFX7-LABEL: extractelement_vgpr_v16i8_sgpr_idx: 2530; GFX7: ; %bb.0: 2531; GFX7-NEXT: s_mov_b32 s6, 0 2532; GFX7-NEXT: s_mov_b32 s7, 0xf000 2533; GFX7-NEXT: s_mov_b64 s[4:5], 0 2534; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 2535; GFX7-NEXT: s_movk_i32 s0, 0xff 2536; GFX7-NEXT: v_mov_b32_e32 v4, 0xff 2537; GFX7-NEXT: s_lshr_b32 s1, s2, 2 2538; GFX7-NEXT: v_cmp_eq_u32_e64 vcc, s1, 1 2539; GFX7-NEXT: s_and_b32 s2, s2, 3 2540; GFX7-NEXT: s_waitcnt vmcnt(0) 2541; GFX7-NEXT: v_lshrrev_b32_e32 v5, 8, v0 2542; GFX7-NEXT: v_lshrrev_b32_e32 v8, 8, v1 2543; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v0 2544; GFX7-NEXT: v_lshrrev_b32_e32 v9, 16, v1 2545; GFX7-NEXT: v_lshrrev_b32_e32 v11, 8, v2 2546; GFX7-NEXT: v_and_b32_e32 v5, s0, v5 2547; GFX7-NEXT: v_and_b32_e32 v8, s0, v8 2548; GFX7-NEXT: v_lshrrev_b32_e32 v7, 24, v0 2549; GFX7-NEXT: v_lshrrev_b32_e32 v10, 24, v1 2550; GFX7-NEXT: v_lshrrev_b32_e32 v12, 16, v2 2551; GFX7-NEXT: v_lshrrev_b32_e32 v14, 8, v3 2552; GFX7-NEXT: v_and_b32_e32 v6, s0, v6 2553; GFX7-NEXT: v_and_b32_e32 v9, s0, v9 2554; GFX7-NEXT: v_and_b32_e32 v11, s0, v11 2555; GFX7-NEXT: v_and_b32_e32 v0, s0, v0 2556; GFX7-NEXT: v_lshlrev_b32_e32 v5, 8, v5 2557; GFX7-NEXT: v_and_b32_e32 v1, s0, v1 2558; GFX7-NEXT: v_lshlrev_b32_e32 v8, 8, v8 2559; GFX7-NEXT: v_lshrrev_b32_e32 v13, 24, v2 2560; GFX7-NEXT: v_and_b32_e32 v12, v12, v4 2561; GFX7-NEXT: v_and_b32_e32 v14, v14, v4 2562; GFX7-NEXT: v_and_b32_e32 v2, s0, v2 2563; GFX7-NEXT: v_lshlrev_b32_e32 v11, 8, v11 2564; GFX7-NEXT: v_lshrrev_b32_e32 v15, 16, v3 2565; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v6 2566; GFX7-NEXT: v_or_b32_e32 v0, v0, v5 2567; GFX7-NEXT: v_lshlrev_b32_e32 v9, 16, v9 2568; GFX7-NEXT: v_or_b32_e32 v1, v1, v8 2569; GFX7-NEXT: v_lshrrev_b32_e32 v16, 24, v3 2570; GFX7-NEXT: v_and_b32_e32 v3, v3, v4 2571; GFX7-NEXT: v_and_b32_e32 v4, v15, v4 2572; GFX7-NEXT: v_lshlrev_b32_e32 v14, 8, v14 2573; GFX7-NEXT: v_lshlrev_b32_e32 v7, 24, v7 2574; GFX7-NEXT: v_or_b32_e32 v0, v0, v6 2575; GFX7-NEXT: v_lshlrev_b32_e32 v10, 24, v10 2576; GFX7-NEXT: v_or_b32_e32 v1, v1, v9 2577; GFX7-NEXT: v_lshlrev_b32_e32 v12, 16, v12 2578; GFX7-NEXT: v_or_b32_e32 v2, v2, v11 2579; GFX7-NEXT: v_lshlrev_b32_e32 v13, 24, v13 2580; GFX7-NEXT: v_or_b32_e32 v2, v2, v12 2581; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v4 2582; GFX7-NEXT: v_or_b32_e32 v3, v3, v14 2583; GFX7-NEXT: v_or_b32_e32 v0, v0, v7 2584; GFX7-NEXT: v_or_b32_e32 v1, v1, v10 2585; GFX7-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc 2586; GFX7-NEXT: v_lshlrev_b32_e32 v15, 24, v16 2587; GFX7-NEXT: v_or_b32_e32 v3, v3, v4 2588; GFX7-NEXT: v_or_b32_e32 v2, v2, v13 2589; GFX7-NEXT: v_cmp_eq_u32_e64 vcc, s1, 2 2590; GFX7-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc 2591; GFX7-NEXT: v_or_b32_e32 v3, v3, v15 2592; GFX7-NEXT: v_cmp_eq_u32_e64 vcc, s1, 3 2593; GFX7-NEXT: v_cndmask_b32_e32 v0, v0, v3, vcc 2594; GFX7-NEXT: s_lshl_b32 s0, s2, 3 2595; GFX7-NEXT: v_lshrrev_b32_e32 v0, s0, v0 2596; GFX7-NEXT: v_readfirstlane_b32 s0, v0 2597; GFX7-NEXT: ; return to shader part epilog 2598; 2599; GFX10-LABEL: extractelement_vgpr_v16i8_sgpr_idx: 2600; GFX10: ; %bb.0: 2601; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 2602; GFX10-NEXT: v_mov_b32_e32 v5, 8 2603; GFX10-NEXT: s_mov_b32 s0, 8 2604; GFX10-NEXT: s_movk_i32 s1, 0xff 2605; GFX10-NEXT: v_mov_b32_e32 v4, 0xff 2606; GFX10-NEXT: s_waitcnt vmcnt(0) 2607; GFX10-NEXT: v_lshrrev_b32_e32 v6, 8, v0 2608; GFX10-NEXT: v_lshrrev_b32_e32 v8, 8, v1 2609; GFX10-NEXT: v_lshrrev_b32_e32 v7, 24, v0 2610; GFX10-NEXT: v_lshrrev_b32_e32 v9, 24, v1 2611; GFX10-NEXT: v_lshrrev_b32_e32 v10, 8, v2 2612; GFX10-NEXT: v_lshlrev_b32_sdwa v6, s0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2613; GFX10-NEXT: v_lshlrev_b32_sdwa v8, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2614; GFX10-NEXT: v_lshrrev_b32_e32 v11, 24, v2 2615; GFX10-NEXT: v_and_b32_sdwa v13, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2616; GFX10-NEXT: v_and_b32_sdwa v14, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2617; GFX10-NEXT: v_and_or_b32 v0, v0, s1, v6 2618; GFX10-NEXT: v_lshlrev_b32_e32 v7, 24, v7 2619; GFX10-NEXT: v_lshrrev_b32_e32 v12, 8, v3 2620; GFX10-NEXT: v_lshlrev_b32_sdwa v10, v5, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2621; GFX10-NEXT: v_lshlrev_b32_e32 v9, 24, v9 2622; GFX10-NEXT: v_and_or_b32 v1, v1, s1, v8 2623; GFX10-NEXT: s_lshr_b32 s0, s2, 2 2624; GFX10-NEXT: v_lshlrev_b32_sdwa v5, v5, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2625; GFX10-NEXT: v_and_b32_sdwa v15, v2, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2626; GFX10-NEXT: v_lshlrev_b32_e32 v11, 24, v11 2627; GFX10-NEXT: v_and_or_b32 v2, v2, s1, v10 2628; GFX10-NEXT: v_lshrrev_b32_e32 v6, 24, v3 2629; GFX10-NEXT: v_or3_b32 v0, v0, v13, v7 2630; GFX10-NEXT: v_or3_b32 v1, v1, v14, v9 2631; GFX10-NEXT: v_cmp_eq_u32_e64 vcc_lo, s0, 1 2632; GFX10-NEXT: v_and_or_b32 v5, v3, v4, v5 2633; GFX10-NEXT: v_and_b32_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2634; GFX10-NEXT: v_or3_b32 v2, v2, v15, v11 2635; GFX10-NEXT: v_lshlrev_b32_e32 v4, 24, v6 2636; GFX10-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo 2637; GFX10-NEXT: v_cmp_eq_u32_e64 vcc_lo, s0, 2 2638; GFX10-NEXT: v_or3_b32 v1, v5, v3, v4 2639; GFX10-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc_lo 2640; GFX10-NEXT: v_cmp_eq_u32_e64 vcc_lo, s0, 3 2641; GFX10-NEXT: s_and_b32 s0, s2, 3 2642; GFX10-NEXT: s_lshl_b32 s0, s0, 3 2643; GFX10-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo 2644; GFX10-NEXT: v_lshrrev_b32_e32 v0, s0, v0 2645; GFX10-NEXT: v_readfirstlane_b32 s0, v0 2646; GFX10-NEXT: ; return to shader part epilog 2647 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 2648 %element = extractelement <16 x i8> %vector, i32 %idx 2649 ret i8 %element 2650} 2651 2652define i8 @extractelement_vgpr_v16i8_vgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 %idx) { 2653; GFX9-LABEL: extractelement_vgpr_v16i8_vgpr_idx: 2654; GFX9: ; %bb.0: 2655; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2656; GFX9-NEXT: global_load_dwordx4 v[3:6], v[0:1], off 2657; GFX9-NEXT: s_mov_b32 s4, 8 2658; GFX9-NEXT: v_mov_b32_e32 v1, 8 2659; GFX9-NEXT: s_movk_i32 s5, 0xff 2660; GFX9-NEXT: v_lshrrev_b32_e32 v7, 2, v2 2661; GFX9-NEXT: v_mov_b32_e32 v0, 0xff 2662; GFX9-NEXT: v_cmp_eq_u32_e32 vcc, 1, v7 2663; GFX9-NEXT: v_and_b32_e32 v2, 3, v2 2664; GFX9-NEXT: s_waitcnt vmcnt(0) 2665; GFX9-NEXT: v_lshrrev_b32_e32 v8, 8, v3 2666; GFX9-NEXT: v_lshrrev_b32_e32 v10, 8, v4 2667; GFX9-NEXT: v_lshrrev_b32_e32 v9, 24, v3 2668; GFX9-NEXT: v_lshrrev_b32_e32 v11, 24, v4 2669; GFX9-NEXT: v_lshrrev_b32_e32 v12, 8, v5 2670; GFX9-NEXT: v_lshrrev_b32_e32 v14, 8, v6 2671; GFX9-NEXT: v_lshlrev_b32_sdwa v8, s4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2672; GFX9-NEXT: v_lshlrev_b32_sdwa v10, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2673; GFX9-NEXT: v_lshrrev_b32_e32 v13, 24, v5 2674; GFX9-NEXT: v_and_b32_sdwa v16, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2675; GFX9-NEXT: v_and_b32_sdwa v17, v4, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2676; GFX9-NEXT: v_lshlrev_b32_sdwa v12, v1, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2677; GFX9-NEXT: v_lshlrev_b32_e32 v9, 24, v9 2678; GFX9-NEXT: v_lshlrev_b32_e32 v11, 24, v11 2679; GFX9-NEXT: v_lshlrev_b32_sdwa v1, v1, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2680; GFX9-NEXT: v_and_or_b32 v3, v3, s5, v8 2681; GFX9-NEXT: v_and_or_b32 v4, v4, s5, v10 2682; GFX9-NEXT: v_lshrrev_b32_e32 v15, 24, v6 2683; GFX9-NEXT: v_and_b32_sdwa v18, v5, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2684; GFX9-NEXT: v_and_b32_sdwa v19, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2685; GFX9-NEXT: v_and_or_b32 v0, v6, v0, v1 2686; GFX9-NEXT: v_or3_b32 v1, v3, v16, v9 2687; GFX9-NEXT: v_or3_b32 v3, v4, v17, v11 2688; GFX9-NEXT: v_lshlrev_b32_e32 v13, 24, v13 2689; GFX9-NEXT: v_and_or_b32 v5, v5, s5, v12 2690; GFX9-NEXT: v_lshlrev_b32_e32 v14, 24, v15 2691; GFX9-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc 2692; GFX9-NEXT: v_or3_b32 v4, v5, v18, v13 2693; GFX9-NEXT: v_cmp_eq_u32_e32 vcc, 2, v7 2694; GFX9-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc 2695; GFX9-NEXT: v_or3_b32 v0, v0, v19, v14 2696; GFX9-NEXT: v_cmp_eq_u32_e32 vcc, 3, v7 2697; GFX9-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc 2698; GFX9-NEXT: v_lshlrev_b32_e32 v1, 3, v2 2699; GFX9-NEXT: v_lshrrev_b32_e32 v0, v1, v0 2700; GFX9-NEXT: s_setpc_b64 s[30:31] 2701; 2702; GFX8-LABEL: extractelement_vgpr_v16i8_vgpr_idx: 2703; GFX8: ; %bb.0: 2704; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2705; GFX8-NEXT: flat_load_dwordx4 v[3:6], v[0:1] 2706; GFX8-NEXT: s_movk_i32 s4, 0xff 2707; GFX8-NEXT: v_mov_b32_e32 v1, 8 2708; GFX8-NEXT: v_mov_b32_e32 v7, 8 2709; GFX8-NEXT: v_mov_b32_e32 v8, s4 2710; GFX8-NEXT: v_mov_b32_e32 v0, 0xff 2711; GFX8-NEXT: v_lshrrev_b32_e32 v9, 2, v2 2712; GFX8-NEXT: v_cmp_eq_u32_e32 vcc, 1, v9 2713; GFX8-NEXT: v_and_b32_e32 v2, 3, v2 2714; GFX8-NEXT: s_waitcnt vmcnt(0) 2715; GFX8-NEXT: v_lshrrev_b32_e32 v10, 8, v3 2716; GFX8-NEXT: v_lshrrev_b32_e32 v11, 24, v3 2717; GFX8-NEXT: v_lshrrev_b32_e32 v12, 8, v4 2718; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2719; GFX8-NEXT: v_lshlrev_b32_e32 v10, 24, v11 2720; GFX8-NEXT: v_lshrrev_b32_e32 v13, 24, v4 2721; GFX8-NEXT: v_lshlrev_b32_sdwa v11, v7, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2722; GFX8-NEXT: v_lshrrev_b32_e32 v14, 8, v5 2723; GFX8-NEXT: v_and_b32_sdwa v18, v3, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2724; GFX8-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2725; GFX8-NEXT: v_lshlrev_b32_e32 v12, 24, v13 2726; GFX8-NEXT: v_lshrrev_b32_e32 v16, 8, v6 2727; GFX8-NEXT: v_lshlrev_b32_sdwa v13, v7, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2728; GFX8-NEXT: v_and_b32_sdwa v8, v4, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2729; GFX8-NEXT: v_or_b32_sdwa v3, v4, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2730; GFX8-NEXT: v_or_b32_e32 v1, v1, v18 2731; GFX8-NEXT: v_or_b32_e32 v3, v3, v8 2732; GFX8-NEXT: v_lshrrev_b32_e32 v15, 24, v5 2733; GFX8-NEXT: v_and_b32_sdwa v19, v5, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2734; GFX8-NEXT: v_or_b32_sdwa v4, v5, v13 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2735; GFX8-NEXT: v_lshlrev_b32_sdwa v7, v7, v16 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2736; GFX8-NEXT: v_lshrrev_b32_e32 v17, 24, v6 2737; GFX8-NEXT: v_lshlrev_b32_e32 v14, 24, v15 2738; GFX8-NEXT: v_or_b32_e32 v4, v4, v19 2739; GFX8-NEXT: v_and_b32_sdwa v0, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2740; GFX8-NEXT: v_or_b32_sdwa v5, v6, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 2741; GFX8-NEXT: v_or_b32_e32 v1, v1, v10 2742; GFX8-NEXT: v_or_b32_e32 v3, v3, v12 2743; GFX8-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc 2744; GFX8-NEXT: v_lshlrev_b32_e32 v15, 24, v17 2745; GFX8-NEXT: v_or_b32_e32 v0, v5, v0 2746; GFX8-NEXT: v_or_b32_e32 v4, v4, v14 2747; GFX8-NEXT: v_cmp_eq_u32_e32 vcc, 2, v9 2748; GFX8-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc 2749; GFX8-NEXT: v_or_b32_e32 v0, v0, v15 2750; GFX8-NEXT: v_cmp_eq_u32_e32 vcc, 3, v9 2751; GFX8-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc 2752; GFX8-NEXT: v_lshlrev_b32_e32 v1, 3, v2 2753; GFX8-NEXT: v_lshrrev_b32_e32 v0, v1, v0 2754; GFX8-NEXT: s_setpc_b64 s[30:31] 2755; 2756; GFX7-LABEL: extractelement_vgpr_v16i8_vgpr_idx: 2757; GFX7: ; %bb.0: 2758; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2759; GFX7-NEXT: s_mov_b32 s6, 0 2760; GFX7-NEXT: s_mov_b32 s7, 0xf000 2761; GFX7-NEXT: s_mov_b64 s[4:5], 0 2762; GFX7-NEXT: buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64 2763; GFX7-NEXT: s_movk_i32 s4, 0xff 2764; GFX7-NEXT: v_mov_b32_e32 v0, 0xff 2765; GFX7-NEXT: v_lshrrev_b32_e32 v18, 2, v2 2766; GFX7-NEXT: v_cmp_eq_u32_e32 vcc, 1, v18 2767; GFX7-NEXT: v_and_b32_e32 v2, 3, v2 2768; GFX7-NEXT: s_waitcnt vmcnt(0) 2769; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v3 2770; GFX7-NEXT: v_lshrrev_b32_e32 v9, 8, v4 2771; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v3 2772; GFX7-NEXT: v_lshrrev_b32_e32 v10, 16, v4 2773; GFX7-NEXT: v_lshrrev_b32_e32 v12, 8, v5 2774; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 2775; GFX7-NEXT: v_and_b32_e32 v9, s4, v9 2776; GFX7-NEXT: v_lshrrev_b32_e32 v8, 24, v3 2777; GFX7-NEXT: v_lshrrev_b32_e32 v11, 24, v4 2778; GFX7-NEXT: v_lshrrev_b32_e32 v13, 16, v5 2779; GFX7-NEXT: v_lshrrev_b32_e32 v15, 8, v6 2780; GFX7-NEXT: v_and_b32_e32 v7, s4, v7 2781; GFX7-NEXT: v_and_b32_e32 v10, s4, v10 2782; GFX7-NEXT: v_and_b32_e32 v12, s4, v12 2783; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 2784; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 2785; GFX7-NEXT: v_and_b32_e32 v4, s4, v4 2786; GFX7-NEXT: v_lshlrev_b32_e32 v9, 8, v9 2787; GFX7-NEXT: v_lshrrev_b32_e32 v14, 24, v5 2788; GFX7-NEXT: v_and_b32_e32 v13, v13, v0 2789; GFX7-NEXT: v_and_b32_e32 v15, v15, v0 2790; GFX7-NEXT: v_or_b32_e32 v1, v3, v1 2791; GFX7-NEXT: v_lshlrev_b32_e32 v7, 16, v7 2792; GFX7-NEXT: v_lshrrev_b32_e32 v16, 16, v6 2793; GFX7-NEXT: v_and_b32_e32 v5, s4, v5 2794; GFX7-NEXT: v_lshlrev_b32_e32 v10, 16, v10 2795; GFX7-NEXT: v_or_b32_e32 v3, v4, v9 2796; GFX7-NEXT: v_lshlrev_b32_e32 v12, 8, v12 2797; GFX7-NEXT: v_lshrrev_b32_e32 v17, 24, v6 2798; GFX7-NEXT: v_and_b32_e32 v6, v6, v0 2799; GFX7-NEXT: v_and_b32_e32 v0, v16, v0 2800; GFX7-NEXT: v_lshlrev_b32_e32 v8, 24, v8 2801; GFX7-NEXT: v_or_b32_e32 v1, v1, v7 2802; GFX7-NEXT: v_lshlrev_b32_e32 v11, 24, v11 2803; GFX7-NEXT: v_or_b32_e32 v3, v3, v10 2804; GFX7-NEXT: v_lshlrev_b32_e32 v13, 16, v13 2805; GFX7-NEXT: v_or_b32_e32 v4, v5, v12 2806; GFX7-NEXT: v_lshlrev_b32_e32 v15, 8, v15 2807; GFX7-NEXT: v_lshlrev_b32_e32 v14, 24, v14 2808; GFX7-NEXT: v_or_b32_e32 v4, v4, v13 2809; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0 2810; GFX7-NEXT: v_or_b32_e32 v5, v6, v15 2811; GFX7-NEXT: v_or_b32_e32 v1, v1, v8 2812; GFX7-NEXT: v_or_b32_e32 v3, v3, v11 2813; GFX7-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc 2814; GFX7-NEXT: v_lshlrev_b32_e32 v16, 24, v17 2815; GFX7-NEXT: v_or_b32_e32 v0, v5, v0 2816; GFX7-NEXT: v_or_b32_e32 v4, v4, v14 2817; GFX7-NEXT: v_cmp_eq_u32_e32 vcc, 2, v18 2818; GFX7-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc 2819; GFX7-NEXT: v_or_b32_e32 v0, v0, v16 2820; GFX7-NEXT: v_cmp_eq_u32_e32 vcc, 3, v18 2821; GFX7-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc 2822; GFX7-NEXT: v_lshlrev_b32_e32 v1, 3, v2 2823; GFX7-NEXT: v_lshrrev_b32_e32 v0, v1, v0 2824; GFX7-NEXT: s_setpc_b64 s[30:31] 2825; 2826; GFX10-LABEL: extractelement_vgpr_v16i8_vgpr_idx: 2827; GFX10: ; %bb.0: 2828; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2829; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 2830; GFX10-NEXT: global_load_dwordx4 v[3:6], v[0:1], off 2831; GFX10-NEXT: v_mov_b32_e32 v1, 8 2832; GFX10-NEXT: s_mov_b32 s4, 8 2833; GFX10-NEXT: s_movk_i32 s5, 0xff 2834; GFX10-NEXT: v_lshrrev_b32_e32 v7, 2, v2 2835; GFX10-NEXT: v_mov_b32_e32 v0, 0xff 2836; GFX10-NEXT: v_and_b32_e32 v2, 3, v2 2837; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v7 2838; GFX10-NEXT: s_waitcnt vmcnt(0) 2839; GFX10-NEXT: v_lshrrev_b32_e32 v8, 8, v3 2840; GFX10-NEXT: v_lshrrev_b32_e32 v10, 8, v4 2841; GFX10-NEXT: v_lshrrev_b32_e32 v9, 24, v3 2842; GFX10-NEXT: v_lshrrev_b32_e32 v11, 24, v4 2843; GFX10-NEXT: v_lshrrev_b32_e32 v12, 8, v5 2844; GFX10-NEXT: v_lshlrev_b32_sdwa v8, s4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2845; GFX10-NEXT: v_lshlrev_b32_sdwa v10, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2846; GFX10-NEXT: v_and_b32_sdwa v16, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2847; GFX10-NEXT: v_and_b32_sdwa v17, v4, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2848; GFX10-NEXT: v_lshrrev_b32_e32 v13, 24, v5 2849; GFX10-NEXT: v_and_or_b32 v3, v3, s5, v8 2850; GFX10-NEXT: v_lshlrev_b32_e32 v9, 24, v9 2851; GFX10-NEXT: v_lshrrev_b32_e32 v14, 8, v6 2852; GFX10-NEXT: v_lshlrev_b32_sdwa v12, v1, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2853; GFX10-NEXT: v_lshlrev_b32_e32 v11, 24, v11 2854; GFX10-NEXT: v_and_or_b32 v4, v4, s5, v10 2855; GFX10-NEXT: v_and_b32_sdwa v18, v5, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2856; GFX10-NEXT: v_lshrrev_b32_e32 v15, 24, v6 2857; GFX10-NEXT: v_or3_b32 v3, v3, v16, v9 2858; GFX10-NEXT: v_lshlrev_b32_e32 v8, 24, v13 2859; GFX10-NEXT: v_or3_b32 v4, v4, v17, v11 2860; GFX10-NEXT: v_lshlrev_b32_sdwa v1, v1, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 2861; GFX10-NEXT: v_and_or_b32 v5, v5, s5, v12 2862; GFX10-NEXT: v_and_b32_sdwa v19, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 2863; GFX10-NEXT: v_lshlrev_b32_e32 v9, 24, v15 2864; GFX10-NEXT: v_cndmask_b32_e32 v3, v3, v4, vcc_lo 2865; GFX10-NEXT: v_and_or_b32 v0, v6, v0, v1 2866; GFX10-NEXT: v_or3_b32 v1, v5, v18, v8 2867; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 2, v7 2868; GFX10-NEXT: v_or3_b32 v0, v0, v19, v9 2869; GFX10-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc_lo 2870; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 3, v7 2871; GFX10-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo 2872; GFX10-NEXT: v_lshlrev_b32_e32 v1, 3, v2 2873; GFX10-NEXT: v_lshrrev_b32_e32 v0, v1, v0 2874; GFX10-NEXT: s_setpc_b64 s[30:31] 2875 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 2876 %element = extractelement <16 x i8> %vector, i32 %idx 2877 ret i8 %element 2878} 2879 2880define amdgpu_ps i8 @extractelement_sgpr_v16i8_vgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 %idx) { 2881; GCN-LABEL: extractelement_sgpr_v16i8_vgpr_idx: 2882; GCN: ; %bb.0: 2883; GCN-NEXT: s_load_dwordx4 s[0:3], s[2:3], 0x0 2884; GCN-NEXT: s_movk_i32 s16, 0xff 2885; GCN-NEXT: v_lshrrev_b32_e32 v1, 2, v0 2886; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v1 2887; GCN-NEXT: v_and_b32_e32 v0, 3, v0 2888; GCN-NEXT: s_waitcnt lgkmcnt(0) 2889; GCN-NEXT: s_lshr_b32 s4, s0, 8 2890; GCN-NEXT: s_and_b32 s4, s4, s16 2891; GCN-NEXT: s_lshr_b32 s5, s0, 16 2892; GCN-NEXT: s_lshr_b32 s6, s0, 24 2893; GCN-NEXT: s_and_b32 s0, s0, s16 2894; GCN-NEXT: s_lshl_b32 s4, s4, 8 2895; GCN-NEXT: s_or_b32 s0, s0, s4 2896; GCN-NEXT: s_and_b32 s4, s5, s16 2897; GCN-NEXT: s_lshl_b32 s4, s4, 16 2898; GCN-NEXT: s_or_b32 s0, s0, s4 2899; GCN-NEXT: s_lshl_b32 s4, s6, 24 2900; GCN-NEXT: s_lshr_b32 s7, s1, 8 2901; GCN-NEXT: s_or_b32 s0, s0, s4 2902; GCN-NEXT: s_and_b32 s4, s7, s16 2903; GCN-NEXT: s_lshr_b32 s8, s1, 16 2904; GCN-NEXT: s_lshr_b32 s9, s1, 24 2905; GCN-NEXT: s_and_b32 s1, s1, s16 2906; GCN-NEXT: s_lshl_b32 s4, s4, 8 2907; GCN-NEXT: s_or_b32 s1, s1, s4 2908; GCN-NEXT: s_and_b32 s4, s8, s16 2909; GCN-NEXT: s_lshl_b32 s4, s4, 16 2910; GCN-NEXT: s_or_b32 s1, s1, s4 2911; GCN-NEXT: s_lshl_b32 s4, s9, 24 2912; GCN-NEXT: s_lshr_b32 s10, s2, 8 2913; GCN-NEXT: s_or_b32 s1, s1, s4 2914; GCN-NEXT: s_and_b32 s4, s10, s16 2915; GCN-NEXT: s_lshr_b32 s11, s2, 16 2916; GCN-NEXT: s_lshr_b32 s12, s2, 24 2917; GCN-NEXT: s_and_b32 s2, s2, s16 2918; GCN-NEXT: s_lshl_b32 s4, s4, 8 2919; GCN-NEXT: s_or_b32 s2, s2, s4 2920; GCN-NEXT: s_and_b32 s4, s11, s16 2921; GCN-NEXT: s_lshl_b32 s4, s4, 16 2922; GCN-NEXT: s_or_b32 s2, s2, s4 2923; GCN-NEXT: s_lshl_b32 s4, s12, 24 2924; GCN-NEXT: s_lshr_b32 s13, s3, 8 2925; GCN-NEXT: s_or_b32 s2, s2, s4 2926; GCN-NEXT: s_and_b32 s4, s13, s16 2927; GCN-NEXT: s_lshr_b32 s14, s3, 16 2928; GCN-NEXT: s_lshr_b32 s15, s3, 24 2929; GCN-NEXT: s_and_b32 s3, s3, s16 2930; GCN-NEXT: s_lshl_b32 s4, s4, 8 2931; GCN-NEXT: s_or_b32 s3, s3, s4 2932; GCN-NEXT: s_and_b32 s4, s14, s16 2933; GCN-NEXT: s_lshl_b32 s4, s4, 16 2934; GCN-NEXT: s_or_b32 s3, s3, s4 2935; GCN-NEXT: s_lshl_b32 s4, s15, 24 2936; GCN-NEXT: v_mov_b32_e32 v2, s0 2937; GCN-NEXT: v_mov_b32_e32 v3, s1 2938; GCN-NEXT: s_or_b32 s3, s3, s4 2939; GCN-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc 2940; GCN-NEXT: v_mov_b32_e32 v4, s2 2941; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 2, v1 2942; GCN-NEXT: v_cndmask_b32_e32 v2, v2, v4, vcc 2943; GCN-NEXT: v_mov_b32_e32 v5, s3 2944; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 3, v1 2945; GCN-NEXT: v_cndmask_b32_e32 v1, v2, v5, vcc 2946; GCN-NEXT: v_lshlrev_b32_e32 v0, 3, v0 2947; GCN-NEXT: v_lshrrev_b32_e32 v0, v0, v1 2948; GCN-NEXT: v_readfirstlane_b32 s0, v0 2949; GCN-NEXT: ; return to shader part epilog 2950; 2951; GFX10-LABEL: extractelement_sgpr_v16i8_vgpr_idx: 2952; GFX10: ; %bb.0: 2953; GFX10-NEXT: s_load_dwordx4 s[0:3], s[2:3], 0x0 2954; GFX10-NEXT: s_movk_i32 s4, 0xff 2955; GFX10-NEXT: v_lshrrev_b32_e32 v1, 2, v0 2956; GFX10-NEXT: v_and_b32_e32 v0, 3, v0 2957; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 1, v1 2958; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0 2959; GFX10-NEXT: s_waitcnt lgkmcnt(0) 2960; GFX10-NEXT: s_lshr_b32 s8, s1, 8 2961; GFX10-NEXT: s_lshr_b32 s5, s0, 8 2962; GFX10-NEXT: s_lshr_b32 s9, s1, 16 2963; GFX10-NEXT: s_and_b32 s8, s8, s4 2964; GFX10-NEXT: s_and_b32 s5, s5, s4 2965; GFX10-NEXT: s_and_b32 s9, s9, s4 2966; GFX10-NEXT: s_lshr_b32 s10, s1, 24 2967; GFX10-NEXT: s_and_b32 s1, s1, s4 2968; GFX10-NEXT: s_lshl_b32 s8, s8, 8 2969; GFX10-NEXT: s_lshr_b32 s6, s0, 16 2970; GFX10-NEXT: s_lshr_b32 s7, s0, 24 2971; GFX10-NEXT: s_and_b32 s0, s0, s4 2972; GFX10-NEXT: s_lshl_b32 s5, s5, 8 2973; GFX10-NEXT: s_lshl_b32 s9, s9, 16 2974; GFX10-NEXT: s_or_b32 s1, s1, s8 2975; GFX10-NEXT: s_and_b32 s6, s6, s4 2976; GFX10-NEXT: s_or_b32 s0, s0, s5 2977; GFX10-NEXT: s_or_b32 s1, s1, s9 2978; GFX10-NEXT: s_lshl_b32 s5, s10, 24 2979; GFX10-NEXT: s_lshl_b32 s6, s6, 16 2980; GFX10-NEXT: s_lshr_b32 s11, s2, 8 2981; GFX10-NEXT: s_or_b32 s1, s1, s5 2982; GFX10-NEXT: s_or_b32 s0, s0, s6 2983; GFX10-NEXT: s_and_b32 s6, s11, s4 2984; GFX10-NEXT: s_lshl_b32 s7, s7, 24 2985; GFX10-NEXT: s_lshr_b32 s12, s2, 16 2986; GFX10-NEXT: v_mov_b32_e32 v2, s1 2987; GFX10-NEXT: s_lshr_b32 s13, s2, 24 2988; GFX10-NEXT: s_or_b32 s0, s0, s7 2989; GFX10-NEXT: s_and_b32 s2, s2, s4 2990; GFX10-NEXT: s_lshl_b32 s6, s6, 8 2991; GFX10-NEXT: s_and_b32 s7, s12, s4 2992; GFX10-NEXT: s_or_b32 s2, s2, s6 2993; GFX10-NEXT: s_lshl_b32 s6, s7, 16 2994; GFX10-NEXT: s_lshr_b32 s14, s3, 8 2995; GFX10-NEXT: s_lshr_b32 s15, s3, 16 2996; GFX10-NEXT: s_or_b32 s2, s2, s6 2997; GFX10-NEXT: s_and_b32 s6, s14, s4 2998; GFX10-NEXT: v_cndmask_b32_e32 v2, s0, v2, vcc_lo 2999; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 2, v1 3000; GFX10-NEXT: s_lshl_b32 s5, s13, 24 3001; GFX10-NEXT: s_and_b32 s1, s15, s4 3002; GFX10-NEXT: s_lshr_b32 s16, s3, 24 3003; GFX10-NEXT: s_and_b32 s3, s3, s4 3004; GFX10-NEXT: s_lshl_b32 s6, s6, 8 3005; GFX10-NEXT: s_or_b32 s2, s2, s5 3006; GFX10-NEXT: s_or_b32 s3, s3, s6 3007; GFX10-NEXT: s_lshl_b32 s1, s1, 16 3008; GFX10-NEXT: v_cndmask_b32_e64 v2, v2, s2, vcc_lo 3009; GFX10-NEXT: v_cmp_eq_u32_e32 vcc_lo, 3, v1 3010; GFX10-NEXT: s_or_b32 s0, s3, s1 3011; GFX10-NEXT: s_lshl_b32 s1, s16, 24 3012; GFX10-NEXT: s_or_b32 s3, s0, s1 3013; GFX10-NEXT: v_cndmask_b32_e64 v1, v2, s3, vcc_lo 3014; GFX10-NEXT: v_lshrrev_b32_e32 v0, v0, v1 3015; GFX10-NEXT: v_readfirstlane_b32 s0, v0 3016; GFX10-NEXT: ; return to shader part epilog 3017 %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr 3018 %element = extractelement <16 x i8> %vector, i32 %idx 3019 ret i8 %element 3020} 3021 3022define i8 @extractelement_vgpr_v16i8_idx0(<16 x i8> addrspace(1)* %ptr) { 3023; GFX9-LABEL: extractelement_vgpr_v16i8_idx0: 3024; GFX9: ; %bb.0: 3025; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3026; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3027; GFX9-NEXT: s_mov_b32 s4, 8 3028; GFX9-NEXT: s_movk_i32 s5, 0xff 3029; GFX9-NEXT: s_waitcnt vmcnt(0) 3030; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3031; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3032; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3033; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3034; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 3035; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3036; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3037; GFX9-NEXT: s_setpc_b64 s[30:31] 3038; 3039; GFX8-LABEL: extractelement_vgpr_v16i8_idx0: 3040; GFX8: ; %bb.0: 3041; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3042; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3043; GFX8-NEXT: s_movk_i32 s4, 0xff 3044; GFX8-NEXT: s_waitcnt vmcnt(0) 3045; GFX8-NEXT: v_mov_b32_e32 v1, 8 3046; GFX8-NEXT: v_mov_b32_e32 v2, s4 3047; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 3048; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3049; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 3050; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3051; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3052; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3053; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3054; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3055; GFX8-NEXT: s_setpc_b64 s[30:31] 3056; 3057; GFX7-LABEL: extractelement_vgpr_v16i8_idx0: 3058; GFX7: ; %bb.0: 3059; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3060; GFX7-NEXT: s_mov_b32 s6, 0 3061; GFX7-NEXT: s_mov_b32 s7, 0xf000 3062; GFX7-NEXT: s_mov_b64 s[4:5], 0 3063; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3064; GFX7-NEXT: s_movk_i32 s4, 0xff 3065; GFX7-NEXT: s_waitcnt vmcnt(0) 3066; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3067; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 3068; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3069; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3070; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 3071; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3072; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 3073; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3074; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3075; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3076; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3077; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3078; GFX7-NEXT: s_setpc_b64 s[30:31] 3079; 3080; GFX10-LABEL: extractelement_vgpr_v16i8_idx0: 3081; GFX10: ; %bb.0: 3082; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3083; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3084; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3085; GFX10-NEXT: s_mov_b32 s4, 8 3086; GFX10-NEXT: s_waitcnt vmcnt(0) 3087; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3088; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3089; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3090; GFX10-NEXT: s_movk_i32 s4, 0xff 3091; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3092; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 3093; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3094; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3095; GFX10-NEXT: s_setpc_b64 s[30:31] 3096 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3097 %element = extractelement <16 x i8> %vector, i32 0 3098 ret i8 %element 3099} 3100 3101define i8 @extractelement_vgpr_v16i8_idx1(<16 x i8> addrspace(1)* %ptr) { 3102; GFX9-LABEL: extractelement_vgpr_v16i8_idx1: 3103; GFX9: ; %bb.0: 3104; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3105; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3106; GFX9-NEXT: s_mov_b32 s4, 8 3107; GFX9-NEXT: s_movk_i32 s5, 0xff 3108; GFX9-NEXT: s_waitcnt vmcnt(0) 3109; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3110; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3111; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3112; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3113; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 3114; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3115; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3116; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3117; GFX9-NEXT: s_setpc_b64 s[30:31] 3118; 3119; GFX8-LABEL: extractelement_vgpr_v16i8_idx1: 3120; GFX8: ; %bb.0: 3121; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3122; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3123; GFX8-NEXT: s_movk_i32 s4, 0xff 3124; GFX8-NEXT: s_waitcnt vmcnt(0) 3125; GFX8-NEXT: v_mov_b32_e32 v1, 8 3126; GFX8-NEXT: v_mov_b32_e32 v2, s4 3127; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 3128; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3129; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 3130; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3131; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3132; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3133; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3134; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3135; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3136; GFX8-NEXT: s_setpc_b64 s[30:31] 3137; 3138; GFX7-LABEL: extractelement_vgpr_v16i8_idx1: 3139; GFX7: ; %bb.0: 3140; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3141; GFX7-NEXT: s_mov_b32 s6, 0 3142; GFX7-NEXT: s_mov_b32 s7, 0xf000 3143; GFX7-NEXT: s_mov_b64 s[4:5], 0 3144; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3145; GFX7-NEXT: s_movk_i32 s4, 0xff 3146; GFX7-NEXT: s_waitcnt vmcnt(0) 3147; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3148; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 3149; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3150; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3151; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 3152; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3153; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 3154; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3155; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3156; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3157; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3158; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3159; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3160; GFX7-NEXT: s_setpc_b64 s[30:31] 3161; 3162; GFX10-LABEL: extractelement_vgpr_v16i8_idx1: 3163; GFX10: ; %bb.0: 3164; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3165; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3166; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3167; GFX10-NEXT: s_mov_b32 s4, 8 3168; GFX10-NEXT: s_waitcnt vmcnt(0) 3169; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3170; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3171; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3172; GFX10-NEXT: s_movk_i32 s4, 0xff 3173; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3174; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 3175; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3176; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3177; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3178; GFX10-NEXT: s_setpc_b64 s[30:31] 3179 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3180 %element = extractelement <16 x i8> %vector, i32 1 3181 ret i8 %element 3182} 3183 3184define i8 @extractelement_vgpr_v16i8_idx2(<16 x i8> addrspace(1)* %ptr) { 3185; GFX9-LABEL: extractelement_vgpr_v16i8_idx2: 3186; GFX9: ; %bb.0: 3187; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3188; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3189; GFX9-NEXT: s_mov_b32 s4, 8 3190; GFX9-NEXT: s_movk_i32 s5, 0xff 3191; GFX9-NEXT: s_waitcnt vmcnt(0) 3192; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3193; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3194; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3195; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3196; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 3197; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3198; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3199; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3200; GFX9-NEXT: s_setpc_b64 s[30:31] 3201; 3202; GFX8-LABEL: extractelement_vgpr_v16i8_idx2: 3203; GFX8: ; %bb.0: 3204; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3205; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3206; GFX8-NEXT: s_movk_i32 s4, 0xff 3207; GFX8-NEXT: s_waitcnt vmcnt(0) 3208; GFX8-NEXT: v_mov_b32_e32 v1, 8 3209; GFX8-NEXT: v_mov_b32_e32 v2, s4 3210; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 3211; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3212; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 3213; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3214; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3215; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3216; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3217; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3218; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3219; GFX8-NEXT: s_setpc_b64 s[30:31] 3220; 3221; GFX7-LABEL: extractelement_vgpr_v16i8_idx2: 3222; GFX7: ; %bb.0: 3223; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3224; GFX7-NEXT: s_mov_b32 s6, 0 3225; GFX7-NEXT: s_mov_b32 s7, 0xf000 3226; GFX7-NEXT: s_mov_b64 s[4:5], 0 3227; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3228; GFX7-NEXT: s_movk_i32 s4, 0xff 3229; GFX7-NEXT: s_waitcnt vmcnt(0) 3230; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3231; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 3232; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3233; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3234; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 3235; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3236; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 3237; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3238; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3239; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3240; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3241; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3242; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3243; GFX7-NEXT: s_setpc_b64 s[30:31] 3244; 3245; GFX10-LABEL: extractelement_vgpr_v16i8_idx2: 3246; GFX10: ; %bb.0: 3247; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3248; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3249; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3250; GFX10-NEXT: s_mov_b32 s4, 8 3251; GFX10-NEXT: s_waitcnt vmcnt(0) 3252; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3253; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3254; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3255; GFX10-NEXT: s_movk_i32 s4, 0xff 3256; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3257; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 3258; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3259; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3260; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3261; GFX10-NEXT: s_setpc_b64 s[30:31] 3262 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3263 %element = extractelement <16 x i8> %vector, i32 2 3264 ret i8 %element 3265} 3266 3267define i8 @extractelement_vgpr_v16i8_idx3(<16 x i8> addrspace(1)* %ptr) { 3268; GFX9-LABEL: extractelement_vgpr_v16i8_idx3: 3269; GFX9: ; %bb.0: 3270; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3271; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3272; GFX9-NEXT: s_mov_b32 s4, 8 3273; GFX9-NEXT: s_movk_i32 s5, 0xff 3274; GFX9-NEXT: s_waitcnt vmcnt(0) 3275; GFX9-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3276; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3277; GFX9-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3278; GFX9-NEXT: v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3279; GFX9-NEXT: v_and_or_b32 v0, v0, s5, v1 3280; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3281; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3282; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3283; GFX9-NEXT: s_setpc_b64 s[30:31] 3284; 3285; GFX8-LABEL: extractelement_vgpr_v16i8_idx3: 3286; GFX8: ; %bb.0: 3287; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3288; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3289; GFX8-NEXT: s_movk_i32 s4, 0xff 3290; GFX8-NEXT: s_waitcnt vmcnt(0) 3291; GFX8-NEXT: v_mov_b32_e32 v1, 8 3292; GFX8-NEXT: v_mov_b32_e32 v2, s4 3293; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v0 3294; GFX8-NEXT: v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3295; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v0 3296; GFX8-NEXT: v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3297; GFX8-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3298; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3299; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3300; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3301; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3302; GFX8-NEXT: s_setpc_b64 s[30:31] 3303; 3304; GFX7-LABEL: extractelement_vgpr_v16i8_idx3: 3305; GFX7: ; %bb.0: 3306; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3307; GFX7-NEXT: s_mov_b32 s6, 0 3308; GFX7-NEXT: s_mov_b32 s7, 0xf000 3309; GFX7-NEXT: s_mov_b64 s[4:5], 0 3310; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3311; GFX7-NEXT: s_movk_i32 s4, 0xff 3312; GFX7-NEXT: s_waitcnt vmcnt(0) 3313; GFX7-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3314; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v0 3315; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3316; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3317; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v0 3318; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3319; GFX7-NEXT: v_lshlrev_b32_e32 v1, 8, v1 3320; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3321; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3322; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3323; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3324; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3325; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3326; GFX7-NEXT: s_setpc_b64 s[30:31] 3327; 3328; GFX10-LABEL: extractelement_vgpr_v16i8_idx3: 3329; GFX10: ; %bb.0: 3330; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3331; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3332; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3333; GFX10-NEXT: s_mov_b32 s4, 8 3334; GFX10-NEXT: s_waitcnt vmcnt(0) 3335; GFX10-NEXT: v_lshrrev_b32_e32 v1, 8, v0 3336; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v0 3337; GFX10-NEXT: v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3338; GFX10-NEXT: s_movk_i32 s4, 0xff 3339; GFX10-NEXT: v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3340; GFX10-NEXT: v_and_or_b32 v0, v0, s4, v1 3341; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3342; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3343; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3344; GFX10-NEXT: s_setpc_b64 s[30:31] 3345 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3346 %element = extractelement <16 x i8> %vector, i32 3 3347 ret i8 %element 3348} 3349 3350define i8 @extractelement_vgpr_v16i8_idx4(<16 x i8> addrspace(1)* %ptr) { 3351; GFX9-LABEL: extractelement_vgpr_v16i8_idx4: 3352; GFX9: ; %bb.0: 3353; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3354; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3355; GFX9-NEXT: s_mov_b32 s4, 8 3356; GFX9-NEXT: s_movk_i32 s5, 0xff 3357; GFX9-NEXT: s_waitcnt vmcnt(0) 3358; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3359; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3360; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3361; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3362; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 3363; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3364; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3365; GFX9-NEXT: s_setpc_b64 s[30:31] 3366; 3367; GFX8-LABEL: extractelement_vgpr_v16i8_idx4: 3368; GFX8: ; %bb.0: 3369; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3370; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3371; GFX8-NEXT: s_movk_i32 s4, 0xff 3372; GFX8-NEXT: s_waitcnt vmcnt(0) 3373; GFX8-NEXT: v_mov_b32_e32 v0, 8 3374; GFX8-NEXT: v_mov_b32_e32 v2, s4 3375; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 3376; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3377; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 3378; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3379; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3380; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3381; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3382; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3383; GFX8-NEXT: s_setpc_b64 s[30:31] 3384; 3385; GFX7-LABEL: extractelement_vgpr_v16i8_idx4: 3386; GFX7: ; %bb.0: 3387; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3388; GFX7-NEXT: s_mov_b32 s6, 0 3389; GFX7-NEXT: s_mov_b32 s7, 0xf000 3390; GFX7-NEXT: s_mov_b64 s[4:5], 0 3391; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3392; GFX7-NEXT: s_movk_i32 s4, 0xff 3393; GFX7-NEXT: s_waitcnt vmcnt(0) 3394; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3395; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 3396; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3397; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3398; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 3399; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3400; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3401; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 3402; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3403; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3404; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3405; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3406; GFX7-NEXT: s_setpc_b64 s[30:31] 3407; 3408; GFX10-LABEL: extractelement_vgpr_v16i8_idx4: 3409; GFX10: ; %bb.0: 3410; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3411; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3412; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3413; GFX10-NEXT: s_mov_b32 s4, 8 3414; GFX10-NEXT: s_waitcnt vmcnt(0) 3415; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3416; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3417; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3418; GFX10-NEXT: s_movk_i32 s4, 0xff 3419; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3420; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 3421; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3422; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3423; GFX10-NEXT: s_setpc_b64 s[30:31] 3424 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3425 %element = extractelement <16 x i8> %vector, i32 4 3426 ret i8 %element 3427} 3428 3429define i8 @extractelement_vgpr_v16i8_idx5(<16 x i8> addrspace(1)* %ptr) { 3430; GFX9-LABEL: extractelement_vgpr_v16i8_idx5: 3431; GFX9: ; %bb.0: 3432; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3433; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3434; GFX9-NEXT: s_mov_b32 s4, 8 3435; GFX9-NEXT: s_movk_i32 s5, 0xff 3436; GFX9-NEXT: s_waitcnt vmcnt(0) 3437; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3438; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3439; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3440; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3441; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 3442; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3443; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3444; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3445; GFX9-NEXT: s_setpc_b64 s[30:31] 3446; 3447; GFX8-LABEL: extractelement_vgpr_v16i8_idx5: 3448; GFX8: ; %bb.0: 3449; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3450; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3451; GFX8-NEXT: s_movk_i32 s4, 0xff 3452; GFX8-NEXT: s_waitcnt vmcnt(0) 3453; GFX8-NEXT: v_mov_b32_e32 v0, 8 3454; GFX8-NEXT: v_mov_b32_e32 v2, s4 3455; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 3456; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3457; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 3458; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3459; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3460; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3461; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3462; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3463; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3464; GFX8-NEXT: s_setpc_b64 s[30:31] 3465; 3466; GFX7-LABEL: extractelement_vgpr_v16i8_idx5: 3467; GFX7: ; %bb.0: 3468; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3469; GFX7-NEXT: s_mov_b32 s6, 0 3470; GFX7-NEXT: s_mov_b32 s7, 0xf000 3471; GFX7-NEXT: s_mov_b64 s[4:5], 0 3472; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3473; GFX7-NEXT: s_movk_i32 s4, 0xff 3474; GFX7-NEXT: s_waitcnt vmcnt(0) 3475; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3476; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 3477; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3478; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3479; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 3480; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3481; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3482; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 3483; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3484; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3485; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3486; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3487; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3488; GFX7-NEXT: s_setpc_b64 s[30:31] 3489; 3490; GFX10-LABEL: extractelement_vgpr_v16i8_idx5: 3491; GFX10: ; %bb.0: 3492; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3493; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3494; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3495; GFX10-NEXT: s_mov_b32 s4, 8 3496; GFX10-NEXT: s_waitcnt vmcnt(0) 3497; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3498; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3499; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3500; GFX10-NEXT: s_movk_i32 s4, 0xff 3501; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3502; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 3503; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3504; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3505; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3506; GFX10-NEXT: s_setpc_b64 s[30:31] 3507 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3508 %element = extractelement <16 x i8> %vector, i32 5 3509 ret i8 %element 3510} 3511 3512define i8 @extractelement_vgpr_v16i8_idx6(<16 x i8> addrspace(1)* %ptr) { 3513; GFX9-LABEL: extractelement_vgpr_v16i8_idx6: 3514; GFX9: ; %bb.0: 3515; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3516; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3517; GFX9-NEXT: s_mov_b32 s4, 8 3518; GFX9-NEXT: s_movk_i32 s5, 0xff 3519; GFX9-NEXT: s_waitcnt vmcnt(0) 3520; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3521; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3522; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3523; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3524; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 3525; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3526; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3527; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3528; GFX9-NEXT: s_setpc_b64 s[30:31] 3529; 3530; GFX8-LABEL: extractelement_vgpr_v16i8_idx6: 3531; GFX8: ; %bb.0: 3532; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3533; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3534; GFX8-NEXT: s_movk_i32 s4, 0xff 3535; GFX8-NEXT: s_waitcnt vmcnt(0) 3536; GFX8-NEXT: v_mov_b32_e32 v0, 8 3537; GFX8-NEXT: v_mov_b32_e32 v2, s4 3538; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 3539; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3540; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 3541; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3542; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3543; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3544; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3545; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3546; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3547; GFX8-NEXT: s_setpc_b64 s[30:31] 3548; 3549; GFX7-LABEL: extractelement_vgpr_v16i8_idx6: 3550; GFX7: ; %bb.0: 3551; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3552; GFX7-NEXT: s_mov_b32 s6, 0 3553; GFX7-NEXT: s_mov_b32 s7, 0xf000 3554; GFX7-NEXT: s_mov_b64 s[4:5], 0 3555; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3556; GFX7-NEXT: s_movk_i32 s4, 0xff 3557; GFX7-NEXT: s_waitcnt vmcnt(0) 3558; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3559; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 3560; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3561; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3562; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 3563; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3564; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3565; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 3566; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3567; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3568; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3569; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3570; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3571; GFX7-NEXT: s_setpc_b64 s[30:31] 3572; 3573; GFX10-LABEL: extractelement_vgpr_v16i8_idx6: 3574; GFX10: ; %bb.0: 3575; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3576; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3577; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3578; GFX10-NEXT: s_mov_b32 s4, 8 3579; GFX10-NEXT: s_waitcnt vmcnt(0) 3580; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3581; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3582; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3583; GFX10-NEXT: s_movk_i32 s4, 0xff 3584; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3585; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 3586; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3587; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3588; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3589; GFX10-NEXT: s_setpc_b64 s[30:31] 3590 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3591 %element = extractelement <16 x i8> %vector, i32 6 3592 ret i8 %element 3593} 3594 3595define i8 @extractelement_vgpr_v16i8_idx7(<16 x i8> addrspace(1)* %ptr) { 3596; GFX9-LABEL: extractelement_vgpr_v16i8_idx7: 3597; GFX9: ; %bb.0: 3598; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3599; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3600; GFX9-NEXT: s_mov_b32 s4, 8 3601; GFX9-NEXT: s_movk_i32 s5, 0xff 3602; GFX9-NEXT: s_waitcnt vmcnt(0) 3603; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3604; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3605; GFX9-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3606; GFX9-NEXT: v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3607; GFX9-NEXT: v_and_or_b32 v0, v1, s5, v0 3608; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3609; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3610; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3611; GFX9-NEXT: s_setpc_b64 s[30:31] 3612; 3613; GFX8-LABEL: extractelement_vgpr_v16i8_idx7: 3614; GFX8: ; %bb.0: 3615; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3616; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3617; GFX8-NEXT: s_movk_i32 s4, 0xff 3618; GFX8-NEXT: s_waitcnt vmcnt(0) 3619; GFX8-NEXT: v_mov_b32_e32 v0, 8 3620; GFX8-NEXT: v_mov_b32_e32 v2, s4 3621; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v1 3622; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3623; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v1 3624; GFX8-NEXT: v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3625; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3626; GFX8-NEXT: v_or_b32_e32 v0, v0, v2 3627; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3628; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3629; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3630; GFX8-NEXT: s_setpc_b64 s[30:31] 3631; 3632; GFX7-LABEL: extractelement_vgpr_v16i8_idx7: 3633; GFX7: ; %bb.0: 3634; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3635; GFX7-NEXT: s_mov_b32 s6, 0 3636; GFX7-NEXT: s_mov_b32 s7, 0xf000 3637; GFX7-NEXT: s_mov_b64 s[4:5], 0 3638; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3639; GFX7-NEXT: s_movk_i32 s4, 0xff 3640; GFX7-NEXT: s_waitcnt vmcnt(0) 3641; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3642; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v1 3643; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3644; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3645; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v1 3646; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3647; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3648; GFX7-NEXT: v_or_b32_e32 v0, v1, v0 3649; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3650; GFX7-NEXT: v_or_b32_e32 v0, v0, v2 3651; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3652; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3653; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3654; GFX7-NEXT: s_setpc_b64 s[30:31] 3655; 3656; GFX10-LABEL: extractelement_vgpr_v16i8_idx7: 3657; GFX10: ; %bb.0: 3658; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3659; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3660; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3661; GFX10-NEXT: s_mov_b32 s4, 8 3662; GFX10-NEXT: s_waitcnt vmcnt(0) 3663; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v1 3664; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v1 3665; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3666; GFX10-NEXT: s_movk_i32 s4, 0xff 3667; GFX10-NEXT: v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3668; GFX10-NEXT: v_and_or_b32 v0, v1, s4, v0 3669; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v2 3670; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3671; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3672; GFX10-NEXT: s_setpc_b64 s[30:31] 3673 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3674 %element = extractelement <16 x i8> %vector, i32 7 3675 ret i8 %element 3676} 3677 3678define i8 @extractelement_vgpr_v16i8_idx8(<16 x i8> addrspace(1)* %ptr) { 3679; GFX9-LABEL: extractelement_vgpr_v16i8_idx8: 3680; GFX9: ; %bb.0: 3681; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3682; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3683; GFX9-NEXT: s_mov_b32 s4, 8 3684; GFX9-NEXT: s_movk_i32 s5, 0xff 3685; GFX9-NEXT: s_waitcnt vmcnt(0) 3686; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3687; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3688; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3689; GFX9-NEXT: v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3690; GFX9-NEXT: v_and_or_b32 v0, v2, s5, v0 3691; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3692; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3693; GFX9-NEXT: s_setpc_b64 s[30:31] 3694; 3695; GFX8-LABEL: extractelement_vgpr_v16i8_idx8: 3696; GFX8: ; %bb.0: 3697; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3698; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3699; GFX8-NEXT: s_movk_i32 s4, 0xff 3700; GFX8-NEXT: s_waitcnt vmcnt(0) 3701; GFX8-NEXT: v_mov_b32_e32 v0, 8 3702; GFX8-NEXT: v_mov_b32_e32 v1, s4 3703; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v2 3704; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3705; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v2 3706; GFX8-NEXT: v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3707; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3708; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3709; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3710; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3711; GFX8-NEXT: s_setpc_b64 s[30:31] 3712; 3713; GFX7-LABEL: extractelement_vgpr_v16i8_idx8: 3714; GFX7: ; %bb.0: 3715; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3716; GFX7-NEXT: s_mov_b32 s6, 0 3717; GFX7-NEXT: s_mov_b32 s7, 0xf000 3718; GFX7-NEXT: s_mov_b64 s[4:5], 0 3719; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3720; GFX7-NEXT: s_movk_i32 s4, 0xff 3721; GFX7-NEXT: s_waitcnt vmcnt(0) 3722; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3723; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v2 3724; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3725; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3726; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v2 3727; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3728; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3729; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 3730; GFX7-NEXT: v_or_b32_e32 v0, v2, v0 3731; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3732; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3733; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3734; GFX7-NEXT: s_setpc_b64 s[30:31] 3735; 3736; GFX10-LABEL: extractelement_vgpr_v16i8_idx8: 3737; GFX10: ; %bb.0: 3738; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3739; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3740; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3741; GFX10-NEXT: s_mov_b32 s4, 8 3742; GFX10-NEXT: s_waitcnt vmcnt(0) 3743; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3744; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3745; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3746; GFX10-NEXT: s_movk_i32 s4, 0xff 3747; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3748; GFX10-NEXT: v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3749; GFX10-NEXT: v_and_or_b32 v0, v2, s4, v0 3750; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3751; GFX10-NEXT: s_setpc_b64 s[30:31] 3752 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3753 %element = extractelement <16 x i8> %vector, i32 8 3754 ret i8 %element 3755} 3756 3757define i8 @extractelement_vgpr_v16i8_idx9(<16 x i8> addrspace(1)* %ptr) { 3758; GFX9-LABEL: extractelement_vgpr_v16i8_idx9: 3759; GFX9: ; %bb.0: 3760; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3761; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3762; GFX9-NEXT: s_mov_b32 s4, 8 3763; GFX9-NEXT: s_movk_i32 s5, 0xff 3764; GFX9-NEXT: s_waitcnt vmcnt(0) 3765; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3766; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3767; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3768; GFX9-NEXT: v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3769; GFX9-NEXT: v_and_or_b32 v0, v2, s5, v0 3770; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3771; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3772; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3773; GFX9-NEXT: s_setpc_b64 s[30:31] 3774; 3775; GFX8-LABEL: extractelement_vgpr_v16i8_idx9: 3776; GFX8: ; %bb.0: 3777; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3778; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3779; GFX8-NEXT: s_movk_i32 s4, 0xff 3780; GFX8-NEXT: s_waitcnt vmcnt(0) 3781; GFX8-NEXT: v_mov_b32_e32 v0, 8 3782; GFX8-NEXT: v_mov_b32_e32 v1, s4 3783; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v2 3784; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3785; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v2 3786; GFX8-NEXT: v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3787; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3788; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3789; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3790; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3791; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3792; GFX8-NEXT: s_setpc_b64 s[30:31] 3793; 3794; GFX7-LABEL: extractelement_vgpr_v16i8_idx9: 3795; GFX7: ; %bb.0: 3796; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3797; GFX7-NEXT: s_mov_b32 s6, 0 3798; GFX7-NEXT: s_mov_b32 s7, 0xf000 3799; GFX7-NEXT: s_mov_b64 s[4:5], 0 3800; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3801; GFX7-NEXT: s_movk_i32 s4, 0xff 3802; GFX7-NEXT: s_waitcnt vmcnt(0) 3803; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3804; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v2 3805; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3806; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3807; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v2 3808; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3809; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3810; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 3811; GFX7-NEXT: v_or_b32_e32 v0, v2, v0 3812; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3813; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3814; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3815; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3816; GFX7-NEXT: s_setpc_b64 s[30:31] 3817; 3818; GFX10-LABEL: extractelement_vgpr_v16i8_idx9: 3819; GFX10: ; %bb.0: 3820; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3821; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3822; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3823; GFX10-NEXT: s_mov_b32 s4, 8 3824; GFX10-NEXT: s_waitcnt vmcnt(0) 3825; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3826; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3827; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3828; GFX10-NEXT: s_movk_i32 s4, 0xff 3829; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3830; GFX10-NEXT: v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3831; GFX10-NEXT: v_and_or_b32 v0, v2, s4, v0 3832; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3833; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 3834; GFX10-NEXT: s_setpc_b64 s[30:31] 3835 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3836 %element = extractelement <16 x i8> %vector, i32 9 3837 ret i8 %element 3838} 3839 3840define i8 @extractelement_vgpr_v16i8_idx10(<16 x i8> addrspace(1)* %ptr) { 3841; GFX9-LABEL: extractelement_vgpr_v16i8_idx10: 3842; GFX9: ; %bb.0: 3843; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3844; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3845; GFX9-NEXT: s_mov_b32 s4, 8 3846; GFX9-NEXT: s_movk_i32 s5, 0xff 3847; GFX9-NEXT: s_waitcnt vmcnt(0) 3848; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3849; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3850; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3851; GFX9-NEXT: v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3852; GFX9-NEXT: v_and_or_b32 v0, v2, s5, v0 3853; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3854; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3855; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3856; GFX9-NEXT: s_setpc_b64 s[30:31] 3857; 3858; GFX8-LABEL: extractelement_vgpr_v16i8_idx10: 3859; GFX8: ; %bb.0: 3860; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3861; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3862; GFX8-NEXT: s_movk_i32 s4, 0xff 3863; GFX8-NEXT: s_waitcnt vmcnt(0) 3864; GFX8-NEXT: v_mov_b32_e32 v0, 8 3865; GFX8-NEXT: v_mov_b32_e32 v1, s4 3866; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v2 3867; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3868; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v2 3869; GFX8-NEXT: v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3870; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3871; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3872; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3873; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3874; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3875; GFX8-NEXT: s_setpc_b64 s[30:31] 3876; 3877; GFX7-LABEL: extractelement_vgpr_v16i8_idx10: 3878; GFX7: ; %bb.0: 3879; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3880; GFX7-NEXT: s_mov_b32 s6, 0 3881; GFX7-NEXT: s_mov_b32 s7, 0xf000 3882; GFX7-NEXT: s_mov_b64 s[4:5], 0 3883; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3884; GFX7-NEXT: s_movk_i32 s4, 0xff 3885; GFX7-NEXT: s_waitcnt vmcnt(0) 3886; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3887; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v2 3888; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3889; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3890; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v2 3891; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3892; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3893; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 3894; GFX7-NEXT: v_or_b32_e32 v0, v2, v0 3895; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3896; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3897; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3898; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3899; GFX7-NEXT: s_setpc_b64 s[30:31] 3900; 3901; GFX10-LABEL: extractelement_vgpr_v16i8_idx10: 3902; GFX10: ; %bb.0: 3903; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3904; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3905; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3906; GFX10-NEXT: s_mov_b32 s4, 8 3907; GFX10-NEXT: s_waitcnt vmcnt(0) 3908; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3909; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3910; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3911; GFX10-NEXT: s_movk_i32 s4, 0xff 3912; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3913; GFX10-NEXT: v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3914; GFX10-NEXT: v_and_or_b32 v0, v2, s4, v0 3915; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3916; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 3917; GFX10-NEXT: s_setpc_b64 s[30:31] 3918 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 3919 %element = extractelement <16 x i8> %vector, i32 10 3920 ret i8 %element 3921} 3922 3923define i8 @extractelement_vgpr_v16i8_idx11(<16 x i8> addrspace(1)* %ptr) { 3924; GFX9-LABEL: extractelement_vgpr_v16i8_idx11: 3925; GFX9: ; %bb.0: 3926; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3927; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3928; GFX9-NEXT: s_mov_b32 s4, 8 3929; GFX9-NEXT: s_movk_i32 s5, 0xff 3930; GFX9-NEXT: s_waitcnt vmcnt(0) 3931; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3932; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3933; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3934; GFX9-NEXT: v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3935; GFX9-NEXT: v_and_or_b32 v0, v2, s5, v0 3936; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3937; GFX9-NEXT: v_or3_b32 v0, v0, v3, v1 3938; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3939; GFX9-NEXT: s_setpc_b64 s[30:31] 3940; 3941; GFX8-LABEL: extractelement_vgpr_v16i8_idx11: 3942; GFX8: ; %bb.0: 3943; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3944; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 3945; GFX8-NEXT: s_movk_i32 s4, 0xff 3946; GFX8-NEXT: s_waitcnt vmcnt(0) 3947; GFX8-NEXT: v_mov_b32_e32 v0, 8 3948; GFX8-NEXT: v_mov_b32_e32 v1, s4 3949; GFX8-NEXT: v_lshrrev_b32_e32 v3, 8, v2 3950; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3951; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v2 3952; GFX8-NEXT: v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3953; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 3954; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3955; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 3956; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 3957; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3958; GFX8-NEXT: s_setpc_b64 s[30:31] 3959; 3960; GFX7-LABEL: extractelement_vgpr_v16i8_idx11: 3961; GFX7: ; %bb.0: 3962; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3963; GFX7-NEXT: s_mov_b32 s6, 0 3964; GFX7-NEXT: s_mov_b32 s7, 0xf000 3965; GFX7-NEXT: s_mov_b64 s[4:5], 0 3966; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 3967; GFX7-NEXT: s_movk_i32 s4, 0xff 3968; GFX7-NEXT: s_waitcnt vmcnt(0) 3969; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3970; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v2 3971; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 3972; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 3973; GFX7-NEXT: v_lshrrev_b32_e32 v3, 24, v2 3974; GFX7-NEXT: v_and_b32_e32 v2, s4, v2 3975; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 3976; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 3977; GFX7-NEXT: v_or_b32_e32 v0, v2, v0 3978; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3979; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v3 3980; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 3981; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 3982; GFX7-NEXT: s_setpc_b64 s[30:31] 3983; 3984; GFX10-LABEL: extractelement_vgpr_v16i8_idx11: 3985; GFX10: ; %bb.0: 3986; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 3987; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 3988; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 3989; GFX10-NEXT: s_mov_b32 s4, 8 3990; GFX10-NEXT: s_waitcnt vmcnt(0) 3991; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v2 3992; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v2 3993; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 3994; GFX10-NEXT: s_movk_i32 s4, 0xff 3995; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 3996; GFX10-NEXT: v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 3997; GFX10-NEXT: v_and_or_b32 v0, v2, s4, v0 3998; GFX10-NEXT: v_or3_b32 v0, v0, v3, v1 3999; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 4000; GFX10-NEXT: s_setpc_b64 s[30:31] 4001 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 4002 %element = extractelement <16 x i8> %vector, i32 11 4003 ret i8 %element 4004} 4005 4006define i8 @extractelement_vgpr_v16i8_idx12(<16 x i8> addrspace(1)* %ptr) { 4007; GFX9-LABEL: extractelement_vgpr_v16i8_idx12: 4008; GFX9: ; %bb.0: 4009; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4010; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4011; GFX9-NEXT: s_mov_b32 s4, 8 4012; GFX9-NEXT: s_movk_i32 s5, 0xff 4013; GFX9-NEXT: s_waitcnt vmcnt(0) 4014; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4015; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4016; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4017; GFX9-NEXT: v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4018; GFX9-NEXT: v_and_or_b32 v0, v3, s5, v0 4019; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4020; GFX9-NEXT: v_or3_b32 v0, v0, v2, v1 4021; GFX9-NEXT: s_setpc_b64 s[30:31] 4022; 4023; GFX8-LABEL: extractelement_vgpr_v16i8_idx12: 4024; GFX8: ; %bb.0: 4025; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4026; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 4027; GFX8-NEXT: s_movk_i32 s4, 0xff 4028; GFX8-NEXT: s_waitcnt vmcnt(0) 4029; GFX8-NEXT: v_mov_b32_e32 v0, 8 4030; GFX8-NEXT: v_mov_b32_e32 v1, s4 4031; GFX8-NEXT: v_lshrrev_b32_e32 v2, 8, v3 4032; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4033; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v3 4034; GFX8-NEXT: v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4035; GFX8-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 4036; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4037; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 4038; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4039; GFX8-NEXT: s_setpc_b64 s[30:31] 4040; 4041; GFX7-LABEL: extractelement_vgpr_v16i8_idx12: 4042; GFX7: ; %bb.0: 4043; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4044; GFX7-NEXT: s_mov_b32 s6, 0 4045; GFX7-NEXT: s_mov_b32 s7, 0xf000 4046; GFX7-NEXT: s_mov_b64 s[4:5], 0 4047; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 4048; GFX7-NEXT: s_movk_i32 s4, 0xff 4049; GFX7-NEXT: s_waitcnt vmcnt(0) 4050; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4051; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v3 4052; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 4053; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 4054; GFX7-NEXT: v_lshrrev_b32_e32 v2, 24, v3 4055; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 4056; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 4057; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 4058; GFX7-NEXT: v_or_b32_e32 v0, v3, v0 4059; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4060; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v2 4061; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4062; GFX7-NEXT: s_setpc_b64 s[30:31] 4063; 4064; GFX10-LABEL: extractelement_vgpr_v16i8_idx12: 4065; GFX10: ; %bb.0: 4066; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4067; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 4068; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4069; GFX10-NEXT: s_mov_b32 s4, 8 4070; GFX10-NEXT: s_waitcnt vmcnt(0) 4071; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4072; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4073; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4074; GFX10-NEXT: s_movk_i32 s4, 0xff 4075; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4076; GFX10-NEXT: v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4077; GFX10-NEXT: v_and_or_b32 v0, v3, s4, v0 4078; GFX10-NEXT: v_or3_b32 v0, v0, v2, v1 4079; GFX10-NEXT: s_setpc_b64 s[30:31] 4080 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 4081 %element = extractelement <16 x i8> %vector, i32 12 4082 ret i8 %element 4083} 4084 4085define i8 @extractelement_vgpr_v16i8_idx13(<16 x i8> addrspace(1)* %ptr) { 4086; GFX9-LABEL: extractelement_vgpr_v16i8_idx13: 4087; GFX9: ; %bb.0: 4088; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4089; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4090; GFX9-NEXT: s_mov_b32 s4, 8 4091; GFX9-NEXT: s_movk_i32 s5, 0xff 4092; GFX9-NEXT: s_waitcnt vmcnt(0) 4093; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4094; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4095; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4096; GFX9-NEXT: v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4097; GFX9-NEXT: v_and_or_b32 v0, v3, s5, v0 4098; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4099; GFX9-NEXT: v_or3_b32 v0, v0, v2, v1 4100; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v0 4101; GFX9-NEXT: s_setpc_b64 s[30:31] 4102; 4103; GFX8-LABEL: extractelement_vgpr_v16i8_idx13: 4104; GFX8: ; %bb.0: 4105; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4106; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 4107; GFX8-NEXT: s_movk_i32 s4, 0xff 4108; GFX8-NEXT: s_waitcnt vmcnt(0) 4109; GFX8-NEXT: v_mov_b32_e32 v0, 8 4110; GFX8-NEXT: v_mov_b32_e32 v1, s4 4111; GFX8-NEXT: v_lshrrev_b32_e32 v2, 8, v3 4112; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4113; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v3 4114; GFX8-NEXT: v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4115; GFX8-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 4116; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4117; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 4118; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4119; GFX8-NEXT: v_lshrrev_b32_e32 v0, 8, v0 4120; GFX8-NEXT: s_setpc_b64 s[30:31] 4121; 4122; GFX7-LABEL: extractelement_vgpr_v16i8_idx13: 4123; GFX7: ; %bb.0: 4124; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4125; GFX7-NEXT: s_mov_b32 s6, 0 4126; GFX7-NEXT: s_mov_b32 s7, 0xf000 4127; GFX7-NEXT: s_mov_b64 s[4:5], 0 4128; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 4129; GFX7-NEXT: s_movk_i32 s4, 0xff 4130; GFX7-NEXT: s_waitcnt vmcnt(0) 4131; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4132; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v3 4133; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 4134; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 4135; GFX7-NEXT: v_lshrrev_b32_e32 v2, 24, v3 4136; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 4137; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 4138; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 4139; GFX7-NEXT: v_or_b32_e32 v0, v3, v0 4140; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4141; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v2 4142; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4143; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v0 4144; GFX7-NEXT: s_setpc_b64 s[30:31] 4145; 4146; GFX10-LABEL: extractelement_vgpr_v16i8_idx13: 4147; GFX10: ; %bb.0: 4148; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4149; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 4150; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4151; GFX10-NEXT: s_mov_b32 s4, 8 4152; GFX10-NEXT: s_waitcnt vmcnt(0) 4153; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4154; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4155; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4156; GFX10-NEXT: s_movk_i32 s4, 0xff 4157; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4158; GFX10-NEXT: v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4159; GFX10-NEXT: v_and_or_b32 v0, v3, s4, v0 4160; GFX10-NEXT: v_or3_b32 v0, v0, v2, v1 4161; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v0 4162; GFX10-NEXT: s_setpc_b64 s[30:31] 4163 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 4164 %element = extractelement <16 x i8> %vector, i32 13 4165 ret i8 %element 4166} 4167 4168define i8 @extractelement_vgpr_v16i8_idx14(<16 x i8> addrspace(1)* %ptr) { 4169; GFX9-LABEL: extractelement_vgpr_v16i8_idx14: 4170; GFX9: ; %bb.0: 4171; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4172; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4173; GFX9-NEXT: s_mov_b32 s4, 8 4174; GFX9-NEXT: s_movk_i32 s5, 0xff 4175; GFX9-NEXT: s_waitcnt vmcnt(0) 4176; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4177; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4178; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4179; GFX9-NEXT: v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4180; GFX9-NEXT: v_and_or_b32 v0, v3, s5, v0 4181; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4182; GFX9-NEXT: v_or3_b32 v0, v0, v2, v1 4183; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v0 4184; GFX9-NEXT: s_setpc_b64 s[30:31] 4185; 4186; GFX8-LABEL: extractelement_vgpr_v16i8_idx14: 4187; GFX8: ; %bb.0: 4188; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4189; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 4190; GFX8-NEXT: s_movk_i32 s4, 0xff 4191; GFX8-NEXT: s_waitcnt vmcnt(0) 4192; GFX8-NEXT: v_mov_b32_e32 v0, 8 4193; GFX8-NEXT: v_mov_b32_e32 v1, s4 4194; GFX8-NEXT: v_lshrrev_b32_e32 v2, 8, v3 4195; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4196; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v3 4197; GFX8-NEXT: v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4198; GFX8-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 4199; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4200; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 4201; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4202; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v0 4203; GFX8-NEXT: s_setpc_b64 s[30:31] 4204; 4205; GFX7-LABEL: extractelement_vgpr_v16i8_idx14: 4206; GFX7: ; %bb.0: 4207; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4208; GFX7-NEXT: s_mov_b32 s6, 0 4209; GFX7-NEXT: s_mov_b32 s7, 0xf000 4210; GFX7-NEXT: s_mov_b64 s[4:5], 0 4211; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 4212; GFX7-NEXT: s_movk_i32 s4, 0xff 4213; GFX7-NEXT: s_waitcnt vmcnt(0) 4214; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4215; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v3 4216; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 4217; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 4218; GFX7-NEXT: v_lshrrev_b32_e32 v2, 24, v3 4219; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 4220; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 4221; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 4222; GFX7-NEXT: v_or_b32_e32 v0, v3, v0 4223; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4224; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v2 4225; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4226; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0 4227; GFX7-NEXT: s_setpc_b64 s[30:31] 4228; 4229; GFX10-LABEL: extractelement_vgpr_v16i8_idx14: 4230; GFX10: ; %bb.0: 4231; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4232; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 4233; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4234; GFX10-NEXT: s_mov_b32 s4, 8 4235; GFX10-NEXT: s_waitcnt vmcnt(0) 4236; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4237; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4238; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4239; GFX10-NEXT: s_movk_i32 s4, 0xff 4240; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4241; GFX10-NEXT: v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4242; GFX10-NEXT: v_and_or_b32 v0, v3, s4, v0 4243; GFX10-NEXT: v_or3_b32 v0, v0, v2, v1 4244; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v0 4245; GFX10-NEXT: s_setpc_b64 s[30:31] 4246 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 4247 %element = extractelement <16 x i8> %vector, i32 14 4248 ret i8 %element 4249} 4250 4251define i8 @extractelement_vgpr_v16i8_idx15(<16 x i8> addrspace(1)* %ptr) { 4252; GFX9-LABEL: extractelement_vgpr_v16i8_idx15: 4253; GFX9: ; %bb.0: 4254; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4255; GFX9-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4256; GFX9-NEXT: s_mov_b32 s4, 8 4257; GFX9-NEXT: s_movk_i32 s5, 0xff 4258; GFX9-NEXT: s_waitcnt vmcnt(0) 4259; GFX9-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4260; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4261; GFX9-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4262; GFX9-NEXT: v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4263; GFX9-NEXT: v_and_or_b32 v0, v3, s5, v0 4264; GFX9-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4265; GFX9-NEXT: v_or3_b32 v0, v0, v2, v1 4266; GFX9-NEXT: v_lshrrev_b32_e32 v0, 24, v0 4267; GFX9-NEXT: s_setpc_b64 s[30:31] 4268; 4269; GFX8-LABEL: extractelement_vgpr_v16i8_idx15: 4270; GFX8: ; %bb.0: 4271; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4272; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 4273; GFX8-NEXT: s_movk_i32 s4, 0xff 4274; GFX8-NEXT: s_waitcnt vmcnt(0) 4275; GFX8-NEXT: v_mov_b32_e32 v0, 8 4276; GFX8-NEXT: v_mov_b32_e32 v1, s4 4277; GFX8-NEXT: v_lshrrev_b32_e32 v2, 8, v3 4278; GFX8-NEXT: v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4279; GFX8-NEXT: v_lshrrev_b32_e32 v4, 24, v3 4280; GFX8-NEXT: v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4281; GFX8-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD 4282; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4283; GFX8-NEXT: v_lshlrev_b32_e32 v1, 24, v4 4284; GFX8-NEXT: v_or_b32_e32 v0, v0, v1 4285; GFX8-NEXT: v_lshrrev_b32_e32 v0, 24, v0 4286; GFX8-NEXT: s_setpc_b64 s[30:31] 4287; 4288; GFX7-LABEL: extractelement_vgpr_v16i8_idx15: 4289; GFX7: ; %bb.0: 4290; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4291; GFX7-NEXT: s_mov_b32 s6, 0 4292; GFX7-NEXT: s_mov_b32 s7, 0xf000 4293; GFX7-NEXT: s_mov_b64 s[4:5], 0 4294; GFX7-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64 4295; GFX7-NEXT: s_movk_i32 s4, 0xff 4296; GFX7-NEXT: s_waitcnt vmcnt(0) 4297; GFX7-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4298; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v3 4299; GFX7-NEXT: v_and_b32_e32 v0, s4, v0 4300; GFX7-NEXT: v_and_b32_e32 v1, s4, v1 4301; GFX7-NEXT: v_lshrrev_b32_e32 v2, 24, v3 4302; GFX7-NEXT: v_and_b32_e32 v3, s4, v3 4303; GFX7-NEXT: v_lshlrev_b32_e32 v0, 8, v0 4304; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1 4305; GFX7-NEXT: v_or_b32_e32 v0, v3, v0 4306; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4307; GFX7-NEXT: v_lshlrev_b32_e32 v1, 24, v2 4308; GFX7-NEXT: v_or_b32_e32 v0, v0, v1 4309; GFX7-NEXT: v_lshrrev_b32_e32 v0, 24, v0 4310; GFX7-NEXT: s_setpc_b64 s[30:31] 4311; 4312; GFX10-LABEL: extractelement_vgpr_v16i8_idx15: 4313; GFX10: ; %bb.0: 4314; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 4315; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 4316; GFX10-NEXT: global_load_dwordx4 v[0:3], v[0:1], off 4317; GFX10-NEXT: s_mov_b32 s4, 8 4318; GFX10-NEXT: s_waitcnt vmcnt(0) 4319; GFX10-NEXT: v_lshrrev_b32_e32 v0, 8, v3 4320; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v3 4321; GFX10-NEXT: v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 4322; GFX10-NEXT: s_movk_i32 s4, 0xff 4323; GFX10-NEXT: v_lshlrev_b32_e32 v1, 24, v1 4324; GFX10-NEXT: v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 4325; GFX10-NEXT: v_and_or_b32 v0, v3, s4, v0 4326; GFX10-NEXT: v_or3_b32 v0, v0, v2, v1 4327; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v0 4328; GFX10-NEXT: s_setpc_b64 s[30:31] 4329 %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr 4330 %element = extractelement <16 x i8> %vector, i32 15 4331 ret i8 %element 4332} 4333