NAKAMURA Takumi | 0acd8a7 | 2013-12-04 03:41:33 +0000 | [diff] [blame] | 1 | // REQUIRES: x86-registered-target |
Nico Weber | 9ef9ca4 | 2014-05-06 03:13:27 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - -std=c++11 | FileCheck %s |
Chad Rosier | 3b7b0cd | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 3 | |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 4 | // rdar://13645930 |
| 5 | |
Chad Rosier | 3b7b0cd | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 6 | struct Foo { |
| 7 | static int *ptr; |
| 8 | static int a, b; |
Chad Rosier | 766d0de | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 9 | int arr[4]; |
Chad Rosier | 3b7b0cd | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 10 | struct Bar { |
| 11 | static int *ptr; |
Chad Rosier | 766d0de | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 12 | char arr[2]; |
Chad Rosier | 3b7b0cd | 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 | f413f5e | 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 | 3b7b0cd | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 24 | // CHECK: @_Z2t1v |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame] | 25 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0\0A\09mov eax, dword ptr $1\0A\09mov eax, dword ptr $2\0A\09mov eax, dword ptr $3\0A\09mov eax, dword ptr $4", "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE) |
Chad Rosier | 3b7b0cd | 2013-04-02 20:03:29 +0000 | [diff] [blame] | 26 | } |
Chad Rosier | da0ab49 | 2013-04-11 23:37:53 +0000 | [diff] [blame] | 27 | |
| 28 | int gvar = 10; |
| 29 | void t2() { |
| 30 | int lvar = 10; |
| 31 | __asm mov eax, offset Foo::ptr |
| 32 | __asm mov eax, offset Foo::Bar::ptr |
| 33 | // CHECK: t2 |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame] | 34 | // CHECK: call void asm sideeffect inteldialect "mov eax, $0\0A\09mov eax, $1", "r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE) |
Chad Rosier | da0ab49 | 2013-04-11 23:37:53 +0000 | [diff] [blame] | 35 | } |
Chad Rosier | 766d0de | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 36 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 37 | // CHECK-LABEL: define void @_Z2t3v() |
Chad Rosier | 766d0de | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 38 | void t3() { |
| 39 | __asm mov eax, LENGTH Foo::ptr |
| 40 | __asm mov eax, LENGTH Foo::Bar::ptr |
| 41 | __asm mov eax, LENGTH Foo::arr |
| 42 | __asm mov eax, LENGTH Foo::Bar::arr |
| 43 | |
| 44 | __asm mov eax, TYPE Foo::ptr |
| 45 | __asm mov eax, TYPE Foo::Bar::ptr |
| 46 | __asm mov eax, TYPE Foo::arr |
| 47 | __asm mov eax, TYPE Foo::Bar::arr |
| 48 | |
| 49 | __asm mov eax, SIZE Foo::ptr |
| 50 | __asm mov eax, SIZE Foo::Bar::ptr |
| 51 | __asm mov eax, SIZE Foo::arr |
| 52 | __asm mov eax, SIZE Foo::Bar::arr |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame] | 53 | // CHECK: call void asm sideeffect inteldialect "mov eax, $$1\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$2\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$16\0A\09mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 54 | |
| 55 | } |
| 56 | |
| 57 | struct T4 { |
| 58 | int x; |
| 59 | static int y; |
| 60 | void test(); |
| 61 | }; |
| 62 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 63 | // CHECK-LABEL: define void @_ZN2T44testEv( |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 64 | void T4::test() { |
| 65 | // CHECK: [[T0:%.*]] = alloca [[T4:%.*]]*, |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 66 | // CHECK: [[THIS:%.*]] = load [[T4]]*, [[T4]]** [[T0]] |
David Blaikie | 218b783 | 2015-02-27 19:18:17 +0000 | [diff] [blame] | 67 | // CHECK: [[X:%.*]] = getelementptr inbounds [[T4]], [[T4]]* [[THIS]], i32 0, i32 0 |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 68 | __asm mov eax, x; |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 69 | __asm mov y, eax; |
Ehsan Akhgari | fa2d9aa | 2014-07-25 02:35:50 +0000 | [diff] [blame] | 70 | // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE, i32* {{.*}}) |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 71 | } |
| 72 | |
| 73 | template <class T> struct T5 { |
| 74 | template <class U> static T create(U); |
| 75 | void run(); |
| 76 | }; |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 77 | // CHECK-LABEL: define void @_Z5test5v() |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 78 | void test5() { |
| 79 | // CHECK: [[X:%.*]] = alloca i32 |
| 80 | // CHECK: [[Y:%.*]] = alloca i32 |
| 81 | int x, y; |
| 82 | __asm push y |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 83 | __asm call T5<int>::create<float> |
John McCall | f413f5e | 2013-05-03 00:10:13 +0000 | [diff] [blame] | 84 | __asm mov x, eax |
Reid Kleckner | e2d6429 | 2014-08-01 20:23:29 +0000 | [diff] [blame] | 85 | // CHECK: call void asm sideeffect inteldialect "push dword ptr $0\0A\09call dword ptr $2\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(i32* %y, i32* %x, i32 (float)* @_ZN2T5IiE6createIfEEiT_) |
Chad Rosier | 766d0de | 2013-04-11 23:57:29 +0000 | [diff] [blame] | 86 | } |
Chad Rosier | b9aff1e | 2013-05-24 18:32:55 +0000 | [diff] [blame] | 87 | |
| 88 | // Just verify this doesn't emit an error. |
| 89 | void test6() { |
| 90 | __asm { |
| 91 | a: |
| 92 | jmp a |
| 93 | } |
| 94 | } |
Nico Weber | 9ef9ca4 | 2014-05-06 03:13:27 +0000 | [diff] [blame] | 95 | |
| 96 | void t7_struct() { |
| 97 | struct A { |
| 98 | int a; |
| 99 | int b; |
| 100 | }; |
| 101 | __asm mov eax, [eax].A.b |
| 102 | // CHECK-LABEL: define void @_Z9t7_structv |
| 103 | // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
| 104 | } |
| 105 | |
| 106 | void t7_typedef() { |
| 107 | typedef struct { |
| 108 | int a; |
| 109 | int b; |
| 110 | } A; |
| 111 | __asm mov eax, [eax].A.b |
| 112 | // CHECK-LABEL: define void @_Z10t7_typedefv |
| 113 | // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
| 114 | } |
| 115 | |
| 116 | void t7_using() { |
| 117 | using A = struct { |
| 118 | int a; |
| 119 | int b; |
| 120 | }; |
| 121 | __asm mov eax, [eax].A.b |
| 122 | // CHECK-LABEL: define void @_Z8t7_usingv |
| 123 | // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() |
| 124 | } |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 125 | |
| 126 | void t8() { |
| 127 | __asm some_label: |
| 128 | // CHECK-LABEL: define void @_Z2t8v() |
| 129 | // CHECK: call void asm sideeffect inteldialect "L__MSASMLABEL_.1__some_label:", "~{dirflag},~{fpsr},~{flags}"() |
| 130 | struct A { |
| 131 | static void g() { |
| 132 | __asm jmp some_label ; This should jump forwards |
| 133 | __asm some_label: |
| 134 | __asm nop |
| 135 | // CHECK-LABEL: define internal void @_ZZ2t8vEN1A1gEv() |
| 136 | // CHECK: call void asm sideeffect inteldialect "jmp L__MSASMLABEL_.2__some_label\0A\09L__MSASMLABEL_.2__some_label:\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() |
| 137 | } |
| 138 | }; |
| 139 | A::g(); |
| 140 | } |
| 141 | |