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