176 lines
6.1 KiB
LLVM
176 lines
6.1 KiB
LLVM
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||
|
; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck %s
|
||
|
|
||
|
define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_uinc_wrap_i8:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movzbl (%rdi), %eax
|
||
|
; CHECK-NEXT: xorl %ecx, %ecx
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB0_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leal 1(%rax), %edx
|
||
|
; CHECK-NEXT: cmpb %sil, %al
|
||
|
; CHECK-NEXT: movzbl %dl, %edx
|
||
|
; CHECK-NEXT: cmovael %ecx, %edx
|
||
|
; CHECK-NEXT: # kill: def $al killed $al killed $rax
|
||
|
; CHECK-NEXT: lock cmpxchgb %dl, (%rdi)
|
||
|
; CHECK-NEXT: # kill: def $al killed $al def $rax
|
||
|
; CHECK-NEXT: jne .LBB0_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: # kill: def $al killed $al killed $rax
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst
|
||
|
ret i8 %result
|
||
|
}
|
||
|
|
||
|
define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_uinc_wrap_i16:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movzwl (%rdi), %eax
|
||
|
; CHECK-NEXT: xorl %ecx, %ecx
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB1_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leal 1(%rax), %edx
|
||
|
; CHECK-NEXT: cmpw %si, %ax
|
||
|
; CHECK-NEXT: cmovael %ecx, %edx
|
||
|
; CHECK-NEXT: # kill: def $ax killed $ax killed $rax
|
||
|
; CHECK-NEXT: lock cmpxchgw %dx, (%rdi)
|
||
|
; CHECK-NEXT: # kill: def $ax killed $ax def $rax
|
||
|
; CHECK-NEXT: jne .LBB1_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: # kill: def $ax killed $ax killed $rax
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst
|
||
|
ret i16 %result
|
||
|
}
|
||
|
|
||
|
define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_uinc_wrap_i32:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movl (%rdi), %eax
|
||
|
; CHECK-NEXT: xorl %ecx, %ecx
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB2_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leal 1(%rax), %edx
|
||
|
; CHECK-NEXT: cmpl %esi, %eax
|
||
|
; CHECK-NEXT: cmovael %ecx, %edx
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
|
||
|
; CHECK-NEXT: lock cmpxchgl %edx, (%rdi)
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax def $rax
|
||
|
; CHECK-NEXT: jne .LBB2_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst
|
||
|
ret i32 %result
|
||
|
}
|
||
|
|
||
|
define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_uinc_wrap_i64:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movq (%rdi), %rax
|
||
|
; CHECK-NEXT: xorl %ecx, %ecx
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB3_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leaq 1(%rax), %rdx
|
||
|
; CHECK-NEXT: cmpq %rsi, %rax
|
||
|
; CHECK-NEXT: cmovaeq %rcx, %rdx
|
||
|
; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi)
|
||
|
; CHECK-NEXT: jne .LBB3_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst
|
||
|
ret i64 %result
|
||
|
}
|
||
|
|
||
|
define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_udec_wrap_i8:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movzbl (%rdi), %eax
|
||
|
; CHECK-NEXT: movzbl %sil, %ecx
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB4_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: movl %eax, %edx
|
||
|
; CHECK-NEXT: subb $1, %dl
|
||
|
; CHECK-NEXT: cmpb %cl, %al
|
||
|
; CHECK-NEXT: movzbl %dl, %edx
|
||
|
; CHECK-NEXT: cmoval %ecx, %edx
|
||
|
; CHECK-NEXT: cmpb $1, %al
|
||
|
; CHECK-NEXT: cmovbl %ecx, %edx
|
||
|
; CHECK-NEXT: lock cmpxchgb %dl, (%rdi)
|
||
|
; CHECK-NEXT: jne .LBB4_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst
|
||
|
ret i8 %result
|
||
|
}
|
||
|
|
||
|
define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_udec_wrap_i16:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movzwl (%rdi), %eax
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB5_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: movl %eax, %ecx
|
||
|
; CHECK-NEXT: subw $1, %cx
|
||
|
; CHECK-NEXT: cmpw %si, %ax
|
||
|
; CHECK-NEXT: cmoval %esi, %ecx
|
||
|
; CHECK-NEXT: cmpw $1, %ax
|
||
|
; CHECK-NEXT: cmovbl %esi, %ecx
|
||
|
; CHECK-NEXT: lock cmpxchgw %cx, (%rdi)
|
||
|
; CHECK-NEXT: jne .LBB5_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst
|
||
|
ret i16 %result
|
||
|
}
|
||
|
|
||
|
define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_udec_wrap_i32:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movl (%rdi), %eax
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB6_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leal -1(%rax), %ecx
|
||
|
; CHECK-NEXT: cmpl %esi, %eax
|
||
|
; CHECK-NEXT: cmoval %esi, %ecx
|
||
|
; CHECK-NEXT: cmpl $1, %eax
|
||
|
; CHECK-NEXT: cmovbl %esi, %ecx
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
|
||
|
; CHECK-NEXT: lock cmpxchgl %ecx, (%rdi)
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax def $rax
|
||
|
; CHECK-NEXT: jne .LBB6_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst
|
||
|
ret i32 %result
|
||
|
}
|
||
|
|
||
|
define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {
|
||
|
; CHECK-LABEL: atomicrmw_udec_wrap_i64:
|
||
|
; CHECK: # %bb.0:
|
||
|
; CHECK-NEXT: movq (%rdi), %rax
|
||
|
; CHECK-NEXT: .p2align 4, 0x90
|
||
|
; CHECK-NEXT: .LBB7_1: # %atomicrmw.start
|
||
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||
|
; CHECK-NEXT: leaq -1(%rax), %rcx
|
||
|
; CHECK-NEXT: cmpq %rsi, %rax
|
||
|
; CHECK-NEXT: cmovaq %rsi, %rcx
|
||
|
; CHECK-NEXT: cmpq $1, %rax
|
||
|
; CHECK-NEXT: cmovbq %rsi, %rcx
|
||
|
; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi)
|
||
|
; CHECK-NEXT: jne .LBB7_1
|
||
|
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
|
||
|
; CHECK-NEXT: retq
|
||
|
%result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst
|
||
|
ret i64 %result
|
||
|
}
|