Home | History | Annotate | Download | only in llvm2ice_tests
      1 ; Tests validating the vfp calling convention for ARM32.
      2 ;
      3 ; RUN: %if --need=target_ARM32 \
      4 ; RUN:   --command %p2i --filetype=obj \
      5 ; RUN:   --disassemble --target arm32 -i %s --args -O2 \
      6 ; RUN:   -allow-externally-defined-symbols \
      7 ; RUN:   | %if --need=target_ARM32 \
      8 ; RUN:   --command FileCheck %s
      9 ; RUN: %if --need=target_ARM32 \
     10 ; RUN:   --command %p2i --filetype=obj --disassemble --target arm32 \
     11 ; RUN:   -i %s --args -Om1 \
     12 ; RUN:   -allow-externally-defined-symbols \
     13 ; RUN:   | %if --need=target_ARM32 \
     14 ; RUN:   --command FileCheck %s
     15 
     16 ; Boring tests ensuring float arguments are allocated "correctly." Unfortunately
     17 ; this test cannot verify whether the right arguments are being allocated to the
     18 ; right register.
     19 declare void @float1(float %p0)
     20 declare void @float2(float %p0, float %p1)
     21 declare void @float3(float %p0, float %p1, float %p2)
     22 declare void @float4(float %p0, float %p1, float %p2, float %p3)
     23 declare void @float5(float %p0, float %p1, float %p2, float %p3, float %p4)
     24 declare void @float6(float %p0, float %p1, float %p2, float %p3, float %p4,
     25                      float %p5)
     26 declare void @float7(float %p0, float %p1, float %p2, float %p3, float %p4,
     27                      float %p5, float %p6)
     28 declare void @float8(float %p0, float %p1, float %p2, float %p3, float %p4,
     29                      float %p5, float %p6, float %p7)
     30 declare void @float9(float %p0, float %p1, float %p2, float %p3, float %p4,
     31                      float %p5, float %p6, float %p7, float %p8)
     32 declare void @float10(float %p0, float %p1, float %p2, float %p3, float %p4,
     33                       float %p5, float %p6, float %p7, float %p8, float %p9)
     34 declare void @float11(float %p0, float %p1, float %p2, float %p3, float %p4,
     35                       float %p5, float %p6, float %p7, float %p8, float %p9,
     36                       float %p10)
     37 declare void @float12(float %p0, float %p1, float %p2, float %p3, float %p4,
     38                       float %p5, float %p6, float %p7, float %p8, float %p9,
     39                       float %p10, float %p11)
     40 declare void @float13(float %p0, float %p1, float %p2, float %p3, float %p4,
     41                       float %p5, float %p6, float %p7, float %p8, float %p9,
     42                       float %p10, float %p11, float %p12)
     43 declare void @float14(float %p0, float %p1, float %p2, float %p3, float %p4,
     44                       float %p5, float %p6, float %p7, float %p8, float %p9,
     45                       float %p10, float %p11, float %p12, float %p13)
     46 declare void @float15(float %p0, float %p1, float %p2, float %p3, float %p4,
     47                       float %p5, float %p6, float %p7, float %p8, float %p9,
     48                       float %p10, float %p11, float %p12, float %p13,
     49                       float %p14)
     50 declare void @float16(float %p0, float %p1, float %p2, float %p3, float %p4,
     51                       float %p5, float %p6, float %p7, float %p8, float %p9,
     52                       float %p10, float %p11, float %p12, float %p13,
     53                       float %p14, float %p15)
     54 declare void @float17(float %p0, float %p1, float %p2, float %p3, float %p4,
     55                       float %p5, float %p6, float %p7, float %p8, float %p9,
     56                       float %p10, float %p11, float %p12, float %p13,
     57                       float %p14, float %p15, float %p16)
     58 declare void @float18(float %p0, float %p1, float %p2, float %p3, float %p4,
     59                       float %p5, float %p6, float %p7, float %p8, float %p9,
     60                       float %p10, float %p11, float %p12, float %p13,
     61                       float %p14, float %p15, float %p16, float %p17)
     62 define internal void @floatHarness() nounwind {
     63 ; CHECK-LABEL: floatHarness
     64   call void @float1(float 1.0)
     65 ; CHECK-DAG: vmov.f32 s0
     66 ; CHECK: bl {{.*}} float1
     67   call void @float2(float 1.0, float 2.0)
     68 ; CHECK-DAG: vmov.f32 s0
     69 ; CHECK-DAG: vmov.f32 s1
     70 ; CHECK: bl {{.*}} float2
     71   call void @float3(float 1.0, float 2.0, float 3.0)
     72 ; CHECK-DAG: vmov.f32 s0
     73 ; CHECK-DAG: vmov.f32 s1
     74 ; CHECK-DAG: vmov.f32 s2
     75 ; CHECK: bl {{.*}} float3
     76   call void @float4(float 1.0, float 2.0, float 3.0, float 4.0)
     77 ; CHECK-DAG: vmov.f32 s0
     78 ; CHECK-DAG: vmov.f32 s1
     79 ; CHECK-DAG: vmov.f32 s2
     80 ; CHECK-DAG: vmov.f32 s3
     81 ; CHECK: bl {{.*}} float4
     82   call void @float5(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0)
     83 ; CHECK-DAG: vmov.f32 s0
     84 ; CHECK-DAG: vmov.f32 s1
     85 ; CHECK-DAG: vmov.f32 s2
     86 ; CHECK-DAG: vmov.f32 s3
     87 ; CHECK-DAG: vmov.f32 s4
     88 ; CHECK: bl {{.*}} float5
     89   call void @float6(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
     90                     float 6.0)
     91 ; CHECK-DAG: vmov.f32 s0
     92 ; CHECK-DAG: vmov.f32 s1
     93 ; CHECK-DAG: vmov.f32 s2
     94 ; CHECK-DAG: vmov.f32 s3
     95 ; CHECK-DAG: vmov.f32 s4
     96 ; CHECK-DAG: vmov.f32 s5
     97 ; CHECK: bl {{.*}} float6
     98   call void @float7(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
     99                     float 6.0, float 7.0)
    100 ; CHECK-DAG: vmov.f32 s0
    101 ; CHECK-DAG: vmov.f32 s1
    102 ; CHECK-DAG: vmov.f32 s2
    103 ; CHECK-DAG: vmov.f32 s3
    104 ; CHECK-DAG: vmov.f32 s4
    105 ; CHECK-DAG: vmov.f32 s5
    106 ; CHECK-DAG: vmov.f32 s6
    107 ; CHECK: bl {{.*}} float7
    108   call void @float8(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    109                     float 6.0, float 7.0, float 8.0)
    110 ; CHECK-DAG: vmov.f32 s0
    111 ; CHECK-DAG: vmov.f32 s1
    112 ; CHECK-DAG: vmov.f32 s2
    113 ; CHECK-DAG: vmov.f32 s3
    114 ; CHECK-DAG: vmov.f32 s4
    115 ; CHECK-DAG: vmov.f32 s5
    116 ; CHECK-DAG: vmov.f32 s6
    117 ; CHECK-DAG: vmov.f32 s7
    118 ; CHECK: bl {{.*}} float8
    119   call void @float9(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    120                     float 6.0, float 7.0, float 8.0, float 9.0)
    121 ; CHECK-DAG: vmov.f32 s0
    122 ; CHECK-DAG: vmov.f32 s1
    123 ; CHECK-DAG: vmov.f32 s2
    124 ; CHECK-DAG: vmov.f32 s3
    125 ; CHECK-DAG: vmov.f32 s4
    126 ; CHECK-DAG: vmov.f32 s5
    127 ; CHECK-DAG: vmov.f32 s6
    128 ; CHECK-DAG: vmov.f32 s7
    129 ; CHECK-DAG: vmov.f32 s8
    130 ; CHECK: bl {{.*}} float9
    131   call void @float10(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    132                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0)
    133 ; CHECK-DAG: vmov.f32 s0
    134 ; CHECK-DAG: vmov.f32 s1
    135 ; CHECK-DAG: vmov.f32 s2
    136 ; CHECK-DAG: vmov.f32 s3
    137 ; CHECK-DAG: vmov.f32 s4
    138 ; CHECK-DAG: vmov.f32 s5
    139 ; CHECK-DAG: vmov.f32 s6
    140 ; CHECK-DAG: vmov.f32 s7
    141 ; CHECK-DAG: vmov.f32 s8
    142 ; CHECK-DAG: vmov.f32 s9
    143 ; CHECK: bl {{.*}} float10
    144   call void @float11(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    145                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    146                     float 11.0)
    147 ; CHECK-DAG: vmov.f32 s0
    148 ; CHECK-DAG: vmov.f32 s1
    149 ; CHECK-DAG: vmov.f32 s2
    150 ; CHECK-DAG: vmov.f32 s3
    151 ; CHECK-DAG: vmov.f32 s4
    152 ; CHECK-DAG: vmov.f32 s5
    153 ; CHECK-DAG: vmov.f32 s6
    154 ; CHECK-DAG: vmov.f32 s7
    155 ; CHECK-DAG: vmov.f32 s8
    156 ; CHECK-DAG: vmov.f32 s9
    157 ; CHECK-DAG: vmov.f32 s10
    158 ; CHECK: bl {{.*}} float11
    159   call void @float12(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    160                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    161                     float 11.0, float 12.0)
    162 ; CHECK-DAG: vmov.f32 s0
    163 ; CHECK-DAG: vmov.f32 s1
    164 ; CHECK-DAG: vmov.f32 s2
    165 ; CHECK-DAG: vmov.f32 s3
    166 ; CHECK-DAG: vmov.f32 s4
    167 ; CHECK-DAG: vmov.f32 s5
    168 ; CHECK-DAG: vmov.f32 s6
    169 ; CHECK-DAG: vmov.f32 s7
    170 ; CHECK-DAG: vmov.f32 s8
    171 ; CHECK-DAG: vmov.f32 s9
    172 ; CHECK-DAG: vmov.f32 s10
    173 ; CHECK-DAG: vmov.f32 s11
    174 ; CHECK: bl {{.*}} float12
    175   call void @float13(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    176                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    177                     float 11.0, float 12.0, float 13.0)
    178 ; CHECK-DAG: vmov.f32 s0
    179 ; CHECK-DAG: vmov.f32 s1
    180 ; CHECK-DAG: vmov.f32 s2
    181 ; CHECK-DAG: vmov.f32 s3
    182 ; CHECK-DAG: vmov.f32 s4
    183 ; CHECK-DAG: vmov.f32 s5
    184 ; CHECK-DAG: vmov.f32 s6
    185 ; CHECK-DAG: vmov.f32 s7
    186 ; CHECK-DAG: vmov.f32 s8
    187 ; CHECK-DAG: vmov.f32 s9
    188 ; CHECK-DAG: vmov.f32 s10
    189 ; CHECK-DAG: vmov.f32 s11
    190 ; CHECK-DAG: vmov.f32 s12
    191 ; CHECK: bl {{.*}} float13
    192   call void @float14(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    193                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    194                     float 11.0, float 12.0, float 13.0, float 14.0)
    195 ; CHECK-DAG: vmov.f32 s0
    196 ; CHECK-DAG: vmov.f32 s1
    197 ; CHECK-DAG: vmov.f32 s2
    198 ; CHECK-DAG: vmov.f32 s3
    199 ; CHECK-DAG: vmov.f32 s4
    200 ; CHECK-DAG: vmov.f32 s5
    201 ; CHECK-DAG: vmov.f32 s6
    202 ; CHECK-DAG: vmov.f32 s7
    203 ; CHECK-DAG: vmov.f32 s8
    204 ; CHECK-DAG: vmov.f32 s9
    205 ; CHECK-DAG: vmov.f32 s10
    206 ; CHECK-DAG: vmov.f32 s11
    207 ; CHECK-DAG: vmov.f32 s12
    208 ; CHECK-DAG: vmov.f32 s13
    209 ; CHECK: bl {{.*}} float14
    210   call void @float15(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    211                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    212                     float 11.0, float 12.0, float 13.0, float 14.0,
    213                     float 15.0)
    214 ; CHECK-DAG: vmov.f32 s0
    215 ; CHECK-DAG: vmov.f32 s1
    216 ; CHECK-DAG: vmov.f32 s2
    217 ; CHECK-DAG: vmov.f32 s3
    218 ; CHECK-DAG: vmov.f32 s4
    219 ; CHECK-DAG: vmov.f32 s5
    220 ; CHECK-DAG: vmov.f32 s6
    221 ; CHECK-DAG: vmov.f32 s7
    222 ; CHECK-DAG: vmov.f32 s8
    223 ; CHECK-DAG: vmov.f32 s9
    224 ; CHECK-DAG: vmov.f32 s10
    225 ; CHECK-DAG: vmov.f32 s11
    226 ; CHECK-DAG: vmov.f32 s12
    227 ; CHECK-DAG: vmov.f32 s13
    228 ; CHECK-DAG: vmov.f32 s14
    229 ; CHECK: bl {{.*}} float15
    230   call void @float16(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    231                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    232                     float 11.0, float 12.0, float 13.0, float 14.0,
    233                     float 15.0, float 16.0)
    234 ; CHECK-DAG: vmov.f32 s0
    235 ; CHECK-DAG: vmov.f32 s1
    236 ; CHECK-DAG: vmov.f32 s2
    237 ; CHECK-DAG: vmov.f32 s3
    238 ; CHECK-DAG: vmov.f32 s4
    239 ; CHECK-DAG: vmov.f32 s5
    240 ; CHECK-DAG: vmov.f32 s6
    241 ; CHECK-DAG: vmov.f32 s7
    242 ; CHECK-DAG: vmov.f32 s8
    243 ; CHECK-DAG: vmov.f32 s9
    244 ; CHECK-DAG: vmov.f32 s10
    245 ; CHECK-DAG: vmov.f32 s11
    246 ; CHECK-DAG: vmov.f32 s12
    247 ; CHECK-DAG: vmov.f32 s13
    248 ; CHECK-DAG: vmov.f32 s14
    249 ; CHECK-DAG: vmov.f32 s15
    250 ; CHECK: bl {{.*}} float16
    251   call void @float17(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    252                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    253                     float 11.0, float 12.0, float 13.0, float 14.0,
    254                     float 15.0, float 16.0, float 17.0)
    255 ; CHECK-DAG: vmov.f32 s0
    256 ; CHECK-DAG: vmov.f32 s1
    257 ; CHECK-DAG: vmov.f32 s2
    258 ; CHECK-DAG: vmov.f32 s3
    259 ; CHECK-DAG: vmov.f32 s4
    260 ; CHECK-DAG: vmov.f32 s5
    261 ; CHECK-DAG: vmov.f32 s6
    262 ; CHECK-DAG: vmov.f32 s7
    263 ; CHECK-DAG: vmov.f32 s8
    264 ; CHECK-DAG: vmov.f32 s9
    265 ; CHECK-DAG: vmov.f32 s10
    266 ; CHECK-DAG: vmov.f32 s11
    267 ; CHECK-DAG: vmov.f32 s12
    268 ; CHECK-DAG: vmov.f32 s13
    269 ; CHECK-DAG: vmov.f32 s14
    270 ; CHECK-DAG: vmov.f32 s15
    271 ; CHECK-DAG: vstr s{{.*}}, [sp]
    272 ; CHECK: bl {{.*}} float17
    273   call void @float18(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
    274                     float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
    275                     float 11.0, float 12.0, float 13.0, float 14.0,
    276                     float 15.0, float 16.0, float 17.0, float 18.0)
    277 ; CHECK-DAG: vmov.f32 s0
    278 ; CHECK-DAG: vmov.f32 s1
    279 ; CHECK-DAG: vmov.f32 s2
    280 ; CHECK-DAG: vmov.f32 s3
    281 ; CHECK-DAG: vmov.f32 s4
    282 ; CHECK-DAG: vmov.f32 s5
    283 ; CHECK-DAG: vmov.f32 s6
    284 ; CHECK-DAG: vmov.f32 s7
    285 ; CHECK-DAG: vmov.f32 s8
    286 ; CHECK-DAG: vmov.f32 s9
    287 ; CHECK-DAG: vmov.f32 s10
    288 ; CHECK-DAG: vmov.f32 s11
    289 ; CHECK-DAG: vmov.f32 s12
    290 ; CHECK-DAG: vmov.f32 s13
    291 ; CHECK-DAG: vmov.f32 s14
    292 ; CHECK-DAG: vmov.f32 s15
    293 ; CHECK-DAG: vstr s{{.*}}, [sp]
    294 ; CHECK-DAG: vstr s{{.*}}, [sp, #4]
    295 ; CHECK: bl {{.*}} float18
    296   ret void
    297 }
    298 
    299 declare void @double1(double %p0)
    300 declare void @double2(double %p0, double %p1)
    301 declare void @double3(double %p0, double %p1, double %p2)
    302 declare void @double4(double %p0, double %p1, double %p2, double %p3)
    303 declare void @double5(double %p0, double %p1, double %p2, double %p3,
    304                       double %p4)
    305 declare void @double6(double %p0, double %p1, double %p2, double %p3,
    306                       double %p4, double %p5)
    307 declare void @double7(double %p0, double %p1, double %p2, double %p3,
    308                       double %p4, double %p5, double %p6)
    309 declare void @double8(double %p0, double %p1, double %p2, double %p3,
    310                       double %p4, double %p5, double %p6, double %p7)
    311 declare void @double9(double %p0, double %p1, double %p2, double %p3,
    312                       double %p4, double %p5, double %p6, double %p7,
    313                       double %p8)
    314 declare void @double10(double %p0, double %p1, double %p2, double %p3,
    315                       double %p4, double %p5, double %p6, double %p7,
    316                       double %p8, double %p9)
    317 define internal void @doubleHarness() nounwind {
    318 ; CHECK-LABEL: doubleHarness
    319   call void @double1(double 1.0)
    320 ; CHECK-DAG: vmov.f64 d0
    321 ; CHECK: bl {{.*}} double1
    322   call void @double2(double 1.0, double 2.0)
    323 ; CHECK-DAG: vmov.f64 d0
    324 ; CHECK-DAG: vmov.f64 d1
    325 ; CHECK: bl {{.*}} double2
    326   call void @double3(double 1.0, double 2.0, double 3.0)
    327 ; CHECK-DAG: vmov.f64 d0
    328 ; CHECK-DAG: vmov.f64 d1
    329 ; CHECK-DAG: vmov.f64 d2
    330 ; CHECK: bl {{.*}} double3
    331   call void @double4(double 1.0, double 2.0, double 3.0, double 4.0)
    332 ; CHECK-DAG: vmov.f64 d0
    333 ; CHECK-DAG: vmov.f64 d1
    334 ; CHECK-DAG: vmov.f64 d2
    335 ; CHECK-DAG: vmov.f64 d3
    336 ; CHECK: bl {{.*}} double4
    337   call void @double5(double 1.0, double 2.0, double 3.0, double 4.0,
    338                      double 5.0)
    339 ; CHECK-DAG: vmov.f64 d0
    340 ; CHECK-DAG: vmov.f64 d1
    341 ; CHECK-DAG: vmov.f64 d2
    342 ; CHECK-DAG: vmov.f64 d3
    343 ; CHECK-DAG: vmov.f64 d4
    344 ; CHECK: bl {{.*}} double5
    345   call void @double6(double 1.0, double 2.0, double 3.0, double 4.0,
    346                      double 5.0, double 6.0)
    347 ; CHECK-DAG: vmov.f64 d0
    348 ; CHECK-DAG: vmov.f64 d1
    349 ; CHECK-DAG: vmov.f64 d2
    350 ; CHECK-DAG: vmov.f64 d3
    351 ; CHECK-DAG: vmov.f64 d4
    352 ; CHECK-DAG: vmov.f64 d5
    353 ; CHECK: bl {{.*}} double6
    354   call void @double7(double 1.0, double 2.0, double 3.0, double 4.0,
    355                      double 5.0, double 6.0, double 7.0)
    356 ; CHECK-DAG: vmov.f64 d0
    357 ; CHECK-DAG: vmov.f64 d1
    358 ; CHECK-DAG: vmov.f64 d2
    359 ; CHECK-DAG: vmov.f64 d3
    360 ; CHECK-DAG: vmov.f64 d4
    361 ; CHECK-DAG: vmov.f64 d5
    362 ; CHECK-DAG: vmov.f64 d6
    363 ; CHECK: bl {{.*}} double7
    364   call void @double8(double 1.0, double 2.0, double 3.0, double 4.0,
    365                      double 5.0, double 6.0, double 7.0, double 8.0)
    366 ; CHECK-DAG: vmov.f64 d0
    367 ; CHECK-DAG: vmov.f64 d1
    368 ; CHECK-DAG: vmov.f64 d2
    369 ; CHECK-DAG: vmov.f64 d3
    370 ; CHECK-DAG: vmov.f64 d4
    371 ; CHECK-DAG: vmov.f64 d5
    372 ; CHECK-DAG: vmov.f64 d6
    373 ; CHECK-DAG: vmov.f64 d7
    374 ; CHECK: bl {{.*}} double8
    375   call void @double9(double 1.0, double 2.0, double 3.0, double 4.0,
    376                      double 5.0, double 6.0, double 7.0, double 8.0,
    377                      double 9.0)
    378 ; CHECK-DAG: vmov.f64 d0
    379 ; CHECK-DAG: vmov.f64 d1
    380 ; CHECK-DAG: vmov.f64 d2
    381 ; CHECK-DAG: vmov.f64 d3
    382 ; CHECK-DAG: vmov.f64 d4
    383 ; CHECK-DAG: vmov.f64 d5
    384 ; CHECK-DAG: vmov.f64 d6
    385 ; CHECK-DAG: vmov.f64 d7
    386 ; CHECK-DAG: vstr d{{.*}}, [sp]
    387 ; CHECK: bl {{.*}} double9
    388   call void @double10(double 1.0, double 2.0, double 3.0, double 4.0,
    389                      double 5.0, double 6.0, double 7.0, double 8.0,
    390                      double 9.0, double 10.0)
    391 ; CHECK-DAG: vmov.f64 d0
    392 ; CHECK-DAG: vmov.f64 d1
    393 ; CHECK-DAG: vmov.f64 d2
    394 ; CHECK-DAG: vmov.f64 d3
    395 ; CHECK-DAG: vmov.f64 d4
    396 ; CHECK-DAG: vmov.f64 d5
    397 ; CHECK-DAG: vmov.f64 d6
    398 ; CHECK-DAG: vmov.f64 d7
    399 ; CHECK-DAG: vstr d{{.*}}, [sp]
    400 ; CHECK-DAG: vstr d{{.*}}, [sp, #8]
    401 ; CHECK: bl {{.*}} double10
    402 
    403   ret void
    404 }
    405 
    406 declare void @testFDF(float %p0, double %p1, float %p2)
    407 declare void @testFDDF(float %p0, double %p1, double %p2, float %p3)
    408 declare void @testFDDDF(float %p0, double %p1, double %p2, double %p3,
    409                         float %p4)
    410 declare void @testFDDDDF(float %p0, double %p1, double %p2, double %p3,
    411                          double %p4, float %p5)
    412 declare void @testFDDDDDF(float %p0, double %p1, double %p2, double %p3,
    413                           double %p4, double %p5, float %p6)
    414 declare void @testFDDDDDDF(float %p0, double %p1, double %p2, double %p3,
    415                            double %p4, double %p5, double %p6, float %p7)
    416 declare void @testFDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
    417                             double %p4, double %p5, double %p6, double %p7,
    418                             float %p8)
    419 declare void @testFDDDDDDDFD(float %p0, double %p1, double %p2, double %p3,
    420                              double %p4, double %p5, double %p6, double %p7,
    421                              float %p8, double %p9)
    422 declare void @testFDDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
    423                              double %p4, double %p5, double %p6, double %p7,
    424                              double %p8, float %p9)
    425 declare void @testFDDDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
    426                               double %p4, double %p5, double %p6, double %p7,
    427                               double %p8, double %p9, float %p10)
    428 declare void @testFDDDDDDDDFD(float %p0, double %p1, double %p2, double %p3,
    429                               double %p4, double %p5, double %p6, double %p7,
    430                               double %p8, float %p9, double %p10)
    431 declare void @testFDDDDDDDDFDF(float %p0, double %p1, double %p2, double %p3,
    432                                double %p4, double %p5, double %p6, double %p7,
    433                                double %p8, float %p9, double %p10, float %p11)
    434 define internal void @packsFloats() nounwind {
    435 ; CHECK-LABEL: packsFloats
    436   call void @testFDF(float 1.0, double 2.0, float 3.0)
    437 ; CHECK-DAG: vmov.f32 s0
    438 ; CHECK-DAG: vmov.f64 d1
    439 ; CHECK-DAG: vmov.f32 s1
    440 ; CHECK: bl {{.*}} testFDF
    441   call void @testFDDF(float 1.0, double 2.0, double 3.0, float 4.0)
    442 ; CHECK-DAG: vmov.f32 s0
    443 ; CHECK-DAG: vmov.f64 d1
    444 ; CHECK-DAG: vmov.f64 d2
    445 ; CHECK-DAG: vmov.f32 s1
    446 ; CHECK: bl {{.*}} testFDDF
    447   call void @testFDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    448                        float 5.0)
    449 ; CHECK-DAG: vmov.f32 s0
    450 ; CHECK-DAG: vmov.f64 d1
    451 ; CHECK-DAG: vmov.f64 d2
    452 ; CHECK-DAG: vmov.f64 d3
    453 ; CHECK-DAG: vmov.f32 s1
    454 ; CHECK: bl {{.*}} testFDDDF
    455   call void @testFDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    456                         double 5.0, float 6.0)
    457 ; CHECK-DAG: vmov.f32 s0
    458 ; CHECK-DAG: vmov.f64 d1
    459 ; CHECK-DAG: vmov.f64 d2
    460 ; CHECK-DAG: vmov.f64 d3
    461 ; CHECK-DAG: vmov.f64 d4
    462 ; CHECK-DAG: vmov.f32 s1
    463 ; CHECK: bl {{.*}} testFDDDDF
    464   call void @testFDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    465                          double 5.0, double 6.0, float 7.0)
    466 ; CHECK-DAG: vmov.f32 s0
    467 ; CHECK-DAG: vmov.f64 d1
    468 ; CHECK-DAG: vmov.f64 d2
    469 ; CHECK-DAG: vmov.f64 d3
    470 ; CHECK-DAG: vmov.f64 d4
    471 ; CHECK-DAG: vmov.f64 d5
    472 ; CHECK-DAG: vmov.f32 s1
    473 ; CHECK: bl {{.*}} testFDDDDDF
    474   call void @testFDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    475                           double 5.0, double 6.0, double 7.0, float 8.0)
    476 ; CHECK-DAG: vmov.f32 s0
    477 ; CHECK-DAG: vmov.f64 d1
    478 ; CHECK-DAG: vmov.f64 d2
    479 ; CHECK-DAG: vmov.f64 d3
    480 ; CHECK-DAG: vmov.f64 d4
    481 ; CHECK-DAG: vmov.f64 d5
    482 ; CHECK-DAG: vmov.f64 d6
    483 ; CHECK-DAG: vmov.f32 s1
    484 ; CHECK: bl {{.*}} testFDDDDDDF
    485   call void @testFDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    486                            double 5.0, double 6.0, double 7.0, double 8.0,
    487                            float 9.0)
    488 ; CHECK-DAG: vmov.f32 s0
    489 ; CHECK-DAG: vmov.f64 d1
    490 ; CHECK-DAG: vmov.f64 d2
    491 ; CHECK-DAG: vmov.f64 d3
    492 ; CHECK-DAG: vmov.f64 d4
    493 ; CHECK-DAG: vmov.f64 d5
    494 ; CHECK-DAG: vmov.f64 d6
    495 ; CHECK-DAG: vmov.f64 d7
    496 ; CHECK-DAG: vmov.f32 s1
    497 ; CHECK: bl {{.*}} testFDDDDDDDF
    498   call void @testFDDDDDDDFD(float 1.0, double 2.0, double 3.0, double 4.0,
    499                             double 5.0, double 6.0, double 7.0, double 8.0,
    500                             float 9.0, double 10.0)
    501 ; CHECK-DAG: vmov.f32 s0
    502 ; CHECK-DAG: vmov.f64 d1
    503 ; CHECK-DAG: vmov.f64 d2
    504 ; CHECK-DAG: vmov.f64 d3
    505 ; CHECK-DAG: vmov.f64 d4
    506 ; CHECK-DAG: vmov.f64 d5
    507 ; CHECK-DAG: vmov.f64 d6
    508 ; CHECK-DAG: vmov.f64 d7
    509 ; CHECK-DAG: vstr d{{.*}}, [sp]
    510 ; CHECK-DAG: vmov.f32 s1
    511 ; CHECK: bl {{.*}} testFDDDDDDDFD
    512   call void @testFDDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    513                             double 5.0, double 6.0, double 7.0, double 8.0,
    514                             double 9.0, float 10.0)
    515 ; CHECK-DAG: vmov.f32 s0
    516 ; CHECK-DAG: vmov.f64 d1
    517 ; CHECK-DAG: vmov.f64 d2
    518 ; CHECK-DAG: vmov.f64 d3
    519 ; CHECK-DAG: vmov.f64 d4
    520 ; CHECK-DAG: vmov.f64 d5
    521 ; CHECK-DAG: vmov.f64 d6
    522 ; CHECK-DAG: vmov.f64 d7
    523 ; CHECK-DAG: vstr d{{.*}}, [sp]
    524 ; CHECK-DAG: vstr s{{.*}}, [sp, #8]
    525 ; CHECK: bl {{.*}} testFDDDDDDDDF
    526   call void @testFDDDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
    527                              double 5.0, double 6.0, double 7.0, double 8.0,
    528                              double 9.0, double 10.0, float 11.0)
    529 ; CHECK-DAG: vmov.f32 s0
    530 ; CHECK-DAG: vmov.f64 d1
    531 ; CHECK-DAG: vmov.f64 d2
    532 ; CHECK-DAG: vmov.f64 d3
    533 ; CHECK-DAG: vmov.f64 d4
    534 ; CHECK-DAG: vmov.f64 d5
    535 ; CHECK-DAG: vmov.f64 d6
    536 ; CHECK-DAG: vmov.f64 d7
    537 ; CHECK-DAG: vstr d{{.*}}, [sp]
    538 ; CHECK-DAG: vstr d{{.*}}, [sp, #8]
    539 ; CHECK-DAG: vstr s{{.*}}, [sp, #16]
    540 ; CHECK: bl {{.*}} testFDDDDDDDDDF
    541   call void @testFDDDDDDDDFD(float 1.0, double 2.0, double 3.0, double 4.0,
    542                              double 5.0, double 6.0, double 7.0, double 8.0,
    543                              double 9.0, float 10.0, double 11.0)
    544 ; CHECK-DAG: vmov.f32 s0
    545 ; CHECK-DAG: vmov.f64 d1
    546 ; CHECK-DAG: vmov.f64 d2
    547 ; CHECK-DAG: vmov.f64 d3
    548 ; CHECK-DAG: vmov.f64 d4
    549 ; CHECK-DAG: vmov.f64 d5
    550 ; CHECK-DAG: vmov.f64 d6
    551 ; CHECK-DAG: vmov.f64 d7
    552 ; CHECK-DAG: vstr d{{.*}}, [sp]
    553 ; CHECK-DAG: vstr s{{.*}}, [sp, #8]
    554 ; CHECK-DAG: vstr d{{.*}}, [sp, #16]
    555 ; CHECK: bl {{.*}} testFDDDDDDDDFD
    556   call void @testFDDDDDDDDFDF(float 1.0, double 2.0, double 3.0, double 4.0,
    557                               double 5.0, double 6.0, double 7.0, double 8.0,
    558                               double 9.0, float 10.0, double 11.0, float 12.0)
    559 ; CHECK-DAG: vmov.f32 s0
    560 ; CHECK-DAG: vmov.f64 d1
    561 ; CHECK-DAG: vmov.f64 d2
    562 ; CHECK-DAG: vmov.f64 d3
    563 ; CHECK-DAG: vmov.f64 d4
    564 ; CHECK-DAG: vmov.f64 d5
    565 ; CHECK-DAG: vmov.f64 d6
    566 ; CHECK-DAG: vmov.f64 d7
    567 ; CHECK-DAG: vstr d{{.*}}, [sp]
    568 ; CHECK-DAG: vstr s{{.*}}, [sp, #8]
    569 ; CHECK-DAG: vstr d{{.*}}, [sp, #16]
    570 ; CHECK-DAG: vstr s{{.*}}, [sp, #24]
    571 ; CHECK: bl {{.*}} testFDDDDDDDDFD
    572 
    573   ret void
    574 }
    575 
    576 ; TODO(jpp): add tests for stack alignment.
    577