Home | History | Annotate | Download | only in AMDGPU
      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