Mercurial > hg > CbC > CbC_llvm
comparison test/CodeGen/X86/x86-64-psub.ll @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 60c9769439b8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 ; RUN: llc -mtriple=x86_64-pc-linux -mcpu=corei7 < %s | FileCheck %s | |
2 | |
3 ; MMX packed sub opcodes were wrongly marked as commutative. | |
4 ; This test checks that the operands of packed sub instructions are | |
5 ; never interchanged by the "Two-Address instruction pass". | |
6 | |
7 declare { i64, double } @getFirstParam() | |
8 declare { i64, double } @getSecondParam() | |
9 | |
10 define i64 @test_psubb() { | |
11 entry: | |
12 %call = tail call { i64, double } @getFirstParam() | |
13 %0 = extractvalue { i64, double } %call, 0 | |
14 %call2 = tail call { i64, double } @getSecondParam() | |
15 %1 = extractvalue { i64, double } %call2, 0 | |
16 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
17 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
18 %2 = bitcast <1 x i64> %__m1.0.insert.i to <8 x i8> | |
19 %3 = bitcast <8 x i8> %2 to x86_mmx | |
20 %4 = bitcast <1 x i64> %__m2.0.insert.i to <8 x i8> | |
21 %5 = bitcast <8 x i8> %4 to x86_mmx | |
22 %6 = tail call x86_mmx @llvm.x86.mmx.psub.b(x86_mmx %3, x86_mmx %5) nounwind | |
23 %7 = bitcast x86_mmx %6 to <8 x i8> | |
24 %8 = bitcast <8 x i8> %7 to <1 x i64> | |
25 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
26 ret i64 %retval.0.extract.i15 | |
27 } | |
28 | |
29 ; CHECK-LABEL: test_psubb: | |
30 ; CHECK: callq getFirstParam | |
31 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
32 ; CHECK: callq getSecondParam | |
33 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
34 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
35 ; CHECK: psubb [[PARAM2]], [[PARAM1]] | |
36 ; CHECK: ret | |
37 | |
38 define i64 @test_psubw() { | |
39 entry: | |
40 %call = tail call { i64, double } @getFirstParam() | |
41 %0 = extractvalue { i64, double } %call, 0 | |
42 %call2 = tail call { i64, double } @getSecondParam() | |
43 %1 = extractvalue { i64, double } %call2, 0 | |
44 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
45 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
46 %2 = bitcast <1 x i64> %__m1.0.insert.i to <4 x i16> | |
47 %3 = bitcast <4 x i16> %2 to x86_mmx | |
48 %4 = bitcast <1 x i64> %__m2.0.insert.i to <4 x i16> | |
49 %5 = bitcast <4 x i16> %4 to x86_mmx | |
50 %6 = tail call x86_mmx @llvm.x86.mmx.psub.w(x86_mmx %3, x86_mmx %5) nounwind | |
51 %7 = bitcast x86_mmx %6 to <4 x i16> | |
52 %8 = bitcast <4 x i16> %7 to <1 x i64> | |
53 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
54 ret i64 %retval.0.extract.i15 | |
55 } | |
56 | |
57 ; CHECK-LABEL: test_psubw: | |
58 ; CHECK: callq getFirstParam | |
59 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
60 ; CHECK: callq getSecondParam | |
61 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
62 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
63 ; CHECK: psubw [[PARAM2]], [[PARAM1]] | |
64 ; CHECK: ret | |
65 | |
66 | |
67 define i64 @test_psubd() { | |
68 entry: | |
69 %call = tail call { i64, double } @getFirstParam() | |
70 %0 = extractvalue { i64, double } %call, 0 | |
71 %call2 = tail call { i64, double } @getSecondParam() | |
72 %1 = extractvalue { i64, double } %call2, 0 | |
73 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
74 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
75 %2 = bitcast <1 x i64> %__m1.0.insert.i to <2 x i32> | |
76 %3 = bitcast <2 x i32> %2 to x86_mmx | |
77 %4 = bitcast <1 x i64> %__m2.0.insert.i to <2 x i32> | |
78 %5 = bitcast <2 x i32> %4 to x86_mmx | |
79 %6 = tail call x86_mmx @llvm.x86.mmx.psub.d(x86_mmx %3, x86_mmx %5) nounwind | |
80 %7 = bitcast x86_mmx %6 to <2 x i32> | |
81 %8 = bitcast <2 x i32> %7 to <1 x i64> | |
82 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
83 ret i64 %retval.0.extract.i15 | |
84 } | |
85 | |
86 ; CHECK-LABEL: test_psubd: | |
87 ; CHECK: callq getFirstParam | |
88 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
89 ; CHECK: callq getSecondParam | |
90 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
91 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
92 ; CHECK: psubd [[PARAM2]], [[PARAM1]] | |
93 ; CHECK: ret | |
94 | |
95 define i64 @test_psubsb() { | |
96 entry: | |
97 %call = tail call { i64, double } @getFirstParam() | |
98 %0 = extractvalue { i64, double } %call, 0 | |
99 %call2 = tail call { i64, double } @getSecondParam() | |
100 %1 = extractvalue { i64, double } %call2, 0 | |
101 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
102 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
103 %2 = bitcast <1 x i64> %__m1.0.insert.i to <8 x i8> | |
104 %3 = bitcast <8 x i8> %2 to x86_mmx | |
105 %4 = bitcast <1 x i64> %__m2.0.insert.i to <8 x i8> | |
106 %5 = bitcast <8 x i8> %4 to x86_mmx | |
107 %6 = tail call x86_mmx @llvm.x86.mmx.psubs.b(x86_mmx %3, x86_mmx %5) nounwind | |
108 %7 = bitcast x86_mmx %6 to <8 x i8> | |
109 %8 = bitcast <8 x i8> %7 to <1 x i64> | |
110 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
111 ret i64 %retval.0.extract.i15 | |
112 } | |
113 | |
114 ; CHECK-LABEL: test_psubsb: | |
115 ; CHECK: callq getFirstParam | |
116 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
117 ; CHECK: callq getSecondParam | |
118 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
119 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
120 ; CHECK: psubsb [[PARAM2]], [[PARAM1]] | |
121 ; CHECK: ret | |
122 | |
123 define i64 @test_psubswv() { | |
124 entry: | |
125 %call = tail call { i64, double } @getFirstParam() | |
126 %0 = extractvalue { i64, double } %call, 0 | |
127 %call2 = tail call { i64, double } @getSecondParam() | |
128 %1 = extractvalue { i64, double } %call2, 0 | |
129 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
130 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
131 %2 = bitcast <1 x i64> %__m1.0.insert.i to <4 x i16> | |
132 %3 = bitcast <4 x i16> %2 to x86_mmx | |
133 %4 = bitcast <1 x i64> %__m2.0.insert.i to <4 x i16> | |
134 %5 = bitcast <4 x i16> %4 to x86_mmx | |
135 %6 = tail call x86_mmx @llvm.x86.mmx.psubs.w(x86_mmx %3, x86_mmx %5) nounwind | |
136 %7 = bitcast x86_mmx %6 to <4 x i16> | |
137 %8 = bitcast <4 x i16> %7 to <1 x i64> | |
138 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
139 ret i64 %retval.0.extract.i15 | |
140 } | |
141 | |
142 ; CHECK-LABEL: test_psubswv: | |
143 ; CHECK: callq getFirstParam | |
144 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
145 ; CHECK: callq getSecondParam | |
146 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
147 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
148 ; CHECK: psubsw [[PARAM2]], [[PARAM1]] | |
149 ; CHECK: ret | |
150 | |
151 define i64 @test_psubusbv() { | |
152 entry: | |
153 %call = tail call { i64, double } @getFirstParam() | |
154 %0 = extractvalue { i64, double } %call, 0 | |
155 %call2 = tail call { i64, double } @getSecondParam() | |
156 %1 = extractvalue { i64, double } %call2, 0 | |
157 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
158 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
159 %2 = bitcast <1 x i64> %__m1.0.insert.i to <8 x i8> | |
160 %3 = bitcast <8 x i8> %2 to x86_mmx | |
161 %4 = bitcast <1 x i64> %__m2.0.insert.i to <8 x i8> | |
162 %5 = bitcast <8 x i8> %4 to x86_mmx | |
163 %6 = tail call x86_mmx @llvm.x86.mmx.psubus.b(x86_mmx %3, x86_mmx %5) nounwind | |
164 %7 = bitcast x86_mmx %6 to <8 x i8> | |
165 %8 = bitcast <8 x i8> %7 to <1 x i64> | |
166 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
167 ret i64 %retval.0.extract.i15 | |
168 } | |
169 | |
170 ; CHECK-LABEL: test_psubusbv: | |
171 ; CHECK: callq getFirstParam | |
172 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
173 ; CHECK: callq getSecondParam | |
174 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
175 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
176 ; CHECK: psubusb [[PARAM2]], [[PARAM1]] | |
177 ; CHECK: ret | |
178 | |
179 define i64 @test_psubuswv() { | |
180 entry: | |
181 %call = tail call { i64, double } @getFirstParam() | |
182 %0 = extractvalue { i64, double } %call, 0 | |
183 %call2 = tail call { i64, double } @getSecondParam() | |
184 %1 = extractvalue { i64, double } %call2, 0 | |
185 %__m1.0.insert.i = insertelement <1 x i64> undef, i64 %0, i32 0 | |
186 %__m2.0.insert.i = insertelement <1 x i64> undef, i64 %1, i32 0 | |
187 %2 = bitcast <1 x i64> %__m1.0.insert.i to <4 x i16> | |
188 %3 = bitcast <4 x i16> %2 to x86_mmx | |
189 %4 = bitcast <1 x i64> %__m2.0.insert.i to <4 x i16> | |
190 %5 = bitcast <4 x i16> %4 to x86_mmx | |
191 %6 = tail call x86_mmx @llvm.x86.mmx.psubus.w(x86_mmx %3, x86_mmx %5) nounwind | |
192 %7 = bitcast x86_mmx %6 to <4 x i16> | |
193 %8 = bitcast <4 x i16> %7 to <1 x i64> | |
194 %retval.0.extract.i15 = extractelement <1 x i64> %8, i32 0 | |
195 ret i64 %retval.0.extract.i15 | |
196 } | |
197 | |
198 ; CHECK-LABEL: test_psubuswv: | |
199 ; CHECK: callq getFirstParam | |
200 ; CHECK: movq %rax, [[TEMP:%[a-z0-9]+]] | |
201 ; CHECK: callq getSecondParam | |
202 ; CHECK: movd [[TEMP]], [[PARAM1:%[a-z0-9]+]] | |
203 ; CHECK: movd %rax, [[PARAM2:%[a-z0-9]+]] | |
204 ; CHECK: psubusw [[PARAM2]], [[PARAM1]] | |
205 ; CHECK: ret | |
206 | |
207 | |
208 declare x86_mmx @llvm.x86.mmx.psubus.w(x86_mmx, x86_mmx) nounwind readnone | |
209 | |
210 declare x86_mmx @llvm.x86.mmx.psubus.b(x86_mmx, x86_mmx) nounwind readnone | |
211 | |
212 declare x86_mmx @llvm.x86.mmx.psubs.w(x86_mmx, x86_mmx) nounwind readnone | |
213 | |
214 declare x86_mmx @llvm.x86.mmx.psubs.b(x86_mmx, x86_mmx) nounwind readnone | |
215 | |
216 declare x86_mmx @llvm.x86.mmx.psub.d(x86_mmx, x86_mmx) nounwind readnone | |
217 | |
218 declare x86_mmx @llvm.x86.mmx.psub.w(x86_mmx, x86_mmx) nounwind readnone | |
219 | |
220 declare x86_mmx @llvm.x86.mmx.psub.b(x86_mmx, x86_mmx) nounwind readnone |