| ; RUN: llc < %s -O0 -mtriple=x86_64-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 | |
| ; RUN: llc < %s -O0 -mtriple=i686-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 | |
| @sc8 = external global i8 | |
| define void @atomic_fetch_add8() nounwind { | |
| ; X64-LABEL: atomic_fetch_add8: | |
| ; X32-LABEL: atomic_fetch_add8: | |
| entry: | |
| ; 32-bit | |
| %t1 = atomicrmw add i8* @sc8, i8 1 acquire | |
| ; X64: lock | |
| ; X64: incb | |
| ; X32: lock | |
| ; X32: incb | |
| %t2 = atomicrmw add i8* @sc8, i8 3 acquire | |
| ; X64: lock | |
| ; X64: addb $3 | |
| ; X32: lock | |
| ; X32: addb $3 | |
| %t3 = atomicrmw add i8* @sc8, i8 5 acquire | |
| ; X64: lock | |
| ; X64: xaddb | |
| ; X32: lock | |
| ; X32: xaddb | |
| %t4 = atomicrmw add i8* @sc8, i8 %t3 acquire | |
| ; X64: lock | |
| ; X64: addb | |
| ; X32: lock | |
| ; X32: addb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_sub8() nounwind { | |
| ; X64-LABEL: atomic_fetch_sub8: | |
| ; X32-LABEL: atomic_fetch_sub8: | |
| %t1 = atomicrmw sub i8* @sc8, i8 1 acquire | |
| ; X64: lock | |
| ; X64: decb | |
| ; X32: lock | |
| ; X32: decb | |
| %t2 = atomicrmw sub i8* @sc8, i8 3 acquire | |
| ; X64: lock | |
| ; X64: subb $3 | |
| ; X32: lock | |
| ; X32: subb $3 | |
| %t3 = atomicrmw sub i8* @sc8, i8 5 acquire | |
| ; X64: lock | |
| ; X64: xaddb | |
| ; X32: lock | |
| ; X32: xaddb | |
| %t4 = atomicrmw sub i8* @sc8, i8 %t3 acquire | |
| ; X64: lock | |
| ; X64: subb | |
| ; X32: lock | |
| ; X32: subb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_and8() nounwind { | |
| ; X64-LABEL: atomic_fetch_and8: | |
| ; X32-LABEL: atomic_fetch_and8: | |
| %t1 = atomicrmw and i8* @sc8, i8 3 acquire | |
| ; X64: lock | |
| ; X64: andb $3 | |
| ; X32: lock | |
| ; X32: andb $3 | |
| %t2 = atomicrmw and i8* @sc8, i8 5 acquire | |
| ; X64: andb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: andb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| %t3 = atomicrmw and i8* @sc8, i8 %t2 acquire | |
| ; X64: lock | |
| ; X64: andb | |
| ; X32: lock | |
| ; X32: andb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_or8() nounwind { | |
| ; X64-LABEL: atomic_fetch_or8: | |
| ; X32-LABEL: atomic_fetch_or8: | |
| %t1 = atomicrmw or i8* @sc8, i8 3 acquire | |
| ; X64: lock | |
| ; X64: orb $3 | |
| ; X32: lock | |
| ; X32: orb $3 | |
| %t2 = atomicrmw or i8* @sc8, i8 5 acquire | |
| ; X64: orb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: orb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| %t3 = atomicrmw or i8* @sc8, i8 %t2 acquire | |
| ; X64: lock | |
| ; X64: orb | |
| ; X32: lock | |
| ; X32: orb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_xor8() nounwind { | |
| ; X64-LABEL: atomic_fetch_xor8: | |
| ; X32-LABEL: atomic_fetch_xor8: | |
| %t1 = atomicrmw xor i8* @sc8, i8 3 acquire | |
| ; X64: lock | |
| ; X64: xorb $3 | |
| ; X32: lock | |
| ; X32: xorb $3 | |
| %t2 = atomicrmw xor i8* @sc8, i8 5 acquire | |
| ; X64: xorb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: xorb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| %t3 = atomicrmw xor i8* @sc8, i8 %t2 acquire | |
| ; X64: lock | |
| ; X64: xorb | |
| ; X32: lock | |
| ; X32: xorb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_nand8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_nand8: | |
| ; X32-LABEL: atomic_fetch_nand8: | |
| %t1 = atomicrmw nand i8* @sc8, i8 %x acquire | |
| ; X64: andb | |
| ; X64: notb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: andb | |
| ; X32: notb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_max8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_max8: | |
| ; X32-LABEL: atomic_fetch_max8: | |
| %t1 = atomicrmw max i8* @sc8, i8 %x acquire | |
| ; X64: movb | |
| ; X64: movb | |
| ; X64: subb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: movb | |
| ; X32: movb | |
| ; X32: subb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_min8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_min8: | |
| ; X32-LABEL: atomic_fetch_min8: | |
| %t1 = atomicrmw min i8* @sc8, i8 %x acquire | |
| ; X64: movb | |
| ; X64: movb | |
| ; X64: subb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: movb | |
| ; X32: movb | |
| ; X32: subb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_umax8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_umax8: | |
| ; X32-LABEL: atomic_fetch_umax8: | |
| %t1 = atomicrmw umax i8* @sc8, i8 %x acquire | |
| ; X64: movb | |
| ; X64: movb | |
| ; X64: subb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: movb | |
| ; X32: movb | |
| ; X32: subb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_umin8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_umin8: | |
| ; X32-LABEL: atomic_fetch_umin8: | |
| %t1 = atomicrmw umin i8* @sc8, i8 %x acquire | |
| ; X64: movb | |
| ; X64: movb | |
| ; X64: subb | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: movb | |
| ; X32: movb | |
| ; X32: subb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_cmpxchg8() nounwind { | |
| ; X64-LABEL: atomic_fetch_cmpxchg8: | |
| ; X32-LABEL: atomic_fetch_cmpxchg8: | |
| %t1 = cmpxchg i8* @sc8, i8 0, i8 1 acquire acquire | |
| ; X64: lock | |
| ; X64: cmpxchgb | |
| ; X32: lock | |
| ; X32: cmpxchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_store8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_store8: | |
| ; X32-LABEL: atomic_fetch_store8: | |
| store atomic i8 %x, i8* @sc8 release, align 4 | |
| ; X64-NOT: lock | |
| ; X64: movb | |
| ; X32-NOT: lock | |
| ; X32: movb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } | |
| define void @atomic_fetch_swap8(i8 %x) nounwind { | |
| ; X64-LABEL: atomic_fetch_swap8: | |
| ; X32-LABEL: atomic_fetch_swap8: | |
| %t1 = atomicrmw xchg i8* @sc8, i8 %x acquire | |
| ; X64-NOT: lock | |
| ; X64: xchgb | |
| ; X32-NOT: lock | |
| ; X32: xchgb | |
| ret void | |
| ; X64: ret | |
| ; X32: ret | |
| } |