| ; The "float-abi" module flag selects the floating-point calling convention. | |
| ; RUN: split-file %s %t | |
| ; Hard float ABI module flag: FP argument returned in a VFP register (s0). | |
| ; RUN: llc -mtriple=armv7-none-eabi -mattr=+vfp3 < %t/hard.ll | FileCheck %s --check-prefix=HARD | |
| ; Soft float ABI module flag: FP argument returned in a GPR (r0). | |
| ; RUN: llc -mtriple=armv7-none-eabi -mattr=+vfp3 < %t/soft.ll | FileCheck %s --check-prefix=SOFT | |
| ; No module flag: the -float-abi command-line option still applies. | |
| ; RUN: llc -mtriple=armv7-none-eabi -mattr=+vfp3 -float-abi=hard < %t/none.ll | FileCheck %s --check-prefix=HARD | |
| ; RUN: llc -mtriple=armv7-none-eabi -mattr=+vfp3 -float-abi=soft < %t/none.ll | FileCheck %s --check-prefix=SOFT | |
| ; The triple default applies with no module flag. | |
| ; RUN: llc -mtriple=armv7-none-eabi -mattr=+vfp3 < %t/none.ll | FileCheck %s --check-prefix=SOFT | |
| ; A -float-abi option conflicting with the module flag is an error. | |
| ; RUN: not llc -mtriple=armv7-none-eabi -mattr=+vfp3 -float-abi=soft < %t/hard.ll -filetype=null 2>&1 | FileCheck %s --check-prefix=CONFLICT-SOFT | |
| ; RUN: not llc -mtriple=armv7-none-eabi -mattr=+vfp3 -float-abi=hard < %t/soft.ll -filetype=null 2>&1 | FileCheck %s --check-prefix=CONFLICT-HARD | |
| ;--- hard.ll | |
| define float @f(float %x) { | |
| %r = fadd float %x, %x | |
| ret float %r | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"float-abi", !"hard"} | |
| ; HARD: vadd.f32 s0, | |
| ; CONFLICT-SOFT: -float-abi=soft conflicts with the "float-abi" module flag "hard" | |
| ;--- soft.ll | |
| define float @f(float %x) { | |
| %r = fadd float %x, %x | |
| ret float %r | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"float-abi", !"soft"} | |
| ; SOFT: vmov {{s[0-9]+}}, r0 | |
| ; CONFLICT-HARD: -float-abi=hard conflicts with the "float-abi" module flag "soft" | |
| ;--- none.ll | |
| define float @f(float %x) { | |
| %r = fadd float %x, %x | |
| ret float %r | |
| } |