blob: 6348fcaf7a07b14f364dc06bc58b8c1b18a5d398 [file] [log] [blame]
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +00001; RUN: llc < %s -mtriple=i386-apple-darwin | FileCheck %s
Chris Lattnere6fdb062008-03-09 08:49:15 +00002
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +00003; There should be no stack manipulations between the inline asm and ret.
4; CHECK: test1
5; CHECK: InlineAsm End
6; CHECK-NEXT: ret
Chris Lattnere6fdb062008-03-09 08:49:15 +00007define x86_fp80 @test1() {
8 %tmp85 = call x86_fp80 asm sideeffect "fld0", "={st(0)}"()
9 ret x86_fp80 %tmp85
10}
11
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000012; CHECK: test2
13; CHECK: InlineAsm End
14; CHECK-NEXT: ret
Chris Lattnere6fdb062008-03-09 08:49:15 +000015define double @test2() {
16 %tmp85 = call double asm sideeffect "fld0", "={st(0)}"()
17 ret double %tmp85
18}
19
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000020; Setting up argument in st(0) should be a single fld.
21; CHECK: test3
22; CHECK: fld
23; CHECK-NEXT: InlineAsm Start
24; Asm consumes stack, nothing should be popped.
25; CHECK: InlineAsm End
26; CHECK-NOT: fstp
27; CHECK: ret
Chris Lattner0d128722008-03-09 09:15:31 +000028define void @test3(x86_fp80 %X) {
29 call void asm sideeffect "frob ", "{st(0)},~{dirflag},~{fpsr},~{flags}"( x86_fp80 %X)
30 ret void
31}
32
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000033; CHECK: test4
34; CHECK: fld
35; CHECK-NEXT: InlineAsm Start
36; CHECK: InlineAsm End
37; CHECK-NOT: fstp
38; CHECK: ret
Chris Lattner0d128722008-03-09 09:15:31 +000039define void @test4(double %X) {
40 call void asm sideeffect "frob ", "{st(0)},~{dirflag},~{fpsr},~{flags}"( double %X)
41 ret void
42}
43
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000044; Same as test3/4, but using value from fadd.
45; The fadd can be done in xmm or x87 regs - we don't test that.
46; CHECK: test5
47; CHECK: InlineAsm End
48; CHECK-NOT: fstp
49; CHECK: ret
Chris Lattner0d128722008-03-09 09:15:31 +000050define void @test5(double %X) {
Dan Gohman7ce405e2009-06-04 22:49:04 +000051 %Y = fadd double %X, 123.0
Chris Lattner0d128722008-03-09 09:15:31 +000052 call void asm sideeffect "frob ", "{st(0)},~{dirflag},~{fpsr},~{flags}"( double %Y)
53 ret void
54}
55
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000056; CHECK: test6
Chris Lattner45b527c2008-03-11 19:50:13 +000057define void @test6(double %A, double %B, double %C,
58 double %D, double %E) nounwind {
59entry:
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000060; Uses the same value twice, should have one fstp after the asm.
61; CHECK: foo
62; CHECK: InlineAsm End
63; CHECK-NEXT: fstp
64; CHECK-NOT: fstp
Chris Lattner45b527c2008-03-11 19:50:13 +000065 tail call void asm sideeffect "foo $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %A, double %A ) nounwind
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000066; Uses two different values, should be in st(0)/st(1) and both be popped.
67; CHECK: bar
68; CHECK: InlineAsm End
69; CHECK-NEXT: fstp
70; CHECK-NEXT: fstp
Chris Lattner45b527c2008-03-11 19:50:13 +000071 tail call void asm sideeffect "bar $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %B, double %C ) nounwind
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000072; Uses two different values, one of which isn't killed in this asm, it
73; should not be popped after the asm.
74; CHECK: baz
75; CHECK: InlineAsm End
76; CHECK-NEXT: fstp
77; CHECK-NOT: fstp
Chris Lattner45b527c2008-03-11 19:50:13 +000078 tail call void asm sideeffect "baz $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %D, double %E ) nounwind
Jakob Stoklund Olesen4180d482010-07-10 16:30:25 +000079; This is the last use of %D, so it should be popped after.
80; CHECK: baz
81; CHECK: InlineAsm End
82; CHECK-NEXT: fstp
83; CHECK-NOT: fstp
84; CHECK: ret
Chris Lattner45b527c2008-03-11 19:50:13 +000085 tail call void asm sideeffect "baz $0", "f,~{dirflag},~{fpsr},~{flags}"( double %D ) nounwind
86 ret void
87}
Chris Lattnere6fdb062008-03-09 08:49:15 +000088