153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=core-avx2 | FileCheck %s3 4define i1 @try_cmpxchg(ptr %addr, i128 %desired, i128 %new) {5; CHECK-LABEL: try_cmpxchg:6; CHECK: # %bb.0:7; CHECK-NEXT: pushq %rbx8; CHECK-NEXT: .cfi_def_cfa_offset 169; CHECK-NEXT: .cfi_offset %rbx, -1610; CHECK-NEXT: movq %rcx, %rbx11; CHECK-NEXT: movq %rsi, %rax12; CHECK-NEXT: movq %r8, %rcx13; CHECK-NEXT: lock cmpxchg16b (%rdi)14; CHECK-NEXT: sete %al15; CHECK-NEXT: popq %rbx16; CHECK-NEXT: .cfi_def_cfa_offset 817; CHECK-NEXT: retq18 %pair = cmpxchg ptr %addr, i128 %desired, i128 %new seq_cst seq_cst19 %success = extractvalue { i128, i1 } %pair, 120 ret i1 %success21}22 23define void @cmpxchg_flow(ptr %addr, i128 %desired, i128 %new) {24; CHECK-LABEL: cmpxchg_flow:25; CHECK: # %bb.0:26; CHECK-NEXT: pushq %rbx27; CHECK-NEXT: .cfi_def_cfa_offset 1628; CHECK-NEXT: .cfi_offset %rbx, -1629; CHECK-NEXT: movq %rcx, %rbx30; CHECK-NEXT: movq %rsi, %rax31; CHECK-NEXT: movq %r8, %rcx32; CHECK-NEXT: lock cmpxchg16b (%rdi)33; CHECK-NEXT: jne .LBB1_234; CHECK-NEXT: # %bb.1: # %true35; CHECK-NEXT: callq foo@PLT36; CHECK-NEXT: popq %rbx37; CHECK-NEXT: .cfi_def_cfa_offset 838; CHECK-NEXT: retq39; CHECK-NEXT: .LBB1_2: # %false40; CHECK-NEXT: .cfi_def_cfa_offset 1641; CHECK-NEXT: callq bar@PLT42; CHECK-NEXT: popq %rbx43; CHECK-NEXT: .cfi_def_cfa_offset 844; CHECK-NEXT: retq45 %pair = cmpxchg ptr %addr, i128 %desired, i128 %new seq_cst seq_cst46 %success = extractvalue { i128, i1 } %pair, 147 br i1 %success, label %true, label %false48 49true:50 call void @foo()51 ret void52 53false:54 call void @bar()55 ret void56}57 58; Can't use the flags here because cmpxchg16b only sets ZF.59define i1 @cmpxchg_arithcmp(ptr %addr, i128 %desired, i128 %new) {60; CHECK-LABEL: cmpxchg_arithcmp:61; CHECK: # %bb.0:62; CHECK-NEXT: pushq %rbx63; CHECK-NEXT: .cfi_def_cfa_offset 1664; CHECK-NEXT: .cfi_offset %rbx, -1665; CHECK-NEXT: movq %rcx, %rbx66; CHECK-NEXT: movq %rdx, %r967; CHECK-NEXT: movq %rsi, %rax68; CHECK-NEXT: movq %r8, %rcx69; CHECK-NEXT: lock cmpxchg16b (%rdi)70; CHECK-NEXT: cmpq %rsi, %rax71; CHECK-NEXT: sbbq %r9, %rdx72; CHECK-NEXT: setge %al73; CHECK-NEXT: popq %rbx74; CHECK-NEXT: .cfi_def_cfa_offset 875; CHECK-NEXT: retq76 %pair = cmpxchg ptr %addr, i128 %desired, i128 %new seq_cst seq_cst77 %oldval = extractvalue { i128, i1 } %pair, 078 %success = icmp sge i128 %oldval, %desired79 ret i1 %success80}81 82define i128 @cmpxchg_zext(ptr %addr, i128 %desired, i128 %new) {83; CHECK-LABEL: cmpxchg_zext:84; CHECK: # %bb.0:85; CHECK-NEXT: pushq %rbx86; CHECK-NEXT: .cfi_def_cfa_offset 1687; CHECK-NEXT: .cfi_offset %rbx, -1688; CHECK-NEXT: movq %rcx, %rbx89; CHECK-NEXT: movq %rsi, %rax90; CHECK-NEXT: xorl %esi, %esi91; CHECK-NEXT: movq %r8, %rcx92; CHECK-NEXT: lock cmpxchg16b (%rdi)93; CHECK-NEXT: sete %sil94; CHECK-NEXT: movq %rsi, %rax95; CHECK-NEXT: xorl %edx, %edx96; CHECK-NEXT: popq %rbx97; CHECK-NEXT: .cfi_def_cfa_offset 898; CHECK-NEXT: retq99 %pair = cmpxchg ptr %addr, i128 %desired, i128 %new seq_cst seq_cst100 %success = extractvalue { i128, i1 } %pair, 1101 %mask = zext i1 %success to i128102 ret i128 %mask103}104 105 106define i128 @cmpxchg_use_eflags_and_val(ptr %addr, i128 %offset) {107; CHECK-LABEL: cmpxchg_use_eflags_and_val:108; CHECK: # %bb.0: # %entry109; CHECK-NEXT: pushq %rbx110; CHECK-NEXT: .cfi_def_cfa_offset 16111; CHECK-NEXT: .cfi_offset %rbx, -16112; CHECK-NEXT: movq %rdx, %r8113; CHECK-NEXT: vmovdqa (%rdi), %xmm0114; CHECK-NEXT: vpextrq $1, %xmm0, %rdx115; CHECK-NEXT: vmovq %xmm0, %rax116; CHECK-NEXT: .p2align 4117; CHECK-NEXT: .LBB4_1: # %loop118; CHECK-NEXT: # =>This Inner Loop Header: Depth=1119; CHECK-NEXT: movq %rdx, %r9120; CHECK-NEXT: movq %rax, %r10121; CHECK-NEXT: movq %rax, %rbx122; CHECK-NEXT: addq %rsi, %rbx123; CHECK-NEXT: movq %rdx, %rcx124; CHECK-NEXT: adcq %r8, %rcx125; CHECK-NEXT: lock cmpxchg16b (%rdi)126; CHECK-NEXT: jne .LBB4_1127; CHECK-NEXT: # %bb.2: # %done128; CHECK-NEXT: movq %r10, %rax129; CHECK-NEXT: movq %r9, %rdx130; CHECK-NEXT: popq %rbx131; CHECK-NEXT: .cfi_def_cfa_offset 8132; CHECK-NEXT: retq133entry:134 %init = load atomic i128, ptr %addr seq_cst, align 16135 br label %loop136 137loop:138 %old = phi i128 [%init, %entry], [%oldval, %loop]139 %new = add i128 %old, %offset140 141 %pair = cmpxchg ptr %addr, i128 %old, i128 %new seq_cst seq_cst142 %oldval = extractvalue { i128, i1 } %pair, 0143 %success = extractvalue { i128, i1 } %pair, 1144 145 br i1 %success, label %done, label %loop146 147done:148 ret i128 %old149}150 151declare void @foo()152declare void @bar()153