xref: /aosp_15_r20/external/clang/test/CodeGen/ms_this.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: x86-registered-target
2*67e74705SXin Li 
3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-pc-win32 -fasm-blocks -emit-llvm %s -o - | FileCheck %s
4*67e74705SXin Li class t1 {
5*67e74705SXin Li public:
6*67e74705SXin Li   double a;
7*67e74705SXin Li   void runc();
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li class t2 {
11*67e74705SXin Li public:
12*67e74705SXin Li   double a;
13*67e74705SXin Li   void runc();
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li // CHECK: define void @"\01?runc@t2@@
runc()17*67e74705SXin Li void t2::runc() {
18*67e74705SXin Li   double num = 0;
19*67e74705SXin Li   __asm {
20*67e74705SXin Li       mov rax,[this]
21*67e74705SXin Li       // CHECK: [[THIS_ADDR_T2:%.+]] = alloca %class.t2*
22*67e74705SXin Li       // CHECK: [[THIS1_T2:%.+]] = load %class.t2*, %class.t2** [[THIS_ADDR_T2]],
23*67e74705SXin Li       // CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t2* [[THIS1_T2]]
24*67e74705SXin Li       mov rbx,[rax]
25*67e74705SXin Li       mov num, rbx
26*67e74705SXin Li 	   };
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK: define void @"\01?runc@t1@@
runc()30*67e74705SXin Li void t1::runc() {
31*67e74705SXin Li   double num = 0;
32*67e74705SXin Li   __asm {
33*67e74705SXin Li        mov rax,[this]
34*67e74705SXin Li        // CHECK: [[THIS_ADDR_T1:%.+]] = alloca %class.t1*
35*67e74705SXin Li        // CHECK: [[THIS1_T1:%.+]] = load %class.t1*, %class.t1** [[THIS_ADDR_T1]],
36*67e74705SXin Li        // CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t1* [[THIS1_T1]]
37*67e74705SXin Li         mov rbx,[rax]
38*67e74705SXin Li         mov num, rbx
39*67e74705SXin Li 	   };
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li struct s {
43*67e74705SXin Li   int a;
44*67e74705SXin Li   // CHECK: define linkonce_odr void @"\01?func@s@@
funcs45*67e74705SXin Li   void func() {
46*67e74705SXin Li     __asm mov rax, [this]
47*67e74705SXin Li     // CHECK: [[THIS_ADDR_S:%.+]] = alloca %struct.s*
48*67e74705SXin Li     // CHECK: [[THIS1_S:%.+]] = load %struct.s*, %struct.s** [[THIS_ADDR_S]],
49*67e74705SXin Li     // CHECK: call void asm sideeffect inteldialect "mov rax, qword ptr $0{{.*}}%struct.s* [[THIS1_S]]
50*67e74705SXin Li   }
51*67e74705SXin Li } f3;
52*67e74705SXin Li 
main()53*67e74705SXin Li int main() {
54*67e74705SXin Li   f3.func();
55*67e74705SXin Li   f3.a=1;
56*67e74705SXin Li   return 0;
57*67e74705SXin Li }
58