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