Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -O0 -fms-extensions -fenable-experimental-ms-inline-asm -w -emit-llvm -o - | FileCheck %s
      2 
      3 void t1() {
      4 // CHECK: @t1
      5 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
      6 // CHECK: ret void
      7   __asm {}
      8 }
      9 
     10 void t2() {
     11 // CHECK: @t2
     12 // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
     13 // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
     14 // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
     15 // CHECK: ret void
     16   __asm nop
     17   __asm nop
     18   __asm nop
     19 }
     20 
     21 void t3() {
     22 // CHECK: @t3
     23 // CHECK: call void asm sideeffect inteldialect "nop\0Anop\0Anop", "~{dirflag},~{fpsr},~{flags}"() nounwind
     24 // CHECK: ret void
     25   __asm nop __asm nop __asm nop
     26 }
     27 
     28 void t4(void) {
     29 // CHECK: @t4
     30 // CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
     31 // CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
     32 // CHECK: ret void
     33   __asm mov ebx, eax
     34   __asm mov ecx, ebx
     35 }
     36 
     37 void t5(void) {
     38 // CHECK: @t5
     39 // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0Amov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
     40 // CHECK: ret void
     41   __asm mov ebx, eax __asm mov ecx, ebx
     42 }
     43 
     44 void t6(void) {
     45   __asm int 0x2c
     46 // CHECK: t6
     47 // CHECK: call void asm sideeffect inteldialect "int 0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
     48 }
     49 
     50 void t7() {
     51   __asm {
     52     int 0x2c ; } asm comments are fun! }{
     53   }
     54   __asm {}
     55 // CHECK: t7
     56 // CHECK: call void asm sideeffect inteldialect "int 0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
     57 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
     58 }
     59 int t8() {
     60   __asm int 3 ; } comments for single-line asm
     61   __asm {}
     62   __asm int 4
     63   return 10;
     64 // CHECK: t8
     65 // CHECK: call void asm sideeffect inteldialect "int 3", "~{dirflag},~{fpsr},~{flags}"() nounwind
     66 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
     67 // CHECK: call void asm sideeffect inteldialect "int 4", "~{dirflag},~{fpsr},~{flags}"() nounwind
     68 // CHECK: ret i32 10
     69 }
     70 void t9() {
     71   __asm {
     72     push ebx
     73     mov ebx, 0x07
     74     pop ebx
     75   }
     76 // CHECK: t9
     77 // CHECK: call void asm sideeffect inteldialect "push ebx\0Amov ebx, 0x07\0Apop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
     78 }
     79 
     80 unsigned t10(void) {
     81   unsigned i = 1, j;
     82   __asm {
     83     mov eax, i
     84     mov j, eax
     85   }
     86   return j;
     87 // CHECK: t10
     88 // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
     89 // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
     90 // CHECK: store i32 1, i32* [[I]], align 4
     91 // CHECK: call i32 asm sideeffect inteldialect "mov eax, $1\0Amov $0, eax", "=r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32 %{{.*}}) nounwind
     92 // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
     93 // CHECK: ret i32 [[RET]]
     94 }
     95 
     96 void t11(void) {
     97   __asm EVEN
     98   __asm ALIGN
     99 // CHECK: t11
    100 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    101 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    102 }
    103 
    104 void t12(void) {
    105   __asm {
    106     _emit 0x4A
    107     _emit 0x43
    108     _emit 0x4B
    109   }
    110 // CHECK: t12
    111 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    112 }
    113 
    114 void t13(void) {
    115   unsigned arr[10];
    116   __asm LENGTH arr ; sizeof(arr)/sizeof(arr[0])
    117   __asm SIZE arr   ; sizeof(arr)
    118   __asm TYPE arr   ; sizeof(arr[0])
    119 // CHECK: t13
    120 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    121 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    122 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
    123 }
    124