1; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 3; RUN: llc -march=r600 -mcpu=cypress < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4 5; FUNC-LABEL: {{^}}zextload_global_i8_to_i32: 6; SI: buffer_load_ubyte 7; SI: buffer_store_dword 8; SI: s_endpgm 9define void @zextload_global_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 10 %a = load i8, i8 addrspace(1)* %in 11 %ext = zext i8 %a to i32 12 store i32 %ext, i32 addrspace(1)* %out 13 ret void 14} 15 16; FUNC-LABEL: {{^}}sextload_global_i8_to_i32: 17; SI: buffer_load_sbyte 18; SI: buffer_store_dword 19; SI: s_endpgm 20define void @sextload_global_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 21 %a = load i8, i8 addrspace(1)* %in 22 %ext = sext i8 %a to i32 23 store i32 %ext, i32 addrspace(1)* %out 24 ret void 25} 26 27; FUNC-LABEL: {{^}}zextload_global_v1i8_to_v1i32: 28; SI: s_endpgm 29define void @zextload_global_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind { 30 %load = load <1 x i8>, <1 x i8> addrspace(1)* %in 31 %ext = zext <1 x i8> %load to <1 x i32> 32 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 33 ret void 34} 35 36; FUNC-LABEL: {{^}}sextload_global_v1i8_to_v1i32: 37; SI: s_endpgm 38define void @sextload_global_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind { 39 %load = load <1 x i8>, <1 x i8> addrspace(1)* %in 40 %ext = sext <1 x i8> %load to <1 x i32> 41 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 42 ret void 43} 44 45; FUNC-LABEL: {{^}}zextload_global_v2i8_to_v2i32: 46; SI: s_endpgm 47define void @zextload_global_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind { 48 %load = load <2 x i8>, <2 x i8> addrspace(1)* %in 49 %ext = zext <2 x i8> %load to <2 x i32> 50 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 51 ret void 52} 53 54; FUNC-LABEL: {{^}}sextload_global_v2i8_to_v2i32: 55; SI: s_endpgm 56define void @sextload_global_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind { 57 %load = load <2 x i8>, <2 x i8> addrspace(1)* %in 58 %ext = sext <2 x i8> %load to <2 x i32> 59 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 60 ret void 61} 62 63; FUNC-LABEL: {{^}}zextload_global_v4i8_to_v4i32: 64; SI: s_endpgm 65define void @zextload_global_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind { 66 %load = load <4 x i8>, <4 x i8> addrspace(1)* %in 67 %ext = zext <4 x i8> %load to <4 x i32> 68 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 69 ret void 70} 71 72; FUNC-LABEL: {{^}}sextload_global_v4i8_to_v4i32: 73; SI: s_endpgm 74define void @sextload_global_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind { 75 %load = load <4 x i8>, <4 x i8> addrspace(1)* %in 76 %ext = sext <4 x i8> %load to <4 x i32> 77 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 78 ret void 79} 80 81; FUNC-LABEL: {{^}}zextload_global_v8i8_to_v8i32: 82; SI: s_endpgm 83define void @zextload_global_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind { 84 %load = load <8 x i8>, <8 x i8> addrspace(1)* %in 85 %ext = zext <8 x i8> %load to <8 x i32> 86 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 87 ret void 88} 89 90; FUNC-LABEL: {{^}}sextload_global_v8i8_to_v8i32: 91; SI: s_endpgm 92define void @sextload_global_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind { 93 %load = load <8 x i8>, <8 x i8> addrspace(1)* %in 94 %ext = sext <8 x i8> %load to <8 x i32> 95 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 96 ret void 97} 98 99; FUNC-LABEL: {{^}}zextload_global_v16i8_to_v16i32: 100; SI: s_endpgm 101define void @zextload_global_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind { 102 %load = load <16 x i8>, <16 x i8> addrspace(1)* %in 103 %ext = zext <16 x i8> %load to <16 x i32> 104 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 105 ret void 106} 107 108; FUNC-LABEL: {{^}}sextload_global_v16i8_to_v16i32: 109; SI: s_endpgm 110define void @sextload_global_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind { 111 %load = load <16 x i8>, <16 x i8> addrspace(1)* %in 112 %ext = sext <16 x i8> %load to <16 x i32> 113 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 114 ret void 115} 116 117; XFUNC-LABEL: {{^}}zextload_global_v32i8_to_v32i32: 118; XSI: s_endpgm 119; define void @zextload_global_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind { 120; %load = load <32 x i8>, <32 x i8> addrspace(1)* %in 121; %ext = zext <32 x i8> %load to <32 x i32> 122; store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 123; ret void 124; } 125 126; XFUNC-LABEL: {{^}}sextload_global_v32i8_to_v32i32: 127; XSI: s_endpgm 128; define void @sextload_global_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind { 129; %load = load <32 x i8>, <32 x i8> addrspace(1)* %in 130; %ext = sext <32 x i8> %load to <32 x i32> 131; store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 132; ret void 133; } 134 135; XFUNC-LABEL: {{^}}zextload_global_v64i8_to_v64i32: 136; XSI: s_endpgm 137; define void @zextload_global_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind { 138; %load = load <64 x i8>, <64 x i8> addrspace(1)* %in 139; %ext = zext <64 x i8> %load to <64 x i32> 140; store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 141; ret void 142; } 143 144; XFUNC-LABEL: {{^}}sextload_global_v64i8_to_v64i32: 145; XSI: s_endpgm 146; define void @sextload_global_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind { 147; %load = load <64 x i8>, <64 x i8> addrspace(1)* %in 148; %ext = sext <64 x i8> %load to <64 x i32> 149; store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 150; ret void 151; } 152 153; FUNC-LABEL: {{^}}zextload_global_i8_to_i64: 154; SI: buffer_load_ubyte v[[LO:[0-9]+]], 155; SI: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}} 156; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]] 157define void @zextload_global_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 158 %a = load i8, i8 addrspace(1)* %in 159 %ext = zext i8 %a to i64 160 store i64 %ext, i64 addrspace(1)* %out 161 ret void 162} 163 164; FUNC-LABEL: {{^}}sextload_global_i8_to_i64: 165; SI: buffer_load_sbyte [[LOAD:v[0-9]+]], 166; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, [[LOAD]] 167; SI: buffer_store_dwordx2 168define void @sextload_global_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 169 %a = load i8, i8 addrspace(1)* %in 170 %ext = sext i8 %a to i64 171 store i64 %ext, i64 addrspace(1)* %out 172 ret void 173} 174 175; FUNC-LABEL: {{^}}zextload_global_v1i8_to_v1i64: 176; SI: s_endpgm 177define void @zextload_global_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind { 178 %load = load <1 x i8>, <1 x i8> addrspace(1)* %in 179 %ext = zext <1 x i8> %load to <1 x i64> 180 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 181 ret void 182} 183 184; FUNC-LABEL: {{^}}sextload_global_v1i8_to_v1i64: 185; SI: s_endpgm 186define void @sextload_global_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind { 187 %load = load <1 x i8>, <1 x i8> addrspace(1)* %in 188 %ext = sext <1 x i8> %load to <1 x i64> 189 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 190 ret void 191} 192 193; FUNC-LABEL: {{^}}zextload_global_v2i8_to_v2i64: 194; SI: s_endpgm 195define void @zextload_global_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind { 196 %load = load <2 x i8>, <2 x i8> addrspace(1)* %in 197 %ext = zext <2 x i8> %load to <2 x i64> 198 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 199 ret void 200} 201 202; FUNC-LABEL: {{^}}sextload_global_v2i8_to_v2i64: 203; SI: s_endpgm 204define void @sextload_global_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind { 205 %load = load <2 x i8>, <2 x i8> addrspace(1)* %in 206 %ext = sext <2 x i8> %load to <2 x i64> 207 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 208 ret void 209} 210 211; FUNC-LABEL: {{^}}zextload_global_v4i8_to_v4i64: 212; SI: s_endpgm 213define void @zextload_global_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind { 214 %load = load <4 x i8>, <4 x i8> addrspace(1)* %in 215 %ext = zext <4 x i8> %load to <4 x i64> 216 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 217 ret void 218} 219 220; FUNC-LABEL: {{^}}sextload_global_v4i8_to_v4i64: 221; SI: s_endpgm 222define void @sextload_global_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind { 223 %load = load <4 x i8>, <4 x i8> addrspace(1)* %in 224 %ext = sext <4 x i8> %load to <4 x i64> 225 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 226 ret void 227} 228 229; FUNC-LABEL: {{^}}zextload_global_v8i8_to_v8i64: 230; SI: s_endpgm 231define void @zextload_global_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind { 232 %load = load <8 x i8>, <8 x i8> addrspace(1)* %in 233 %ext = zext <8 x i8> %load to <8 x i64> 234 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 235 ret void 236} 237 238; FUNC-LABEL: {{^}}sextload_global_v8i8_to_v8i64: 239; SI: s_endpgm 240define void @sextload_global_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind { 241 %load = load <8 x i8>, <8 x i8> addrspace(1)* %in 242 %ext = sext <8 x i8> %load to <8 x i64> 243 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 244 ret void 245} 246 247; FUNC-LABEL: {{^}}zextload_global_v16i8_to_v16i64: 248; SI: s_endpgm 249define void @zextload_global_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind { 250 %load = load <16 x i8>, <16 x i8> addrspace(1)* %in 251 %ext = zext <16 x i8> %load to <16 x i64> 252 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 253 ret void 254} 255 256; FUNC-LABEL: {{^}}sextload_global_v16i8_to_v16i64: 257; SI: s_endpgm 258define void @sextload_global_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind { 259 %load = load <16 x i8>, <16 x i8> addrspace(1)* %in 260 %ext = sext <16 x i8> %load to <16 x i64> 261 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 262 ret void 263} 264 265; XFUNC-LABEL: {{^}}zextload_global_v32i8_to_v32i64: 266; XSI: s_endpgm 267; define void @zextload_global_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind { 268; %load = load <32 x i8>, <32 x i8> addrspace(1)* %in 269; %ext = zext <32 x i8> %load to <32 x i64> 270; store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 271; ret void 272; } 273 274; XFUNC-LABEL: {{^}}sextload_global_v32i8_to_v32i64: 275; XSI: s_endpgm 276; define void @sextload_global_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind { 277; %load = load <32 x i8>, <32 x i8> addrspace(1)* %in 278; %ext = sext <32 x i8> %load to <32 x i64> 279; store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 280; ret void 281; } 282 283; XFUNC-LABEL: {{^}}zextload_global_v64i8_to_v64i64: 284; XSI: s_endpgm 285; define void @zextload_global_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind { 286; %load = load <64 x i8>, <64 x i8> addrspace(1)* %in 287; %ext = zext <64 x i8> %load to <64 x i64> 288; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 289; ret void 290; } 291 292; XFUNC-LABEL: {{^}}sextload_global_v64i8_to_v64i64: 293; XSI: s_endpgm 294; define void @sextload_global_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind { 295; %load = load <64 x i8>, <64 x i8> addrspace(1)* %in 296; %ext = sext <64 x i8> %load to <64 x i64> 297; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 298; ret void 299; } 300