| 1 | // Covers a bug fix for ABI selection with homogenous aggregates: |
| 2 | // See: https://bugs.llvm.org/show_bug.cgi?id=39982 |
| 3 | |
| 4 | // REQUIRES: arm-registered-target |
| 5 | // RUN: %clang -mfloat-abi=hard --target=armv7-unknown-linux-gnueabi -O3 -S -o - %s | FileCheck %s -check-prefixes=HARD,CHECK |
| 6 | // RUN: %clang -mfloat-abi=softfp --target=armv7-unknown-linux-gnueabi -O3 -S -o - %s | FileCheck %s -check-prefixes=SOFTFP,CHECK |
| 7 | // RUN: %clang -mfloat-abi=soft --target=armv7-unknown-linux-gnueabi -O3 -S -o - %s | FileCheck %s -check-prefixes=SOFT,CHECK |
| 8 | |
| 9 | struct S { |
| 10 | float f; |
| 11 | float d; |
| 12 | float c; |
| 13 | float t; |
| 14 | }; |
| 15 | |
| 16 | // Variadic functions should always marshal for the base standard. |
| 17 | // See section 5.5 (Parameter Passing) of the AAPCS. |
| 18 | float __attribute__((pcs("aapcs-vfp"))) variadic(S s, ...) { |
| 19 | // CHECK-NOT: vmov s{{[0-9]+}}, s{{[0-9]+}} |
| 20 | // CHECK: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 21 | return s.d; |
| 22 | } |
| 23 | |
| 24 | float no_attribute(S s) { |
| 25 | // SOFT: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 26 | // SOFTFP: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 27 | // HARD: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 28 | return s.d; |
| 29 | } |
| 30 | |
| 31 | float __attribute__((pcs("aapcs-vfp"))) baz(float x, float y) { |
| 32 | // CHECK-NOT: mov s{{[0-9]+}}, r{{[0-9]+}} |
| 33 | // SOFT: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 34 | // SOFTFP: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 35 | // HARD: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 36 | return y; |
| 37 | } |
| 38 | |
| 39 | float __attribute__((pcs("aapcs-vfp"))) foo(S s) { |
| 40 | // CHECK-NOT: mov s{{[0-9]+}}, r{{[0-9]+}} |
| 41 | // SOFT: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 42 | // SOFTFP: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 43 | // HARD: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 44 | return s.d; |
| 45 | } |
| 46 | |
| 47 | float __attribute__((pcs("aapcs"))) bar(S s) { |
| 48 | // CHECK-NOT: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} |
| 49 | // CHECK: mov r{{[0-9]+}}, r{{[0-9]+}} |
| 50 | return s.d; |
| 51 | } |
| 52 | |