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=cypress < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
      4 
      5 ; FUNC-LABEL: {{^}}local_load_i1:
      6 ; GCN: ds_read_u8
      7 ; GCN: v_and_b32_e32 v{{[0-9]+}}, 1
      8 ; GCN: ds_write_b8
      9 
     10 ; EG: LDS_UBYTE_READ_RET
     11 ; EG: AND_INT
     12 ; EG: LDS_BYTE_WRITE
     13 define void @local_load_i1(i1 addrspace(3)* %out, i1 addrspace(3)* %in) #0 {
     14   %load = load i1, i1 addrspace(3)* %in
     15   store i1 %load, i1 addrspace(3)* %out
     16   ret void
     17 }
     18 
     19 ; FUNC-LABEL: {{^}}local_load_v2i1:
     20 define void @local_load_v2i1(<2 x i1> addrspace(3)* %out, <2 x i1> addrspace(3)* %in) #0 {
     21   %load = load <2 x i1>, <2 x i1> addrspace(3)* %in
     22   store <2 x i1> %load, <2 x i1> addrspace(3)* %out
     23   ret void
     24 }
     25 
     26 ; FUNC-LABEL: {{^}}local_load_v3i1:
     27 define void @local_load_v3i1(<3 x i1> addrspace(3)* %out, <3 x i1> addrspace(3)* %in) #0 {
     28   %load = load <3 x i1>, <3 x i1> addrspace(3)* %in
     29   store <3 x i1> %load, <3 x i1> addrspace(3)* %out
     30   ret void
     31 }
     32 
     33 ; FUNC-LABEL: {{^}}local_load_v4i1:
     34 define void @local_load_v4i1(<4 x i1> addrspace(3)* %out, <4 x i1> addrspace(3)* %in) #0 {
     35   %load = load <4 x i1>, <4 x i1> addrspace(3)* %in
     36   store <4 x i1> %load, <4 x i1> addrspace(3)* %out
     37   ret void
     38 }
     39 
     40 ; FUNC-LABEL: {{^}}local_load_v8i1:
     41 define void @local_load_v8i1(<8 x i1> addrspace(3)* %out, <8 x i1> addrspace(3)* %in) #0 {
     42   %load = load <8 x i1>, <8 x i1> addrspace(3)* %in
     43   store <8 x i1> %load, <8 x i1> addrspace(3)* %out
     44   ret void
     45 }
     46 
     47 ; FUNC-LABEL: {{^}}local_load_v16i1:
     48 define void @local_load_v16i1(<16 x i1> addrspace(3)* %out, <16 x i1> addrspace(3)* %in) #0 {
     49   %load = load <16 x i1>, <16 x i1> addrspace(3)* %in
     50   store <16 x i1> %load, <16 x i1> addrspace(3)* %out
     51   ret void
     52 }
     53 
     54 ; FUNC-LABEL: {{^}}local_load_v32i1:
     55 define void @local_load_v32i1(<32 x i1> addrspace(3)* %out, <32 x i1> addrspace(3)* %in) #0 {
     56   %load = load <32 x i1>, <32 x i1> addrspace(3)* %in
     57   store <32 x i1> %load, <32 x i1> addrspace(3)* %out
     58   ret void
     59 }
     60 
     61 ; FUNC-LABEL: {{^}}local_load_v64i1:
     62 define void @local_load_v64i1(<64 x i1> addrspace(3)* %out, <64 x i1> addrspace(3)* %in) #0 {
     63   %load = load <64 x i1>, <64 x i1> addrspace(3)* %in
     64   store <64 x i1> %load, <64 x i1> addrspace(3)* %out
     65   ret void
     66 }
     67 
     68 ; FUNC-LABEL: {{^}}local_zextload_i1_to_i32:
     69 ; GCN: ds_read_u8
     70 ; GCN: ds_write_b32
     71 define void @local_zextload_i1_to_i32(i32 addrspace(3)* %out, i1 addrspace(3)* %in) #0 {
     72   %a = load i1, i1 addrspace(3)* %in
     73   %ext = zext i1 %a to i32
     74   store i32 %ext, i32 addrspace(3)* %out
     75   ret void
     76 }
     77 
     78 ; FUNC-LABEL: {{^}}local_sextload_i1_to_i32:
     79 ; GCN: ds_read_u8
     80 ; GCN: v_bfe_i32 {{v[0-9]+}}, {{v[0-9]+}}, 0, 1{{$}}
     81 ; GCN: ds_write_b32
     82 
     83 ; EG: LDS_UBYTE_READ_RET
     84 ; EG: BFE_INT
     85 define void @local_sextload_i1_to_i32(i32 addrspace(3)* %out, i1 addrspace(3)* %in) #0 {
     86   %a = load i1, i1 addrspace(3)* %in
     87   %ext = sext i1 %a to i32
     88   store i32 %ext, i32 addrspace(3)* %out
     89   ret void
     90 }
     91 
     92 ; FUNC-LABEL: {{^}}local_zextload_v1i1_to_v1i32:
     93 define void @local_zextload_v1i1_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i1> addrspace(3)* %in) #0 {
     94   %load = load <1 x i1>, <1 x i1> addrspace(3)* %in
     95   %ext = zext <1 x i1> %load to <1 x i32>
     96   store <1 x i32> %ext, <1 x i32> addrspace(3)* %out
     97   ret void
     98 }
     99 
    100 ; FUNC-LABEL: {{^}}local_sextload_v1i1_to_v1i32:
    101 define void @local_sextload_v1i1_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i1> addrspace(3)* %in) #0 {
    102   %load = load <1 x i1>, <1 x i1> addrspace(3)* %in
    103   %ext = sext <1 x i1> %load to <1 x i32>
    104   store <1 x i32> %ext, <1 x i32> addrspace(3)* %out
    105   ret void
    106 }
    107 
    108 ; FUNC-LABEL: {{^}}local_zextload_v2i1_to_v2i32:
    109 define void @local_zextload_v2i1_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i1> addrspace(3)* %in) #0 {
    110   %load = load <2 x i1>, <2 x i1> addrspace(3)* %in
    111   %ext = zext <2 x i1> %load to <2 x i32>
    112   store <2 x i32> %ext, <2 x i32> addrspace(3)* %out
    113   ret void
    114 }
    115 
    116 ; FUNC-LABEL: {{^}}local_sextload_v2i1_to_v2i32:
    117 define void @local_sextload_v2i1_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i1> addrspace(3)* %in) #0 {
    118   %load = load <2 x i1>, <2 x i1> addrspace(3)* %in
    119   %ext = sext <2 x i1> %load to <2 x i32>
    120   store <2 x i32> %ext, <2 x i32> addrspace(3)* %out
    121   ret void
    122 }
    123 
    124 ; FUNC-LABEL: {{^}}local_zextload_v3i1_to_v3i32:
    125 define void @local_zextload_v3i1_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i1> addrspace(3)* %in) #0 {
    126   %load = load <3 x i1>, <3 x i1> addrspace(3)* %in
    127   %ext = zext <3 x i1> %load to <3 x i32>
    128   store <3 x i32> %ext, <3 x i32> addrspace(3)* %out
    129   ret void
    130 }
    131 
    132 ; FUNC-LABEL: {{^}}local_sextload_v3i1_to_v3i32:
    133 define void @local_sextload_v3i1_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i1> addrspace(3)* %in) #0 {
    134   %load = load <3 x i1>, <3 x i1> addrspace(3)* %in
    135   %ext = sext <3 x i1> %load to <3 x i32>
    136   store <3 x i32> %ext, <3 x i32> addrspace(3)* %out
    137   ret void
    138 }
    139 
    140 ; FUNC-LABEL: {{^}}local_zextload_v4i1_to_v4i32:
    141 define void @local_zextload_v4i1_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i1> addrspace(3)* %in) #0 {
    142   %load = load <4 x i1>, <4 x i1> addrspace(3)* %in
    143   %ext = zext <4 x i1> %load to <4 x i32>
    144   store <4 x i32> %ext, <4 x i32> addrspace(3)* %out
    145   ret void
    146 }
    147 
    148 ; FUNC-LABEL: {{^}}local_sextload_v4i1_to_v4i32:
    149 define void @local_sextload_v4i1_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i1> addrspace(3)* %in) #0 {
    150   %load = load <4 x i1>, <4 x i1> addrspace(3)* %in
    151   %ext = sext <4 x i1> %load to <4 x i32>
    152   store <4 x i32> %ext, <4 x i32> addrspace(3)* %out
    153   ret void
    154 }
    155 
    156 ; FUNC-LABEL: {{^}}local_zextload_v8i1_to_v8i32:
    157 define void @local_zextload_v8i1_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i1> addrspace(3)* %in) #0 {
    158   %load = load <8 x i1>, <8 x i1> addrspace(3)* %in
    159   %ext = zext <8 x i1> %load to <8 x i32>
    160   store <8 x i32> %ext, <8 x i32> addrspace(3)* %out
    161   ret void
    162 }
    163 
    164 ; FUNC-LABEL: {{^}}local_sextload_v8i1_to_v8i32:
    165 define void @local_sextload_v8i1_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i1> addrspace(3)* %in) #0 {
    166   %load = load <8 x i1>, <8 x i1> addrspace(3)* %in
    167   %ext = sext <8 x i1> %load to <8 x i32>
    168   store <8 x i32> %ext, <8 x i32> addrspace(3)* %out
    169   ret void
    170 }
    171 
    172 ; FUNC-LABEL: {{^}}local_zextload_v16i1_to_v16i32:
    173 define void @local_zextload_v16i1_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i1> addrspace(3)* %in) #0 {
    174   %load = load <16 x i1>, <16 x i1> addrspace(3)* %in
    175   %ext = zext <16 x i1> %load to <16 x i32>
    176   store <16 x i32> %ext, <16 x i32> addrspace(3)* %out
    177   ret void
    178 }
    179 
    180 ; FUNC-LABEL: {{^}}local_sextload_v16i1_to_v16i32:
    181 define void @local_sextload_v16i1_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i1> addrspace(3)* %in) #0 {
    182   %load = load <16 x i1>, <16 x i1> addrspace(3)* %in
    183   %ext = sext <16 x i1> %load to <16 x i32>
    184   store <16 x i32> %ext, <16 x i32> addrspace(3)* %out
    185   ret void
    186 }
    187 
    188 ; FUNC-LABEL: {{^}}local_zextload_v32i1_to_v32i32:
    189 define void @local_zextload_v32i1_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i1> addrspace(3)* %in) #0 {
    190   %load = load <32 x i1>, <32 x i1> addrspace(3)* %in
    191   %ext = zext <32 x i1> %load to <32 x i32>
    192   store <32 x i32> %ext, <32 x i32> addrspace(3)* %out
    193   ret void
    194 }
    195 
    196 ; FUNC-LABEL: {{^}}local_sextload_v32i1_to_v32i32:
    197 define void @local_sextload_v32i1_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i1> addrspace(3)* %in) #0 {
    198   %load = load <32 x i1>, <32 x i1> addrspace(3)* %in
    199   %ext = sext <32 x i1> %load to <32 x i32>
    200   store <32 x i32> %ext, <32 x i32> addrspace(3)* %out
    201   ret void
    202 }
    203 
    204 ; FUNC-LABEL: {{^}}local_zextload_v64i1_to_v64i32:
    205 define void @local_zextload_v64i1_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i1> addrspace(3)* %in) #0 {
    206   %load = load <64 x i1>, <64 x i1> addrspace(3)* %in
    207   %ext = zext <64 x i1> %load to <64 x i32>
    208   store <64 x i32> %ext, <64 x i32> addrspace(3)* %out
    209   ret void
    210 }
    211 
    212 ; FUNC-LABEL: {{^}}local_sextload_v64i1_to_v64i32:
    213 define void @local_sextload_v64i1_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i1> addrspace(3)* %in) #0 {
    214   %load = load <64 x i1>, <64 x i1> addrspace(3)* %in
    215   %ext = sext <64 x i1> %load to <64 x i32>
    216   store <64 x i32> %ext, <64 x i32> addrspace(3)* %out
    217   ret void
    218 }
    219 
    220 ; FUNC-LABEL: {{^}}local_zextload_i1_to_i64:
    221 ; GCN-DAG: ds_read_u8 [[LOAD:v[0-9]+]],
    222 ; GCN-DAG: v_mov_b32_e32 {{v[0-9]+}}, 0{{$}}
    223 ; GCN: ds_write_b64
    224 define void @local_zextload_i1_to_i64(i64 addrspace(3)* %out, i1 addrspace(3)* %in) #0 {
    225   %a = load i1, i1 addrspace(3)* %in
    226   %ext = zext i1 %a to i64
    227   store i64 %ext, i64 addrspace(3)* %out
    228   ret void
    229 }
    230 
    231 ; FUNC-LABEL: {{^}}local_sextload_i1_to_i64:
    232 ; GCN: ds_read_u8 [[LOAD:v[0-9]+]],
    233 ; GCN: v_bfe_i32 [[BFE:v[0-9]+]], {{v[0-9]+}}, 0, 1{{$}}
    234 ; GCN: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, [[BFE]]
    235 ; GCN: ds_write_b64
    236 define void @local_sextload_i1_to_i64(i64 addrspace(3)* %out, i1 addrspace(3)* %in) #0 {
    237   %a = load i1, i1 addrspace(3)* %in
    238   %ext = sext i1 %a to i64
    239   store i64 %ext, i64 addrspace(3)* %out
    240   ret void
    241 }
    242 
    243 ; FUNC-LABEL: {{^}}local_zextload_v1i1_to_v1i64:
    244 define void @local_zextload_v1i1_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i1> addrspace(3)* %in) #0 {
    245   %load = load <1 x i1>, <1 x i1> addrspace(3)* %in
    246   %ext = zext <1 x i1> %load to <1 x i64>
    247   store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
    248   ret void
    249 }
    250 
    251 ; FUNC-LABEL: {{^}}local_sextload_v1i1_to_v1i64:
    252 define void @local_sextload_v1i1_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i1> addrspace(3)* %in) #0 {
    253   %load = load <1 x i1>, <1 x i1> addrspace(3)* %in
    254   %ext = sext <1 x i1> %load to <1 x i64>
    255   store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
    256   ret void
    257 }
    258 
    259 ; FUNC-LABEL: {{^}}local_zextload_v2i1_to_v2i64:
    260 define void @local_zextload_v2i1_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i1> addrspace(3)* %in) #0 {
    261   %load = load <2 x i1>, <2 x i1> addrspace(3)* %in
    262   %ext = zext <2 x i1> %load to <2 x i64>
    263   store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
    264   ret void
    265 }
    266 
    267 ; FUNC-LABEL: {{^}}local_sextload_v2i1_to_v2i64:
    268 define void @local_sextload_v2i1_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i1> addrspace(3)* %in) #0 {
    269   %load = load <2 x i1>, <2 x i1> addrspace(3)* %in
    270   %ext = sext <2 x i1> %load to <2 x i64>
    271   store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
    272   ret void
    273 }
    274 
    275 ; FUNC-LABEL: {{^}}local_zextload_v3i1_to_v3i64:
    276 define void @local_zextload_v3i1_to_v3i64(<3 x i64> addrspace(3)* %out, <3 x i1> addrspace(3)* %in) #0 {
    277   %load = load <3 x i1>, <3 x i1> addrspace(3)* %in
    278   %ext = zext <3 x i1> %load to <3 x i64>
    279   store <3 x i64> %ext, <3 x i64> addrspace(3)* %out
    280   ret void
    281 }
    282 
    283 ; FUNC-LABEL: {{^}}local_sextload_v3i1_to_v3i64:
    284 define void @local_sextload_v3i1_to_v3i64(<3 x i64> addrspace(3)* %out, <3 x i1> addrspace(3)* %in) #0 {
    285   %load = load <3 x i1>, <3 x i1> addrspace(3)* %in
    286   %ext = sext <3 x i1> %load to <3 x i64>
    287   store <3 x i64> %ext, <3 x i64> addrspace(3)* %out
    288   ret void
    289 }
    290 
    291 ; FUNC-LABEL: {{^}}local_zextload_v4i1_to_v4i64:
    292 define void @local_zextload_v4i1_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i1> addrspace(3)* %in) #0 {
    293   %load = load <4 x i1>, <4 x i1> addrspace(3)* %in
    294   %ext = zext <4 x i1> %load to <4 x i64>
    295   store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
    296   ret void
    297 }
    298 
    299 ; FUNC-LABEL: {{^}}local_sextload_v4i1_to_v4i64:
    300 define void @local_sextload_v4i1_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i1> addrspace(3)* %in) #0 {
    301   %load = load <4 x i1>, <4 x i1> addrspace(3)* %in
    302   %ext = sext <4 x i1> %load to <4 x i64>
    303   store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
    304   ret void
    305 }
    306 
    307 ; FUNC-LABEL: {{^}}local_zextload_v8i1_to_v8i64:
    308 define void @local_zextload_v8i1_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i1> addrspace(3)* %in) #0 {
    309   %load = load <8 x i1>, <8 x i1> addrspace(3)* %in
    310   %ext = zext <8 x i1> %load to <8 x i64>
    311   store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
    312   ret void
    313 }
    314 
    315 ; FUNC-LABEL: {{^}}local_sextload_v8i1_to_v8i64:
    316 define void @local_sextload_v8i1_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i1> addrspace(3)* %in) #0 {
    317   %load = load <8 x i1>, <8 x i1> addrspace(3)* %in
    318   %ext = sext <8 x i1> %load to <8 x i64>
    319   store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
    320   ret void
    321 }
    322 
    323 ; FUNC-LABEL: {{^}}local_zextload_v16i1_to_v16i64:
    324 define void @local_zextload_v16i1_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i1> addrspace(3)* %in) #0 {
    325   %load = load <16 x i1>, <16 x i1> addrspace(3)* %in
    326   %ext = zext <16 x i1> %load to <16 x i64>
    327   store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
    328   ret void
    329 }
    330 
    331 ; FUNC-LABEL: {{^}}local_sextload_v16i1_to_v16i64:
    332 define void @local_sextload_v16i1_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i1> addrspace(3)* %in) #0 {
    333   %load = load <16 x i1>, <16 x i1> addrspace(3)* %in
    334   %ext = sext <16 x i1> %load to <16 x i64>
    335   store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
    336   ret void
    337 }
    338 
    339 ; FUNC-LABEL: {{^}}local_zextload_v32i1_to_v32i64:
    340 define void @local_zextload_v32i1_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i1> addrspace(3)* %in) #0 {
    341   %load = load <32 x i1>, <32 x i1> addrspace(3)* %in
    342   %ext = zext <32 x i1> %load to <32 x i64>
    343   store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
    344   ret void
    345 }
    346 
    347 ; FUNC-LABEL: {{^}}local_sextload_v32i1_to_v32i64:
    348 define void @local_sextload_v32i1_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i1> addrspace(3)* %in) #0 {
    349   %load = load <32 x i1>, <32 x i1> addrspace(3)* %in
    350   %ext = sext <32 x i1> %load to <32 x i64>
    351   store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
    352   ret void
    353 }
    354 
    355 ; FUNC-LABEL: {{^}}local_zextload_v64i1_to_v64i64:
    356 define void @local_zextload_v64i1_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i1> addrspace(3)* %in) #0 {
    357   %load = load <64 x i1>, <64 x i1> addrspace(3)* %in
    358   %ext = zext <64 x i1> %load to <64 x i64>
    359   store <64 x i64> %ext, <64 x i64> addrspace(3)* %out
    360   ret void
    361 }
    362 
    363 ; FUNC-LABEL: {{^}}local_sextload_v64i1_to_v64i64:
    364 define void @local_sextload_v64i1_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i1> addrspace(3)* %in) #0 {
    365   %load = load <64 x i1>, <64 x i1> addrspace(3)* %in
    366   %ext = sext <64 x i1> %load to <64 x i64>
    367   store <64 x i64> %ext, <64 x i64> addrspace(3)* %out
    368   ret void
    369 }
    370 
    371 attributes #0 = { nounwind }
    372