brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 4fa616e Raw
197 lines · cpp
1// REQUIRES: x86-registered-target2// RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - -std=c++11 | FileCheck %s3 4struct Foo {5  static int *ptr;6  static int a, b;7  int arr[4];8  struct Bar {9    static int *ptr;10    char arr[2];11  };12};13 14void t1() {15// CHECK-LABEL: define{{.*}} void @_Z2t1v()16  Foo::ptr = (int *)0xDEADBEEF;17  Foo::Bar::ptr = (int *)0xDEADBEEF;18// CHECK: call void asm sideeffect inteldialect19// CHECK-SAME: mov eax, $020// CHECK-SAME: mov eax, $121// CHECK-SAME: mov eax, $222// CHECK-SAME: mov eax, dword ptr $323// CHECK-SAME: mov eax, dword ptr $424// CHECK-SAME: "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3Bar3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE)25  __asm mov eax, Foo ::ptr26  __asm mov eax, Foo :: Bar :: ptr27  __asm mov eax, [Foo:: ptr]28  __asm mov eax, dword ptr [Foo :: ptr]29  __asm mov eax, dword ptr [Foo :: ptr]30}31 32int gvar = 10;33void t2() {34  int lvar = 10;35  __asm mov eax, offset Foo::ptr36  __asm mov eax, offset Foo::Bar::ptr37// CHECK-LABEL: define{{.*}} void @_Z2t2v()38// CHECK: call void asm sideeffect inteldialect39// CHECK-SAME: mov eax, $040// CHECK-SAME: mov eax, $141// CHECK-SAME: "i,i,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr @_ZN3Foo3ptrE, ptr @_ZN3Foo3Bar3ptrE)42}43 44// CHECK-LABEL: define{{.*}} void @_Z2t3v()45void t3() {46  __asm mov eax, LENGTH Foo::ptr47  __asm mov eax, LENGTH Foo::Bar::ptr48  __asm mov eax, LENGTH Foo::arr49  __asm mov eax, LENGTH Foo::Bar::arr50 51  __asm mov eax, TYPE Foo::ptr52  __asm mov eax, TYPE Foo::Bar::ptr53  __asm mov eax, TYPE Foo::arr54  __asm mov eax, TYPE Foo::Bar::arr55 56  __asm mov eax, SIZE Foo::ptr57  __asm mov eax, SIZE Foo::Bar::ptr58  __asm mov eax, SIZE Foo::arr59  __asm mov eax, SIZE Foo::Bar::arr60// CHECK: call void asm sideeffect inteldialect61// CHECK-SAME: mov eax, $$162// CHECK-SAME: mov eax, $$163// CHECK-SAME: mov eax, $$464// CHECK-SAME: mov eax, $$265// CHECK-SAME: mov eax, $$466// CHECK-SAME: mov eax, $$467// CHECK-SAME: mov eax, $$468// CHECK-SAME: mov eax, $$169// CHECK-SAME: mov eax, $$470// CHECK-SAME: mov eax, $$471// CHECK-SAME: mov eax, $$1672// CHECK-SAME: mov eax, $$273// CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()74 75}76 77struct T4 {78  int x;79  static int y;80  void test();81};82 83// CHECK-LABEL: define{{.*}} void @_ZN2T44testEv(84void T4::test() {85// CHECK: [[T0:%.*]] = alloca ptr,86// CHECK: [[THIS:%.*]] = load ptr, ptr [[T0]]87// CHECK: [[X:%.*]] = getelementptr inbounds nuw [[T4:%.*]], ptr [[THIS]], i32 0, i32 088  __asm mov eax, x;89  __asm mov y, eax;90// CHECK: call void asm sideeffect inteldialect91// CHECK-SAME: mov eax, $192// CHECK-SAME: mov $0, eax93// CHECK-SAME: "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @_ZN2T41yE, ptr elementtype(i32) {{.*}})94}95 96template <class T> struct T5 {97  template <class U> static T create(U);98  void run();99};100// CHECK-LABEL: define{{.*}} void @_Z5test5v()101void test5() {102  // CHECK: [[X:%.*]] = alloca i32103  // CHECK: [[Y:%.*]] = alloca i32104  int x, y;105  __asm push y106  __asm call T5<int>::create<float>107  __asm mov x, eax108  // CHECK: call void asm sideeffect inteldialect109  // CHECK-SAME: push $0110  // CHECK-SAME: call ${2:P}111  // CHECK-SAME: mov $1, eax112  // CHECK-SAME: "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %y, ptr elementtype(i32) %x, ptr elementtype(i32 (float)) @_ZN2T5IiE6createIfEEiT_)113}114 115// Just verify this doesn't emit an error.116void test6() {117  __asm {118   a:119   jmp a120  }121}122 123void t7_struct() {124  struct A {125    int a;126    int b;127  };128  __asm mov eax, [eax].A.b129  // CHECK-LABEL: define{{.*}} void @_Z9t7_structv130  // CHECK: call void asm sideeffect inteldialect131  // CHECK-SAME: mov eax, [eax + $$4]132  // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()133}134 135void t7_typedef() {136  typedef struct {137    int a;138    int b;139  } A;140  __asm mov eax, [eax].A.b141  // CHECK-LABEL: define{{.*}} void @_Z10t7_typedefv142  // CHECK: call void asm sideeffect inteldialect143  // CHECK-SAME: mov eax, [eax + $$4]144  // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()145}146 147void t7_using() {148  using A = struct {149    int a;150    int b;151  };152  __asm mov eax, [eax].A.b153  // CHECK-LABEL: define{{.*}} void @_Z8t7_usingv154  // CHECK: call void asm sideeffect inteldialect155  // CHECK-SAME: mov eax, [eax + $$4]156  // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()157}158 159void t8() {160  __asm some_label:161  // CHECK-LABEL: define{{.*}} void @_Z2t8v()162  // CHECK: call void asm sideeffect inteldialect163  // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label:164  // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"()165  struct A {166    static void g() {167      __asm jmp some_label ; This should jump forwards168      __asm some_label:169      __asm nop170      // CHECK-LABEL: define internal void @_ZZ2t8vEN1A1gEv()171      // CHECK: call void asm sideeffect inteldialect172      // CHECK-SAME: jmp L__MSASMLABEL_.${:uid}__some_label173      // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label:174      // CHECK-SAME: nop175      // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"()176    }177  };178  A::g();179}180 181void t9() {182  // CHECK-LABEL: define{{.*}} void @_Z2t9v()183  struct A {184    int a;185    int b;186    void g() {187      __asm mov eax, dword ptr [eax]this.b188      // CHECK: call void asm sideeffect inteldialect189      // CHECK-SAME: mov eax, dword ptr [eax + $$4]190      // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()191    }192  };193  A AA;194  AA.g();195}196 197