1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV 2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV 3 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV 4 5 @sc32 = external global i32 6 7 define void @atomic_fetch_add32() nounwind { 8 ; WITH-CMOV-LABEL: atomic_fetch_add32: 9 entry: 10 ; 32-bit 11 %t1 = atomicrmw add i32* @sc32, i32 1 acquire 12 ; WITH-CMOV: lock 13 ; WITH-CMOV: incl 14 %t2 = atomicrmw add i32* @sc32, i32 3 acquire 15 ; WITH-CMOV: lock 16 ; WITH-CMOV: addl $3 17 %t3 = atomicrmw add i32* @sc32, i32 5 acquire 18 ; WITH-CMOV: lock 19 ; WITH-CMOV: xaddl 20 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire 21 ; WITH-CMOV: lock 22 ; WITH-CMOV: addl 23 ret void 24 ; WITH-CMOV: ret 25 } 26 27 define void @atomic_fetch_sub32() nounwind { 28 ; WITH-CMOV-LABEL: atomic_fetch_sub32: 29 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire 30 ; WITH-CMOV: lock 31 ; WITH-CMOV: decl 32 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire 33 ; WITH-CMOV: lock 34 ; WITH-CMOV: subl $3 35 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire 36 ; WITH-CMOV: lock 37 ; WITH-CMOV: xaddl 38 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire 39 ; WITH-CMOV: lock 40 ; WITH-CMOV: subl 41 ret void 42 ; WITH-CMOV: ret 43 } 44 45 define void @atomic_fetch_and32() nounwind { 46 ; WITH-CMOV-LABEL: atomic_fetch_and32: 47 %t1 = atomicrmw and i32* @sc32, i32 3 acquire 48 ; WITH-CMOV: lock 49 ; WITH-CMOV: andl $3 50 %t2 = atomicrmw and i32* @sc32, i32 5 acquire 51 ; WITH-CMOV: andl 52 ; WITH-CMOV: lock 53 ; WITH-CMOV: cmpxchgl 54 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire 55 ; WITH-CMOV: lock 56 ; WITH-CMOV: andl 57 ret void 58 ; WITH-CMOV: ret 59 } 60 61 define void @atomic_fetch_or32() nounwind { 62 ; WITH-CMOV-LABEL: atomic_fetch_or32: 63 %t1 = atomicrmw or i32* @sc32, i32 3 acquire 64 ; WITH-CMOV: lock 65 ; WITH-CMOV: orl $3 66 %t2 = atomicrmw or i32* @sc32, i32 5 acquire 67 ; WITH-CMOV: orl 68 ; WITH-CMOV: lock 69 ; WITH-CMOV: cmpxchgl 70 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire 71 ; WITH-CMOV: lock 72 ; WITH-CMOV: orl 73 ret void 74 ; WITH-CMOV: ret 75 } 76 77 define void @atomic_fetch_xor32() nounwind { 78 ; WITH-CMOV-LABEL: atomic_fetch_xor32: 79 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire 80 ; WITH-CMOV: lock 81 ; WITH-CMOV: xorl $3 82 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire 83 ; WITH-CMOV: xorl 84 ; WITH-CMOV: lock 85 ; WITH-CMOV: cmpxchgl 86 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire 87 ; WITH-CMOV: lock 88 ; WITH-CMOV: xorl 89 ret void 90 ; WITH-CMOV: ret 91 } 92 93 define void @atomic_fetch_nand32(i32 %x) nounwind { 94 ; WITH-CMOV-LABEL: atomic_fetch_nand32: 95 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire 96 ; WITH-CMOV: andl 97 ; WITH-CMOV: notl 98 ; WITH-CMOV: lock 99 ; WITH-CMOV: cmpxchgl 100 ret void 101 ; WITH-CMOV: ret 102 } 103 104 define void @atomic_fetch_max32(i32 %x) nounwind { 105 ; WITH-CMOV-LABEL: atomic_fetch_max32: 106 107 %t1 = atomicrmw max i32* @sc32, i32 %x acquire 108 ; WITH-CMOV: subl 109 ; WITH-CMOV: cmov 110 ; WITH-CMOV: lock 111 ; WITH-CMOV: cmpxchgl 112 113 ; NOCMOV: subl 114 ; NOCMOV: jge 115 ; NOCMOV: lock 116 ; NOCMOV: cmpxchgl 117 ret void 118 ; WITH-CMOV: ret 119 ; NOCMOV: ret 120 } 121 122 define void @atomic_fetch_min32(i32 %x) nounwind { 123 ; WITH-CMOV-LABEL: atomic_fetch_min32: 124 ; NOCMOV-LABEL: atomic_fetch_min32: 125 126 %t1 = atomicrmw min i32* @sc32, i32 %x acquire 127 ; WITH-CMOV: subl 128 ; WITH-CMOV: cmov 129 ; WITH-CMOV: lock 130 ; WITH-CMOV: cmpxchgl 131 132 ; NOCMOV: subl 133 ; NOCMOV: jle 134 ; NOCMOV: lock 135 ; NOCMOV: cmpxchgl 136 ret void 137 ; WITH-CMOV: ret 138 ; NOCMOV: ret 139 } 140 141 define void @atomic_fetch_umax32(i32 %x) nounwind { 142 ; WITH-CMOV-LABEL: atomic_fetch_umax32: 143 ; NOCMOV-LABEL: atomic_fetch_umax32: 144 145 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire 146 ; WITH-CMOV: subl 147 ; WITH-CMOV: cmov 148 ; WITH-CMOV: lock 149 ; WITH-CMOV: cmpxchgl 150 151 ; NOCMOV: subl 152 ; NOCMOV: ja 153 ; NOCMOV: lock 154 ; NOCMOV: cmpxchgl 155 ret void 156 ; WITH-CMOV: ret 157 ; NOCMOV: ret 158 } 159 160 define void @atomic_fetch_umin32(i32 %x) nounwind { 161 ; WITH-CMOV-LABEL: atomic_fetch_umin32: 162 ; NOCMOV-LABEL: atomic_fetch_umin32: 163 164 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire 165 ; WITH-CMOV: subl 166 ; WITH-CMOV: cmov 167 ; WITH-CMOV: lock 168 ; WITH-CMOV: cmpxchgl 169 170 ; NOCMOV: subl 171 ; NOCMOV: jb 172 ; NOCMOV: lock 173 ; NOCMOV: cmpxchgl 174 ret void 175 ; WITH-CMOV: ret 176 ; NOCMOV: ret 177 } 178 179 define void @atomic_fetch_cmpxchg32() nounwind { 180 ; WITH-CMOV-LABEL: atomic_fetch_cmpxchg32: 181 182 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire 183 ; WITH-CMOV: lock 184 ; WITH-CMOV: cmpxchgl 185 ret void 186 ; WITH-CMOV: ret 187 } 188 189 define void @atomic_fetch_store32(i32 %x) nounwind { 190 ; WITH-CMOV-LABEL: atomic_fetch_store32: 191 192 store atomic i32 %x, i32* @sc32 release, align 4 193 ; WITH-CMOV-NOT: lock 194 ; WITH-CMOV: movl 195 ret void 196 ; WITH-CMOV: ret 197 } 198 199 define void @atomic_fetch_swap32(i32 %x) nounwind { 200 ; WITH-CMOV-LABEL: atomic_fetch_swap32: 201 202 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire 203 ; WITH-CMOV-NOT: lock 204 ; WITH-CMOV: xchgl 205 ret void 206 ; WITH-CMOV: ret 207 } 208