blob: 865930af725aee325f8e26bfb1d50a412b33bd09 [file] [log] [blame]
Chris Lattner7a05e6d2010-08-28 20:42:31 +00001//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This defines functionality used to emit comments about X86 instructions to
11// an output stream for -fverbose-asm.
12//
13//===----------------------------------------------------------------------===//
14
15#include "X86InstComments.h"
Evan Cheng3ddfbd32011-07-06 22:01:53 +000016#include "MCTargetDesc/X86MCTargetDesc.h"
Evan Cheng11424442011-07-26 00:24:13 +000017#include "Utils/X86ShuffleDecode.h"
Chris Lattner7a05e6d2010-08-28 20:42:31 +000018#include "llvm/MC/MCInst.h"
19#include "llvm/Support/raw_ostream.h"
20using namespace llvm;
21
22//===----------------------------------------------------------------------===//
Chris Lattner7a05e6d2010-08-28 20:42:31 +000023// Top Level Entrypoint
24//===----------------------------------------------------------------------===//
25
Chris Lattner7a05e6d2010-08-28 20:42:31 +000026/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
27/// newline terminated strings to the specified string if desired. This
28/// information is shown in disassembly dumps when verbose assembly is enabled.
29void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
30 const char *(*getRegName)(unsigned)) {
31 // If this is a shuffle operation, the switch should fill in this state.
Craig Toppercbc96a62012-03-20 06:42:26 +000032 SmallVector<int, 8> ShuffleMask;
Chris Lattner7a05e6d2010-08-28 20:42:31 +000033 const char *DestName = 0, *Src1Name = 0, *Src2Name = 0;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000034
Chris Lattner7a05e6d2010-08-28 20:42:31 +000035 switch (MI->getOpcode()) {
36 case X86::INSERTPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000037 Src1Name = getRegName(MI->getOperand(0).getReg());
38 Src2Name = getRegName(MI->getOperand(2).getReg());
39 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
40 break;
41 case X86::VINSERTPSrr:
42 DestName = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +000043 Src1Name = getRegName(MI->getOperand(1).getReg());
44 Src2Name = getRegName(MI->getOperand(2).getReg());
45 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
46 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000047
Chris Lattner38ccc8b2010-08-29 03:08:08 +000048 case X86::MOVLHPSrr:
49 Src2Name = getRegName(MI->getOperand(2).getReg());
50 Src1Name = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes814a69c2010-09-02 21:51:11 +000051 DecodeMOVLHPSMask(2, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +000052 break;
Craig Topper83c45922011-11-22 14:27:57 +000053 case X86::VMOVLHPSrr:
54 Src2Name = getRegName(MI->getOperand(2).getReg());
55 Src1Name = getRegName(MI->getOperand(1).getReg());
56 DestName = getRegName(MI->getOperand(0).getReg());
57 DecodeMOVLHPSMask(2, ShuffleMask);
58 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000059
Chris Lattner38ccc8b2010-08-29 03:08:08 +000060 case X86::MOVHLPSrr:
61 Src2Name = getRegName(MI->getOperand(2).getReg());
62 Src1Name = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes814a69c2010-09-02 21:51:11 +000063 DecodeMOVHLPSMask(2, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +000064 break;
Craig Topper83c45922011-11-22 14:27:57 +000065 case X86::VMOVHLPSrr:
66 Src2Name = getRegName(MI->getOperand(2).getReg());
67 Src1Name = getRegName(MI->getOperand(1).getReg());
68 DestName = getRegName(MI->getOperand(0).getReg());
69 DecodeMOVHLPSMask(2, ShuffleMask);
70 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000071
Benjamin Kramer6a935962013-01-26 13:31:37 +000072 case X86::PALIGNR128rr:
73 case X86::VPALIGNR128rr:
74 Src1Name = getRegName(MI->getOperand(2).getReg());
75 // FALL THROUGH.
76 case X86::PALIGNR128rm:
77 case X86::VPALIGNR128rm:
78 Src2Name = getRegName(MI->getOperand(1).getReg());
79 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper8fb09f02013-01-28 06:48:25 +000080 DecodePALIGNRMask(MVT::v16i8,
81 MI->getOperand(MI->getNumOperands()-1).getImm(),
82 ShuffleMask);
Benjamin Kramer6a935962013-01-26 13:31:37 +000083 break;
84 case X86::VPALIGNR256rr:
85 Src1Name = getRegName(MI->getOperand(2).getReg());
86 // FALL THROUGH.
87 case X86::VPALIGNR256rm:
88 Src2Name = getRegName(MI->getOperand(1).getReg());
89 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper8fb09f02013-01-28 06:48:25 +000090 DecodePALIGNRMask(MVT::v32i8,
91 MI->getOperand(MI->getNumOperands()-1).getImm(),
92 ShuffleMask);
Craig Topper71d99ff2013-01-28 07:19:11 +000093 break;
Benjamin Kramer6a935962013-01-26 13:31:37 +000094
Chris Lattner7a05e6d2010-08-28 20:42:31 +000095 case X86::PSHUFDri:
Craig Topper83c45922011-11-22 14:27:57 +000096 case X86::VPSHUFDri:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000097 Src1Name = getRegName(MI->getOperand(1).getReg());
98 // FALL THROUGH.
99 case X86::PSHUFDmi:
Craig Topper83c45922011-11-22 14:27:57 +0000100 case X86::VPSHUFDmi:
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000101 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper1f710572012-02-06 07:17:51 +0000102 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
103 ShuffleMask);
104 break;
105 case X86::VPSHUFDYri:
106 Src1Name = getRegName(MI->getOperand(1).getReg());
107 // FALL THROUGH.
108 case X86::VPSHUFDYmi:
109 DestName = getRegName(MI->getOperand(0).getReg());
110 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000111 ShuffleMask);
112 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000113
Craig Topper1f710572012-02-06 07:17:51 +0000114
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000115 case X86::PSHUFHWri:
Craig Topper83c45922011-11-22 14:27:57 +0000116 case X86::VPSHUFHWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000117 Src1Name = getRegName(MI->getOperand(1).getReg());
118 // FALL THROUGH.
119 case X86::PSHUFHWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000120 case X86::VPSHUFHWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000121 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperc73bc392012-05-02 08:03:44 +0000122 DecodePSHUFHWMask(MVT::v8i16,
123 MI->getOperand(MI->getNumOperands()-1).getImm(),
124 ShuffleMask);
125 break;
126 case X86::VPSHUFHWYri:
127 Src1Name = getRegName(MI->getOperand(1).getReg());
128 // FALL THROUGH.
129 case X86::VPSHUFHWYmi:
130 DestName = getRegName(MI->getOperand(0).getReg());
131 DecodePSHUFHWMask(MVT::v16i16,
132 MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000133 ShuffleMask);
134 break;
135 case X86::PSHUFLWri:
Craig Topper83c45922011-11-22 14:27:57 +0000136 case X86::VPSHUFLWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000137 Src1Name = getRegName(MI->getOperand(1).getReg());
138 // FALL THROUGH.
139 case X86::PSHUFLWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000140 case X86::VPSHUFLWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000141 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperc73bc392012-05-02 08:03:44 +0000142 DecodePSHUFLWMask(MVT::v8i16,
143 MI->getOperand(MI->getNumOperands()-1).getImm(),
144 ShuffleMask);
145 break;
146 case X86::VPSHUFLWYri:
147 Src1Name = getRegName(MI->getOperand(1).getReg());
148 // FALL THROUGH.
149 case X86::VPSHUFLWYmi:
150 DestName = getRegName(MI->getOperand(0).getReg());
151 DecodePSHUFLWMask(MVT::v16i16,
152 MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000153 ShuffleMask);
154 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000155
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000156 case X86::PUNPCKHBWrr:
157 Src2Name = getRegName(MI->getOperand(2).getReg());
158 // FALL THROUGH.
159 case X86::PUNPCKHBWrm:
160 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000161 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
162 break;
163 case X86::VPUNPCKHBWrr:
164 Src2Name = getRegName(MI->getOperand(2).getReg());
165 // FALL THROUGH.
166 case X86::VPUNPCKHBWrm:
167 Src1Name = getRegName(MI->getOperand(1).getReg());
168 DestName = getRegName(MI->getOperand(0).getReg());
169 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
170 break;
171 case X86::VPUNPCKHBWYrr:
172 Src2Name = getRegName(MI->getOperand(2).getReg());
173 // FALL THROUGH.
174 case X86::VPUNPCKHBWYrm:
175 Src1Name = getRegName(MI->getOperand(1).getReg());
176 DestName = getRegName(MI->getOperand(0).getReg());
177 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000178 break;
179 case X86::PUNPCKHWDrr:
180 Src2Name = getRegName(MI->getOperand(2).getReg());
181 // FALL THROUGH.
182 case X86::PUNPCKHWDrm:
183 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000184 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
185 break;
186 case X86::VPUNPCKHWDrr:
187 Src2Name = getRegName(MI->getOperand(2).getReg());
188 // FALL THROUGH.
189 case X86::VPUNPCKHWDrm:
190 Src1Name = getRegName(MI->getOperand(1).getReg());
191 DestName = getRegName(MI->getOperand(0).getReg());
192 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
193 break;
194 case X86::VPUNPCKHWDYrr:
195 Src2Name = getRegName(MI->getOperand(2).getReg());
196 // FALL THROUGH.
197 case X86::VPUNPCKHWDYrm:
198 Src1Name = getRegName(MI->getOperand(1).getReg());
199 DestName = getRegName(MI->getOperand(0).getReg());
200 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000201 break;
202 case X86::PUNPCKHDQrr:
203 Src2Name = getRegName(MI->getOperand(2).getReg());
204 // FALL THROUGH.
205 case X86::PUNPCKHDQrm:
206 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000207 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
208 break;
209 case X86::VPUNPCKHDQrr:
210 Src2Name = getRegName(MI->getOperand(2).getReg());
211 // FALL THROUGH.
212 case X86::VPUNPCKHDQrm:
213 Src1Name = getRegName(MI->getOperand(1).getReg());
214 DestName = getRegName(MI->getOperand(0).getReg());
215 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
216 break;
217 case X86::VPUNPCKHDQYrr:
218 Src2Name = getRegName(MI->getOperand(2).getReg());
219 // FALL THROUGH.
220 case X86::VPUNPCKHDQYrm:
221 Src1Name = getRegName(MI->getOperand(1).getReg());
222 DestName = getRegName(MI->getOperand(0).getReg());
223 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000224 break;
225 case X86::PUNPCKHQDQrr:
226 Src2Name = getRegName(MI->getOperand(2).getReg());
227 // FALL THROUGH.
228 case X86::PUNPCKHQDQrm:
229 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000230 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
231 break;
232 case X86::VPUNPCKHQDQrr:
233 Src2Name = getRegName(MI->getOperand(2).getReg());
234 // FALL THROUGH.
235 case X86::VPUNPCKHQDQrm:
236 Src1Name = getRegName(MI->getOperand(1).getReg());
237 DestName = getRegName(MI->getOperand(0).getReg());
238 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
239 break;
240 case X86::VPUNPCKHQDQYrr:
241 Src2Name = getRegName(MI->getOperand(2).getReg());
242 // FALL THROUGH.
243 case X86::VPUNPCKHQDQYrm:
244 Src1Name = getRegName(MI->getOperand(1).getReg());
245 DestName = getRegName(MI->getOperand(0).getReg());
246 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000247 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000248
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000249 case X86::PUNPCKLBWrr:
250 Src2Name = getRegName(MI->getOperand(2).getReg());
251 // FALL THROUGH.
252 case X86::PUNPCKLBWrm:
253 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000254 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
255 break;
256 case X86::VPUNPCKLBWrr:
257 Src2Name = getRegName(MI->getOperand(2).getReg());
258 // FALL THROUGH.
259 case X86::VPUNPCKLBWrm:
260 Src1Name = getRegName(MI->getOperand(1).getReg());
261 DestName = getRegName(MI->getOperand(0).getReg());
262 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
263 break;
264 case X86::VPUNPCKLBWYrr:
265 Src2Name = getRegName(MI->getOperand(2).getReg());
266 // FALL THROUGH.
267 case X86::VPUNPCKLBWYrm:
268 Src1Name = getRegName(MI->getOperand(1).getReg());
269 DestName = getRegName(MI->getOperand(0).getReg());
270 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000271 break;
272 case X86::PUNPCKLWDrr:
273 Src2Name = getRegName(MI->getOperand(2).getReg());
274 // FALL THROUGH.
275 case X86::PUNPCKLWDrm:
276 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000277 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
278 break;
279 case X86::VPUNPCKLWDrr:
280 Src2Name = getRegName(MI->getOperand(2).getReg());
281 // FALL THROUGH.
282 case X86::VPUNPCKLWDrm:
283 Src1Name = getRegName(MI->getOperand(1).getReg());
284 DestName = getRegName(MI->getOperand(0).getReg());
285 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
286 break;
287 case X86::VPUNPCKLWDYrr:
288 Src2Name = getRegName(MI->getOperand(2).getReg());
289 // FALL THROUGH.
290 case X86::VPUNPCKLWDYrm:
291 Src1Name = getRegName(MI->getOperand(1).getReg());
292 DestName = getRegName(MI->getOperand(0).getReg());
293 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000294 break;
295 case X86::PUNPCKLDQrr:
296 Src2Name = getRegName(MI->getOperand(2).getReg());
297 // FALL THROUGH.
298 case X86::PUNPCKLDQrm:
299 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000300 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
301 break;
302 case X86::VPUNPCKLDQrr:
303 Src2Name = getRegName(MI->getOperand(2).getReg());
304 // FALL THROUGH.
305 case X86::VPUNPCKLDQrm:
306 Src1Name = getRegName(MI->getOperand(1).getReg());
307 DestName = getRegName(MI->getOperand(0).getReg());
308 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
309 break;
310 case X86::VPUNPCKLDQYrr:
311 Src2Name = getRegName(MI->getOperand(2).getReg());
312 // FALL THROUGH.
313 case X86::VPUNPCKLDQYrm:
314 Src1Name = getRegName(MI->getOperand(1).getReg());
315 DestName = getRegName(MI->getOperand(0).getReg());
316 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000317 break;
318 case X86::PUNPCKLQDQrr:
319 Src2Name = getRegName(MI->getOperand(2).getReg());
320 // FALL THROUGH.
321 case X86::PUNPCKLQDQrm:
322 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000323 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
324 break;
325 case X86::VPUNPCKLQDQrr:
326 Src2Name = getRegName(MI->getOperand(2).getReg());
327 // FALL THROUGH.
328 case X86::VPUNPCKLQDQrm:
329 Src1Name = getRegName(MI->getOperand(1).getReg());
330 DestName = getRegName(MI->getOperand(0).getReg());
331 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
332 break;
333 case X86::VPUNPCKLQDQYrr:
334 Src2Name = getRegName(MI->getOperand(2).getReg());
335 // FALL THROUGH.
336 case X86::VPUNPCKLQDQYrm:
337 Src1Name = getRegName(MI->getOperand(1).getReg());
338 DestName = getRegName(MI->getOperand(0).getReg());
339 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000340 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000341
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000342 case X86::SHUFPDrri:
Bruno Cardoso Lopes54366cc2011-08-25 02:58:21 +0000343 Src2Name = getRegName(MI->getOperand(2).getReg());
344 // FALL THROUGH.
345 case X86::SHUFPDrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000346 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
347 ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000348 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000349 break;
Craig Topper83c45922011-11-22 14:27:57 +0000350 case X86::VSHUFPDrri:
351 Src2Name = getRegName(MI->getOperand(2).getReg());
352 // FALL THROUGH.
353 case X86::VSHUFPDrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000354 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
355 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000356 Src1Name = getRegName(MI->getOperand(1).getReg());
357 DestName = getRegName(MI->getOperand(0).getReg());
358 break;
359 case X86::VSHUFPDYrri:
360 Src2Name = getRegName(MI->getOperand(2).getReg());
361 // FALL THROUGH.
362 case X86::VSHUFPDYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000363 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
364 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000365 Src1Name = getRegName(MI->getOperand(1).getReg());
366 DestName = getRegName(MI->getOperand(0).getReg());
367 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000368
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000369 case X86::SHUFPSrri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000370 Src2Name = getRegName(MI->getOperand(2).getReg());
371 // FALL THROUGH.
372 case X86::SHUFPSrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000373 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
374 ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000375 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000376 break;
Craig Topper83c45922011-11-22 14:27:57 +0000377 case X86::VSHUFPSrri:
378 Src2Name = getRegName(MI->getOperand(2).getReg());
379 // FALL THROUGH.
380 case X86::VSHUFPSrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000381 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
382 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000383 Src1Name = getRegName(MI->getOperand(1).getReg());
384 DestName = getRegName(MI->getOperand(0).getReg());
385 break;
386 case X86::VSHUFPSYrri:
387 Src2Name = getRegName(MI->getOperand(2).getReg());
388 // FALL THROUGH.
389 case X86::VSHUFPSYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000390 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
391 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000392 Src1Name = getRegName(MI->getOperand(1).getReg());
393 DestName = getRegName(MI->getOperand(0).getReg());
394 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000395
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000396 case X86::UNPCKLPDrr:
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000397 Src2Name = getRegName(MI->getOperand(2).getReg());
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000398 // FALL THROUGH.
399 case X86::UNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000400 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000401 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000402 break;
David Greene20a1cbe2011-02-28 19:06:56 +0000403 case X86::VUNPCKLPDrr:
404 Src2Name = getRegName(MI->getOperand(2).getReg());
405 // FALL THROUGH.
406 case X86::VUNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000407 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000408 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000409 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000410 break;
411 case X86::VUNPCKLPDYrr:
412 Src2Name = getRegName(MI->getOperand(2).getReg());
413 // FALL THROUGH.
414 case X86::VUNPCKLPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000415 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000416 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000417 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000418 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000419 case X86::UNPCKLPSrr:
420 Src2Name = getRegName(MI->getOperand(2).getReg());
421 // FALL THROUGH.
422 case X86::UNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000423 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000424 Src1Name = getRegName(MI->getOperand(0).getReg());
425 break;
David Greene20a1cbe2011-02-28 19:06:56 +0000426 case X86::VUNPCKLPSrr:
427 Src2Name = getRegName(MI->getOperand(2).getReg());
428 // FALL THROUGH.
429 case X86::VUNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000430 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000431 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000432 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000433 break;
434 case X86::VUNPCKLPSYrr:
435 Src2Name = getRegName(MI->getOperand(2).getReg());
436 // FALL THROUGH.
437 case X86::VUNPCKLPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000438 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000439 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000440 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000441 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000442 case X86::UNPCKHPDrr:
443 Src2Name = getRegName(MI->getOperand(2).getReg());
444 // FALL THROUGH.
445 case X86::UNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000446 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000447 Src1Name = getRegName(MI->getOperand(0).getReg());
448 break;
Craig Topperccb70972011-11-22 01:57:35 +0000449 case X86::VUNPCKHPDrr:
450 Src2Name = getRegName(MI->getOperand(2).getReg());
451 // FALL THROUGH.
452 case X86::VUNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000453 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000454 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000455 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000456 break;
457 case X86::VUNPCKHPDYrr:
458 Src2Name = getRegName(MI->getOperand(2).getReg());
459 // FALL THROUGH.
460 case X86::VUNPCKHPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000461 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000462 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000463 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000464 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000465 case X86::UNPCKHPSrr:
466 Src2Name = getRegName(MI->getOperand(2).getReg());
467 // FALL THROUGH.
468 case X86::UNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000469 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000470 Src1Name = getRegName(MI->getOperand(0).getReg());
471 break;
Craig Topperccb70972011-11-22 01:57:35 +0000472 case X86::VUNPCKHPSrr:
473 Src2Name = getRegName(MI->getOperand(2).getReg());
474 // FALL THROUGH.
475 case X86::VUNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000476 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000477 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000478 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000479 break;
480 case X86::VUNPCKHPSYrr:
481 Src2Name = getRegName(MI->getOperand(2).getReg());
482 // FALL THROUGH.
483 case X86::VUNPCKHPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000484 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000485 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000486 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000487 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000488 case X86::VPERMILPSri:
Craig Topperc16db842011-11-29 07:49:05 +0000489 Src1Name = getRegName(MI->getOperand(1).getReg());
490 // FALL THROUGH.
491 case X86::VPERMILPSmi:
Craig Topper1f710572012-02-06 07:17:51 +0000492 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
493 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000494 DestName = getRegName(MI->getOperand(0).getReg());
Duncan Sands00f39c12011-08-04 15:45:59 +0000495 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000496 case X86::VPERMILPSYri:
Craig Topperc16db842011-11-29 07:49:05 +0000497 Src1Name = getRegName(MI->getOperand(1).getReg());
498 // FALL THROUGH.
499 case X86::VPERMILPSYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000500 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
501 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000502 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000503 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000504 case X86::VPERMILPDri:
Craig Topperc16db842011-11-29 07:49:05 +0000505 Src1Name = getRegName(MI->getOperand(1).getReg());
506 // FALL THROUGH.
507 case X86::VPERMILPDmi:
Craig Topper1f710572012-02-06 07:17:51 +0000508 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
509 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000510 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000511 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000512 case X86::VPERMILPDYri:
Craig Topperc16db842011-11-29 07:49:05 +0000513 Src1Name = getRegName(MI->getOperand(1).getReg());
514 // FALL THROUGH.
515 case X86::VPERMILPDYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000516 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperbafd2242011-11-30 06:25:25 +0000517 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000518 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000519 break;
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000520 case X86::VPERM2F128rr:
Craig Topperc16db842011-11-29 07:49:05 +0000521 case X86::VPERM2I128rr:
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000522 Src2Name = getRegName(MI->getOperand(2).getReg());
Craig Topperc16db842011-11-29 07:49:05 +0000523 // FALL THROUGH.
524 case X86::VPERM2F128rm:
525 case X86::VPERM2I128rm:
Craig Topper1f710572012-02-06 07:17:51 +0000526 // For instruction comments purpose, assume the 256-bit vector is v4i64.
527 DecodeVPERM2X128Mask(MVT::v4i64,
528 MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperc16db842011-11-29 07:49:05 +0000529 ShuffleMask);
530 Src1Name = getRegName(MI->getOperand(1).getReg());
531 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000532 break;
Craig Topper54bdb352012-05-06 18:44:02 +0000533 case X86::VPERMQYri:
534 case X86::VPERMPDYri:
535 Src1Name = getRegName(MI->getOperand(1).getReg());
536 // FALL THROUGH.
537 case X86::VPERMQYmi:
538 case X86::VPERMPDYmi:
539 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
540 ShuffleMask);
541 DestName = getRegName(MI->getOperand(0).getReg());
542 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000543 }
544
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000545
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000546 // If this was a shuffle operation, print the shuffle mask.
547 if (!ShuffleMask.empty()) {
548 if (DestName == 0) DestName = Src1Name;
549 OS << (DestName ? DestName : "mem") << " = ";
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000550
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000551 // If the two sources are the same, canonicalize the input elements to be
552 // from the first src so that we get larger element spans.
553 if (Src1Name == Src2Name) {
554 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
555 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
Craig Toppercbc96a62012-03-20 06:42:26 +0000556 ShuffleMask[i] >= (int)e) // From second mask.
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000557 ShuffleMask[i] -= e;
558 }
559 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000560
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000561 // The shuffle mask specifies which elements of the src1/src2 fill in the
562 // destination, with a few sentinel values. Loop through and print them
563 // out.
564 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
565 if (i != 0)
566 OS << ',';
Benjamin Kramerbc106672012-03-21 13:48:11 +0000567 if (ShuffleMask[i] == SM_SentinelZero) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000568 OS << "zero";
569 continue;
570 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000571
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000572 // Otherwise, it must come from src1 or src2. Print the span of elements
573 // that comes from this src.
Craig Toppercbc96a62012-03-20 06:42:26 +0000574 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000575 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
576 OS << (SrcName ? SrcName : "mem") << '[';
577 bool IsFirst = true;
578 while (i != e &&
579 (int)ShuffleMask[i] >= 0 &&
Craig Toppercbc96a62012-03-20 06:42:26 +0000580 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000581 if (!IsFirst)
582 OS << ',';
583 else
584 IsFirst = false;
585 OS << ShuffleMask[i] % ShuffleMask.size();
586 ++i;
587 }
588 OS << ']';
589 --i; // For loop increments element #.
590 }
591 //MI->print(OS, 0);
592 OS << "\n";
593 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000594
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000595}