1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix=X64 3; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefixes=X86,X86-CMOV 4; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOCMOV 5; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse,-x87 -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOX87 6 7@sc32 = external dso_local global i32 8@fsc32 = external dso_local global float 9 10define void @atomic_fetch_add32() nounwind { 11; X64-LABEL: atomic_fetch_add32: 12; X64: # %bb.0: # %entry 13; X64-NEXT: lock incl {{.*}}(%rip) 14; X64-NEXT: lock addl $3, {{.*}}(%rip) 15; X64-NEXT: movl $5, %eax 16; X64-NEXT: lock xaddl %eax, {{.*}}(%rip) 17; X64-NEXT: lock addl %eax, {{.*}}(%rip) 18; X64-NEXT: retq 19; 20; X86-LABEL: atomic_fetch_add32: 21; X86: # %bb.0: # %entry 22; X86-NEXT: lock incl sc32 23; X86-NEXT: lock addl $3, sc32 24; X86-NEXT: movl $5, %eax 25; X86-NEXT: lock xaddl %eax, sc32 26; X86-NEXT: lock addl %eax, sc32 27; X86-NEXT: retl 28entry: 29 %t1 = atomicrmw add i32* @sc32, i32 1 acquire 30 %t2 = atomicrmw add i32* @sc32, i32 3 acquire 31 %t3 = atomicrmw add i32* @sc32, i32 5 acquire 32 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire 33 ret void 34} 35 36define void @atomic_fetch_sub32() nounwind { 37; X64-LABEL: atomic_fetch_sub32: 38; X64: # %bb.0: 39; X64-NEXT: lock decl {{.*}}(%rip) 40; X64-NEXT: lock subl $3, {{.*}}(%rip) 41; X64-NEXT: movl $-5, %eax 42; X64-NEXT: lock xaddl %eax, {{.*}}(%rip) 43; X64-NEXT: lock subl %eax, {{.*}}(%rip) 44; X64-NEXT: retq 45; 46; X86-LABEL: atomic_fetch_sub32: 47; X86: # %bb.0: 48; X86-NEXT: lock decl sc32 49; X86-NEXT: lock subl $3, sc32 50; X86-NEXT: movl $-5, %eax 51; X86-NEXT: lock xaddl %eax, sc32 52; X86-NEXT: lock subl %eax, sc32 53; X86-NEXT: retl 54 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire 55 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire 56 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire 57 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire 58 ret void 59} 60 61define void @atomic_fetch_and32() nounwind { 62; X64-LABEL: atomic_fetch_and32: 63; X64: # %bb.0: 64; X64-NEXT: lock andl $3, {{.*}}(%rip) 65; X64-NEXT: movl sc32, %eax 66; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 67; X64-NEXT: .LBB2_1: # %atomicrmw.start 68; X64-NEXT: # =>This Inner Loop Header: Depth=1 69; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 70; X64-NEXT: movl %eax, %ecx 71; X64-NEXT: andl $5, %ecx 72; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 73; X64-NEXT: sete %cl 74; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 75; X64-NEXT: testb $1, %cl 76; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 77; X64-NEXT: jne .LBB2_2 78; X64-NEXT: jmp .LBB2_1 79; X64-NEXT: .LBB2_2: # %atomicrmw.end 80; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 81; X64-NEXT: lock andl %eax, {{.*}}(%rip) 82; X64-NEXT: retq 83; 84; X86-LABEL: atomic_fetch_and32: 85; X86: # %bb.0: 86; X86-NEXT: subl $8, %esp 87; X86-NEXT: lock andl $3, sc32 88; X86-NEXT: movl sc32, %eax 89; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 90; X86-NEXT: .LBB2_1: # %atomicrmw.start 91; X86-NEXT: # =>This Inner Loop Header: Depth=1 92; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 93; X86-NEXT: movl %eax, %ecx 94; X86-NEXT: andl $5, %ecx 95; X86-NEXT: lock cmpxchgl %ecx, sc32 96; X86-NEXT: sete %cl 97; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 98; X86-NEXT: testb $1, %cl 99; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 100; X86-NEXT: jne .LBB2_2 101; X86-NEXT: jmp .LBB2_1 102; X86-NEXT: .LBB2_2: # %atomicrmw.end 103; X86-NEXT: movl (%esp), %eax # 4-byte Reload 104; X86-NEXT: lock andl %eax, sc32 105; X86-NEXT: addl $8, %esp 106; X86-NEXT: retl 107 %t1 = atomicrmw and i32* @sc32, i32 3 acquire 108 %t2 = atomicrmw and i32* @sc32, i32 5 acquire 109 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire 110 ret void 111} 112 113define void @atomic_fetch_or32() nounwind { 114; X64-LABEL: atomic_fetch_or32: 115; X64: # %bb.0: 116; X64-NEXT: lock orl $3, {{.*}}(%rip) 117; X64-NEXT: movl sc32, %eax 118; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 119; X64-NEXT: .LBB3_1: # %atomicrmw.start 120; X64-NEXT: # =>This Inner Loop Header: Depth=1 121; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 122; X64-NEXT: movl %eax, %ecx 123; X64-NEXT: orl $5, %ecx 124; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 125; X64-NEXT: sete %cl 126; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 127; X64-NEXT: testb $1, %cl 128; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 129; X64-NEXT: jne .LBB3_2 130; X64-NEXT: jmp .LBB3_1 131; X64-NEXT: .LBB3_2: # %atomicrmw.end 132; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 133; X64-NEXT: lock orl %eax, {{.*}}(%rip) 134; X64-NEXT: retq 135; 136; X86-LABEL: atomic_fetch_or32: 137; X86: # %bb.0: 138; X86-NEXT: subl $8, %esp 139; X86-NEXT: lock orl $3, sc32 140; X86-NEXT: movl sc32, %eax 141; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 142; X86-NEXT: .LBB3_1: # %atomicrmw.start 143; X86-NEXT: # =>This Inner Loop Header: Depth=1 144; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 145; X86-NEXT: movl %eax, %ecx 146; X86-NEXT: orl $5, %ecx 147; X86-NEXT: lock cmpxchgl %ecx, sc32 148; X86-NEXT: sete %cl 149; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 150; X86-NEXT: testb $1, %cl 151; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 152; X86-NEXT: jne .LBB3_2 153; X86-NEXT: jmp .LBB3_1 154; X86-NEXT: .LBB3_2: # %atomicrmw.end 155; X86-NEXT: movl (%esp), %eax # 4-byte Reload 156; X86-NEXT: lock orl %eax, sc32 157; X86-NEXT: addl $8, %esp 158; X86-NEXT: retl 159 %t1 = atomicrmw or i32* @sc32, i32 3 acquire 160 %t2 = atomicrmw or i32* @sc32, i32 5 acquire 161 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire 162 ret void 163} 164 165define void @atomic_fetch_xor32() nounwind { 166; X64-LABEL: atomic_fetch_xor32: 167; X64: # %bb.0: 168; X64-NEXT: lock xorl $3, {{.*}}(%rip) 169; X64-NEXT: movl sc32, %eax 170; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 171; X64-NEXT: .LBB4_1: # %atomicrmw.start 172; X64-NEXT: # =>This Inner Loop Header: Depth=1 173; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 174; X64-NEXT: movl %eax, %ecx 175; X64-NEXT: xorl $5, %ecx 176; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 177; X64-NEXT: sete %cl 178; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 179; X64-NEXT: testb $1, %cl 180; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 181; X64-NEXT: jne .LBB4_2 182; X64-NEXT: jmp .LBB4_1 183; X64-NEXT: .LBB4_2: # %atomicrmw.end 184; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 185; X64-NEXT: lock xorl %eax, {{.*}}(%rip) 186; X64-NEXT: retq 187; 188; X86-LABEL: atomic_fetch_xor32: 189; X86: # %bb.0: 190; X86-NEXT: subl $8, %esp 191; X86-NEXT: lock xorl $3, sc32 192; X86-NEXT: movl sc32, %eax 193; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 194; X86-NEXT: .LBB4_1: # %atomicrmw.start 195; X86-NEXT: # =>This Inner Loop Header: Depth=1 196; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 197; X86-NEXT: movl %eax, %ecx 198; X86-NEXT: xorl $5, %ecx 199; X86-NEXT: lock cmpxchgl %ecx, sc32 200; X86-NEXT: sete %cl 201; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 202; X86-NEXT: testb $1, %cl 203; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 204; X86-NEXT: jne .LBB4_2 205; X86-NEXT: jmp .LBB4_1 206; X86-NEXT: .LBB4_2: # %atomicrmw.end 207; X86-NEXT: movl (%esp), %eax # 4-byte Reload 208; X86-NEXT: lock xorl %eax, sc32 209; X86-NEXT: addl $8, %esp 210; X86-NEXT: retl 211 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire 212 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire 213 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire 214 ret void 215} 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 Spill 221; X64-NEXT: movl sc32, %eax 222; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 223; X64-NEXT: .LBB5_1: # %atomicrmw.start 224; X64-NEXT: # =>This Inner Loop Header: Depth=1 225; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 226; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload 227; X64-NEXT: movl %eax, %ecx 228; X64-NEXT: andl %edx, %ecx 229; X64-NEXT: movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 230; X64-NEXT: notl %ecx 231; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 232; X64-NEXT: sete %cl 233; X64-NEXT: testb $1, %cl 234; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 235; X64-NEXT: jne .LBB5_2 236; X64-NEXT: jmp .LBB5_1 237; X64-NEXT: .LBB5_2: # %atomicrmw.end 238; X64-NEXT: retq 239; 240; X86-LABEL: atomic_fetch_nand32: 241; X86: # %bb.0: 242; X86-NEXT: subl $12, %esp 243; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 244; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 245; X86-NEXT: movl sc32, %eax 246; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 247; X86-NEXT: .LBB5_1: # %atomicrmw.start 248; X86-NEXT: # =>This Inner Loop Header: Depth=1 249; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 250; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 251; X86-NEXT: movl %eax, %ecx 252; X86-NEXT: andl %edx, %ecx 253; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill 254; X86-NEXT: notl %ecx 255; X86-NEXT: lock cmpxchgl %ecx, sc32 256; X86-NEXT: sete %cl 257; X86-NEXT: testb $1, %cl 258; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 259; X86-NEXT: jne .LBB5_2 260; X86-NEXT: jmp .LBB5_1 261; X86-NEXT: .LBB5_2: # %atomicrmw.end 262; X86-NEXT: addl $12, %esp 263; X86-NEXT: retl 264 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire 265 ret void 266} 267 268define void @atomic_fetch_max32(i32 %x) nounwind { 269; X64-LABEL: atomic_fetch_max32: 270; X64: # %bb.0: 271; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 272; X64-NEXT: movl sc32, %eax 273; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 274; X64-NEXT: .LBB6_1: # %atomicrmw.start 275; X64-NEXT: # =>This Inner Loop Header: Depth=1 276; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 277; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 278; X64-NEXT: movl %eax, %edx 279; X64-NEXT: subl %ecx, %edx 280; X64-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 281; X64-NEXT: cmovgl %eax, %ecx 282; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 283; X64-NEXT: sete %cl 284; X64-NEXT: testb $1, %cl 285; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 286; X64-NEXT: jne .LBB6_2 287; X64-NEXT: jmp .LBB6_1 288; X64-NEXT: .LBB6_2: # %atomicrmw.end 289; X64-NEXT: retq 290; 291; X86-CMOV-LABEL: atomic_fetch_max32: 292; X86-CMOV: # %bb.0: 293; X86-CMOV-NEXT: subl $12, %esp 294; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 295; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 296; X86-CMOV-NEXT: movl sc32, %eax 297; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 298; X86-CMOV-NEXT: .LBB6_1: # %atomicrmw.start 299; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 300; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 301; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 302; X86-CMOV-NEXT: movl %eax, %edx 303; X86-CMOV-NEXT: subl %ecx, %edx 304; X86-CMOV-NEXT: movl %edx, (%esp) # 4-byte Spill 305; X86-CMOV-NEXT: cmovgl %eax, %ecx 306; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 307; X86-CMOV-NEXT: sete %cl 308; X86-CMOV-NEXT: testb $1, %cl 309; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 310; X86-CMOV-NEXT: jne .LBB6_2 311; X86-CMOV-NEXT: jmp .LBB6_1 312; X86-CMOV-NEXT: .LBB6_2: # %atomicrmw.end 313; X86-CMOV-NEXT: addl $12, %esp 314; X86-CMOV-NEXT: retl 315; 316; X86-NOCMOV-LABEL: atomic_fetch_max32: 317; X86-NOCMOV: # %bb.0: 318; X86-NOCMOV-NEXT: subl $16, %esp 319; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 320; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 321; X86-NOCMOV-NEXT: movl sc32, %eax 322; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 323; X86-NOCMOV-NEXT: .LBB6_1: # %atomicrmw.start 324; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 325; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 326; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 327; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 328; X86-NOCMOV-NEXT: movl %eax, %ecx 329; X86-NOCMOV-NEXT: subl %edx, %ecx 330; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 331; X86-NOCMOV-NEXT: jg .LBB6_4 332; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 333; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1 334; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 335; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 336; X86-NOCMOV-NEXT: .LBB6_4: # %atomicrmw.start 337; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1 338; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 339; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 340; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 341; X86-NOCMOV-NEXT: sete %cl 342; X86-NOCMOV-NEXT: testb $1, %cl 343; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 344; X86-NOCMOV-NEXT: jne .LBB6_2 345; X86-NOCMOV-NEXT: jmp .LBB6_1 346; X86-NOCMOV-NEXT: .LBB6_2: # %atomicrmw.end 347; X86-NOCMOV-NEXT: addl $16, %esp 348; X86-NOCMOV-NEXT: retl 349; 350; X86-NOX87-LABEL: atomic_fetch_max32: 351; X86-NOX87: # %bb.0: 352; X86-NOX87-NEXT: subl $16, %esp 353; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 354; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 355; X86-NOX87-NEXT: movl sc32, %eax 356; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 357; X86-NOX87-NEXT: .LBB6_1: # %atomicrmw.start 358; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 359; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 360; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 361; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 362; X86-NOX87-NEXT: movl %eax, %ecx 363; X86-NOX87-NEXT: subl %edx, %ecx 364; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 365; X86-NOX87-NEXT: jg .LBB6_4 366; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 367; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1 368; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 369; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 370; X86-NOX87-NEXT: .LBB6_4: # %atomicrmw.start 371; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1 372; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 373; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 374; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 375; X86-NOX87-NEXT: sete %cl 376; X86-NOX87-NEXT: testb $1, %cl 377; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 378; X86-NOX87-NEXT: jne .LBB6_2 379; X86-NOX87-NEXT: jmp .LBB6_1 380; X86-NOX87-NEXT: .LBB6_2: # %atomicrmw.end 381; X86-NOX87-NEXT: addl $16, %esp 382; X86-NOX87-NEXT: retl 383 %t1 = atomicrmw max i32* @sc32, i32 %x acquire 384 ret void 385} 386 387define void @atomic_fetch_min32(i32 %x) nounwind { 388; X64-LABEL: atomic_fetch_min32: 389; X64: # %bb.0: 390; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 391; X64-NEXT: movl sc32, %eax 392; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 393; X64-NEXT: .LBB7_1: # %atomicrmw.start 394; X64-NEXT: # =>This Inner Loop Header: Depth=1 395; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 396; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 397; X64-NEXT: movl %eax, %edx 398; X64-NEXT: subl %ecx, %edx 399; X64-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 400; X64-NEXT: cmovlel %eax, %ecx 401; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 402; X64-NEXT: sete %cl 403; X64-NEXT: testb $1, %cl 404; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 405; X64-NEXT: jne .LBB7_2 406; X64-NEXT: jmp .LBB7_1 407; X64-NEXT: .LBB7_2: # %atomicrmw.end 408; X64-NEXT: retq 409; 410; X86-CMOV-LABEL: atomic_fetch_min32: 411; X86-CMOV: # %bb.0: 412; X86-CMOV-NEXT: subl $12, %esp 413; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 414; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 415; X86-CMOV-NEXT: movl sc32, %eax 416; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 417; X86-CMOV-NEXT: .LBB7_1: # %atomicrmw.start 418; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 419; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 420; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 421; X86-CMOV-NEXT: movl %eax, %edx 422; X86-CMOV-NEXT: subl %ecx, %edx 423; X86-CMOV-NEXT: movl %edx, (%esp) # 4-byte Spill 424; X86-CMOV-NEXT: cmovlel %eax, %ecx 425; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 426; X86-CMOV-NEXT: sete %cl 427; X86-CMOV-NEXT: testb $1, %cl 428; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 429; X86-CMOV-NEXT: jne .LBB7_2 430; X86-CMOV-NEXT: jmp .LBB7_1 431; X86-CMOV-NEXT: .LBB7_2: # %atomicrmw.end 432; X86-CMOV-NEXT: addl $12, %esp 433; X86-CMOV-NEXT: retl 434; 435; X86-NOCMOV-LABEL: atomic_fetch_min32: 436; X86-NOCMOV: # %bb.0: 437; X86-NOCMOV-NEXT: subl $16, %esp 438; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 439; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 440; X86-NOCMOV-NEXT: movl sc32, %eax 441; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 442; X86-NOCMOV-NEXT: .LBB7_1: # %atomicrmw.start 443; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 444; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 445; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 446; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 447; X86-NOCMOV-NEXT: movl %eax, %ecx 448; X86-NOCMOV-NEXT: subl %edx, %ecx 449; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 450; X86-NOCMOV-NEXT: jle .LBB7_4 451; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 452; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1 453; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 454; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 455; X86-NOCMOV-NEXT: .LBB7_4: # %atomicrmw.start 456; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1 457; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 458; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 459; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 460; X86-NOCMOV-NEXT: sete %cl 461; X86-NOCMOV-NEXT: testb $1, %cl 462; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 463; X86-NOCMOV-NEXT: jne .LBB7_2 464; X86-NOCMOV-NEXT: jmp .LBB7_1 465; X86-NOCMOV-NEXT: .LBB7_2: # %atomicrmw.end 466; X86-NOCMOV-NEXT: addl $16, %esp 467; X86-NOCMOV-NEXT: retl 468; 469; X86-NOX87-LABEL: atomic_fetch_min32: 470; X86-NOX87: # %bb.0: 471; X86-NOX87-NEXT: subl $16, %esp 472; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 473; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 474; X86-NOX87-NEXT: movl sc32, %eax 475; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 476; X86-NOX87-NEXT: .LBB7_1: # %atomicrmw.start 477; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 478; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 479; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 480; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 481; X86-NOX87-NEXT: movl %eax, %ecx 482; X86-NOX87-NEXT: subl %edx, %ecx 483; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 484; X86-NOX87-NEXT: jle .LBB7_4 485; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 486; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1 487; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 488; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 489; X86-NOX87-NEXT: .LBB7_4: # %atomicrmw.start 490; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1 491; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 492; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 493; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 494; X86-NOX87-NEXT: sete %cl 495; X86-NOX87-NEXT: testb $1, %cl 496; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 497; X86-NOX87-NEXT: jne .LBB7_2 498; X86-NOX87-NEXT: jmp .LBB7_1 499; X86-NOX87-NEXT: .LBB7_2: # %atomicrmw.end 500; X86-NOX87-NEXT: addl $16, %esp 501; X86-NOX87-NEXT: retl 502 %t1 = atomicrmw min i32* @sc32, i32 %x acquire 503 ret void 504} 505 506define void @atomic_fetch_umax32(i32 %x) nounwind { 507; X64-LABEL: atomic_fetch_umax32: 508; X64: # %bb.0: 509; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 510; X64-NEXT: movl sc32, %eax 511; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 512; X64-NEXT: .LBB8_1: # %atomicrmw.start 513; X64-NEXT: # =>This Inner Loop Header: Depth=1 514; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 515; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 516; X64-NEXT: movl %eax, %edx 517; X64-NEXT: subl %ecx, %edx 518; X64-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 519; X64-NEXT: cmoval %eax, %ecx 520; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 521; X64-NEXT: sete %cl 522; X64-NEXT: testb $1, %cl 523; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 524; X64-NEXT: jne .LBB8_2 525; X64-NEXT: jmp .LBB8_1 526; X64-NEXT: .LBB8_2: # %atomicrmw.end 527; X64-NEXT: retq 528; 529; X86-CMOV-LABEL: atomic_fetch_umax32: 530; X86-CMOV: # %bb.0: 531; X86-CMOV-NEXT: subl $12, %esp 532; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 533; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 534; X86-CMOV-NEXT: movl sc32, %eax 535; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 536; X86-CMOV-NEXT: .LBB8_1: # %atomicrmw.start 537; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 538; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 539; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 540; X86-CMOV-NEXT: movl %eax, %edx 541; X86-CMOV-NEXT: subl %ecx, %edx 542; X86-CMOV-NEXT: movl %edx, (%esp) # 4-byte Spill 543; X86-CMOV-NEXT: cmoval %eax, %ecx 544; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 545; X86-CMOV-NEXT: sete %cl 546; X86-CMOV-NEXT: testb $1, %cl 547; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 548; X86-CMOV-NEXT: jne .LBB8_2 549; X86-CMOV-NEXT: jmp .LBB8_1 550; X86-CMOV-NEXT: .LBB8_2: # %atomicrmw.end 551; X86-CMOV-NEXT: addl $12, %esp 552; X86-CMOV-NEXT: retl 553; 554; X86-NOCMOV-LABEL: atomic_fetch_umax32: 555; X86-NOCMOV: # %bb.0: 556; X86-NOCMOV-NEXT: subl $16, %esp 557; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 558; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 559; X86-NOCMOV-NEXT: movl sc32, %eax 560; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 561; X86-NOCMOV-NEXT: .LBB8_1: # %atomicrmw.start 562; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 563; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 564; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 565; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 566; X86-NOCMOV-NEXT: movl %eax, %ecx 567; X86-NOCMOV-NEXT: subl %edx, %ecx 568; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 569; X86-NOCMOV-NEXT: ja .LBB8_4 570; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 571; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1 572; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 573; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 574; X86-NOCMOV-NEXT: .LBB8_4: # %atomicrmw.start 575; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1 576; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 577; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 578; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 579; X86-NOCMOV-NEXT: sete %cl 580; X86-NOCMOV-NEXT: testb $1, %cl 581; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 582; X86-NOCMOV-NEXT: jne .LBB8_2 583; X86-NOCMOV-NEXT: jmp .LBB8_1 584; X86-NOCMOV-NEXT: .LBB8_2: # %atomicrmw.end 585; X86-NOCMOV-NEXT: addl $16, %esp 586; X86-NOCMOV-NEXT: retl 587; 588; X86-NOX87-LABEL: atomic_fetch_umax32: 589; X86-NOX87: # %bb.0: 590; X86-NOX87-NEXT: subl $16, %esp 591; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 592; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 593; X86-NOX87-NEXT: movl sc32, %eax 594; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 595; X86-NOX87-NEXT: .LBB8_1: # %atomicrmw.start 596; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 597; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 598; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 599; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 600; X86-NOX87-NEXT: movl %eax, %ecx 601; X86-NOX87-NEXT: subl %edx, %ecx 602; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 603; X86-NOX87-NEXT: ja .LBB8_4 604; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 605; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1 606; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 607; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 608; X86-NOX87-NEXT: .LBB8_4: # %atomicrmw.start 609; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1 610; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 611; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 612; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 613; X86-NOX87-NEXT: sete %cl 614; X86-NOX87-NEXT: testb $1, %cl 615; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 616; X86-NOX87-NEXT: jne .LBB8_2 617; X86-NOX87-NEXT: jmp .LBB8_1 618; X86-NOX87-NEXT: .LBB8_2: # %atomicrmw.end 619; X86-NOX87-NEXT: addl $16, %esp 620; X86-NOX87-NEXT: retl 621 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire 622 ret void 623} 624 625define void @atomic_fetch_umin32(i32 %x) nounwind { 626; X64-LABEL: atomic_fetch_umin32: 627; X64: # %bb.0: 628; X64-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 629; X64-NEXT: movl sc32, %eax 630; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 631; X64-NEXT: .LBB9_1: # %atomicrmw.start 632; X64-NEXT: # =>This Inner Loop Header: Depth=1 633; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 634; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 635; X64-NEXT: movl %eax, %edx 636; X64-NEXT: subl %ecx, %edx 637; X64-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 638; X64-NEXT: cmovbel %eax, %ecx 639; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 640; X64-NEXT: sete %cl 641; X64-NEXT: testb $1, %cl 642; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 643; X64-NEXT: jne .LBB9_2 644; X64-NEXT: jmp .LBB9_1 645; X64-NEXT: .LBB9_2: # %atomicrmw.end 646; X64-NEXT: retq 647; 648; X86-CMOV-LABEL: atomic_fetch_umin32: 649; X86-CMOV: # %bb.0: 650; X86-CMOV-NEXT: subl $12, %esp 651; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 652; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 653; X86-CMOV-NEXT: movl sc32, %eax 654; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 655; X86-CMOV-NEXT: .LBB9_1: # %atomicrmw.start 656; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 657; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 658; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 659; X86-CMOV-NEXT: movl %eax, %edx 660; X86-CMOV-NEXT: subl %ecx, %edx 661; X86-CMOV-NEXT: movl %edx, (%esp) # 4-byte Spill 662; X86-CMOV-NEXT: cmovbel %eax, %ecx 663; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 664; X86-CMOV-NEXT: sete %cl 665; X86-CMOV-NEXT: testb $1, %cl 666; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 667; X86-CMOV-NEXT: jne .LBB9_2 668; X86-CMOV-NEXT: jmp .LBB9_1 669; X86-CMOV-NEXT: .LBB9_2: # %atomicrmw.end 670; X86-CMOV-NEXT: addl $12, %esp 671; X86-CMOV-NEXT: retl 672; 673; X86-NOCMOV-LABEL: atomic_fetch_umin32: 674; X86-NOCMOV: # %bb.0: 675; X86-NOCMOV-NEXT: subl $16, %esp 676; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 677; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 678; X86-NOCMOV-NEXT: movl sc32, %eax 679; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 680; X86-NOCMOV-NEXT: .LBB9_1: # %atomicrmw.start 681; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 682; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 683; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 684; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 685; X86-NOCMOV-NEXT: movl %eax, %ecx 686; X86-NOCMOV-NEXT: subl %edx, %ecx 687; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 688; X86-NOCMOV-NEXT: jbe .LBB9_4 689; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 690; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1 691; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 692; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 693; X86-NOCMOV-NEXT: .LBB9_4: # %atomicrmw.start 694; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1 695; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 696; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 697; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 698; X86-NOCMOV-NEXT: sete %cl 699; X86-NOCMOV-NEXT: testb $1, %cl 700; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 701; X86-NOCMOV-NEXT: jne .LBB9_2 702; X86-NOCMOV-NEXT: jmp .LBB9_1 703; X86-NOCMOV-NEXT: .LBB9_2: # %atomicrmw.end 704; X86-NOCMOV-NEXT: addl $16, %esp 705; X86-NOCMOV-NEXT: retl 706; 707; X86-NOX87-LABEL: atomic_fetch_umin32: 708; X86-NOX87: # %bb.0: 709; X86-NOX87-NEXT: subl $16, %esp 710; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 711; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 712; X86-NOX87-NEXT: movl sc32, %eax 713; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 714; X86-NOX87-NEXT: .LBB9_1: # %atomicrmw.start 715; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 716; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 717; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 718; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 719; X86-NOX87-NEXT: movl %eax, %ecx 720; X86-NOX87-NEXT: subl %edx, %ecx 721; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 722; X86-NOX87-NEXT: jbe .LBB9_4 723; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 724; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1 725; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 726; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 727; X86-NOX87-NEXT: .LBB9_4: # %atomicrmw.start 728; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1 729; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 730; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 731; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 732; X86-NOX87-NEXT: sete %cl 733; X86-NOX87-NEXT: testb $1, %cl 734; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 735; X86-NOX87-NEXT: jne .LBB9_2 736; X86-NOX87-NEXT: jmp .LBB9_1 737; X86-NOX87-NEXT: .LBB9_2: # %atomicrmw.end 738; X86-NOX87-NEXT: addl $16, %esp 739; X86-NOX87-NEXT: retl 740 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire 741 ret void 742} 743 744define void @atomic_fetch_cmpxchg32() nounwind { 745; X64-LABEL: atomic_fetch_cmpxchg32: 746; X64: # %bb.0: 747; X64-NEXT: xorl %eax, %eax 748; X64-NEXT: movl $1, %ecx 749; X64-NEXT: lock cmpxchgl %ecx, {{.*}}(%rip) 750; X64-NEXT: retq 751; 752; X86-LABEL: atomic_fetch_cmpxchg32: 753; X86: # %bb.0: 754; X86-NEXT: xorl %eax, %eax 755; X86-NEXT: movl $1, %ecx 756; X86-NEXT: lock cmpxchgl %ecx, sc32 757; X86-NEXT: retl 758 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire 759 ret void 760} 761 762define void @atomic_fetch_store32(i32 %x) nounwind { 763; X64-LABEL: atomic_fetch_store32: 764; X64: # %bb.0: 765; X64-NEXT: movl %edi, {{.*}}(%rip) 766; X64-NEXT: retq 767; 768; X86-LABEL: atomic_fetch_store32: 769; X86: # %bb.0: 770; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 771; X86-NEXT: movl %eax, sc32 772; X86-NEXT: retl 773 store atomic i32 %x, i32* @sc32 release, align 4 774 ret void 775} 776 777define void @atomic_fetch_swap32(i32 %x) nounwind { 778; X64-LABEL: atomic_fetch_swap32: 779; X64: # %bb.0: 780; X64-NEXT: xchgl %edi, {{.*}}(%rip) 781; X64-NEXT: retq 782; 783; X86-LABEL: atomic_fetch_swap32: 784; X86: # %bb.0: 785; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 786; X86-NEXT: xchgl %eax, sc32 787; X86-NEXT: retl 788 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire 789 ret void 790} 791 792define void @atomic_fetch_swapf32(float %x) nounwind { 793; X64-LABEL: atomic_fetch_swapf32: 794; X64: # %bb.0: 795; X64-NEXT: movd %xmm0, %eax 796; X64-NEXT: xchgl %eax, {{.*}}(%rip) 797; X64-NEXT: retq 798; 799; X86-CMOV-LABEL: atomic_fetch_swapf32: 800; X86-CMOV: # %bb.0: 801; X86-CMOV-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 802; X86-CMOV-NEXT: movd %xmm0, %eax 803; X86-CMOV-NEXT: xchgl %eax, fsc32 804; X86-CMOV-NEXT: retl 805; 806; X86-NOCMOV-LABEL: atomic_fetch_swapf32: 807; X86-NOCMOV: # %bb.0: 808; X86-NOCMOV-NEXT: pushl %eax 809; X86-NOCMOV-NEXT: flds {{[0-9]+}}(%esp) 810; X86-NOCMOV-NEXT: fstps (%esp) 811; X86-NOCMOV-NEXT: movl (%esp), %eax 812; X86-NOCMOV-NEXT: xchgl %eax, fsc32 813; X86-NOCMOV-NEXT: popl %eax 814; X86-NOCMOV-NEXT: retl 815; 816; X86-NOX87-LABEL: atomic_fetch_swapf32: 817; X86-NOX87: # %bb.0: 818; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 819; X86-NOX87-NEXT: xchgl %eax, fsc32 820; X86-NOX87-NEXT: retl 821 %t1 = atomicrmw xchg float* @fsc32, float %x acquire 822 ret void 823} 824