294 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=LINUX3; RUN: llc -mattr=+cmov -mtriple=i386-macosx -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC4 5@sc64 = external dso_local global i646 7define i64 @atomic_max_i64() nounwind {8; LINUX-LABEL: atomic_max_i64:9; LINUX: # %bb.0: # %entry10; LINUX-NEXT: pushl %ebx11; LINUX-NEXT: pushl %esi12; LINUX-NEXT: movl sc64+4, %edx13; LINUX-NEXT: movl sc64, %eax14; LINUX-NEXT: movl $5, %esi15; LINUX-NEXT: .p2align 416; LINUX-NEXT: .LBB0_1: # %atomicrmw.start17; LINUX-NEXT: # =>This Inner Loop Header: Depth=118; LINUX-NEXT: cmpl %eax, %esi19; LINUX-NEXT: movl $0, %ecx20; LINUX-NEXT: sbbl %edx, %ecx21; LINUX-NEXT: movl $0, %ecx22; LINUX-NEXT: cmovll %edx, %ecx23; LINUX-NEXT: movl $5, %ebx24; LINUX-NEXT: cmovll %eax, %ebx25; LINUX-NEXT: lock cmpxchg8b sc6426; LINUX-NEXT: jne .LBB0_127; LINUX-NEXT: # %bb.2: # %atomicrmw.end28; LINUX-NEXT: popl %esi29; LINUX-NEXT: popl %ebx30; LINUX-NEXT: retl31;32; PIC-LABEL: atomic_max_i64:33; PIC: ## %bb.0: ## %entry34; PIC-NEXT: pushl %ebx35; PIC-NEXT: pushl %edi36; PIC-NEXT: pushl %esi37; PIC-NEXT: calll L0$pb38; PIC-NEXT: L0$pb:39; PIC-NEXT: popl %eax40; PIC-NEXT: movl L_sc64$non_lazy_ptr-L0$pb(%eax), %esi41; PIC-NEXT: movl (%esi), %eax42; PIC-NEXT: movl 4(%esi), %edx43; PIC-NEXT: movl $5, %edi44; PIC-NEXT: .p2align 445; PIC-NEXT: LBB0_1: ## %atomicrmw.start46; PIC-NEXT: ## =>This Inner Loop Header: Depth=147; PIC-NEXT: cmpl %eax, %edi48; PIC-NEXT: movl $0, %ecx49; PIC-NEXT: sbbl %edx, %ecx50; PIC-NEXT: movl $0, %ecx51; PIC-NEXT: cmovll %edx, %ecx52; PIC-NEXT: movl $5, %ebx53; PIC-NEXT: cmovll %eax, %ebx54; PIC-NEXT: lock cmpxchg8b (%esi)55; PIC-NEXT: jne LBB0_156; PIC-NEXT: ## %bb.2: ## %atomicrmw.end57; PIC-NEXT: popl %esi58; PIC-NEXT: popl %edi59; PIC-NEXT: popl %ebx60; PIC-NEXT: retl61entry:62 %max = atomicrmw max ptr @sc64, i64 5 acquire63 ret i64 %max64}65 66define i64 @atomic_min_i64() nounwind {67; LINUX-LABEL: atomic_min_i64:68; LINUX: # %bb.0: # %entry69; LINUX-NEXT: pushl %ebx70; LINUX-NEXT: movl sc64+4, %edx71; LINUX-NEXT: movl sc64, %eax72; LINUX-NEXT: .p2align 473; LINUX-NEXT: .LBB1_1: # %atomicrmw.start74; LINUX-NEXT: # =>This Inner Loop Header: Depth=175; LINUX-NEXT: cmpl $7, %eax76; LINUX-NEXT: movl %edx, %ecx77; LINUX-NEXT: sbbl $0, %ecx78; LINUX-NEXT: movl $0, %ecx79; LINUX-NEXT: cmovll %edx, %ecx80; LINUX-NEXT: movl $6, %ebx81; LINUX-NEXT: cmovll %eax, %ebx82; LINUX-NEXT: lock cmpxchg8b sc6483; LINUX-NEXT: jne .LBB1_184; LINUX-NEXT: # %bb.2: # %atomicrmw.end85; LINUX-NEXT: popl %ebx86; LINUX-NEXT: retl87;88; PIC-LABEL: atomic_min_i64:89; PIC: ## %bb.0: ## %entry90; PIC-NEXT: pushl %ebx91; PIC-NEXT: pushl %esi92; PIC-NEXT: calll L1$pb93; PIC-NEXT: L1$pb:94; PIC-NEXT: popl %eax95; PIC-NEXT: movl L_sc64$non_lazy_ptr-L1$pb(%eax), %esi96; PIC-NEXT: movl (%esi), %eax97; PIC-NEXT: movl 4(%esi), %edx98; PIC-NEXT: .p2align 499; PIC-NEXT: LBB1_1: ## %atomicrmw.start100; PIC-NEXT: ## =>This Inner Loop Header: Depth=1101; PIC-NEXT: cmpl $7, %eax102; PIC-NEXT: movl %edx, %ecx103; PIC-NEXT: sbbl $0, %ecx104; PIC-NEXT: movl $0, %ecx105; PIC-NEXT: cmovll %edx, %ecx106; PIC-NEXT: movl $6, %ebx107; PIC-NEXT: cmovll %eax, %ebx108; PIC-NEXT: lock cmpxchg8b (%esi)109; PIC-NEXT: jne LBB1_1110; PIC-NEXT: ## %bb.2: ## %atomicrmw.end111; PIC-NEXT: popl %esi112; PIC-NEXT: popl %ebx113; PIC-NEXT: retl114entry:115 %min = atomicrmw min ptr @sc64, i64 6 acquire116 ret i64 %min117}118 119define i64 @atomic_umax_i64() nounwind {120; LINUX-LABEL: atomic_umax_i64:121; LINUX: # %bb.0: # %entry122; LINUX-NEXT: pushl %ebx123; LINUX-NEXT: pushl %esi124; LINUX-NEXT: movl sc64+4, %edx125; LINUX-NEXT: movl sc64, %eax126; LINUX-NEXT: movl $7, %esi127; LINUX-NEXT: .p2align 4128; LINUX-NEXT: .LBB2_1: # %atomicrmw.start129; LINUX-NEXT: # =>This Inner Loop Header: Depth=1130; LINUX-NEXT: cmpl %eax, %esi131; LINUX-NEXT: movl $0, %ecx132; LINUX-NEXT: sbbl %edx, %ecx133; LINUX-NEXT: movl $0, %ecx134; LINUX-NEXT: cmovbl %edx, %ecx135; LINUX-NEXT: movl $7, %ebx136; LINUX-NEXT: cmovbl %eax, %ebx137; LINUX-NEXT: lock cmpxchg8b sc64138; LINUX-NEXT: jne .LBB2_1139; LINUX-NEXT: # %bb.2: # %atomicrmw.end140; LINUX-NEXT: popl %esi141; LINUX-NEXT: popl %ebx142; LINUX-NEXT: retl143;144; PIC-LABEL: atomic_umax_i64:145; PIC: ## %bb.0: ## %entry146; PIC-NEXT: pushl %ebx147; PIC-NEXT: pushl %edi148; PIC-NEXT: pushl %esi149; PIC-NEXT: calll L2$pb150; PIC-NEXT: L2$pb:151; PIC-NEXT: popl %eax152; PIC-NEXT: movl L_sc64$non_lazy_ptr-L2$pb(%eax), %esi153; PIC-NEXT: movl (%esi), %eax154; PIC-NEXT: movl 4(%esi), %edx155; PIC-NEXT: movl $7, %edi156; PIC-NEXT: .p2align 4157; PIC-NEXT: LBB2_1: ## %atomicrmw.start158; PIC-NEXT: ## =>This Inner Loop Header: Depth=1159; PIC-NEXT: cmpl %eax, %edi160; PIC-NEXT: movl $0, %ecx161; PIC-NEXT: sbbl %edx, %ecx162; PIC-NEXT: movl $0, %ecx163; PIC-NEXT: cmovbl %edx, %ecx164; PIC-NEXT: movl $7, %ebx165; PIC-NEXT: cmovbl %eax, %ebx166; PIC-NEXT: lock cmpxchg8b (%esi)167; PIC-NEXT: jne LBB2_1168; PIC-NEXT: ## %bb.2: ## %atomicrmw.end169; PIC-NEXT: popl %esi170; PIC-NEXT: popl %edi171; PIC-NEXT: popl %ebx172; PIC-NEXT: retl173entry:174 %umax = atomicrmw umax ptr @sc64, i64 7 acquire175 ret i64 %umax176}177 178define i64 @atomic_umin_i64() nounwind {179; LINUX-LABEL: atomic_umin_i64:180; LINUX: # %bb.0: # %entry181; LINUX-NEXT: pushl %ebx182; LINUX-NEXT: movl sc64+4, %edx183; LINUX-NEXT: movl sc64, %eax184; LINUX-NEXT: .p2align 4185; LINUX-NEXT: .LBB3_1: # %atomicrmw.start186; LINUX-NEXT: # =>This Inner Loop Header: Depth=1187; LINUX-NEXT: cmpl $9, %eax188; LINUX-NEXT: movl %edx, %ecx189; LINUX-NEXT: sbbl $0, %ecx190; LINUX-NEXT: movl $0, %ecx191; LINUX-NEXT: cmovbl %edx, %ecx192; LINUX-NEXT: movl $8, %ebx193; LINUX-NEXT: cmovbl %eax, %ebx194; LINUX-NEXT: lock cmpxchg8b sc64195; LINUX-NEXT: jne .LBB3_1196; LINUX-NEXT: # %bb.2: # %atomicrmw.end197; LINUX-NEXT: popl %ebx198; LINUX-NEXT: retl199;200; PIC-LABEL: atomic_umin_i64:201; PIC: ## %bb.0: ## %entry202; PIC-NEXT: pushl %ebx203; PIC-NEXT: pushl %esi204; PIC-NEXT: calll L3$pb205; PIC-NEXT: L3$pb:206; PIC-NEXT: popl %eax207; PIC-NEXT: movl L_sc64$non_lazy_ptr-L3$pb(%eax), %esi208; PIC-NEXT: movl (%esi), %eax209; PIC-NEXT: movl 4(%esi), %edx210; PIC-NEXT: .p2align 4211; PIC-NEXT: LBB3_1: ## %atomicrmw.start212; PIC-NEXT: ## =>This Inner Loop Header: Depth=1213; PIC-NEXT: cmpl $9, %eax214; PIC-NEXT: movl %edx, %ecx215; PIC-NEXT: sbbl $0, %ecx216; PIC-NEXT: movl $0, %ecx217; PIC-NEXT: cmovbl %edx, %ecx218; PIC-NEXT: movl $8, %ebx219; PIC-NEXT: cmovbl %eax, %ebx220; PIC-NEXT: lock cmpxchg8b (%esi)221; PIC-NEXT: jne LBB3_1222; PIC-NEXT: ## %bb.2: ## %atomicrmw.end223; PIC-NEXT: popl %esi224; PIC-NEXT: popl %ebx225; PIC-NEXT: retl226entry:227 %umin = atomicrmw umin ptr @sc64, i64 8 acquire228 ret i64 %umin229}230 231@id = internal global i64 0, align 8232 233define void @tf_bug(ptr %ptr) nounwind {234; LINUX-LABEL: tf_bug:235; LINUX: # %bb.0: # %entry236; LINUX-NEXT: pushl %ebx237; LINUX-NEXT: pushl %esi238; LINUX-NEXT: movl {{[0-9]+}}(%esp), %esi239; LINUX-NEXT: movl id+4, %edx240; LINUX-NEXT: movl id, %eax241; LINUX-NEXT: .p2align 4242; LINUX-NEXT: .LBB4_1: # %atomicrmw.start243; LINUX-NEXT: # =>This Inner Loop Header: Depth=1244; LINUX-NEXT: movl %eax, %ebx245; LINUX-NEXT: addl $1, %ebx246; LINUX-NEXT: movl %edx, %ecx247; LINUX-NEXT: adcl $0, %ecx248; LINUX-NEXT: lock cmpxchg8b id249; LINUX-NEXT: jne .LBB4_1250; LINUX-NEXT: # %bb.2: # %atomicrmw.end251; LINUX-NEXT: addl $1, %eax252; LINUX-NEXT: adcl $0, %edx253; LINUX-NEXT: movl %eax, (%esi)254; LINUX-NEXT: movl %edx, 4(%esi)255; LINUX-NEXT: popl %esi256; LINUX-NEXT: popl %ebx257; LINUX-NEXT: retl258;259; PIC-LABEL: tf_bug:260; PIC: ## %bb.0: ## %entry261; PIC-NEXT: pushl %ebx262; PIC-NEXT: pushl %edi263; PIC-NEXT: pushl %esi264; PIC-NEXT: calll L4$pb265; PIC-NEXT: L4$pb:266; PIC-NEXT: popl %edi267; PIC-NEXT: movl {{[0-9]+}}(%esp), %esi268; PIC-NEXT: movl _id-L4$pb+4(%edi), %edx269; PIC-NEXT: movl _id-L4$pb(%edi), %eax270; PIC-NEXT: .p2align 4271; PIC-NEXT: LBB4_1: ## %atomicrmw.start272; PIC-NEXT: ## =>This Inner Loop Header: Depth=1273; PIC-NEXT: movl %eax, %ebx274; PIC-NEXT: addl $1, %ebx275; PIC-NEXT: movl %edx, %ecx276; PIC-NEXT: adcl $0, %ecx277; PIC-NEXT: lock cmpxchg8b _id-L4$pb(%edi)278; PIC-NEXT: jne LBB4_1279; PIC-NEXT: ## %bb.2: ## %atomicrmw.end280; PIC-NEXT: addl $1, %eax281; PIC-NEXT: adcl $0, %edx282; PIC-NEXT: movl %eax, (%esi)283; PIC-NEXT: movl %edx, 4(%esi)284; PIC-NEXT: popl %esi285; PIC-NEXT: popl %edi286; PIC-NEXT: popl %ebx287; PIC-NEXT: retl288entry:289 %tmp1 = atomicrmw add ptr @id, i64 1 seq_cst290 %tmp2 = add i64 %tmp1, 1291 store i64 %tmp2, ptr %ptr, align 4292 ret void293}294