; Tests validating the vfp calling convention for ARM32.
;
; RUN: %if --need=target_ARM32 \
; RUN:   --command %p2i --filetype=obj \
; RUN:   --disassemble --target arm32 -i %s --args -O2 \
; RUN:   -allow-externally-defined-symbols \
; RUN:   | %if --need=target_ARM32 \
; RUN:   --command FileCheck %s
; RUN: %if --need=target_ARM32 \
; RUN:   --command %p2i --filetype=obj --disassemble --target arm32 \
; RUN:   -i %s --args -Om1 \
; RUN:   -allow-externally-defined-symbols \
; RUN:   | %if --need=target_ARM32 \
; RUN:   --command FileCheck %s

; Boring tests ensuring float arguments are allocated "correctly." Unfortunately
; this test cannot verify whether the right arguments are being allocated to the
; right register.
declare void @float1(float %p0)
declare void @float2(float %p0, float %p1)
declare void @float3(float %p0, float %p1, float %p2)
declare void @float4(float %p0, float %p1, float %p2, float %p3)
declare void @float5(float %p0, float %p1, float %p2, float %p3, float %p4)
declare void @float6(float %p0, float %p1, float %p2, float %p3, float %p4,
                     float %p5)
declare void @float7(float %p0, float %p1, float %p2, float %p3, float %p4,
                     float %p5, float %p6)
declare void @float8(float %p0, float %p1, float %p2, float %p3, float %p4,
                     float %p5, float %p6, float %p7)
declare void @float9(float %p0, float %p1, float %p2, float %p3, float %p4,
                     float %p5, float %p6, float %p7, float %p8)
declare void @float10(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9)
declare void @float11(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10)
declare void @float12(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11)
declare void @float13(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12)
declare void @float14(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12, float %p13)
declare void @float15(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12, float %p13,
                      float %p14)
declare void @float16(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12, float %p13,
                      float %p14, float %p15)
declare void @float17(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12, float %p13,
                      float %p14, float %p15, float %p16)
declare void @float18(float %p0, float %p1, float %p2, float %p3, float %p4,
                      float %p5, float %p6, float %p7, float %p8, float %p9,
                      float %p10, float %p11, float %p12, float %p13,
                      float %p14, float %p15, float %p16, float %p17)
define internal void @floatHarness() nounwind {
; CHECK-LABEL: floatHarness
  call void @float1(float 1.0)
; CHECK-DAG: vmov.f32 s0
; CHECK: bl {{.*}} float1
  call void @float2(float 1.0, float 2.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} float2
  call void @float3(float 1.0, float 2.0, float 3.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK: bl {{.*}} float3
  call void @float4(float 1.0, float 2.0, float 3.0, float 4.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK: bl {{.*}} float4
  call void @float5(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK: bl {{.*}} float5
  call void @float6(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK: bl {{.*}} float6
  call void @float7(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK: bl {{.*}} float7
  call void @float8(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK: bl {{.*}} float8
  call void @float9(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK: bl {{.*}} float9
  call void @float10(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK: bl {{.*}} float10
  call void @float11(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK: bl {{.*}} float11
  call void @float12(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK: bl {{.*}} float12
  call void @float13(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK: bl {{.*}} float13
  call void @float14(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0, float 14.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK-DAG: vmov.f32 s13
; CHECK: bl {{.*}} float14
  call void @float15(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0, float 14.0,
                    float 15.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK-DAG: vmov.f32 s13
; CHECK-DAG: vmov.f32 s14
; CHECK: bl {{.*}} float15
  call void @float16(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0, float 14.0,
                    float 15.0, float 16.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK-DAG: vmov.f32 s13
; CHECK-DAG: vmov.f32 s14
; CHECK-DAG: vmov.f32 s15
; CHECK: bl {{.*}} float16
  call void @float17(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0, float 14.0,
                    float 15.0, float 16.0, float 17.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK-DAG: vmov.f32 s13
; CHECK-DAG: vmov.f32 s14
; CHECK-DAG: vmov.f32 s15
; CHECK-DAG: vstr s{{.*}}, [sp]
; CHECK: bl {{.*}} float17
  call void @float18(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0,
                    float 6.0, float 7.0, float 8.0, float 9.0, float 10.0,
                    float 11.0, float 12.0, float 13.0, float 14.0,
                    float 15.0, float 16.0, float 17.0, float 18.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f32 s1
; CHECK-DAG: vmov.f32 s2
; CHECK-DAG: vmov.f32 s3
; CHECK-DAG: vmov.f32 s4
; CHECK-DAG: vmov.f32 s5
; CHECK-DAG: vmov.f32 s6
; CHECK-DAG: vmov.f32 s7
; CHECK-DAG: vmov.f32 s8
; CHECK-DAG: vmov.f32 s9
; CHECK-DAG: vmov.f32 s10
; CHECK-DAG: vmov.f32 s11
; CHECK-DAG: vmov.f32 s12
; CHECK-DAG: vmov.f32 s13
; CHECK-DAG: vmov.f32 s14
; CHECK-DAG: vmov.f32 s15
; CHECK-DAG: vstr s{{.*}}, [sp]
; CHECK-DAG: vstr s{{.*}}, [sp, #4]
; CHECK: bl {{.*}} float18
  ret void
}

declare void @double1(double %p0)
declare void @double2(double %p0, double %p1)
declare void @double3(double %p0, double %p1, double %p2)
declare void @double4(double %p0, double %p1, double %p2, double %p3)
declare void @double5(double %p0, double %p1, double %p2, double %p3,
                      double %p4)
declare void @double6(double %p0, double %p1, double %p2, double %p3,
                      double %p4, double %p5)
declare void @double7(double %p0, double %p1, double %p2, double %p3,
                      double %p4, double %p5, double %p6)
declare void @double8(double %p0, double %p1, double %p2, double %p3,
                      double %p4, double %p5, double %p6, double %p7)
declare void @double9(double %p0, double %p1, double %p2, double %p3,
                      double %p4, double %p5, double %p6, double %p7,
                      double %p8)
declare void @double10(double %p0, double %p1, double %p2, double %p3,
                      double %p4, double %p5, double %p6, double %p7,
                      double %p8, double %p9)
define internal void @doubleHarness() nounwind {
; CHECK-LABEL: doubleHarness
  call void @double1(double 1.0)
; CHECK-DAG: vmov.f64 d0
; CHECK: bl {{.*}} double1
  call void @double2(double 1.0, double 2.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK: bl {{.*}} double2
  call void @double3(double 1.0, double 2.0, double 3.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK: bl {{.*}} double3
  call void @double4(double 1.0, double 2.0, double 3.0, double 4.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK: bl {{.*}} double4
  call void @double5(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK: bl {{.*}} double5
  call void @double6(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0, double 6.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK: bl {{.*}} double6
  call void @double7(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0, double 6.0, double 7.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK: bl {{.*}} double7
  call void @double8(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0, double 6.0, double 7.0, double 8.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK: bl {{.*}} double8
  call void @double9(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0, double 6.0, double 7.0, double 8.0,
                     double 9.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK: bl {{.*}} double9
  call void @double10(double 1.0, double 2.0, double 3.0, double 4.0,
                     double 5.0, double 6.0, double 7.0, double 8.0,
                     double 9.0, double 10.0)
; CHECK-DAG: vmov.f64 d0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vstr d{{.*}}, [sp, #8]
; CHECK: bl {{.*}} double10

  ret void
}

declare void @testFDF(float %p0, double %p1, float %p2)
declare void @testFDDF(float %p0, double %p1, double %p2, float %p3)
declare void @testFDDDF(float %p0, double %p1, double %p2, double %p3,
                        float %p4)
declare void @testFDDDDF(float %p0, double %p1, double %p2, double %p3,
                         double %p4, float %p5)
declare void @testFDDDDDF(float %p0, double %p1, double %p2, double %p3,
                          double %p4, double %p5, float %p6)
declare void @testFDDDDDDF(float %p0, double %p1, double %p2, double %p3,
                           double %p4, double %p5, double %p6, float %p7)
declare void @testFDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
                            double %p4, double %p5, double %p6, double %p7,
                            float %p8)
declare void @testFDDDDDDDFD(float %p0, double %p1, double %p2, double %p3,
                             double %p4, double %p5, double %p6, double %p7,
                             float %p8, double %p9)
declare void @testFDDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
                             double %p4, double %p5, double %p6, double %p7,
                             double %p8, float %p9)
declare void @testFDDDDDDDDDF(float %p0, double %p1, double %p2, double %p3,
                              double %p4, double %p5, double %p6, double %p7,
                              double %p8, double %p9, float %p10)
declare void @testFDDDDDDDDFD(float %p0, double %p1, double %p2, double %p3,
                              double %p4, double %p5, double %p6, double %p7,
                              double %p8, float %p9, double %p10)
declare void @testFDDDDDDDDFDF(float %p0, double %p1, double %p2, double %p3,
                               double %p4, double %p5, double %p6, double %p7,
                               double %p8, float %p9, double %p10, float %p11)
define internal void @packsFloats() nounwind {
; CHECK-LABEL: packsFloats
  call void @testFDF(float 1.0, double 2.0, float 3.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDF
  call void @testFDDF(float 1.0, double 2.0, double 3.0, float 4.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDF
  call void @testFDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                       float 5.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDF
  call void @testFDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                        double 5.0, float 6.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDDF
  call void @testFDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                         double 5.0, double 6.0, float 7.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDDDF
  call void @testFDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                          double 5.0, double 6.0, double 7.0, float 8.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDDDDF
  call void @testFDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                           double 5.0, double 6.0, double 7.0, double 8.0,
                           float 9.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDDDDDF
  call void @testFDDDDDDDFD(float 1.0, double 2.0, double 3.0, double 4.0,
                            double 5.0, double 6.0, double 7.0, double 8.0,
                            float 9.0, double 10.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vmov.f32 s1
; CHECK: bl {{.*}} testFDDDDDDDFD
  call void @testFDDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                            double 5.0, double 6.0, double 7.0, double 8.0,
                            double 9.0, float 10.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vstr s{{.*}}, [sp, #8]
; CHECK: bl {{.*}} testFDDDDDDDDF
  call void @testFDDDDDDDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
                             double 5.0, double 6.0, double 7.0, double 8.0,
                             double 9.0, double 10.0, float 11.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vstr d{{.*}}, [sp, #8]
; CHECK-DAG: vstr s{{.*}}, [sp, #16]
; CHECK: bl {{.*}} testFDDDDDDDDDF
  call void @testFDDDDDDDDFD(float 1.0, double 2.0, double 3.0, double 4.0,
                             double 5.0, double 6.0, double 7.0, double 8.0,
                             double 9.0, float 10.0, double 11.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vstr s{{.*}}, [sp, #8]
; CHECK-DAG: vstr d{{.*}}, [sp, #16]
; CHECK: bl {{.*}} testFDDDDDDDDFD
  call void @testFDDDDDDDDFDF(float 1.0, double 2.0, double 3.0, double 4.0,
                              double 5.0, double 6.0, double 7.0, double 8.0,
                              double 9.0, float 10.0, double 11.0, float 12.0)
; CHECK-DAG: vmov.f32 s0
; CHECK-DAG: vmov.f64 d1
; CHECK-DAG: vmov.f64 d2
; CHECK-DAG: vmov.f64 d3
; CHECK-DAG: vmov.f64 d4
; CHECK-DAG: vmov.f64 d5
; CHECK-DAG: vmov.f64 d6
; CHECK-DAG: vmov.f64 d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vstr s{{.*}}, [sp, #8]
; CHECK-DAG: vstr d{{.*}}, [sp, #16]
; CHECK-DAG: vstr s{{.*}}, [sp, #24]
; CHECK: bl {{.*}} testFDDDDDDDDFD

  ret void
}

; TODO(jpp): add tests for stack alignment.