1 ; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs -show-mc-encoding | FileCheck %s --check-prefix X64 2 ; RUN: llc < %s -O0 -mtriple=i386-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 3 4 @sc16 = external global i16 5 6 define void @atomic_fetch_add16() nounwind { 7 ; X64-LABEL: atomic_fetch_add16 8 ; X32-LABEL: atomic_fetch_add16 9 entry: 10 ; 32-bit 11 %t1 = atomicrmw add i16* @sc16, i16 1 acquire 12 ; X64: lock 13 ; X64: incw 14 ; X32: lock 15 ; X32: incw 16 %t2 = atomicrmw add i16* @sc16, i16 3 acquire 17 ; X64: lock 18 ; X64: addw $3, {{.*}} # encoding: [0x66,0xf0 19 ; X32: lock 20 ; X32: addw $3 21 %t3 = atomicrmw add i16* @sc16, i16 5 acquire 22 ; X64: lock 23 ; X64: xaddw {{.*}} # encoding: [0x66,0xf0 24 ; X32: lock 25 ; X32: xaddw 26 %t4 = atomicrmw add i16* @sc16, i16 %t3 acquire 27 ; X64: lock 28 ; X64: addw {{.*}} # encoding: [0x66,0xf0 29 ; X32: lock 30 ; X32: addw 31 ret void 32 ; X64: ret 33 ; X32: ret 34 } 35 36 define void @atomic_fetch_sub16() nounwind { 37 ; X64-LABEL: atomic_fetch_sub16 38 ; X32-LABEL: atomic_fetch_sub16 39 %t1 = atomicrmw sub i16* @sc16, i16 1 acquire 40 ; X64: lock 41 ; X64: decw 42 ; X32: lock 43 ; X32: decw 44 %t2 = atomicrmw sub i16* @sc16, i16 3 acquire 45 ; X64: lock 46 ; X64: subw $3, {{.*}} # encoding: [0x66,0xf0 47 ; X32: lock 48 ; X32: subw $3 49 %t3 = atomicrmw sub i16* @sc16, i16 5 acquire 50 ; X64: lock 51 ; X64: xaddw {{.*}} # encoding: [0x66,0xf0 52 ; X32: lock 53 ; X32: xaddw 54 %t4 = atomicrmw sub i16* @sc16, i16 %t3 acquire 55 ; X64: lock 56 ; X64: subw {{.*}} # encoding: [0x66,0xf0 57 ; X32: lock 58 ; X32: subw 59 ret void 60 ; X64: ret 61 ; X32: ret 62 } 63 64 define void @atomic_fetch_and16() nounwind { 65 ; X64-LABEL: atomic_fetch_and16 66 ; X32-LABEL: atomic_fetch_and16 67 %t1 = atomicrmw and i16* @sc16, i16 3 acquire 68 ; X64: lock 69 ; X64: andw $3, {{.*}} # encoding: [0x66,0xf0 70 ; X32: lock 71 ; X32: andw $3 72 %t2 = atomicrmw and i16* @sc16, i16 5 acquire 73 ; X64: andl 74 ; X64: lock 75 ; X64: cmpxchgw 76 ; X32: andl 77 ; X32: lock 78 ; X32: cmpxchgw 79 %t3 = atomicrmw and i16* @sc16, i16 %t2 acquire 80 ; X64: lock 81 ; X64: andw {{.*}} # encoding: [0x66,0xf0 82 ; X32: lock 83 ; X32: andw 84 ret void 85 ; X64: ret 86 ; X32: ret 87 } 88 89 define void @atomic_fetch_or16() nounwind { 90 ; X64-LABEL: atomic_fetch_or16 91 ; X32-LABEL: atomic_fetch_or16 92 %t1 = atomicrmw or i16* @sc16, i16 3 acquire 93 ; X64: lock 94 ; X64: orw $3, {{.*}} # encoding: [0x66,0xf0 95 ; X32: lock 96 ; X32: orw $3 97 %t2 = atomicrmw or i16* @sc16, i16 5 acquire 98 ; X64: orl 99 ; X64: lock 100 ; X64: cmpxchgw 101 ; X32: orl 102 ; X32: lock 103 ; X32: cmpxchgw 104 %t3 = atomicrmw or i16* @sc16, i16 %t2 acquire 105 ; X64: lock 106 ; X64: orw {{.*}} # encoding: [0x66,0xf0 107 ; X32: lock 108 ; X32: orw 109 ret void 110 ; X64: ret 111 ; X32: ret 112 } 113 114 define void @atomic_fetch_xor16() nounwind { 115 ; X64-LABEL: atomic_fetch_xor16 116 ; X32-LABEL: atomic_fetch_xor16 117 %t1 = atomicrmw xor i16* @sc16, i16 3 acquire 118 ; X64: lock 119 ; X64: xorw $3, {{.*}} # encoding: [0x66,0xf0 120 ; X32: lock 121 ; X32: xorw $3 122 %t2 = atomicrmw xor i16* @sc16, i16 5 acquire 123 ; X64: xorl 124 ; X64: lock 125 ; X64: cmpxchgw 126 ; X32: xorl 127 ; X32: lock 128 ; X32: cmpxchgw 129 %t3 = atomicrmw xor i16* @sc16, i16 %t2 acquire 130 ; X64: lock 131 ; X64: xorw {{.*}} # encoding: [0x66,0xf0 132 ; X32: lock 133 ; X32: xorw 134 ret void 135 ; X64: ret 136 ; X32: ret 137 } 138 139 define void @atomic_fetch_nand16(i16 %x) nounwind { 140 ; X64-LABEL: atomic_fetch_nand16 141 ; X32-LABEL: atomic_fetch_nand16 142 %t1 = atomicrmw nand i16* @sc16, i16 %x acquire 143 ; X64: andl 144 ; X64: notl 145 ; X64: lock 146 ; X64: cmpxchgw 147 ; X32: andl 148 ; X32: notl 149 ; X32: lock 150 ; X32: cmpxchgw 151 ret void 152 ; X64: ret 153 ; X32: ret 154 } 155 156 define void @atomic_fetch_max16(i16 %x) nounwind { 157 ; X64-LABEL: atomic_fetch_max16 158 ; X32-LABEL: atomic_fetch_max16 159 %t1 = atomicrmw max i16* @sc16, i16 %x acquire 160 ; X64: movw 161 ; X64: movw 162 ; X64: subw 163 ; X64: cmov 164 ; X64: lock 165 ; X64: cmpxchgw 166 167 ; X32: movw 168 ; X32: movw 169 ; X32: subw 170 ; X32: cmov 171 ; X32: lock 172 ; X32: cmpxchgw 173 ret void 174 ; X64: ret 175 ; X32: ret 176 } 177 178 define void @atomic_fetch_min16(i16 %x) nounwind { 179 ; X64-LABEL: atomic_fetch_min16 180 ; X32-LABEL: atomic_fetch_min16 181 %t1 = atomicrmw min i16* @sc16, i16 %x acquire 182 ; X64: movw 183 ; X64: movw 184 ; X64: subw 185 ; X64: cmov 186 ; X64: lock 187 ; X64: cmpxchgw 188 189 ; X32: movw 190 ; X32: movw 191 ; X32: subw 192 ; X32: cmov 193 ; X32: lock 194 ; X32: cmpxchgw 195 ret void 196 ; X64: ret 197 ; X32: ret 198 } 199 200 define void @atomic_fetch_umax16(i16 %x) nounwind { 201 ; X64-LABEL: atomic_fetch_umax16 202 ; X32-LABEL: atomic_fetch_umax16 203 %t1 = atomicrmw umax i16* @sc16, i16 %x acquire 204 ; X64: movw 205 ; X64: movw 206 ; X64: subw 207 ; X64: cmov 208 ; X64: lock 209 ; X64: cmpxchgw 210 211 ; X32: movw 212 ; X32: movw 213 ; X32: subw 214 ; X32: cmov 215 ; X32: lock 216 ; X32: cmpxchgw 217 ret void 218 ; X64: ret 219 ; X32: ret 220 } 221 222 define void @atomic_fetch_umin16(i16 %x) nounwind { 223 ; X64-LABEL: atomic_fetch_umin16 224 ; X32-LABEL: atomic_fetch_umin16 225 %t1 = atomicrmw umin i16* @sc16, i16 %x acquire 226 ; X64: movw 227 ; X64: movw 228 ; X64: subw 229 ; X64: cmov 230 ; X64: lock 231 ; X64: cmpxchgw 232 233 ; X32: movw 234 ; X32: movw 235 ; X32: subw 236 ; X32: cmov 237 ; X32: lock 238 ; X32: cmpxchgw 239 ret void 240 ; X64: ret 241 ; X32: ret 242 } 243 244 define void @atomic_fetch_cmpxchg16() nounwind { 245 %t1 = cmpxchg i16* @sc16, i16 0, i16 1 acquire acquire 246 ; X64: lock 247 ; X64: cmpxchgw 248 ; X32: lock 249 ; X32: cmpxchgw 250 ret void 251 ; X64: ret 252 ; X32: ret 253 } 254 255 define void @atomic_fetch_store16(i16 %x) nounwind { 256 store atomic i16 %x, i16* @sc16 release, align 4 257 ; X64-NOT: lock 258 ; X64: movw 259 ; X32-NOT: lock 260 ; X32: movw 261 ret void 262 ; X64: ret 263 ; X32: ret 264 } 265 266 define void @atomic_fetch_swap16(i16 %x) nounwind { 267 %t1 = atomicrmw xchg i16* @sc16, i16 %x acquire 268 ; X64-NOT: lock 269 ; X64: xchgw 270 ; X32-NOT: lock 271 ; X32: xchgw 272 ret void 273 ; X64: ret 274 ; X32: ret 275 } 276