1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s 2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s 3 ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4 5 6 ; FUNC-LABEL: {{^}}local_load_i8: 7 ; GCN-NOT: s_wqm_b64 8 ; GCN: s_mov_b32 m0 9 ; GCN: ds_read_u8 10 11 ; EG: LDS_UBYTE_READ_RET 12 define void @local_load_i8(i8 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 13 entry: 14 %ld = load i8, i8 addrspace(3)* %in 15 store i8 %ld, i8 addrspace(3)* %out 16 ret void 17 } 18 19 ; FUNC-LABEL: {{^}}local_load_v2i8: 20 ; GCN-NOT: s_wqm_b64 21 ; GCN: s_mov_b32 m0 22 ; GCN: ds_read_u16 23 24 ; EG: LDS_USHORT_READ_RET 25 define void @local_load_v2i8(<2 x i8> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 26 entry: 27 %ld = load <2 x i8>, <2 x i8> addrspace(3)* %in 28 store <2 x i8> %ld, <2 x i8> addrspace(3)* %out 29 ret void 30 } 31 32 ; FUNC-LABEL: {{^}}local_load_v3i8: 33 ; GCN: ds_read_b32 34 35 ; EG: DS_READ_RET 36 define void @local_load_v3i8(<3 x i8> addrspace(3)* %out, <3 x i8> addrspace(3)* %in) #0 { 37 entry: 38 %ld = load <3 x i8>, <3 x i8> addrspace(3)* %in 39 store <3 x i8> %ld, <3 x i8> addrspace(3)* %out 40 ret void 41 } 42 43 ; FUNC-LABEL: {{^}}local_load_v4i8: 44 ; GCN: ds_read_b32 45 46 ; EG: LDS_READ_RET 47 define void @local_load_v4i8(<4 x i8> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 48 entry: 49 %ld = load <4 x i8>, <4 x i8> addrspace(3)* %in 50 store <4 x i8> %ld, <4 x i8> addrspace(3)* %out 51 ret void 52 } 53 54 ; FUNC-LABEL: {{^}}local_load_v8i8: 55 ; GCN: ds_read_b64 56 57 ; EG: LDS_READ_RET 58 ; EG: LDS_READ_RET 59 define void @local_load_v8i8(<8 x i8> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 60 entry: 61 %ld = load <8 x i8>, <8 x i8> addrspace(3)* %in 62 store <8 x i8> %ld, <8 x i8> addrspace(3)* %out 63 ret void 64 } 65 66 ; FUNC-LABEL: {{^}}local_load_v16i8: 67 ; GCN: ds_read2_b64 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}, v{{[0-9]+}} offset0:1{{$}} 68 ; GCN: ds_write2_b64 v{{[0-9]+}}, v{{\[}}[[LO]]:{{[0-9]+}}], v[{{[0-9]+}}:[[HI]]{{\]}} offset0:1{{$}} 69 70 ; EG: LDS_READ_RET 71 ; EG: LDS_READ_RET 72 ; EG: LDS_READ_RET 73 ; EG: LDS_READ_RET 74 define void @local_load_v16i8(<16 x i8> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 75 entry: 76 %ld = load <16 x i8>, <16 x i8> addrspace(3)* %in 77 store <16 x i8> %ld, <16 x i8> addrspace(3)* %out 78 ret void 79 } 80 81 ; FUNC-LABEL: {{^}}local_zextload_i8_to_i32: 82 ; GCN-NOT: s_wqm_b64 83 ; GCN: s_mov_b32 m0 84 ; GCN: ds_read_u8 85 86 ; EG: LDS_UBYTE_READ_RET 87 define void @local_zextload_i8_to_i32(i32 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 88 %a = load i8, i8 addrspace(3)* %in 89 %ext = zext i8 %a to i32 90 store i32 %ext, i32 addrspace(3)* %out 91 ret void 92 } 93 94 ; FUNC-LABEL: {{^}}local_sextload_i8_to_i32: 95 ; GCN-NOT: s_wqm_b64 96 ; GCN: s_mov_b32 m0 97 ; GCN: ds_read_i8 98 99 ; EG: LDS_UBYTE_READ_RET 100 ; EG: BFE_INT 101 define void @local_sextload_i8_to_i32(i32 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 102 %ld = load i8, i8 addrspace(3)* %in 103 %ext = sext i8 %ld to i32 104 store i32 %ext, i32 addrspace(3)* %out 105 ret void 106 } 107 108 ; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i32: 109 define void @local_zextload_v1i8_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 110 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 111 %ext = zext <1 x i8> %load to <1 x i32> 112 store <1 x i32> %ext, <1 x i32> addrspace(3)* %out 113 ret void 114 } 115 116 ; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i32: 117 define void @local_sextload_v1i8_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 118 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 119 %ext = sext <1 x i8> %load to <1 x i32> 120 store <1 x i32> %ext, <1 x i32> addrspace(3)* %out 121 ret void 122 } 123 124 ; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i32: 125 ; GCN: ds_read_u16 126 127 ; EG: LDS_UBYTE_READ_RET 128 ; EG: LDS_UBYTE_READ_RET 129 define void @local_zextload_v2i8_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 130 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 131 %ext = zext <2 x i8> %load to <2 x i32> 132 store <2 x i32> %ext, <2 x i32> addrspace(3)* %out 133 ret void 134 } 135 136 ; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i32: 137 ; GCN-NOT: s_wqm_b64 138 ; GCN: s_mov_b32 m0 139 ; GCN: ds_read_u16 140 ; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 8, 8 141 ; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 8 142 143 ; EG-DAG: LDS_UBYTE_READ_RET 144 ; EG-DAG: LDS_UBYTE_READ_RET 145 ; EG-DAG: BFE_INT 146 ; EG-DAG: BFE_INT 147 define void @local_sextload_v2i8_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 148 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 149 %ext = sext <2 x i8> %load to <2 x i32> 150 store <2 x i32> %ext, <2 x i32> addrspace(3)* %out 151 ret void 152 } 153 154 ; FUNC-LABEL: {{^}}local_zextload_v3i8_to_v3i32: 155 ; GCN: ds_read_b32 156 157 ; GCN-DAG: v_bfe_u32 v{{[0-9]+}}, v{{[0-9]+}}, 8, 8 158 ; GCN-DAG: v_bfe_u32 v{{[0-9]+}}, v{{[0-9]+}}, 16, 8 159 ; GCN-DAG: v_and_b32_e32 v{{[0-9]+}}, 0xff, 160 define void @local_zextload_v3i8_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i8> addrspace(3)* %in) #0 { 161 entry: 162 %ld = load <3 x i8>, <3 x i8> addrspace(3)* %in 163 %ext = zext <3 x i8> %ld to <3 x i32> 164 store <3 x i32> %ext, <3 x i32> addrspace(3)* %out 165 ret void 166 } 167 168 ; FUNC-LABEL: {{^}}local_sextload_v3i8_to_v3i32: 169 ; GCN-NOT: s_wqm_b64 170 ; GCN: s_mov_b32 m0 171 ; GCN: ds_read_b32 172 173 ; GCN-DAG: v_bfe_i32 174 ; GCN-DAG: v_bfe_i32 175 ; GCN-DAG: v_bfe_i32 176 ; GCN-DAG: v_bfe_i32 177 178 ; GCN-DAG: ds_write_b64 179 ; GCN-DAG: ds_write_b32 180 181 define void @local_sextload_v3i8_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i8> addrspace(3)* %in) #0 { 182 entry: 183 %ld = load <3 x i8>, <3 x i8> addrspace(3)* %in 184 %ext = sext <3 x i8> %ld to <3 x i32> 185 store <3 x i32> %ext, <3 x i32> addrspace(3)* %out 186 ret void 187 } 188 189 ; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i32: 190 ; GCN-NOT: s_wqm_b64 191 ; GCN: s_mov_b32 m0 192 ; GCN: ds_read_b32 193 194 ; EG: LDS_UBYTE_READ_RET 195 ; EG: LDS_UBYTE_READ_RET 196 ; EG: LDS_UBYTE_READ_RET 197 ; EG: LDS_UBYTE_READ_RET 198 define void @local_zextload_v4i8_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 199 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 200 %ext = zext <4 x i8> %load to <4 x i32> 201 store <4 x i32> %ext, <4 x i32> addrspace(3)* %out 202 ret void 203 } 204 205 ; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i32: 206 ; GCN-NOT: s_wqm_b64 207 ; GCN: s_mov_b32 m0 208 ; GCN: ds_read_b32 209 210 ; EG-DAG: LDS_UBYTE_READ_RET 211 ; EG-DAG: LDS_UBYTE_READ_RET 212 ; EG-DAG: LDS_UBYTE_READ_RET 213 ; EG-DAG: LDS_UBYTE_READ_RET 214 ; EG-DAG: BFE_INT 215 ; EG-DAG: BFE_INT 216 ; EG-DAG: BFE_INT 217 ; EG-DAG: BFE_INT 218 define void @local_sextload_v4i8_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 219 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 220 %ext = sext <4 x i8> %load to <4 x i32> 221 store <4 x i32> %ext, <4 x i32> addrspace(3)* %out 222 ret void 223 } 224 225 ; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i32: 226 define void @local_zextload_v8i8_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 227 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 228 %ext = zext <8 x i8> %load to <8 x i32> 229 store <8 x i32> %ext, <8 x i32> addrspace(3)* %out 230 ret void 231 } 232 233 ; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i32: 234 define void @local_sextload_v8i8_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 235 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 236 %ext = sext <8 x i8> %load to <8 x i32> 237 store <8 x i32> %ext, <8 x i32> addrspace(3)* %out 238 ret void 239 } 240 241 ; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i32: 242 define void @local_zextload_v16i8_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 243 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 244 %ext = zext <16 x i8> %load to <16 x i32> 245 store <16 x i32> %ext, <16 x i32> addrspace(3)* %out 246 ret void 247 } 248 249 ; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i32: 250 define void @local_sextload_v16i8_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 251 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 252 %ext = sext <16 x i8> %load to <16 x i32> 253 store <16 x i32> %ext, <16 x i32> addrspace(3)* %out 254 ret void 255 } 256 257 ; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i32: 258 define void @local_zextload_v32i8_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 259 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 260 %ext = zext <32 x i8> %load to <32 x i32> 261 store <32 x i32> %ext, <32 x i32> addrspace(3)* %out 262 ret void 263 } 264 265 ; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i32: 266 define void @local_sextload_v32i8_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 267 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 268 %ext = sext <32 x i8> %load to <32 x i32> 269 store <32 x i32> %ext, <32 x i32> addrspace(3)* %out 270 ret void 271 } 272 273 ; FUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i32: 274 define void @local_zextload_v64i8_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 275 %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 276 %ext = zext <64 x i8> %load to <64 x i32> 277 store <64 x i32> %ext, <64 x i32> addrspace(3)* %out 278 ret void 279 } 280 281 ; FUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i32: 282 define void @local_sextload_v64i8_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 283 %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 284 %ext = sext <64 x i8> %load to <64 x i32> 285 store <64 x i32> %ext, <64 x i32> addrspace(3)* %out 286 ret void 287 } 288 289 ; FUNC-LABEL: {{^}}local_zextload_i8_to_i64: 290 ; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}} 291 ; GCN-DAG: ds_read_u8 v[[LO:[0-9]+]], 292 ; GCN: ds_write_b64 v{{[0-9]+}}, v{{\[}}[[LO]]:[[HI]]] 293 define void @local_zextload_i8_to_i64(i64 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 294 %a = load i8, i8 addrspace(3)* %in 295 %ext = zext i8 %a to i64 296 store i64 %ext, i64 addrspace(3)* %out 297 ret void 298 } 299 300 ; FUNC-LABEL: {{^}}local_sextload_i8_to_i64: 301 ; GCN: ds_read_i8 v[[LO:[0-9]+]], 302 ; GCN: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 303 304 ; GCN: ds_write_b64 v{{[0-9]+}}, v{{\[}}[[LO]]:[[HI]]{{\]}} 305 define void @local_sextload_i8_to_i64(i64 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 306 %a = load i8, i8 addrspace(3)* %in 307 %ext = sext i8 %a to i64 308 store i64 %ext, i64 addrspace(3)* %out 309 ret void 310 } 311 312 ; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i64: 313 define void @local_zextload_v1i8_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 314 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 315 %ext = zext <1 x i8> %load to <1 x i64> 316 store <1 x i64> %ext, <1 x i64> addrspace(3)* %out 317 ret void 318 } 319 320 ; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i64: 321 define void @local_sextload_v1i8_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 322 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 323 %ext = sext <1 x i8> %load to <1 x i64> 324 store <1 x i64> %ext, <1 x i64> addrspace(3)* %out 325 ret void 326 } 327 328 ; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i64: 329 define void @local_zextload_v2i8_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 330 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 331 %ext = zext <2 x i8> %load to <2 x i64> 332 store <2 x i64> %ext, <2 x i64> addrspace(3)* %out 333 ret void 334 } 335 336 ; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i64: 337 define void @local_sextload_v2i8_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 338 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 339 %ext = sext <2 x i8> %load to <2 x i64> 340 store <2 x i64> %ext, <2 x i64> addrspace(3)* %out 341 ret void 342 } 343 344 ; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i64: 345 define void @local_zextload_v4i8_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 346 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 347 %ext = zext <4 x i8> %load to <4 x i64> 348 store <4 x i64> %ext, <4 x i64> addrspace(3)* %out 349 ret void 350 } 351 352 ; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i64: 353 define void @local_sextload_v4i8_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 354 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 355 %ext = sext <4 x i8> %load to <4 x i64> 356 store <4 x i64> %ext, <4 x i64> addrspace(3)* %out 357 ret void 358 } 359 360 ; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i64: 361 define void @local_zextload_v8i8_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 362 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 363 %ext = zext <8 x i8> %load to <8 x i64> 364 store <8 x i64> %ext, <8 x i64> addrspace(3)* %out 365 ret void 366 } 367 368 ; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i64: 369 define void @local_sextload_v8i8_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 370 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 371 %ext = sext <8 x i8> %load to <8 x i64> 372 store <8 x i64> %ext, <8 x i64> addrspace(3)* %out 373 ret void 374 } 375 376 ; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i64: 377 define void @local_zextload_v16i8_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 378 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 379 %ext = zext <16 x i8> %load to <16 x i64> 380 store <16 x i64> %ext, <16 x i64> addrspace(3)* %out 381 ret void 382 } 383 384 ; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i64: 385 define void @local_sextload_v16i8_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 386 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 387 %ext = sext <16 x i8> %load to <16 x i64> 388 store <16 x i64> %ext, <16 x i64> addrspace(3)* %out 389 ret void 390 } 391 392 ; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i64: 393 define void @local_zextload_v32i8_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 394 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 395 %ext = zext <32 x i8> %load to <32 x i64> 396 store <32 x i64> %ext, <32 x i64> addrspace(3)* %out 397 ret void 398 } 399 400 ; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i64: 401 define void @local_sextload_v32i8_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 402 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 403 %ext = sext <32 x i8> %load to <32 x i64> 404 store <32 x i64> %ext, <32 x i64> addrspace(3)* %out 405 ret void 406 } 407 408 ; XFUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i64: 409 ; define void @local_zextload_v64i8_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 410 ; %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 411 ; %ext = zext <64 x i8> %load to <64 x i64> 412 ; store <64 x i64> %ext, <64 x i64> addrspace(3)* %out 413 ; ret void 414 ; } 415 416 ; XFUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i64: 417 ; define void @local_sextload_v64i8_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 418 ; %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 419 ; %ext = sext <64 x i8> %load to <64 x i64> 420 ; store <64 x i64> %ext, <64 x i64> addrspace(3)* %out 421 ; ret void 422 ; } 423 424 ; FUNC-LABEL: {{^}}local_zextload_i8_to_i16: 425 ; GCN: ds_read_u8 v[[VAL:[0-9]+]], 426 ; GCN: ds_write_b16 v[[VAL:[0-9]+]] 427 define void @local_zextload_i8_to_i16(i16 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 428 %a = load i8, i8 addrspace(3)* %in 429 %ext = zext i8 %a to i16 430 store i16 %ext, i16 addrspace(3)* %out 431 ret void 432 } 433 434 ; FUNC-LABEL: {{^}}local_sextload_i8_to_i16: 435 ; GCN: ds_read_i8 v[[VAL:[0-9]+]], 436 ; GCN: ds_write_b16 v{{[0-9]+}}, v[[VAL]] 437 define void @local_sextload_i8_to_i16(i16 addrspace(3)* %out, i8 addrspace(3)* %in) #0 { 438 %a = load i8, i8 addrspace(3)* %in 439 %ext = sext i8 %a to i16 440 store i16 %ext, i16 addrspace(3)* %out 441 ret void 442 } 443 444 ; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i16: 445 define void @local_zextload_v1i8_to_v1i16(<1 x i16> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 446 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 447 %ext = zext <1 x i8> %load to <1 x i16> 448 store <1 x i16> %ext, <1 x i16> addrspace(3)* %out 449 ret void 450 } 451 452 ; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i16: 453 define void @local_sextload_v1i8_to_v1i16(<1 x i16> addrspace(3)* %out, <1 x i8> addrspace(3)* %in) #0 { 454 %load = load <1 x i8>, <1 x i8> addrspace(3)* %in 455 %ext = sext <1 x i8> %load to <1 x i16> 456 store <1 x i16> %ext, <1 x i16> addrspace(3)* %out 457 ret void 458 } 459 460 ; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i16: 461 define void @local_zextload_v2i8_to_v2i16(<2 x i16> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 462 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 463 %ext = zext <2 x i8> %load to <2 x i16> 464 store <2 x i16> %ext, <2 x i16> addrspace(3)* %out 465 ret void 466 } 467 468 ; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i16: 469 define void @local_sextload_v2i8_to_v2i16(<2 x i16> addrspace(3)* %out, <2 x i8> addrspace(3)* %in) #0 { 470 %load = load <2 x i8>, <2 x i8> addrspace(3)* %in 471 %ext = sext <2 x i8> %load to <2 x i16> 472 store <2 x i16> %ext, <2 x i16> addrspace(3)* %out 473 ret void 474 } 475 476 ; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i16: 477 define void @local_zextload_v4i8_to_v4i16(<4 x i16> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 478 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 479 %ext = zext <4 x i8> %load to <4 x i16> 480 store <4 x i16> %ext, <4 x i16> addrspace(3)* %out 481 ret void 482 } 483 484 ; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i16: 485 define void @local_sextload_v4i8_to_v4i16(<4 x i16> addrspace(3)* %out, <4 x i8> addrspace(3)* %in) #0 { 486 %load = load <4 x i8>, <4 x i8> addrspace(3)* %in 487 %ext = sext <4 x i8> %load to <4 x i16> 488 store <4 x i16> %ext, <4 x i16> addrspace(3)* %out 489 ret void 490 } 491 492 ; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i16: 493 define void @local_zextload_v8i8_to_v8i16(<8 x i16> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 494 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 495 %ext = zext <8 x i8> %load to <8 x i16> 496 store <8 x i16> %ext, <8 x i16> addrspace(3)* %out 497 ret void 498 } 499 500 ; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i16: 501 define void @local_sextload_v8i8_to_v8i16(<8 x i16> addrspace(3)* %out, <8 x i8> addrspace(3)* %in) #0 { 502 %load = load <8 x i8>, <8 x i8> addrspace(3)* %in 503 %ext = sext <8 x i8> %load to <8 x i16> 504 store <8 x i16> %ext, <8 x i16> addrspace(3)* %out 505 ret void 506 } 507 508 ; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i16: 509 define void @local_zextload_v16i8_to_v16i16(<16 x i16> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 510 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 511 %ext = zext <16 x i8> %load to <16 x i16> 512 store <16 x i16> %ext, <16 x i16> addrspace(3)* %out 513 ret void 514 } 515 516 ; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i16: 517 define void @local_sextload_v16i8_to_v16i16(<16 x i16> addrspace(3)* %out, <16 x i8> addrspace(3)* %in) #0 { 518 %load = load <16 x i8>, <16 x i8> addrspace(3)* %in 519 %ext = sext <16 x i8> %load to <16 x i16> 520 store <16 x i16> %ext, <16 x i16> addrspace(3)* %out 521 ret void 522 } 523 524 ; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i16: 525 define void @local_zextload_v32i8_to_v32i16(<32 x i16> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 526 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 527 %ext = zext <32 x i8> %load to <32 x i16> 528 store <32 x i16> %ext, <32 x i16> addrspace(3)* %out 529 ret void 530 } 531 532 ; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i16: 533 define void @local_sextload_v32i8_to_v32i16(<32 x i16> addrspace(3)* %out, <32 x i8> addrspace(3)* %in) #0 { 534 %load = load <32 x i8>, <32 x i8> addrspace(3)* %in 535 %ext = sext <32 x i8> %load to <32 x i16> 536 store <32 x i16> %ext, <32 x i16> addrspace(3)* %out 537 ret void 538 } 539 540 ; XFUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i16: 541 ; define void @local_zextload_v64i8_to_v64i16(<64 x i16> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 542 ; %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 543 ; %ext = zext <64 x i8> %load to <64 x i16> 544 ; store <64 x i16> %ext, <64 x i16> addrspace(3)* %out 545 ; ret void 546 ; } 547 548 ; XFUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i16: 549 ; define void @local_sextload_v64i8_to_v64i16(<64 x i16> addrspace(3)* %out, <64 x i8> addrspace(3)* %in) #0 { 550 ; %load = load <64 x i8>, <64 x i8> addrspace(3)* %in 551 ; %ext = sext <64 x i8> %load to <64 x i16> 552 ; store <64 x i16> %ext, <64 x i16> addrspace(3)* %out 553 ; ret void 554 ; } 555 556 attributes #0 = { nounwind } 557