| ; 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. |