blob: 251a8117b5b5af7d0923461ed58de7b3ad945387 [file] [log] [blame]
; Test that for calls returning a floating-point value, the calling
; ABI with respect to the x87 floating point stack is honored. In
; particular, the top-of-stack must be popped regardless of whether
; its value is used.
; RUN: %llvm2ice -O2 --verbose none %s \
; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s
; RUN: %llvm2ice -Om1 --verbose none %s \
; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s
; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s
; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s
; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \
; RUN: | FileCheck --check-prefix=DUMP %s
define float @dummy() {
entry:
ret float 0.000000e+00
}
; CHECK-LABEL: dummy
; The call is ignored, but the top of the FP stack still needs to be
; popped.
define i32 @ignored_fp_call() {
entry:
%ignored = call float @dummy()
ret i32 0
}
; CHECK-LABEL: ignored_fp_call
; CHECK: call dummy
; CHECK: fstp
; The top of the FP stack is popped and subsequently used.
define i32 @converted_fp_call() {
entry:
%fp = call float @dummy()
%ret = fptosi float %fp to i32
ret i32 %ret
}
; CHECK-LABEL: converted_fp_call
; CHECK: call dummy
; CHECK: fstp
; CHECK: cvttss2si
; The top of the FP stack is ultimately passed through as the return
; value. Note: the translator could optimized by not popping and
; re-pushing, in which case the test would need to be changed.
define float @returned_fp_call() {
entry:
%fp = call float @dummy()
ret float %fp
}
; CHECK-LABEL: returned_fp_call
; CHECK: call dummy
; CHECK: fstp
; CHECK: fld
; ERRORS-NOT: ICE translation error
; DUMP-NOT: SZ