blob: 07d1830140ea1db2d46313a7e61209d25fa83a53 [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: %p2i --filetype=obj --disassemble -i %s --args -O2 \
; RUN: -allow-externally-defined-symbols | FileCheck %s
; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \
; RUN: -allow-externally-defined-symbols | FileCheck %s
declare float @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 {{.*}} R_{{.*}} 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 {{.*}} R_{{.*}} 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 {{.*}} R_{{.*}} dummy
; CHECK: fstp
; CHECK: fld