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 sc32(%rip) 14; X64-NEXT: lock addl $3, sc32(%rip) 15; X64-NEXT: movl $5, %eax 16; X64-NEXT: lock xaddl %eax, sc32(%rip) 17; X64-NEXT: lock addl %eax, sc32(%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 ptr @sc32, i32 1 acquire 30 %t2 = atomicrmw add ptr @sc32, i32 3 acquire 31 %t3 = atomicrmw add ptr @sc32, i32 5 acquire 32 %t4 = atomicrmw add ptr @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 sc32(%rip) 40; X64-NEXT: lock subl $3, sc32(%rip) 41; X64-NEXT: movl $-5, %eax 42; X64-NEXT: lock xaddl %eax, sc32(%rip) 43; X64-NEXT: lock subl %eax, sc32(%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 ptr @sc32, i32 1 acquire 55 %t2 = atomicrmw sub ptr @sc32, i32 3 acquire 56 %t3 = atomicrmw sub ptr @sc32, i32 5 acquire 57 %t4 = atomicrmw sub ptr @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, sc32(%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, sc32(%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, sc32(%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 ptr @sc32, i32 3 acquire 108 %t2 = atomicrmw and ptr @sc32, i32 5 acquire 109 %t3 = atomicrmw and ptr @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, sc32(%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, sc32(%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, sc32(%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 ptr @sc32, i32 3 acquire 160 %t2 = atomicrmw or ptr @sc32, i32 5 acquire 161 %t3 = atomicrmw or ptr @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, sc32(%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, sc32(%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, sc32(%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 ptr @sc32, i32 3 acquire 212 %t2 = atomicrmw xor ptr @sc32, i32 5 acquire 213 %t3 = atomicrmw xor ptr @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: notl %ecx 230; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 231; X64-NEXT: sete %cl 232; X64-NEXT: testb $1, %cl 233; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 234; X64-NEXT: jne .LBB5_2 235; X64-NEXT: jmp .LBB5_1 236; X64-NEXT: .LBB5_2: # %atomicrmw.end 237; X64-NEXT: retq 238; 239; X86-LABEL: atomic_fetch_nand32: 240; X86: # %bb.0: 241; X86-NEXT: subl $8, %esp 242; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 243; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 244; X86-NEXT: movl sc32, %eax 245; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 246; X86-NEXT: .LBB5_1: # %atomicrmw.start 247; X86-NEXT: # =>This Inner Loop Header: Depth=1 248; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 249; X86-NEXT: movl (%esp), %edx # 4-byte Reload 250; X86-NEXT: movl %eax, %ecx 251; X86-NEXT: andl %edx, %ecx 252; X86-NEXT: notl %ecx 253; X86-NEXT: lock cmpxchgl %ecx, sc32 254; X86-NEXT: sete %cl 255; X86-NEXT: testb $1, %cl 256; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 257; X86-NEXT: jne .LBB5_2 258; X86-NEXT: jmp .LBB5_1 259; X86-NEXT: .LBB5_2: # %atomicrmw.end 260; X86-NEXT: addl $8, %esp 261; X86-NEXT: retl 262 %t1 = atomicrmw nand ptr @sc32, i32 %x acquire 263 ret void 264} 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 Spill 270; X64-NEXT: movl sc32, %eax 271; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 272; X64-NEXT: .LBB6_1: # %atomicrmw.start 273; X64-NEXT: # =>This Inner Loop Header: Depth=1 274; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 275; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 276; X64-NEXT: movl %eax, %edx 277; X64-NEXT: subl %ecx, %edx 278; X64-NEXT: cmovgl %eax, %ecx 279; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 280; X64-NEXT: sete %cl 281; X64-NEXT: testb $1, %cl 282; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 283; X64-NEXT: jne .LBB6_2 284; X64-NEXT: jmp .LBB6_1 285; X64-NEXT: .LBB6_2: # %atomicrmw.end 286; X64-NEXT: retq 287; 288; X86-CMOV-LABEL: atomic_fetch_max32: 289; X86-CMOV: # %bb.0: 290; X86-CMOV-NEXT: subl $8, %esp 291; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 292; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 293; X86-CMOV-NEXT: movl sc32, %eax 294; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 295; X86-CMOV-NEXT: .LBB6_1: # %atomicrmw.start 296; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 297; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 298; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload 299; X86-CMOV-NEXT: movl %eax, %edx 300; X86-CMOV-NEXT: subl %ecx, %edx 301; X86-CMOV-NEXT: cmovgl %eax, %ecx 302; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 303; X86-CMOV-NEXT: sete %cl 304; X86-CMOV-NEXT: testb $1, %cl 305; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 306; X86-CMOV-NEXT: jne .LBB6_2 307; X86-CMOV-NEXT: jmp .LBB6_1 308; X86-CMOV-NEXT: .LBB6_2: # %atomicrmw.end 309; X86-CMOV-NEXT: addl $8, %esp 310; X86-CMOV-NEXT: retl 311; 312; X86-NOCMOV-LABEL: atomic_fetch_max32: 313; X86-NOCMOV: # %bb.0: 314; X86-NOCMOV-NEXT: subl $16, %esp 315; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 316; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 317; X86-NOCMOV-NEXT: movl sc32, %eax 318; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 319; X86-NOCMOV-NEXT: .LBB6_1: # %atomicrmw.start 320; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 321; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 322; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 323; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 324; X86-NOCMOV-NEXT: movl %eax, %ecx 325; X86-NOCMOV-NEXT: subl %edx, %ecx 326; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 327; X86-NOCMOV-NEXT: jg .LBB6_4 328; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 329; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1 330; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 331; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 332; X86-NOCMOV-NEXT: .LBB6_4: # %atomicrmw.start 333; X86-NOCMOV-NEXT: # in Loop: Header=BB6_1 Depth=1 334; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 335; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 336; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 337; X86-NOCMOV-NEXT: sete %cl 338; X86-NOCMOV-NEXT: testb $1, %cl 339; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 340; X86-NOCMOV-NEXT: jne .LBB6_2 341; X86-NOCMOV-NEXT: jmp .LBB6_1 342; X86-NOCMOV-NEXT: .LBB6_2: # %atomicrmw.end 343; X86-NOCMOV-NEXT: addl $16, %esp 344; X86-NOCMOV-NEXT: retl 345; 346; X86-NOX87-LABEL: atomic_fetch_max32: 347; X86-NOX87: # %bb.0: 348; X86-NOX87-NEXT: subl $16, %esp 349; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 350; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 351; X86-NOX87-NEXT: movl sc32, %eax 352; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 353; X86-NOX87-NEXT: .LBB6_1: # %atomicrmw.start 354; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 355; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 356; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 357; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 358; X86-NOX87-NEXT: movl %eax, %ecx 359; X86-NOX87-NEXT: subl %edx, %ecx 360; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 361; X86-NOX87-NEXT: jg .LBB6_4 362; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 363; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1 364; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 365; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 366; X86-NOX87-NEXT: .LBB6_4: # %atomicrmw.start 367; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1 368; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 369; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 370; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 371; X86-NOX87-NEXT: sete %cl 372; X86-NOX87-NEXT: testb $1, %cl 373; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 374; X86-NOX87-NEXT: jne .LBB6_2 375; X86-NOX87-NEXT: jmp .LBB6_1 376; X86-NOX87-NEXT: .LBB6_2: # %atomicrmw.end 377; X86-NOX87-NEXT: addl $16, %esp 378; X86-NOX87-NEXT: retl 379 %t1 = atomicrmw max ptr @sc32, i32 %x acquire 380 ret void 381} 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 Spill 387; X64-NEXT: movl sc32, %eax 388; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 389; X64-NEXT: .LBB7_1: # %atomicrmw.start 390; X64-NEXT: # =>This Inner Loop Header: Depth=1 391; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 392; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 393; X64-NEXT: movl %eax, %edx 394; X64-NEXT: subl %ecx, %edx 395; X64-NEXT: cmovlel %eax, %ecx 396; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 397; X64-NEXT: sete %cl 398; X64-NEXT: testb $1, %cl 399; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 400; X64-NEXT: jne .LBB7_2 401; X64-NEXT: jmp .LBB7_1 402; X64-NEXT: .LBB7_2: # %atomicrmw.end 403; X64-NEXT: retq 404; 405; X86-CMOV-LABEL: atomic_fetch_min32: 406; X86-CMOV: # %bb.0: 407; X86-CMOV-NEXT: subl $8, %esp 408; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 409; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 410; X86-CMOV-NEXT: movl sc32, %eax 411; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 412; X86-CMOV-NEXT: .LBB7_1: # %atomicrmw.start 413; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 414; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 415; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload 416; X86-CMOV-NEXT: movl %eax, %edx 417; X86-CMOV-NEXT: subl %ecx, %edx 418; X86-CMOV-NEXT: cmovlel %eax, %ecx 419; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 420; X86-CMOV-NEXT: sete %cl 421; X86-CMOV-NEXT: testb $1, %cl 422; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 423; X86-CMOV-NEXT: jne .LBB7_2 424; X86-CMOV-NEXT: jmp .LBB7_1 425; X86-CMOV-NEXT: .LBB7_2: # %atomicrmw.end 426; X86-CMOV-NEXT: addl $8, %esp 427; X86-CMOV-NEXT: retl 428; 429; X86-NOCMOV-LABEL: atomic_fetch_min32: 430; X86-NOCMOV: # %bb.0: 431; X86-NOCMOV-NEXT: subl $16, %esp 432; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 433; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 434; X86-NOCMOV-NEXT: movl sc32, %eax 435; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 436; X86-NOCMOV-NEXT: .LBB7_1: # %atomicrmw.start 437; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 438; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 439; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 440; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 441; X86-NOCMOV-NEXT: movl %eax, %ecx 442; X86-NOCMOV-NEXT: subl %edx, %ecx 443; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 444; X86-NOCMOV-NEXT: jle .LBB7_4 445; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 446; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1 447; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 448; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 449; X86-NOCMOV-NEXT: .LBB7_4: # %atomicrmw.start 450; X86-NOCMOV-NEXT: # in Loop: Header=BB7_1 Depth=1 451; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 452; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 453; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 454; X86-NOCMOV-NEXT: sete %cl 455; X86-NOCMOV-NEXT: testb $1, %cl 456; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 457; X86-NOCMOV-NEXT: jne .LBB7_2 458; X86-NOCMOV-NEXT: jmp .LBB7_1 459; X86-NOCMOV-NEXT: .LBB7_2: # %atomicrmw.end 460; X86-NOCMOV-NEXT: addl $16, %esp 461; X86-NOCMOV-NEXT: retl 462; 463; X86-NOX87-LABEL: atomic_fetch_min32: 464; X86-NOX87: # %bb.0: 465; X86-NOX87-NEXT: subl $16, %esp 466; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 467; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 468; X86-NOX87-NEXT: movl sc32, %eax 469; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 470; X86-NOX87-NEXT: .LBB7_1: # %atomicrmw.start 471; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 472; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 473; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 474; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 475; X86-NOX87-NEXT: movl %eax, %ecx 476; X86-NOX87-NEXT: subl %edx, %ecx 477; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 478; X86-NOX87-NEXT: jle .LBB7_4 479; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 480; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1 481; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 482; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 483; X86-NOX87-NEXT: .LBB7_4: # %atomicrmw.start 484; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1 485; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 486; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 487; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 488; X86-NOX87-NEXT: sete %cl 489; X86-NOX87-NEXT: testb $1, %cl 490; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 491; X86-NOX87-NEXT: jne .LBB7_2 492; X86-NOX87-NEXT: jmp .LBB7_1 493; X86-NOX87-NEXT: .LBB7_2: # %atomicrmw.end 494; X86-NOX87-NEXT: addl $16, %esp 495; X86-NOX87-NEXT: retl 496 %t1 = atomicrmw min ptr @sc32, i32 %x acquire 497 ret void 498} 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 Spill 504; X64-NEXT: movl sc32, %eax 505; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 506; X64-NEXT: .LBB8_1: # %atomicrmw.start 507; X64-NEXT: # =>This Inner Loop Header: Depth=1 508; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 509; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 510; X64-NEXT: movl %eax, %edx 511; X64-NEXT: subl %ecx, %edx 512; X64-NEXT: cmoval %eax, %ecx 513; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 514; X64-NEXT: sete %cl 515; X64-NEXT: testb $1, %cl 516; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 517; X64-NEXT: jne .LBB8_2 518; X64-NEXT: jmp .LBB8_1 519; X64-NEXT: .LBB8_2: # %atomicrmw.end 520; X64-NEXT: retq 521; 522; X86-CMOV-LABEL: atomic_fetch_umax32: 523; X86-CMOV: # %bb.0: 524; X86-CMOV-NEXT: subl $8, %esp 525; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 526; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 527; X86-CMOV-NEXT: movl sc32, %eax 528; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 529; X86-CMOV-NEXT: .LBB8_1: # %atomicrmw.start 530; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 531; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 532; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload 533; X86-CMOV-NEXT: movl %eax, %edx 534; X86-CMOV-NEXT: subl %ecx, %edx 535; X86-CMOV-NEXT: cmoval %eax, %ecx 536; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 537; X86-CMOV-NEXT: sete %cl 538; X86-CMOV-NEXT: testb $1, %cl 539; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 540; X86-CMOV-NEXT: jne .LBB8_2 541; X86-CMOV-NEXT: jmp .LBB8_1 542; X86-CMOV-NEXT: .LBB8_2: # %atomicrmw.end 543; X86-CMOV-NEXT: addl $8, %esp 544; X86-CMOV-NEXT: retl 545; 546; X86-NOCMOV-LABEL: atomic_fetch_umax32: 547; X86-NOCMOV: # %bb.0: 548; X86-NOCMOV-NEXT: subl $16, %esp 549; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 550; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 551; X86-NOCMOV-NEXT: movl sc32, %eax 552; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 553; X86-NOCMOV-NEXT: .LBB8_1: # %atomicrmw.start 554; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 555; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 556; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 557; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 558; X86-NOCMOV-NEXT: movl %eax, %ecx 559; X86-NOCMOV-NEXT: subl %edx, %ecx 560; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 561; X86-NOCMOV-NEXT: ja .LBB8_4 562; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 563; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1 564; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 565; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 566; X86-NOCMOV-NEXT: .LBB8_4: # %atomicrmw.start 567; X86-NOCMOV-NEXT: # in Loop: Header=BB8_1 Depth=1 568; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 569; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 570; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 571; X86-NOCMOV-NEXT: sete %cl 572; X86-NOCMOV-NEXT: testb $1, %cl 573; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 574; X86-NOCMOV-NEXT: jne .LBB8_2 575; X86-NOCMOV-NEXT: jmp .LBB8_1 576; X86-NOCMOV-NEXT: .LBB8_2: # %atomicrmw.end 577; X86-NOCMOV-NEXT: addl $16, %esp 578; X86-NOCMOV-NEXT: retl 579; 580; X86-NOX87-LABEL: atomic_fetch_umax32: 581; X86-NOX87: # %bb.0: 582; X86-NOX87-NEXT: subl $16, %esp 583; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 584; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 585; X86-NOX87-NEXT: movl sc32, %eax 586; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 587; X86-NOX87-NEXT: .LBB8_1: # %atomicrmw.start 588; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 589; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 590; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 591; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 592; X86-NOX87-NEXT: movl %eax, %ecx 593; X86-NOX87-NEXT: subl %edx, %ecx 594; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 595; X86-NOX87-NEXT: ja .LBB8_4 596; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 597; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1 598; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 599; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 600; X86-NOX87-NEXT: .LBB8_4: # %atomicrmw.start 601; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1 602; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 603; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 604; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 605; X86-NOX87-NEXT: sete %cl 606; X86-NOX87-NEXT: testb $1, %cl 607; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 608; X86-NOX87-NEXT: jne .LBB8_2 609; X86-NOX87-NEXT: jmp .LBB8_1 610; X86-NOX87-NEXT: .LBB8_2: # %atomicrmw.end 611; X86-NOX87-NEXT: addl $16, %esp 612; X86-NOX87-NEXT: retl 613 %t1 = atomicrmw umax ptr @sc32, i32 %x acquire 614 ret void 615} 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 Spill 621; X64-NEXT: movl sc32, %eax 622; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 623; X64-NEXT: .LBB9_1: # %atomicrmw.start 624; X64-NEXT: # =>This Inner Loop Header: Depth=1 625; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload 626; X64-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload 627; X64-NEXT: movl %eax, %edx 628; X64-NEXT: subl %ecx, %edx 629; X64-NEXT: cmovbel %eax, %ecx 630; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 631; X64-NEXT: sete %cl 632; X64-NEXT: testb $1, %cl 633; X64-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 634; X64-NEXT: jne .LBB9_2 635; X64-NEXT: jmp .LBB9_1 636; X64-NEXT: .LBB9_2: # %atomicrmw.end 637; X64-NEXT: retq 638; 639; X86-CMOV-LABEL: atomic_fetch_umin32: 640; X86-CMOV: # %bb.0: 641; X86-CMOV-NEXT: subl $8, %esp 642; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 643; X86-CMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 644; X86-CMOV-NEXT: movl sc32, %eax 645; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 646; X86-CMOV-NEXT: .LBB9_1: # %atomicrmw.start 647; X86-CMOV-NEXT: # =>This Inner Loop Header: Depth=1 648; X86-CMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 649; X86-CMOV-NEXT: movl (%esp), %ecx # 4-byte Reload 650; X86-CMOV-NEXT: movl %eax, %edx 651; X86-CMOV-NEXT: subl %ecx, %edx 652; X86-CMOV-NEXT: cmovbel %eax, %ecx 653; X86-CMOV-NEXT: lock cmpxchgl %ecx, sc32 654; X86-CMOV-NEXT: sete %cl 655; X86-CMOV-NEXT: testb $1, %cl 656; X86-CMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 657; X86-CMOV-NEXT: jne .LBB9_2 658; X86-CMOV-NEXT: jmp .LBB9_1 659; X86-CMOV-NEXT: .LBB9_2: # %atomicrmw.end 660; X86-CMOV-NEXT: addl $8, %esp 661; X86-CMOV-NEXT: retl 662; 663; X86-NOCMOV-LABEL: atomic_fetch_umin32: 664; X86-NOCMOV: # %bb.0: 665; X86-NOCMOV-NEXT: subl $16, %esp 666; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax 667; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 668; X86-NOCMOV-NEXT: movl sc32, %eax 669; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 670; X86-NOCMOV-NEXT: .LBB9_1: # %atomicrmw.start 671; X86-NOCMOV-NEXT: # =>This Inner Loop Header: Depth=1 672; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 673; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 674; X86-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill 675; X86-NOCMOV-NEXT: movl %eax, %ecx 676; X86-NOCMOV-NEXT: subl %edx, %ecx 677; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 678; X86-NOCMOV-NEXT: jbe .LBB9_4 679; X86-NOCMOV-NEXT: # %bb.3: # %atomicrmw.start 680; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1 681; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 682; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 683; X86-NOCMOV-NEXT: .LBB9_4: # %atomicrmw.start 684; X86-NOCMOV-NEXT: # in Loop: Header=BB9_1 Depth=1 685; X86-NOCMOV-NEXT: movl (%esp), %eax # 4-byte Reload 686; X86-NOCMOV-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 687; X86-NOCMOV-NEXT: lock cmpxchgl %ecx, sc32 688; X86-NOCMOV-NEXT: sete %cl 689; X86-NOCMOV-NEXT: testb $1, %cl 690; X86-NOCMOV-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 691; X86-NOCMOV-NEXT: jne .LBB9_2 692; X86-NOCMOV-NEXT: jmp .LBB9_1 693; X86-NOCMOV-NEXT: .LBB9_2: # %atomicrmw.end 694; X86-NOCMOV-NEXT: addl $16, %esp 695; X86-NOCMOV-NEXT: retl 696; 697; X86-NOX87-LABEL: atomic_fetch_umin32: 698; X86-NOX87: # %bb.0: 699; X86-NOX87-NEXT: subl $16, %esp 700; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 701; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 702; X86-NOX87-NEXT: movl sc32, %eax 703; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 704; X86-NOX87-NEXT: .LBB9_1: # %atomicrmw.start 705; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1 706; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 707; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 708; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill 709; X86-NOX87-NEXT: movl %eax, %ecx 710; X86-NOX87-NEXT: subl %edx, %ecx 711; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 712; X86-NOX87-NEXT: jbe .LBB9_4 713; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start 714; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1 715; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 716; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 717; X86-NOX87-NEXT: .LBB9_4: # %atomicrmw.start 718; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1 719; X86-NOX87-NEXT: movl (%esp), %eax # 4-byte Reload 720; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload 721; X86-NOX87-NEXT: lock cmpxchgl %ecx, sc32 722; X86-NOX87-NEXT: sete %cl 723; X86-NOX87-NEXT: testb $1, %cl 724; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 725; X86-NOX87-NEXT: jne .LBB9_2 726; X86-NOX87-NEXT: jmp .LBB9_1 727; X86-NOX87-NEXT: .LBB9_2: # %atomicrmw.end 728; X86-NOX87-NEXT: addl $16, %esp 729; X86-NOX87-NEXT: retl 730 %t1 = atomicrmw umin ptr @sc32, i32 %x acquire 731 ret void 732} 733 734define void @atomic_fetch_cmpxchg32() nounwind { 735; X64-LABEL: atomic_fetch_cmpxchg32: 736; X64: # %bb.0: 737; X64-NEXT: xorl %eax, %eax 738; X64-NEXT: movl $1, %ecx 739; X64-NEXT: lock cmpxchgl %ecx, sc32(%rip) 740; X64-NEXT: retq 741; 742; X86-LABEL: atomic_fetch_cmpxchg32: 743; X86: # %bb.0: 744; X86-NEXT: xorl %eax, %eax 745; X86-NEXT: movl $1, %ecx 746; X86-NEXT: lock cmpxchgl %ecx, sc32 747; X86-NEXT: retl 748 %t1 = cmpxchg ptr @sc32, i32 0, i32 1 acquire acquire 749 ret void 750} 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: retq 757; 758; X86-LABEL: atomic_fetch_store32: 759; X86: # %bb.0: 760; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 761; X86-NEXT: movl %eax, sc32 762; X86-NEXT: retl 763 store atomic i32 %x, ptr @sc32 release, align 4 764 ret void 765} 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: retq 772; 773; X86-LABEL: atomic_fetch_swap32: 774; X86: # %bb.0: 775; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 776; X86-NEXT: xchgl %eax, sc32 777; X86-NEXT: retl 778 %t1 = atomicrmw xchg ptr @sc32, i32 %x acquire 779 ret void 780} 781 782define void @atomic_fetch_swapf32(float %x) nounwind { 783; X64-LABEL: atomic_fetch_swapf32: 784; X64: # %bb.0: 785; X64-NEXT: movd %xmm0, %eax 786; X64-NEXT: xchgl %eax, fsc32(%rip) 787; X64-NEXT: retq 788; 789; X86-CMOV-LABEL: atomic_fetch_swapf32: 790; X86-CMOV: # %bb.0: 791; X86-CMOV-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 792; X86-CMOV-NEXT: movd %xmm0, %eax 793; X86-CMOV-NEXT: xchgl %eax, fsc32 794; X86-CMOV-NEXT: retl 795; 796; X86-NOCMOV-LABEL: atomic_fetch_swapf32: 797; X86-NOCMOV: # %bb.0: 798; X86-NOCMOV-NEXT: pushl %eax 799; X86-NOCMOV-NEXT: flds {{[0-9]+}}(%esp) 800; X86-NOCMOV-NEXT: fstps (%esp) 801; X86-NOCMOV-NEXT: movl (%esp), %eax 802; X86-NOCMOV-NEXT: xchgl %eax, fsc32 803; X86-NOCMOV-NEXT: popl %eax 804; X86-NOCMOV-NEXT: retl 805; 806; X86-NOX87-LABEL: atomic_fetch_swapf32: 807; X86-NOX87: # %bb.0: 808; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax 809; X86-NOX87-NEXT: xchgl %eax, fsc32 810; X86-NOX87-NEXT: retl 811 %t1 = atomicrmw xchg ptr @fsc32, float %x acquire 812 ret void 813} 814