Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -O1 -o - | FileCheck %s
      2 ; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -O0 -fast-isel=true -o - | FileCheck %s
      3 
      4 ; CHECK-LABEL: test_i64_f64:
      5 define void @test_i64_f64(double* %p, i64* %q) {
      6 ; CHECK: ldr
      7 ; CHECK: str
      8     %1 = load double, double* %p
      9     %2 = fadd double %1, %1
     10     %3 = bitcast double %2 to i64
     11     %4 = add i64 %3, %3
     12     store i64 %4, i64* %q
     13     ret void
     14 }
     15 
     16 ; CHECK-LABEL: test_i64_v1i64:
     17 define void @test_i64_v1i64(<1 x i64>* %p, i64* %q) {
     18 ; CHECK: ldr
     19 ; CHECK: str
     20     %1 = load <1 x i64>, <1 x i64>* %p
     21     %2 = add <1 x i64> %1, %1
     22     %3 = bitcast <1 x i64> %2 to i64
     23     %4 = add i64 %3, %3
     24     store i64 %4, i64* %q
     25     ret void
     26 }
     27 
     28 ; CHECK-LABEL: test_i64_v2f32:
     29 define void @test_i64_v2f32(<2 x float>* %p, i64* %q) {
     30 ; CHECK: ld1 { v{{[0-9]+}}.2s }
     31 ; CHECK: rev64 v{{[0-9]+}}.2s
     32 ; CHECK: str
     33     %1 = load <2 x float>, <2 x float>* %p
     34     %2 = fadd <2 x float> %1, %1
     35     %3 = bitcast <2 x float> %2 to i64
     36     %4 = add i64 %3, %3
     37     store i64 %4, i64* %q
     38     ret void
     39 }
     40 
     41 ; CHECK-LABEL: test_i64_v2i32:
     42 define void @test_i64_v2i32(<2 x i32>* %p, i64* %q) {
     43 ; CHECK: ld1 { v{{[0-9]+}}.2s }
     44 ; CHECK: rev64 v{{[0-9]+}}.2s
     45 ; CHECK: str
     46     %1 = load <2 x i32>, <2 x i32>* %p
     47     %2 = add <2 x i32> %1, %1
     48     %3 = bitcast <2 x i32> %2 to i64
     49     %4 = add i64 %3, %3
     50     store i64 %4, i64* %q
     51     ret void
     52 }
     53 
     54 ; CHECK-LABEL: test_i64_v4f16:
     55 define void @test_i64_v4f16(<4 x half>* %p, i64* %q) {
     56 ; CHECK: ld1 { v{{[0-9]+}}.4h }
     57 ; CHECK-NOT: rev
     58 ; CHECK: fadd
     59 ; CHECK: rev64 v{{[0-9]+}}.4h
     60 ; CHECK: str
     61     %1 = load <4 x half>, <4 x half>* %p
     62     %2 = fadd <4 x half> %1, %1
     63     %3 = bitcast <4 x half> %2 to i64
     64     %4 = add i64 %3, %3
     65     store i64 %4, i64* %q
     66     ret void
     67 }
     68 
     69 ; CHECK-LABEL: test_i64_v4i16:
     70 define void @test_i64_v4i16(<4 x i16>* %p, i64* %q) {
     71 ; CHECK: ld1 { v{{[0-9]+}}.4h }
     72 ; CHECK: rev64 v{{[0-9]+}}.4h
     73 ; CHECK: str
     74     %1 = load <4 x i16>, <4 x i16>* %p
     75     %2 = add <4 x i16> %1, %1
     76     %3 = bitcast <4 x i16> %2 to i64
     77     %4 = add i64 %3, %3
     78     store i64 %4, i64* %q
     79     ret void
     80 }
     81 
     82 ; CHECK-LABEL: test_i64_v8i8:
     83 define void @test_i64_v8i8(<8 x i8>* %p, i64* %q) {
     84 ; CHECK: ld1 { v{{[0-9]+}}.8b }
     85 ; CHECK: rev64 v{{[0-9]+}}.8b
     86 ; CHECK: str
     87     %1 = load <8 x i8>, <8 x i8>* %p
     88     %2 = add <8 x i8> %1, %1
     89     %3 = bitcast <8 x i8> %2 to i64
     90     %4 = add i64 %3, %3
     91     store i64 %4, i64* %q
     92     ret void
     93 }
     94 
     95 ; CHECK-LABEL: test_f64_i64:
     96 define void @test_f64_i64(i64* %p, double* %q) {
     97 ; CHECK: ldr
     98 ; CHECK: str
     99     %1 = load i64, i64* %p
    100     %2 = add i64 %1, %1
    101     %3 = bitcast i64 %2 to double
    102     %4 = fadd double %3, %3
    103     store double %4, double* %q
    104     ret void
    105 }
    106 
    107 ; CHECK-LABEL: test_f64_v1i64:
    108 define void @test_f64_v1i64(<1 x i64>* %p, double* %q) {
    109 ; CHECK: ldr
    110 ; CHECK: str
    111     %1 = load <1 x i64>, <1 x i64>* %p
    112     %2 = add <1 x i64> %1, %1
    113     %3 = bitcast <1 x i64> %2 to double
    114     %4 = fadd double %3, %3
    115     store double %4, double* %q
    116     ret void
    117 }
    118 
    119 ; CHECK-LABEL: test_f64_v2f32:
    120 define void @test_f64_v2f32(<2 x float>* %p, double* %q) {
    121 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    122 ; CHECK: rev64 v{{[0-9]+}}.2s
    123 ; CHECK: str
    124     %1 = load <2 x float>, <2 x float>* %p
    125     %2 = fadd <2 x float> %1, %1
    126     %3 = bitcast <2 x float> %2 to double
    127     %4 = fadd double %3, %3
    128     store double %4, double* %q
    129     ret void
    130 }
    131 
    132 ; CHECK-LABEL: test_f64_v2i32:
    133 define void @test_f64_v2i32(<2 x i32>* %p, double* %q) {
    134 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    135 ; CHECK: rev64 v{{[0-9]+}}.2s
    136 ; CHECK: str
    137     %1 = load <2 x i32>, <2 x i32>* %p
    138     %2 = add <2 x i32> %1, %1
    139     %3 = bitcast <2 x i32> %2 to double
    140     %4 = fadd double %3, %3
    141     store double %4, double* %q
    142     ret void
    143 }
    144 
    145 ; CHECK-LABEL: test_f64_v4i16:
    146 define void @test_f64_v4i16(<4 x i16>* %p, double* %q) {
    147 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    148 ; CHECK: rev64 v{{[0-9]+}}.4h
    149 ; CHECK: str
    150     %1 = load <4 x i16>, <4 x i16>* %p
    151     %2 = add <4 x i16> %1, %1
    152     %3 = bitcast <4 x i16> %2 to double
    153     %4 = fadd double %3, %3
    154     store double %4, double* %q
    155     ret void
    156 }
    157 
    158 ; CHECK-LABEL: test_f64_v4f16:
    159 define void @test_f64_v4f16(<4 x half>* %p, double* %q) {
    160 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    161 ; CHECK-NOT: rev
    162 ; CHECK: fadd
    163 ; CHECK: rev64 v{{[0-9]+}}.4h
    164 ; CHECK: fadd
    165 ; CHECK: str
    166     %1 = load <4 x half>, <4 x half>* %p
    167     %2 = fadd <4 x half> %1, %1
    168     %3 = bitcast <4 x half> %2 to double
    169     %4 = fadd double %3, %3
    170     store double %4, double* %q
    171     ret void
    172 }
    173 
    174 ; CHECK-LABEL: test_f64_v8i8:
    175 define void @test_f64_v8i8(<8 x i8>* %p, double* %q) {
    176 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    177 ; CHECK: rev64 v{{[0-9]+}}.8b
    178 ; CHECK: str
    179     %1 = load <8 x i8>, <8 x i8>* %p
    180     %2 = add <8 x i8> %1, %1
    181     %3 = bitcast <8 x i8> %2 to double
    182     %4 = fadd double %3, %3
    183     store double %4, double* %q
    184     ret void
    185 }
    186 
    187 ; CHECK-LABEL: test_v1i64_i64:
    188 define void @test_v1i64_i64(i64* %p, <1 x i64>* %q) {
    189 ; CHECK: ldr
    190 ; CHECK: str
    191     %1 = load i64, i64* %p
    192     %2 = add i64 %1, %1
    193     %3 = bitcast i64 %2 to <1 x i64>
    194     %4 = add <1 x i64> %3, %3
    195     store <1 x i64> %4, <1 x i64>* %q
    196     ret void
    197 }
    198 
    199 ; CHECK-LABEL: test_v1i64_f64:
    200 define void @test_v1i64_f64(double* %p, <1 x i64>* %q) {
    201 ; CHECK: ldr
    202 ; CHECK: str
    203     %1 = load double, double* %p
    204     %2 = fadd double %1, %1
    205     %3 = bitcast double %2 to <1 x i64>
    206     %4 = add <1 x i64> %3, %3
    207     store <1 x i64> %4, <1 x i64>* %q
    208     ret void
    209 }
    210 
    211 ; CHECK-LABEL: test_v1i64_v2f32:
    212 define void @test_v1i64_v2f32(<2 x float>* %p, <1 x i64>* %q) {
    213 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    214 ; CHECK: rev64 v{{[0-9]+}}.2s
    215 ; CHECK: str
    216     %1 = load <2 x float>, <2 x float>* %p
    217     %2 = fadd <2 x float> %1, %1
    218     %3 = bitcast <2 x float> %2 to <1 x i64>
    219     %4 = add <1 x i64> %3, %3
    220     store <1 x i64> %4, <1 x i64>* %q
    221     ret void
    222 }
    223 
    224 ; CHECK-LABEL: test_v1i64_v2i32:
    225 define void @test_v1i64_v2i32(<2 x i32>* %p, <1 x i64>* %q) {
    226 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    227 ; CHECK: rev64 v{{[0-9]+}}.2s
    228 ; CHECK: str
    229     %1 = load <2 x i32>, <2 x i32>* %p
    230     %2 = add <2 x i32> %1, %1
    231     %3 = bitcast <2 x i32> %2 to <1 x i64>
    232     %4 = add <1 x i64> %3, %3
    233     store <1 x i64> %4, <1 x i64>* %q
    234     ret void
    235 }
    236 
    237 ; CHECK-LABEL: test_v1i64_v4f16:
    238 define void @test_v1i64_v4f16(<4 x half>* %p, <1 x i64>* %q) {
    239 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    240 ; CHECK-NOT: rev
    241 ; CHECK: fadd
    242 ; CHECK: rev64 v{{[0-9]+}}.4h
    243 ; CHECK: str
    244     %1 = load <4 x half>, <4 x half>* %p
    245     %2 = fadd <4 x half> %1, %1
    246     %3 = bitcast <4 x half> %2 to <1 x i64>
    247     %4 = add <1 x i64> %3, %3
    248     store <1 x i64> %4, <1 x i64>* %q
    249     ret void
    250 }
    251 
    252 ; CHECK-LABEL: test_v1i64_v4i16:
    253 define void @test_v1i64_v4i16(<4 x i16>* %p, <1 x i64>* %q) {
    254 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    255 ; CHECK: rev64 v{{[0-9]+}}.4h
    256 ; CHECK: str
    257     %1 = load <4 x i16>, <4 x i16>* %p
    258     %2 = add <4 x i16> %1, %1
    259     %3 = bitcast <4 x i16> %2 to <1 x i64>
    260     %4 = add <1 x i64> %3, %3
    261     store <1 x i64> %4, <1 x i64>* %q
    262     ret void
    263 }
    264 
    265 ; CHECK-LABEL: test_v1i64_v8i8:
    266 define void @test_v1i64_v8i8(<8 x i8>* %p, <1 x i64>* %q) {
    267 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    268 ; CHECK: rev64 v{{[0-9]+}}.8b
    269 ; CHECK: str
    270     %1 = load <8 x i8>, <8 x i8>* %p
    271     %2 = add <8 x i8> %1, %1
    272     %3 = bitcast <8 x i8> %2 to <1 x i64>
    273     %4 = add <1 x i64> %3, %3
    274     store <1 x i64> %4, <1 x i64>* %q
    275     ret void
    276 }
    277 
    278 ; CHECK-LABEL: test_v2f32_i64:
    279 define void @test_v2f32_i64(i64* %p, <2 x float>* %q) {
    280 ; CHECK: ldr
    281 ; CHECK: rev64 v{{[0-9]+}}.2s
    282 ; CHECK: st1 { v{{[0-9]+}}.2s }
    283     %1 = load i64, i64* %p
    284     %2 = add i64 %1, %1
    285     %3 = bitcast i64 %2 to <2 x float>
    286     %4 = fadd <2 x float> %3, %3
    287     store <2 x float> %4, <2 x float>* %q
    288     ret void
    289 }
    290 
    291 ; CHECK-LABEL: test_v2f32_f64:
    292 define void @test_v2f32_f64(double* %p, <2 x float>* %q) {
    293 ; CHECK: ldr
    294 ; CHECK: rev64 v{{[0-9]+}}.2s
    295 ; CHECK: st1 { v{{[0-9]+}}.2s }
    296     %1 = load double, double* %p
    297     %2 = fadd double %1, %1
    298     %3 = bitcast double %2 to <2 x float>
    299     %4 = fadd <2 x float> %3, %3
    300     store <2 x float> %4, <2 x float>* %q
    301     ret void
    302 }
    303 
    304 ; CHECK-LABEL: test_v2f32_v1i64:
    305 define void @test_v2f32_v1i64(<1 x i64>* %p, <2 x float>* %q) {
    306 ; CHECK: ldr
    307 ; CHECK: rev64 v{{[0-9]+}}.2s
    308 ; CHECK: st1 { v{{[0-9]+}}.2s }
    309     %1 = load <1 x i64>, <1 x i64>* %p
    310     %2 = add <1 x i64> %1, %1
    311     %3 = bitcast <1 x i64> %2 to <2 x float>
    312     %4 = fadd <2 x float> %3, %3
    313     store <2 x float> %4, <2 x float>* %q
    314     ret void
    315 }
    316 
    317 ; CHECK-LABEL: test_v2f32_v2i32:
    318 define void @test_v2f32_v2i32(<2 x i32>* %p, <2 x float>* %q) {
    319 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    320 ; CHECK: st1 { v{{[0-9]+}}.2s }
    321     %1 = load <2 x i32>, <2 x i32>* %p
    322     %2 = add <2 x i32> %1, %1
    323     %3 = bitcast <2 x i32> %2 to <2 x float>
    324     %4 = fadd <2 x float> %3, %3
    325     store <2 x float> %4, <2 x float>* %q
    326     ret void
    327 }
    328 
    329 ; CHECK-LABEL: test_v2f32_v4i16:
    330 define void @test_v2f32_v4i16(<4 x i16>* %p, <2 x float>* %q) {
    331 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    332 ; CHECK: rev32 v{{[0-9]+}}.4h
    333 ; CHECK: st1 { v{{[0-9]+}}.2s }
    334     %1 = load <4 x i16>, <4 x i16>* %p
    335     %2 = add <4 x i16> %1, %1
    336     %3 = bitcast <4 x i16> %2 to <2 x float>
    337     %4 = fadd <2 x float> %3, %3
    338     store <2 x float> %4, <2 x float>* %q
    339     ret void
    340 }
    341 
    342 ; CHECK-LABEL: test_v2f32_v4f16:
    343 define void @test_v2f32_v4f16(<4 x half>* %p, <2 x float>* %q) {
    344 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    345 ; CHECK-NOT: rev
    346 ; CHECK: fadd
    347 ; CHECK: rev32 v{{[0-9]+}}.4h
    348 ; CHECK: st1 { v{{[0-9]+}}.2s }
    349     %1 = load <4 x half>, <4 x half>* %p
    350     %2 = fadd <4 x half> %1, %1
    351     %3 = bitcast <4 x half> %2 to <2 x float>
    352     %4 = fadd <2 x float> %3, %3
    353     store <2 x float> %4, <2 x float>* %q
    354     ret void
    355 }
    356 
    357 ; CHECK-LABEL: test_v2f32_v8i8:
    358 define void @test_v2f32_v8i8(<8 x i8>* %p, <2 x float>* %q) {
    359 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    360 ; CHECK: rev32 v{{[0-9]+}}.8b
    361 ; CHECK: st1 { v{{[0-9]+}}.2s }
    362     %1 = load <8 x i8>, <8 x i8>* %p
    363     %2 = add <8 x i8> %1, %1
    364     %3 = bitcast <8 x i8> %2 to <2 x float>
    365     %4 = fadd <2 x float> %3, %3
    366     store <2 x float> %4, <2 x float>* %q
    367     ret void
    368 }
    369 
    370 ; CHECK-LABEL: test_v2i32_i64:
    371 define void @test_v2i32_i64(i64* %p, <2 x i32>* %q) {
    372 ; CHECK: ldr
    373 ; CHECK: rev64 v{{[0-9]+}}.2s
    374 ; CHECK: st1 { v{{[0-9]+}}.2s }
    375     %1 = load i64, i64* %p
    376     %2 = add i64 %1, %1
    377     %3 = bitcast i64 %2 to <2 x i32>
    378     %4 = add <2 x i32> %3, %3
    379     store <2 x i32> %4, <2 x i32>* %q
    380     ret void
    381 }
    382 
    383 ; CHECK-LABEL: test_v2i32_f64:
    384 define void @test_v2i32_f64(double* %p, <2 x i32>* %q) {
    385 ; CHECK: ldr
    386 ; CHECK: rev64 v{{[0-9]+}}.2s
    387 ; CHECK: st1 { v{{[0-9]+}}.2s }
    388     %1 = load double, double* %p
    389     %2 = fadd double %1, %1
    390     %3 = bitcast double %2 to <2 x i32>
    391     %4 = add <2 x i32> %3, %3
    392     store <2 x i32> %4, <2 x i32>* %q
    393     ret void
    394 }
    395 
    396 ; CHECK-LABEL: test_v2i32_v1i64:
    397 define void @test_v2i32_v1i64(<1 x i64>* %p, <2 x i32>* %q) {
    398 ; CHECK: ldr
    399 ; CHECK: rev64 v{{[0-9]+}}.2s
    400 ; CHECK: st1 { v{{[0-9]+}}.2s }
    401     %1 = load <1 x i64>, <1 x i64>* %p
    402     %2 = add <1 x i64> %1, %1
    403     %3 = bitcast <1 x i64> %2 to <2 x i32>
    404     %4 = add <2 x i32> %3, %3
    405     store <2 x i32> %4, <2 x i32>* %q
    406     ret void
    407 }
    408 
    409 ; CHECK-LABEL: test_v2i32_v2f32:
    410 define void @test_v2i32_v2f32(<2 x float>* %p, <2 x i32>* %q) {
    411 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    412 ; CHECK: st1 { v{{[0-9]+}}.2s }
    413     %1 = load <2 x float>, <2 x float>* %p
    414     %2 = fadd <2 x float> %1, %1
    415     %3 = bitcast <2 x float> %2 to <2 x i32>
    416     %4 = add <2 x i32> %3, %3
    417     store <2 x i32> %4, <2 x i32>* %q
    418     ret void
    419 }
    420 
    421 ; CHECK-LABEL: test_v2i32_v4i16:
    422 define void @test_v2i32_v4i16(<4 x i16>* %p, <2 x i32>* %q) {
    423 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    424 ; CHECK: rev32 v{{[0-9]+}}.4h
    425 ; CHECK: st1 { v{{[0-9]+}}.2s }
    426     %1 = load <4 x i16>, <4 x i16>* %p
    427     %2 = add <4 x i16> %1, %1
    428     %3 = bitcast <4 x i16> %2 to <2 x i32>
    429     %4 = add <2 x i32> %3, %3
    430     store <2 x i32> %4, <2 x i32>* %q
    431     ret void
    432 }
    433 
    434 ; CHECK-LABEL: test_v2i32_v8i8:
    435 define void @test_v2i32_v8i8(<8 x i8>* %p, <2 x i32>* %q) {
    436 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    437 ; CHECK: rev32 v{{[0-9]+}}.8b
    438 ; CHECK: st1 { v{{[0-9]+}}.2s }
    439     %1 = load <8 x i8>, <8 x i8>* %p
    440     %2 = add <8 x i8> %1, %1
    441     %3 = bitcast <8 x i8> %2 to <2 x i32>
    442     %4 = add <2 x i32> %3, %3
    443     store <2 x i32> %4, <2 x i32>* %q
    444     ret void
    445 }
    446 
    447 ; CHECK-LABEL: test_v4i16_i64:
    448 define void @test_v4i16_i64(i64* %p, <4 x i16>* %q) {
    449 ; CHECK: ldr
    450 ; CHECK: rev64 v{{[0-9]+}}.4h
    451 ; CHECK: st1 { v{{[0-9]+}}.4h }
    452     %1 = load i64, i64* %p
    453     %2 = add i64 %1, %1
    454     %3 = bitcast i64 %2 to <4 x i16>
    455     %4 = add <4 x i16> %3, %3
    456     store <4 x i16> %4, <4 x i16>* %q
    457     ret void
    458 }
    459 
    460 ; CHECK-LABEL: test_v4i16_f64:
    461 define void @test_v4i16_f64(double* %p, <4 x i16>* %q) {
    462 ; CHECK: ldr
    463 ; CHECK: rev64 v{{[0-9]+}}.4h
    464 ; CHECK: st1 { v{{[0-9]+}}.4h }
    465     %1 = load double, double* %p
    466     %2 = fadd double %1, %1
    467     %3 = bitcast double %2 to <4 x i16>
    468     %4 = add <4 x i16> %3, %3
    469     store <4 x i16> %4, <4 x i16>* %q
    470     ret void
    471 }
    472 
    473 ; CHECK-LABEL: test_v4i16_v1i64:
    474 define void @test_v4i16_v1i64(<1 x i64>* %p, <4 x i16>* %q) {
    475 ; CHECK: ldr
    476 ; CHECK: rev64 v{{[0-9]+}}.4h
    477 ; CHECK: st1 { v{{[0-9]+}}.4h }
    478     %1 = load <1 x i64>, <1 x i64>* %p
    479     %2 = add <1 x i64> %1, %1
    480     %3 = bitcast <1 x i64> %2 to <4 x i16>
    481     %4 = add <4 x i16> %3, %3
    482     store <4 x i16> %4, <4 x i16>* %q
    483     ret void
    484 }
    485 
    486 ; CHECK-LABEL: test_v4i16_v2f32:
    487 define void @test_v4i16_v2f32(<2 x float>* %p, <4 x i16>* %q) {
    488 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    489 ; CHECK: rev32 v{{[0-9]+}}.4h
    490 ; CHECK: st1 { v{{[0-9]+}}.4h }
    491     %1 = load <2 x float>, <2 x float>* %p
    492     %2 = fadd <2 x float> %1, %1
    493     %3 = bitcast <2 x float> %2 to <4 x i16>
    494     %4 = add <4 x i16> %3, %3
    495     store <4 x i16> %4, <4 x i16>* %q
    496     ret void
    497 }
    498 
    499 ; CHECK-LABEL: test_v4i16_v2i32:
    500 define void @test_v4i16_v2i32(<2 x i32>* %p, <4 x i16>* %q) {
    501 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    502 ; CHECK: rev32 v{{[0-9]+}}.4h
    503 ; CHECK: st1 { v{{[0-9]+}}.4h }
    504     %1 = load <2 x i32>, <2 x i32>* %p
    505     %2 = add <2 x i32> %1, %1
    506     %3 = bitcast <2 x i32> %2 to <4 x i16>
    507     %4 = add <4 x i16> %3, %3
    508     store <4 x i16> %4, <4 x i16>* %q
    509     ret void
    510 }
    511 
    512 ; CHECK-LABEL: test_v4i16_v4f16:
    513 define void @test_v4i16_v4f16(<4 x half>* %p, <4 x i16>* %q) {
    514 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    515 ; CHECK-NOT: rev
    516 ; CHECK: st1 { v{{[0-9]+}}.4h }
    517     %1 = load <4 x half>, <4 x half>* %p
    518     %2 = fadd <4 x half> %1, %1
    519     %3 = bitcast <4 x half> %2 to <4 x i16>
    520     %4 = add <4 x i16> %3, %3
    521     store <4 x i16> %4, <4 x i16>* %q
    522     ret void
    523 }
    524 
    525 ; CHECK-LABEL: test_v4i16_v8i8:
    526 define void @test_v4i16_v8i8(<8 x i8>* %p, <4 x i16>* %q) {
    527 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    528 ; CHECK: rev16 v{{[0-9]+}}.8b
    529 ; CHECK: st1 { v{{[0-9]+}}.4h }
    530     %1 = load <8 x i8>, <8 x i8>* %p
    531     %2 = add <8 x i8> %1, %1
    532     %3 = bitcast <8 x i8> %2 to <4 x i16>
    533     %4 = add <4 x i16> %3, %3
    534     store <4 x i16> %4, <4 x i16>* %q
    535     ret void
    536 }
    537 
    538 ; CHECK-LABEL: test_v4f16_i64:
    539 define void @test_v4f16_i64(i64* %p, <4 x half>* %q) {
    540 ; CHECK: ldr
    541 ; CHECK: rev64 v{{[0-9]+}}.4h
    542 ; CHECK: fadd
    543 ; CHECK-NOT: rev
    544 ; CHECK: st1 { v{{[0-9]+}}.4h }
    545     %1 = load i64, i64* %p
    546     %2 = add i64 %1, %1
    547     %3 = bitcast i64 %2 to <4 x half>
    548     %4 = fadd <4 x half> %3, %3
    549     store <4 x half> %4, <4 x half>* %q
    550     ret void
    551 }
    552 
    553 ; CHECK-LABEL: test_v4f16_f64:
    554 define void @test_v4f16_f64(double* %p, <4 x half>* %q) {
    555 ; CHECK: ldr
    556 ; CHECK: rev64 v{{[0-9]+}}.4h
    557 ; CHECK: fadd
    558 ; CHECK-NOT: rev
    559 ; CHECK: st1 { v{{[0-9]+}}.4h }
    560     %1 = load double, double* %p
    561     %2 = fadd double %1, %1
    562     %3 = bitcast double %2 to <4 x half>
    563     %4 = fadd <4 x half> %3, %3
    564     store <4 x half> %4, <4 x half>* %q
    565     ret void
    566 }
    567 
    568 ; CHECK-LABEL: test_v4f16_v1i64:
    569 define void @test_v4f16_v1i64(<1 x i64>* %p, <4 x half>* %q) {
    570 ; CHECK: ldr
    571 ; CHECK: rev64 v{{[0-9]+}}.4h
    572 ; CHECK: fadd
    573 ; CHECK-NOT: rev
    574 ; CHECK: st1 { v{{[0-9]+}}.4h }
    575     %1 = load <1 x i64>, <1 x i64>* %p
    576     %2 = add <1 x i64> %1, %1
    577     %3 = bitcast <1 x i64> %2 to <4 x half>
    578     %4 = fadd <4 x half> %3, %3
    579     store <4 x half> %4, <4 x half>* %q
    580     ret void
    581 }
    582 
    583 ; CHECK-LABEL: test_v4f16_v2f32:
    584 define void @test_v4f16_v2f32(<2 x float>* %p, <4 x half>* %q) {
    585 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    586 ; CHECK: rev32 v{{[0-9]+}}.4h
    587 ; CHECK: fadd
    588 ; CHECK-NOT: rev
    589 ; CHECK: st1 { v{{[0-9]+}}.4h }
    590     %1 = load <2 x float>, <2 x float>* %p
    591     %2 = fadd <2 x float> %1, %1
    592     %3 = bitcast <2 x float> %2 to <4 x half>
    593     %4 = fadd <4 x half> %3, %3
    594     store <4 x half> %4, <4 x half>* %q
    595     ret void
    596 }
    597 
    598 ; CHECK-LABEL: test_v4f16_v2i32:
    599 define void @test_v4f16_v2i32(<2 x i32>* %p, <4 x half>* %q) {
    600 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    601 ; CHECK: rev32 v{{[0-9]+}}.4h
    602 ; CHECK: fadd
    603 ; CHECK-NOT: rev
    604 ; CHECK: st1 { v{{[0-9]+}}.4h }
    605     %1 = load <2 x i32>, <2 x i32>* %p
    606     %2 = add <2 x i32> %1, %1
    607     %3 = bitcast <2 x i32> %2 to <4 x half>
    608     %4 = fadd <4 x half> %3, %3
    609     store <4 x half> %4, <4 x half>* %q
    610     ret void
    611 }
    612 
    613 ; CHECK-LABEL: test_v4f16_v4i16:
    614 define void @test_v4f16_v4i16(<4 x i16>* %p, <4 x half>* %q) {
    615 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    616 ; CHECK-NOT: rev
    617 ; CHECK: st1 { v{{[0-9]+}}.4h }
    618     %1 = load <4 x i16>, <4 x i16>* %p
    619     %2 = add <4 x i16> %1, %1
    620     %3 = bitcast <4 x i16> %2 to <4 x half>
    621     %4 = fadd <4 x half> %3, %3
    622     store <4 x half> %4, <4 x half>* %q
    623     ret void
    624 }
    625 
    626 ; CHECK-LABEL: test_v4f16_v8i8:
    627 define void @test_v4f16_v8i8(<8 x i8>* %p, <4 x half>* %q) {
    628 ; CHECK: ld1 { v{{[0-9]+}}.8b }
    629 ; CHECK: rev16 v{{[0-9]+}}.8b
    630 ; CHECK: fadd
    631 ; CHECK-NOT: rev
    632 ; CHECK: st1 { v{{[0-9]+}}.4h }
    633     %1 = load <8 x i8>, <8 x i8>* %p
    634     %2 = add <8 x i8> %1, %1
    635     %3 = bitcast <8 x i8> %2 to <4 x half>
    636     %4 = fadd <4 x half> %3, %3
    637     store <4 x half> %4, <4 x half>* %q
    638     ret void
    639 }
    640 
    641 ; CHECK-LABEL: test_v8i8_i64:
    642 define void @test_v8i8_i64(i64* %p, <8 x i8>* %q) {
    643 ; CHECK: ldr
    644 ; CHECK: rev64 v{{[0-9]+}}.8b
    645 ; CHECK: st1 { v{{[0-9]+}}.8b }
    646     %1 = load i64, i64* %p
    647     %2 = add i64 %1, %1
    648     %3 = bitcast i64 %2 to <8 x i8>
    649     %4 = add <8 x i8> %3, %3
    650     store <8 x i8> %4, <8 x i8>* %q
    651     ret void
    652 }
    653 
    654 ; CHECK-LABEL: test_v8i8_f64:
    655 define void @test_v8i8_f64(double* %p, <8 x i8>* %q) {
    656 ; CHECK: ldr
    657 ; CHECK: rev64 v{{[0-9]+}}.8b
    658 ; CHECK: st1 { v{{[0-9]+}}.8b }
    659     %1 = load double, double* %p
    660     %2 = fadd double %1, %1
    661     %3 = bitcast double %2 to <8 x i8>
    662     %4 = add <8 x i8> %3, %3
    663     store <8 x i8> %4, <8 x i8>* %q
    664     ret void
    665 }
    666 
    667 ; CHECK-LABEL: test_v8i8_v1i64:
    668 define void @test_v8i8_v1i64(<1 x i64>* %p, <8 x i8>* %q) {
    669 ; CHECK: ldr
    670 ; CHECK: rev64 v{{[0-9]+}}.8b
    671 ; CHECK: st1 { v{{[0-9]+}}.8b }
    672     %1 = load <1 x i64>, <1 x i64>* %p
    673     %2 = add <1 x i64> %1, %1
    674     %3 = bitcast <1 x i64> %2 to <8 x i8>
    675     %4 = add <8 x i8> %3, %3
    676     store <8 x i8> %4, <8 x i8>* %q
    677     ret void
    678 }
    679 
    680 ; CHECK-LABEL: test_v8i8_v2f32:
    681 define void @test_v8i8_v2f32(<2 x float>* %p, <8 x i8>* %q) {
    682 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    683 ; CHECK: rev32 v{{[0-9]+}}.8b
    684 ; CHECK: st1 { v{{[0-9]+}}.8b }
    685     %1 = load <2 x float>, <2 x float>* %p
    686     %2 = fadd <2 x float> %1, %1
    687     %3 = bitcast <2 x float> %2 to <8 x i8>
    688     %4 = add <8 x i8> %3, %3
    689     store <8 x i8> %4, <8 x i8>* %q
    690     ret void
    691 }
    692 
    693 ; CHECK-LABEL: test_v8i8_v2i32:
    694 define void @test_v8i8_v2i32(<2 x i32>* %p, <8 x i8>* %q) {
    695 ; CHECK: ld1 { v{{[0-9]+}}.2s }
    696 ; CHECK: rev32 v{{[0-9]+}}.8b
    697 ; CHECK: st1 { v{{[0-9]+}}.8b }
    698     %1 = load <2 x i32>, <2 x i32>* %p
    699     %2 = add <2 x i32> %1, %1
    700     %3 = bitcast <2 x i32> %2 to <8 x i8>
    701     %4 = add <8 x i8> %3, %3
    702     store <8 x i8> %4, <8 x i8>* %q
    703     ret void
    704 }
    705 
    706 ; CHECK-LABEL: test_v8i8_v4i16:
    707 define void @test_v8i8_v4i16(<4 x i16>* %p, <8 x i8>* %q) {
    708 ; CHECK: ld1 { v{{[0-9]+}}.4h }
    709 ; CHECK: rev16 v{{[0-9]+}}.8b
    710 ; CHECK: st1 { v{{[0-9]+}}.8b }
    711     %1 = load <4 x i16>, <4 x i16>* %p
    712     %2 = add <4 x i16> %1, %1
    713     %3 = bitcast <4 x i16> %2 to <8 x i8>
    714     %4 = add <8 x i8> %3, %3
    715     store <8 x i8> %4, <8 x i8>* %q
    716     ret void
    717 }
    718 
    719 ; CHECK-LABEL: test_f128_v2f64:
    720 define void @test_f128_v2f64(<2 x double>* %p, fp128* %q) {
    721 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    722 ; CHECK: ext
    723 ; CHECK: str
    724     %1 = load <2 x double>, <2 x double>* %p
    725     %2 = fadd <2 x double> %1, %1
    726     %3 = bitcast <2 x double> %2 to fp128
    727     %4 = fadd fp128 %3, %3
    728     store fp128 %4, fp128* %q
    729     ret void
    730 }
    731 
    732 ; CHECK-LABEL: test_f128_v2i64:
    733 define void @test_f128_v2i64(<2 x i64>* %p, fp128* %q) {
    734 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    735 ; CHECK: ext
    736 ; CHECK: str
    737     %1 = load <2 x i64>, <2 x i64>* %p
    738     %2 = add <2 x i64> %1, %1
    739     %3 = bitcast <2 x i64> %2 to fp128
    740     %4 = fadd fp128 %3, %3
    741     store fp128 %4, fp128* %q
    742     ret void
    743 }
    744 
    745 ; CHECK-LABEL: test_f128_v4f32:
    746 define void @test_f128_v4f32(<4 x float>* %p, fp128* %q) {
    747 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    748 ; CHECK-NOT: rev
    749 ; CHECK: fadd
    750 ; CHECK: rev64 v{{[0-9]+}}.4s
    751 ; CHECK: ext
    752 ; CHECK: str q
    753     %1 = load <4 x float>, <4 x float>* %p
    754     %2 = fadd <4 x float> %1, %1
    755     %3 = bitcast <4 x float> %2 to fp128
    756     %4 = fadd fp128 %3, %3
    757     store fp128 %4, fp128* %q
    758     ret void
    759 }
    760 
    761 ; CHECK-LABEL: test_f128_v4i32:
    762 define void @test_f128_v4i32(<4 x i32>* %p, fp128* %q) {
    763 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    764 ; CHECK: rev64 v{{[0-9]+}}.4s
    765 ; CHECK: ext
    766 ; CHECK: str
    767     %1 = load <4 x i32>, <4 x i32>* %p
    768     %2 = add <4 x i32> %1, %1
    769     %3 = bitcast <4 x i32> %2 to fp128
    770     %4 = fadd fp128 %3, %3
    771     store fp128 %4, fp128* %q
    772     ret void
    773 }
    774 
    775 ; CHECK-LABEL: test_f128_v8i16:
    776 define void @test_f128_v8i16(<8 x i16>* %p, fp128* %q) {
    777 ; CHECK: ld1 { v{{[0-9]+}}.8h }
    778 ; CHECK: rev64 v{{[0-9]+}}.8h
    779 ; CHECK: ext
    780 ; CHECK: str
    781     %1 = load <8 x i16>, <8 x i16>* %p
    782     %2 = add <8 x i16> %1, %1
    783     %3 = bitcast <8 x i16> %2 to fp128
    784     %4 = fadd fp128 %3, %3
    785     store fp128 %4, fp128* %q
    786     ret void
    787 }
    788 
    789 ; CHECK-LABEL: test_f128_v16i8:
    790 define void @test_f128_v16i8(<16 x i8>* %p, fp128* %q) {
    791 ; CHECK: ld1 { v{{[0-9]+}}.16b }
    792 ; CHECK: ext
    793 ; CHECK: str q
    794     %1 = load <16 x i8>, <16 x i8>* %p
    795     %2 = add <16 x i8> %1, %1
    796     %3 = bitcast <16 x i8> %2 to fp128
    797     %4 = fadd fp128 %3, %3
    798     store fp128 %4, fp128* %q
    799     ret void
    800 }
    801 
    802 ; CHECK-LABEL: test_v2f64_f128:
    803 define void @test_v2f64_f128(fp128* %p, <2 x double>* %q) {
    804 ; CHECK: ldr
    805 ; CHECK: ext
    806 ; CHECK: st1 { v{{[0-9]+}}.2d }
    807     %1 = load fp128, fp128* %p
    808     %2 = fadd fp128 %1, %1
    809     %3 = bitcast fp128 %2 to <2 x double>
    810     %4 = fadd <2 x double> %3, %3
    811     store <2 x double> %4, <2 x double>* %q
    812     ret void
    813 }
    814 
    815 ; CHECK-LABEL: test_v2f64_v2i64:
    816 define void @test_v2f64_v2i64(<2 x i64>* %p, <2 x double>* %q) {
    817 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    818 ; CHECK: st1 { v{{[0-9]+}}.2d }
    819     %1 = load <2 x i64>, <2 x i64>* %p
    820     %2 = add <2 x i64> %1, %1
    821     %3 = bitcast <2 x i64> %2 to <2 x double>
    822     %4 = fadd <2 x double> %3, %3
    823     store <2 x double> %4, <2 x double>* %q
    824     ret void
    825 }
    826 
    827 ; CHECK-LABEL: test_v2f64_v4f32:
    828 define void @test_v2f64_v4f32(<4 x float>* %p, <2 x double>* %q) {
    829 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    830 ; CHECK-NOT: rev
    831 ; CHECK: fadd
    832 ; CHECK: rev64 v{{[0-9]+}}.4s
    833 ; CHECK: st1 { v{{[0-9]+}}.2d }
    834     %1 = load <4 x float>, <4 x float>* %p
    835     %2 = fadd <4 x float> %1, %1
    836     %3 = bitcast <4 x float> %2 to <2 x double>
    837     %4 = fadd <2 x double> %3, %3
    838     store <2 x double> %4, <2 x double>* %q
    839     ret void
    840 }
    841 
    842 ; CHECK-LABEL: test_v2f64_v4i32:
    843 define void @test_v2f64_v4i32(<4 x i32>* %p, <2 x double>* %q) {
    844 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    845 ; CHECK: rev64 v{{[0-9]+}}.4s
    846 ; CHECK: st1 { v{{[0-9]+}}.2d }
    847     %1 = load <4 x i32>, <4 x i32>* %p
    848     %2 = add <4 x i32> %1, %1
    849     %3 = bitcast <4 x i32> %2 to <2 x double>
    850     %4 = fadd <2 x double> %3, %3
    851     store <2 x double> %4, <2 x double>* %q
    852     ret void
    853 }
    854 
    855 ; CHECK-LABEL: test_v2f64_v8i16:
    856 define void @test_v2f64_v8i16(<8 x i16>* %p, <2 x double>* %q) {
    857 ; CHECK: ld1 { v{{[0-9]+}}.8h }
    858 ; CHECK: rev64 v{{[0-9]+}}.8h
    859 ; CHECK: st1 { v{{[0-9]+}}.2d }
    860     %1 = load <8 x i16>, <8 x i16>* %p
    861     %2 = add <8 x i16> %1, %1
    862     %3 = bitcast <8 x i16> %2 to <2 x double>
    863     %4 = fadd <2 x double> %3, %3
    864     store <2 x double> %4, <2 x double>* %q
    865     ret void
    866 }
    867 
    868 ; CHECK-LABEL: test_v2f64_v16i8:
    869 define void @test_v2f64_v16i8(<16 x i8>* %p, <2 x double>* %q) {
    870 ; CHECK: ld1 { v{{[0-9]+}}.16b }
    871 ; CHECK: rev64 v{{[0-9]+}}.16b
    872 ; CHECK: st1 { v{{[0-9]+}}.2d }
    873     %1 = load <16 x i8>, <16 x i8>* %p
    874     %2 = add <16 x i8> %1, %1
    875     %3 = bitcast <16 x i8> %2 to <2 x double>
    876     %4 = fadd <2 x double> %3, %3
    877     store <2 x double> %4, <2 x double>* %q
    878     ret void
    879 }
    880 
    881 ; CHECK-LABEL: test_v2i64_f128:
    882 define void @test_v2i64_f128(fp128* %p, <2 x i64>* %q) {
    883 ; CHECK: ldr
    884 ; CHECK: ext
    885 ; CHECK: st1 { v{{[0-9]+}}.2d }
    886     %1 = load fp128, fp128* %p
    887     %2 = fadd fp128 %1, %1
    888     %3 = bitcast fp128 %2 to <2 x i64>
    889     %4 = add <2 x i64> %3, %3
    890     store <2 x i64> %4, <2 x i64>* %q
    891     ret void
    892 }
    893 
    894 ; CHECK-LABEL: test_v2i64_v2f64:
    895 define void @test_v2i64_v2f64(<2 x double>* %p, <2 x i64>* %q) {
    896 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    897 ; CHECK: st1 { v{{[0-9]+}}.2d }
    898     %1 = load <2 x double>, <2 x double>* %p
    899     %2 = fadd <2 x double> %1, %1
    900     %3 = bitcast <2 x double> %2 to <2 x i64>
    901     %4 = add <2 x i64> %3, %3
    902     store <2 x i64> %4, <2 x i64>* %q
    903     ret void
    904 }
    905 
    906 ; CHECK-LABEL: test_v2i64_v4f32:
    907 define void @test_v2i64_v4f32(<4 x float>* %p, <2 x i64>* %q) {
    908 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    909 ; CHECK-NOT: rev
    910 ; CHECK: fadd
    911 ; CHECK: rev64 v{{[0-9]+}}.4s
    912 ; CHECK: add
    913 ; CHECK: st1 { v{{[0-9]+}}.2d }
    914     %1 = load <4 x float>, <4 x float>* %p
    915     %2 = fadd <4 x float> %1, %1
    916     %3 = bitcast <4 x float> %2 to <2 x i64>
    917     %4 = add <2 x i64> %3, %3
    918     store <2 x i64> %4, <2 x i64>* %q
    919     ret void
    920 }
    921 
    922 ; CHECK-LABEL: test_v2i64_v4i32:
    923 define void @test_v2i64_v4i32(<4 x i32>* %p, <2 x i64>* %q) {
    924 ; CHECK: ld1 { v{{[0-9]+}}.4s }
    925 ; CHECK: rev64 v{{[0-9]+}}.4s
    926 ; CHECK: st1 { v{{[0-9]+}}.2d }
    927     %1 = load <4 x i32>, <4 x i32>* %p
    928     %2 = add <4 x i32> %1, %1
    929     %3 = bitcast <4 x i32> %2 to <2 x i64>
    930     %4 = add <2 x i64> %3, %3
    931     store <2 x i64> %4, <2 x i64>* %q
    932     ret void
    933 }
    934 
    935 ; CHECK-LABEL: test_v2i64_v8i16:
    936 define void @test_v2i64_v8i16(<8 x i16>* %p, <2 x i64>* %q) {
    937 ; CHECK: ld1 { v{{[0-9]+}}.8h }
    938 ; CHECK: rev64 v{{[0-9]+}}.8h
    939 ; CHECK: st1 { v{{[0-9]+}}.2d }
    940     %1 = load <8 x i16>, <8 x i16>* %p
    941     %2 = add <8 x i16> %1, %1
    942     %3 = bitcast <8 x i16> %2 to <2 x i64>
    943     %4 = add <2 x i64> %3, %3
    944     store <2 x i64> %4, <2 x i64>* %q
    945     ret void
    946 }
    947 
    948 ; CHECK-LABEL: test_v2i64_v16i8:
    949 define void @test_v2i64_v16i8(<16 x i8>* %p, <2 x i64>* %q) {
    950 ; CHECK: ld1 { v{{[0-9]+}}.16b }
    951 ; CHECK: rev64 v{{[0-9]+}}.16b
    952 ; CHECK: st1 { v{{[0-9]+}}.2d }
    953     %1 = load <16 x i8>, <16 x i8>* %p
    954     %2 = add <16 x i8> %1, %1
    955     %3 = bitcast <16 x i8> %2 to <2 x i64>
    956     %4 = add <2 x i64> %3, %3
    957     store <2 x i64> %4, <2 x i64>* %q
    958     ret void
    959 }
    960 
    961 ; CHECK-LABEL: test_v4f32_f128:
    962 define void @test_v4f32_f128(fp128* %p, <4 x float>* %q) {
    963 ; CHECK: ldr q
    964 ; CHECK: rev64 v{{[0-9]+}}.4s
    965 ; CHECK: ext
    966 ; CHECK-NOT: rev
    967 ; CHECK: st1 { v{{[0-9]+}}.4s }
    968     %1 = load fp128, fp128* %p
    969     %2 = fadd fp128 %1, %1
    970     %3 = bitcast fp128 %2 to <4 x float>
    971     %4 = fadd <4 x float> %3, %3
    972     store <4 x float> %4, <4 x float>* %q
    973     ret void
    974 }
    975 
    976 ; CHECK-LABEL: test_v4f32_v2f64:
    977 define void @test_v4f32_v2f64(<2 x double>* %p, <4 x float>* %q) {
    978 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    979 ; CHECK: rev64 v{{[0-9]+}}.4s
    980 ; CHECK-NOT: rev
    981 ; CHECK: st1 { v{{[0-9]+}}.4s }
    982     %1 = load <2 x double>, <2 x double>* %p
    983     %2 = fadd <2 x double> %1, %1
    984     %3 = bitcast <2 x double> %2 to <4 x float>
    985     %4 = fadd <4 x float> %3, %3
    986     store <4 x float> %4, <4 x float>* %q
    987     ret void
    988 }
    989 
    990 ; CHECK-LABEL: test_v4f32_v2i64:
    991 define void @test_v4f32_v2i64(<2 x i64>* %p, <4 x float>* %q) {
    992 ; CHECK: ld1 { v{{[0-9]+}}.2d }
    993 ; CHECK: rev64 v{{[0-9]+}}.4s
    994 ; CHECK: fadd
    995 ; CHECK-NOT: rev
    996 ; CHECK: st1 { v{{[0-9]+}}.4s }
    997     %1 = load <2 x i64>, <2 x i64>* %p
    998     %2 = add <2 x i64> %1, %1
    999     %3 = bitcast <2 x i64> %2 to <4 x float>
   1000     %4 = fadd <4 x float> %3, %3
   1001     store <4 x float> %4, <4 x float>* %q
   1002     ret void
   1003 }
   1004 
   1005 ; CHECK-LABEL: test_v4f32_v4i32:
   1006 define void @test_v4f32_v4i32(<4 x i32>* %p, <4 x float>* %q) {
   1007 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1008 ; CHECK-NOT: rev
   1009 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1010     %1 = load <4 x i32>, <4 x i32>* %p
   1011     %2 = add <4 x i32> %1, %1
   1012     %3 = bitcast <4 x i32> %2 to <4 x float>
   1013     %4 = fadd <4 x float> %3, %3
   1014     store <4 x float> %4, <4 x float>* %q
   1015     ret void
   1016 }
   1017 
   1018 ; CHECK-LABEL: test_v4f32_v8i16:
   1019 define void @test_v4f32_v8i16(<8 x i16>* %p, <4 x float>* %q) {
   1020 ; CHECK: ld1 { v{{[0-9]+}}.8h }
   1021 ; CHECK: rev32 v{{[0-9]+}}.8h
   1022 ; CHECK-NOT: rev
   1023 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1024     %1 = load <8 x i16>, <8 x i16>* %p
   1025     %2 = add <8 x i16> %1, %1
   1026     %3 = bitcast <8 x i16> %2 to <4 x float>
   1027     %4 = fadd <4 x float> %3, %3
   1028     store <4 x float> %4, <4 x float>* %q
   1029     ret void
   1030 }
   1031 
   1032 ; CHECK-LABEL: test_v4f32_v16i8:
   1033 define void @test_v4f32_v16i8(<16 x i8>* %p, <4 x float>* %q) {
   1034 ; CHECK: ld1 { v{{[0-9]+}}.16b }
   1035 ; CHECK: rev32 v{{[0-9]+}}.16b
   1036 ; CHECK-NOT: rev
   1037 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1038     %1 = load <16 x i8>, <16 x i8>* %p
   1039     %2 = add <16 x i8> %1, %1
   1040     %3 = bitcast <16 x i8> %2 to <4 x float>
   1041     %4 = fadd <4 x float> %3, %3
   1042     store <4 x float> %4, <4 x float>* %q
   1043     ret void
   1044 }
   1045 
   1046 ; CHECK-LABEL: test_v4i32_f128:
   1047 define void @test_v4i32_f128(fp128* %p, <4 x i32>* %q) {
   1048 ; CHECK: ldr
   1049 ; CHECK: rev64 v{{[0-9]+}}.4s
   1050 ; CHECK: ext
   1051 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1052     %1 = load fp128, fp128* %p
   1053     %2 = fadd fp128 %1, %1
   1054     %3 = bitcast fp128 %2 to <4 x i32>
   1055     %4 = add <4 x i32> %3, %3
   1056     store <4 x i32> %4, <4 x i32>* %q
   1057     ret void
   1058 }
   1059 
   1060 ; CHECK-LABEL: test_v4i32_v2f64:
   1061 define void @test_v4i32_v2f64(<2 x double>* %p, <4 x i32>* %q) {
   1062 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1063 ; CHECK: rev64 v{{[0-9]+}}.4s
   1064 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1065     %1 = load <2 x double>, <2 x double>* %p
   1066     %2 = fadd <2 x double> %1, %1
   1067     %3 = bitcast <2 x double> %2 to <4 x i32>
   1068     %4 = add <4 x i32> %3, %3
   1069     store <4 x i32> %4, <4 x i32>* %q
   1070     ret void
   1071 }
   1072 
   1073 ; CHECK-LABEL: test_v4i32_v2i64:
   1074 define void @test_v4i32_v2i64(<2 x i64>* %p, <4 x i32>* %q) {
   1075 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1076 ; CHECK: rev64 v{{[0-9]+}}.4s
   1077 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1078     %1 = load <2 x i64>, <2 x i64>* %p
   1079     %2 = add <2 x i64> %1, %1
   1080     %3 = bitcast <2 x i64> %2 to <4 x i32>
   1081     %4 = add <4 x i32> %3, %3
   1082     store <4 x i32> %4, <4 x i32>* %q
   1083     ret void
   1084 }
   1085 
   1086 ; CHECK-LABEL: test_v4i32_v4f32:
   1087 define void @test_v4i32_v4f32(<4 x float>* %p, <4 x i32>* %q) {
   1088 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1089 ; CHECK-NOT: rev
   1090 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1091     %1 = load <4 x float>, <4 x float>* %p
   1092     %2 = fadd <4 x float> %1, %1
   1093     %3 = bitcast <4 x float> %2 to <4 x i32>
   1094     %4 = add <4 x i32> %3, %3
   1095     store <4 x i32> %4, <4 x i32>* %q
   1096     ret void
   1097 }
   1098 
   1099 ; CHECK-LABEL: test_v4i32_v8i16:
   1100 define void @test_v4i32_v8i16(<8 x i16>* %p, <4 x i32>* %q) {
   1101 ; CHECK: ld1 { v{{[0-9]+}}.8h }
   1102 ; CHECK: rev32 v{{[0-9]+}}.8h
   1103 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1104     %1 = load <8 x i16>, <8 x i16>* %p
   1105     %2 = add <8 x i16> %1, %1
   1106     %3 = bitcast <8 x i16> %2 to <4 x i32>
   1107     %4 = add <4 x i32> %3, %3
   1108     store <4 x i32> %4, <4 x i32>* %q
   1109     ret void
   1110 }
   1111 
   1112 ; CHECK-LABEL: test_v4i32_v16i8:
   1113 define void @test_v4i32_v16i8(<16 x i8>* %p, <4 x i32>* %q) {
   1114 ; CHECK: ld1 { v{{[0-9]+}}.16b }
   1115 ; CHECK: rev32 v{{[0-9]+}}.16b
   1116 ; CHECK: st1 { v{{[0-9]+}}.4s }
   1117     %1 = load <16 x i8>, <16 x i8>* %p
   1118     %2 = add <16 x i8> %1, %1
   1119     %3 = bitcast <16 x i8> %2 to <4 x i32>
   1120     %4 = add <4 x i32> %3, %3
   1121     store <4 x i32> %4, <4 x i32>* %q
   1122     ret void
   1123 }
   1124 
   1125 ; CHECK-LABEL: test_v8i16_f128:
   1126 define void @test_v8i16_f128(fp128* %p, <8 x i16>* %q) {
   1127 ; CHECK: ldr
   1128 ; CHECK: rev64 v{{[0-9]+}}.8h
   1129 ; CHECK: ext
   1130 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1131     %1 = load fp128, fp128* %p
   1132     %2 = fadd fp128 %1, %1
   1133     %3 = bitcast fp128 %2 to <8 x i16>
   1134     %4 = add <8 x i16> %3, %3
   1135     store <8 x i16> %4, <8 x i16>* %q
   1136     ret void
   1137 }
   1138 
   1139 ; CHECK-LABEL: test_v8i16_v2f64:
   1140 define void @test_v8i16_v2f64(<2 x double>* %p, <8 x i16>* %q) {
   1141 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1142 ; CHECK: rev64 v{{[0-9]+}}.8h
   1143 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1144     %1 = load <2 x double>, <2 x double>* %p
   1145     %2 = fadd <2 x double> %1, %1
   1146     %3 = bitcast <2 x double> %2 to <8 x i16>
   1147     %4 = add <8 x i16> %3, %3
   1148     store <8 x i16> %4, <8 x i16>* %q
   1149     ret void
   1150 }
   1151 
   1152 ; CHECK-LABEL: test_v8i16_v2i64:
   1153 define void @test_v8i16_v2i64(<2 x i64>* %p, <8 x i16>* %q) {
   1154 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1155 ; CHECK: rev64 v{{[0-9]+}}.8h
   1156 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1157     %1 = load <2 x i64>, <2 x i64>* %p
   1158     %2 = add <2 x i64> %1, %1
   1159     %3 = bitcast <2 x i64> %2 to <8 x i16>
   1160     %4 = add <8 x i16> %3, %3
   1161     store <8 x i16> %4, <8 x i16>* %q
   1162     ret void
   1163 }
   1164 
   1165 ; CHECK-LABEL: test_v8i16_v4f32:
   1166 define void @test_v8i16_v4f32(<4 x float>* %p, <8 x i16>* %q) {
   1167 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1168 ; CHECK: rev32 v{{[0-9]+}}.8h
   1169 ; CHECK-NOT: rev
   1170 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1171     %1 = load <4 x float>, <4 x float>* %p
   1172     %2 = fadd <4 x float> %1, %1
   1173     %3 = bitcast <4 x float> %2 to <8 x i16>
   1174     %4 = add <8 x i16> %3, %3
   1175     store <8 x i16> %4, <8 x i16>* %q
   1176     ret void
   1177 }
   1178 
   1179 ; CHECK-LABEL: test_v8i16_v4i32:
   1180 define void @test_v8i16_v4i32(<4 x i32>* %p, <8 x i16>* %q) {
   1181 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1182 ; CHECK: rev32 v{{[0-9]+}}.8h
   1183 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1184     %1 = load <4 x i32>, <4 x i32>* %p
   1185     %2 = add <4 x i32> %1, %1
   1186     %3 = bitcast <4 x i32> %2 to <8 x i16>
   1187     %4 = add <8 x i16> %3, %3
   1188     store <8 x i16> %4, <8 x i16>* %q
   1189     ret void
   1190 }
   1191 
   1192 ; CHECK-LABEL: test_v8i16_v8f16:
   1193 define void @test_v8i16_v8f16(<8 x half>* %p, <8 x i16>* %q) {
   1194 ; CHECK: ld1 { v{{[0-9]+}}.8h }
   1195 ; CHECK-NOT: rev
   1196 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1197     %1 = load <8 x half>, <8 x half>* %p
   1198     %2 = fadd <8 x half> %1, %1
   1199     %3 = bitcast <8 x half> %2 to <8 x i16>
   1200     %4 = add <8 x i16> %3, %3
   1201     store <8 x i16> %4, <8 x i16>* %q
   1202     ret void
   1203 }
   1204 
   1205 ; CHECK-LABEL: test_v8i16_v16i8:
   1206 define void @test_v8i16_v16i8(<16 x i8>* %p, <8 x i16>* %q) {
   1207 ; CHECK: ld1 { v{{[0-9]+}}.16b }
   1208 ; CHECK: rev16 v{{[0-9]+}}.16b
   1209 ; CHECK: st1 { v{{[0-9]+}}.8h }
   1210     %1 = load <16 x i8>, <16 x i8>* %p
   1211     %2 = add <16 x i8> %1, %1
   1212     %3 = bitcast <16 x i8> %2 to <8 x i16>
   1213     %4 = add <8 x i16> %3, %3
   1214     store <8 x i16> %4, <8 x i16>* %q
   1215     ret void
   1216 }
   1217 
   1218 ; CHECK-LABEL: test_v16i8_f128:
   1219 define void @test_v16i8_f128(fp128* %p, <16 x i8>* %q) {
   1220 ; CHECK: ldr q
   1221 ; CHECK: rev64 v{{[0-9]+}}.16b
   1222 ; CHECK: ext
   1223 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1224     %1 = load fp128, fp128* %p
   1225     %2 = fadd fp128 %1, %1
   1226     %3 = bitcast fp128 %2 to <16 x i8>
   1227     %4 = add <16 x i8> %3, %3
   1228     store <16 x i8> %4, <16 x i8>* %q
   1229     ret void
   1230 }
   1231 
   1232 ; CHECK-LABEL: test_v16i8_v2f64:
   1233 define void @test_v16i8_v2f64(<2 x double>* %p, <16 x i8>* %q) {
   1234 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1235 ; CHECK: rev64 v{{[0-9]+}}.16b
   1236 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1237     %1 = load <2 x double>, <2 x double>* %p
   1238     %2 = fadd <2 x double> %1, %1
   1239     %3 = bitcast <2 x double> %2 to <16 x i8>
   1240     %4 = add <16 x i8> %3, %3
   1241     store <16 x i8> %4, <16 x i8>* %q
   1242     ret void
   1243 }
   1244 
   1245 ; CHECK-LABEL: test_v16i8_v2i64:
   1246 define void @test_v16i8_v2i64(<2 x i64>* %p, <16 x i8>* %q) {
   1247 ; CHECK: ld1 { v{{[0-9]+}}.2d }
   1248 ; CHECK: rev64 v{{[0-9]+}}.16b
   1249 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1250     %1 = load <2 x i64>, <2 x i64>* %p
   1251     %2 = add <2 x i64> %1, %1
   1252     %3 = bitcast <2 x i64> %2 to <16 x i8>
   1253     %4 = add <16 x i8> %3, %3
   1254     store <16 x i8> %4, <16 x i8>* %q
   1255     ret void
   1256 }
   1257 
   1258 ; CHECK-LABEL: test_v16i8_v4f32:
   1259 define void @test_v16i8_v4f32(<4 x float>* %p, <16 x i8>* %q) {
   1260 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1261 ; CHECK: rev32 v{{[0-9]+}}.16b
   1262 ; CHECK-NOT: rev
   1263 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1264     %1 = load <4 x float>, <4 x float>* %p
   1265     %2 = fadd <4 x float> %1, %1
   1266     %3 = bitcast <4 x float> %2 to <16 x i8>
   1267     %4 = add <16 x i8> %3, %3
   1268     store <16 x i8> %4, <16 x i8>* %q
   1269     ret void
   1270 }
   1271 
   1272 ; CHECK-LABEL: test_v16i8_v4i32:
   1273 define void @test_v16i8_v4i32(<4 x i32>* %p, <16 x i8>* %q) {
   1274 ; CHECK: ld1 { v{{[0-9]+}}.4s }
   1275 ; CHECK: rev32 v{{[0-9]+}}.16b
   1276 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1277     %1 = load <4 x i32>, <4 x i32>* %p
   1278     %2 = add <4 x i32> %1, %1
   1279     %3 = bitcast <4 x i32> %2 to <16 x i8>
   1280     %4 = add <16 x i8> %3, %3
   1281     store <16 x i8> %4, <16 x i8>* %q
   1282     ret void
   1283 }
   1284 
   1285 ; CHECK-LABEL: test_v16i8_v8f16:
   1286 define void @test_v16i8_v8f16(<8 x half>* %p, <16 x i8>* %q) {
   1287 ; CHECK: ld1 { v{{[0-9]+}}.8h }
   1288 ; CHECK: rev16 v{{[0-9]+}}.16b
   1289 ; CHECK-NOT: rev
   1290 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1291     %1 = load <8 x half>, <8 x half>* %p
   1292     %2 = fadd <8 x half> %1, %1
   1293     %3 = bitcast <8 x half> %2 to <16 x i8>
   1294     %4 = add <16 x i8> %3, %3
   1295     store <16 x i8> %4, <16 x i8>* %q
   1296     ret void
   1297 }
   1298 
   1299 ; CHECK-LABEL: test_v16i8_v8i16:
   1300 define void @test_v16i8_v8i16(<8 x i16>* %p, <16 x i8>* %q) {
   1301 ; CHECK: ld1 { v{{[0-9]+}}.8h }
   1302 ; CHECK: rev16 v{{[0-9]+}}.16b
   1303 ; CHECK: st1 { v{{[0-9]+}}.16b }
   1304     %1 = load <8 x i16>, <8 x i16>* %p
   1305     %2 = add <8 x i16> %1, %1
   1306     %3 = bitcast <8 x i16> %2 to <16 x i8>
   1307     %4 = add <16 x i8> %3, %3
   1308     store <16 x i8> %4, <16 x i8>* %q
   1309     ret void
   1310 }
   1311 
   1312 ; CHECK-LABEL: test_v4f16_struct:
   1313 %struct.struct1 = type { half, half, half, half }
   1314 define %struct.struct1 @test_v4f16_struct(%struct.struct1* %ret) {
   1315 entry:
   1316 ; CHECK: ld1 { {{v[0-9]+}}.4h }
   1317 ; CHECK-NOT: rev
   1318   %0 = bitcast %struct.struct1* %ret to <4 x half>*
   1319   %1 = load <4 x half>, <4 x half>* %0, align 2
   1320   %2 = extractelement <4 x half> %1, i32 0
   1321   %.fca.0.insert = insertvalue %struct.struct1 undef, half %2, 0
   1322   ret %struct.struct1 %.fca.0.insert
   1323 }
   1324