1; RUN: llc < %s -march=x86-64 -verify-machineinstrs | FileCheck %s
2
3; rdar://7103704
4
5define void @sub1(i32* nocapture %p, i32 %v) nounwind ssp {
6entry:
7; CHECK-LABEL: sub1:
8; CHECK: subl
9  %0 = atomicrmw sub i32* %p, i32 %v monotonic
10  ret void
11}
12
13define void @inc4(i64* nocapture %p) nounwind ssp {
14entry:
15; CHECK-LABEL: inc4:
16; CHECK: incq
17  %0 = atomicrmw add i64* %p, i64 1 monotonic
18  ret void
19}
20
21define void @add8(i64* nocapture %p) nounwind ssp {
22entry:
23; CHECK-LABEL: add8:
24; CHECK: addq $2
25  %0 = atomicrmw add i64* %p, i64 2 monotonic
26  ret void
27}
28
29define void @add4(i64* nocapture %p, i32 %v) nounwind ssp {
30entry:
31; CHECK-LABEL: add4:
32; CHECK: addq
33  %0 = sext i32 %v to i64		; <i64> [#uses=1]
34  %1 = atomicrmw add i64* %p, i64 %0 monotonic
35  ret void
36}
37
38define void @inc3(i8* nocapture %p) nounwind ssp {
39entry:
40; CHECK-LABEL: inc3:
41; CHECK: incb
42  %0 = atomicrmw add i8* %p, i8 1 monotonic
43  ret void
44}
45
46define void @add7(i8* nocapture %p) nounwind ssp {
47entry:
48; CHECK-LABEL: add7:
49; CHECK: addb $2
50  %0 = atomicrmw add i8* %p, i8 2 monotonic
51  ret void
52}
53
54define void @add3(i8* nocapture %p, i32 %v) nounwind ssp {
55entry:
56; CHECK-LABEL: add3:
57; CHECK: addb
58  %0 = trunc i32 %v to i8		; <i8> [#uses=1]
59  %1 = atomicrmw add i8* %p, i8 %0 monotonic
60  ret void
61}
62
63define void @inc2(i16* nocapture %p) nounwind ssp {
64entry:
65; CHECK-LABEL: inc2:
66; CHECK: incw
67  %0 = atomicrmw add i16* %p, i16 1 monotonic
68  ret void
69}
70
71define void @add6(i16* nocapture %p) nounwind ssp {
72entry:
73; CHECK-LABEL: add6:
74; CHECK: addw $2
75  %0 = atomicrmw add i16* %p, i16 2 monotonic
76  ret void
77}
78
79define void @add2(i16* nocapture %p, i32 %v) nounwind ssp {
80entry:
81; CHECK-LABEL: add2:
82; CHECK: addw
83	%0 = trunc i32 %v to i16		; <i16> [#uses=1]
84  %1 = atomicrmw add i16* %p, i16 %0 monotonic
85  ret void
86}
87
88define void @inc1(i32* nocapture %p) nounwind ssp {
89entry:
90; CHECK-LABEL: inc1:
91; CHECK: incl
92  %0 = atomicrmw add i32* %p, i32 1 monotonic
93  ret void
94}
95
96define void @add5(i32* nocapture %p) nounwind ssp {
97entry:
98; CHECK-LABEL: add5:
99; CHECK: addl $2
100  %0 = atomicrmw add i32* %p, i32 2 monotonic
101  ret void
102}
103
104define void @add1(i32* nocapture %p, i32 %v) nounwind ssp {
105entry:
106; CHECK-LABEL: add1:
107; CHECK: addl
108  %0 = atomicrmw add i32* %p, i32 %v monotonic
109  ret void
110}
111
112define void @dec4(i64* nocapture %p) nounwind ssp {
113entry:
114; CHECK-LABEL: dec4:
115; CHECK: decq
116  %0 = atomicrmw sub i64* %p, i64 1 monotonic
117  ret void
118}
119
120define void @sub8(i64* nocapture %p) nounwind ssp {
121entry:
122; CHECK-LABEL: sub8:
123; CHECK: subq $2
124  %0 = atomicrmw sub i64* %p, i64 2 monotonic
125  ret void
126}
127
128define void @sub4(i64* nocapture %p, i32 %v) nounwind ssp {
129entry:
130; CHECK-LABEL: sub4:
131; CHECK: subq
132	%0 = sext i32 %v to i64		; <i64> [#uses=1]
133  %1 = atomicrmw sub i64* %p, i64 %0 monotonic
134  ret void
135}
136
137define void @dec3(i8* nocapture %p) nounwind ssp {
138entry:
139; CHECK-LABEL: dec3:
140; CHECK: decb
141  %0 = atomicrmw sub i8* %p, i8 1 monotonic
142  ret void
143}
144
145define void @sub7(i8* nocapture %p) nounwind ssp {
146entry:
147; CHECK-LABEL: sub7:
148; CHECK: subb $2
149  %0 = atomicrmw sub i8* %p, i8 2 monotonic
150  ret void
151}
152
153define void @sub3(i8* nocapture %p, i32 %v) nounwind ssp {
154entry:
155; CHECK-LABEL: sub3:
156; CHECK: subb
157	%0 = trunc i32 %v to i8		; <i8> [#uses=1]
158  %1 = atomicrmw sub i8* %p, i8 %0 monotonic
159  ret void
160}
161
162define void @dec2(i16* nocapture %p) nounwind ssp {
163entry:
164; CHECK-LABEL: dec2:
165; CHECK: decw
166  %0 = atomicrmw sub i16* %p, i16 1 monotonic
167  ret void
168}
169
170define void @sub6(i16* nocapture %p) nounwind ssp {
171entry:
172; CHECK-LABEL: sub6:
173; CHECK: subw $2
174  %0 = atomicrmw sub i16* %p, i16 2 monotonic
175  ret void
176}
177
178define void @sub2(i16* nocapture %p, i32 %v) nounwind ssp {
179entry:
180; CHECK-LABEL: sub2:
181; CHECK-NOT: negl
182; CHECK: subw
183	%0 = trunc i32 %v to i16		; <i16> [#uses=1]
184  %1 = atomicrmw sub i16* %p, i16 %0 monotonic
185  ret void
186}
187
188define void @dec1(i32* nocapture %p) nounwind ssp {
189entry:
190; CHECK-LABEL: dec1:
191; CHECK: decl
192  %0 = atomicrmw sub i32* %p, i32 1 monotonic
193  ret void
194}
195
196define void @sub5(i32* nocapture %p) nounwind ssp {
197entry:
198; CHECK-LABEL: sub5:
199; CHECK: subl $2
200  %0 = atomicrmw sub i32* %p, i32 2 monotonic
201  ret void
202}
203