blob: 30a847f72145f5237d52bce7135397ce2c75a895 [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.
32 SmallVector<unsigned, 8> ShuffleMask;
33 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
Chris Lattner7a05e6d2010-08-28 20:42:31 +000072 case X86::PSHUFDri:
Craig Topper83c45922011-11-22 14:27:57 +000073 case X86::VPSHUFDri:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000074 Src1Name = getRegName(MI->getOperand(1).getReg());
75 // FALL THROUGH.
76 case X86::PSHUFDmi:
Craig Topper83c45922011-11-22 14:27:57 +000077 case X86::VPSHUFDmi:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000078 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper1f710572012-02-06 07:17:51 +000079 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
80 ShuffleMask);
81 break;
82 case X86::VPSHUFDYri:
83 Src1Name = getRegName(MI->getOperand(1).getReg());
84 // FALL THROUGH.
85 case X86::VPSHUFDYmi:
86 DestName = getRegName(MI->getOperand(0).getReg());
87 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner7a05e6d2010-08-28 20:42:31 +000088 ShuffleMask);
89 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000090
Craig Topper1f710572012-02-06 07:17:51 +000091
Chris Lattner38ccc8b2010-08-29 03:08:08 +000092 case X86::PSHUFHWri:
Craig Topper83c45922011-11-22 14:27:57 +000093 case X86::VPSHUFHWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +000094 Src1Name = getRegName(MI->getOperand(1).getReg());
95 // FALL THROUGH.
96 case X86::PSHUFHWmi:
Craig Topper83c45922011-11-22 14:27:57 +000097 case X86::VPSHUFHWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +000098 DestName = getRegName(MI->getOperand(0).getReg());
99 DecodePSHUFHWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
100 ShuffleMask);
101 break;
102 case X86::PSHUFLWri:
Craig Topper83c45922011-11-22 14:27:57 +0000103 case X86::VPSHUFLWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000104 Src1Name = getRegName(MI->getOperand(1).getReg());
105 // FALL THROUGH.
106 case X86::PSHUFLWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000107 case X86::VPSHUFLWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000108 DestName = getRegName(MI->getOperand(0).getReg());
109 DecodePSHUFLWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
110 ShuffleMask);
111 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000112
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000113 case X86::PUNPCKHBWrr:
114 Src2Name = getRegName(MI->getOperand(2).getReg());
115 // FALL THROUGH.
116 case X86::PUNPCKHBWrm:
117 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000118 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
119 break;
120 case X86::VPUNPCKHBWrr:
121 Src2Name = getRegName(MI->getOperand(2).getReg());
122 // FALL THROUGH.
123 case X86::VPUNPCKHBWrm:
124 Src1Name = getRegName(MI->getOperand(1).getReg());
125 DestName = getRegName(MI->getOperand(0).getReg());
126 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
127 break;
128 case X86::VPUNPCKHBWYrr:
129 Src2Name = getRegName(MI->getOperand(2).getReg());
130 // FALL THROUGH.
131 case X86::VPUNPCKHBWYrm:
132 Src1Name = getRegName(MI->getOperand(1).getReg());
133 DestName = getRegName(MI->getOperand(0).getReg());
134 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000135 break;
136 case X86::PUNPCKHWDrr:
137 Src2Name = getRegName(MI->getOperand(2).getReg());
138 // FALL THROUGH.
139 case X86::PUNPCKHWDrm:
140 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000141 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
142 break;
143 case X86::VPUNPCKHWDrr:
144 Src2Name = getRegName(MI->getOperand(2).getReg());
145 // FALL THROUGH.
146 case X86::VPUNPCKHWDrm:
147 Src1Name = getRegName(MI->getOperand(1).getReg());
148 DestName = getRegName(MI->getOperand(0).getReg());
149 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
150 break;
151 case X86::VPUNPCKHWDYrr:
152 Src2Name = getRegName(MI->getOperand(2).getReg());
153 // FALL THROUGH.
154 case X86::VPUNPCKHWDYrm:
155 Src1Name = getRegName(MI->getOperand(1).getReg());
156 DestName = getRegName(MI->getOperand(0).getReg());
157 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000158 break;
159 case X86::PUNPCKHDQrr:
160 Src2Name = getRegName(MI->getOperand(2).getReg());
161 // FALL THROUGH.
162 case X86::PUNPCKHDQrm:
163 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000164 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
165 break;
166 case X86::VPUNPCKHDQrr:
167 Src2Name = getRegName(MI->getOperand(2).getReg());
168 // FALL THROUGH.
169 case X86::VPUNPCKHDQrm:
170 Src1Name = getRegName(MI->getOperand(1).getReg());
171 DestName = getRegName(MI->getOperand(0).getReg());
172 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
173 break;
174 case X86::VPUNPCKHDQYrr:
175 Src2Name = getRegName(MI->getOperand(2).getReg());
176 // FALL THROUGH.
177 case X86::VPUNPCKHDQYrm:
178 Src1Name = getRegName(MI->getOperand(1).getReg());
179 DestName = getRegName(MI->getOperand(0).getReg());
180 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000181 break;
182 case X86::PUNPCKHQDQrr:
183 Src2Name = getRegName(MI->getOperand(2).getReg());
184 // FALL THROUGH.
185 case X86::PUNPCKHQDQrm:
186 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000187 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
188 break;
189 case X86::VPUNPCKHQDQrr:
190 Src2Name = getRegName(MI->getOperand(2).getReg());
191 // FALL THROUGH.
192 case X86::VPUNPCKHQDQrm:
193 Src1Name = getRegName(MI->getOperand(1).getReg());
194 DestName = getRegName(MI->getOperand(0).getReg());
195 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
196 break;
197 case X86::VPUNPCKHQDQYrr:
198 Src2Name = getRegName(MI->getOperand(2).getReg());
199 // FALL THROUGH.
200 case X86::VPUNPCKHQDQYrm:
201 Src1Name = getRegName(MI->getOperand(1).getReg());
202 DestName = getRegName(MI->getOperand(0).getReg());
203 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000204 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000205
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000206 case X86::PUNPCKLBWrr:
207 Src2Name = getRegName(MI->getOperand(2).getReg());
208 // FALL THROUGH.
209 case X86::PUNPCKLBWrm:
210 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000211 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
212 break;
213 case X86::VPUNPCKLBWrr:
214 Src2Name = getRegName(MI->getOperand(2).getReg());
215 // FALL THROUGH.
216 case X86::VPUNPCKLBWrm:
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
220 break;
221 case X86::VPUNPCKLBWYrr:
222 Src2Name = getRegName(MI->getOperand(2).getReg());
223 // FALL THROUGH.
224 case X86::VPUNPCKLBWYrm:
225 Src1Name = getRegName(MI->getOperand(1).getReg());
226 DestName = getRegName(MI->getOperand(0).getReg());
227 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000228 break;
229 case X86::PUNPCKLWDrr:
230 Src2Name = getRegName(MI->getOperand(2).getReg());
231 // FALL THROUGH.
232 case X86::PUNPCKLWDrm:
233 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000234 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
235 break;
236 case X86::VPUNPCKLWDrr:
237 Src2Name = getRegName(MI->getOperand(2).getReg());
238 // FALL THROUGH.
239 case X86::VPUNPCKLWDrm:
240 Src1Name = getRegName(MI->getOperand(1).getReg());
241 DestName = getRegName(MI->getOperand(0).getReg());
242 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
243 break;
244 case X86::VPUNPCKLWDYrr:
245 Src2Name = getRegName(MI->getOperand(2).getReg());
246 // FALL THROUGH.
247 case X86::VPUNPCKLWDYrm:
248 Src1Name = getRegName(MI->getOperand(1).getReg());
249 DestName = getRegName(MI->getOperand(0).getReg());
250 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000251 break;
252 case X86::PUNPCKLDQrr:
253 Src2Name = getRegName(MI->getOperand(2).getReg());
254 // FALL THROUGH.
255 case X86::PUNPCKLDQrm:
256 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000257 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
258 break;
259 case X86::VPUNPCKLDQrr:
260 Src2Name = getRegName(MI->getOperand(2).getReg());
261 // FALL THROUGH.
262 case X86::VPUNPCKLDQrm:
263 Src1Name = getRegName(MI->getOperand(1).getReg());
264 DestName = getRegName(MI->getOperand(0).getReg());
265 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
266 break;
267 case X86::VPUNPCKLDQYrr:
268 Src2Name = getRegName(MI->getOperand(2).getReg());
269 // FALL THROUGH.
270 case X86::VPUNPCKLDQYrm:
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000274 break;
275 case X86::PUNPCKLQDQrr:
276 Src2Name = getRegName(MI->getOperand(2).getReg());
277 // FALL THROUGH.
278 case X86::PUNPCKLQDQrm:
279 Src1Name = getRegName(MI->getOperand(0).getReg());
Craig Topper3cb802c2011-12-06 05:31:16 +0000280 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
281 break;
282 case X86::VPUNPCKLQDQrr:
283 Src2Name = getRegName(MI->getOperand(2).getReg());
284 // FALL THROUGH.
285 case X86::VPUNPCKLQDQrm:
286 Src1Name = getRegName(MI->getOperand(1).getReg());
287 DestName = getRegName(MI->getOperand(0).getReg());
288 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
289 break;
290 case X86::VPUNPCKLQDQYrr:
291 Src2Name = getRegName(MI->getOperand(2).getReg());
292 // FALL THROUGH.
293 case X86::VPUNPCKLQDQYrm:
294 Src1Name = getRegName(MI->getOperand(1).getReg());
295 DestName = getRegName(MI->getOperand(0).getReg());
296 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000297 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000298
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000299 case X86::SHUFPDrri:
Bruno Cardoso Lopes54366cc2011-08-25 02:58:21 +0000300 Src2Name = getRegName(MI->getOperand(2).getReg());
301 // FALL THROUGH.
302 case X86::SHUFPDrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000303 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
304 ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000305 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000306 break;
Craig Topper83c45922011-11-22 14:27:57 +0000307 case X86::VSHUFPDrri:
308 Src2Name = getRegName(MI->getOperand(2).getReg());
309 // FALL THROUGH.
310 case X86::VSHUFPDrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000311 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
312 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000313 Src1Name = getRegName(MI->getOperand(1).getReg());
314 DestName = getRegName(MI->getOperand(0).getReg());
315 break;
316 case X86::VSHUFPDYrri:
317 Src2Name = getRegName(MI->getOperand(2).getReg());
318 // FALL THROUGH.
319 case X86::VSHUFPDYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000320 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
321 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000322 Src1Name = getRegName(MI->getOperand(1).getReg());
323 DestName = getRegName(MI->getOperand(0).getReg());
324 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000325
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000326 case X86::SHUFPSrri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000327 Src2Name = getRegName(MI->getOperand(2).getReg());
328 // FALL THROUGH.
329 case X86::SHUFPSrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000330 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
331 ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000332 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000333 break;
Craig Topper83c45922011-11-22 14:27:57 +0000334 case X86::VSHUFPSrri:
335 Src2Name = getRegName(MI->getOperand(2).getReg());
336 // FALL THROUGH.
337 case X86::VSHUFPSrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000338 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
339 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000340 Src1Name = getRegName(MI->getOperand(1).getReg());
341 DestName = getRegName(MI->getOperand(0).getReg());
342 break;
343 case X86::VSHUFPSYrri:
344 Src2Name = getRegName(MI->getOperand(2).getReg());
345 // FALL THROUGH.
346 case X86::VSHUFPSYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000347 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
348 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000349 Src1Name = getRegName(MI->getOperand(1).getReg());
350 DestName = getRegName(MI->getOperand(0).getReg());
351 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000352
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000353 case X86::UNPCKLPDrr:
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000354 Src2Name = getRegName(MI->getOperand(2).getReg());
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000355 // FALL THROUGH.
356 case X86::UNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000357 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000358 Src1Name = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000359 break;
David Greene20a1cbe2011-02-28 19:06:56 +0000360 case X86::VUNPCKLPDrr:
361 Src2Name = getRegName(MI->getOperand(2).getReg());
362 // FALL THROUGH.
363 case X86::VUNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000364 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000365 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000366 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000367 break;
368 case X86::VUNPCKLPDYrr:
369 Src2Name = getRegName(MI->getOperand(2).getReg());
370 // FALL THROUGH.
371 case X86::VUNPCKLPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000372 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000373 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000374 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000375 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000376 case X86::UNPCKLPSrr:
377 Src2Name = getRegName(MI->getOperand(2).getReg());
378 // FALL THROUGH.
379 case X86::UNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000380 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000381 Src1Name = getRegName(MI->getOperand(0).getReg());
382 break;
David Greene20a1cbe2011-02-28 19:06:56 +0000383 case X86::VUNPCKLPSrr:
384 Src2Name = getRegName(MI->getOperand(2).getReg());
385 // FALL THROUGH.
386 case X86::VUNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000387 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000388 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000389 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000390 break;
391 case X86::VUNPCKLPSYrr:
392 Src2Name = getRegName(MI->getOperand(2).getReg());
393 // FALL THROUGH.
394 case X86::VUNPCKLPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000395 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000396 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000397 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000398 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000399 case X86::UNPCKHPDrr:
400 Src2Name = getRegName(MI->getOperand(2).getReg());
401 // FALL THROUGH.
402 case X86::UNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000403 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000404 Src1Name = getRegName(MI->getOperand(0).getReg());
405 break;
Craig Topperccb70972011-11-22 01:57:35 +0000406 case X86::VUNPCKHPDrr:
407 Src2Name = getRegName(MI->getOperand(2).getReg());
408 // FALL THROUGH.
409 case X86::VUNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000410 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000411 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000412 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000413 break;
414 case X86::VUNPCKHPDYrr:
415 Src2Name = getRegName(MI->getOperand(2).getReg());
416 // FALL THROUGH.
417 case X86::VUNPCKHPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000418 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000419 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000420 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000421 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000422 case X86::UNPCKHPSrr:
423 Src2Name = getRegName(MI->getOperand(2).getReg());
424 // FALL THROUGH.
425 case X86::UNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000426 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000427 Src1Name = getRegName(MI->getOperand(0).getReg());
428 break;
Craig Topperccb70972011-11-22 01:57:35 +0000429 case X86::VUNPCKHPSrr:
430 Src2Name = getRegName(MI->getOperand(2).getReg());
431 // FALL THROUGH.
432 case X86::VUNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000433 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000434 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000435 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000436 break;
437 case X86::VUNPCKHPSYrr:
438 Src2Name = getRegName(MI->getOperand(2).getReg());
439 // FALL THROUGH.
440 case X86::VUNPCKHPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000441 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000442 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000443 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000444 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000445 case X86::VPERMILPSri:
Craig Topperc16db842011-11-29 07:49:05 +0000446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 // FALL THROUGH.
448 case X86::VPERMILPSmi:
Craig Topper1f710572012-02-06 07:17:51 +0000449 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
450 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000451 DestName = getRegName(MI->getOperand(0).getReg());
Duncan Sands00f39c12011-08-04 15:45:59 +0000452 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000453 case X86::VPERMILPSYri:
Craig Topperc16db842011-11-29 07:49:05 +0000454 Src1Name = getRegName(MI->getOperand(1).getReg());
455 // FALL THROUGH.
456 case X86::VPERMILPSYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000457 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
458 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000459 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000460 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000461 case X86::VPERMILPDri:
Craig Topperc16db842011-11-29 07:49:05 +0000462 Src1Name = getRegName(MI->getOperand(1).getReg());
463 // FALL THROUGH.
464 case X86::VPERMILPDmi:
Craig Topper1f710572012-02-06 07:17:51 +0000465 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
466 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000467 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000468 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000469 case X86::VPERMILPDYri:
Craig Topperc16db842011-11-29 07:49:05 +0000470 Src1Name = getRegName(MI->getOperand(1).getReg());
471 // FALL THROUGH.
472 case X86::VPERMILPDYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000473 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperbafd2242011-11-30 06:25:25 +0000474 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000475 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000476 break;
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000477 case X86::VPERM2F128rr:
Craig Topperc16db842011-11-29 07:49:05 +0000478 case X86::VPERM2I128rr:
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000479 Src2Name = getRegName(MI->getOperand(2).getReg());
Craig Topperc16db842011-11-29 07:49:05 +0000480 // FALL THROUGH.
481 case X86::VPERM2F128rm:
482 case X86::VPERM2I128rm:
Craig Topper1f710572012-02-06 07:17:51 +0000483 // For instruction comments purpose, assume the 256-bit vector is v4i64.
484 DecodeVPERM2X128Mask(MVT::v4i64,
485 MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperc16db842011-11-29 07:49:05 +0000486 ShuffleMask);
487 Src1Name = getRegName(MI->getOperand(1).getReg());
488 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000489 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000490 }
491
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000492
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000493 // If this was a shuffle operation, print the shuffle mask.
494 if (!ShuffleMask.empty()) {
495 if (DestName == 0) DestName = Src1Name;
496 OS << (DestName ? DestName : "mem") << " = ";
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000497
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000498 // If the two sources are the same, canonicalize the input elements to be
499 // from the first src so that we get larger element spans.
500 if (Src1Name == Src2Name) {
501 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
502 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
503 ShuffleMask[i] >= e) // From second mask.
504 ShuffleMask[i] -= e;
505 }
506 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000507
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000508 // The shuffle mask specifies which elements of the src1/src2 fill in the
509 // destination, with a few sentinel values. Loop through and print them
510 // out.
511 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
512 if (i != 0)
513 OS << ',';
514 if (ShuffleMask[i] == SM_SentinelZero) {
515 OS << "zero";
516 continue;
517 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000518
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000519 // Otherwise, it must come from src1 or src2. Print the span of elements
520 // that comes from this src.
521 bool isSrc1 = ShuffleMask[i] < ShuffleMask.size();
522 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
523 OS << (SrcName ? SrcName : "mem") << '[';
524 bool IsFirst = true;
525 while (i != e &&
526 (int)ShuffleMask[i] >= 0 &&
527 (ShuffleMask[i] < ShuffleMask.size()) == isSrc1) {
528 if (!IsFirst)
529 OS << ',';
530 else
531 IsFirst = false;
532 OS << ShuffleMask[i] % ShuffleMask.size();
533 ++i;
534 }
535 OS << ']';
536 --i; // For loop increments element #.
537 }
538 //MI->print(OS, 0);
539 OS << "\n";
540 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000541
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000542}