74 lines · plain
1; RUN: llc -mtriple=x86_64-pc-linux-gnu %s -o - -no-integrated-as | FileCheck %s2 3; C code this came from4;bool cas(float volatile *p, ptr expected, float desired) {5; bool success;6; __asm__ __volatile__("lock; cmpxchg %[desired], %[mem]; "7; "mov %[expected], %[expected_out]; "8; "sete %[success]"9; : [success] "=a" (success),10; [expected_out] "=rm" (*expected)11; : [expected] "a" (*expected),12; [desired] "q" (desired),13; [mem] "m" (*p)14; : "memory", "cc");15; return success;16;}17 18define zeroext i1 @cas(ptr %p, ptr %expected, float %desired) nounwind {19entry:20 %p.addr = alloca ptr, align 821 %expected.addr = alloca ptr, align 822 %desired.addr = alloca float, align 423 %success = alloca i8, align 124 store ptr %p, ptr %p.addr, align 825 store ptr %expected, ptr %expected.addr, align 826 store float %desired, ptr %desired.addr, align 427 %0 = load ptr, ptr %expected.addr, align 828 %1 = load ptr, ptr %expected.addr, align 829 %2 = load float, ptr %1, align 430 %3 = load float, ptr %desired.addr, align 431 %4 = load ptr, ptr %p.addr, align 832 %5 = call i8 asm sideeffect "lock; cmpxchg $3, $4; mov $2, $1; sete $0", "={ax},=*rm,{ax},q,*m,~{memory},~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(float) %0, float %2, float %3, ptr elementtype(float) %4) nounwind33 store i8 %5, ptr %success, align 134 %6 = load i8, ptr %success, align 135 %tobool = trunc i8 %6 to i136 ret i1 %tobool37}38 39; CHECK: @cas40; Make sure we're emitting a move from eax.41; CHECK: #APP42; CHECK-NEXT: lock;{{.*}}mov %eax,{{.*}}43; CHECK-NEXT: #NO_APP44 45define zeroext i1 @cas2(ptr %p, ptr %expected, i1 zeroext %desired) nounwind {46entry:47 %p.addr = alloca ptr, align 848 %expected.addr = alloca ptr, align 849 %desired.addr = alloca i8, align 150 %success = alloca i8, align 151 store ptr %p, ptr %p.addr, align 852 store ptr %expected, ptr %expected.addr, align 853 %frombool = zext i1 %desired to i854 store i8 %frombool, ptr %desired.addr, align 155 %0 = load ptr, ptr %expected.addr, align 856 %1 = load ptr, ptr %expected.addr, align 857 %2 = load i8, ptr %1, align 158 %tobool = trunc i8 %2 to i159 %3 = load i8, ptr %desired.addr, align 160 %tobool1 = trunc i8 %3 to i161 %4 = load ptr, ptr %p.addr, align 862 %5 = call i8 asm sideeffect "lock; cmpxchg $3, $4; mov $2, $1; sete $0", "={ax},=*rm,{ax},q,*m,~{memory},~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i8) %0, i1 %tobool, i1 %tobool1, ptr elementtype(i8) %4) nounwind63 store i8 %5, ptr %success, align 164 %6 = load i8, ptr %success, align 165 %tobool2 = trunc i8 %6 to i166 ret i1 %tobool267}68 69; CHECK: @cas270; Make sure we're emitting a move from %al here.71; CHECK: #APP72; CHECK-NEXT: lock;{{.*}}mov %al,{{.*}}73; CHECK-NEXT: #NO_APP74