| // REQUIRES: x86-registered-target |
| // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s |
| |
| void t1() { |
| int var = 10; |
| __asm mov rax, offset var ; rax = address of myvar |
| // CHECK: t1 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: mov rax, $0 |
| // CHECK-SAME: "r,~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) |
| } |
| |
| void t2() { |
| int var = 10; |
| __asm mov [eax], offset var |
| // CHECK: t2 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: mov [eax], $0 |
| // CHECK-SAME: "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) |
| } |
| |
| struct t3_type { int a, b; }; |
| |
| int t3() { |
| struct t3_type foo; |
| foo.a = 1; |
| foo.b = 2; |
| __asm { |
| lea ebx, foo |
| mov eax, [ebx].0 |
| mov [ebx].4, ecx |
| } |
| return foo.b; |
| // CHECK: t3 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: lea ebx, $0 |
| // CHECK-SAME: mov eax, [ebx] |
| // CHECK-SAME: mov [ebx + $$4], ecx |
| // CHECK-SAME: "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) |
| } |
| |
| int t4() { |
| struct t3_type foo; |
| foo.a = 1; |
| foo.b = 2; |
| __asm { |
| lea ebx, foo |
| { |
| mov eax, [ebx].foo.a |
| } |
| mov [ebx].foo.b, ecx |
| } |
| return foo.b; |
| // CHECK: t4 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: lea ebx, $0 |
| // CHECK-SAME: mov eax, [ebx] |
| // CHECK-SAME: mov [ebx + $$4], ecx |
| // CHECK-SAME: "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) |
| } |