Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -enable-misched=false | FileCheck %s
      2 
      3 define <8 x i8> @sqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
      4 ;CHECK-LABEL: sqshl8b:
      5 ;CHECK: sqshl.8b
      6         %tmp1 = load <8 x i8>, <8 x i8>* %A
      7         %tmp2 = load <8 x i8>, <8 x i8>* %B
      8         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
      9         ret <8 x i8> %tmp3
     10 }
     11 
     12 define <4 x i16> @sqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
     13 ;CHECK-LABEL: sqshl4h:
     14 ;CHECK: sqshl.4h
     15         %tmp1 = load <4 x i16>, <4 x i16>* %A
     16         %tmp2 = load <4 x i16>, <4 x i16>* %B
     17         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
     18         ret <4 x i16> %tmp3
     19 }
     20 
     21 define <2 x i32> @sqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
     22 ;CHECK-LABEL: sqshl2s:
     23 ;CHECK: sqshl.2s
     24         %tmp1 = load <2 x i32>, <2 x i32>* %A
     25         %tmp2 = load <2 x i32>, <2 x i32>* %B
     26         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
     27         ret <2 x i32> %tmp3
     28 }
     29 
     30 define <8 x i8> @uqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
     31 ;CHECK-LABEL: uqshl8b:
     32 ;CHECK: uqshl.8b
     33         %tmp1 = load <8 x i8>, <8 x i8>* %A
     34         %tmp2 = load <8 x i8>, <8 x i8>* %B
     35         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
     36         ret <8 x i8> %tmp3
     37 }
     38 
     39 define <4 x i16> @uqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
     40 ;CHECK-LABEL: uqshl4h:
     41 ;CHECK: uqshl.4h
     42         %tmp1 = load <4 x i16>, <4 x i16>* %A
     43         %tmp2 = load <4 x i16>, <4 x i16>* %B
     44         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
     45         ret <4 x i16> %tmp3
     46 }
     47 
     48 define <2 x i32> @uqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
     49 ;CHECK-LABEL: uqshl2s:
     50 ;CHECK: uqshl.2s
     51         %tmp1 = load <2 x i32>, <2 x i32>* %A
     52         %tmp2 = load <2 x i32>, <2 x i32>* %B
     53         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
     54         ret <2 x i32> %tmp3
     55 }
     56 
     57 define <16 x i8> @sqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
     58 ;CHECK-LABEL: sqshl16b:
     59 ;CHECK: sqshl.16b
     60         %tmp1 = load <16 x i8>, <16 x i8>* %A
     61         %tmp2 = load <16 x i8>, <16 x i8>* %B
     62         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
     63         ret <16 x i8> %tmp3
     64 }
     65 
     66 define <8 x i16> @sqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
     67 ;CHECK-LABEL: sqshl8h:
     68 ;CHECK: sqshl.8h
     69         %tmp1 = load <8 x i16>, <8 x i16>* %A
     70         %tmp2 = load <8 x i16>, <8 x i16>* %B
     71         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
     72         ret <8 x i16> %tmp3
     73 }
     74 
     75 define <4 x i32> @sqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
     76 ;CHECK-LABEL: sqshl4s:
     77 ;CHECK: sqshl.4s
     78         %tmp1 = load <4 x i32>, <4 x i32>* %A
     79         %tmp2 = load <4 x i32>, <4 x i32>* %B
     80         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
     81         ret <4 x i32> %tmp3
     82 }
     83 
     84 define <2 x i64> @sqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
     85 ;CHECK-LABEL: sqshl2d:
     86 ;CHECK: sqshl.2d
     87         %tmp1 = load <2 x i64>, <2 x i64>* %A
     88         %tmp2 = load <2 x i64>, <2 x i64>* %B
     89         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
     90         ret <2 x i64> %tmp3
     91 }
     92 
     93 define <16 x i8> @uqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
     94 ;CHECK-LABEL: uqshl16b:
     95 ;CHECK: uqshl.16b
     96         %tmp1 = load <16 x i8>, <16 x i8>* %A
     97         %tmp2 = load <16 x i8>, <16 x i8>* %B
     98         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
     99         ret <16 x i8> %tmp3
    100 }
    101 
    102 define <8 x i16> @uqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    103 ;CHECK-LABEL: uqshl8h:
    104 ;CHECK: uqshl.8h
    105         %tmp1 = load <8 x i16>, <8 x i16>* %A
    106         %tmp2 = load <8 x i16>, <8 x i16>* %B
    107         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
    108         ret <8 x i16> %tmp3
    109 }
    110 
    111 define <4 x i32> @uqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    112 ;CHECK-LABEL: uqshl4s:
    113 ;CHECK: uqshl.4s
    114         %tmp1 = load <4 x i32>, <4 x i32>* %A
    115         %tmp2 = load <4 x i32>, <4 x i32>* %B
    116         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
    117         ret <4 x i32> %tmp3
    118 }
    119 
    120 define <2 x i64> @uqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    121 ;CHECK-LABEL: uqshl2d:
    122 ;CHECK: uqshl.2d
    123         %tmp1 = load <2 x i64>, <2 x i64>* %A
    124         %tmp2 = load <2 x i64>, <2 x i64>* %B
    125         %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
    126         ret <2 x i64> %tmp3
    127 }
    128 
    129 declare <8 x i8>  @llvm.aarch64.neon.sqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    130 declare <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    131 declare <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    132 declare <1 x i64> @llvm.aarch64.neon.sqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    133 
    134 declare <8 x i8>  @llvm.aarch64.neon.uqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    135 declare <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    136 declare <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    137 declare <1 x i64> @llvm.aarch64.neon.uqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    138 
    139 declare <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    140 declare <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    141 declare <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    142 declare <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    143 
    144 declare <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    145 declare <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    146 declare <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    147 declare <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    148 
    149 define <8 x i8> @srshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    150 ;CHECK-LABEL: srshl8b:
    151 ;CHECK: srshl.8b
    152         %tmp1 = load <8 x i8>, <8 x i8>* %A
    153         %tmp2 = load <8 x i8>, <8 x i8>* %B
    154         %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
    155         ret <8 x i8> %tmp3
    156 }
    157 
    158 define <4 x i16> @srshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    159 ;CHECK-LABEL: srshl4h:
    160 ;CHECK: srshl.4h
    161         %tmp1 = load <4 x i16>, <4 x i16>* %A
    162         %tmp2 = load <4 x i16>, <4 x i16>* %B
    163         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
    164         ret <4 x i16> %tmp3
    165 }
    166 
    167 define <2 x i32> @srshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    168 ;CHECK-LABEL: srshl2s:
    169 ;CHECK: srshl.2s
    170         %tmp1 = load <2 x i32>, <2 x i32>* %A
    171         %tmp2 = load <2 x i32>, <2 x i32>* %B
    172         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
    173         ret <2 x i32> %tmp3
    174 }
    175 
    176 define <8 x i8> @urshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    177 ;CHECK-LABEL: urshl8b:
    178 ;CHECK: urshl.8b
    179         %tmp1 = load <8 x i8>, <8 x i8>* %A
    180         %tmp2 = load <8 x i8>, <8 x i8>* %B
    181         %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
    182         ret <8 x i8> %tmp3
    183 }
    184 
    185 define <4 x i16> @urshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    186 ;CHECK-LABEL: urshl4h:
    187 ;CHECK: urshl.4h
    188         %tmp1 = load <4 x i16>, <4 x i16>* %A
    189         %tmp2 = load <4 x i16>, <4 x i16>* %B
    190         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
    191         ret <4 x i16> %tmp3
    192 }
    193 
    194 define <2 x i32> @urshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    195 ;CHECK-LABEL: urshl2s:
    196 ;CHECK: urshl.2s
    197         %tmp1 = load <2 x i32>, <2 x i32>* %A
    198         %tmp2 = load <2 x i32>, <2 x i32>* %B
    199         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
    200         ret <2 x i32> %tmp3
    201 }
    202 
    203 define <16 x i8> @srshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    204 ;CHECK-LABEL: srshl16b:
    205 ;CHECK: srshl.16b
    206         %tmp1 = load <16 x i8>, <16 x i8>* %A
    207         %tmp2 = load <16 x i8>, <16 x i8>* %B
    208         %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
    209         ret <16 x i8> %tmp3
    210 }
    211 
    212 define <8 x i16> @srshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    213 ;CHECK-LABEL: srshl8h:
    214 ;CHECK: srshl.8h
    215         %tmp1 = load <8 x i16>, <8 x i16>* %A
    216         %tmp2 = load <8 x i16>, <8 x i16>* %B
    217         %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
    218         ret <8 x i16> %tmp3
    219 }
    220 
    221 define <4 x i32> @srshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    222 ;CHECK-LABEL: srshl4s:
    223 ;CHECK: srshl.4s
    224         %tmp1 = load <4 x i32>, <4 x i32>* %A
    225         %tmp2 = load <4 x i32>, <4 x i32>* %B
    226         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
    227         ret <4 x i32> %tmp3
    228 }
    229 
    230 define <2 x i64> @srshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    231 ;CHECK-LABEL: srshl2d:
    232 ;CHECK: srshl.2d
    233         %tmp1 = load <2 x i64>, <2 x i64>* %A
    234         %tmp2 = load <2 x i64>, <2 x i64>* %B
    235         %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
    236         ret <2 x i64> %tmp3
    237 }
    238 
    239 define <16 x i8> @urshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    240 ;CHECK-LABEL: urshl16b:
    241 ;CHECK: urshl.16b
    242         %tmp1 = load <16 x i8>, <16 x i8>* %A
    243         %tmp2 = load <16 x i8>, <16 x i8>* %B
    244         %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
    245         ret <16 x i8> %tmp3
    246 }
    247 
    248 define <8 x i16> @urshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    249 ;CHECK-LABEL: urshl8h:
    250 ;CHECK: urshl.8h
    251         %tmp1 = load <8 x i16>, <8 x i16>* %A
    252         %tmp2 = load <8 x i16>, <8 x i16>* %B
    253         %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
    254         ret <8 x i16> %tmp3
    255 }
    256 
    257 define <4 x i32> @urshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    258 ;CHECK-LABEL: urshl4s:
    259 ;CHECK: urshl.4s
    260         %tmp1 = load <4 x i32>, <4 x i32>* %A
    261         %tmp2 = load <4 x i32>, <4 x i32>* %B
    262         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
    263         ret <4 x i32> %tmp3
    264 }
    265 
    266 define <2 x i64> @urshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    267 ;CHECK-LABEL: urshl2d:
    268 ;CHECK: urshl.2d
    269         %tmp1 = load <2 x i64>, <2 x i64>* %A
    270         %tmp2 = load <2 x i64>, <2 x i64>* %B
    271         %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
    272         ret <2 x i64> %tmp3
    273 }
    274 
    275 declare <8 x i8>  @llvm.aarch64.neon.srshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    276 declare <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    277 declare <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    278 declare <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    279 
    280 declare <8 x i8>  @llvm.aarch64.neon.urshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    281 declare <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    282 declare <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    283 declare <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    284 
    285 declare <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    286 declare <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    287 declare <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    288 declare <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    289 
    290 declare <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    291 declare <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    292 declare <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    293 declare <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    294 
    295 define <8 x i8> @sqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    296 ;CHECK-LABEL: sqrshl8b:
    297 ;CHECK: sqrshl.8b
    298         %tmp1 = load <8 x i8>, <8 x i8>* %A
    299         %tmp2 = load <8 x i8>, <8 x i8>* %B
    300         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
    301         ret <8 x i8> %tmp3
    302 }
    303 
    304 define <4 x i16> @sqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    305 ;CHECK-LABEL: sqrshl4h:
    306 ;CHECK: sqrshl.4h
    307         %tmp1 = load <4 x i16>, <4 x i16>* %A
    308         %tmp2 = load <4 x i16>, <4 x i16>* %B
    309         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
    310         ret <4 x i16> %tmp3
    311 }
    312 
    313 define <2 x i32> @sqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    314 ;CHECK-LABEL: sqrshl2s:
    315 ;CHECK: sqrshl.2s
    316         %tmp1 = load <2 x i32>, <2 x i32>* %A
    317         %tmp2 = load <2 x i32>, <2 x i32>* %B
    318         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
    319         ret <2 x i32> %tmp3
    320 }
    321 
    322 define <8 x i8> @uqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    323 ;CHECK-LABEL: uqrshl8b:
    324 ;CHECK: uqrshl.8b
    325         %tmp1 = load <8 x i8>, <8 x i8>* %A
    326         %tmp2 = load <8 x i8>, <8 x i8>* %B
    327         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
    328         ret <8 x i8> %tmp3
    329 }
    330 
    331 define <4 x i16> @uqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    332 ;CHECK-LABEL: uqrshl4h:
    333 ;CHECK: uqrshl.4h
    334         %tmp1 = load <4 x i16>, <4 x i16>* %A
    335         %tmp2 = load <4 x i16>, <4 x i16>* %B
    336         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
    337         ret <4 x i16> %tmp3
    338 }
    339 
    340 define <2 x i32> @uqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    341 ;CHECK-LABEL: uqrshl2s:
    342 ;CHECK: uqrshl.2s
    343         %tmp1 = load <2 x i32>, <2 x i32>* %A
    344         %tmp2 = load <2 x i32>, <2 x i32>* %B
    345         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
    346         ret <2 x i32> %tmp3
    347 }
    348 
    349 define <16 x i8> @sqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    350 ;CHECK-LABEL: sqrshl16b:
    351 ;CHECK: sqrshl.16b
    352         %tmp1 = load <16 x i8>, <16 x i8>* %A
    353         %tmp2 = load <16 x i8>, <16 x i8>* %B
    354         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
    355         ret <16 x i8> %tmp3
    356 }
    357 
    358 define <8 x i16> @sqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    359 ;CHECK-LABEL: sqrshl8h:
    360 ;CHECK: sqrshl.8h
    361         %tmp1 = load <8 x i16>, <8 x i16>* %A
    362         %tmp2 = load <8 x i16>, <8 x i16>* %B
    363         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
    364         ret <8 x i16> %tmp3
    365 }
    366 
    367 define <4 x i32> @sqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    368 ;CHECK-LABEL: sqrshl4s:
    369 ;CHECK: sqrshl.4s
    370         %tmp1 = load <4 x i32>, <4 x i32>* %A
    371         %tmp2 = load <4 x i32>, <4 x i32>* %B
    372         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
    373         ret <4 x i32> %tmp3
    374 }
    375 
    376 define <2 x i64> @sqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    377 ;CHECK-LABEL: sqrshl2d:
    378 ;CHECK: sqrshl.2d
    379         %tmp1 = load <2 x i64>, <2 x i64>* %A
    380         %tmp2 = load <2 x i64>, <2 x i64>* %B
    381         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
    382         ret <2 x i64> %tmp3
    383 }
    384 
    385 define <16 x i8> @uqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    386 ;CHECK-LABEL: uqrshl16b:
    387 ;CHECK: uqrshl.16b
    388         %tmp1 = load <16 x i8>, <16 x i8>* %A
    389         %tmp2 = load <16 x i8>, <16 x i8>* %B
    390         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
    391         ret <16 x i8> %tmp3
    392 }
    393 
    394 define <8 x i16> @uqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    395 ;CHECK-LABEL: uqrshl8h:
    396 ;CHECK: uqrshl.8h
    397         %tmp1 = load <8 x i16>, <8 x i16>* %A
    398         %tmp2 = load <8 x i16>, <8 x i16>* %B
    399         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
    400         ret <8 x i16> %tmp3
    401 }
    402 
    403 define <4 x i32> @uqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    404 ;CHECK-LABEL: uqrshl4s:
    405 ;CHECK: uqrshl.4s
    406         %tmp1 = load <4 x i32>, <4 x i32>* %A
    407         %tmp2 = load <4 x i32>, <4 x i32>* %B
    408         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
    409         ret <4 x i32> %tmp3
    410 }
    411 
    412 define <2 x i64> @uqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    413 ;CHECK-LABEL: uqrshl2d:
    414 ;CHECK: uqrshl.2d
    415         %tmp1 = load <2 x i64>, <2 x i64>* %A
    416         %tmp2 = load <2 x i64>, <2 x i64>* %B
    417         %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
    418         ret <2 x i64> %tmp3
    419 }
    420 
    421 declare <8 x i8>  @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    422 declare <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    423 declare <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    424 declare <1 x i64> @llvm.aarch64.neon.sqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    425 
    426 declare <8 x i8>  @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    427 declare <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    428 declare <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    429 declare <1 x i64> @llvm.aarch64.neon.uqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    430 
    431 declare <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    432 declare <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    433 declare <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    434 declare <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    435 
    436 declare <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    437 declare <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    438 declare <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    439 declare <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    440 
    441 define <8 x i8> @urshr8b(<8 x i8>* %A) nounwind {
    442 ;CHECK-LABEL: urshr8b:
    443 ;CHECK: urshr.8b
    444         %tmp1 = load <8 x i8>, <8 x i8>* %A
    445         %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
    446         ret <8 x i8> %tmp3
    447 }
    448 
    449 define <4 x i16> @urshr4h(<4 x i16>* %A) nounwind {
    450 ;CHECK-LABEL: urshr4h:
    451 ;CHECK: urshr.4h
    452         %tmp1 = load <4 x i16>, <4 x i16>* %A
    453         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
    454         ret <4 x i16> %tmp3
    455 }
    456 
    457 define <2 x i32> @urshr2s(<2 x i32>* %A) nounwind {
    458 ;CHECK-LABEL: urshr2s:
    459 ;CHECK: urshr.2s
    460         %tmp1 = load <2 x i32>, <2 x i32>* %A
    461         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
    462         ret <2 x i32> %tmp3
    463 }
    464 
    465 define <16 x i8> @urshr16b(<16 x i8>* %A) nounwind {
    466 ;CHECK-LABEL: urshr16b:
    467 ;CHECK: urshr.16b
    468         %tmp1 = load <16 x i8>, <16 x i8>* %A
    469         %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
    470         ret <16 x i8> %tmp3
    471 }
    472 
    473 define <8 x i16> @urshr8h(<8 x i16>* %A) nounwind {
    474 ;CHECK-LABEL: urshr8h:
    475 ;CHECK: urshr.8h
    476         %tmp1 = load <8 x i16>, <8 x i16>* %A
    477         %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
    478         ret <8 x i16> %tmp3
    479 }
    480 
    481 define <4 x i32> @urshr4s(<4 x i32>* %A) nounwind {
    482 ;CHECK-LABEL: urshr4s:
    483 ;CHECK: urshr.4s
    484         %tmp1 = load <4 x i32>, <4 x i32>* %A
    485         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
    486         ret <4 x i32> %tmp3
    487 }
    488 
    489 define <2 x i64> @urshr2d(<2 x i64>* %A) nounwind {
    490 ;CHECK-LABEL: urshr2d:
    491 ;CHECK: urshr.2d
    492         %tmp1 = load <2 x i64>, <2 x i64>* %A
    493         %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
    494         ret <2 x i64> %tmp3
    495 }
    496 
    497 define <8 x i8> @srshr8b(<8 x i8>* %A) nounwind {
    498 ;CHECK-LABEL: srshr8b:
    499 ;CHECK: srshr.8b
    500         %tmp1 = load <8 x i8>, <8 x i8>* %A
    501         %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
    502         ret <8 x i8> %tmp3
    503 }
    504 
    505 define <4 x i16> @srshr4h(<4 x i16>* %A) nounwind {
    506 ;CHECK-LABEL: srshr4h:
    507 ;CHECK: srshr.4h
    508         %tmp1 = load <4 x i16>, <4 x i16>* %A
    509         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
    510         ret <4 x i16> %tmp3
    511 }
    512 
    513 define <2 x i32> @srshr2s(<2 x i32>* %A) nounwind {
    514 ;CHECK-LABEL: srshr2s:
    515 ;CHECK: srshr.2s
    516         %tmp1 = load <2 x i32>, <2 x i32>* %A
    517         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
    518         ret <2 x i32> %tmp3
    519 }
    520 
    521 define <16 x i8> @srshr16b(<16 x i8>* %A) nounwind {
    522 ;CHECK-LABEL: srshr16b:
    523 ;CHECK: srshr.16b
    524         %tmp1 = load <16 x i8>, <16 x i8>* %A
    525         %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
    526         ret <16 x i8> %tmp3
    527 }
    528 
    529 define <8 x i16> @srshr8h(<8 x i16>* %A) nounwind {
    530 ;CHECK-LABEL: srshr8h:
    531 ;CHECK: srshr.8h
    532         %tmp1 = load <8 x i16>, <8 x i16>* %A
    533         %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
    534         ret <8 x i16> %tmp3
    535 }
    536 
    537 define <4 x i32> @srshr4s(<4 x i32>* %A) nounwind {
    538 ;CHECK-LABEL: srshr4s:
    539 ;CHECK: srshr.4s
    540         %tmp1 = load <4 x i32>, <4 x i32>* %A
    541         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
    542         ret <4 x i32> %tmp3
    543 }
    544 
    545 define <2 x i64> @srshr2d(<2 x i64>* %A) nounwind {
    546 ;CHECK-LABEL: srshr2d:
    547 ;CHECK: srshr.2d
    548         %tmp1 = load <2 x i64>, <2 x i64>* %A
    549         %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
    550         ret <2 x i64> %tmp3
    551 }
    552 
    553 define <8 x i8> @sqshlu8b(<8 x i8>* %A) nounwind {
    554 ;CHECK-LABEL: sqshlu8b:
    555 ;CHECK: sqshlu.8b v0, {{v[0-9]+}}, #1
    556         %tmp1 = load <8 x i8>, <8 x i8>* %A
    557         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshlu.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
    558         ret <8 x i8> %tmp3
    559 }
    560 
    561 define <4 x i16> @sqshlu4h(<4 x i16>* %A) nounwind {
    562 ;CHECK-LABEL: sqshlu4h:
    563 ;CHECK: sqshlu.4h v0, {{v[0-9]+}}, #1
    564         %tmp1 = load <4 x i16>, <4 x i16>* %A
    565         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshlu.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
    566         ret <4 x i16> %tmp3
    567 }
    568 
    569 define <2 x i32> @sqshlu2s(<2 x i32>* %A) nounwind {
    570 ;CHECK-LABEL: sqshlu2s:
    571 ;CHECK: sqshlu.2s v0, {{v[0-9]+}}, #1
    572         %tmp1 = load <2 x i32>, <2 x i32>* %A
    573         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshlu.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
    574         ret <2 x i32> %tmp3
    575 }
    576 
    577 define <16 x i8> @sqshlu16b(<16 x i8>* %A) nounwind {
    578 ;CHECK-LABEL: sqshlu16b:
    579 ;CHECK: sqshlu.16b v0, {{v[0-9]+}}, #1
    580         %tmp1 = load <16 x i8>, <16 x i8>* %A
    581         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshlu.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
    582         ret <16 x i8> %tmp3
    583 }
    584 
    585 define <8 x i16> @sqshlu8h(<8 x i16>* %A) nounwind {
    586 ;CHECK-LABEL: sqshlu8h:
    587 ;CHECK: sqshlu.8h v0, {{v[0-9]+}}, #1
    588         %tmp1 = load <8 x i16>, <8 x i16>* %A
    589         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshlu.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
    590         ret <8 x i16> %tmp3
    591 }
    592 
    593 define <4 x i32> @sqshlu4s(<4 x i32>* %A) nounwind {
    594 ;CHECK-LABEL: sqshlu4s:
    595 ;CHECK: sqshlu.4s v0, {{v[0-9]+}}, #1
    596         %tmp1 = load <4 x i32>, <4 x i32>* %A
    597         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshlu.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
    598         ret <4 x i32> %tmp3
    599 }
    600 
    601 define <2 x i64> @sqshlu2d(<2 x i64>* %A) nounwind {
    602 ;CHECK-LABEL: sqshlu2d:
    603 ;CHECK: sqshlu.2d v0, {{v[0-9]+}}, #1
    604         %tmp1 = load <2 x i64>, <2 x i64>* %A
    605         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
    606         ret <2 x i64> %tmp3
    607 }
    608 
    609 declare <8 x i8>  @llvm.aarch64.neon.sqshlu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    610 declare <4 x i16> @llvm.aarch64.neon.sqshlu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    611 declare <2 x i32> @llvm.aarch64.neon.sqshlu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    612 declare <1 x i64> @llvm.aarch64.neon.sqshlu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
    613 
    614 declare <16 x i8> @llvm.aarch64.neon.sqshlu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    615 declare <8 x i16> @llvm.aarch64.neon.sqshlu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    616 declare <4 x i32> @llvm.aarch64.neon.sqshlu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    617 declare <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
    618 
    619 define <8 x i8> @rshrn8b(<8 x i16>* %A) nounwind {
    620 ;CHECK-LABEL: rshrn8b:
    621 ;CHECK: rshrn.8b v0, {{v[0-9]+}}, #1
    622         %tmp1 = load <8 x i16>, <8 x i16>* %A
    623         %tmp3 = call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)
    624         ret <8 x i8> %tmp3
    625 }
    626 
    627 define <4 x i16> @rshrn4h(<4 x i32>* %A) nounwind {
    628 ;CHECK-LABEL: rshrn4h:
    629 ;CHECK: rshrn.4h v0, {{v[0-9]+}}, #1
    630         %tmp1 = load <4 x i32>, <4 x i32>* %A
    631         %tmp3 = call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)
    632         ret <4 x i16> %tmp3
    633 }
    634 
    635 define <2 x i32> @rshrn2s(<2 x i64>* %A) nounwind {
    636 ;CHECK-LABEL: rshrn2s:
    637 ;CHECK: rshrn.2s v0, {{v[0-9]+}}, #1
    638         %tmp1 = load <2 x i64>, <2 x i64>* %A
    639         %tmp3 = call <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)
    640         ret <2 x i32> %tmp3
    641 }
    642 
    643 define <16 x i8> @rshrn16b(<8 x i8> *%ret, <8 x i16>* %A) nounwind {
    644 ;CHECK-LABEL: rshrn16b:
    645 ;CHECK: rshrn2.16b v0, {{v[0-9]+}}, #1
    646         %out = load <8 x i8>, <8 x i8>* %ret
    647         %tmp1 = load <8 x i16>, <8 x i16>* %A
    648         %tmp3 = call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)
    649         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    650         ret <16 x i8> %tmp4
    651 }
    652 
    653 define <8 x i16> @rshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    654 ;CHECK-LABEL: rshrn8h:
    655 ;CHECK: rshrn2.8h v0, {{v[0-9]+}}, #1
    656         %out = load <4 x i16>, <4 x i16>* %ret
    657         %tmp1 = load <4 x i32>, <4 x i32>* %A
    658         %tmp3 = call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)
    659         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    660         ret <8 x i16> %tmp4
    661 }
    662 
    663 define <4 x i32> @rshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    664 ;CHECK-LABEL: rshrn4s:
    665 ;CHECK: rshrn2.4s v0, {{v[0-9]+}}, #1
    666         %out = load <2 x i32>, <2 x i32>* %ret
    667         %tmp1 = load <2 x i64>, <2 x i64>* %A
    668         %tmp3 = call <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)
    669         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    670         ret <4 x i32> %tmp4
    671 }
    672 
    673 declare <8 x i8>  @llvm.aarch64.neon.rshrn.v8i8(<8 x i16>, i32) nounwind readnone
    674 declare <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32>, i32) nounwind readnone
    675 declare <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64>, i32) nounwind readnone
    676 
    677 define <8 x i8> @shrn8b(<8 x i16>* %A) nounwind {
    678 ;CHECK-LABEL: shrn8b:
    679 ;CHECK: shrn.8b v0, {{v[0-9]+}}, #1
    680         %tmp1 = load <8 x i16>, <8 x i16>* %A
    681         %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    682         %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>
    683         ret <8 x i8> %tmp3
    684 }
    685 
    686 define <4 x i16> @shrn4h(<4 x i32>* %A) nounwind {
    687 ;CHECK-LABEL: shrn4h:
    688 ;CHECK: shrn.4h v0, {{v[0-9]+}}, #1
    689         %tmp1 = load <4 x i32>, <4 x i32>* %A
    690         %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
    691         %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>
    692         ret <4 x i16> %tmp3
    693 }
    694 
    695 define <2 x i32> @shrn2s(<2 x i64>* %A) nounwind {
    696 ;CHECK-LABEL: shrn2s:
    697 ;CHECK: shrn.2s v0, {{v[0-9]+}}, #1
    698         %tmp1 = load <2 x i64>, <2 x i64>* %A
    699         %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
    700         %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>
    701         ret <2 x i32> %tmp3
    702 }
    703 
    704 define <16 x i8> @shrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
    705 ;CHECK-LABEL: shrn16b:
    706 ;CHECK: shrn2.16b v0, {{v[0-9]+}}, #1
    707         %out = load <8 x i8>, <8 x i8>* %ret
    708         %tmp1 = load <8 x i16>, <8 x i16>* %A
    709         %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    710         %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>
    711         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    712         ret <16 x i8> %tmp4
    713 }
    714 
    715 define <8 x i16> @shrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    716 ;CHECK-LABEL: shrn8h:
    717 ;CHECK: shrn2.8h v0, {{v[0-9]+}}, #1
    718         %out = load <4 x i16>, <4 x i16>* %ret
    719         %tmp1 = load <4 x i32>, <4 x i32>* %A
    720         %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
    721         %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>
    722         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    723         ret <8 x i16> %tmp4
    724 }
    725 
    726 define <4 x i32> @shrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    727 ;CHECK-LABEL: shrn4s:
    728 ;CHECK: shrn2.4s v0, {{v[0-9]+}}, #1
    729         %out = load <2 x i32>, <2 x i32>* %ret
    730         %tmp1 = load <2 x i64>, <2 x i64>* %A
    731         %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
    732         %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>
    733         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    734         ret <4 x i32> %tmp4
    735 }
    736 
    737 declare <8 x i8>  @llvm.aarch64.neon.shrn.v8i8(<8 x i16>, i32) nounwind readnone
    738 declare <4 x i16> @llvm.aarch64.neon.shrn.v4i16(<4 x i32>, i32) nounwind readnone
    739 declare <2 x i32> @llvm.aarch64.neon.shrn.v2i32(<2 x i64>, i32) nounwind readnone
    740 
    741 define i32 @sqshrn1s(i64 %A) nounwind {
    742 ; CHECK-LABEL: sqshrn1s:
    743 ; CHECK: sqshrn {{s[0-9]+}}, d0, #1
    744   %tmp = call i32 @llvm.aarch64.neon.sqshrn.i32(i64 %A, i32 1)
    745   ret i32 %tmp
    746 }
    747 
    748 define <8 x i8> @sqshrn8b(<8 x i16>* %A) nounwind {
    749 ;CHECK-LABEL: sqshrn8b:
    750 ;CHECK: sqshrn.8b v0, {{v[0-9]+}}, #1
    751         %tmp1 = load <8 x i16>, <8 x i16>* %A
    752         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)
    753         ret <8 x i8> %tmp3
    754 }
    755 
    756 define <4 x i16> @sqshrn4h(<4 x i32>* %A) nounwind {
    757 ;CHECK-LABEL: sqshrn4h:
    758 ;CHECK: sqshrn.4h v0, {{v[0-9]+}}, #1
    759         %tmp1 = load <4 x i32>, <4 x i32>* %A
    760         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)
    761         ret <4 x i16> %tmp3
    762 }
    763 
    764 define <2 x i32> @sqshrn2s(<2 x i64>* %A) nounwind {
    765 ;CHECK-LABEL: sqshrn2s:
    766 ;CHECK: sqshrn.2s v0, {{v[0-9]+}}, #1
    767         %tmp1 = load <2 x i64>, <2 x i64>* %A
    768         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)
    769         ret <2 x i32> %tmp3
    770 }
    771 
    772 
    773 define <16 x i8> @sqshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
    774 ;CHECK-LABEL: sqshrn16b:
    775 ;CHECK: sqshrn2.16b v0, {{v[0-9]+}}, #1
    776         %out = load <8 x i8>, <8 x i8>* %ret
    777         %tmp1 = load <8 x i16>, <8 x i16>* %A
    778         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)
    779         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    780         ret <16 x i8> %tmp4
    781 }
    782 
    783 define <8 x i16> @sqshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    784 ;CHECK-LABEL: sqshrn8h:
    785 ;CHECK: sqshrn2.8h v0, {{v[0-9]+}}, #1
    786         %out = load <4 x i16>, <4 x i16>* %ret
    787         %tmp1 = load <4 x i32>, <4 x i32>* %A
    788         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)
    789         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    790         ret <8 x i16> %tmp4
    791 }
    792 
    793 define <4 x i32> @sqshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    794 ;CHECK-LABEL: sqshrn4s:
    795 ;CHECK: sqshrn2.4s v0, {{v[0-9]+}}, #1
    796         %out = load <2 x i32>, <2 x i32>* %ret
    797         %tmp1 = load <2 x i64>, <2 x i64>* %A
    798         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)
    799         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    800         ret <4 x i32> %tmp4
    801 }
    802 
    803 declare i32  @llvm.aarch64.neon.sqshrn.i32(i64, i32) nounwind readnone
    804 declare <8 x i8>  @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16>, i32) nounwind readnone
    805 declare <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32>, i32) nounwind readnone
    806 declare <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64>, i32) nounwind readnone
    807 
    808 define i32 @sqshrun1s(i64 %A) nounwind {
    809 ; CHECK-LABEL: sqshrun1s:
    810 ; CHECK: sqshrun {{s[0-9]+}}, d0, #1
    811   %tmp = call i32 @llvm.aarch64.neon.sqshrun.i32(i64 %A, i32 1)
    812   ret i32 %tmp
    813 }
    814 
    815 define <8 x i8> @sqshrun8b(<8 x i16>* %A) nounwind {
    816 ;CHECK-LABEL: sqshrun8b:
    817 ;CHECK: sqshrun.8b v0, {{v[0-9]+}}, #1
    818         %tmp1 = load <8 x i16>, <8 x i16>* %A
    819         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)
    820         ret <8 x i8> %tmp3
    821 }
    822 
    823 define <4 x i16> @sqshrun4h(<4 x i32>* %A) nounwind {
    824 ;CHECK-LABEL: sqshrun4h:
    825 ;CHECK: sqshrun.4h v0, {{v[0-9]+}}, #1
    826         %tmp1 = load <4 x i32>, <4 x i32>* %A
    827         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)
    828         ret <4 x i16> %tmp3
    829 }
    830 
    831 define <2 x i32> @sqshrun2s(<2 x i64>* %A) nounwind {
    832 ;CHECK-LABEL: sqshrun2s:
    833 ;CHECK: sqshrun.2s v0, {{v[0-9]+}}, #1
    834         %tmp1 = load <2 x i64>, <2 x i64>* %A
    835         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)
    836         ret <2 x i32> %tmp3
    837 }
    838 
    839 define <16 x i8> @sqshrun16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
    840 ;CHECK-LABEL: sqshrun16b:
    841 ;CHECK: sqshrun2.16b v0, {{v[0-9]+}}, #1
    842         %out = load <8 x i8>, <8 x i8>* %ret
    843         %tmp1 = load <8 x i16>, <8 x i16>* %A
    844         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)
    845         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    846         ret <16 x i8> %tmp4
    847 }
    848 
    849 define <8 x i16> @sqshrun8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    850 ;CHECK-LABEL: sqshrun8h:
    851 ;CHECK: sqshrun2.8h v0, {{v[0-9]+}}, #1
    852         %out = load <4 x i16>, <4 x i16>* %ret
    853         %tmp1 = load <4 x i32>, <4 x i32>* %A
    854         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)
    855         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    856         ret <8 x i16> %tmp4
    857 }
    858 
    859 define <4 x i32> @sqshrun4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    860 ;CHECK-LABEL: sqshrun4s:
    861 ;CHECK: sqshrun2.4s v0, {{v[0-9]+}}, #1
    862         %out = load <2 x i32>, <2 x i32>* %ret
    863         %tmp1 = load <2 x i64>, <2 x i64>* %A
    864         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)
    865         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    866         ret <4 x i32> %tmp4
    867 }
    868 
    869 declare i32  @llvm.aarch64.neon.sqshrun.i32(i64, i32) nounwind readnone
    870 declare <8 x i8>  @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16>, i32) nounwind readnone
    871 declare <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32>, i32) nounwind readnone
    872 declare <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64>, i32) nounwind readnone
    873 
    874 define i32 @sqrshrn1s(i64 %A) nounwind {
    875 ; CHECK-LABEL: sqrshrn1s:
    876 ; CHECK: sqrshrn {{s[0-9]+}}, d0, #1
    877   %tmp = call i32 @llvm.aarch64.neon.sqrshrn.i32(i64 %A, i32 1)
    878   ret i32 %tmp
    879 }
    880 
    881 define <8 x i8> @sqrshrn8b(<8 x i16>* %A) nounwind {
    882 ;CHECK-LABEL: sqrshrn8b:
    883 ;CHECK: sqrshrn.8b v0, {{v[0-9]+}}, #1
    884         %tmp1 = load <8 x i16>, <8 x i16>* %A
    885         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
    886         ret <8 x i8> %tmp3
    887 }
    888 
    889 define <4 x i16> @sqrshrn4h(<4 x i32>* %A) nounwind {
    890 ;CHECK-LABEL: sqrshrn4h:
    891 ;CHECK: sqrshrn.4h v0, {{v[0-9]+}}, #1
    892         %tmp1 = load <4 x i32>, <4 x i32>* %A
    893         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
    894         ret <4 x i16> %tmp3
    895 }
    896 
    897 define <2 x i32> @sqrshrn2s(<2 x i64>* %A) nounwind {
    898 ;CHECK-LABEL: sqrshrn2s:
    899 ;CHECK: sqrshrn.2s v0, {{v[0-9]+}}, #1
    900         %tmp1 = load <2 x i64>, <2 x i64>* %A
    901         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
    902         ret <2 x i32> %tmp3
    903 }
    904 
    905 define <16 x i8> @sqrshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
    906 ;CHECK-LABEL: sqrshrn16b:
    907 ;CHECK: sqrshrn2.16b v0, {{v[0-9]+}}, #1
    908         %out = load <8 x i8>, <8 x i8>* %ret
    909         %tmp1 = load <8 x i16>, <8 x i16>* %A
    910         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
    911         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    912         ret <16 x i8> %tmp4
    913 }
    914 
    915 define <8 x i16> @sqrshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    916 ;CHECK-LABEL: sqrshrn8h:
    917 ;CHECK: sqrshrn2.8h v0, {{v[0-9]+}}, #1
    918         %out = load <4 x i16>, <4 x i16>* %ret
    919         %tmp1 = load <4 x i32>, <4 x i32>* %A
    920         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
    921         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    922         ret <8 x i16> %tmp4
    923 }
    924 
    925 define <4 x i32> @sqrshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    926 ;CHECK-LABEL: sqrshrn4s:
    927 ;CHECK: sqrshrn2.4s v0, {{v[0-9]+}}, #1
    928         %out = load <2 x i32>, <2 x i32>* %ret
    929         %tmp1 = load <2 x i64>, <2 x i64>* %A
    930         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
    931         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    932         ret <4 x i32> %tmp4
    933 }
    934 
    935 declare i32  @llvm.aarch64.neon.sqrshrn.i32(i64, i32) nounwind readnone
    936 declare <8 x i8>  @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
    937 declare <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
    938 declare <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
    939 
    940 define i32 @sqrshrun1s(i64 %A) nounwind {
    941 ; CHECK-LABEL: sqrshrun1s:
    942 ; CHECK: sqrshrun {{s[0-9]+}}, d0, #1
    943   %tmp = call i32 @llvm.aarch64.neon.sqrshrun.i32(i64 %A, i32 1)
    944   ret i32 %tmp
    945 }
    946 
    947 define <8 x i8> @sqrshrun8b(<8 x i16>* %A) nounwind {
    948 ;CHECK-LABEL: sqrshrun8b:
    949 ;CHECK: sqrshrun.8b v0, {{v[0-9]+}}, #1
    950         %tmp1 = load <8 x i16>, <8 x i16>* %A
    951         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)
    952         ret <8 x i8> %tmp3
    953 }
    954 
    955 define <4 x i16> @sqrshrun4h(<4 x i32>* %A) nounwind {
    956 ;CHECK-LABEL: sqrshrun4h:
    957 ;CHECK: sqrshrun.4h v0, {{v[0-9]+}}, #1
    958         %tmp1 = load <4 x i32>, <4 x i32>* %A
    959         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)
    960         ret <4 x i16> %tmp3
    961 }
    962 
    963 define <2 x i32> @sqrshrun2s(<2 x i64>* %A) nounwind {
    964 ;CHECK-LABEL: sqrshrun2s:
    965 ;CHECK: sqrshrun.2s v0, {{v[0-9]+}}, #1
    966         %tmp1 = load <2 x i64>, <2 x i64>* %A
    967         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)
    968         ret <2 x i32> %tmp3
    969 }
    970 
    971 define <16 x i8> @sqrshrun16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
    972 ;CHECK-LABEL: sqrshrun16b:
    973 ;CHECK: sqrshrun2.16b v0, {{v[0-9]+}}, #1
    974         %out = load <8 x i8>, <8 x i8>* %ret
    975         %tmp1 = load <8 x i16>, <8 x i16>* %A
    976         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)
    977         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    978         ret <16 x i8> %tmp4
    979 }
    980 
    981 define <8 x i16> @sqrshrun8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
    982 ;CHECK-LABEL: sqrshrun8h:
    983 ;CHECK: sqrshrun2.8h v0, {{v[0-9]+}}, #1
    984         %out = load <4 x i16>, <4 x i16>* %ret
    985         %tmp1 = load <4 x i32>, <4 x i32>* %A
    986         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)
    987         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    988         ret <8 x i16> %tmp4
    989 }
    990 
    991 define <4 x i32> @sqrshrun4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
    992 ;CHECK-LABEL: sqrshrun4s:
    993 ;CHECK: sqrshrun2.4s v0, {{v[0-9]+}}, #1
    994         %out = load <2 x i32>, <2 x i32>* %ret
    995         %tmp1 = load <2 x i64>, <2 x i64>* %A
    996         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)
    997         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    998         ret <4 x i32> %tmp4
    999 }
   1000 
   1001 declare i32  @llvm.aarch64.neon.sqrshrun.i32(i64, i32) nounwind readnone
   1002 declare <8 x i8>  @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16>, i32) nounwind readnone
   1003 declare <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32>, i32) nounwind readnone
   1004 declare <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64>, i32) nounwind readnone
   1005 
   1006 define i32 @uqrshrn1s(i64 %A) nounwind {
   1007 ; CHECK-LABEL: uqrshrn1s:
   1008 ; CHECK: uqrshrn {{s[0-9]+}}, d0, #1
   1009   %tmp = call i32 @llvm.aarch64.neon.uqrshrn.i32(i64 %A, i32 1)
   1010   ret i32 %tmp
   1011 }
   1012 
   1013 define <8 x i8> @uqrshrn8b(<8 x i16>* %A) nounwind {
   1014 ;CHECK-LABEL: uqrshrn8b:
   1015 ;CHECK: uqrshrn.8b v0, {{v[0-9]+}}, #1
   1016         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1017         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
   1018         ret <8 x i8> %tmp3
   1019 }
   1020 
   1021 define <4 x i16> @uqrshrn4h(<4 x i32>* %A) nounwind {
   1022 ;CHECK-LABEL: uqrshrn4h:
   1023 ;CHECK: uqrshrn.4h v0, {{v[0-9]+}}, #1
   1024         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1025         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
   1026         ret <4 x i16> %tmp3
   1027 }
   1028 
   1029 define <2 x i32> @uqrshrn2s(<2 x i64>* %A) nounwind {
   1030 ;CHECK-LABEL: uqrshrn2s:
   1031 ;CHECK: uqrshrn.2s v0, {{v[0-9]+}}, #1
   1032         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1033         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
   1034         ret <2 x i32> %tmp3
   1035 }
   1036 
   1037 define <16 x i8> @uqrshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
   1038 ;CHECK-LABEL: uqrshrn16b:
   1039 ;CHECK: uqrshrn2.16b v0, {{v[0-9]+}}, #1
   1040         %out = load <8 x i8>, <8 x i8>* %ret
   1041         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1042         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
   1043         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
   1044         ret <16 x i8> %tmp4
   1045 }
   1046 
   1047 define <8 x i16> @uqrshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
   1048 ;CHECK-LABEL: uqrshrn8h:
   1049 ;CHECK: uqrshrn2.8h v0, {{v[0-9]+}}, #1
   1050         %out = load <4 x i16>, <4 x i16>* %ret
   1051         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1052         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
   1053         %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
   1054         ret <8 x i16> %tmp4
   1055 }
   1056 
   1057 define <4 x i32> @uqrshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
   1058 ;CHECK-LABEL: uqrshrn4s:
   1059 ;CHECK: uqrshrn2.4s v0, {{v[0-9]+}}, #1
   1060         %out = load <2 x i32>, <2 x i32>* %ret
   1061         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1062         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
   1063         %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
   1064         ret <4 x i32> %tmp4
   1065 }
   1066 
   1067 declare i32  @llvm.aarch64.neon.uqrshrn.i32(i64, i32) nounwind readnone
   1068 declare <8 x i8>  @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
   1069 declare <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
   1070 declare <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
   1071 
   1072 define i32 @uqshrn1s(i64 %A) nounwind {
   1073 ; CHECK-LABEL: uqshrn1s:
   1074 ; CHECK: uqshrn {{s[0-9]+}}, d0, #1
   1075   %tmp = call i32 @llvm.aarch64.neon.uqshrn.i32(i64 %A, i32 1)
   1076   ret i32 %tmp
   1077 }
   1078 
   1079 define <8 x i8> @uqshrn8b(<8 x i16>* %A) nounwind {
   1080 ;CHECK-LABEL: uqshrn8b:
   1081 ;CHECK: uqshrn.8b v0, {{v[0-9]+}}, #1
   1082         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1083         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)
   1084         ret <8 x i8> %tmp3
   1085 }
   1086 
   1087 define <4 x i16> @uqshrn4h(<4 x i32>* %A) nounwind {
   1088 ;CHECK-LABEL: uqshrn4h:
   1089 ;CHECK: uqshrn.4h v0, {{v[0-9]+}}, #1
   1090         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1091         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)
   1092         ret <4 x i16> %tmp3
   1093 }
   1094 
   1095 define <2 x i32> @uqshrn2s(<2 x i64>* %A) nounwind {
   1096 ;CHECK-LABEL: uqshrn2s:
   1097 ;CHECK: uqshrn.2s v0, {{v[0-9]+}}, #1
   1098         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1099         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)
   1100         ret <2 x i32> %tmp3
   1101 }
   1102 
   1103 define <16 x i8> @uqshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
   1104 ;CHECK-LABEL: uqshrn16b:
   1105 ;CHECK: uqshrn2.16b v0, {{v[0-9]+}}, #1
   1106         %out = load <8 x i8>, <8 x i8>* %ret
   1107         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1108         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)
   1109         %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
   1110         ret <16 x i8> %tmp4
   1111 }
   1112 
   1113 define <8 x i16> @uqshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
   1114 ;CHECK-LABEL: uqshrn8h:
   1115 ;CHECK: uqshrn2.8h v0, {{v[0-9]+}}, #1
   1116   %out = load <4 x i16>, <4 x i16>* %ret
   1117   %tmp1 = load <4 x i32>, <4 x i32>* %A
   1118   %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)
   1119   %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
   1120   ret <8 x i16> %tmp4
   1121 }
   1122 
   1123 define <4 x i32> @uqshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
   1124 ;CHECK-LABEL: uqshrn4s:
   1125 ;CHECK: uqshrn2.4s v0, {{v[0-9]+}}, #1
   1126   %out = load <2 x i32>, <2 x i32>* %ret
   1127   %tmp1 = load <2 x i64>, <2 x i64>* %A
   1128   %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)
   1129   %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
   1130   ret <4 x i32> %tmp4
   1131 }
   1132 
   1133 declare i32  @llvm.aarch64.neon.uqshrn.i32(i64, i32) nounwind readnone
   1134 declare <8 x i8>  @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16>, i32) nounwind readnone
   1135 declare <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32>, i32) nounwind readnone
   1136 declare <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64>, i32) nounwind readnone
   1137 
   1138 define <8 x i16> @ushll8h(<8 x i8>* %A) nounwind {
   1139 ;CHECK-LABEL: ushll8h:
   1140 ;CHECK: ushll.8h v0, {{v[0-9]+}}, #1
   1141         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1142         %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>
   1143         %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1144         ret <8 x i16> %tmp3
   1145 }
   1146 
   1147 define <4 x i32> @ushll4s(<4 x i16>* %A) nounwind {
   1148 ;CHECK-LABEL: ushll4s:
   1149 ;CHECK: ushll.4s v0, {{v[0-9]+}}, #1
   1150         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1151         %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>
   1152         %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
   1153         ret <4 x i32> %tmp3
   1154 }
   1155 
   1156 define <2 x i64> @ushll2d(<2 x i32>* %A) nounwind {
   1157 ;CHECK-LABEL: ushll2d:
   1158 ;CHECK: ushll.2d v0, {{v[0-9]+}}, #1
   1159         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1160         %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>
   1161         %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
   1162         ret <2 x i64> %tmp3
   1163 }
   1164 
   1165 define <8 x i16> @ushll2_8h(<16 x i8>* %A) nounwind {
   1166 ;CHECK-LABEL: ushll2_8h:
   1167 ;CHECK: ushll2.8h v0, {{v[0-9]+}}, #1
   1168         %load1 = load <16 x i8>, <16 x i8>* %A
   1169         %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
   1170         %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>
   1171         %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1172         ret <8 x i16> %tmp3
   1173 }
   1174 
   1175 define <4 x i32> @ushll2_4s(<8 x i16>* %A) nounwind {
   1176 ;CHECK-LABEL: ushll2_4s:
   1177 ;CHECK: ushll2.4s v0, {{v[0-9]+}}, #1
   1178         %load1 = load <8 x i16>, <8 x i16>* %A
   1179         %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
   1180         %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>
   1181         %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
   1182         ret <4 x i32> %tmp3
   1183 }
   1184 
   1185 define <2 x i64> @ushll2_2d(<4 x i32>* %A) nounwind {
   1186 ;CHECK-LABEL: ushll2_2d:
   1187 ;CHECK: ushll2.2d v0, {{v[0-9]+}}, #1
   1188         %load1 = load <4 x i32>, <4 x i32>* %A
   1189         %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
   1190         %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>
   1191         %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
   1192         ret <2 x i64> %tmp3
   1193 }
   1194 
   1195 define <8 x i16> @sshll8h(<8 x i8>* %A) nounwind {
   1196 ;CHECK-LABEL: sshll8h:
   1197 ;CHECK: sshll.8h v0, {{v[0-9]+}}, #1
   1198         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1199         %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>
   1200         %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1201         ret <8 x i16> %tmp3
   1202 }
   1203 
   1204 define <4 x i32> @sshll4s(<4 x i16>* %A) nounwind {
   1205 ;CHECK-LABEL: sshll4s:
   1206 ;CHECK: sshll.4s v0, {{v[0-9]+}}, #1
   1207         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1208         %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>
   1209         %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
   1210         ret <4 x i32> %tmp3
   1211 }
   1212 
   1213 define <2 x i64> @sshll2d(<2 x i32>* %A) nounwind {
   1214 ;CHECK-LABEL: sshll2d:
   1215 ;CHECK: sshll.2d v0, {{v[0-9]+}}, #1
   1216         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1217         %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>
   1218         %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
   1219         ret <2 x i64> %tmp3
   1220 }
   1221 
   1222 define <8 x i16> @sshll2_8h(<16 x i8>* %A) nounwind {
   1223 ;CHECK-LABEL: sshll2_8h:
   1224 ;CHECK: sshll2.8h v0, {{v[0-9]+}}, #1
   1225         %load1 = load <16 x i8>, <16 x i8>* %A
   1226         %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
   1227         %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>
   1228         %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1229         ret <8 x i16> %tmp3
   1230 }
   1231 
   1232 define <4 x i32> @sshll2_4s(<8 x i16>* %A) nounwind {
   1233 ;CHECK-LABEL: sshll2_4s:
   1234 ;CHECK: sshll2.4s v0, {{v[0-9]+}}, #1
   1235         %load1 = load <8 x i16>, <8 x i16>* %A
   1236         %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
   1237         %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>
   1238         %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
   1239         ret <4 x i32> %tmp3
   1240 }
   1241 
   1242 define <2 x i64> @sshll2_2d(<4 x i32>* %A) nounwind {
   1243 ;CHECK-LABEL: sshll2_2d:
   1244 ;CHECK: sshll2.2d v0, {{v[0-9]+}}, #1
   1245         %load1 = load <4 x i32>, <4 x i32>* %A
   1246         %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
   1247         %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>
   1248         %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
   1249         ret <2 x i64> %tmp3
   1250 }
   1251 
   1252 define <8 x i8> @sqshli8b(<8 x i8>* %A) nounwind {
   1253 ;CHECK-LABEL: sqshli8b:
   1254 ;CHECK: sqshl.8b v0, {{v[0-9]+}}, #1
   1255         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1256         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
   1257         ret <8 x i8> %tmp3
   1258 }
   1259 
   1260 define <4 x i16> @sqshli4h(<4 x i16>* %A) nounwind {
   1261 ;CHECK-LABEL: sqshli4h:
   1262 ;CHECK: sqshl.4h v0, {{v[0-9]+}}, #1
   1263         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1264         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
   1265         ret <4 x i16> %tmp3
   1266 }
   1267 
   1268 define <2 x i32> @sqshli2s(<2 x i32>* %A) nounwind {
   1269 ;CHECK-LABEL: sqshli2s:
   1270 ;CHECK: sqshl.2s v0, {{v[0-9]+}}, #1
   1271         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1272         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
   1273         ret <2 x i32> %tmp3
   1274 }
   1275 
   1276 define <16 x i8> @sqshli16b(<16 x i8>* %A) nounwind {
   1277 ;CHECK-LABEL: sqshli16b:
   1278 ;CHECK: sqshl.16b v0, {{v[0-9]+}}, #1
   1279         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1280         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
   1281         ret <16 x i8> %tmp3
   1282 }
   1283 
   1284 define <8 x i16> @sqshli8h(<8 x i16>* %A) nounwind {
   1285 ;CHECK-LABEL: sqshli8h:
   1286 ;CHECK: sqshl.8h v0, {{v[0-9]+}}, #1
   1287         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1288         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
   1289         ret <8 x i16> %tmp3
   1290 }
   1291 
   1292 define <4 x i32> @sqshli4s(<4 x i32>* %A) nounwind {
   1293 ;CHECK-LABEL: sqshli4s:
   1294 ;CHECK: sqshl.4s v0, {{v[0-9]+}}, #1
   1295         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1296         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
   1297         ret <4 x i32> %tmp3
   1298 }
   1299 
   1300 define <2 x i64> @sqshli2d(<2 x i64>* %A) nounwind {
   1301 ;CHECK-LABEL: sqshli2d:
   1302 ;CHECK: sqshl.2d v0, {{v[0-9]+}}, #1
   1303         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1304         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
   1305         ret <2 x i64> %tmp3
   1306 }
   1307 
   1308 define <8 x i8> @uqshli8b(<8 x i8>* %A) nounwind {
   1309 ;CHECK-LABEL: uqshli8b:
   1310 ;CHECK: uqshl.8b v0, {{v[0-9]+}}, #1
   1311         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1312         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
   1313         ret <8 x i8> %tmp3
   1314 }
   1315 
   1316 define <8 x i8> @uqshli8b_1(<8 x i8>* %A) nounwind {
   1317 ;CHECK-LABEL: uqshli8b_1:
   1318 ;CHECK: movi.8b [[REG:v[0-9]+]], #8
   1319 ;CHECK: uqshl.8b v0, v0, [[REG]]
   1320         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1321         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>)
   1322         ret <8 x i8> %tmp3
   1323 }
   1324 
   1325 define <4 x i16> @uqshli4h(<4 x i16>* %A) nounwind {
   1326 ;CHECK-LABEL: uqshli4h:
   1327 ;CHECK: uqshl.4h v0, {{v[0-9]+}}, #1
   1328         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1329         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
   1330         ret <4 x i16> %tmp3
   1331 }
   1332 
   1333 define <2 x i32> @uqshli2s(<2 x i32>* %A) nounwind {
   1334 ;CHECK-LABEL: uqshli2s:
   1335 ;CHECK: uqshl.2s v0, {{v[0-9]+}}, #1
   1336         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1337         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
   1338         ret <2 x i32> %tmp3
   1339 }
   1340 
   1341 define <16 x i8> @uqshli16b(<16 x i8>* %A) nounwind {
   1342 ;CHECK-LABEL: uqshli16b:
   1343 ;CHECK: uqshl.16b
   1344         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1345         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
   1346         ret <16 x i8> %tmp3
   1347 }
   1348 
   1349 define <8 x i16> @uqshli8h(<8 x i16>* %A) nounwind {
   1350 ;CHECK-LABEL: uqshli8h:
   1351 ;CHECK: uqshl.8h v0, {{v[0-9]+}}, #1
   1352         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1353         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
   1354         ret <8 x i16> %tmp3
   1355 }
   1356 
   1357 define <4 x i32> @uqshli4s(<4 x i32>* %A) nounwind {
   1358 ;CHECK-LABEL: uqshli4s:
   1359 ;CHECK: uqshl.4s v0, {{v[0-9]+}}, #1
   1360         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1361         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
   1362         ret <4 x i32> %tmp3
   1363 }
   1364 
   1365 define <2 x i64> @uqshli2d(<2 x i64>* %A) nounwind {
   1366 ;CHECK-LABEL: uqshli2d:
   1367 ;CHECK: uqshl.2d v0, {{v[0-9]+}}, #1
   1368         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1369         %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
   1370         ret <2 x i64> %tmp3
   1371 }
   1372 
   1373 define <8 x i8> @ursra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1374 ;CHECK-LABEL: ursra8b:
   1375 ;CHECK: ursra.8b v0, {{v[0-9]+}}, #1
   1376         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1377         %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
   1378         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1379         %tmp5 = add <8 x i8> %tmp3, %tmp4
   1380         ret <8 x i8> %tmp5
   1381 }
   1382 
   1383 define <4 x i16> @ursra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1384 ;CHECK-LABEL: ursra4h:
   1385 ;CHECK: ursra.4h v0, {{v[0-9]+}}, #1
   1386         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1387         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
   1388         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1389         %tmp5 = add <4 x i16> %tmp3, %tmp4
   1390         ret <4 x i16> %tmp5
   1391 }
   1392 
   1393 define <2 x i32> @ursra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1394 ;CHECK-LABEL: ursra2s:
   1395 ;CHECK: ursra.2s v0, {{v[0-9]+}}, #1
   1396         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1397         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
   1398         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1399         %tmp5 = add <2 x i32> %tmp3, %tmp4
   1400         ret <2 x i32> %tmp5
   1401 }
   1402 
   1403 define <16 x i8> @ursra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1404 ;CHECK-LABEL: ursra16b:
   1405 ;CHECK: ursra.16b v0, {{v[0-9]+}}, #1
   1406         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1407         %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
   1408         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1409         %tmp5 = add <16 x i8> %tmp3, %tmp4
   1410          ret <16 x i8> %tmp5
   1411 }
   1412 
   1413 define <8 x i16> @ursra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1414 ;CHECK-LABEL: ursra8h:
   1415 ;CHECK: ursra.8h v0, {{v[0-9]+}}, #1
   1416         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1417         %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
   1418         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1419         %tmp5 = add <8 x i16> %tmp3, %tmp4
   1420          ret <8 x i16> %tmp5
   1421 }
   1422 
   1423 define <4 x i32> @ursra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1424 ;CHECK-LABEL: ursra4s:
   1425 ;CHECK: ursra.4s v0, {{v[0-9]+}}, #1
   1426         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1427         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
   1428         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1429         %tmp5 = add <4 x i32> %tmp3, %tmp4
   1430          ret <4 x i32> %tmp5
   1431 }
   1432 
   1433 define <2 x i64> @ursra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1434 ;CHECK-LABEL: ursra2d:
   1435 ;CHECK: ursra.2d v0, {{v[0-9]+}}, #1
   1436         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1437         %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
   1438         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1439         %tmp5 = add <2 x i64> %tmp3, %tmp4
   1440          ret <2 x i64> %tmp5
   1441 }
   1442 
   1443 define <8 x i8> @srsra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1444 ;CHECK-LABEL: srsra8b:
   1445 ;CHECK: srsra.8b v0, {{v[0-9]+}}, #1
   1446         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1447         %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
   1448         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1449         %tmp5 = add <8 x i8> %tmp3, %tmp4
   1450         ret <8 x i8> %tmp5
   1451 }
   1452 
   1453 define <4 x i16> @srsra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1454 ;CHECK-LABEL: srsra4h:
   1455 ;CHECK: srsra.4h v0, {{v[0-9]+}}, #1
   1456         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1457         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
   1458         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1459         %tmp5 = add <4 x i16> %tmp3, %tmp4
   1460         ret <4 x i16> %tmp5
   1461 }
   1462 
   1463 define <2 x i32> @srsra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1464 ;CHECK-LABEL: srsra2s:
   1465 ;CHECK: srsra.2s v0, {{v[0-9]+}}, #1
   1466         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1467         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
   1468         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1469         %tmp5 = add <2 x i32> %tmp3, %tmp4
   1470         ret <2 x i32> %tmp5
   1471 }
   1472 
   1473 define <16 x i8> @srsra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1474 ;CHECK-LABEL: srsra16b:
   1475 ;CHECK: srsra.16b v0, {{v[0-9]+}}, #1
   1476         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1477         %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
   1478         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1479         %tmp5 = add <16 x i8> %tmp3, %tmp4
   1480          ret <16 x i8> %tmp5
   1481 }
   1482 
   1483 define <8 x i16> @srsra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1484 ;CHECK-LABEL: srsra8h:
   1485 ;CHECK: srsra.8h v0, {{v[0-9]+}}, #1
   1486         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1487         %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
   1488         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1489         %tmp5 = add <8 x i16> %tmp3, %tmp4
   1490          ret <8 x i16> %tmp5
   1491 }
   1492 
   1493 define <4 x i32> @srsra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1494 ;CHECK-LABEL: srsra4s:
   1495 ;CHECK: srsra.4s v0, {{v[0-9]+}}, #1
   1496         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1497         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
   1498         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1499         %tmp5 = add <4 x i32> %tmp3, %tmp4
   1500          ret <4 x i32> %tmp5
   1501 }
   1502 
   1503 define <2 x i64> @srsra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1504 ;CHECK-LABEL: srsra2d:
   1505 ;CHECK: srsra.2d v0, {{v[0-9]+}}, #1
   1506         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1507         %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
   1508         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1509         %tmp5 = add <2 x i64> %tmp3, %tmp4
   1510          ret <2 x i64> %tmp5
   1511 }
   1512 
   1513 define <8 x i8> @usra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1514 ;CHECK-LABEL: usra8b:
   1515 ;CHECK: usra.8b v0, {{v[0-9]+}}, #1
   1516         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1517         %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1518         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1519         %tmp5 = add <8 x i8> %tmp3, %tmp4
   1520         ret <8 x i8> %tmp5
   1521 }
   1522 
   1523 define <4 x i16> @usra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1524 ;CHECK-LABEL: usra4h:
   1525 ;CHECK: usra.4h v0, {{v[0-9]+}}, #1
   1526         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1527         %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
   1528         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1529         %tmp5 = add <4 x i16> %tmp3, %tmp4
   1530         ret <4 x i16> %tmp5
   1531 }
   1532 
   1533 define <2 x i32> @usra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1534 ;CHECK-LABEL: usra2s:
   1535 ;CHECK: usra.2s v0, {{v[0-9]+}}, #1
   1536         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1537         %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>
   1538         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1539         %tmp5 = add <2 x i32> %tmp3, %tmp4
   1540         ret <2 x i32> %tmp5
   1541 }
   1542 
   1543 define <16 x i8> @usra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1544 ;CHECK-LABEL: usra16b:
   1545 ;CHECK: usra.16b v0, {{v[0-9]+}}, #1
   1546         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1547         %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1548         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1549         %tmp5 = add <16 x i8> %tmp3, %tmp4
   1550          ret <16 x i8> %tmp5
   1551 }
   1552 
   1553 define <8 x i16> @usra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1554 ;CHECK-LABEL: usra8h:
   1555 ;CHECK: usra.8h v0, {{v[0-9]+}}, #1
   1556         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1557         %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1558         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1559         %tmp5 = add <8 x i16> %tmp3, %tmp4
   1560          ret <8 x i16> %tmp5
   1561 }
   1562 
   1563 define <4 x i32> @usra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1564 ;CHECK-LABEL: usra4s:
   1565 ;CHECK: usra.4s v0, {{v[0-9]+}}, #1
   1566         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1567         %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
   1568         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1569         %tmp5 = add <4 x i32> %tmp3, %tmp4
   1570          ret <4 x i32> %tmp5
   1571 }
   1572 
   1573 define <2 x i64> @usra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1574 ;CHECK-LABEL: usra2d:
   1575 ;CHECK: usra.2d v0, {{v[0-9]+}}, #1
   1576         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1577         %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
   1578         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1579         %tmp5 = add <2 x i64> %tmp3, %tmp4
   1580          ret <2 x i64> %tmp5
   1581 }
   1582 
   1583 define <8 x i8> @ssra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1584 ;CHECK-LABEL: ssra8b:
   1585 ;CHECK: ssra.8b v0, {{v[0-9]+}}, #1
   1586         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1587         %tmp3 = ashr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1588         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1589         %tmp5 = add <8 x i8> %tmp3, %tmp4
   1590         ret <8 x i8> %tmp5
   1591 }
   1592 
   1593 define <4 x i16> @ssra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1594 ;CHECK-LABEL: ssra4h:
   1595 ;CHECK: ssra.4h v0, {{v[0-9]+}}, #1
   1596         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1597         %tmp3 = ashr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
   1598         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1599         %tmp5 = add <4 x i16> %tmp3, %tmp4
   1600         ret <4 x i16> %tmp5
   1601 }
   1602 
   1603 define <2 x i32> @ssra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1604 ;CHECK-LABEL: ssra2s:
   1605 ;CHECK: ssra.2s v0, {{v[0-9]+}}, #1
   1606         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1607         %tmp3 = ashr <2 x i32> %tmp1, <i32 1, i32 1>
   1608         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1609         %tmp5 = add <2 x i32> %tmp3, %tmp4
   1610         ret <2 x i32> %tmp5
   1611 }
   1612 
   1613 define <16 x i8> @ssra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1614 ;CHECK-LABEL: ssra16b:
   1615 ;CHECK: ssra.16b v0, {{v[0-9]+}}, #1
   1616         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1617         %tmp3 = ashr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1618         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1619         %tmp5 = add <16 x i8> %tmp3, %tmp4
   1620          ret <16 x i8> %tmp5
   1621 }
   1622 
   1623 define <8 x i16> @ssra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1624 ;CHECK-LABEL: ssra8h:
   1625 ;CHECK: ssra.8h v0, {{v[0-9]+}}, #1
   1626         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1627         %tmp3 = ashr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1628         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1629         %tmp5 = add <8 x i16> %tmp3, %tmp4
   1630          ret <8 x i16> %tmp5
   1631 }
   1632 
   1633 define <4 x i32> @ssra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1634 ;CHECK-LABEL: ssra4s:
   1635 ;CHECK: ssra.4s v0, {{v[0-9]+}}, #1
   1636         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1637         %tmp3 = ashr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
   1638         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1639         %tmp5 = add <4 x i32> %tmp3, %tmp4
   1640          ret <4 x i32> %tmp5
   1641 }
   1642 
   1643 define <2 x i64> @ssra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1644 ;CHECK-LABEL: ssra2d:
   1645 ;CHECK: ssra.2d v0, {{v[0-9]+}}, #1
   1646         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1647         %tmp3 = ashr <2 x i64> %tmp1, <i64 1, i64 1>
   1648         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1649         %tmp5 = add <2 x i64> %tmp3, %tmp4
   1650          ret <2 x i64> %tmp5
   1651 }
   1652 
   1653 define <8 x i8> @shr_orr8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1654 ;CHECK-LABEL: shr_orr8b:
   1655 ;CHECK: shr.8b v0, {{v[0-9]+}}, #1
   1656 ;CHECK-NEXT: orr.8b
   1657 ;CHECK-NEXT: ret
   1658         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1659         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1660         %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1661         %tmp5 = or <8 x i8> %tmp3, %tmp4
   1662         ret <8 x i8> %tmp5
   1663 }
   1664 
   1665 define <4 x i16> @shr_orr4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1666 ;CHECK-LABEL: shr_orr4h:
   1667 ;CHECK: shr.4h v0, {{v[0-9]+}}, #1
   1668 ;CHECK-NEXT: orr.8b
   1669 ;CHECK-NEXT: ret
   1670         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1671         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1672         %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
   1673         %tmp5 = or <4 x i16> %tmp3, %tmp4
   1674         ret <4 x i16> %tmp5
   1675 }
   1676 
   1677 define <2 x i32> @shr_orr2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1678 ;CHECK-LABEL: shr_orr2s:
   1679 ;CHECK: shr.2s v0, {{v[0-9]+}}, #1
   1680 ;CHECK-NEXT: orr.8b
   1681 ;CHECK-NEXT: ret
   1682         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1683         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1684         %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>
   1685         %tmp5 = or <2 x i32> %tmp3, %tmp4
   1686         ret <2 x i32> %tmp5
   1687 }
   1688 
   1689 define <16 x i8> @shr_orr16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1690 ;CHECK-LABEL: shr_orr16b:
   1691 ;CHECK: shr.16b v0, {{v[0-9]+}}, #1
   1692 ;CHECK-NEXT: orr.16b
   1693 ;CHECK-NEXT: ret
   1694         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1695         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1696         %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1697         %tmp5 = or <16 x i8> %tmp3, %tmp4
   1698          ret <16 x i8> %tmp5
   1699 }
   1700 
   1701 define <8 x i16> @shr_orr8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1702 ;CHECK-LABEL: shr_orr8h:
   1703 ;CHECK: shr.8h v0, {{v[0-9]+}}, #1
   1704 ;CHECK-NEXT: orr.16b
   1705 ;CHECK-NEXT: ret
   1706         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1707         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1708         %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1709         %tmp5 = or <8 x i16> %tmp3, %tmp4
   1710          ret <8 x i16> %tmp5
   1711 }
   1712 
   1713 define <4 x i32> @shr_orr4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1714 ;CHECK-LABEL: shr_orr4s:
   1715 ;CHECK: shr.4s v0, {{v[0-9]+}}, #1
   1716 ;CHECK-NEXT: orr.16b
   1717 ;CHECK-NEXT: ret
   1718         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1719         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1720         %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
   1721         %tmp5 = or <4 x i32> %tmp3, %tmp4
   1722          ret <4 x i32> %tmp5
   1723 }
   1724 
   1725 define <2 x i64> @shr_orr2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1726 ;CHECK-LABEL: shr_orr2d:
   1727 ;CHECK: shr.2d v0, {{v[0-9]+}}, #1
   1728 ;CHECK-NEXT: orr.16b
   1729 ;CHECK-NEXT: ret
   1730         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1731         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1732         %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
   1733         %tmp5 = or <2 x i64> %tmp3, %tmp4
   1734          ret <2 x i64> %tmp5
   1735 }
   1736 
   1737 define <8 x i8> @shl_orr8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1738 ;CHECK-LABEL: shl_orr8b:
   1739 ;CHECK: shl.8b v0, {{v[0-9]+}}, #1
   1740 ;CHECK-NEXT: orr.8b
   1741 ;CHECK-NEXT: ret
   1742         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1743         %tmp4 = load <8 x i8>, <8 x i8>* %B
   1744         %tmp3 = shl <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1745         %tmp5 = or <8 x i8> %tmp3, %tmp4
   1746         ret <8 x i8> %tmp5
   1747 }
   1748 
   1749 define <4 x i16> @shl_orr4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1750 ;CHECK-LABEL: shl_orr4h:
   1751 ;CHECK: shl.4h v0, {{v[0-9]+}}, #1
   1752 ;CHECK-NEXT: orr.8b
   1753 ;CHECK-NEXT: ret
   1754         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1755         %tmp4 = load <4 x i16>, <4 x i16>* %B
   1756         %tmp3 = shl <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
   1757         %tmp5 = or <4 x i16> %tmp3, %tmp4
   1758         ret <4 x i16> %tmp5
   1759 }
   1760 
   1761 define <2 x i32> @shl_orr2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1762 ;CHECK-LABEL: shl_orr2s:
   1763 ;CHECK: shl.2s v0, {{v[0-9]+}}, #1
   1764 ;CHECK-NEXT: orr.8b
   1765 ;CHECK-NEXT: ret
   1766         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1767         %tmp4 = load <2 x i32>, <2 x i32>* %B
   1768         %tmp3 = shl <2 x i32> %tmp1, <i32 1, i32 1>
   1769         %tmp5 = or <2 x i32> %tmp3, %tmp4
   1770         ret <2 x i32> %tmp5
   1771 }
   1772 
   1773 define <16 x i8> @shl_orr16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1774 ;CHECK-LABEL: shl_orr16b:
   1775 ;CHECK: shl.16b v0, {{v[0-9]+}}, #1
   1776 ;CHECK-NEXT: orr.16b
   1777 ;CHECK-NEXT: ret
   1778         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1779         %tmp4 = load <16 x i8>, <16 x i8>* %B
   1780         %tmp3 = shl <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
   1781         %tmp5 = or <16 x i8> %tmp3, %tmp4
   1782          ret <16 x i8> %tmp5
   1783 }
   1784 
   1785 define <8 x i16> @shl_orr8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1786 ;CHECK-LABEL: shl_orr8h:
   1787 ;CHECK: shl.8h v0, {{v[0-9]+}}, #1
   1788 ;CHECK-NEXT: orr.16b
   1789 ;CHECK-NEXT: ret
   1790         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1791         %tmp4 = load <8 x i16>, <8 x i16>* %B
   1792         %tmp3 = shl <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
   1793         %tmp5 = or <8 x i16> %tmp3, %tmp4
   1794          ret <8 x i16> %tmp5
   1795 }
   1796 
   1797 define <4 x i32> @shl_orr4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1798 ;CHECK-LABEL: shl_orr4s:
   1799 ;CHECK: shl.4s v0, {{v[0-9]+}}, #1
   1800 ;CHECK-NEXT: orr.16b
   1801 ;CHECK-NEXT: ret
   1802         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1803         %tmp4 = load <4 x i32>, <4 x i32>* %B
   1804         %tmp3 = shl <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
   1805         %tmp5 = or <4 x i32> %tmp3, %tmp4
   1806          ret <4 x i32> %tmp5
   1807 }
   1808 
   1809 define <2 x i64> @shl_orr2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1810 ;CHECK-LABEL: shl_orr2d:
   1811 ;CHECK: shl.2d v0, {{v[0-9]+}}, #1
   1812 ;CHECK-NEXT: orr.16b
   1813 ;CHECK-NEXT: ret
   1814         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1815         %tmp4 = load <2 x i64>, <2 x i64>* %B
   1816         %tmp3 = shl <2 x i64> %tmp1, <i64 1, i64 1>
   1817         %tmp5 = or <2 x i64> %tmp3, %tmp4
   1818          ret <2 x i64> %tmp5
   1819 }
   1820 
   1821 define <8 x i16> @shll(<8 x i8> %in) {
   1822 ; CHECK-LABEL: shll:
   1823 ; CHECK: shll.8h v0, {{v[0-9]+}}, #8
   1824   %ext = zext <8 x i8> %in to <8 x i16>
   1825   %res = shl <8 x i16> %ext, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
   1826   ret <8 x i16> %res
   1827 }
   1828 
   1829 define <4 x i32> @shll_high(<8 x i16> %in) {
   1830 ; CHECK-LABEL: shll_high
   1831 ; CHECK: shll2.4s v0, {{v[0-9]+}}, #16
   1832   %extract = shufflevector <8 x i16> %in, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
   1833   %ext = zext <4 x i16> %extract to <4 x i32>
   1834   %res = shl <4 x i32> %ext, <i32 16, i32 16, i32 16, i32 16>
   1835   ret <4 x i32> %res
   1836 }
   1837 
   1838 define <8 x i8> @sli8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
   1839 ;CHECK-LABEL: sli8b:
   1840 ;CHECK: sli.8b v0, {{v[0-9]+}}, #1
   1841         %tmp1 = load <8 x i8>, <8 x i8>* %A
   1842         %tmp2 = load <8 x i8>, <8 x i8>* %B
   1843         %tmp3 = call <8 x i8> @llvm.aarch64.neon.vsli.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2, i32 1)
   1844         ret <8 x i8> %tmp3
   1845 }
   1846 
   1847 define <4 x i16> @sli4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
   1848 ;CHECK-LABEL: sli4h:
   1849 ;CHECK: sli.4h v0, {{v[0-9]+}}, #1
   1850         %tmp1 = load <4 x i16>, <4 x i16>* %A
   1851         %tmp2 = load <4 x i16>, <4 x i16>* %B
   1852         %tmp3 = call <4 x i16> @llvm.aarch64.neon.vsli.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2, i32 1)
   1853         ret <4 x i16> %tmp3
   1854 }
   1855 
   1856 define <2 x i32> @sli2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
   1857 ;CHECK-LABEL: sli2s:
   1858 ;CHECK: sli.2s v0, {{v[0-9]+}}, #1
   1859         %tmp1 = load <2 x i32>, <2 x i32>* %A
   1860         %tmp2 = load <2 x i32>, <2 x i32>* %B
   1861         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vsli.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2, i32 1)
   1862         ret <2 x i32> %tmp3
   1863 }
   1864 
   1865 define <1 x i64> @sli1d(<1 x i64>* %A, <1 x i64>* %B) nounwind {
   1866 ;CHECK-LABEL: sli1d:
   1867 ;CHECK: sli d0, {{d[0-9]+}}, #1
   1868         %tmp1 = load <1 x i64>, <1 x i64>* %A
   1869         %tmp2 = load <1 x i64>, <1 x i64>* %B
   1870         %tmp3 = call <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2, i32 1)
   1871         ret <1 x i64> %tmp3
   1872 }
   1873 
   1874 define <16 x i8> @sli16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
   1875 ;CHECK-LABEL: sli16b:
   1876 ;CHECK: sli.16b v0, {{v[0-9]+}}, #1
   1877         %tmp1 = load <16 x i8>, <16 x i8>* %A
   1878         %tmp2 = load <16 x i8>, <16 x i8>* %B
   1879         %tmp3 = call <16 x i8> @llvm.aarch64.neon.vsli.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2, i32 1)
   1880         ret <16 x i8> %tmp3
   1881 }
   1882 
   1883 define <8 x i16> @sli8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
   1884 ;CHECK-LABEL: sli8h:
   1885 ;CHECK: sli.8h v0, {{v[0-9]+}}, #1
   1886         %tmp1 = load <8 x i16>, <8 x i16>* %A
   1887         %tmp2 = load <8 x i16>, <8 x i16>* %B
   1888         %tmp3 = call <8 x i16> @llvm.aarch64.neon.vsli.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2, i32 1)
   1889         ret <8 x i16> %tmp3
   1890 }
   1891 
   1892 define <4 x i32> @sli4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
   1893 ;CHECK-LABEL: sli4s:
   1894 ;CHECK: sli.4s v0, {{v[0-9]+}}, #1
   1895         %tmp1 = load <4 x i32>, <4 x i32>* %A
   1896         %tmp2 = load <4 x i32>, <4 x i32>* %B
   1897         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vsli.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2, i32 1)
   1898         ret <4 x i32> %tmp3
   1899 }
   1900 
   1901 define <2 x i64> @sli2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
   1902 ;CHECK-LABEL: sli2d:
   1903 ;CHECK: sli.2d v0, {{v[0-9]+}}, #1
   1904         %tmp1 = load <2 x i64>, <2 x i64>* %A
   1905         %tmp2 = load <2 x i64>, <2 x i64>* %B
   1906         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vsli.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2, i32 1)
   1907         ret <2 x i64> %tmp3
   1908 }
   1909 
   1910 declare <8 x i8>  @llvm.aarch64.neon.vsli.v8i8(<8 x i8>, <8 x i8>, i32) nounwind readnone
   1911 declare <4 x i16> @llvm.aarch64.neon.vsli.v4i16(<4 x i16>, <4 x i16>, i32) nounwind readnone
   1912 declare <2 x i32> @llvm.aarch64.neon.vsli.v2i32(<2 x i32>, <2 x i32>, i32) nounwind readnone
   1913 declare <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64>, <1 x i64>, i32) nounwind readnone
   1914 
   1915 declare <16 x i8> @llvm.aarch64.neon.vsli.v16i8(<16 x i8>, <16 x i8>, i32) nounwind readnone
   1916 declare <8 x i16> @llvm.aarch64.neon.vsli.v8i16(<8 x i16>, <8 x i16>, i32) nounwind readnone
   1917 declare <4 x i32> @llvm.aarch64.neon.vsli.v4i32(<4 x i32>, <4 x i32>, i32) nounwind readnone
   1918 declare <2 x i64> @llvm.aarch64.neon.vsli.v2i64(<2 x i64>, <2 x i64>, i32) nounwind readnone
   1919 
   1920 define <1 x i64> @ashr_v1i64(<1 x i64> %a, <1 x i64> %b) {
   1921 ; CHECK-LABEL: ashr_v1i64:
   1922 ; CHECK: neg d{{[0-9]+}}, d{{[0-9]+}}
   1923 ; CHECK: sshl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
   1924   %c = ashr <1 x i64> %a, %b
   1925   ret <1 x i64> %c
   1926 }
   1927