xref: /llvm-project/llvm/test/CodeGen/X86/apx/neg.ll (revision 20683de70e43fa73536ac1e8ce4082604048d040)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs | FileCheck --check-prefix=NF %s
4
5define i8 @neg8r(i8 noundef %a) {
6; CHECK-LABEL: neg8r:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    negb %dil, %al
9; CHECK-NEXT:    retq
10;
11; NF-LABEL: neg8r:
12; NF:       # %bb.0: # %entry
13; NF-NEXT:    {nf} negb %dil, %al
14; NF-NEXT:    retq
15entry:
16  %neg = sub i8 0, %a
17  ret i8 %neg
18}
19
20define i16 @neg16r(i16 noundef %a) {
21; CHECK-LABEL: neg16r:
22; CHECK:       # %bb.0: # %entry
23; CHECK-NEXT:    negw %di, %ax
24; CHECK-NEXT:    retq
25;
26; NF-LABEL: neg16r:
27; NF:       # %bb.0: # %entry
28; NF-NEXT:    {nf} negw %di, %ax
29; NF-NEXT:    retq
30entry:
31  %neg = sub i16 0, %a
32  ret i16 %neg
33}
34
35define i32 @neg32r(i32 noundef %a) {
36; CHECK-LABEL: neg32r:
37; CHECK:       # %bb.0: # %entry
38; CHECK-NEXT:    negl %edi, %eax
39; CHECK-NEXT:    retq
40;
41; NF-LABEL: neg32r:
42; NF:       # %bb.0: # %entry
43; NF-NEXT:    {nf} negl %edi, %eax
44; NF-NEXT:    retq
45entry:
46  %neg = sub i32 0, %a
47  ret i32 %neg
48}
49
50define i64 @neg64r(i64 noundef %a) {
51; CHECK-LABEL: neg64r:
52; CHECK:       # %bb.0: # %entry
53; CHECK-NEXT:    negq %rdi, %rax
54; CHECK-NEXT:    retq
55;
56; NF-LABEL: neg64r:
57; NF:       # %bb.0: # %entry
58; NF-NEXT:    {nf} negq %rdi, %rax
59; NF-NEXT:    retq
60entry:
61  %neg = sub i64 0, %a
62  ret i64 %neg
63}
64
65define i8 @neg8m(ptr %ptr) {
66; CHECK-LABEL: neg8m:
67; CHECK:       # %bb.0: # %entry
68; CHECK-NEXT:    negb (%rdi), %al
69; CHECK-NEXT:    retq
70;
71; NF-LABEL: neg8m:
72; NF:       # %bb.0: # %entry
73; NF-NEXT:    {nf} negb (%rdi), %al
74; NF-NEXT:    retq
75entry:
76  %a = load i8, ptr %ptr
77  %neg = sub i8 0, %a
78  ret i8 %neg
79}
80
81define i16 @neg16m(ptr %ptr) {
82; CHECK-LABEL: neg16m:
83; CHECK:       # %bb.0: # %entry
84; CHECK-NEXT:    negw (%rdi), %ax
85; CHECK-NEXT:    retq
86;
87; NF-LABEL: neg16m:
88; NF:       # %bb.0: # %entry
89; NF-NEXT:    {nf} negw (%rdi), %ax
90; NF-NEXT:    retq
91entry:
92  %a = load i16, ptr %ptr
93  %neg = sub i16 0, %a
94  ret i16 %neg
95}
96
97define i32 @neg32m(ptr %ptr) {
98; CHECK-LABEL: neg32m:
99; CHECK:       # %bb.0: # %entry
100; CHECK-NEXT:    negl (%rdi), %eax
101; CHECK-NEXT:    retq
102;
103; NF-LABEL: neg32m:
104; NF:       # %bb.0: # %entry
105; NF-NEXT:    {nf} negl (%rdi), %eax
106; NF-NEXT:    retq
107entry:
108  %a = load i32, ptr %ptr
109  %neg = sub i32 0, %a
110  ret i32 %neg
111}
112
113define i64 @neg64m(ptr %ptr) {
114; CHECK-LABEL: neg64m:
115; CHECK:       # %bb.0: # %entry
116; CHECK-NEXT:    negq (%rdi), %rax
117; CHECK-NEXT:    retq
118;
119; NF-LABEL: neg64m:
120; NF:       # %bb.0: # %entry
121; NF-NEXT:    {nf} negq (%rdi), %rax
122; NF-NEXT:    retq
123entry:
124  %a = load i64, ptr %ptr
125  %neg = sub i64 0, %a
126  ret i64 %neg
127}
128
129define i8 @uneg8r(i8 noundef %a) {
130; CHECK-LABEL: uneg8r:
131; CHECK:       # %bb.0: # %entry
132; CHECK-NEXT:    negb %dil, %al
133; CHECK-NEXT:    retq
134;
135; NF-LABEL: uneg8r:
136; NF:       # %bb.0: # %entry
137; NF-NEXT:    {nf} negb %dil, %al
138; NF-NEXT:    retq
139entry:
140  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a)
141  %neg = extractvalue {i8, i1} %t, 0
142  ret i8 %neg
143}
144
145define i16 @uneg16r(i16 noundef %a) {
146; CHECK-LABEL: uneg16r:
147; CHECK:       # %bb.0: # %entry
148; CHECK-NEXT:    negw %di, %ax
149; CHECK-NEXT:    retq
150;
151; NF-LABEL: uneg16r:
152; NF:       # %bb.0: # %entry
153; NF-NEXT:    {nf} negw %di, %ax
154; NF-NEXT:    retq
155entry:
156  %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a)
157  %neg = extractvalue {i16, i1} %t, 0
158  ret i16 %neg
159}
160
161define i32 @uneg32r(i32 noundef %a) {
162; CHECK-LABEL: uneg32r:
163; CHECK:       # %bb.0: # %entry
164; CHECK-NEXT:    negl %edi, %eax
165; CHECK-NEXT:    retq
166;
167; NF-LABEL: uneg32r:
168; NF:       # %bb.0: # %entry
169; NF-NEXT:    {nf} negl %edi, %eax
170; NF-NEXT:    retq
171entry:
172  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a)
173  %neg = extractvalue {i32, i1} %t, 0
174  ret i32 %neg
175}
176
177define i64 @uneg64r(i64 noundef %a) {
178; CHECK-LABEL: uneg64r:
179; CHECK:       # %bb.0: # %entry
180; CHECK-NEXT:    negq %rdi, %rax
181; CHECK-NEXT:    retq
182;
183; NF-LABEL: uneg64r:
184; NF:       # %bb.0: # %entry
185; NF-NEXT:    {nf} negq %rdi, %rax
186; NF-NEXT:    retq
187entry:
188  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a)
189  %neg = extractvalue {i64, i1} %t, 0
190  ret i64 %neg
191}
192
193define i8 @uneg8m(ptr %ptr) {
194; CHECK-LABEL: uneg8m:
195; CHECK:       # %bb.0: # %entry
196; CHECK-NEXT:    negb (%rdi), %al
197; CHECK-NEXT:    retq
198;
199; NF-LABEL: uneg8m:
200; NF:       # %bb.0: # %entry
201; NF-NEXT:    {nf} negb (%rdi), %al
202; NF-NEXT:    retq
203entry:
204  %a = load i8, ptr %ptr
205  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a)
206  %neg = extractvalue {i8, i1} %t, 0
207  ret i8 %neg
208}
209
210define i16 @uneg16m(ptr %ptr) {
211; CHECK-LABEL: uneg16m:
212; CHECK:       # %bb.0: # %entry
213; CHECK-NEXT:    negw (%rdi), %ax
214; CHECK-NEXT:    retq
215;
216; NF-LABEL: uneg16m:
217; NF:       # %bb.0: # %entry
218; NF-NEXT:    {nf} negw (%rdi), %ax
219; NF-NEXT:    retq
220entry:
221  %a = load i16, ptr %ptr
222  %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a)
223  %neg = extractvalue {i16, i1} %t, 0
224  ret i16 %neg
225}
226
227define i32 @uneg32m(ptr %ptr) {
228; CHECK-LABEL: uneg32m:
229; CHECK:       # %bb.0: # %entry
230; CHECK-NEXT:    negl (%rdi), %eax
231; CHECK-NEXT:    retq
232;
233; NF-LABEL: uneg32m:
234; NF:       # %bb.0: # %entry
235; NF-NEXT:    {nf} negl (%rdi), %eax
236; NF-NEXT:    retq
237entry:
238  %a = load i32, ptr %ptr
239  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a)
240  %neg = extractvalue {i32, i1} %t, 0
241  ret i32 %neg
242}
243
244define i64 @uneg64m(ptr %ptr) {
245; CHECK-LABEL: uneg64m:
246; CHECK:       # %bb.0: # %entry
247; CHECK-NEXT:    negq (%rdi), %rax
248; CHECK-NEXT:    retq
249;
250; NF-LABEL: uneg64m:
251; NF:       # %bb.0: # %entry
252; NF-NEXT:    {nf} negq (%rdi), %rax
253; NF-NEXT:    retq
254entry:
255  %a = load i64, ptr %ptr
256  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a)
257  %neg = extractvalue {i64, i1} %t, 0
258  ret i64 %neg
259}
260
261declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
262declare {i16, i1} @llvm.usub.with.overflow.i16(i16, i16)
263declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32)
264declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64)
265
266define void @neg8m_legacy(ptr %ptr) {
267; CHECK-LABEL: neg8m_legacy:
268; CHECK:       # %bb.0: # %entry
269; CHECK-NEXT:    negb (%rdi)
270; CHECK-NEXT:    retq
271;
272; NF-LABEL: neg8m_legacy:
273; NF:       # %bb.0: # %entry
274; NF-NEXT:    negb (%rdi)
275; NF-NEXT:    retq
276entry:
277  %a = load i8, ptr %ptr
278  %neg = sub i8 0, %a
279  store i8 %neg, ptr %ptr
280  ret void
281}
282
283define void @neg16m_legacy(ptr %ptr) {
284; CHECK-LABEL: neg16m_legacy:
285; CHECK:       # %bb.0: # %entry
286; CHECK-NEXT:    negw (%rdi)
287; CHECK-NEXT:    retq
288;
289; NF-LABEL: neg16m_legacy:
290; NF:       # %bb.0: # %entry
291; NF-NEXT:    negw (%rdi)
292; NF-NEXT:    retq
293entry:
294  %a = load i16, ptr %ptr
295  %neg = sub i16 0, %a
296  store i16 %neg, ptr %ptr
297  ret void
298}
299
300define void @neg32m_legacy(ptr %ptr) {
301; CHECK-LABEL: neg32m_legacy:
302; CHECK:       # %bb.0: # %entry
303; CHECK-NEXT:    negl (%rdi)
304; CHECK-NEXT:    retq
305;
306; NF-LABEL: neg32m_legacy:
307; NF:       # %bb.0: # %entry
308; NF-NEXT:    negl (%rdi)
309; NF-NEXT:    retq
310entry:
311  %a = load i32, ptr %ptr
312  %neg = sub i32 0, %a
313  store i32 %neg, ptr %ptr
314  ret void
315}
316
317define void @neg64m_legacy(ptr %ptr) {
318; CHECK-LABEL: neg64m_legacy:
319; CHECK:       # %bb.0: # %entry
320; CHECK-NEXT:    negq (%rdi)
321; CHECK-NEXT:    retq
322;
323; NF-LABEL: neg64m_legacy:
324; NF:       # %bb.0: # %entry
325; NF-NEXT:    negq (%rdi)
326; NF-NEXT:    retq
327entry:
328  %a = load i64, ptr %ptr
329  %neg = sub i64 0, %a
330  store i64 %neg, ptr %ptr
331  ret void
332}
333