1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s 2; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-HSA -check-prefix=FUNC %s 3; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s 4; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 5 6 7; FUNC-LABEL: {{^}}constant_load_i8: 8; GCN-NOHSA: buffer_load_ubyte v{{[0-9]+}} 9; GCN-HSA: flat_load_ubyte 10 11; EG: VTX_READ_8 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0 12define void @constant_load_i8(i8 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 13entry: 14 %ld = load i8, i8 addrspace(2)* %in 15 store i8 %ld, i8 addrspace(1)* %out 16 ret void 17} 18 19; FUNC-LABEL: {{^}}constant_load_v2i8: 20; GCN-NOHSA: buffer_load_ushort v 21; GCN-HSA: flat_load_ushort v 22 23; EG: VTX_READ_16 24define void @constant_load_v2i8(<2 x i8> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 25entry: 26 %ld = load <2 x i8>, <2 x i8> addrspace(2)* %in 27 store <2 x i8> %ld, <2 x i8> addrspace(1)* %out 28 ret void 29} 30 31; FUNC-LABEL: {{^}}constant_load_v3i8: 32; GCN: s_load_dword s 33 34; EG-DAG: VTX_READ_32 35define void @constant_load_v3i8(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 { 36entry: 37 %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in 38 store <3 x i8> %ld, <3 x i8> addrspace(1)* %out 39 ret void 40} 41 42; FUNC-LABEL: {{^}}constant_load_v4i8: 43; GCN: s_load_dword s 44 45; EG: VTX_READ_32 46define void @constant_load_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 47entry: 48 %ld = load <4 x i8>, <4 x i8> addrspace(2)* %in 49 store <4 x i8> %ld, <4 x i8> addrspace(1)* %out 50 ret void 51} 52 53; FUNC-LABEL: {{^}}constant_load_v8i8: 54; GCN: s_load_dwordx2 55 56; EG: VTX_READ_64 57define void @constant_load_v8i8(<8 x i8> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 58entry: 59 %ld = load <8 x i8>, <8 x i8> addrspace(2)* %in 60 store <8 x i8> %ld, <8 x i8> addrspace(1)* %out 61 ret void 62} 63 64; FUNC-LABEL: {{^}}constant_load_v16i8: 65; GCN: s_load_dwordx4 66 67; EG: VTX_READ_128 68define void @constant_load_v16i8(<16 x i8> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 69entry: 70 %ld = load <16 x i8>, <16 x i8> addrspace(2)* %in 71 store <16 x i8> %ld, <16 x i8> addrspace(1)* %out 72 ret void 73} 74 75; FUNC-LABEL: {{^}}constant_zextload_i8_to_i32: 76; GCN-NOHSA: buffer_load_ubyte v{{[0-9]+}}, 77; GCN-HSA: flat_load_ubyte 78 79; EG: VTX_READ_8 T{{[0-9]+\.X, T[0-9]+\.X}} 80define void @constant_zextload_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 81 %a = load i8, i8 addrspace(2)* %in 82 %ext = zext i8 %a to i32 83 store i32 %ext, i32 addrspace(1)* %out 84 ret void 85} 86 87; FUNC-LABEL: {{^}}constant_sextload_i8_to_i32: 88; GCN-NOHSA: buffer_load_sbyte 89; GCN-HSA: flat_load_sbyte 90 91; EG: VTX_READ_8 [[DST:T[0-9]\.[XYZW]]], [[DST]] 92; EG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST]], 0.0, literal 93; EG: 8 94define void @constant_sextload_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 95 %ld = load i8, i8 addrspace(2)* %in 96 %ext = sext i8 %ld to i32 97 store i32 %ext, i32 addrspace(1)* %out 98 ret void 99} 100 101; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i32: 102define void @constant_zextload_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 103 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 104 %ext = zext <1 x i8> %load to <1 x i32> 105 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 106 ret void 107} 108 109; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i32: 110define void @constant_sextload_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 111 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 112 %ext = sext <1 x i8> %load to <1 x i32> 113 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 114 ret void 115} 116 117; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i32: 118; GCN-NOHSA: buffer_load_ubyte 119; GCN-NOHSA: buffer_load_ubyte 120; GCN-HSA: flat_load_ubyte 121; GCN-HSA: flat_load_ubyte 122; EG: VTX_READ_8 123; EG: VTX_READ_8 124define void @constant_zextload_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 125 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 126 %ext = zext <2 x i8> %load to <2 x i32> 127 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 128 ret void 129} 130 131; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i32: 132; GCN-NOHSA: buffer_load_sbyte 133; GCN-NOHSA: buffer_load_sbyte 134; GCN-HSA: flat_load_sbyte 135; GCN-HSA: flat_load_sbyte 136 137; EG-DAG: VTX_READ_8 [[DST_X:T[0-9]\.[XYZW]]], [[DST_X]] 138; EG-DAG: VTX_READ_8 [[DST_Y:T[0-9]\.[XYZW]]], [[DST_Y]] 139; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_X]], 0.0, literal 140; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Y]], 0.0, literal 141; EG-DAG: 8 142; EG-DAG: 8 143define void @constant_sextload_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 144 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 145 %ext = sext <2 x i8> %load to <2 x i32> 146 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 147 ret void 148} 149 150; FUNC-LABEL: {{^}}constant_zextload_v3i8_to_v3i32: 151; GCN: s_load_dword s 152 153; GCN-DAG: s_bfe_u32 154; GCN-DAG: s_bfe_u32 155; GCN-DAG: s_and_b32 156define void @constant_zextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 { 157entry: 158 %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in 159 %ext = zext <3 x i8> %ld to <3 x i32> 160 store <3 x i32> %ext, <3 x i32> addrspace(1)* %out 161 ret void 162} 163 164; FUNC-LABEL: {{^}}constant_sextload_v3i8_to_v3i32: 165; GCN: s_load_dword s 166 167; GCN-DAG: s_bfe_i32 168; GCN-DAG: s_bfe_i32 169; GCN-DAG: s_bfe_i32 170define void @constant_sextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 { 171entry: 172 %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in 173 %ext = sext <3 x i8> %ld to <3 x i32> 174 store <3 x i32> %ext, <3 x i32> addrspace(1)* %out 175 ret void 176} 177 178; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i32: 179; GCN-NOHSA: buffer_load_ubyte 180; GCN-NOHSA: buffer_load_ubyte 181; GCN-NOHSA: buffer_load_ubyte 182; GCN-NOHSA: buffer_load_ubyte 183; GCN-HSA: flat_load_ubyte 184; GCN-HSA: flat_load_ubyte 185; GCN-HSA: flat_load_ubyte 186; GCN-HSA: flat_load_ubyte 187 188; EG: VTX_READ_8 189; EG: VTX_READ_8 190; EG: VTX_READ_8 191; EG: VTX_READ_8 192define void @constant_zextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 193 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 194 %ext = zext <4 x i8> %load to <4 x i32> 195 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 196 ret void 197} 198 199; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i32: 200; GCN-NOHSA: buffer_load_sbyte 201; GCN-NOHSA: buffer_load_sbyte 202; GCN-NOHSA: buffer_load_sbyte 203; GCN-NOHSA: buffer_load_sbyte 204; GCN-HSA: flat_load_sbyte 205; GCN-HSA: flat_load_sbyte 206; GCN-HSA: flat_load_sbyte 207; GCN-HSA: flat_load_sbyte 208 209; EG-DAG: VTX_READ_8 [[DST_X:T[0-9]\.[XYZW]]], [[DST_X]] 210; EG-DAG: VTX_READ_8 [[DST_Y:T[0-9]\.[XYZW]]], [[DST_Y]] 211; EG-DAG: VTX_READ_8 [[DST_Z:T[0-9]\.[XYZW]]], [[DST_Z]] 212; EG-DAG: VTX_READ_8 [[DST_W:T[0-9]\.[XYZW]]], [[DST_W]] 213; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_X]], 0.0, literal 214; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Y]], 0.0, literal 215; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Z]], 0.0, literal 216; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_W]], 0.0, literal 217; EG-DAG: 8 218; EG-DAG: 8 219; EG-DAG: 8 220; EG-DAG: 8 221define void @constant_sextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 222 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 223 %ext = sext <4 x i8> %load to <4 x i32> 224 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 225 ret void 226} 227 228; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i32: 229; GCN-NOHSA: buffer_load_ubyte 230; GCN-NOHSA: buffer_load_ubyte 231; GCN-NOHSA: buffer_load_ubyte 232; GCN-NOHSA: buffer_load_ubyte 233; GCN-NOHSA: buffer_load_ubyte 234; GCN-NOHSA: buffer_load_ubyte 235; GCN-NOHSA: buffer_load_ubyte 236; GCN-NOHSA: buffer_load_ubyte 237 238; GCN-HSA: flat_load_ubyte 239; GCN-HSA: flat_load_ubyte 240; GCN-HSA: flat_load_ubyte 241; GCN-HSA: flat_load_ubyte 242; GCN-HSA: flat_load_ubyte 243; GCN-HSA: flat_load_ubyte 244; GCN-HSA: flat_load_ubyte 245; GCN-HSA: flat_load_ubyte 246define void @constant_zextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 247 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 248 %ext = zext <8 x i8> %load to <8 x i32> 249 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 250 ret void 251} 252 253; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i32: 254; GCN-NOHSA: buffer_load_sbyte 255; GCN-NOHSA: buffer_load_sbyte 256; GCN-NOHSA: buffer_load_sbyte 257; GCN-NOHSA: buffer_load_sbyte 258; GCN-NOHSA: buffer_load_sbyte 259; GCN-NOHSA: buffer_load_sbyte 260; GCN-NOHSA: buffer_load_sbyte 261; GCN-NOHSA: buffer_load_sbyte 262 263; GCN-HSA: flat_load_sbyte 264; GCN-HSA: flat_load_sbyte 265; GCN-HSA: flat_load_sbyte 266; GCN-HSA: flat_load_sbyte 267; GCN-HSA: flat_load_sbyte 268; GCN-HSA: flat_load_sbyte 269; GCN-HSA: flat_load_sbyte 270; GCN-HSA: flat_load_sbyte 271define void @constant_sextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 272 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 273 %ext = sext <8 x i8> %load to <8 x i32> 274 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 275 ret void 276} 277 278; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i32: 279define void @constant_zextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 280 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 281 %ext = zext <16 x i8> %load to <16 x i32> 282 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 283 ret void 284} 285 286; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i32: 287define void @constant_sextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 288 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 289 %ext = sext <16 x i8> %load to <16 x i32> 290 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 291 ret void 292} 293 294; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i32: 295define void @constant_zextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 296 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 297 %ext = zext <32 x i8> %load to <32 x i32> 298 store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 299 ret void 300} 301 302; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i32: 303define void @constant_sextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 304 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 305 %ext = sext <32 x i8> %load to <32 x i32> 306 store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 307 ret void 308} 309 310; FUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i32: 311define void @constant_zextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 312 %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 313 %ext = zext <64 x i8> %load to <64 x i32> 314 store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 315 ret void 316} 317 318; FUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i32: 319define void @constant_sextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 320 %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 321 %ext = sext <64 x i8> %load to <64 x i32> 322 store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 323 ret void 324} 325 326; FUNC-LABEL: {{^}}constant_zextload_i8_to_i64: 327; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}} 328 329; GCN-NOHSA-DAG: buffer_load_ubyte v[[LO:[0-9]+]], 330; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]] 331 332; GCN-HSA-DAG: flat_load_ubyte v[[LO:[0-9]+]], 333; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]] 334define void @constant_zextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 335 %a = load i8, i8 addrspace(2)* %in 336 %ext = zext i8 %a to i64 337 store i64 %ext, i64 addrspace(1)* %out 338 ret void 339} 340 341; FUNC-LABEL: {{^}}constant_sextload_i8_to_i64: 342; GCN-NOHSA: buffer_load_sbyte v[[LO:[0-9]+]], 343; GCN-HSA: flat_load_sbyte v[[LO:[0-9]+]], 344; GCN: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 345 346; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}} 347; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]{{\]}} 348define void @constant_sextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 349 %a = load i8, i8 addrspace(2)* %in 350 %ext = sext i8 %a to i64 351 store i64 %ext, i64 addrspace(1)* %out 352 ret void 353} 354 355; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i64: 356define void @constant_zextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 357 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 358 %ext = zext <1 x i8> %load to <1 x i64> 359 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 360 ret void 361} 362 363; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i64: 364define void @constant_sextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 365 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 366 %ext = sext <1 x i8> %load to <1 x i64> 367 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 368 ret void 369} 370 371; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i64: 372define void @constant_zextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 373 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 374 %ext = zext <2 x i8> %load to <2 x i64> 375 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 376 ret void 377} 378 379; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i64: 380define void @constant_sextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 381 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 382 %ext = sext <2 x i8> %load to <2 x i64> 383 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 384 ret void 385} 386 387; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i64: 388define void @constant_zextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 389 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 390 %ext = zext <4 x i8> %load to <4 x i64> 391 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 392 ret void 393} 394 395; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i64: 396define void @constant_sextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 397 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 398 %ext = sext <4 x i8> %load to <4 x i64> 399 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 400 ret void 401} 402 403; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i64: 404define void @constant_zextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 405 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 406 %ext = zext <8 x i8> %load to <8 x i64> 407 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 408 ret void 409} 410 411; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i64: 412define void @constant_sextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 413 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 414 %ext = sext <8 x i8> %load to <8 x i64> 415 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 416 ret void 417} 418 419; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i64: 420define void @constant_zextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 421 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 422 %ext = zext <16 x i8> %load to <16 x i64> 423 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 424 ret void 425} 426 427; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i64: 428define void @constant_sextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 429 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 430 %ext = sext <16 x i8> %load to <16 x i64> 431 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 432 ret void 433} 434 435; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i64: 436define void @constant_zextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 437 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 438 %ext = zext <32 x i8> %load to <32 x i64> 439 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 440 ret void 441} 442 443; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i64: 444define void @constant_sextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 445 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 446 %ext = sext <32 x i8> %load to <32 x i64> 447 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 448 ret void 449} 450 451; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i64: 452; define void @constant_zextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 453; %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 454; %ext = zext <64 x i8> %load to <64 x i64> 455; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 456; ret void 457; } 458 459; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i64: 460; define void @constant_sextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 461; %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 462; %ext = sext <64 x i8> %load to <64 x i64> 463; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 464; ret void 465; } 466 467; FUNC-LABEL: {{^}}constant_zextload_i8_to_i16: 468; GCN-NOHSA: buffer_load_ubyte v[[VAL:[0-9]+]], 469; GCN-NOHSA: buffer_store_short v[[VAL]] 470 471; GCN-HSA: flat_load_ubyte v[[VAL:[0-9]+]], 472; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]] 473define void @constant_zextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 474 %a = load i8, i8 addrspace(2)* %in 475 %ext = zext i8 %a to i16 476 store i16 %ext, i16 addrspace(1)* %out 477 ret void 478} 479 480; FUNC-LABEL: {{^}}constant_sextload_i8_to_i16: 481; GCN-NOHSA: buffer_load_sbyte v[[VAL:[0-9]+]], 482; GCN-HSA: flat_load_sbyte v[[VAL:[0-9]+]], 483 484; GCN-NOHSA: buffer_store_short v[[VAL]] 485; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]] 486define void @constant_sextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 { 487 %a = load i8, i8 addrspace(2)* %in 488 %ext = sext i8 %a to i16 489 store i16 %ext, i16 addrspace(1)* %out 490 ret void 491} 492 493; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i16: 494define void @constant_zextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 495 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 496 %ext = zext <1 x i8> %load to <1 x i16> 497 store <1 x i16> %ext, <1 x i16> addrspace(1)* %out 498 ret void 499} 500 501; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i16: 502define void @constant_sextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 { 503 %load = load <1 x i8>, <1 x i8> addrspace(2)* %in 504 %ext = sext <1 x i8> %load to <1 x i16> 505 store <1 x i16> %ext, <1 x i16> addrspace(1)* %out 506 ret void 507} 508 509; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i16: 510define void @constant_zextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 511 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 512 %ext = zext <2 x i8> %load to <2 x i16> 513 store <2 x i16> %ext, <2 x i16> addrspace(1)* %out 514 ret void 515} 516 517; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i16: 518define void @constant_sextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 { 519 %load = load <2 x i8>, <2 x i8> addrspace(2)* %in 520 %ext = sext <2 x i8> %load to <2 x i16> 521 store <2 x i16> %ext, <2 x i16> addrspace(1)* %out 522 ret void 523} 524 525; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i16: 526define void @constant_zextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 527 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 528 %ext = zext <4 x i8> %load to <4 x i16> 529 store <4 x i16> %ext, <4 x i16> addrspace(1)* %out 530 ret void 531} 532 533; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i16: 534define void @constant_sextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 { 535 %load = load <4 x i8>, <4 x i8> addrspace(2)* %in 536 %ext = sext <4 x i8> %load to <4 x i16> 537 store <4 x i16> %ext, <4 x i16> addrspace(1)* %out 538 ret void 539} 540 541; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i16: 542define void @constant_zextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 543 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 544 %ext = zext <8 x i8> %load to <8 x i16> 545 store <8 x i16> %ext, <8 x i16> addrspace(1)* %out 546 ret void 547} 548 549; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i16: 550define void @constant_sextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 { 551 %load = load <8 x i8>, <8 x i8> addrspace(2)* %in 552 %ext = sext <8 x i8> %load to <8 x i16> 553 store <8 x i16> %ext, <8 x i16> addrspace(1)* %out 554 ret void 555} 556 557; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i16: 558define void @constant_zextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 559 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 560 %ext = zext <16 x i8> %load to <16 x i16> 561 store <16 x i16> %ext, <16 x i16> addrspace(1)* %out 562 ret void 563} 564 565; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i16: 566define void @constant_sextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 { 567 %load = load <16 x i8>, <16 x i8> addrspace(2)* %in 568 %ext = sext <16 x i8> %load to <16 x i16> 569 store <16 x i16> %ext, <16 x i16> addrspace(1)* %out 570 ret void 571} 572 573; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i16: 574define void @constant_zextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 575 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 576 %ext = zext <32 x i8> %load to <32 x i16> 577 store <32 x i16> %ext, <32 x i16> addrspace(1)* %out 578 ret void 579} 580 581; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i16: 582define void @constant_sextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 { 583 %load = load <32 x i8>, <32 x i8> addrspace(2)* %in 584 %ext = sext <32 x i8> %load to <32 x i16> 585 store <32 x i16> %ext, <32 x i16> addrspace(1)* %out 586 ret void 587} 588 589; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i16: 590; define void @constant_zextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 591; %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 592; %ext = zext <64 x i8> %load to <64 x i16> 593; store <64 x i16> %ext, <64 x i16> addrspace(1)* %out 594; ret void 595; } 596 597; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i16: 598; define void @constant_sextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 { 599; %load = load <64 x i8>, <64 x i8> addrspace(2)* %in 600; %ext = sext <64 x i8> %load to <64 x i16> 601; store <64 x i16> %ext, <64 x i16> addrspace(1)* %out 602; ret void 603; } 604 605attributes #0 = { nounwind } 606