blob: 0f541d70fcddd89a9f5c84d62c3961d56996b02a [file] [log] [blame]
Ehsan Akhgarid86ca7a92014-07-17 11:38:22 +00001// REQUIRES: x86-registered-target
2// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | opt -strip -S | FileCheck %s
3
4// Some test cases for MS inline asm support from Mozilla code base.
5
6void invoke(void* that, unsigned methodIndex,
7 unsigned paramCount, void* params)
8{
9// CHECK: @invoke
10// CHECK: %5 = alloca i8*, align 4
11// CHECK: %6 = alloca i32, align 4
12// CHECK: %7 = alloca i32, align 4
13// CHECK: %8 = alloca i8*, align 4
14// CHECK: store i8* %0, i8** %5, align 4
15// CHECK: store i32 %1, i32* %6, align 4
16// CHECK: store i32 %2, i32* %7, align 4
17// CHECK: store i8* %3, i8** %8, align 4
18// CHECK: call void asm sideeffect inteldialect
19// CHECK: mov edx,dword ptr $1
20// CHECK: test edx,edx
21// CHECK: jz noparams
22// CHECK: mov eax,edx
23// CHECK: shl eax,$$3
24// CHECK: sub esp,eax
25// CHECK: mov ecx,esp
26// CHECK: push dword ptr $0
27// CHECK: call invoke_copy_to_stack
28// CHECK: noparams:
29// CHECK: mov ecx,dword ptr $2
30// CHECK: push ecx
31// CHECK: mov edx,[ecx]
32// CHECK: mov eax,dword ptr $3
33// CHECK: call dword ptr[edx+eax*$$4]
34// CHECK: mov esp,ebp
35// CHECK: pop ebp
36// CHECK: ret
37// CHECK: "=*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"
38// CHECK: (i8** %8, i32* %7, i8** %5, i32* %6)
39// CHECK: ret void
40 __asm {
41 mov edx,paramCount
42 test edx,edx
43 jz noparams
44 mov eax,edx
45 shl eax,3
46 sub esp,eax
47 mov ecx,esp
48 push params
49 call invoke_copy_to_stack
50noparams:
51 mov ecx,that
52 push ecx
53 mov edx,[ecx]
54 mov eax,methodIndex
55 call dword ptr[edx+eax*4]
56 mov esp,ebp
57 pop ebp
58 ret
59 }
60}
61