Upstream an MS inline assembly test from Mozilla's inline assembly code
authorEhsan Akhgari <ehsan.akhgari@gmail.com>
Thu, 17 Jul 2014 11:38:22 +0000 (11:38 +0000)
committerEhsan Akhgari <ehsan.akhgari@gmail.com>
Thu, 17 Jul 2014 11:38:22 +0000 (11:38 +0000)
Summary:
I'm planning on upstreaming some test cases for the inline assembly
usage in the Mozilla code base.  A lot of these test cases test the
recent fixes to this code.

Reviewers: rnk

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D4508

llvm-svn: 213255

clang/test/CodeGen/mozilla-ms-inline-asm.c [new file with mode: 0644]

diff --git a/clang/test/CodeGen/mozilla-ms-inline-asm.c b/clang/test/CodeGen/mozilla-ms-inline-asm.c
new file mode 100644 (file)
index 0000000..0f541d7
--- /dev/null
@@ -0,0 +1,61 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | opt -strip -S | FileCheck %s
+
+// Some test cases for MS inline asm support from Mozilla code base.
+
+void invoke(void* that, unsigned methodIndex,
+            unsigned paramCount, void* params)
+{
+// CHECK: @invoke
+// CHECK: %5 = alloca i8*, align 4
+// CHECK: %6 = alloca i32, align 4
+// CHECK: %7 = alloca i32, align 4
+// CHECK: %8 = alloca i8*, align 4
+// CHECK: store i8* %0, i8** %5, align 4
+// CHECK: store i32 %1, i32* %6, align 4
+// CHECK: store i32 %2, i32* %7, align 4
+// CHECK: store i8* %3, i8** %8, align 4
+// CHECK: call void asm sideeffect inteldialect
+// CHECK: mov edx,dword ptr $1
+// CHECK: test edx,edx
+// CHECK: jz noparams
+// CHECK: mov eax,edx
+// CHECK: shl eax,$$3
+// CHECK: sub esp,eax
+// CHECK: mov ecx,esp
+// CHECK: push dword ptr $0
+// CHECK: call invoke_copy_to_stack
+// CHECK: noparams:
+// CHECK: mov ecx,dword ptr $2
+// CHECK: push ecx
+// CHECK: mov edx,[ecx]
+// CHECK: mov eax,dword ptr $3
+// CHECK: call dword ptr[edx+eax*$$4]
+// CHECK: mov esp,ebp
+// CHECK: pop ebp
+// CHECK: ret
+// CHECK: "=*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"
+// CHECK: (i8** %8, i32* %7, i8** %5, i32* %6)
+// CHECK: ret void
+    __asm {
+        mov     edx,paramCount
+        test    edx,edx
+        jz      noparams
+        mov     eax,edx
+        shl     eax,3
+        sub     esp,eax
+        mov     ecx,esp
+        push    params
+        call    invoke_copy_to_stack
+noparams:
+        mov     ecx,that
+        push    ecx
+        mov     edx,[ecx]
+        mov     eax,methodIndex
+        call    dword ptr[edx+eax*4]
+        mov     esp,ebp
+        pop     ebp
+        ret
+    }
+}
+