]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/atomic-minmax-i6432.ll
Vendor import of llvm release_34 branch r197841 (effectively, 3.4 RC3):
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / atomic-minmax-i6432.ll
1 ; RUN: llc -march=x86 -mattr=+cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=LINUX
2 ; RUN: llc -march=x86 -mattr=-cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=NOCMOV
3 ; RUN: llc -march=x86 -mtriple=i386-macosx -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC
4
5 @sc64 = external global i64
6
7 define void @atomic_maxmin_i6432() {
8 ; LINUX: atomic_maxmin_i6432
9   %1 = atomicrmw max  i64* @sc64, i64 5 acquire
10 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]]
11 ; LINUX: cmpl
12 ; LINUX: setl
13 ; LINUX: cmpl
14 ; LINUX: setl
15 ; LINUX: cmovne
16 ; LINUX: cmovne
17 ; LINUX: lock
18 ; LINUX-NEXT: cmpxchg8b
19 ; LINUX: jne [[LABEL]]
20 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]]
21 ; NOCMOV: cmpl
22 ; NOCMOV: setl
23 ; NOCMOV: cmpl
24 ; NOCMOV: setl
25 ; NOCMOV: jne
26 ; NOCMOV: jne
27 ; NOCMOV: lock
28 ; NOCMOV-NEXT: cmpxchg8b
29 ; NOCMOV: jne [[LABEL]]
30   %2 = atomicrmw min  i64* @sc64, i64 6 acquire
31 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]]
32 ; LINUX: cmpl
33 ; LINUX: setg
34 ; LINUX: cmpl
35 ; LINUX: setg
36 ; LINUX: cmovne
37 ; LINUX: cmovne
38 ; LINUX: lock
39 ; LINUX-NEXT: cmpxchg8b
40 ; LINUX: jne [[LABEL]]
41 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]]
42 ; NOCMOV: cmpl
43 ; NOCMOV: setg
44 ; NOCMOV: cmpl
45 ; NOCMOV: setg
46 ; NOCMOV: jne
47 ; NOCMOV: jne
48 ; NOCMOV: lock
49 ; NOCMOV-NEXT: cmpxchg8b
50 ; NOCMOV: jne [[LABEL]]
51   %3 = atomicrmw umax i64* @sc64, i64 7 acquire
52 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]]
53 ; LINUX: cmpl
54 ; LINUX: setb
55 ; LINUX: cmpl
56 ; LINUX: setb
57 ; LINUX: cmovne
58 ; LINUX: cmovne
59 ; LINUX: lock
60 ; LINUX-NEXT: cmpxchg8b
61 ; LINUX: jne [[LABEL]]
62 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]]
63 ; NOCMOV: cmpl
64 ; NOCMOV: setb
65 ; NOCMOV: cmpl
66 ; NOCMOV: setb
67 ; NOCMOV: jne
68 ; NOCMOV: jne
69 ; NOCMOV: lock
70 ; NOCMOV-NEXT: cmpxchg8b
71 ; NOCMOV: jne [[LABEL]]
72   %4 = atomicrmw umin i64* @sc64, i64 8 acquire
73 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]]
74 ; LINUX: cmpl
75 ; LINUX: seta
76 ; LINUX: cmpl
77 ; LINUX: seta
78 ; LINUX: cmovne
79 ; LINUX: cmovne
80 ; LINUX: lock
81 ; LINUX-NEXT: cmpxchg8b
82 ; LINUX: jne [[LABEL]]
83 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]]
84 ; NOCMOV: cmpl
85 ; NOCMOV: seta
86 ; NOCMOV: cmpl
87 ; NOCMOV: seta
88 ; NOCMOV: jne
89 ; NOCMOV: jne
90 ; NOCMOV: lock
91 ; NOCMOV-NEXT: cmpxchg8b
92 ; NOCMOV: jne [[LABEL]]
93   ret void
94 }
95
96 ; rdar://12453106
97 @id = internal global i64 0, align 8
98
99 define void @tf_bug(i8* %ptr) nounwind {
100 ; PIC-LABEL: tf_bug:
101 ; PIC: movl _id-L1$pb(
102 ; PIC: movl (_id-L1$pb)+4(
103   %tmp1 = atomicrmw add i64* @id, i64 1 seq_cst
104   %tmp2 = add i64 %tmp1, 1
105   %tmp3 = bitcast i8* %ptr to i64*
106   store i64 %tmp2, i64* %tmp3, align 4
107   ret void
108 }