696 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -O0 -mtriple=i686-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X323 4@sc64 = external dso_local global i645 6define void @atomic_fetch_add64() nounwind {7; X32-LABEL: atomic_fetch_add64:8; X32: # %bb.0: # %entry9; X32-NEXT: pushl %ebx10; X32-NEXT: pushl %esi11; X32-NEXT: subl $40, %esp12; X32-NEXT: movl sc64+4, %edx13; X32-NEXT: movl sc64, %eax14; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill15; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill16; X32-NEXT: jmp .LBB0_117; X32-NEXT: .LBB0_1: # %atomicrmw.start1418; X32-NEXT: # =>This Inner Loop Header: Depth=119; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload20; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload21; X32-NEXT: movl %eax, %ebx22; X32-NEXT: addl $1, %ebx23; X32-NEXT: movl %edx, %ecx24; X32-NEXT: adcl $0, %ecx25; X32-NEXT: lock cmpxchg8b sc6426; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill27; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill28; X32-NEXT: jne .LBB0_129; X32-NEXT: jmp .LBB0_230; X32-NEXT: .LBB0_2: # %atomicrmw.end1331; X32-NEXT: movl sc64+4, %edx32; X32-NEXT: movl sc64, %eax33; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill34; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill35; X32-NEXT: jmp .LBB0_336; X32-NEXT: .LBB0_3: # %atomicrmw.start837; X32-NEXT: # =>This Inner Loop Header: Depth=138; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload39; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload40; X32-NEXT: movl %eax, %ebx41; X32-NEXT: addl $3, %ebx42; X32-NEXT: movl %edx, %ecx43; X32-NEXT: adcl $0, %ecx44; X32-NEXT: lock cmpxchg8b sc6445; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill46; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill47; X32-NEXT: jne .LBB0_348; X32-NEXT: jmp .LBB0_449; X32-NEXT: .LBB0_4: # %atomicrmw.end750; X32-NEXT: movl sc64+4, %edx51; X32-NEXT: movl sc64, %eax52; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill53; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill54; X32-NEXT: jmp .LBB0_555; X32-NEXT: .LBB0_5: # %atomicrmw.start256; X32-NEXT: # =>This Inner Loop Header: Depth=157; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload58; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload59; X32-NEXT: movl %eax, %ebx60; X32-NEXT: addl $5, %ebx61; X32-NEXT: movl %edx, %ecx62; X32-NEXT: adcl $0, %ecx63; X32-NEXT: lock cmpxchg8b sc6464; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill65; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill66; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill67; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill68; X32-NEXT: jne .LBB0_569; X32-NEXT: jmp .LBB0_670; X32-NEXT: .LBB0_6: # %atomicrmw.end171; X32-NEXT: movl sc64+4, %edx72; X32-NEXT: movl sc64, %eax73; X32-NEXT: movl %eax, (%esp) # 4-byte Spill74; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill75; X32-NEXT: jmp .LBB0_776; X32-NEXT: .LBB0_7: # %atomicrmw.start77; X32-NEXT: # =>This Inner Loop Header: Depth=178; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload79; X32-NEXT: movl (%esp), %eax # 4-byte Reload80; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload81; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload82; X32-NEXT: movl %eax, %ebx83; X32-NEXT: addl %ecx, %ebx84; X32-NEXT: movl %edx, %ecx85; X32-NEXT: adcl %esi, %ecx86; X32-NEXT: lock cmpxchg8b sc6487; X32-NEXT: movl %eax, (%esp) # 4-byte Spill88; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill89; X32-NEXT: jne .LBB0_790; X32-NEXT: jmp .LBB0_891; X32-NEXT: .LBB0_8: # %atomicrmw.end92; X32-NEXT: addl $40, %esp93; X32-NEXT: popl %esi94; X32-NEXT: popl %ebx95; X32-NEXT: retl96entry:97 %t1 = atomicrmw add ptr @sc64, i64 1 acquire98 %t2 = atomicrmw add ptr @sc64, i64 3 acquire99 %t3 = atomicrmw add ptr @sc64, i64 5 acquire100 %t4 = atomicrmw add ptr @sc64, i64 %t3 acquire101 ret void102}103 104define void @atomic_fetch_sub64() nounwind {105; X32-LABEL: atomic_fetch_sub64:106; X32: # %bb.0:107; X32-NEXT: pushl %ebx108; X32-NEXT: pushl %esi109; X32-NEXT: subl $40, %esp110; X32-NEXT: movl sc64+4, %edx111; X32-NEXT: movl sc64, %eax112; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill113; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill114; X32-NEXT: jmp .LBB1_1115; X32-NEXT: .LBB1_1: # %atomicrmw.start14116; X32-NEXT: # =>This Inner Loop Header: Depth=1117; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload118; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload119; X32-NEXT: movl %eax, %ebx120; X32-NEXT: addl $-1, %ebx121; X32-NEXT: movl %edx, %ecx122; X32-NEXT: adcl $-1, %ecx123; X32-NEXT: lock cmpxchg8b sc64124; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill125; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill126; X32-NEXT: jne .LBB1_1127; X32-NEXT: jmp .LBB1_2128; X32-NEXT: .LBB1_2: # %atomicrmw.end13129; X32-NEXT: movl sc64+4, %edx130; X32-NEXT: movl sc64, %eax131; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill132; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill133; X32-NEXT: jmp .LBB1_3134; X32-NEXT: .LBB1_3: # %atomicrmw.start8135; X32-NEXT: # =>This Inner Loop Header: Depth=1136; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload137; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload138; X32-NEXT: movl %eax, %ebx139; X32-NEXT: addl $-3, %ebx140; X32-NEXT: movl %edx, %ecx141; X32-NEXT: adcl $-1, %ecx142; X32-NEXT: lock cmpxchg8b sc64143; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill144; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill145; X32-NEXT: jne .LBB1_3146; X32-NEXT: jmp .LBB1_4147; X32-NEXT: .LBB1_4: # %atomicrmw.end7148; X32-NEXT: movl sc64+4, %edx149; X32-NEXT: movl sc64, %eax150; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill151; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill152; X32-NEXT: jmp .LBB1_5153; X32-NEXT: .LBB1_5: # %atomicrmw.start2154; X32-NEXT: # =>This Inner Loop Header: Depth=1155; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload156; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload157; X32-NEXT: movl %eax, %ebx158; X32-NEXT: addl $-5, %ebx159; X32-NEXT: movl %edx, %ecx160; X32-NEXT: adcl $-1, %ecx161; X32-NEXT: lock cmpxchg8b sc64162; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill163; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill164; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill165; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill166; X32-NEXT: jne .LBB1_5167; X32-NEXT: jmp .LBB1_6168; X32-NEXT: .LBB1_6: # %atomicrmw.end1169; X32-NEXT: movl sc64+4, %edx170; X32-NEXT: movl sc64, %eax171; X32-NEXT: movl %eax, (%esp) # 4-byte Spill172; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill173; X32-NEXT: jmp .LBB1_7174; X32-NEXT: .LBB1_7: # %atomicrmw.start175; X32-NEXT: # =>This Inner Loop Header: Depth=1176; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload177; X32-NEXT: movl (%esp), %eax # 4-byte Reload178; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload179; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload180; X32-NEXT: movl %eax, %ebx181; X32-NEXT: subl %ecx, %ebx182; X32-NEXT: movl %edx, %ecx183; X32-NEXT: sbbl %esi, %ecx184; X32-NEXT: lock cmpxchg8b sc64185; X32-NEXT: movl %eax, (%esp) # 4-byte Spill186; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill187; X32-NEXT: jne .LBB1_7188; X32-NEXT: jmp .LBB1_8189; X32-NEXT: .LBB1_8: # %atomicrmw.end190; X32-NEXT: addl $40, %esp191; X32-NEXT: popl %esi192; X32-NEXT: popl %ebx193; X32-NEXT: retl194 %t1 = atomicrmw sub ptr @sc64, i64 1 acquire195 %t2 = atomicrmw sub ptr @sc64, i64 3 acquire196 %t3 = atomicrmw sub ptr @sc64, i64 5 acquire197 %t4 = atomicrmw sub ptr @sc64, i64 %t3 acquire198 ret void199}200 201define void @atomic_fetch_and64() nounwind {202; X32-LABEL: atomic_fetch_and64:203; X32: # %bb.0:204; X32-NEXT: pushl %ebx205; X32-NEXT: pushl %esi206; X32-NEXT: subl $32, %esp207; X32-NEXT: movl sc64+4, %edx208; X32-NEXT: movl sc64, %eax209; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill210; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill211; X32-NEXT: jmp .LBB2_1212; X32-NEXT: .LBB2_1: # %atomicrmw.start8213; X32-NEXT: # =>This Inner Loop Header: Depth=1214; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload215; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload216; X32-NEXT: movl %eax, %ebx217; X32-NEXT: andl $3, %ebx218; X32-NEXT: xorl %ecx, %ecx219; X32-NEXT: lock cmpxchg8b sc64220; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill221; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill222; X32-NEXT: jne .LBB2_1223; X32-NEXT: jmp .LBB2_2224; X32-NEXT: .LBB2_2: # %atomicrmw.end7225; X32-NEXT: movl sc64+4, %edx226; X32-NEXT: movl sc64, %eax227; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill228; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill229; X32-NEXT: jmp .LBB2_3230; X32-NEXT: .LBB2_3: # %atomicrmw.start2231; X32-NEXT: # =>This Inner Loop Header: Depth=1232; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload233; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload234; X32-NEXT: movl %eax, %ebx235; X32-NEXT: andl $1, %ebx236; X32-NEXT: movl %edx, %ecx237; X32-NEXT: andl $1, %ecx238; X32-NEXT: lock cmpxchg8b sc64239; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill240; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill241; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill242; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill243; X32-NEXT: jne .LBB2_3244; X32-NEXT: jmp .LBB2_4245; X32-NEXT: .LBB2_4: # %atomicrmw.end1246; X32-NEXT: movl sc64+4, %edx247; X32-NEXT: movl sc64, %eax248; X32-NEXT: movl %eax, (%esp) # 4-byte Spill249; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill250; X32-NEXT: jmp .LBB2_5251; X32-NEXT: .LBB2_5: # %atomicrmw.start252; X32-NEXT: # =>This Inner Loop Header: Depth=1253; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload254; X32-NEXT: movl (%esp), %eax # 4-byte Reload255; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload256; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload257; X32-NEXT: movl %eax, %ebx258; X32-NEXT: andl %ecx, %ebx259; X32-NEXT: movl %edx, %ecx260; X32-NEXT: andl %esi, %ecx261; X32-NEXT: lock cmpxchg8b sc64262; X32-NEXT: movl %eax, (%esp) # 4-byte Spill263; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill264; X32-NEXT: jne .LBB2_5265; X32-NEXT: jmp .LBB2_6266; X32-NEXT: .LBB2_6: # %atomicrmw.end267; X32-NEXT: addl $32, %esp268; X32-NEXT: popl %esi269; X32-NEXT: popl %ebx270; X32-NEXT: retl271 %t1 = atomicrmw and ptr @sc64, i64 3 acquire272 %t2 = atomicrmw and ptr @sc64, i64 4294967297 acquire273 %t3 = atomicrmw and ptr @sc64, i64 %t2 acquire274 ret void275}276 277define void @atomic_fetch_or64() nounwind {278; X32-LABEL: atomic_fetch_or64:279; X32: # %bb.0:280; X32-NEXT: pushl %ebx281; X32-NEXT: pushl %esi282; X32-NEXT: subl $32, %esp283; X32-NEXT: movl sc64+4, %edx284; X32-NEXT: movl sc64, %eax285; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill286; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill287; X32-NEXT: jmp .LBB3_1288; X32-NEXT: .LBB3_1: # %atomicrmw.start8289; X32-NEXT: # =>This Inner Loop Header: Depth=1290; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload291; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload292; X32-NEXT: movl %eax, %ebx293; X32-NEXT: orl $3, %ebx294; X32-NEXT: movl %ecx, %edx295; X32-NEXT: lock cmpxchg8b sc64296; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill297; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill298; X32-NEXT: jne .LBB3_1299; X32-NEXT: jmp .LBB3_2300; X32-NEXT: .LBB3_2: # %atomicrmw.end7301; X32-NEXT: movl sc64+4, %edx302; X32-NEXT: movl sc64, %eax303; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill304; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill305; X32-NEXT: jmp .LBB3_3306; X32-NEXT: .LBB3_3: # %atomicrmw.start2307; X32-NEXT: # =>This Inner Loop Header: Depth=1308; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload309; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload310; X32-NEXT: movl %eax, %ebx311; X32-NEXT: orl $1, %ebx312; X32-NEXT: movl %edx, %ecx313; X32-NEXT: orl $1, %ecx314; X32-NEXT: lock cmpxchg8b sc64315; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill316; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill317; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill318; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill319; X32-NEXT: jne .LBB3_3320; X32-NEXT: jmp .LBB3_4321; X32-NEXT: .LBB3_4: # %atomicrmw.end1322; X32-NEXT: movl sc64+4, %edx323; X32-NEXT: movl sc64, %eax324; X32-NEXT: movl %eax, (%esp) # 4-byte Spill325; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill326; X32-NEXT: jmp .LBB3_5327; X32-NEXT: .LBB3_5: # %atomicrmw.start328; X32-NEXT: # =>This Inner Loop Header: Depth=1329; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload330; X32-NEXT: movl (%esp), %eax # 4-byte Reload331; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload332; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload333; X32-NEXT: movl %eax, %ebx334; X32-NEXT: orl %ecx, %ebx335; X32-NEXT: movl %edx, %ecx336; X32-NEXT: orl %esi, %ecx337; X32-NEXT: lock cmpxchg8b sc64338; X32-NEXT: movl %eax, (%esp) # 4-byte Spill339; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill340; X32-NEXT: jne .LBB3_5341; X32-NEXT: jmp .LBB3_6342; X32-NEXT: .LBB3_6: # %atomicrmw.end343; X32-NEXT: addl $32, %esp344; X32-NEXT: popl %esi345; X32-NEXT: popl %ebx346; X32-NEXT: retl347 %t1 = atomicrmw or ptr @sc64, i64 3 acquire348 %t2 = atomicrmw or ptr @sc64, i64 4294967297 acquire349 %t3 = atomicrmw or ptr @sc64, i64 %t2 acquire350 ret void351}352 353define void @atomic_fetch_xor64() nounwind {354; X32-LABEL: atomic_fetch_xor64:355; X32: # %bb.0:356; X32-NEXT: pushl %ebx357; X32-NEXT: pushl %esi358; X32-NEXT: subl $32, %esp359; X32-NEXT: movl sc64+4, %edx360; X32-NEXT: movl sc64, %eax361; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill362; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill363; X32-NEXT: jmp .LBB4_1364; X32-NEXT: .LBB4_1: # %atomicrmw.start8365; X32-NEXT: # =>This Inner Loop Header: Depth=1366; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload367; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload368; X32-NEXT: movl %eax, %ebx369; X32-NEXT: xorl $3, %ebx370; X32-NEXT: movl %ecx, %edx371; X32-NEXT: lock cmpxchg8b sc64372; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill373; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill374; X32-NEXT: jne .LBB4_1375; X32-NEXT: jmp .LBB4_2376; X32-NEXT: .LBB4_2: # %atomicrmw.end7377; X32-NEXT: movl sc64+4, %edx378; X32-NEXT: movl sc64, %eax379; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill380; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill381; X32-NEXT: jmp .LBB4_3382; X32-NEXT: .LBB4_3: # %atomicrmw.start2383; X32-NEXT: # =>This Inner Loop Header: Depth=1384; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload385; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload386; X32-NEXT: movl %eax, %ebx387; X32-NEXT: xorl $1, %ebx388; X32-NEXT: movl %edx, %ecx389; X32-NEXT: xorl $1, %ecx390; X32-NEXT: lock cmpxchg8b sc64391; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill392; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill393; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill394; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill395; X32-NEXT: jne .LBB4_3396; X32-NEXT: jmp .LBB4_4397; X32-NEXT: .LBB4_4: # %atomicrmw.end1398; X32-NEXT: movl sc64+4, %edx399; X32-NEXT: movl sc64, %eax400; X32-NEXT: movl %eax, (%esp) # 4-byte Spill401; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill402; X32-NEXT: jmp .LBB4_5403; X32-NEXT: .LBB4_5: # %atomicrmw.start404; X32-NEXT: # =>This Inner Loop Header: Depth=1405; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload406; X32-NEXT: movl (%esp), %eax # 4-byte Reload407; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload408; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload409; X32-NEXT: movl %eax, %ebx410; X32-NEXT: xorl %ecx, %ebx411; X32-NEXT: movl %edx, %ecx412; X32-NEXT: xorl %esi, %ecx413; X32-NEXT: lock cmpxchg8b sc64414; X32-NEXT: movl %eax, (%esp) # 4-byte Spill415; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill416; X32-NEXT: jne .LBB4_5417; X32-NEXT: jmp .LBB4_6418; X32-NEXT: .LBB4_6: # %atomicrmw.end419; X32-NEXT: addl $32, %esp420; X32-NEXT: popl %esi421; X32-NEXT: popl %ebx422; X32-NEXT: retl423 %t1 = atomicrmw xor ptr @sc64, i64 3 acquire424 %t2 = atomicrmw xor ptr @sc64, i64 4294967297 acquire425 %t3 = atomicrmw xor ptr @sc64, i64 %t2 acquire426 ret void427}428 429define void @atomic_fetch_nand64(i64 %x) nounwind {430; X32-LABEL: atomic_fetch_nand64:431; X32: # %bb.0:432; X32-NEXT: pushl %ebx433; X32-NEXT: pushl %edi434; X32-NEXT: pushl %esi435; X32-NEXT: subl $16, %esp436; X32-NEXT: movl {{[0-9]+}}(%esp), %eax437; X32-NEXT: movl %eax, (%esp) # 4-byte Spill438; X32-NEXT: movl {{[0-9]+}}(%esp), %eax439; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill440; X32-NEXT: movl sc64+4, %edx441; X32-NEXT: movl sc64, %eax442; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill443; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill444; X32-NEXT: jmp .LBB5_1445; X32-NEXT: .LBB5_1: # %atomicrmw.start446; X32-NEXT: # =>This Inner Loop Header: Depth=1447; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload448; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload449; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload450; X32-NEXT: movl (%esp), %edi # 4-byte Reload451; X32-NEXT: movl %edx, %ecx452; X32-NEXT: andl %edi, %ecx453; X32-NEXT: movl %eax, %ebx454; X32-NEXT: andl %esi, %ebx455; X32-NEXT: notl %ebx456; X32-NEXT: notl %ecx457; X32-NEXT: lock cmpxchg8b sc64458; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill459; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill460; X32-NEXT: jne .LBB5_1461; X32-NEXT: jmp .LBB5_2462; X32-NEXT: .LBB5_2: # %atomicrmw.end463; X32-NEXT: addl $16, %esp464; X32-NEXT: popl %esi465; X32-NEXT: popl %edi466; X32-NEXT: popl %ebx467; X32-NEXT: retl468 %t1 = atomicrmw nand ptr @sc64, i64 %x acquire469 ret void470}471 472define void @atomic_fetch_max64(i64 %x) nounwind {473; X32-LABEL: atomic_fetch_max64:474; X32: # %bb.0:475; X32-NEXT: pushl %ebx476; X32-NEXT: pushl %esi477; X32-NEXT: subl $16, %esp478; X32-NEXT: movl {{[0-9]+}}(%esp), %eax479; X32-NEXT: movl %eax, (%esp) # 4-byte Spill480; X32-NEXT: movl {{[0-9]+}}(%esp), %eax481; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill482; X32-NEXT: movl sc64+4, %edx483; X32-NEXT: movl sc64, %eax484; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill485; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill486; X32-NEXT: jmp .LBB6_1487; X32-NEXT: .LBB6_1: # %atomicrmw.start488; X32-NEXT: # =>This Inner Loop Header: Depth=1489; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload490; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload491; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload492; X32-NEXT: movl (%esp), %ecx # 4-byte Reload493; X32-NEXT: movl %ebx, %esi494; X32-NEXT: subl %eax, %esi495; X32-NEXT: movl %ecx, %esi496; X32-NEXT: sbbl %edx, %esi497; X32-NEXT: cmovll %edx, %ecx498; X32-NEXT: cmovll %eax, %ebx499; X32-NEXT: lock cmpxchg8b sc64500; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill501; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill502; X32-NEXT: jne .LBB6_1503; X32-NEXT: jmp .LBB6_2504; X32-NEXT: .LBB6_2: # %atomicrmw.end505; X32-NEXT: addl $16, %esp506; X32-NEXT: popl %esi507; X32-NEXT: popl %ebx508; X32-NEXT: retl509 %t1 = atomicrmw max ptr @sc64, i64 %x acquire510 ret void511}512 513define void @atomic_fetch_min64(i64 %x) nounwind {514; X32-LABEL: atomic_fetch_min64:515; X32: # %bb.0:516; X32-NEXT: pushl %ebx517; X32-NEXT: pushl %esi518; X32-NEXT: subl $16, %esp519; X32-NEXT: movl {{[0-9]+}}(%esp), %eax520; X32-NEXT: movl %eax, (%esp) # 4-byte Spill521; X32-NEXT: movl {{[0-9]+}}(%esp), %eax522; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill523; X32-NEXT: movl sc64+4, %edx524; X32-NEXT: movl sc64, %eax525; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill526; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill527; X32-NEXT: jmp .LBB7_1528; X32-NEXT: .LBB7_1: # %atomicrmw.start529; X32-NEXT: # =>This Inner Loop Header: Depth=1530; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload531; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload532; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload533; X32-NEXT: movl (%esp), %ecx # 4-byte Reload534; X32-NEXT: movl %ebx, %esi535; X32-NEXT: subl %eax, %esi536; X32-NEXT: movl %ecx, %esi537; X32-NEXT: sbbl %edx, %esi538; X32-NEXT: cmovgel %edx, %ecx539; X32-NEXT: cmovgel %eax, %ebx540; X32-NEXT: lock cmpxchg8b sc64541; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill542; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill543; X32-NEXT: jne .LBB7_1544; X32-NEXT: jmp .LBB7_2545; X32-NEXT: .LBB7_2: # %atomicrmw.end546; X32-NEXT: addl $16, %esp547; X32-NEXT: popl %esi548; X32-NEXT: popl %ebx549; X32-NEXT: retl550 %t1 = atomicrmw min ptr @sc64, i64 %x acquire551 ret void552}553 554define void @atomic_fetch_umax64(i64 %x) nounwind {555; X32-LABEL: atomic_fetch_umax64:556; X32: # %bb.0:557; X32-NEXT: pushl %ebx558; X32-NEXT: pushl %esi559; X32-NEXT: subl $16, %esp560; X32-NEXT: movl {{[0-9]+}}(%esp), %eax561; X32-NEXT: movl %eax, (%esp) # 4-byte Spill562; X32-NEXT: movl {{[0-9]+}}(%esp), %eax563; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill564; X32-NEXT: movl sc64+4, %edx565; X32-NEXT: movl sc64, %eax566; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill567; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill568; X32-NEXT: jmp .LBB8_1569; X32-NEXT: .LBB8_1: # %atomicrmw.start570; X32-NEXT: # =>This Inner Loop Header: Depth=1571; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload572; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload573; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload574; X32-NEXT: movl (%esp), %ecx # 4-byte Reload575; X32-NEXT: movl %ebx, %esi576; X32-NEXT: subl %eax, %esi577; X32-NEXT: movl %ecx, %esi578; X32-NEXT: sbbl %edx, %esi579; X32-NEXT: cmovbl %edx, %ecx580; X32-NEXT: cmovbl %eax, %ebx581; X32-NEXT: lock cmpxchg8b sc64582; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill583; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill584; X32-NEXT: jne .LBB8_1585; X32-NEXT: jmp .LBB8_2586; X32-NEXT: .LBB8_2: # %atomicrmw.end587; X32-NEXT: addl $16, %esp588; X32-NEXT: popl %esi589; X32-NEXT: popl %ebx590; X32-NEXT: retl591 %t1 = atomicrmw umax ptr @sc64, i64 %x acquire592 ret void593}594 595define void @atomic_fetch_umin64(i64 %x) nounwind {596; X32-LABEL: atomic_fetch_umin64:597; X32: # %bb.0:598; X32-NEXT: pushl %ebx599; X32-NEXT: pushl %esi600; X32-NEXT: subl $16, %esp601; X32-NEXT: movl {{[0-9]+}}(%esp), %eax602; X32-NEXT: movl %eax, (%esp) # 4-byte Spill603; X32-NEXT: movl {{[0-9]+}}(%esp), %eax604; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill605; X32-NEXT: movl sc64+4, %edx606; X32-NEXT: movl sc64, %eax607; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill608; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill609; X32-NEXT: jmp .LBB9_1610; X32-NEXT: .LBB9_1: # %atomicrmw.start611; X32-NEXT: # =>This Inner Loop Header: Depth=1612; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload613; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload614; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload615; X32-NEXT: movl (%esp), %ecx # 4-byte Reload616; X32-NEXT: movl %ebx, %esi617; X32-NEXT: subl %eax, %esi618; X32-NEXT: movl %ecx, %esi619; X32-NEXT: sbbl %edx, %esi620; X32-NEXT: cmovael %edx, %ecx621; X32-NEXT: cmovael %eax, %ebx622; X32-NEXT: lock cmpxchg8b sc64623; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill624; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill625; X32-NEXT: jne .LBB9_1626; X32-NEXT: jmp .LBB9_2627; X32-NEXT: .LBB9_2: # %atomicrmw.end628; X32-NEXT: addl $16, %esp629; X32-NEXT: popl %esi630; X32-NEXT: popl %ebx631; X32-NEXT: retl632 %t1 = atomicrmw umin ptr @sc64, i64 %x acquire633 ret void634}635 636define void @atomic_fetch_cmpxchg64() nounwind {637; X32-LABEL: atomic_fetch_cmpxchg64:638; X32: # %bb.0:639; X32-NEXT: pushl %ebx640; X32-NEXT: xorl %ecx, %ecx641; X32-NEXT: movl $1, %ebx642; X32-NEXT: movl %ecx, %eax643; X32-NEXT: movl %ecx, %edx644; X32-NEXT: lock cmpxchg8b sc64645; X32-NEXT: popl %ebx646; X32-NEXT: retl647 %t1 = cmpxchg ptr @sc64, i64 0, i64 1 acquire acquire648 ret void649}650 651define void @atomic_fetch_store64(i64 %x) nounwind {652; X32-LABEL: atomic_fetch_store64:653; X32: # %bb.0:654; X32-NEXT: movl {{[0-9]+}}(%esp), %eax655; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx656; X32-NEXT: movd %ecx, %xmm0657; X32-NEXT: pinsrd $1, %eax, %xmm0658; X32-NEXT: movq %xmm0, sc64659; X32-NEXT: retl660 store atomic i64 %x, ptr @sc64 release, align 8661 ret void662}663 664define void @atomic_fetch_swap64(i64 %x) nounwind {665; X32-LABEL: atomic_fetch_swap64:666; X32: # %bb.0:667; X32-NEXT: pushl %ebx668; X32-NEXT: subl $16, %esp669; X32-NEXT: movl {{[0-9]+}}(%esp), %eax670; X32-NEXT: movl %eax, (%esp) # 4-byte Spill671; X32-NEXT: movl {{[0-9]+}}(%esp), %eax672; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill673; X32-NEXT: movl sc64+4, %edx674; X32-NEXT: movl sc64, %eax675; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill676; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill677; X32-NEXT: jmp .LBB12_1678; X32-NEXT: .LBB12_1: # %atomicrmw.start679; X32-NEXT: # =>This Inner Loop Header: Depth=1680; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload681; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload682; X32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload683; X32-NEXT: movl (%esp), %ecx # 4-byte Reload684; X32-NEXT: lock cmpxchg8b sc64685; X32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill686; X32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill687; X32-NEXT: jne .LBB12_1688; X32-NEXT: jmp .LBB12_2689; X32-NEXT: .LBB12_2: # %atomicrmw.end690; X32-NEXT: addl $16, %esp691; X32-NEXT: popl %ebx692; X32-NEXT: retl693 %t1 = atomicrmw xchg ptr @sc64, i64 %x acquire694 ret void695}696