• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; Test that for calls returning a floating-point value, the calling
2; ABI with respect to the x87 floating point stack is honored.  In
3; particular, the top-of-stack must be popped regardless of whether
4; its value is used.
5
6; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \
7; RUN:      -allow-externally-defined-symbols | FileCheck %s
8; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \
9; RUN:      -allow-externally-defined-symbols | FileCheck %s
10
11declare float @dummy()
12
13; The call is ignored, but the top of the FP stack still needs to be
14; popped.
15define i32 @ignored_fp_call() {
16entry:
17  %ignored = call float @dummy()
18  ret i32 0
19}
20; CHECK-LABEL: ignored_fp_call
21; CHECK: call {{.*}} R_{{.*}} dummy
22; CHECK: fstp
23
24; The top of the FP stack is popped and subsequently used.
25define i32 @converted_fp_call() {
26entry:
27  %fp = call float @dummy()
28  %ret = fptosi float %fp to i32
29  ret i32 %ret
30}
31; CHECK-LABEL: converted_fp_call
32; CHECK: call {{.*}} R_{{.*}} dummy
33; CHECK: fstp
34; CHECK: cvttss2si
35
36; The top of the FP stack is ultimately passed through as the return
37; value.  Note: the translator could optimized by not popping and
38; re-pushing, in which case the test would need to be changed.
39define float @returned_fp_call() {
40entry:
41  %fp = call float @dummy()
42  ret float %fp
43}
44; CHECK-LABEL: returned_fp_call
45; CHECK: call {{.*}} R_{{.*}} dummy
46; CHECK: fstp
47; CHECK: fld
48