274 lines · plain
1; RUN: llc < %s -O0 -mtriple=x86_64-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X642; RUN: llc < %s -O0 -mtriple=i686-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X323 4@sc8 = external dso_local global i85 6define void @atomic_fetch_add8() nounwind {7; X64-LABEL: atomic_fetch_add8:8; X32-LABEL: atomic_fetch_add8:9entry:10; 32-bit11 %t1 = atomicrmw add ptr @sc8, i8 1 acquire12; X64: lock13; X64: incb14; X32: lock15; X32: incb16 %t2 = atomicrmw add ptr @sc8, i8 3 acquire17; X64: lock18; X64: addb $319; X32: lock20; X32: addb $321 %t3 = atomicrmw add ptr @sc8, i8 5 acquire22; X64: lock23; X64: xaddb24; X32: lock25; X32: xaddb26 %t4 = atomicrmw add ptr @sc8, i8 %t3 acquire27; X64: lock28; X64: addb29; X32: lock30; X32: addb31 ret void32; X64: ret33; X32: ret34}35 36define void @atomic_fetch_sub8() nounwind {37; X64-LABEL: atomic_fetch_sub8:38; X32-LABEL: atomic_fetch_sub8:39 %t1 = atomicrmw sub ptr @sc8, i8 1 acquire40; X64: lock41; X64: decb42; X32: lock43; X32: decb44 %t2 = atomicrmw sub ptr @sc8, i8 3 acquire45; X64: lock46; X64: subb $347; X32: lock48; X32: subb $349 %t3 = atomicrmw sub ptr @sc8, i8 5 acquire50; X64: lock51; X64: xaddb52; X32: lock53; X32: xaddb54 %t4 = atomicrmw sub ptr @sc8, i8 %t3 acquire55; X64: lock56; X64: subb57; X32: lock58; X32: subb59 ret void60; X64: ret61; X32: ret62}63 64define void @atomic_fetch_and8() nounwind {65; X64-LABEL: atomic_fetch_and8:66; X32-LABEL: atomic_fetch_and8:67 %t1 = atomicrmw and ptr @sc8, i8 3 acquire68; X64: lock69; X64: andb $370; X32: lock71; X32: andb $372 %t2 = atomicrmw and ptr @sc8, i8 5 acquire73; X64: andb74; X64: lock75; X64: cmpxchgb76; X32: andb77; X32: lock78; X32: cmpxchgb79 %t3 = atomicrmw and ptr @sc8, i8 %t2 acquire80; X64: lock81; X64: andb82; X32: lock83; X32: andb84 ret void85; X64: ret86; X32: ret87}88 89define void @atomic_fetch_or8() nounwind {90; X64-LABEL: atomic_fetch_or8:91; X32-LABEL: atomic_fetch_or8:92 %t1 = atomicrmw or ptr @sc8, i8 3 acquire93; X64: lock94; X64: orb $395; X32: lock96; X32: orb $397 %t2 = atomicrmw or ptr @sc8, i8 5 acquire98; X64: orb99; X64: lock100; X64: cmpxchgb101; X32: orb102; X32: lock103; X32: cmpxchgb104 %t3 = atomicrmw or ptr @sc8, i8 %t2 acquire105; X64: lock106; X64: orb107; X32: lock108; X32: orb109 ret void110; X64: ret111; X32: ret112}113 114define void @atomic_fetch_xor8() nounwind {115; X64-LABEL: atomic_fetch_xor8:116; X32-LABEL: atomic_fetch_xor8:117 %t1 = atomicrmw xor ptr @sc8, i8 3 acquire118; X64: lock119; X64: xorb $3120; X32: lock121; X32: xorb $3122 %t2 = atomicrmw xor ptr @sc8, i8 5 acquire123; X64: xorb124; X64: lock125; X64: cmpxchgb126; X32: xorb127; X32: lock128; X32: cmpxchgb129 %t3 = atomicrmw xor ptr @sc8, i8 %t2 acquire130; X64: lock131; X64: xorb132; X32: lock133; X32: xorb134 ret void135; X64: ret136; X32: ret137}138 139define void @atomic_fetch_nand8(i8 %x) nounwind {140; X64-LABEL: atomic_fetch_nand8:141; X32-LABEL: atomic_fetch_nand8:142 %t1 = atomicrmw nand ptr @sc8, i8 %x acquire143; X64: andb144; X64: notb145; X64: lock146; X64: cmpxchgb147; X32: andb148; X32: notb149; X32: lock150; X32: cmpxchgb151 ret void152; X64: ret153; X32: ret154}155 156define void @atomic_fetch_max8(i8 %x) nounwind {157; X64-LABEL: atomic_fetch_max8:158; X32-LABEL: atomic_fetch_max8:159 %t1 = atomicrmw max ptr @sc8, i8 %x acquire160; X64: movb161; X64: movb162; X64: subb163; X64: lock164; X64: cmpxchgb165 166; X32: movb167; X32: movb168; X32: subb169; X32: lock170; X32: cmpxchgb171 ret void172; X64: ret173; X32: ret174}175 176define void @atomic_fetch_min8(i8 %x) nounwind {177; X64-LABEL: atomic_fetch_min8:178; X32-LABEL: atomic_fetch_min8:179 %t1 = atomicrmw min ptr @sc8, i8 %x acquire180; X64: movb181; X64: movb182; X64: subb183; X64: lock184; X64: cmpxchgb185 186; X32: movb187; X32: movb188; X32: subb189; X32: lock190; X32: cmpxchgb191 ret void192; X64: ret193; X32: ret194}195 196define void @atomic_fetch_umax8(i8 %x) nounwind {197; X64-LABEL: atomic_fetch_umax8:198; X32-LABEL: atomic_fetch_umax8:199 %t1 = atomicrmw umax ptr @sc8, i8 %x acquire200; X64: movb201; X64: movb202; X64: subb203; X64: lock204; X64: cmpxchgb205 206; X32: movb207; X32: movb208; X32: subb209; X32: lock210; X32: cmpxchgb211 ret void212; X64: ret213; X32: ret214}215 216define void @atomic_fetch_umin8(i8 %x) nounwind {217; X64-LABEL: atomic_fetch_umin8:218; X32-LABEL: atomic_fetch_umin8:219 %t1 = atomicrmw umin ptr @sc8, i8 %x acquire220; X64: movb221; X64: movb222; X64: subb223; X64: lock224; X64: cmpxchgb225 226; X32: movb227; X32: movb228; X32: subb229; X32: lock230; X32: cmpxchgb231 ret void232; X64: ret233; X32: ret234}235 236define void @atomic_fetch_cmpxchg8() nounwind {237; X64-LABEL: atomic_fetch_cmpxchg8:238; X32-LABEL: atomic_fetch_cmpxchg8:239 %t1 = cmpxchg ptr @sc8, i8 0, i8 1 acquire acquire240; X64: lock241; X64: cmpxchgb242; X32: lock243; X32: cmpxchgb244 ret void245; X64: ret246; X32: ret247}248 249define void @atomic_fetch_store8(i8 %x) nounwind {250; X64-LABEL: atomic_fetch_store8:251; X32-LABEL: atomic_fetch_store8:252 store atomic i8 %x, ptr @sc8 release, align 4253; X64-NOT: lock254; X64: movb255; X32-NOT: lock256; X32: movb257 ret void258; X64: ret259; X32: ret260}261 262define void @atomic_fetch_swap8(i8 %x) nounwind {263; X64-LABEL: atomic_fetch_swap8:264; X32-LABEL: atomic_fetch_swap8:265 %t1 = atomicrmw xchg ptr @sc8, i8 %x acquire266; X64-NOT: lock267; X64: xchgb268; X32-NOT: lock269; X32: xchgb270 ret void271; X64: ret272; X32: ret273}274