Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 1 | // REQUIRES: x86-64-registered-target |
Rafael Espindola | a3f55b0 | 2013-09-04 04:12:25 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 3 | |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 4 | // rdar://13645930 |
| 5 | |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 6 | struct Foo { |
| 7 | static int *ptr; |
| 8 | static int a, b; |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 9 | int arr[4]; |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 10 | struct Bar { |
| 11 | static int *ptr; |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 12 | char arr[2]; |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 13 | }; |
| 14 | }; |
| 15 | |
| 16 | void t1() { |
| 17 | Foo::ptr = (int *)0xDEADBEEF; |
| 18 | Foo::Bar::ptr = (int *)0xDEADBEEF; |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 19 | __asm mov eax, Foo ::ptr |
| 20 | __asm mov eax, Foo :: Bar :: ptr |
| 21 | __asm mov eax, [Foo:: ptr] |
| 22 | __asm mov eax, dword ptr [Foo :: ptr] |
| 23 | __asm mov eax, dword ptr [Foo :: ptr] |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 24 | // CHECK: @_Z2t1v |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 25 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE) |
| 26 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3Bar3ptrE) |
| 27 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE) |
| 28 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE) |
| 29 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE) |
Chad Rosier | 148bab2 | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 30 | } |
Chad Rosier | dbcfa8b | 2013-04-11 23:37:53 +0000 | [diff] [blame] | 31 | |
| 32 | int gvar = 10; |
| 33 | void t2() { |
| 34 | int lvar = 10; |
| 35 | __asm mov eax, offset Foo::ptr |
| 36 | __asm mov eax, offset Foo::Bar::ptr |
| 37 | // CHECK: t2 |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 38 | // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE) |
| 39 | // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3Bar3ptrE) |
Chad Rosier | dbcfa8b | 2013-04-11 23:37:53 +0000 | [diff] [blame] | 40 | } |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 41 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 42 | // CHECK-LABEL: define void @_Z2t3v() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 43 | void t3() { |
| 44 | __asm mov eax, LENGTH Foo::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 45 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 46 | __asm mov eax, LENGTH Foo::Bar::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 47 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 48 | __asm mov eax, LENGTH Foo::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 49 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 50 | __asm mov eax, LENGTH Foo::Bar::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 51 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 52 | |
| 53 | __asm mov eax, TYPE Foo::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 54 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 55 | __asm mov eax, TYPE Foo::Bar::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 56 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 57 | __asm mov eax, TYPE Foo::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 58 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 59 | __asm mov eax, TYPE Foo::Bar::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 60 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 61 | |
| 62 | __asm mov eax, SIZE Foo::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 63 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 64 | __asm mov eax, SIZE Foo::Bar::ptr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 65 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 66 | __asm mov eax, SIZE Foo::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 67 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 68 | __asm mov eax, SIZE Foo::Bar::arr |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 69 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
| 70 | |
| 71 | } |
| 72 | |
| 73 | struct T4 { |
| 74 | int x; |
| 75 | static int y; |
| 76 | void test(); |
| 77 | }; |
| 78 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 79 | // CHECK-LABEL: define void @_ZN2T44testEv( |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 80 | void T4::test() { |
| 81 | // CHECK: [[T0:%.*]] = alloca [[T4:%.*]]*, |
| 82 | // CHECK: [[THIS:%.*]] = load [[T4]]** [[T0]] |
| 83 | // CHECK: [[X:%.*]] = getelementptr inbounds [[T4]]* [[THIS]], i32 0, i32 0 |
| 84 | __asm mov eax, x; |
| 85 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* [[X]]) |
| 86 | __asm mov y, eax; |
| 87 | // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, eax", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE) |
| 88 | } |
| 89 | |
| 90 | template <class T> struct T5 { |
| 91 | template <class U> static T create(U); |
| 92 | void run(); |
| 93 | }; |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 94 | // CHECK-LABEL: define void @_Z5test5v() |
John McCall | aeeacf7 | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 95 | void test5() { |
| 96 | // CHECK: [[X:%.*]] = alloca i32 |
| 97 | // CHECK: [[Y:%.*]] = alloca i32 |
| 98 | int x, y; |
| 99 | __asm push y |
| 100 | // CHECK: call void asm sideeffect inteldialect "push dword ptr $0", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* [[Y]]) |
| 101 | __asm call T5<int>::create<float> |
| 102 | // CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(i32 (float)* @_ZN2T5IiE6createIfEEiT_) |
| 103 | __asm mov x, eax |
| 104 | // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, eax", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* [[X]]) |
Chad Rosier | 5e768ca | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 105 | } |
Chad Rosier | 942dfe2 | 2013-05-24 18:32:55 +0000 | [diff] [blame] | 106 | |
| 107 | // Just verify this doesn't emit an error. |
| 108 | void test6() { |
| 109 | __asm { |
| 110 | a: |
| 111 | jmp a |
| 112 | } |
| 113 | } |