288 lines · plain
1; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs -show-mc-encoding | FileCheck %s --check-prefix X642; RUN: llc < %s -O0 -mtriple=i386-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X323 4@sc16 = external dso_local global i165@fsc16 = external dso_local global half6 7define void @atomic_fetch_add16() nounwind {8; X64-LABEL: atomic_fetch_add169; X32-LABEL: atomic_fetch_add1610entry:11; 32-bit12 %t1 = atomicrmw add ptr @sc16, i16 1 acquire13; X64: lock14; X64: incw15; X32: lock16; X32: incw17 %t2 = atomicrmw add ptr @sc16, i16 3 acquire18; X64: lock19; X64: addw $3, {{.*}} # encoding: [0x66,0xf020; X32: lock21; X32: addw $322 %t3 = atomicrmw add ptr @sc16, i16 5 acquire23; X64: lock24; X64: xaddw {{.*}} # encoding: [0x66,0xf025; X32: lock26; X32: xaddw27 %t4 = atomicrmw add ptr @sc16, i16 %t3 acquire28; X64: lock29; X64: addw {{.*}} # encoding: [0x66,0xf030; X32: lock31; X32: addw32 ret void33; X64: ret34; X32: ret35}36 37define void @atomic_fetch_sub16() nounwind {38; X64-LABEL: atomic_fetch_sub1639; X32-LABEL: atomic_fetch_sub1640 %t1 = atomicrmw sub ptr @sc16, i16 1 acquire41; X64: lock42; X64: decw43; X32: lock44; X32: decw45 %t2 = atomicrmw sub ptr @sc16, i16 3 acquire46; X64: lock47; X64: subw $3, {{.*}} # encoding: [0x66,0xf048; X32: lock49; X32: subw $350 %t3 = atomicrmw sub ptr @sc16, i16 5 acquire51; X64: lock52; X64: xaddw {{.*}} # encoding: [0x66,0xf053; X32: lock54; X32: xaddw55 %t4 = atomicrmw sub ptr @sc16, i16 %t3 acquire56; X64: lock57; X64: subw {{.*}} # encoding: [0x66,0xf058; X32: lock59; X32: subw60 ret void61; X64: ret62; X32: ret63}64 65define void @atomic_fetch_and16() nounwind {66; X64-LABEL: atomic_fetch_and1667; X32-LABEL: atomic_fetch_and1668 %t1 = atomicrmw and ptr @sc16, i16 3 acquire69; X64: lock70; X64: andw $3, {{.*}} # encoding: [0x66,0xf071; X32: lock72; X32: andw $373 %t2 = atomicrmw and ptr @sc16, i16 5 acquire74; X64: andl75; X64: lock76; X64: cmpxchgw77; X32: andl78; X32: lock79; X32: cmpxchgw80 %t3 = atomicrmw and ptr @sc16, i16 %t2 acquire81; X64: lock82; X64: andw {{.*}} # encoding: [0x66,0xf083; X32: lock84; X32: andw85 ret void86; X64: ret87; X32: ret88}89 90define void @atomic_fetch_or16() nounwind {91; X64-LABEL: atomic_fetch_or1692; X32-LABEL: atomic_fetch_or1693 %t1 = atomicrmw or ptr @sc16, i16 3 acquire94; X64: lock95; X64: orw $3, {{.*}} # encoding: [0x66,0xf096; X32: lock97; X32: orw $398 %t2 = atomicrmw or ptr @sc16, i16 5 acquire99; X64: orl100; X64: lock101; X64: cmpxchgw102; X32: orl103; X32: lock104; X32: cmpxchgw105 %t3 = atomicrmw or ptr @sc16, i16 %t2 acquire106; X64: lock107; X64: orw {{.*}} # encoding: [0x66,0xf0108; X32: lock109; X32: orw110 ret void111; X64: ret112; X32: ret113}114 115define void @atomic_fetch_xor16() nounwind {116; X64-LABEL: atomic_fetch_xor16117; X32-LABEL: atomic_fetch_xor16118 %t1 = atomicrmw xor ptr @sc16, i16 3 acquire119; X64: lock120; X64: xorw $3, {{.*}} # encoding: [0x66,0xf0121; X32: lock122; X32: xorw $3123 %t2 = atomicrmw xor ptr @sc16, i16 5 acquire124; X64: xorl125; X64: lock126; X64: cmpxchgw127; X32: xorl128; X32: lock129; X32: cmpxchgw130 %t3 = atomicrmw xor ptr @sc16, i16 %t2 acquire131; X64: lock132; X64: xorw {{.*}} # encoding: [0x66,0xf0133; X32: lock134; X32: xorw135 ret void136; X64: ret137; X32: ret138}139 140define void @atomic_fetch_nand16(i16 %x) nounwind {141; X64-LABEL: atomic_fetch_nand16142; X32-LABEL: atomic_fetch_nand16143 %t1 = atomicrmw nand ptr @sc16, i16 %x acquire144; X64: andl145; X64: notl146; X64: lock147; X64: cmpxchgw148; X32: andl149; X32: notl150; X32: lock151; X32: cmpxchgw152 ret void153; X64: ret154; X32: ret155}156 157define void @atomic_fetch_max16(i16 %x) nounwind {158; X64-LABEL: atomic_fetch_max16159; X32-LABEL: atomic_fetch_max16160 %t1 = atomicrmw max ptr @sc16, i16 %x acquire161; X64: movw162; X64: movw163; X64: subw164; X64: cmov165; X64: lock166; X64: cmpxchgw167 168; X32: movw169; X32: movw170; X32: subw171; X32: cmov172; X32: lock173; X32: cmpxchgw174 ret void175; X64: ret176; X32: ret177}178 179define void @atomic_fetch_min16(i16 %x) nounwind {180; X64-LABEL: atomic_fetch_min16181; X32-LABEL: atomic_fetch_min16182 %t1 = atomicrmw min ptr @sc16, i16 %x acquire183; X64: movw184; X64: movw185; X64: subw186; X64: cmov187; X64: lock188; X64: cmpxchgw189 190; X32: movw191; X32: movw192; X32: subw193; X32: cmov194; X32: lock195; X32: cmpxchgw196 ret void197; X64: ret198; X32: ret199}200 201define void @atomic_fetch_umax16(i16 %x) nounwind {202; X64-LABEL: atomic_fetch_umax16203; X32-LABEL: atomic_fetch_umax16204 %t1 = atomicrmw umax ptr @sc16, i16 %x acquire205; X64: movw206; X64: movw207; X64: subw208; X64: cmov209; X64: lock210; X64: cmpxchgw211 212; X32: movw213; X32: movw214; X32: subw215; X32: cmov216; X32: lock217; X32: cmpxchgw218 ret void219; X64: ret220; X32: ret221}222 223define void @atomic_fetch_umin16(i16 %x) nounwind {224; X64-LABEL: atomic_fetch_umin16225; X32-LABEL: atomic_fetch_umin16226 %t1 = atomicrmw umin ptr @sc16, i16 %x acquire227; X64: movw228; X64: movw229; X64: subw230; X64: cmov231; X64: lock232; X64: cmpxchgw233 234; X32: movw235; X32: movw236; X32: subw237; X32: cmov238; X32: lock239; X32: cmpxchgw240 ret void241; X64: ret242; X32: ret243}244 245define void @atomic_fetch_cmpxchg16() nounwind {246 %t1 = cmpxchg ptr @sc16, i16 0, i16 1 acquire acquire247; X64: lock248; X64: cmpxchgw249; X32: lock250; X32: cmpxchgw251 ret void252; X64: ret253; X32: ret254}255 256define void @atomic_fetch_store16(i16 %x) nounwind {257 store atomic i16 %x, ptr @sc16 release, align 4258; X64-NOT: lock259; X64: movw260; X32-NOT: lock261; X32: movw262 ret void263; X64: ret264; X32: ret265}266 267define void @atomic_fetch_swap16(i16 %x) nounwind {268 %t1 = atomicrmw xchg ptr @sc16, i16 %x acquire269; X64-NOT: lock270; X64: xchgw271; X32-NOT: lock272; X32: xchgw273 ret void274; X64: ret275; X32: ret276}277 278define void @atomic_fetch_swapf16(half %x) nounwind {279 %t1 = atomicrmw xchg ptr @fsc16, half %x acquire280; X64-NOT: lock281; X64: xchgw282; X32-NOT: lock283; X32: xchgw284 ret void285; X64: ret286; X32: ret287}288