brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · bb07640 Raw
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