Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mtriple=i386-apple-darwin | FileCheck %s |
Chris Lattner | e6fdb06 | 2008-03-09 08:49:15 +0000 | [diff] [blame] | 2 | |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 3 | ; There should be no stack manipulations between the inline asm and ret. |
| 4 | ; CHECK: test1 |
| 5 | ; CHECK: InlineAsm End |
| 6 | ; CHECK-NEXT: ret |
Chris Lattner | e6fdb06 | 2008-03-09 08:49:15 +0000 | [diff] [blame] | 7 | define x86_fp80 @test1() { |
| 8 | %tmp85 = call x86_fp80 asm sideeffect "fld0", "={st(0)}"() |
| 9 | ret x86_fp80 %tmp85 |
| 10 | } |
| 11 | |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 12 | ; CHECK: test2 |
| 13 | ; CHECK: InlineAsm End |
| 14 | ; CHECK-NEXT: ret |
Chris Lattner | e6fdb06 | 2008-03-09 08:49:15 +0000 | [diff] [blame] | 15 | define double @test2() { |
| 16 | %tmp85 = call double asm sideeffect "fld0", "={st(0)}"() |
| 17 | ret double %tmp85 |
| 18 | } |
| 19 | |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 20 | ; 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 Lattner | 0d12872 | 2008-03-09 09:15:31 +0000 | [diff] [blame] | 28 | define 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 Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 33 | ; CHECK: test4 |
| 34 | ; CHECK: fld |
| 35 | ; CHECK-NEXT: InlineAsm Start |
| 36 | ; CHECK: InlineAsm End |
| 37 | ; CHECK-NOT: fstp |
| 38 | ; CHECK: ret |
Chris Lattner | 0d12872 | 2008-03-09 09:15:31 +0000 | [diff] [blame] | 39 | define void @test4(double %X) { |
| 40 | call void asm sideeffect "frob ", "{st(0)},~{dirflag},~{fpsr},~{flags}"( double %X) |
| 41 | ret void |
| 42 | } |
| 43 | |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 44 | ; 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 Lattner | 0d12872 | 2008-03-09 09:15:31 +0000 | [diff] [blame] | 50 | define void @test5(double %X) { |
Dan Gohman | 7ce405e | 2009-06-04 22:49:04 +0000 | [diff] [blame] | 51 | %Y = fadd double %X, 123.0 |
Chris Lattner | 0d12872 | 2008-03-09 09:15:31 +0000 | [diff] [blame] | 52 | call void asm sideeffect "frob ", "{st(0)},~{dirflag},~{fpsr},~{flags}"( double %Y) |
| 53 | ret void |
| 54 | } |
| 55 | |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 56 | ; CHECK: test6 |
Chris Lattner | 45b527c | 2008-03-11 19:50:13 +0000 | [diff] [blame] | 57 | define void @test6(double %A, double %B, double %C, |
| 58 | double %D, double %E) nounwind { |
| 59 | entry: |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 60 | ; 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 Lattner | 45b527c | 2008-03-11 19:50:13 +0000 | [diff] [blame] | 65 | tail call void asm sideeffect "foo $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %A, double %A ) nounwind |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 66 | ; 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 Lattner | 45b527c | 2008-03-11 19:50:13 +0000 | [diff] [blame] | 71 | tail call void asm sideeffect "bar $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %B, double %C ) nounwind |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 72 | ; 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 Lattner | 45b527c | 2008-03-11 19:50:13 +0000 | [diff] [blame] | 78 | tail call void asm sideeffect "baz $0 $1", "f,f,~{dirflag},~{fpsr},~{flags}"( double %D, double %E ) nounwind |
Jakob Stoklund Olesen | 4180d48 | 2010-07-10 16:30:25 +0000 | [diff] [blame] | 79 | ; 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 Lattner | 45b527c | 2008-03-11 19:50:13 +0000 | [diff] [blame] | 85 | tail call void asm sideeffect "baz $0", "f,~{dirflag},~{fpsr},~{flags}"( double %D ) nounwind |
| 86 | ret void |
| 87 | } |
Chris Lattner | e6fdb06 | 2008-03-09 08:49:15 +0000 | [diff] [blame] | 88 | |