1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 < %s | FileCheck --check-prefix=GFX9 %s 3; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=fiji < %s | FileCheck --check-prefix=GFX8 %s 4; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=tahiti < %s | FileCheck --check-prefix=GFX6 %s 5; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx1010 < %s | FileCheck --check-prefix=GFX10 %s 6 7define i64 @zextload_global_i1_to_i64(i1 addrspace(1)* %ptr) { 8; GFX9-LABEL: zextload_global_i1_to_i64: 9; GFX9: ; %bb.0: 10; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 11; GFX9-NEXT: global_load_ubyte v0, v[0:1], off 12; GFX9-NEXT: v_mov_b32_e32 v1, 0 13; GFX9-NEXT: s_waitcnt vmcnt(0) 14; GFX9-NEXT: v_and_b32_e32 v0, 1, v0 15; GFX9-NEXT: s_setpc_b64 s[30:31] 16; 17; GFX8-LABEL: zextload_global_i1_to_i64: 18; GFX8: ; %bb.0: 19; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 20; GFX8-NEXT: flat_load_ubyte v0, v[0:1] 21; GFX8-NEXT: v_mov_b32_e32 v1, 0 22; GFX8-NEXT: s_waitcnt vmcnt(0) 23; GFX8-NEXT: v_and_b32_e32 v0, 1, v0 24; GFX8-NEXT: s_setpc_b64 s[30:31] 25; 26; GFX6-LABEL: zextload_global_i1_to_i64: 27; GFX6: ; %bb.0: 28; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 29; GFX6-NEXT: s_mov_b32 s6, 0 30; GFX6-NEXT: s_mov_b32 s7, 0xf000 31; GFX6-NEXT: s_mov_b64 s[4:5], 0 32; GFX6-NEXT: buffer_load_ubyte v0, v[0:1], s[4:7], 0 addr64 33; GFX6-NEXT: v_mov_b32_e32 v1, 0 34; GFX6-NEXT: s_waitcnt vmcnt(0) 35; GFX6-NEXT: v_and_b32_e32 v0, 1, v0 36; GFX6-NEXT: s_setpc_b64 s[30:31] 37; 38; GFX10-LABEL: zextload_global_i1_to_i64: 39; GFX10: ; %bb.0: 40; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 41; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 42; GFX10-NEXT: global_load_ubyte v0, v[0:1], off 43; GFX10-NEXT: v_mov_b32_e32 v1, 0 44; GFX10-NEXT: s_waitcnt vmcnt(0) 45; GFX10-NEXT: v_and_b32_e32 v0, 1, v0 46; GFX10-NEXT: s_setpc_b64 s[30:31] 47 %load = load i1, i1 addrspace(1)* %ptr 48 %ext = zext i1 %load to i64 49 ret i64 %ext 50} 51 52define i64 @zextload_global_i8_to_i64(i8 addrspace(1)* %ptr) { 53; GFX9-LABEL: zextload_global_i8_to_i64: 54; GFX9: ; %bb.0: 55; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 56; GFX9-NEXT: global_load_ubyte v0, v[0:1], off 57; GFX9-NEXT: v_mov_b32_e32 v1, 0 58; GFX9-NEXT: s_waitcnt vmcnt(0) 59; GFX9-NEXT: s_setpc_b64 s[30:31] 60; 61; GFX8-LABEL: zextload_global_i8_to_i64: 62; GFX8: ; %bb.0: 63; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 64; GFX8-NEXT: flat_load_ubyte v0, v[0:1] 65; GFX8-NEXT: v_mov_b32_e32 v1, 0 66; GFX8-NEXT: s_waitcnt vmcnt(0) 67; GFX8-NEXT: s_setpc_b64 s[30:31] 68; 69; GFX6-LABEL: zextload_global_i8_to_i64: 70; GFX6: ; %bb.0: 71; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 72; GFX6-NEXT: s_mov_b32 s6, 0 73; GFX6-NEXT: s_mov_b32 s7, 0xf000 74; GFX6-NEXT: s_mov_b64 s[4:5], 0 75; GFX6-NEXT: buffer_load_ubyte v0, v[0:1], s[4:7], 0 addr64 76; GFX6-NEXT: v_mov_b32_e32 v1, 0 77; GFX6-NEXT: s_waitcnt vmcnt(0) 78; GFX6-NEXT: s_setpc_b64 s[30:31] 79; 80; GFX10-LABEL: zextload_global_i8_to_i64: 81; GFX10: ; %bb.0: 82; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 83; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 84; GFX10-NEXT: global_load_ubyte v0, v[0:1], off 85; GFX10-NEXT: v_mov_b32_e32 v1, 0 86; GFX10-NEXT: s_waitcnt vmcnt(0) 87; GFX10-NEXT: s_setpc_b64 s[30:31] 88 %load = load i8, i8 addrspace(1)* %ptr 89 %ext = zext i8 %load to i64 90 ret i64 %ext 91} 92 93define i64 @zextload_global_i16_to_i64(i16 addrspace(1)* %ptr) { 94; GFX9-LABEL: zextload_global_i16_to_i64: 95; GFX9: ; %bb.0: 96; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 97; GFX9-NEXT: global_load_ushort v0, v[0:1], off 98; GFX9-NEXT: v_mov_b32_e32 v1, 0 99; GFX9-NEXT: s_waitcnt vmcnt(0) 100; GFX9-NEXT: s_setpc_b64 s[30:31] 101; 102; GFX8-LABEL: zextload_global_i16_to_i64: 103; GFX8: ; %bb.0: 104; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 105; GFX8-NEXT: flat_load_ushort v0, v[0:1] 106; GFX8-NEXT: v_mov_b32_e32 v1, 0 107; GFX8-NEXT: s_waitcnt vmcnt(0) 108; GFX8-NEXT: s_setpc_b64 s[30:31] 109; 110; GFX6-LABEL: zextload_global_i16_to_i64: 111; GFX6: ; %bb.0: 112; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 113; GFX6-NEXT: s_mov_b32 s6, 0 114; GFX6-NEXT: s_mov_b32 s7, 0xf000 115; GFX6-NEXT: s_mov_b64 s[4:5], 0 116; GFX6-NEXT: buffer_load_ushort v0, v[0:1], s[4:7], 0 addr64 117; GFX6-NEXT: v_mov_b32_e32 v1, 0 118; GFX6-NEXT: s_waitcnt vmcnt(0) 119; GFX6-NEXT: s_setpc_b64 s[30:31] 120; 121; GFX10-LABEL: zextload_global_i16_to_i64: 122; GFX10: ; %bb.0: 123; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 124; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 125; GFX10-NEXT: global_load_ushort v0, v[0:1], off 126; GFX10-NEXT: v_mov_b32_e32 v1, 0 127; GFX10-NEXT: s_waitcnt vmcnt(0) 128; GFX10-NEXT: s_setpc_b64 s[30:31] 129 %load = load i16, i16 addrspace(1)* %ptr 130 %ext = zext i16 %load to i64 131 ret i64 %ext 132} 133 134define i64 @zextload_global_i32_to_i64(i32 addrspace(1)* %ptr) { 135; GFX9-LABEL: zextload_global_i32_to_i64: 136; GFX9: ; %bb.0: 137; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 138; GFX9-NEXT: global_load_dword v0, v[0:1], off 139; GFX9-NEXT: v_mov_b32_e32 v1, 0 140; GFX9-NEXT: s_waitcnt vmcnt(0) 141; GFX9-NEXT: s_setpc_b64 s[30:31] 142; 143; GFX8-LABEL: zextload_global_i32_to_i64: 144; GFX8: ; %bb.0: 145; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 146; GFX8-NEXT: flat_load_dword v0, v[0:1] 147; GFX8-NEXT: v_mov_b32_e32 v1, 0 148; GFX8-NEXT: s_waitcnt vmcnt(0) 149; GFX8-NEXT: s_setpc_b64 s[30:31] 150; 151; GFX6-LABEL: zextload_global_i32_to_i64: 152; GFX6: ; %bb.0: 153; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 154; GFX6-NEXT: s_mov_b32 s6, 0 155; GFX6-NEXT: s_mov_b32 s7, 0xf000 156; GFX6-NEXT: s_mov_b64 s[4:5], 0 157; GFX6-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 158; GFX6-NEXT: v_mov_b32_e32 v1, 0 159; GFX6-NEXT: s_waitcnt vmcnt(0) 160; GFX6-NEXT: s_setpc_b64 s[30:31] 161; 162; GFX10-LABEL: zextload_global_i32_to_i64: 163; GFX10: ; %bb.0: 164; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 165; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 166; GFX10-NEXT: global_load_dword v0, v[0:1], off 167; GFX10-NEXT: v_mov_b32_e32 v1, 0 168; GFX10-NEXT: s_waitcnt vmcnt(0) 169; GFX10-NEXT: s_setpc_b64 s[30:31] 170 %load = load i32, i32 addrspace(1)* %ptr 171 %ext = zext i32 %load to i64 172 ret i64 %ext 173} 174 175define i96 @zextload_global_i32_to_i96(i32 addrspace(1)* %ptr) { 176; GFX9-LABEL: zextload_global_i32_to_i96: 177; GFX9: ; %bb.0: 178; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 179; GFX9-NEXT: global_load_dword v0, v[0:1], off 180; GFX9-NEXT: v_mov_b32_e32 v1, 0 181; GFX9-NEXT: v_mov_b32_e32 v2, 0 182; GFX9-NEXT: s_waitcnt vmcnt(0) 183; GFX9-NEXT: s_setpc_b64 s[30:31] 184; 185; GFX8-LABEL: zextload_global_i32_to_i96: 186; GFX8: ; %bb.0: 187; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 188; GFX8-NEXT: flat_load_dword v0, v[0:1] 189; GFX8-NEXT: v_mov_b32_e32 v1, 0 190; GFX8-NEXT: v_mov_b32_e32 v2, 0 191; GFX8-NEXT: s_waitcnt vmcnt(0) 192; GFX8-NEXT: s_setpc_b64 s[30:31] 193; 194; GFX6-LABEL: zextload_global_i32_to_i96: 195; GFX6: ; %bb.0: 196; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 197; GFX6-NEXT: s_mov_b32 s6, 0 198; GFX6-NEXT: s_mov_b32 s7, 0xf000 199; GFX6-NEXT: s_mov_b64 s[4:5], 0 200; GFX6-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 201; GFX6-NEXT: v_mov_b32_e32 v1, 0 202; GFX6-NEXT: v_mov_b32_e32 v2, 0 203; GFX6-NEXT: s_waitcnt vmcnt(0) 204; GFX6-NEXT: s_setpc_b64 s[30:31] 205; 206; GFX10-LABEL: zextload_global_i32_to_i96: 207; GFX10: ; %bb.0: 208; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 209; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 210; GFX10-NEXT: global_load_dword v0, v[0:1], off 211; GFX10-NEXT: v_mov_b32_e32 v1, 0 212; GFX10-NEXT: v_mov_b32_e32 v2, 0 213; GFX10-NEXT: s_waitcnt vmcnt(0) 214; GFX10-NEXT: s_setpc_b64 s[30:31] 215 %load = load i32, i32 addrspace(1)* %ptr 216 %ext = zext i32 %load to i96 217 ret i96 %ext 218} 219 220define i128 @zextload_global_i32_to_i128(i32 addrspace(1)* %ptr) { 221; GFX9-LABEL: zextload_global_i32_to_i128: 222; GFX9: ; %bb.0: 223; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 224; GFX9-NEXT: global_load_dword v0, v[0:1], off 225; GFX9-NEXT: v_mov_b32_e32 v1, 0 226; GFX9-NEXT: v_mov_b32_e32 v2, 0 227; GFX9-NEXT: v_mov_b32_e32 v3, 0 228; GFX9-NEXT: s_waitcnt vmcnt(0) 229; GFX9-NEXT: s_setpc_b64 s[30:31] 230; 231; GFX8-LABEL: zextload_global_i32_to_i128: 232; GFX8: ; %bb.0: 233; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 234; GFX8-NEXT: flat_load_dword v0, v[0:1] 235; GFX8-NEXT: v_mov_b32_e32 v1, 0 236; GFX8-NEXT: v_mov_b32_e32 v2, 0 237; GFX8-NEXT: v_mov_b32_e32 v3, 0 238; GFX8-NEXT: s_waitcnt vmcnt(0) 239; GFX8-NEXT: s_setpc_b64 s[30:31] 240; 241; GFX6-LABEL: zextload_global_i32_to_i128: 242; GFX6: ; %bb.0: 243; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 244; GFX6-NEXT: s_mov_b32 s6, 0 245; GFX6-NEXT: s_mov_b32 s7, 0xf000 246; GFX6-NEXT: s_mov_b64 s[4:5], 0 247; GFX6-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 248; GFX6-NEXT: v_mov_b32_e32 v1, 0 249; GFX6-NEXT: v_mov_b32_e32 v2, 0 250; GFX6-NEXT: v_mov_b32_e32 v3, 0 251; GFX6-NEXT: s_waitcnt vmcnt(0) 252; GFX6-NEXT: s_setpc_b64 s[30:31] 253; 254; GFX10-LABEL: zextload_global_i32_to_i128: 255; GFX10: ; %bb.0: 256; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 257; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 258; GFX10-NEXT: global_load_dword v0, v[0:1], off 259; GFX10-NEXT: v_mov_b32_e32 v1, 0 260; GFX10-NEXT: v_mov_b32_e32 v2, 0 261; GFX10-NEXT: v_mov_b32_e32 v3, 0 262; GFX10-NEXT: s_waitcnt vmcnt(0) 263; GFX10-NEXT: s_setpc_b64 s[30:31] 264 %load = load i32, i32 addrspace(1)* %ptr 265 %ext = zext i32 %load to i128 266 ret i128 %ext 267} 268