| // REQUIRES: x86-registered-target |
| // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -Wno-strict-prototypes -fasm-blocks -emit-llvm -o - | FileCheck %s |
| |
| void t1(void) { |
| 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}"(ptr %{{.*}}) |
| } |
| |
| void t2(void) { |
| int var = 10; |
| __asm mov qword ptr [eax], offset var |
| // CHECK: t2 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: mov qword ptr [eax], $0 |
| // CHECK-SAME: "r,~{dirflag},~{fpsr},~{flags}"(ptr %{{.*}}) |
| } |
| |
| struct t3_type { int a, b; }; |
| |
| int t3(void) { |
| 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}"(ptr elementtype(%struct.t3_type) %{{.*}}) |
| } |
| |
| int t4(void) { |
| 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}"(ptr elementtype(%struct.t3_type) %{{.*}}) |
| } |
| |
| void bar() {} |
| static void (*fptr)(); |
| |
| void t5(void) { |
| __asm { |
| call bar |
| jmp bar |
| call fptr |
| jmp fptr |
| } |
| // CHECK: t5 |
| // CHECK: call void asm sideeffect inteldialect |
| // CHECK-SAME: call ${0:P} |
| // CHECK-SAME: jmp ${1:P} |
| // CHECK-SAME: call $2 |
| // CHECK-SAME: jmp $3 |
| // CHECK-SAME: "*m,*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(void (...)) @bar, ptr elementtype(void (...)) @bar, ptr elementtype(ptr) @fptr, ptr elementtype(ptr) @fptr) |
| } |
| |
| void t47(void) { |
| // CHECK-LABEL: define{{.*}} void @t47 |
| int arr[1000]; |
| __asm movdir64b rax, zmmword ptr [arr] |
| // CHECK: call void asm sideeffect inteldialect "movdir64b rax, zmmword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype([1000 x i32]) %arr) |
| } |