1 ; RUN: llc -mcpu=core-avx2 -mtriple=x86_64 -o - %s | FileCheck %s
3 define i1 @try_cmpxchg(i128* %addr, i128 %desired, i128 %new) {
4 ; CHECK-LABEL: try_cmpxchg:
9 %pair = cmpxchg i128* %addr, i128 %desired, i128 %new seq_cst seq_cst
10 %success = extractvalue { i128, i1 } %pair, 1
14 define void @cmpxchg_flow(i128* %addr, i128 %desired, i128 %new) {
15 ; CHECK-LABEL: cmpxchg_flow:
20 %pair = cmpxchg i128* %addr, i128 %desired, i128 %new seq_cst seq_cst
21 %success = extractvalue { i128, i1 } %pair, 1
22 br i1 %success, label %true, label %false
33 ; Can't use the flags here because cmpxchg16b only sets ZF.
34 define i1 @cmpxchg_arithcmp(i128* %addr, i128 %desired, i128 %new) {
35 ; CHECK-LABEL: cmpxchg_arithcmp:
39 %pair = cmpxchg i128* %addr, i128 %desired, i128 %new seq_cst seq_cst
40 %oldval = extractvalue { i128, i1 } %pair, 0
41 %success = icmp sge i128 %oldval, %desired
45 define i128 @cmpxchg_zext(i128* %addr, i128 %desired, i128 %new) {
46 ; CHECK-LABEL: cmpxchg_zext:
49 ; CHECK: sete [[BYTE:%[a-z0-9]+]]
50 ; CHECK: movzbl [[BYTE]], %eax
51 %pair = cmpxchg i128* %addr, i128 %desired, i128 %new seq_cst seq_cst
52 %success = extractvalue { i128, i1 } %pair, 1
53 %mask = zext i1 %success to i128
58 define i128 @cmpxchg_use_eflags_and_val(i128* %addr, i128 %offset) {
59 ; CHECK-LABEL: cmpxchg_use_eflags_and_val:
65 %init = load atomic i128* %addr seq_cst, align 16
69 %old = phi i128 [%init, %entry], [%oldval, %loop]
70 %new = add i128 %old, %offset
72 %pair = cmpxchg i128* %addr, i128 %old, i128 %new seq_cst seq_cst
73 %oldval = extractvalue { i128, i1 } %pair, 0
74 %success = extractvalue { i128, i1 } %pair, 1
76 br i1 %success, label %done, label %loop