; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 ; RUN: llc < %s -O0 -march=x86 -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: movsbl ; X64: movsbl ; X64: subl ; X64: lock ; X64: cmpxchgb ; X32: movsbl ; X32: movsbl ; X32: subl ; 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: movsbl ; X64: movsbl ; X64: subl ; X64: lock ; X64: cmpxchgb ; X32: movsbl ; X32: movsbl ; X32: subl ; 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: movzbl ; X64: movzbl ; X64: subl ; X64: lock ; X64: cmpxchgb ; X32: movzbl ; X32: movzbl ; X32: subl ; 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: movzbl ; X64: movzbl ; X64: subl ; X64: lock ; X64: cmpxchgb ; X32: movzbl ; X32: movzbl ; X32: subl ; 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 }