Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: x86-registered-target
      2 // RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - -std=c++11 | FileCheck %s
      3 
      4 // rdar://13645930
      5 
      6 struct Foo {
      7   static int *ptr;
      8   static int a, b;
      9   int arr[4];
     10   struct Bar {
     11     static int *ptr;
     12     char arr[2];
     13   };
     14 };
     15 
     16 void t1() {
     17   Foo::ptr = (int *)0xDEADBEEF;
     18   Foo::Bar::ptr = (int *)0xDEADBEEF;
     19   __asm mov eax, Foo ::ptr
     20   __asm mov eax, Foo :: Bar :: ptr
     21   __asm mov eax, [Foo:: ptr]
     22   __asm mov eax, dword ptr [Foo :: ptr]
     23   __asm mov eax, dword ptr [Foo :: ptr]
     24 // CHECK: @_Z2t1v
     25 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0\0A\09mov eax, dword ptr $1\0A\09mov eax, dword ptr $2\0A\09mov eax, dword ptr $3\0A\09mov eax, dword ptr $4", "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE)
     26 }
     27 
     28 int gvar = 10;
     29 void t2() {
     30   int lvar = 10;
     31   __asm mov eax, offset Foo::ptr
     32   __asm mov eax, offset Foo::Bar::ptr
     33 // CHECK: t2
     34 // CHECK: call void asm sideeffect inteldialect "mov eax, $0\0A\09mov eax, $1", "r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE)
     35 }
     36 
     37 // CHECK-LABEL: define void @_Z2t3v()
     38 void t3() {
     39   __asm mov eax, LENGTH Foo::ptr
     40   __asm mov eax, LENGTH Foo::Bar::ptr
     41   __asm mov eax, LENGTH Foo::arr
     42   __asm mov eax, LENGTH Foo::Bar::arr
     43 
     44   __asm mov eax, TYPE Foo::ptr
     45   __asm mov eax, TYPE Foo::Bar::ptr
     46   __asm mov eax, TYPE Foo::arr
     47   __asm mov eax, TYPE Foo::Bar::arr
     48 
     49   __asm mov eax, SIZE Foo::ptr
     50   __asm mov eax, SIZE Foo::Bar::ptr
     51   __asm mov eax, SIZE Foo::arr
     52   __asm mov eax, SIZE Foo::Bar::arr
     53 // CHECK: call void asm sideeffect inteldialect "mov eax, $$1\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$2\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$16\0A\09mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"()
     54 
     55 }
     56 
     57 struct T4 {
     58   int x;
     59   static int y;
     60   void test();
     61 };
     62 
     63 // CHECK-LABEL: define void @_ZN2T44testEv(
     64 void T4::test() {
     65 // CHECK: [[T0:%.*]] = alloca [[T4:%.*]]*,
     66 // CHECK: [[THIS:%.*]] = load [[T4]]*, [[T4]]** [[T0]]
     67 // CHECK: [[X:%.*]] = getelementptr inbounds [[T4]], [[T4]]* [[THIS]], i32 0, i32 0
     68   __asm mov eax, x;
     69   __asm mov y, eax;
     70 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE, i32* {{.*}})
     71 }
     72 
     73 template <class T> struct T5 {
     74   template <class U> static T create(U);
     75   void run();
     76 };
     77 // CHECK-LABEL: define void @_Z5test5v()
     78 void test5() {
     79   // CHECK: [[X:%.*]] = alloca i32
     80   // CHECK: [[Y:%.*]] = alloca i32
     81   int x, y;
     82   __asm push y
     83   __asm call T5<int>::create<float>
     84   __asm mov x, eax
     85   // CHECK: call void asm sideeffect inteldialect "push dword ptr $0\0A\09call dword ptr $2\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(i32* %y, i32* %x, i32 (float)* @_ZN2T5IiE6createIfEEiT_)
     86 }
     87 
     88 // Just verify this doesn't emit an error.
     89 void test6() {
     90   __asm {
     91    a:
     92    jmp a
     93   }
     94 }
     95 
     96 void t7_struct() {
     97   struct A {
     98     int a;
     99     int b;
    100   };
    101   __asm mov eax, [eax].A.b
    102   // CHECK-LABEL: define void @_Z9t7_structv
    103   // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    104 }
    105 
    106 void t7_typedef() {
    107   typedef struct {
    108     int a;
    109     int b;
    110   } A;
    111   __asm mov eax, [eax].A.b
    112   // CHECK-LABEL: define void @_Z10t7_typedefv
    113   // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    114 }
    115 
    116 void t7_using() {
    117   using A = struct {
    118     int a;
    119     int b;
    120   };
    121   __asm mov eax, [eax].A.b
    122   // CHECK-LABEL: define void @_Z8t7_usingv
    123   // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    124 }
    125 
    126 void t8() {
    127   __asm some_label:
    128   // CHECK-LABEL: define void @_Z2t8v()
    129   // CHECK: call void asm sideeffect inteldialect "L__MSASMLABEL_.1__some_label:", "~{dirflag},~{fpsr},~{flags}"()
    130   struct A {
    131     static void g() {
    132       __asm jmp some_label ; This should jump forwards
    133       __asm some_label:
    134       __asm nop
    135       // CHECK-LABEL: define internal void @_ZZ2t8vEN1A1gEv()
    136       // CHECK: call void asm sideeffect inteldialect "jmp L__MSASMLABEL_.2__some_label\0A\09L__MSASMLABEL_.2__some_label:\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
    137     }
    138   };
    139   A::g();
    140 }
    141 
    142