142 lines · plain
1; RUN: llc < %s -mcpu=generic -mtriple=i686-- -mattr=+cmov,cx16 -verify-machineinstrs | FileCheck %s2 3target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"4 5define void @func(i32 %argc, ptr %argv) nounwind {6entry:7 %argc.addr = alloca i32 ; <ptr> [#uses=1]8 %argv.addr = alloca ptr ; <ptr> [#uses=1]9 %val1 = alloca i32 ; <ptr> [#uses=2]10 %val2 = alloca i32 ; <ptr> [#uses=15]11 %andt = alloca i32 ; <ptr> [#uses=2]12 %ort = alloca i32 ; <ptr> [#uses=2]13 %xort = alloca i32 ; <ptr> [#uses=2]14 %old = alloca i32 ; <ptr> [#uses=18]15 %temp = alloca i32 ; <ptr> [#uses=2]16 %temp64 = alloca i6417 store i32 %argc, ptr %argc.addr18 store ptr %argv, ptr %argv.addr19 store i32 0, ptr %val120 store i32 31, ptr %val221 store i32 3855, ptr %andt22 store i32 3855, ptr %ort23 store i32 3855, ptr %xort24 store i32 4, ptr %temp25 %tmp = load i32, ptr %temp26 ; CHECK: lock27 ; CHECK: xaddl28 %0 = atomicrmw add ptr %val1, i32 %tmp monotonic29 store i32 %0, ptr %old30 ; CHECK: lock31 ; CHECK: xaddl32 %1 = atomicrmw sub ptr %val2, i32 30 monotonic33 store i32 %1, ptr %old34 ; CHECK: lock35 ; CHECK: xaddl36 %2 = atomicrmw add ptr %val2, i32 1 monotonic37 store i32 %2, ptr %old38 ; CHECK: lock39 ; CHECK: xaddl40 %3 = atomicrmw sub ptr %val2, i32 1 monotonic41 store i32 %3, ptr %old42 ; CHECK: andl43 ; CHECK: lock44 ; CHECK: cmpxchgl45 %4 = atomicrmw and ptr %andt, i32 4080 monotonic46 store i32 %4, ptr %old47 ; CHECK: orl48 ; CHECK: lock49 ; CHECK: cmpxchgl50 %5 = atomicrmw or ptr %ort, i32 4080 monotonic51 store i32 %5, ptr %old52 ; CHECK: xorl53 ; CHECK: lock54 ; CHECK: cmpxchgl55 %6 = atomicrmw xor ptr %xort, i32 4080 monotonic56 store i32 %6, ptr %old57 ; CHECK: cmov58 ; CHECK: lock59 ; CHECK: cmpxchgl60 %7 = atomicrmw min ptr %val2, i32 16 monotonic61 store i32 %7, ptr %old62 %neg = sub i32 0, 1 ; <i32> [#uses=1]63 ; CHECK: cmov64 ; CHECK: lock65 ; CHECK: cmpxchgl66 %8 = atomicrmw min ptr %val2, i32 %neg monotonic67 store i32 %8, ptr %old68 ; CHECK: cmov69 ; CHECK: lock70 ; CHECK: cmpxchgl71 %9 = atomicrmw max ptr %val2, i32 1 monotonic72 store i32 %9, ptr %old73 ; CHECK: cmov74 ; CHECK: lock75 ; CHECK: cmpxchgl76 %10 = atomicrmw max ptr %val2, i32 0 monotonic77 store i32 %10, ptr %old78 ; CHECK: cmov79 ; CHECK: lock80 ; CHECK: cmpxchgl81 %11 = atomicrmw umax ptr %val2, i32 65535 monotonic82 store i32 %11, ptr %old83 ; CHECK: cmov84 ; CHECK: lock85 ; CHECK: cmpxchgl86 %12 = atomicrmw umax ptr %val2, i32 10 monotonic87 store i32 %12, ptr %old88 ; CHECK: cmov89 ; CHECK: lock90 ; CHECK: cmpxchgl91 %13 = atomicrmw umin ptr %val2, i32 1 monotonic92 store i32 %13, ptr %old93 ; CHECK: cmov94 ; CHECK: lock95 ; CHECK: cmpxchgl96 %14 = atomicrmw umin ptr %val2, i32 10 monotonic97 store i32 %14, ptr %old98 ; CHECK: xchgl %{{.*}}, {{.*}}(%esp)99 %15 = atomicrmw xchg ptr %val2, i32 1976 monotonic100 store i32 %15, ptr %old101 %neg1 = sub i32 0, 10 ; <i32> [#uses=1]102 ; CHECK: lock103 ; CHECK: cmpxchgl104 %pair16 = cmpxchg ptr %val2, i32 %neg1, i32 1 monotonic monotonic105 %16 = extractvalue { i32, i1 } %pair16, 0106 store i32 %16, ptr %old107 ; CHECK: lock108 ; CHECK: cmpxchgl109 %pair17 = cmpxchg ptr %val2, i32 1976, i32 1 monotonic monotonic110 %17 = extractvalue { i32, i1 } %pair17, 0111 store i32 %17, ptr %old112 ; CHECK: movl [[R17atomic:.*]], %eax113 ; CHECK: movl %eax, %[[R17mask:[a-z]*]]114 ; CHECK: notl %[[R17mask]]115 ; CHECK: orl $-1402, %[[R17mask]]116 ; CHECK: lock117 ; CHECK: cmpxchgl %[[R17mask]], [[R17atomic]]118 ; CHECK: jne119 ; CHECK: movl %eax,120 %18 = atomicrmw nand ptr %val2, i32 1401 monotonic121 store i32 %18, ptr %old122 ; CHECK: notl123 ; CHECK: notl124 ; CHECK: orl $252645135125 ; CHECK: orl $252645135126 ; CHECK: lock127 ; CHECK: cmpxchg8b128 %19 = atomicrmw nand ptr %temp64, i64 17361641481138401520 monotonic129 store i64 %19, ptr %temp64130 ret void131}132 133define void @test2(ptr addrspace(256) nocapture %P) nounwind {134entry:135; CHECK: lock136; CHECK: cmpxchgl %{{.*}}, %gs:(%{{.*}})137 138 %pair0 = cmpxchg ptr addrspace(256) %P, i32 0, i32 1 monotonic monotonic139 %0 = extractvalue { i32, i1 } %pair0, 0140 ret void141}142