814 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix=X643; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefixes=X86,X86-CMOV4; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOCMOV5; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse,-x87 -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOX876 7@sc32 = external dso_local global i328@fsc32 = external dso_local global float9 10define void @atomic_fetch_add32() nounwind {11; X64-LABEL: atomic_fetch_add32:12; X64: # %bb.0: # %entry13; X64-NEXT: lock incl sc32(%rip)14; X64-NEXT: lock addl $3, sc32(%rip)15; X64-NEXT: movl $5, %eax16; X64-NEXT: lock xaddl %eax, sc32(%rip)17; X64-NEXT: lock addl %eax, sc32(%rip)18; X64-NEXT: retq19;20; X86-LABEL: atomic_fetch_add32:21; X86: # %bb.0: # %entry22; X86-NEXT: lock incl sc3223; X86-NEXT: lock addl $3, sc3224; X86-NEXT: movl $5, %eax25; X86-NEXT: lock xaddl %eax, sc3226; X86-NEXT: lock addl %eax, sc3227; X86-NEXT: retl28entry:29 %t1 = atomicrmw add ptr @sc32, i32 1 acquire30 %t2 = atomicrmw add ptr @sc32, i32 3 acquire31 %t3 = atomicrmw add ptr @sc32, i32 5 acquire32 %t4 = atomicrmw add ptr @sc32, i32 %t3 acquire33 ret void34}35 36define void @atomic_fetch_sub32() nounwind {37; X64-LABEL: atomic_fetch_sub32:38; X64: # %bb.0:39; X64-NEXT: lock decl sc32(%rip)40; X64-NEXT: lock subl $3, sc32(%rip)41; X64-NEXT: movl $-5, %eax42; X64-NEXT: lock xaddl %eax, sc32(%rip)43; X64-NEXT: lock subl %eax, sc32(%rip)44; X64-NEXT: retq45;46; X86-LABEL: atomic_fetch_sub32:47; X86: # %bb.0:48; X86-NEXT: lock decl sc3249; X86-NEXT: lock subl $3, sc3250; X86-NEXT: movl $-5, %eax51; X86-NEXT: lock xaddl %eax, sc3252; X86-NEXT: lock subl %eax, sc3253; X86-NEXT: retl54 %t1 = atomicrmw sub ptr @sc32, i32 1 acquire55 %t2 = atomicrmw sub ptr @sc32, i32 3 acquire56 %t3 = atomicrmw sub ptr @sc32, i32 5 acquire57 %t4 = atomicrmw sub ptr @sc32, i32 %t3 acquire58 ret void59}60 61define void @atomic_fetch_and32() nounwind {62; X64-LABEL: atomic_fetch_and32:63; X64: # %bb.0:64; X64-NEXT: lock andl $3, sc32(%rip)65; X64-NEXT: movl sc32, %eax66; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill67; X64-NEXT: .LBB2_1: # %atomicrmw.start68; X64-NEXT: # =>This Inner Loop Header: Depth=169; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload70; X64-NEXT: movl %eax, %ecx71; X64-NEXT: andl $5, %ecx72; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)73; X64-NEXT: sete %cl74; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill75; X64-NEXT: testb $1, %cl76; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill77; X64-NEXT: jne .LBB2_278; X64-NEXT: jmp .LBB2_179; X64-NEXT: .LBB2_2: # %atomicrmw.end80; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload81; X64-NEXT: lock andl %eax, sc32(%rip)82; X64-NEXT: retq83;84; X86-LABEL: atomic_fetch_and32:85; X86: # %bb.0:86; X86-NEXT: subl $8, %esp87; X86-NEXT: lock andl $3, sc3288; X86-NEXT: movl sc32, %eax89; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill90; X86-NEXT: .LBB2_1: # %atomicrmw.start91; X86-NEXT: # =>This Inner Loop Header: Depth=192; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload93; X86-NEXT: movl %eax, %ecx94; X86-NEXT: andl $5, %ecx95; X86-NEXT: lock cmpxchgl %ecx, sc3296; X86-NEXT: sete %cl97; X86-NEXT: movl %eax, (%esp) # 4-byte Spill98; X86-NEXT: testb $1, %cl99; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill100; X86-NEXT: jne .LBB2_2101; X86-NEXT: jmp .LBB2_1102; X86-NEXT: .LBB2_2: # %atomicrmw.end103; X86-NEXT: movl (%esp), %eax # 4-byte Reload104; X86-NEXT: lock andl %eax, sc32105; X86-NEXT: addl $8, %esp106; X86-NEXT: retl107 %t1 = atomicrmw and ptr @sc32, i32 3 acquire108 %t2 = atomicrmw and ptr @sc32, i32 5 acquire109 %t3 = atomicrmw and ptr @sc32, i32 %t2 acquire110 ret void111}112 113define void @atomic_fetch_or32() nounwind {114; X64-LABEL: atomic_fetch_or32:115; X64: # %bb.0:116; X64-NEXT: lock orl $3, sc32(%rip)117; X64-NEXT: movl sc32, %eax118; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill119; X64-NEXT: .LBB3_1: # %atomicrmw.start120; X64-NEXT: # =>This Inner Loop Header: Depth=1121; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload122; X64-NEXT: movl %eax, %ecx123; X64-NEXT: orl $5, %ecx124; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)125; X64-NEXT: sete %cl126; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill127; X64-NEXT: testb $1, %cl128; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill129; X64-NEXT: jne .LBB3_2130; X64-NEXT: jmp .LBB3_1131; X64-NEXT: .LBB3_2: # %atomicrmw.end132; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload133; X64-NEXT: lock orl %eax, sc32(%rip)134; X64-NEXT: retq135;136; X86-LABEL: atomic_fetch_or32:137; X86: # %bb.0:138; X86-NEXT: subl $8, %esp139; X86-NEXT: lock orl $3, sc32140; X86-NEXT: movl sc32, %eax141; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill142; X86-NEXT: .LBB3_1: # %atomicrmw.start143; X86-NEXT: # =>This Inner Loop Header: Depth=1144; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload145; X86-NEXT: movl %eax, %ecx146; X86-NEXT: orl $5, %ecx147; X86-NEXT: lock cmpxchgl %ecx, sc32148; X86-NEXT: sete %cl149; X86-NEXT: movl %eax, (%esp) # 4-byte Spill150; X86-NEXT: testb $1, %cl151; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill152; X86-NEXT: jne .LBB3_2153; X86-NEXT: jmp .LBB3_1154; X86-NEXT: .LBB3_2: # %atomicrmw.end155; X86-NEXT: movl (%esp), %eax # 4-byte Reload156; X86-NEXT: lock orl %eax, sc32157; X86-NEXT: addl $8, %esp158; X86-NEXT: retl159 %t1 = atomicrmw or ptr @sc32, i32 3 acquire160 %t2 = atomicrmw or ptr @sc32, i32 5 acquire161 %t3 = atomicrmw or ptr @sc32, i32 %t2 acquire162 ret void163}164 165define void @atomic_fetch_xor32() nounwind {166; X64-LABEL: atomic_fetch_xor32:167; X64: # %bb.0:168; X64-NEXT: lock xorl $3, sc32(%rip)169; X64-NEXT: movl sc32, %eax170; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill171; X64-NEXT: .LBB4_1: # %atomicrmw.start172; X64-NEXT: # =>This Inner Loop Header: Depth=1173; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload174; X64-NEXT: movl %eax, %ecx175; X64-NEXT: xorl $5, %ecx176; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)177; X64-NEXT: sete %cl178; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill179; X64-NEXT: testb $1, %cl180; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill181; X64-NEXT: jne .LBB4_2182; X64-NEXT: jmp .LBB4_1183; X64-NEXT: .LBB4_2: # %atomicrmw.end184; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload185; X64-NEXT: lock xorl %eax, sc32(%rip)186; X64-NEXT: retq187;188; X86-LABEL: atomic_fetch_xor32:189; X86: # %bb.0:190; X86-NEXT: subl $8, %esp191; X86-NEXT: lock xorl $3, sc32192; X86-NEXT: movl sc32, %eax193; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill194; X86-NEXT: .LBB4_1: # %atomicrmw.start195; X86-NEXT: # =>This Inner Loop Header: Depth=1196; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload197; X86-NEXT: movl %eax, %ecx198; X86-NEXT: xorl $5, %ecx199; X86-NEXT: lock cmpxchgl %ecx, sc32200; X86-NEXT: sete %cl201; X86-NEXT: movl %eax, (%esp) # 4-byte Spill202; X86-NEXT: testb $1, %cl203; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill204; X86-NEXT: jne .LBB4_2205; X86-NEXT: jmp .LBB4_1206; X86-NEXT: .LBB4_2: # %atomicrmw.end207; X86-NEXT: movl (%esp), %eax # 4-byte Reload208; X86-NEXT: lock xorl %eax, sc32209; X86-NEXT: addl $8, %esp210; X86-NEXT: retl211 %t1 = atomicrmw xor ptr @sc32, i32 3 acquire212 %t2 = atomicrmw xor ptr @sc32, i32 5 acquire213 %t3 = atomicrmw xor ptr @sc32, i32 %t2 acquire214 ret void215}216 217define void @atomic_fetch_nand32(i32 %x) nounwind {218; X64-LABEL: atomic_fetch_nand32:219; X64: # %bb.0:220; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill221; X64-NEXT: movl sc32, %eax222; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill223; X64-NEXT: .LBB5_1: # %atomicrmw.start224; X64-NEXT: # =>This Inner Loop Header: Depth=1225; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload226; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload227; X64-NEXT: movl %eax, %ecx228; X64-NEXT: andl %edx, %ecx229; X64-NEXT: notl %ecx230; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)231; X64-NEXT: sete %cl232; X64-NEXT: testb $1, %cl233; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill234; X64-NEXT: jne .LBB5_2235; X64-NEXT: jmp .LBB5_1236; X64-NEXT: .LBB5_2: # %atomicrmw.end237; X64-NEXT: retq238;239; X86-LABEL: atomic_fetch_nand32:240; X86: # %bb.0:241; X86-NEXT: subl $8, %esp242; X86-NEXT: movl {{[0-9]+}}(%esp), %eax243; X86-NEXT: movl %eax, (%esp) # 4-byte Spill244; X86-NEXT: movl sc32, %eax245; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill246; X86-NEXT: .LBB5_1: # %atomicrmw.start247; X86-NEXT: # =>This Inner Loop Header: Depth=1248; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload249; X86-NEXT: movl (%esp), %edx # 4-byte Reload250; X86-NEXT: movl %eax, %ecx251; X86-NEXT: andl %edx, %ecx252; X86-NEXT: notl %ecx253; X86-NEXT: lock cmpxchgl %ecx, sc32254; X86-NEXT: sete %cl255; X86-NEXT: testb $1, %cl256; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill257; X86-NEXT: jne .LBB5_2258; X86-NEXT: jmp .LBB5_1259; X86-NEXT: .LBB5_2: # %atomicrmw.end260; X86-NEXT: addl $8, %esp261; X86-NEXT: retl262 %t1 = atomicrmw nand ptr @sc32, i32 %x acquire263 ret void264}265 266define void @atomic_fetch_max32(i32 %x) nounwind {267; X64-LABEL: atomic_fetch_max32:268; X64: # %bb.0:269; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill270; X64-NEXT: movl sc32, %eax271; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill272; X64-NEXT: .LBB6_1: # %atomicrmw.start273; X64-NEXT: # =>This Inner Loop Header: Depth=1274; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload275; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload276; X64-NEXT: movl %eax, %edx277; X64-NEXT: subl %ecx, %edx278; X64-NEXT: cmovgl %eax, %ecx279; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)280; X64-NEXT: sete %cl281; X64-NEXT: testb $1, %cl282; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill283; X64-NEXT: jne .LBB6_2284; X64-NEXT: jmp .LBB6_1285; X64-NEXT: .LBB6_2: # %atomicrmw.end286; X64-NEXT: retq287;288; X86-CMOV-LABEL: atomic_fetch_max32:289; X86-CMOV: # %bb.0:290; X86-CMOV-NEXT: subl $8, %esp291; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax292; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill293; X86-CMOV-NEXT: movl sc32, %eax294; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill295; X86-CMOV-NEXT: .LBB6_1: # %atomicrmw.start296; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1297; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload298; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload299; X86-CMOV-NEXT: movl %eax, %edx300; X86-CMOV-NEXT: subl %ecx, %edx301; X86-CMOV-NEXT: cmovgl %eax, %ecx302; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32303; X86-CMOV-NEXT: sete %cl304; X86-CMOV-NEXT: testb $1, %cl305; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill306; X86-CMOV-NEXT: jne .LBB6_2307; X86-CMOV-NEXT: jmp .LBB6_1308; X86-CMOV-NEXT: .LBB6_2: # %atomicrmw.end309; X86-CMOV-NEXT: addl $8, %esp310; X86-CMOV-NEXT: retl311;312; X86-NOCMOV-LABEL: atomic_fetch_max32:313; X86-NOCMOV: # %bb.0:314; X86-NOCMOV-NEXT: subl $16, %esp315; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax316; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill317; X86-NOCMOV-NEXT: movl sc32, %eax318; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill319; X86-NOCMOV-NEXT: .LBB6_1: # %atomicrmw.start320; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1321; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload322; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload323; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill324; X86-NOCMOV-NEXT: movl %eax, %ecx325; X86-NOCMOV-NEXT: subl %edx, %ecx326; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill327; X86-NOCMOV-NEXT: jg .LBB6_4328; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start329; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1330; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload331; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill332; X86-NOCMOV-NEXT: .LBB6_4: # %atomicrmw.start333; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1334; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload335; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload336; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32337; X86-NOCMOV-NEXT: sete %cl338; X86-NOCMOV-NEXT: testb $1, %cl339; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill340; X86-NOCMOV-NEXT: jne .LBB6_2341; X86-NOCMOV-NEXT: jmp .LBB6_1342; X86-NOCMOV-NEXT: .LBB6_2: # %atomicrmw.end343; X86-NOCMOV-NEXT: addl $16, %esp344; X86-NOCMOV-NEXT: retl345;346; X86-NOX87-LABEL: atomic_fetch_max32:347; X86-NOX87: # %bb.0:348; X86-NOX87-NEXT: subl $16, %esp349; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax350; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill351; X86-NOX87-NEXT: movl sc32, %eax352; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill353; X86-NOX87-NEXT: .LBB6_1: # %atomicrmw.start354; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1355; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload356; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload357; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill358; X86-NOX87-NEXT: movl %eax, %ecx359; X86-NOX87-NEXT: subl %edx, %ecx360; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill361; X86-NOX87-NEXT: jg .LBB6_4362; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start363; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1364; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload365; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill366; X86-NOX87-NEXT: .LBB6_4: # %atomicrmw.start367; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1368; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload369; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload370; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32371; X86-NOX87-NEXT: sete %cl372; X86-NOX87-NEXT: testb $1, %cl373; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill374; X86-NOX87-NEXT: jne .LBB6_2375; X86-NOX87-NEXT: jmp .LBB6_1376; X86-NOX87-NEXT: .LBB6_2: # %atomicrmw.end377; X86-NOX87-NEXT: addl $16, %esp378; X86-NOX87-NEXT: retl379 %t1 = atomicrmw max ptr @sc32, i32 %x acquire380 ret void381}382 383define void @atomic_fetch_min32(i32 %x) nounwind {384; X64-LABEL: atomic_fetch_min32:385; X64: # %bb.0:386; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill387; X64-NEXT: movl sc32, %eax388; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill389; X64-NEXT: .LBB7_1: # %atomicrmw.start390; X64-NEXT: # =>This Inner Loop Header: Depth=1391; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload392; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload393; X64-NEXT: movl %eax, %edx394; X64-NEXT: subl %ecx, %edx395; X64-NEXT: cmovlel %eax, %ecx396; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)397; X64-NEXT: sete %cl398; X64-NEXT: testb $1, %cl399; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill400; X64-NEXT: jne .LBB7_2401; X64-NEXT: jmp .LBB7_1402; X64-NEXT: .LBB7_2: # %atomicrmw.end403; X64-NEXT: retq404;405; X86-CMOV-LABEL: atomic_fetch_min32:406; X86-CMOV: # %bb.0:407; X86-CMOV-NEXT: subl $8, %esp408; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax409; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill410; X86-CMOV-NEXT: movl sc32, %eax411; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill412; X86-CMOV-NEXT: .LBB7_1: # %atomicrmw.start413; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1414; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload415; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload416; X86-CMOV-NEXT: movl %eax, %edx417; X86-CMOV-NEXT: subl %ecx, %edx418; X86-CMOV-NEXT: cmovlel %eax, %ecx419; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32420; X86-CMOV-NEXT: sete %cl421; X86-CMOV-NEXT: testb $1, %cl422; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill423; X86-CMOV-NEXT: jne .LBB7_2424; X86-CMOV-NEXT: jmp .LBB7_1425; X86-CMOV-NEXT: .LBB7_2: # %atomicrmw.end426; X86-CMOV-NEXT: addl $8, %esp427; X86-CMOV-NEXT: retl428;429; X86-NOCMOV-LABEL: atomic_fetch_min32:430; X86-NOCMOV: # %bb.0:431; X86-NOCMOV-NEXT: subl $16, %esp432; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax433; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill434; X86-NOCMOV-NEXT: movl sc32, %eax435; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill436; X86-NOCMOV-NEXT: .LBB7_1: # %atomicrmw.start437; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1438; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload439; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload440; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill441; X86-NOCMOV-NEXT: movl %eax, %ecx442; X86-NOCMOV-NEXT: subl %edx, %ecx443; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill444; X86-NOCMOV-NEXT: jle .LBB7_4445; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start446; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1447; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload448; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill449; X86-NOCMOV-NEXT: .LBB7_4: # %atomicrmw.start450; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1451; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload452; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload453; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32454; X86-NOCMOV-NEXT: sete %cl455; X86-NOCMOV-NEXT: testb $1, %cl456; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill457; X86-NOCMOV-NEXT: jne .LBB7_2458; X86-NOCMOV-NEXT: jmp .LBB7_1459; X86-NOCMOV-NEXT: .LBB7_2: # %atomicrmw.end460; X86-NOCMOV-NEXT: addl $16, %esp461; X86-NOCMOV-NEXT: retl462;463; X86-NOX87-LABEL: atomic_fetch_min32:464; X86-NOX87: # %bb.0:465; X86-NOX87-NEXT: subl $16, %esp466; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax467; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill468; X86-NOX87-NEXT: movl sc32, %eax469; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill470; X86-NOX87-NEXT: .LBB7_1: # %atomicrmw.start471; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1472; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload473; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload474; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill475; X86-NOX87-NEXT: movl %eax, %ecx476; X86-NOX87-NEXT: subl %edx, %ecx477; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill478; X86-NOX87-NEXT: jle .LBB7_4479; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start480; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1481; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload482; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill483; X86-NOX87-NEXT: .LBB7_4: # %atomicrmw.start484; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1485; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload486; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload487; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32488; X86-NOX87-NEXT: sete %cl489; X86-NOX87-NEXT: testb $1, %cl490; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill491; X86-NOX87-NEXT: jne .LBB7_2492; X86-NOX87-NEXT: jmp .LBB7_1493; X86-NOX87-NEXT: .LBB7_2: # %atomicrmw.end494; X86-NOX87-NEXT: addl $16, %esp495; X86-NOX87-NEXT: retl496 %t1 = atomicrmw min ptr @sc32, i32 %x acquire497 ret void498}499 500define void @atomic_fetch_umax32(i32 %x) nounwind {501; X64-LABEL: atomic_fetch_umax32:502; X64: # %bb.0:503; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill504; X64-NEXT: movl sc32, %eax505; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill506; X64-NEXT: .LBB8_1: # %atomicrmw.start507; X64-NEXT: # =>This Inner Loop Header: Depth=1508; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload509; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload510; X64-NEXT: movl %eax, %edx511; X64-NEXT: subl %ecx, %edx512; X64-NEXT: cmoval %eax, %ecx513; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)514; X64-NEXT: sete %cl515; X64-NEXT: testb $1, %cl516; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill517; X64-NEXT: jne .LBB8_2518; X64-NEXT: jmp .LBB8_1519; X64-NEXT: .LBB8_2: # %atomicrmw.end520; X64-NEXT: retq521;522; X86-CMOV-LABEL: atomic_fetch_umax32:523; X86-CMOV: # %bb.0:524; X86-CMOV-NEXT: subl $8, %esp525; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax526; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill527; X86-CMOV-NEXT: movl sc32, %eax528; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill529; X86-CMOV-NEXT: .LBB8_1: # %atomicrmw.start530; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1531; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload532; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload533; X86-CMOV-NEXT: movl %eax, %edx534; X86-CMOV-NEXT: subl %ecx, %edx535; X86-CMOV-NEXT: cmoval %eax, %ecx536; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32537; X86-CMOV-NEXT: sete %cl538; X86-CMOV-NEXT: testb $1, %cl539; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill540; X86-CMOV-NEXT: jne .LBB8_2541; X86-CMOV-NEXT: jmp .LBB8_1542; X86-CMOV-NEXT: .LBB8_2: # %atomicrmw.end543; X86-CMOV-NEXT: addl $8, %esp544; X86-CMOV-NEXT: retl545;546; X86-NOCMOV-LABEL: atomic_fetch_umax32:547; X86-NOCMOV: # %bb.0:548; X86-NOCMOV-NEXT: subl $16, %esp549; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax550; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill551; X86-NOCMOV-NEXT: movl sc32, %eax552; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill553; X86-NOCMOV-NEXT: .LBB8_1: # %atomicrmw.start554; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1555; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload556; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload557; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill558; X86-NOCMOV-NEXT: movl %eax, %ecx559; X86-NOCMOV-NEXT: subl %edx, %ecx560; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill561; X86-NOCMOV-NEXT: ja .LBB8_4562; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start563; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1564; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload565; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill566; X86-NOCMOV-NEXT: .LBB8_4: # %atomicrmw.start567; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1568; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload569; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload570; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32571; X86-NOCMOV-NEXT: sete %cl572; X86-NOCMOV-NEXT: testb $1, %cl573; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill574; X86-NOCMOV-NEXT: jne .LBB8_2575; X86-NOCMOV-NEXT: jmp .LBB8_1576; X86-NOCMOV-NEXT: .LBB8_2: # %atomicrmw.end577; X86-NOCMOV-NEXT: addl $16, %esp578; X86-NOCMOV-NEXT: retl579;580; X86-NOX87-LABEL: atomic_fetch_umax32:581; X86-NOX87: # %bb.0:582; X86-NOX87-NEXT: subl $16, %esp583; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax584; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill585; X86-NOX87-NEXT: movl sc32, %eax586; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill587; X86-NOX87-NEXT: .LBB8_1: # %atomicrmw.start588; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1589; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload590; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload591; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill592; X86-NOX87-NEXT: movl %eax, %ecx593; X86-NOX87-NEXT: subl %edx, %ecx594; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill595; X86-NOX87-NEXT: ja .LBB8_4596; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start597; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1598; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload599; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill600; X86-NOX87-NEXT: .LBB8_4: # %atomicrmw.start601; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1602; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload603; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload604; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32605; X86-NOX87-NEXT: sete %cl606; X86-NOX87-NEXT: testb $1, %cl607; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill608; X86-NOX87-NEXT: jne .LBB8_2609; X86-NOX87-NEXT: jmp .LBB8_1610; X86-NOX87-NEXT: .LBB8_2: # %atomicrmw.end611; X86-NOX87-NEXT: addl $16, %esp612; X86-NOX87-NEXT: retl613 %t1 = atomicrmw umax ptr @sc32, i32 %x acquire614 ret void615}616 617define void @atomic_fetch_umin32(i32 %x) nounwind {618; X64-LABEL: atomic_fetch_umin32:619; X64: # %bb.0:620; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill621; X64-NEXT: movl sc32, %eax622; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill623; X64-NEXT: .LBB9_1: # %atomicrmw.start624; X64-NEXT: # =>This Inner Loop Header: Depth=1625; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload626; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload627; X64-NEXT: movl %eax, %edx628; X64-NEXT: subl %ecx, %edx629; X64-NEXT: cmovbel %eax, %ecx630; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)631; X64-NEXT: sete %cl632; X64-NEXT: testb $1, %cl633; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill634; X64-NEXT: jne .LBB9_2635; X64-NEXT: jmp .LBB9_1636; X64-NEXT: .LBB9_2: # %atomicrmw.end637; X64-NEXT: retq638;639; X86-CMOV-LABEL: atomic_fetch_umin32:640; X86-CMOV: # %bb.0:641; X86-CMOV-NEXT: subl $8, %esp642; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax643; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill644; X86-CMOV-NEXT: movl sc32, %eax645; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill646; X86-CMOV-NEXT: .LBB9_1: # %atomicrmw.start647; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1648; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload649; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload650; X86-CMOV-NEXT: movl %eax, %edx651; X86-CMOV-NEXT: subl %ecx, %edx652; X86-CMOV-NEXT: cmovbel %eax, %ecx653; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32654; X86-CMOV-NEXT: sete %cl655; X86-CMOV-NEXT: testb $1, %cl656; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill657; X86-CMOV-NEXT: jne .LBB9_2658; X86-CMOV-NEXT: jmp .LBB9_1659; X86-CMOV-NEXT: .LBB9_2: # %atomicrmw.end660; X86-CMOV-NEXT: addl $8, %esp661; X86-CMOV-NEXT: retl662;663; X86-NOCMOV-LABEL: atomic_fetch_umin32:664; X86-NOCMOV: # %bb.0:665; X86-NOCMOV-NEXT: subl $16, %esp666; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax667; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill668; X86-NOCMOV-NEXT: movl sc32, %eax669; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill670; X86-NOCMOV-NEXT: .LBB9_1: # %atomicrmw.start671; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1672; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload673; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload674; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill675; X86-NOCMOV-NEXT: movl %eax, %ecx676; X86-NOCMOV-NEXT: subl %edx, %ecx677; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill678; X86-NOCMOV-NEXT: jbe .LBB9_4679; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start680; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1681; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload682; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill683; X86-NOCMOV-NEXT: .LBB9_4: # %atomicrmw.start684; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1685; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload686; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload687; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32688; X86-NOCMOV-NEXT: sete %cl689; X86-NOCMOV-NEXT: testb $1, %cl690; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill691; X86-NOCMOV-NEXT: jne .LBB9_2692; X86-NOCMOV-NEXT: jmp .LBB9_1693; X86-NOCMOV-NEXT: .LBB9_2: # %atomicrmw.end694; X86-NOCMOV-NEXT: addl $16, %esp695; X86-NOCMOV-NEXT: retl696;697; X86-NOX87-LABEL: atomic_fetch_umin32:698; X86-NOX87: # %bb.0:699; X86-NOX87-NEXT: subl $16, %esp700; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax701; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill702; X86-NOX87-NEXT: movl sc32, %eax703; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill704; X86-NOX87-NEXT: .LBB9_1: # %atomicrmw.start705; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1706; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload707; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload708; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill709; X86-NOX87-NEXT: movl %eax, %ecx710; X86-NOX87-NEXT: subl %edx, %ecx711; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill712; X86-NOX87-NEXT: jbe .LBB9_4713; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start714; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1715; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload716; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill717; X86-NOX87-NEXT: .LBB9_4: # %atomicrmw.start718; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1719; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload720; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload721; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32722; X86-NOX87-NEXT: sete %cl723; X86-NOX87-NEXT: testb $1, %cl724; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill725; X86-NOX87-NEXT: jne .LBB9_2726; X86-NOX87-NEXT: jmp .LBB9_1727; X86-NOX87-NEXT: .LBB9_2: # %atomicrmw.end728; X86-NOX87-NEXT: addl $16, %esp729; X86-NOX87-NEXT: retl730 %t1 = atomicrmw umin ptr @sc32, i32 %x acquire731 ret void732}733 734define void @atomic_fetch_cmpxchg32() nounwind {735; X64-LABEL: atomic_fetch_cmpxchg32:736; X64: # %bb.0:737; X64-NEXT: xorl %eax, %eax738; X64-NEXT: movl $1, %ecx739; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip)740; X64-NEXT: retq741;742; X86-LABEL: atomic_fetch_cmpxchg32:743; X86: # %bb.0:744; X86-NEXT: xorl %eax, %eax745; X86-NEXT: movl $1, %ecx746; X86-NEXT: lock cmpxchgl %ecx, sc32747; X86-NEXT: retl748 %t1 = cmpxchg ptr @sc32, i32 0, i32 1 acquire acquire749 ret void750}751 752define void @atomic_fetch_store32(i32 %x) nounwind {753; X64-LABEL: atomic_fetch_store32:754; X64: # %bb.0:755; X64-NEXT: movl %edi, sc32(%rip)756; X64-NEXT: retq757;758; X86-LABEL: atomic_fetch_store32:759; X86: # %bb.0:760; X86-NEXT: movl {{[0-9]+}}(%esp), %eax761; X86-NEXT: movl %eax, sc32762; X86-NEXT: retl763 store atomic i32 %x, ptr @sc32 release, align 4764 ret void765}766 767define void @atomic_fetch_swap32(i32 %x) nounwind {768; X64-LABEL: atomic_fetch_swap32:769; X64: # %bb.0:770; X64-NEXT: xchgl %edi, sc32(%rip)771; X64-NEXT: retq772;773; X86-LABEL: atomic_fetch_swap32:774; X86: # %bb.0:775; X86-NEXT: movl {{[0-9]+}}(%esp), %eax776; X86-NEXT: xchgl %eax, sc32777; X86-NEXT: retl778 %t1 = atomicrmw xchg ptr @sc32, i32 %x acquire779 ret void780}781 782define void @atomic_fetch_swapf32(float %x) nounwind {783; X64-LABEL: atomic_fetch_swapf32:784; X64: # %bb.0:785; X64-NEXT: movd %xmm0, %eax786; X64-NEXT: xchgl %eax, fsc32(%rip)787; X64-NEXT: retq788;789; X86-CMOV-LABEL: atomic_fetch_swapf32:790; X86-CMOV: # %bb.0:791; X86-CMOV-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero792; X86-CMOV-NEXT: movd %xmm0, %eax793; X86-CMOV-NEXT: xchgl %eax, fsc32794; X86-CMOV-NEXT: retl795;796; X86-NOCMOV-LABEL: atomic_fetch_swapf32:797; X86-NOCMOV: # %bb.0:798; X86-NOCMOV-NEXT: pushl %eax799; X86-NOCMOV-NEXT: flds {{[0-9]+}}(%esp)800; X86-NOCMOV-NEXT: fstps (%esp)801; X86-NOCMOV-NEXT: movl (%esp), %eax802; X86-NOCMOV-NEXT: xchgl %eax, fsc32803; X86-NOCMOV-NEXT: popl %eax804; X86-NOCMOV-NEXT: retl805;806; X86-NOX87-LABEL: atomic_fetch_swapf32:807; X86-NOX87: # %bb.0:808; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax809; X86-NOX87-NEXT: xchgl %eax, fsc32810; X86-NOX87-NEXT: retl811 %t1 = atomicrmw xchg ptr @fsc32, float %x acquire812 ret void813}814