blob: 511a9d2a40a90cae7881b9b9b918ceffbb861433 [file] [log] [blame]
; Tests validating the vfp calling convention for ARM32.
;
; RUN: %if --need=target_ARM32 --need=allow_dump \
; RUN: --command %p2i --filetype=asm --assemble \
; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \
; RUN: -allow-externally-defined-symbols \
; RUN: | %if --need=target_ARM32 --need=allow_dump \
; RUN: --command FileCheck %s
; RUN: %if --need=target_ARM32 --need=allow_dump \
; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \
; RUN: -i %s --args -Om1 --skip-unimplemented \
; RUN: -allow-externally-defined-symbols \
; RUN: | %if --need=target_ARM32 --need=allow_dump \
; 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: vldr s0
; CHECK: bl {{.*}} float1
call void @float2(float 1.0, float 2.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr s1
; CHECK: bl {{.*}} float2
call void @float3(float 1.0, float 2.0, float 3.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK: bl {{.*}} float3
call void @float4(float 1.0, float 2.0, float 3.0, float 4.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK: bl {{.*}} float4
call void @float5(float 1.0, float 2.0, float 3.0, float 4.0, float 5.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr s12
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr s12
; CHECK-DAG: vldr s13
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr s12
; CHECK-DAG: vldr s13
; CHECK-DAG: vldr s14
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr s12
; CHECK-DAG: vldr s13
; CHECK-DAG: vldr s14
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr s1
; CHECK-DAG: vldr s2
; CHECK-DAG: vldr s3
; CHECK-DAG: vldr s4
; CHECK-DAG: vldr s5
; CHECK-DAG: vldr s6
; CHECK-DAG: vldr s7
; CHECK-DAG: vldr s8
; CHECK-DAG: vldr s9
; CHECK-DAG: vldr s10
; CHECK-DAG: vldr s11
; CHECK-DAG: vldr s12
; CHECK-DAG: vldr s13
; CHECK-DAG: vldr s14
; CHECK-DAG: vldr 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: vldr d0
; CHECK: bl {{.*}} double1
call void @double2(double 1.0, double 2.0)
; CHECK-DAG: vldr d0
; CHECK-DAG: vldr d1
; CHECK: bl {{.*}} double2
call void @double3(double 1.0, double 2.0, double 3.0)
; CHECK-DAG: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK: bl {{.*}} double3
call void @double4(double 1.0, double 2.0, double 3.0, double 4.0)
; CHECK-DAG: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK: bl {{.*}} double4
call void @double5(double 1.0, double 2.0, double 3.0, double 4.0,
double 5.0)
; CHECK-DAG: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr 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: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr 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: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr 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: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr d0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr s1
; CHECK: bl {{.*}} testFDF
call void @testFDDF(float 1.0, double 2.0, double 3.0, float 4.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr s1
; CHECK: bl {{.*}} testFDDF
call void @testFDDDF(float 1.0, double 2.0, double 3.0, double 4.0,
float 5.0)
; CHECK-DAG: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr d7
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr d7
; CHECK-DAG: vstr d{{.*}}, [sp]
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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: vldr s0
; CHECK-DAG: vldr d1
; CHECK-DAG: vldr d2
; CHECK-DAG: vldr d3
; CHECK-DAG: vldr d4
; CHECK-DAG: vldr d5
; CHECK-DAG: vldr d6
; CHECK-DAG: vldr 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.