176 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck %s3 4define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {5; CHECK-LABEL: atomicrmw_uinc_wrap_i8:6; CHECK: # %bb.0:7; CHECK-NEXT: movzbl (%rdi), %eax8; CHECK-NEXT: xorl %ecx, %ecx9; CHECK-NEXT: .p2align 410; CHECK-NEXT: .LBB0_1: # %atomicrmw.start11; CHECK-NEXT: # =>This Inner Loop Header: Depth=112; CHECK-NEXT: leal 1(%rax), %edx13; CHECK-NEXT: cmpb %sil, %al14; CHECK-NEXT: movzbl %dl, %edx15; CHECK-NEXT: cmovael %ecx, %edx16; CHECK-NEXT: # kill: def $al killed $al killed $rax17; CHECK-NEXT: lock cmpxchgb %dl, (%rdi)18; CHECK-NEXT: # kill: def $al killed $al def $rax19; CHECK-NEXT: jne .LBB0_120; CHECK-NEXT: # %bb.2: # %atomicrmw.end21; CHECK-NEXT: # kill: def $al killed $al killed $rax22; CHECK-NEXT: retq23 %result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst24 ret i8 %result25}26 27define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {28; CHECK-LABEL: atomicrmw_uinc_wrap_i16:29; CHECK: # %bb.0:30; CHECK-NEXT: movzwl (%rdi), %eax31; CHECK-NEXT: xorl %ecx, %ecx32; CHECK-NEXT: .p2align 433; CHECK-NEXT: .LBB1_1: # %atomicrmw.start34; CHECK-NEXT: # =>This Inner Loop Header: Depth=135; CHECK-NEXT: leal 1(%rax), %edx36; CHECK-NEXT: cmpw %si, %ax37; CHECK-NEXT: cmovael %ecx, %edx38; CHECK-NEXT: # kill: def $ax killed $ax killed $rax39; CHECK-NEXT: lock cmpxchgw %dx, (%rdi)40; CHECK-NEXT: # kill: def $ax killed $ax def $rax41; CHECK-NEXT: jne .LBB1_142; CHECK-NEXT: # %bb.2: # %atomicrmw.end43; CHECK-NEXT: # kill: def $ax killed $ax killed $rax44; CHECK-NEXT: retq45 %result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst46 ret i16 %result47}48 49define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {50; CHECK-LABEL: atomicrmw_uinc_wrap_i32:51; CHECK: # %bb.0:52; CHECK-NEXT: movl (%rdi), %eax53; CHECK-NEXT: xorl %ecx, %ecx54; CHECK-NEXT: .p2align 455; CHECK-NEXT: .LBB2_1: # %atomicrmw.start56; CHECK-NEXT: # =>This Inner Loop Header: Depth=157; CHECK-NEXT: leal 1(%rax), %edx58; CHECK-NEXT: cmpl %esi, %eax59; CHECK-NEXT: cmovael %ecx, %edx60; CHECK-NEXT: # kill: def $eax killed $eax killed $rax61; CHECK-NEXT: lock cmpxchgl %edx, (%rdi)62; CHECK-NEXT: # kill: def $eax killed $eax def $rax63; CHECK-NEXT: jne .LBB2_164; CHECK-NEXT: # %bb.2: # %atomicrmw.end65; CHECK-NEXT: # kill: def $eax killed $eax killed $rax66; CHECK-NEXT: retq67 %result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst68 ret i32 %result69}70 71define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {72; CHECK-LABEL: atomicrmw_uinc_wrap_i64:73; CHECK: # %bb.0:74; CHECK-NEXT: movq (%rdi), %rax75; CHECK-NEXT: xorl %ecx, %ecx76; CHECK-NEXT: .p2align 477; CHECK-NEXT: .LBB3_1: # %atomicrmw.start78; CHECK-NEXT: # =>This Inner Loop Header: Depth=179; CHECK-NEXT: leaq 1(%rax), %rdx80; CHECK-NEXT: cmpq %rsi, %rax81; CHECK-NEXT: cmovaeq %rcx, %rdx82; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi)83; CHECK-NEXT: jne .LBB3_184; CHECK-NEXT: # %bb.2: # %atomicrmw.end85; CHECK-NEXT: retq86 %result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst87 ret i64 %result88}89 90define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {91; CHECK-LABEL: atomicrmw_udec_wrap_i8:92; CHECK: # %bb.0:93; CHECK-NEXT: movzbl (%rdi), %eax94; CHECK-NEXT: movzbl %sil, %ecx95; CHECK-NEXT: .p2align 496; CHECK-NEXT: .LBB4_1: # %atomicrmw.start97; CHECK-NEXT: # =>This Inner Loop Header: Depth=198; CHECK-NEXT: movl %eax, %edx99; CHECK-NEXT: subb $1, %dl100; CHECK-NEXT: cmpb %cl, %al101; CHECK-NEXT: movzbl %dl, %edx102; CHECK-NEXT: cmoval %ecx, %edx103; CHECK-NEXT: cmpb $1, %al104; CHECK-NEXT: cmovbl %ecx, %edx105; CHECK-NEXT: lock cmpxchgb %dl, (%rdi)106; CHECK-NEXT: jne .LBB4_1107; CHECK-NEXT: # %bb.2: # %atomicrmw.end108; CHECK-NEXT: retq109 %result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst110 ret i8 %result111}112 113define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {114; CHECK-LABEL: atomicrmw_udec_wrap_i16:115; CHECK: # %bb.0:116; CHECK-NEXT: movzwl (%rdi), %eax117; CHECK-NEXT: .p2align 4118; CHECK-NEXT: .LBB5_1: # %atomicrmw.start119; CHECK-NEXT: # =>This Inner Loop Header: Depth=1120; CHECK-NEXT: movl %eax, %ecx121; CHECK-NEXT: subw $1, %cx122; CHECK-NEXT: cmpw %si, %ax123; CHECK-NEXT: cmoval %esi, %ecx124; CHECK-NEXT: cmpw $1, %ax125; CHECK-NEXT: cmovbl %esi, %ecx126; CHECK-NEXT: lock cmpxchgw %cx, (%rdi)127; CHECK-NEXT: jne .LBB5_1128; CHECK-NEXT: # %bb.2: # %atomicrmw.end129; CHECK-NEXT: retq130 %result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst131 ret i16 %result132}133 134define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {135; CHECK-LABEL: atomicrmw_udec_wrap_i32:136; CHECK: # %bb.0:137; CHECK-NEXT: movl (%rdi), %eax138; CHECK-NEXT: .p2align 4139; CHECK-NEXT: .LBB6_1: # %atomicrmw.start140; CHECK-NEXT: # =>This Inner Loop Header: Depth=1141; CHECK-NEXT: leal -1(%rax), %ecx142; CHECK-NEXT: cmpl %esi, %eax143; CHECK-NEXT: cmoval %esi, %ecx144; CHECK-NEXT: cmpl $1, %eax145; CHECK-NEXT: cmovbl %esi, %ecx146; CHECK-NEXT: # kill: def $eax killed $eax killed $rax147; CHECK-NEXT: lock cmpxchgl %ecx, (%rdi)148; CHECK-NEXT: # kill: def $eax killed $eax def $rax149; CHECK-NEXT: jne .LBB6_1150; CHECK-NEXT: # %bb.2: # %atomicrmw.end151; CHECK-NEXT: # kill: def $eax killed $eax killed $rax152; CHECK-NEXT: retq153 %result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst154 ret i32 %result155}156 157define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {158; CHECK-LABEL: atomicrmw_udec_wrap_i64:159; CHECK: # %bb.0:160; CHECK-NEXT: movq (%rdi), %rax161; CHECK-NEXT: .p2align 4162; CHECK-NEXT: .LBB7_1: # %atomicrmw.start163; CHECK-NEXT: # =>This Inner Loop Header: Depth=1164; CHECK-NEXT: leaq -1(%rax), %rcx165; CHECK-NEXT: cmpq %rsi, %rax166; CHECK-NEXT: cmovaq %rsi, %rcx167; CHECK-NEXT: cmpq $1, %rax168; CHECK-NEXT: cmovbq %rsi, %rcx169; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi)170; CHECK-NEXT: jne .LBB7_1171; CHECK-NEXT: # %bb.2: # %atomicrmw.end172; CHECK-NEXT: retq173 %result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst174 ret i64 %result175}176