blob: b1c13e57f13cfb3b1f078847121a9e357ed6af1c [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// REQUIRES: x86-registered-target
Rafael Espindolaa3f55b02013-09-04 04:12:25 +00002// RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
Chad Rosier148bab22013-04-02 20:03:29 +00003
John McCallaeeacf72013-05-03 00:10:13 +00004// rdar://13645930
5
Chad Rosier148bab22013-04-02 20:03:29 +00006struct Foo {
7 static int *ptr;
8 static int a, b;
Chad Rosier5e768ca2013-04-11 23:57:29 +00009 int arr[4];
Chad Rosier148bab22013-04-02 20:03:29 +000010 struct Bar {
11 static int *ptr;
Chad Rosier5e768ca2013-04-11 23:57:29 +000012 char arr[2];
Chad Rosier148bab22013-04-02 20:03:29 +000013 };
14};
15
16void t1() {
17 Foo::ptr = (int *)0xDEADBEEF;
18 Foo::Bar::ptr = (int *)0xDEADBEEF;
John McCallaeeacf72013-05-03 00:10:13 +000019 __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 Rosier148bab22013-04-02 20:03:29 +000024// CHECK: @_Z2t1v
John McCallaeeacf72013-05-03 00:10:13 +000025// 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 Rosier148bab22013-04-02 20:03:29 +000030}
Chad Rosierdbcfa8b2013-04-11 23:37:53 +000031
32int gvar = 10;
33void t2() {
34 int lvar = 10;
35 __asm mov eax, offset Foo::ptr
36 __asm mov eax, offset Foo::Bar::ptr
37// CHECK: t2
John McCallaeeacf72013-05-03 00:10:13 +000038// 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 Rosierdbcfa8b2013-04-11 23:37:53 +000040}
Chad Rosier5e768ca2013-04-11 23:57:29 +000041
Stephen Lin93ab6bf2013-08-15 06:47:53 +000042// CHECK-LABEL: define void @_Z2t3v()
Chad Rosier5e768ca2013-04-11 23:57:29 +000043void t3() {
44 __asm mov eax, LENGTH Foo::ptr
John McCallaeeacf72013-05-03 00:10:13 +000045// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000046 __asm mov eax, LENGTH Foo::Bar::ptr
John McCallaeeacf72013-05-03 00:10:13 +000047// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000048 __asm mov eax, LENGTH Foo::arr
John McCallaeeacf72013-05-03 00:10:13 +000049// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000050 __asm mov eax, LENGTH Foo::Bar::arr
John McCallaeeacf72013-05-03 00:10:13 +000051// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000052
53 __asm mov eax, TYPE Foo::ptr
John McCallaeeacf72013-05-03 00:10:13 +000054// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000055 __asm mov eax, TYPE Foo::Bar::ptr
John McCallaeeacf72013-05-03 00:10:13 +000056// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000057 __asm mov eax, TYPE Foo::arr
John McCallaeeacf72013-05-03 00:10:13 +000058// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000059 __asm mov eax, TYPE Foo::Bar::arr
John McCallaeeacf72013-05-03 00:10:13 +000060// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000061
62 __asm mov eax, SIZE Foo::ptr
John McCallaeeacf72013-05-03 00:10:13 +000063// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000064 __asm mov eax, SIZE Foo::Bar::ptr
John McCallaeeacf72013-05-03 00:10:13 +000065// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000066 __asm mov eax, SIZE Foo::arr
John McCallaeeacf72013-05-03 00:10:13 +000067// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"()
Chad Rosier5e768ca2013-04-11 23:57:29 +000068 __asm mov eax, SIZE Foo::Bar::arr
John McCallaeeacf72013-05-03 00:10:13 +000069// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
70
71}
72
73struct T4 {
74 int x;
75 static int y;
76 void test();
77};
78
Stephen Lin93ab6bf2013-08-15 06:47:53 +000079// CHECK-LABEL: define void @_ZN2T44testEv(
John McCallaeeacf72013-05-03 00:10:13 +000080void 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
90template <class T> struct T5 {
91 template <class U> static T create(U);
92 void run();
93};
Stephen Lin93ab6bf2013-08-15 06:47:53 +000094// CHECK-LABEL: define void @_Z5test5v()
John McCallaeeacf72013-05-03 00:10:13 +000095void test5() {
96 // CHECK: [[X:%.*]] = alloca i32
97 // CHECK: [[Y:%.*]] = alloca i32
98 int x, y;
99 __asm push y
Stephen Hines651f13c2014-04-23 16:59:28 -0700100 // CHECK: call void asm sideeffect inteldialect "push dword ptr $0", "=*m,~{esp},~{dirflag},~{fpsr},~{flags}"(i32* [[Y]])
John McCallaeeacf72013-05-03 00:10:13 +0000101 __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 Rosier5e768ca2013-04-11 23:57:29 +0000105}
Chad Rosier942dfe22013-05-24 18:32:55 +0000106
107// Just verify this doesn't emit an error.
108void test6() {
109 __asm {
110 a:
111 jmp a
112 }
113}