<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jul 14, 2014 at 8:35 PM, Ehsan Akhgari <span dir="ltr"><<a href="mailto:ehsan.akhgari@gmail.com" target="_blank">ehsan.akhgari@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi rnk,<br>
<br>
I'm planning on upstreaming some test cases for the inline assembly<br>
usage in the Mozilla code base.  A lot of these test cases test the<br>
recent fixes to this code.<br></blockquote><div><br></div><div>The recent fixes probably already included tests. Does this test anything in addition to that? If so, can the test be named after what it tests?</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<a href="http://reviews.llvm.org/D4508" target="_blank">http://reviews.llvm.org/D4508</a><br>
<br>
Files:<br>
  test/CodeGen/mozilla-ms-inline-asm.c<br>
<br>
Index: test/CodeGen/mozilla-ms-inline-asm.c<br>
===================================================================<br>
--- /dev/null<br>
+++ test/CodeGen/mozilla-ms-inline-asm.c<br>
@@ -0,0 +1,41 @@<br>
+// REQUIRES: x86-registered-target<br>
+// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s<br>
+<br>
+// Some test cases for MS inline asm support from Mozilla code base.<br>
+<br>
+void invoke(void* that, unsigned methodIndex,<br>
+            unsigned paramCount, void* params)<br>
+{<br>
+// CHECK: @invoke<br>
+// CHECK: %that.addr = alloca i8*, align 4<br>
+// CHECK: %methodIndex.addr = alloca i32, align 4<br>
+// CHECK: %paramCount.addr = alloca i32, align 4<br>
+// CHECK: %params.addr = alloca i8*, align 4<br>
+// CHECK: store i8* %that, i8** %that.addr, align 4<br>
+// CHECK: store i32 %methodIndex, i32* %methodIndex.addr, align 4<br>
+// CHECK: store i32 %paramCount, i32* %paramCount.addr, align 4<br>
+// CHECK: store i8* %params, i8** %params.addr, align 4<br>
+// CHECK: call void asm sideeffect inteldialect "mov edx,dword ptr $1\0A\09test edx,edx\0A\09jz noparams\0A\09mov eax,edx\0A\09shl eax,$$3\0A\09sub esp,eax\0A\09mov ecx,esp\0A\09push dword ptr $0\0A\09call invoke_copy_to_stack\0A\09noparams:\0A\09mov ecx,dword ptr $2\0A\09push ecx\0A\09mov edx,[ecx]\0A\09mov eax,dword ptr $3\0A\09call dword ptr[edx+eax*$$4]\0A\09mov esp,ebp\0A\09pop ebp\0A\09ret", "=*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"(i8** %params.addr, i32* %paramCount.addr, i8** %that.addr, i32* %methodIndex.addr) #1<br>

+// CHECK: ret void<br>
+    __asm {<br>
+        mov     edx,paramCount<br>
+        test    edx,edx<br>
+        jz      noparams<br>
+        mov     eax,edx<br>
+        shl     eax,3<br>
+        sub     esp,eax<br>
+        mov     ecx,esp<br>
+        push    params<br>
+        call    invoke_copy_to_stack<br>
+noparams:<br>
+        mov     ecx,that<br>
+        push    ecx<br>
+        mov     edx,[ecx]<br>
+        mov     eax,methodIndex<br>
+        call    dword ptr[edx+eax*4]<br>
+        mov     esp,ebp<br>
+        pop     ebp<br>
+        ret<br>
+    }<br>
+}<br>
+<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div></div>