65 lines · c
1// REQUIRES: x86-registered-target2// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | opt -passes=strip -S | FileCheck %s3 4// Some test cases for MS inline asm support from Mozilla code base.5 6void invoke_copy_to_stack() {}7 8void invoke(void* that, unsigned methodIndex,9 unsigned paramCount, void* params)10{11// CHECK: @invoke12// CHECK: %5 = alloca ptr, align 413// CHECK: %6 = alloca i32, align 414// CHECK: %7 = alloca i32, align 415// CHECK: %8 = alloca ptr, align 416// CHECK: store ptr %0, ptr %5, align 417// CHECK: store i32 %1, ptr %6, align 418// CHECK: store i32 %2, ptr %7, align 419// CHECK: store ptr %3, ptr %8, align 420// CHECK: call void asm sideeffect inteldialect21// CHECK-SAME: mov edx,$122// CHECK-SAME: test edx,edx23// CHECK-SAME: jz {{[^_]*}}__MSASMLABEL_.${:uid}__noparams24// ^ Can't use {{.*}} here because the matching is greedy.25// CHECK-SAME: mov eax,edx26// CHECK-SAME: shl eax,$$327// CHECK-SAME: sub esp,eax28// CHECK-SAME: mov ecx,esp29// CHECK-SAME: push $030// CHECK-SAME: call ${2:P}31// CHECK-SAME: {{.*}}__MSASMLABEL_.${:uid}__noparams:32// CHECK-SAME: mov ecx,$333// CHECK-SAME: push ecx34// CHECK-SAME: mov edx,[ecx]35// CHECK-SAME: mov eax,$436// CHECK-SAME: call dword ptr[edx + eax * $$4]37// CHECK-SAME: mov esp,ebp38// CHECK-SAME: pop ebp39// CHECK-SAME: ret40// CHECK: "=*m,*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"41// CHECK: (ptr elementtype(ptr) %8, ptr elementtype(i32) %7, ptr elementtype(void (...)) @invoke_copy_to_stack, ptr elementtype(ptr) %5, ptr elementtype(i32) %6)42// CHECK: ret void43 __asm {44 mov edx,paramCount45 test edx,edx46 jz noparams47 mov eax,edx48 shl eax,349 sub esp,eax50 mov ecx,esp51 push params52 call invoke_copy_to_stack53noparams:54 mov ecx,that55 push ecx56 mov edx,[ecx]57 mov eax,methodIndex58 call dword ptr[edx+eax*4]59 mov esp,ebp60 pop ebp61 ret62 }63}64 65