95
|
1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV
|
|
2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 @sc32 = external global i32
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 define void @atomic_fetch_add32() nounwind {
|
95
|
8 ; WITH-CMOV-LABEL: atomic_fetch_add32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 entry:
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 ; 32-bit
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 %t1 = atomicrmw add i32* @sc32, i32 1 acquire
|
95
|
12 ; WITH-CMOV: lock
|
|
13 ; WITH-CMOV: incl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 %t2 = atomicrmw add i32* @sc32, i32 3 acquire
|
95
|
15 ; WITH-CMOV: lock
|
|
16 ; WITH-CMOV: addl $3
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 %t3 = atomicrmw add i32* @sc32, i32 5 acquire
|
95
|
18 ; WITH-CMOV: lock
|
|
19 ; WITH-CMOV: xaddl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire
|
95
|
21 ; WITH-CMOV: lock
|
|
22 ; WITH-CMOV: addl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 ret void
|
95
|
24 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 define void @atomic_fetch_sub32() nounwind {
|
95
|
28 ; WITH-CMOV-LABEL: atomic_fetch_sub32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire
|
95
|
30 ; WITH-CMOV: lock
|
|
31 ; WITH-CMOV: decl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire
|
95
|
33 ; WITH-CMOV: lock
|
|
34 ; WITH-CMOV: subl $3
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire
|
95
|
36 ; WITH-CMOV: lock
|
|
37 ; WITH-CMOV: xaddl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire
|
95
|
39 ; WITH-CMOV: lock
|
|
40 ; WITH-CMOV: subl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 ret void
|
95
|
42 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 define void @atomic_fetch_and32() nounwind {
|
95
|
46 ; WITH-CMOV-LABEL: atomic_fetch_and32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 %t1 = atomicrmw and i32* @sc32, i32 3 acquire
|
95
|
48 ; WITH-CMOV: lock
|
|
49 ; WITH-CMOV: andl $3
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 %t2 = atomicrmw and i32* @sc32, i32 5 acquire
|
95
|
51 ; WITH-CMOV: andl
|
|
52 ; WITH-CMOV: lock
|
|
53 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire
|
95
|
55 ; WITH-CMOV: lock
|
|
56 ; WITH-CMOV: andl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 ret void
|
95
|
58 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 define void @atomic_fetch_or32() nounwind {
|
95
|
62 ; WITH-CMOV-LABEL: atomic_fetch_or32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 %t1 = atomicrmw or i32* @sc32, i32 3 acquire
|
95
|
64 ; WITH-CMOV: lock
|
|
65 ; WITH-CMOV: orl $3
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 %t2 = atomicrmw or i32* @sc32, i32 5 acquire
|
95
|
67 ; WITH-CMOV: orl
|
|
68 ; WITH-CMOV: lock
|
|
69 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire
|
95
|
71 ; WITH-CMOV: lock
|
|
72 ; WITH-CMOV: orl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 ret void
|
95
|
74 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 define void @atomic_fetch_xor32() nounwind {
|
95
|
78 ; WITH-CMOV-LABEL: atomic_fetch_xor32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire
|
95
|
80 ; WITH-CMOV: lock
|
|
81 ; WITH-CMOV: xorl $3
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire
|
95
|
83 ; WITH-CMOV: xorl
|
|
84 ; WITH-CMOV: lock
|
|
85 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire
|
95
|
87 ; WITH-CMOV: lock
|
|
88 ; WITH-CMOV: xorl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 ret void
|
95
|
90 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 define void @atomic_fetch_nand32(i32 %x) nounwind {
|
95
|
94 ; WITH-CMOV-LABEL: atomic_fetch_nand32:
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire
|
95
|
96 ; WITH-CMOV: andl
|
|
97 ; WITH-CMOV: notl
|
|
98 ; WITH-CMOV: lock
|
|
99 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 ret void
|
95
|
101 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 define void @atomic_fetch_max32(i32 %x) nounwind {
|
95
|
105 ; WITH-CMOV-LABEL: atomic_fetch_max32:
|
77
|
106
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 %t1 = atomicrmw max i32* @sc32, i32 %x acquire
|
95
|
108 ; WITH-CMOV: subl
|
|
109 ; WITH-CMOV: cmov
|
|
110 ; WITH-CMOV: lock
|
|
111 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112
|
77
|
113 ; NOCMOV: subl
|
|
114 ; NOCMOV: jge
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 ; NOCMOV: lock
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 ; NOCMOV: cmpxchgl
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 ret void
|
95
|
118 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 ; NOCMOV: ret
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 define void @atomic_fetch_min32(i32 %x) nounwind {
|
95
|
123 ; WITH-CMOV-LABEL: atomic_fetch_min32:
|
77
|
124 ; NOCMOV-LABEL: atomic_fetch_min32:
|
|
125
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 %t1 = atomicrmw min i32* @sc32, i32 %x acquire
|
95
|
127 ; WITH-CMOV: subl
|
|
128 ; WITH-CMOV: cmov
|
|
129 ; WITH-CMOV: lock
|
|
130 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131
|
77
|
132 ; NOCMOV: subl
|
|
133 ; NOCMOV: jle
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 ; NOCMOV: lock
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 ; NOCMOV: cmpxchgl
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 ret void
|
95
|
137 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 ; NOCMOV: ret
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 define void @atomic_fetch_umax32(i32 %x) nounwind {
|
95
|
142 ; WITH-CMOV-LABEL: atomic_fetch_umax32:
|
77
|
143 ; NOCMOV-LABEL: atomic_fetch_umax32:
|
|
144
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire
|
95
|
146 ; WITH-CMOV: subl
|
|
147 ; WITH-CMOV: cmov
|
|
148 ; WITH-CMOV: lock
|
|
149 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150
|
77
|
151 ; NOCMOV: subl
|
|
152 ; NOCMOV: ja
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 ; NOCMOV: lock
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 ; NOCMOV: cmpxchgl
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 ret void
|
95
|
156 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 ; NOCMOV: ret
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 define void @atomic_fetch_umin32(i32 %x) nounwind {
|
95
|
161 ; WITH-CMOV-LABEL: atomic_fetch_umin32:
|
77
|
162 ; NOCMOV-LABEL: atomic_fetch_umin32:
|
|
163
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire
|
95
|
165 ; WITH-CMOV: subl
|
|
166 ; WITH-CMOV: cmov
|
|
167 ; WITH-CMOV: lock
|
|
168 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169
|
77
|
170 ; NOCMOV: subl
|
|
171 ; NOCMOV: jb
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 ; NOCMOV: lock
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 ; NOCMOV: cmpxchgl
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
174 ret void
|
95
|
175 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 ; NOCMOV: ret
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 define void @atomic_fetch_cmpxchg32() nounwind {
|
95
|
180 ; WITH-CMOV-LABEL: atomic_fetch_cmpxchg32:
|
77
|
181
|
|
182 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire
|
95
|
183 ; WITH-CMOV: lock
|
|
184 ; WITH-CMOV: cmpxchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 ret void
|
95
|
186 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 define void @atomic_fetch_store32(i32 %x) nounwind {
|
95
|
190 ; WITH-CMOV-LABEL: atomic_fetch_store32:
|
77
|
191
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 store atomic i32 %x, i32* @sc32 release, align 4
|
95
|
193 ; WITH-CMOV-NOT: lock
|
|
194 ; WITH-CMOV: movl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 ret void
|
95
|
196 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 define void @atomic_fetch_swap32(i32 %x) nounwind {
|
95
|
200 ; WITH-CMOV-LABEL: atomic_fetch_swap32:
|
77
|
201
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire
|
95
|
203 ; WITH-CMOV-NOT: lock
|
|
204 ; WITH-CMOV: xchgl
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 ret void
|
95
|
206 ; WITH-CMOV: ret
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 }
|