Home | History | Annotate | Download | only in FrontendC
      1 // RUN: %llvmgcc %s -S -o - | FileCheck %s
      2 // Exercise various use cases for local asm "register variables".
      3 // XFAIL: *
      4 // XTARGET: x86_64,i686,i386
      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: %1 = call i32 asm sideeffect "; $0 This asm defines rsi", "={rsi}
     14 // CHECK: store i32 %1, 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:  %2 = load i32* %a, align 4
     21 // CHECK:  call void asm sideeffect "", "{rsi}"(i32 %2) nounwind
     22 // CHECK:  %3 = call i32 asm sideeffect "", "={rsi}"() nounwind
     23 // CHECK:  call void asm sideeffect "; $0 This asm uses rsi", "{rsi},~{dirflag},~{fpsr},~{flags}"(i32 %3)
     24 
     25   return a;
     26 // CHECK:  %4 = load i32* %a, align 4
     27 // CHECK:  call void asm sideeffect "", "{rsi}"(i32 %4) nounwind
     28 // CHECK:  %5 = call i32 asm sideeffect "", "={rsi}"() nounwind
     29 // CHECK:  store i32 %5, i32* %0, align 4
     30 // CHECK:  %6 = load i32* %0, align 4
     31 // CHECK:  store i32 %6, i32* %retval, align 4
     32 }
     33