blob: 03d2e472cba670dccfad2ecabf9e4c9fbe15ca69 [file] [log] [blame]
Andrew Trick922d3142012-02-01 23:20:51 +00001; RUN: llc < %s -mcpu=generic -march=x86 | FileCheck %s -check-prefix=X32
Jakob Stoklund Olesened18a3e2012-05-17 23:44:19 +00002; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux | FileCheck %s -check-prefix=X64
3; RUN: llc < %s -mcpu=generic -mtriple=x86_64-win32 | FileCheck %s -check-prefix=X64
Chris Lattner71d845c2010-02-09 06:24:00 +00004
5; The immediate can be encoded in a smaller way if the
6; instruction is a sub instead of an add.
7
8define i32 @test1(i32 inreg %a) nounwind {
9 %b = add i32 %a, 128
10 ret i32 %b
11; X32: subl $-128, %eax
12; X64: subl $-128,
13}
14define i64 @test2(i64 inreg %a) nounwind {
15 %b = add i64 %a, 2147483648
16 ret i64 %b
17; X32: addl $-2147483648, %eax
18; X64: subq $-2147483648,
19}
20define i64 @test3(i64 inreg %a) nounwind {
21 %b = add i64 %a, 128
22 ret i64 %b
23
24; X32: addl $128, %eax
25; X64: subq $-128,
26}
Chris Lattner78162392010-02-09 06:33:27 +000027
28define i1 @test4(i32 %v1, i32 %v2, i32* %X) nounwind {
29entry:
30 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
31 %sum = extractvalue {i32, i1} %t, 0
32 %obit = extractvalue {i32, i1} %t, 1
33 br i1 %obit, label %overflow, label %normal
34
35normal:
36 store i32 0, i32* %X
37 br label %overflow
38
39overflow:
40 ret i1 false
41
42; X32: test4:
43; X32: addl
44; X32-NEXT: jo
45
46; X64: test4:
NAKAMURA Takumi52ae4ca2011-02-22 07:19:12 +000047; X64: addl %e[[A1:si|dx]], %e[[A0:di|cx]]
Chris Lattner78162392010-02-09 06:33:27 +000048; X64-NEXT: jo
49}
50
51define i1 @test5(i32 %v1, i32 %v2, i32* %X) nounwind {
52entry:
53 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
54 %sum = extractvalue {i32, i1} %t, 0
55 %obit = extractvalue {i32, i1} %t, 1
56 br i1 %obit, label %carry, label %normal
57
58normal:
59 store i32 0, i32* %X
60 br label %carry
61
62carry:
63 ret i1 false
64
65; X32: test5:
66; X32: addl
67; X32-NEXT: jb
68
69; X64: test5:
NAKAMURA Takumi52ae4ca2011-02-22 07:19:12 +000070; X64: addl %e[[A1]], %e[[A0]]
Chris Lattner78162392010-02-09 06:33:27 +000071; X64-NEXT: jb
72}
73
74declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)
75declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)
Chris Lattnerb00cd1c2010-02-09 06:35:50 +000076
77
78define i64 @test6(i64 %A, i32 %B) nounwind {
79 %tmp12 = zext i32 %B to i64 ; <i64> [#uses=1]
80 %tmp3 = shl i64 %tmp12, 32 ; <i64> [#uses=1]
81 %tmp5 = add i64 %tmp3, %A ; <i64> [#uses=1]
82 ret i64 %tmp5
83
84; X32: test6:
85; X32: movl 12(%esp), %edx
86; X32-NEXT: addl 8(%esp), %edx
87; X32-NEXT: movl 4(%esp), %eax
88; X32-NEXT: ret
89
90; X64: test6:
NAKAMURA Takumi52ae4ca2011-02-22 07:19:12 +000091; X64: shlq $32, %r[[A1]]
92; X64: leaq (%r[[A1]],%r[[A0]]), %rax
Chris Lattnerb00cd1c2010-02-09 06:35:50 +000093; X64: ret
94}
95
Chris Lattner39ffcb72010-12-20 01:16:03 +000096define {i32, i1} @test7(i32 %v1, i32 %v2) nounwind {
97 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
98 ret {i32, i1} %t
99}
100
101; X64: test7:
Jakob Stoklund Olesened18a3e2012-05-17 23:44:19 +0000102; X64: addl %e[[A1]], %e
Chris Lattner39ffcb72010-12-20 01:16:03 +0000103; X64-NEXT: setb %dl
Jakob Stoklund Olesened18a3e2012-05-17 23:44:19 +0000104; X64: ret
Chris Lattner23a01992010-12-20 01:37:09 +0000105
106; PR5443
107define {i64, i1} @test8(i64 %left, i64 %right) nounwind {
108entry:
109 %extleft = zext i64 %left to i65
110 %extright = zext i64 %right to i65
111 %sum = add i65 %extleft, %extright
112 %res.0 = trunc i65 %sum to i64
113 %overflow = and i65 %sum, -18446744073709551616
114 %res.1 = icmp ne i65 %overflow, 0
115 %final0 = insertvalue {i64, i1} undef, i64 %res.0, 0
116 %final1 = insertvalue {i64, i1} %final0, i1 %res.1, 1
117 ret {i64, i1} %final1
118}
119
120; X64: test8:
121; X64: addq
122; X64-NEXT: sbbq
123; X64-NEXT: testb
Benjamin Kramerf50125e2010-12-22 23:17:45 +0000124
125define i32 @test9(i32 %x, i32 %y) nounwind readnone {
126 %cmp = icmp eq i32 %x, 10
127 %sub = sext i1 %cmp to i32
128 %cond = add i32 %sub, %y
129 ret i32 %cond
130; X64: test9:
131; X64: cmpl $10
132; X64: sete
133; X64: subl
134; X64: ret
135}
Benjamin Kramerc175a4b2011-03-08 15:20:20 +0000136
137define i1 @test10(i32 %x) nounwind {
138entry:
139 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %x, i32 1)
140 %obit = extractvalue {i32, i1} %t, 1
141 ret i1 %obit
142
143; X32: test10:
144; X32: incl
145; X32-NEXT: seto
146
147; X64: test10:
148; X64: incl
149; X64-NEXT: seto
150}