Home | History | Annotate | Download | only in AMDGPU
      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
     12 define void @constant_load_i8(i8 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
     13 entry:
     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
     24 define void @constant_load_v2i8(<2 x i8> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
     25 entry:
     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
     35 define void @constant_load_v3i8(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
     36 entry:
     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
     46 define void @constant_load_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
     47 entry:
     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
     57 define void @constant_load_v8i8(<8 x i8> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
     58 entry:
     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
     68 define void @constant_load_v16i8(<16 x i8> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
     69 entry:
     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}}
     80 define 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
     94 define 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:
    102 define 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:
    110 define 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_ushort
    119 ; GCN-HSA: flat_load_ushort
    120 ; EG: VTX_READ_8
    121 ; EG: VTX_READ_8
    122 define void @constant_zextload_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
    123   %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
    124   %ext = zext <2 x i8> %load to <2 x i32>
    125   store <2 x i32> %ext, <2 x i32> addrspace(1)* %out
    126   ret void
    127 }
    128 
    129 ; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i32:
    130 ; GCN-NOHSA: buffer_load_ushort
    131 
    132 ; GCN-HSA: flat_load_ushort
    133 
    134 ; GCN: v_bfe_i32
    135 ; GCN: v_bfe_i32
    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
    143 define 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
    156 define void @constant_zextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
    157 entry:
    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
    170 define void @constant_sextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
    171 entry:
    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: s_load_dword s
    180 ; GCN-DAG: s_and_b32
    181 ; GCN-DAG: s_lshr_b32
    182 
    183 ; EG: VTX_READ_8
    184 ; EG: VTX_READ_8
    185 ; EG: VTX_READ_8
    186 ; EG: VTX_READ_8
    187 define void @constant_zextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    188   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    189   %ext = zext <4 x i8> %load to <4 x i32>
    190   store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
    191   ret void
    192 }
    193 
    194 ; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i32:
    195 ; GCN: s_load_dword s
    196 ; GCN-DAG: s_sext_i32_i8
    197 ; GCN-DAG: s_ashr_i32
    198 
    199 ; EG-DAG: VTX_READ_8 [[DST_X:T[0-9]\.[XYZW]]], [[DST_X]]
    200 ; EG-DAG: VTX_READ_8 [[DST_Y:T[0-9]\.[XYZW]]], [[DST_Y]]
    201 ; EG-DAG: VTX_READ_8 [[DST_Z:T[0-9]\.[XYZW]]], [[DST_Z]]
    202 ; EG-DAG: VTX_READ_8 [[DST_W:T[0-9]\.[XYZW]]], [[DST_W]]
    203 ; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_X]], 0.0, literal
    204 ; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Y]], 0.0, literal
    205 ; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Z]], 0.0, literal
    206 ; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_W]], 0.0, literal
    207 ; EG-DAG: 8
    208 ; EG-DAG: 8
    209 ; EG-DAG: 8
    210 ; EG-DAG: 8
    211 define void @constant_sextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    212   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    213   %ext = sext <4 x i8> %load to <4 x i32>
    214   store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
    215   ret void
    216 }
    217 
    218 ; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i32:
    219 ; GCN: s_load_dwordx2
    220 ; GCN-DAG: s_and_b32
    221 ; GCN-DAG: s_lshr_b32
    222 define void @constant_zextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    223   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    224   %ext = zext <8 x i8> %load to <8 x i32>
    225   store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
    226   ret void
    227 }
    228 
    229 ; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i32:
    230 ; GCN: s_load_dwordx2
    231 ; GCN-DAG: s_ashr_i32
    232 ; GCN-DAG: s_sext_i32_i8
    233 define void @constant_sextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    234   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    235   %ext = sext <8 x i8> %load to <8 x i32>
    236   store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
    237   ret void
    238 }
    239 
    240 ; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i32:
    241 define void @constant_zextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    242   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    243   %ext = zext <16 x i8> %load to <16 x i32>
    244   store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
    245   ret void
    246 }
    247 
    248 ; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i32:
    249 define void @constant_sextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    250   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    251   %ext = sext <16 x i8> %load to <16 x i32>
    252   store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
    253   ret void
    254 }
    255 
    256 ; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i32:
    257 define void @constant_zextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    258   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    259   %ext = zext <32 x i8> %load to <32 x i32>
    260   store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
    261   ret void
    262 }
    263 
    264 ; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i32:
    265 define void @constant_sextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    266   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    267   %ext = sext <32 x i8> %load to <32 x i32>
    268   store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
    269   ret void
    270 }
    271 
    272 ; FUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i32:
    273 define void @constant_zextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    274   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    275   %ext = zext <64 x i8> %load to <64 x i32>
    276   store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
    277   ret void
    278 }
    279 
    280 ; FUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i32:
    281 define void @constant_sextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    282   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    283   %ext = sext <64 x i8> %load to <64 x i32>
    284   store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
    285   ret void
    286 }
    287 
    288 ; FUNC-LABEL: {{^}}constant_zextload_i8_to_i64:
    289 ; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}
    290 
    291 ; GCN-NOHSA-DAG: buffer_load_ubyte v[[LO:[0-9]+]],
    292 ; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]]
    293 
    294 ; GCN-HSA-DAG: flat_load_ubyte v[[LO:[0-9]+]],
    295 ; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]]
    296 define void @constant_zextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
    297   %a = load i8, i8 addrspace(2)* %in
    298   %ext = zext i8 %a to i64
    299   store i64 %ext, i64 addrspace(1)* %out
    300   ret void
    301 }
    302 
    303 ; FUNC-LABEL: {{^}}constant_sextload_i8_to_i64:
    304 ; GCN-NOHSA: buffer_load_sbyte v[[LO:[0-9]+]],
    305 ; GCN-HSA: flat_load_sbyte v[[LO:[0-9]+]],
    306 ; GCN: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]]
    307 
    308 ; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
    309 ; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]{{\]}}
    310 define void @constant_sextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
    311   %a = load i8, i8 addrspace(2)* %in
    312   %ext = sext i8 %a to i64
    313   store i64 %ext, i64 addrspace(1)* %out
    314   ret void
    315 }
    316 
    317 ; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i64:
    318 define void @constant_zextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
    319   %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
    320   %ext = zext <1 x i8> %load to <1 x i64>
    321   store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
    322   ret void
    323 }
    324 
    325 ; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i64:
    326 define void @constant_sextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
    327   %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
    328   %ext = sext <1 x i8> %load to <1 x i64>
    329   store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
    330   ret void
    331 }
    332 
    333 ; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i64:
    334 define void @constant_zextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
    335   %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
    336   %ext = zext <2 x i8> %load to <2 x i64>
    337   store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
    338   ret void
    339 }
    340 
    341 ; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i64:
    342 define void @constant_sextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
    343   %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
    344   %ext = sext <2 x i8> %load to <2 x i64>
    345   store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
    346   ret void
    347 }
    348 
    349 ; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i64:
    350 define void @constant_zextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    351   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    352   %ext = zext <4 x i8> %load to <4 x i64>
    353   store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
    354   ret void
    355 }
    356 
    357 ; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i64:
    358 define void @constant_sextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    359   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    360   %ext = sext <4 x i8> %load to <4 x i64>
    361   store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
    362   ret void
    363 }
    364 
    365 ; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i64:
    366 define void @constant_zextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    367   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    368   %ext = zext <8 x i8> %load to <8 x i64>
    369   store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
    370   ret void
    371 }
    372 
    373 ; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i64:
    374 define void @constant_sextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    375   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    376   %ext = sext <8 x i8> %load to <8 x i64>
    377   store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
    378   ret void
    379 }
    380 
    381 ; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i64:
    382 define void @constant_zextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    383   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    384   %ext = zext <16 x i8> %load to <16 x i64>
    385   store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
    386   ret void
    387 }
    388 
    389 ; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i64:
    390 define void @constant_sextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    391   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    392   %ext = sext <16 x i8> %load to <16 x i64>
    393   store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
    394   ret void
    395 }
    396 
    397 ; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i64:
    398 define void @constant_zextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    399   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    400   %ext = zext <32 x i8> %load to <32 x i64>
    401   store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
    402   ret void
    403 }
    404 
    405 ; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i64:
    406 define void @constant_sextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    407   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    408   %ext = sext <32 x i8> %load to <32 x i64>
    409   store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
    410   ret void
    411 }
    412 
    413 ; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i64:
    414 ; define void @constant_zextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    415 ;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    416 ;   %ext = zext <64 x i8> %load to <64 x i64>
    417 ;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
    418 ;   ret void
    419 ; }
    420 
    421 ; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i64:
    422 ; define void @constant_sextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    423 ;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    424 ;   %ext = sext <64 x i8> %load to <64 x i64>
    425 ;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
    426 ;   ret void
    427 ; }
    428 
    429 ; FUNC-LABEL: {{^}}constant_zextload_i8_to_i16:
    430 ; GCN-NOHSA: buffer_load_ubyte v[[VAL:[0-9]+]],
    431 ; GCN-NOHSA: buffer_store_short v[[VAL]]
    432 
    433 ; GCN-HSA: flat_load_ubyte v[[VAL:[0-9]+]],
    434 ; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]]
    435 define void @constant_zextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
    436   %a = load i8, i8 addrspace(2)* %in
    437   %ext = zext i8 %a to i16
    438   store i16 %ext, i16 addrspace(1)* %out
    439   ret void
    440 }
    441 
    442 ; FUNC-LABEL: {{^}}constant_sextload_i8_to_i16:
    443 ; GCN-NOHSA: buffer_load_sbyte v[[VAL:[0-9]+]],
    444 ; GCN-HSA: flat_load_sbyte v[[VAL:[0-9]+]],
    445 
    446 ; GCN-NOHSA: buffer_store_short v[[VAL]]
    447 ; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]]
    448 define void @constant_sextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
    449   %a = load i8, i8 addrspace(2)* %in
    450   %ext = sext i8 %a to i16
    451   store i16 %ext, i16 addrspace(1)* %out
    452   ret void
    453 }
    454 
    455 ; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i16:
    456 define void @constant_zextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
    457   %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
    458   %ext = zext <1 x i8> %load to <1 x i16>
    459   store <1 x i16> %ext, <1 x i16> addrspace(1)* %out
    460   ret void
    461 }
    462 
    463 ; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i16:
    464 define void @constant_sextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
    465   %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
    466   %ext = sext <1 x i8> %load to <1 x i16>
    467   store <1 x i16> %ext, <1 x i16> addrspace(1)* %out
    468   ret void
    469 }
    470 
    471 ; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i16:
    472 define void @constant_zextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
    473   %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
    474   %ext = zext <2 x i8> %load to <2 x i16>
    475   store <2 x i16> %ext, <2 x i16> addrspace(1)* %out
    476   ret void
    477 }
    478 
    479 ; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i16:
    480 define void @constant_sextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
    481   %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
    482   %ext = sext <2 x i8> %load to <2 x i16>
    483   store <2 x i16> %ext, <2 x i16> addrspace(1)* %out
    484   ret void
    485 }
    486 
    487 ; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i16:
    488 define void @constant_zextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    489   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    490   %ext = zext <4 x i8> %load to <4 x i16>
    491   store <4 x i16> %ext, <4 x i16> addrspace(1)* %out
    492   ret void
    493 }
    494 
    495 ; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i16:
    496 define void @constant_sextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
    497   %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
    498   %ext = sext <4 x i8> %load to <4 x i16>
    499   store <4 x i16> %ext, <4 x i16> addrspace(1)* %out
    500   ret void
    501 }
    502 
    503 ; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i16:
    504 define void @constant_zextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    505   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    506   %ext = zext <8 x i8> %load to <8 x i16>
    507   store <8 x i16> %ext, <8 x i16> addrspace(1)* %out
    508   ret void
    509 }
    510 
    511 ; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i16:
    512 define void @constant_sextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
    513   %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
    514   %ext = sext <8 x i8> %load to <8 x i16>
    515   store <8 x i16> %ext, <8 x i16> addrspace(1)* %out
    516   ret void
    517 }
    518 
    519 ; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i16:
    520 define void @constant_zextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    521   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    522   %ext = zext <16 x i8> %load to <16 x i16>
    523   store <16 x i16> %ext, <16 x i16> addrspace(1)* %out
    524   ret void
    525 }
    526 
    527 ; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i16:
    528 define void @constant_sextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
    529   %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
    530   %ext = sext <16 x i8> %load to <16 x i16>
    531   store <16 x i16> %ext, <16 x i16> addrspace(1)* %out
    532   ret void
    533 }
    534 
    535 ; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i16:
    536 define void @constant_zextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    537   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    538   %ext = zext <32 x i8> %load to <32 x i16>
    539   store <32 x i16> %ext, <32 x i16> addrspace(1)* %out
    540   ret void
    541 }
    542 
    543 ; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i16:
    544 define void @constant_sextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
    545   %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
    546   %ext = sext <32 x i8> %load to <32 x i16>
    547   store <32 x i16> %ext, <32 x i16> addrspace(1)* %out
    548   ret void
    549 }
    550 
    551 ; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i16:
    552 ; define void @constant_zextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    553 ;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    554 ;   %ext = zext <64 x i8> %load to <64 x i16>
    555 ;   store <64 x i16> %ext, <64 x i16> addrspace(1)* %out
    556 ;   ret void
    557 ; }
    558 
    559 ; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i16:
    560 ; define void @constant_sextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
    561 ;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
    562 ;   %ext = sext <64 x i8> %load to <64 x i16>
    563 ;   store <64 x i16> %ext, <64 x i16> addrspace(1)* %out
    564 ;   ret void
    565 ; }
    566 
    567 attributes #0 = { nounwind }
    568