Dale Johannesen | a6d050d | 2010-08-31 23:43:55 +0000 | [diff] [blame] | 1 | // RUN: %llvmgcc %s -m64 -S -o - | FileCheck %s |
| 2 | // Exercise various use cases for local asm "register variables". |
| 3 | // XFAIL: * |
Dale Johannesen | 64a4e9a | 2010-09-01 05:19:06 +0000 | [diff] [blame] | 4 | // XTARGET: x86_64,i686,i386 |
Dale Johannesen | a6d050d | 2010-08-31 23:43:55 +0000 | [diff] [blame] | 5 | |
| 6 | int foo() { |
| 7 | // CHECK: %a = alloca i32 |
| 8 | |
| 9 | register int a asm("rsi")=5; |
| 10 | // CHECK: store i32 5, i32* %a, align 4 |
| 11 | |
| 12 | asm volatile("; %0 This asm defines rsi" : "=r"(a)); |
| 13 | // CHECK: %asmtmp = call i32 asm sideeffect "; $0 This asm defines rsi", "={rsi} |
| 14 | // CHECK: store i32 %asmtmp, i32* %a |
| 15 | |
| 16 | a = 42; |
| 17 | // CHECK: store i32 42, i32* %a, align 4 |
| 18 | |
| 19 | asm volatile("; %0 This asm uses rsi" : : "r"(a)); |
| 20 | // CHECK: %1 = load i32* %a, align 4 |
| 21 | // CHECK: call void asm sideeffect "", "{rsi}"(i32 %1) nounwind |
| 22 | // CHECK: %2 = call i32 asm sideeffect "", "={rsi}"() nounwind |
| 23 | // CHECK: call void asm sideeffect "; $0 This asm uses rsi", "{rsi},~{dirflag},~{fpsr},~{flags}"(i32 %2) |
| 24 | |
| 25 | return a; |
| 26 | // CHECK: %3 = load i32* %a, align 4 |
| 27 | // CHECK: call void asm sideeffect "", "{rsi}"(i32 %3) nounwind |
| 28 | // CHECK: %4 = call i32 asm sideeffect "", "={rsi}"() nounwind |
| 29 | // CHECK: store i32 %4, i32* %0, align 4 |
| 30 | // CHECK: %5 = load i32* %0, align 4 |
| 31 | // CHECK: store i32 %5, i32* %retval, align 4 |
| 32 | } |