1 ; RUN: llc -mtriple=x86_64 -o - %s | FileCheck %s
3 define i1 @try_cmpxchg(i32* %addr, i32 %desired, i32 %new) {
4 ; CHECK-LABEL: try_cmpxchg:
9 %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
10 %success = icmp eq i32 %old, %desired
14 define void @cmpxchg_flow(i64* %addr, i64 %desired, i64 %new) {
15 ; CHECK-LABEL: cmpxchg_flow:
20 %old = cmpxchg i64* %addr, i64 %desired, i64 %new seq_cst seq_cst
21 %success = icmp eq i64 %old, %desired
22 br i1 %success, label %true, label %false
33 define i1 @cmpxchg_arithcmp(i16* %addr, i16 %desired, i16 %new) {
34 ; CHECK-LABEL: cmpxchg_arithcmp:
39 %old = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
40 %success = icmp uge i16 %old, %desired
44 define i1 @cmpxchg_arithcmp_swapped(i8* %addr, i8 %desired, i8 %new) {
45 ; CHECK-LABEL: cmpxchg_arithcmp_swapped:
50 %old = cmpxchg i8* %addr, i8 %desired, i8 %new seq_cst seq_cst
51 %success = icmp sge i8 %desired, %old
55 define i64 @cmpxchg_sext(i32* %addr, i32 %desired, i32 %new) {
56 ; CHECK-LABEL: cmpxchg_sext:
58 ; CHECK-DAG: movq $-1, %rax
59 ; CHECK-DAG: xorl %e[[ZERO:[a-z0-9]+]], %e[[ZERO]]
61 ; CHECK: cmovneq %r[[ZERO]], %rax
63 %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
64 %success = icmp eq i32 %old, %desired
65 %mask = sext i1 %success to i64
69 define i32 @cmpxchg_zext(i32* %addr, i32 %desired, i32 %new) {
70 ; CHECK-LABEL: cmpxchg_zext:
73 ; CHECK: sete [[BYTE:%[a-z0-9]+]]
74 ; CHECK: movzbl [[BYTE]], %eax
75 %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
76 %success = icmp eq i32 %old, %desired
77 %mask = zext i1 %success to i32