blob: db61fb03d4c98f0bbee747912ee60b64e827d341 [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"
Patrik Hagglund8d09a6c2014-03-15 09:11:41 +000019#include "llvm/CodeGen/MachineValueType.h"
Chris Lattner7a05e6d2010-08-28 20:42:31 +000020#include "llvm/Support/raw_ostream.h"
Patrik Hagglund1da35122014-03-12 08:00:24 +000021
Chris Lattner7a05e6d2010-08-28 20:42:31 +000022using namespace llvm;
23
24//===----------------------------------------------------------------------===//
Chris Lattner7a05e6d2010-08-28 20:42:31 +000025// Top Level Entrypoint
26//===----------------------------------------------------------------------===//
27
Chris Lattner7a05e6d2010-08-28 20:42:31 +000028/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
29/// newline terminated strings to the specified string if desired. This
30/// information is shown in disassembly dumps when verbose assembly is enabled.
31void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
32 const char *(*getRegName)(unsigned)) {
33 // If this is a shuffle operation, the switch should fill in this state.
Craig Toppercbc96a62012-03-20 06:42:26 +000034 SmallVector<int, 8> ShuffleMask;
Chris Lattner7a05e6d2010-08-28 20:42:31 +000035 const char *DestName = 0, *Src1Name = 0, *Src2Name = 0;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000036
Chris Lattner7a05e6d2010-08-28 20:42:31 +000037 switch (MI->getOpcode()) {
38 case X86::INSERTPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000039 case X86::VINSERTPSrr:
40 DestName = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +000041 Src1Name = getRegName(MI->getOperand(1).getReg());
42 Src2Name = getRegName(MI->getOperand(2).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +000043 if(MI->getOperand(3).isImm())
44 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +000045 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000046
Chris Lattner38ccc8b2010-08-29 03:08:08 +000047 case X86::MOVLHPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000048 case X86::VMOVLHPSrr:
49 Src2Name = getRegName(MI->getOperand(2).getReg());
50 Src1Name = getRegName(MI->getOperand(1).getReg());
51 DestName = getRegName(MI->getOperand(0).getReg());
52 DecodeMOVLHPSMask(2, ShuffleMask);
53 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000054
Chris Lattner38ccc8b2010-08-29 03:08:08 +000055 case X86::MOVHLPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000056 case X86::VMOVHLPSrr:
57 Src2Name = getRegName(MI->getOperand(2).getReg());
58 Src1Name = getRegName(MI->getOperand(1).getReg());
59 DestName = getRegName(MI->getOperand(0).getReg());
60 DecodeMOVHLPSMask(2, ShuffleMask);
61 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000062
Benjamin Kramer6a935962013-01-26 13:31:37 +000063 case X86::PALIGNR128rr:
64 case X86::VPALIGNR128rr:
65 Src1Name = getRegName(MI->getOperand(2).getReg());
66 // FALL THROUGH.
67 case X86::PALIGNR128rm:
68 case X86::VPALIGNR128rm:
69 Src2Name = getRegName(MI->getOperand(1).getReg());
70 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +000071 if(MI->getOperand(MI->getNumOperands()-1).isImm())
72 DecodePALIGNRMask(MVT::v16i8,
73 MI->getOperand(MI->getNumOperands()-1).getImm(),
74 ShuffleMask);
Benjamin Kramer6a935962013-01-26 13:31:37 +000075 break;
76 case X86::VPALIGNR256rr:
77 Src1Name = getRegName(MI->getOperand(2).getReg());
78 // FALL THROUGH.
79 case X86::VPALIGNR256rm:
80 Src2Name = getRegName(MI->getOperand(1).getReg());
81 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +000082 if(MI->getOperand(MI->getNumOperands()-1).isImm())
83 DecodePALIGNRMask(MVT::v32i8,
84 MI->getOperand(MI->getNumOperands()-1).getImm(),
85 ShuffleMask);
Craig Topper71d99ff2013-01-28 07:19:11 +000086 break;
Benjamin Kramer6a935962013-01-26 13:31:37 +000087
Chris Lattner7a05e6d2010-08-28 20:42:31 +000088 case X86::PSHUFDri:
Craig Topper83c45922011-11-22 14:27:57 +000089 case X86::VPSHUFDri:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000090 Src1Name = getRegName(MI->getOperand(1).getReg());
91 // FALL THROUGH.
92 case X86::PSHUFDmi:
Craig Topper83c45922011-11-22 14:27:57 +000093 case X86::VPSHUFDmi:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000094 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +000095 if(MI->getOperand(MI->getNumOperands()-1).isImm())
96 DecodePSHUFMask(MVT::v4i32,
97 MI->getOperand(MI->getNumOperands()-1).getImm(),
98 ShuffleMask);
Craig Topper1f710572012-02-06 07:17:51 +000099 break;
100 case X86::VPSHUFDYri:
101 Src1Name = getRegName(MI->getOperand(1).getReg());
102 // FALL THROUGH.
103 case X86::VPSHUFDYmi:
104 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +0000105 if(MI->getOperand(MI->getNumOperands()-1).isImm())
106 DecodePSHUFMask(MVT::v8i32,
107 MI->getOperand(MI->getNumOperands()-1).getImm(),
108 ShuffleMask);
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000109 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000110
Craig Topper1f710572012-02-06 07:17:51 +0000111
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000112 case X86::PSHUFHWri:
Craig Topper83c45922011-11-22 14:27:57 +0000113 case X86::VPSHUFHWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000114 Src1Name = getRegName(MI->getOperand(1).getReg());
115 // FALL THROUGH.
116 case X86::PSHUFHWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000117 case X86::VPSHUFHWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000118 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +0000119 if(MI->getOperand(MI->getNumOperands()-1).isImm())
120 DecodePSHUFHWMask(MVT::v8i16,
121 MI->getOperand(MI->getNumOperands()-1).getImm(),
122 ShuffleMask);
Craig Topperc73bc392012-05-02 08:03:44 +0000123 break;
124 case X86::VPSHUFHWYri:
125 Src1Name = getRegName(MI->getOperand(1).getReg());
126 // FALL THROUGH.
127 case X86::VPSHUFHWYmi:
128 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +0000129 if(MI->getOperand(MI->getNumOperands()-1).isImm())
130 DecodePSHUFHWMask(MVT::v16i16,
131 MI->getOperand(MI->getNumOperands()-1).getImm(),
132 ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000133 break;
134 case X86::PSHUFLWri:
Craig Topper83c45922011-11-22 14:27:57 +0000135 case X86::VPSHUFLWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000136 Src1Name = getRegName(MI->getOperand(1).getReg());
137 // FALL THROUGH.
138 case X86::PSHUFLWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000139 case X86::VPSHUFLWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000140 DestName = getRegName(MI->getOperand(0).getReg());
Kevin Enderbydebfea62014-01-21 00:18:51 +0000141 if(MI->getOperand(MI->getNumOperands()-1).isImm())
142 DecodePSHUFLWMask(MVT::v8i16,
143 MI->getOperand(MI->getNumOperands()-1).getImm(),
144 ShuffleMask);
Craig Topperc73bc392012-05-02 08:03:44 +0000145 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());
Kevin Enderbydebfea62014-01-21 00:18:51 +0000151 if(MI->getOperand(MI->getNumOperands()-1).isImm())
152 DecodePSHUFLWMask(MVT::v16i16,
153 MI->getOperand(MI->getNumOperands()-1).getImm(),
154 ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000155 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000156
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000157 case X86::PUNPCKHBWrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000158 case X86::VPUNPCKHBWrr:
159 Src2Name = getRegName(MI->getOperand(2).getReg());
160 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000161 case X86::PUNPCKHBWrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000162 case X86::VPUNPCKHBWrm:
163 Src1Name = getRegName(MI->getOperand(1).getReg());
164 DestName = getRegName(MI->getOperand(0).getReg());
165 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
166 break;
167 case X86::VPUNPCKHBWYrr:
168 Src2Name = getRegName(MI->getOperand(2).getReg());
169 // FALL THROUGH.
170 case X86::VPUNPCKHBWYrm:
171 Src1Name = getRegName(MI->getOperand(1).getReg());
172 DestName = getRegName(MI->getOperand(0).getReg());
173 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000174 break;
175 case X86::PUNPCKHWDrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000176 case X86::VPUNPCKHWDrr:
177 Src2Name = getRegName(MI->getOperand(2).getReg());
178 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000179 case X86::PUNPCKHWDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000180 case X86::VPUNPCKHWDrm:
181 Src1Name = getRegName(MI->getOperand(1).getReg());
182 DestName = getRegName(MI->getOperand(0).getReg());
183 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
184 break;
185 case X86::VPUNPCKHWDYrr:
186 Src2Name = getRegName(MI->getOperand(2).getReg());
187 // FALL THROUGH.
188 case X86::VPUNPCKHWDYrm:
189 Src1Name = getRegName(MI->getOperand(1).getReg());
190 DestName = getRegName(MI->getOperand(0).getReg());
191 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000192 break;
193 case X86::PUNPCKHDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000194 case X86::VPUNPCKHDQrr:
195 Src2Name = getRegName(MI->getOperand(2).getReg());
196 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000197 case X86::PUNPCKHDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000198 case X86::VPUNPCKHDQrm:
199 Src1Name = getRegName(MI->getOperand(1).getReg());
200 DestName = getRegName(MI->getOperand(0).getReg());
201 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
202 break;
203 case X86::VPUNPCKHDQYrr:
204 Src2Name = getRegName(MI->getOperand(2).getReg());
205 // FALL THROUGH.
206 case X86::VPUNPCKHDQYrm:
207 Src1Name = getRegName(MI->getOperand(1).getReg());
208 DestName = getRegName(MI->getOperand(0).getReg());
209 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000210 break;
211 case X86::PUNPCKHQDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000212 case X86::VPUNPCKHQDQrr:
213 Src2Name = getRegName(MI->getOperand(2).getReg());
214 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000215 case X86::PUNPCKHQDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000216 case X86::VPUNPCKHQDQrm:
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
220 break;
221 case X86::VPUNPCKHQDQYrr:
222 Src2Name = getRegName(MI->getOperand(2).getReg());
223 // FALL THROUGH.
224 case X86::VPUNPCKHQDQYrm:
225 Src1Name = getRegName(MI->getOperand(1).getReg());
226 DestName = getRegName(MI->getOperand(0).getReg());
227 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000228 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000229
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000230 case X86::PUNPCKLBWrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000231 case X86::VPUNPCKLBWrr:
232 Src2Name = getRegName(MI->getOperand(2).getReg());
233 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000234 case X86::PUNPCKLBWrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000235 case X86::VPUNPCKLBWrm:
236 Src1Name = getRegName(MI->getOperand(1).getReg());
237 DestName = getRegName(MI->getOperand(0).getReg());
238 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
239 break;
240 case X86::VPUNPCKLBWYrr:
241 Src2Name = getRegName(MI->getOperand(2).getReg());
242 // FALL THROUGH.
243 case X86::VPUNPCKLBWYrm:
244 Src1Name = getRegName(MI->getOperand(1).getReg());
245 DestName = getRegName(MI->getOperand(0).getReg());
246 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000247 break;
248 case X86::PUNPCKLWDrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000249 case X86::VPUNPCKLWDrr:
250 Src2Name = getRegName(MI->getOperand(2).getReg());
251 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000252 case X86::PUNPCKLWDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000253 case X86::VPUNPCKLWDrm:
254 Src1Name = getRegName(MI->getOperand(1).getReg());
255 DestName = getRegName(MI->getOperand(0).getReg());
256 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
257 break;
258 case X86::VPUNPCKLWDYrr:
259 Src2Name = getRegName(MI->getOperand(2).getReg());
260 // FALL THROUGH.
261 case X86::VPUNPCKLWDYrm:
262 Src1Name = getRegName(MI->getOperand(1).getReg());
263 DestName = getRegName(MI->getOperand(0).getReg());
264 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000265 break;
266 case X86::PUNPCKLDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000267 case X86::VPUNPCKLDQrr:
268 Src2Name = getRegName(MI->getOperand(2).getReg());
269 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000270 case X86::PUNPCKLDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000271 case X86::VPUNPCKLDQrm:
272 Src1Name = getRegName(MI->getOperand(1).getReg());
273 DestName = getRegName(MI->getOperand(0).getReg());
274 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
275 break;
276 case X86::VPUNPCKLDQYrr:
277 Src2Name = getRegName(MI->getOperand(2).getReg());
278 // FALL THROUGH.
279 case X86::VPUNPCKLDQYrm:
280 Src1Name = getRegName(MI->getOperand(1).getReg());
281 DestName = getRegName(MI->getOperand(0).getReg());
282 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000283 break;
284 case X86::PUNPCKLQDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000285 case X86::VPUNPCKLQDQrr:
286 Src2Name = getRegName(MI->getOperand(2).getReg());
287 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000288 case X86::PUNPCKLQDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000289 case X86::VPUNPCKLQDQrm:
290 Src1Name = getRegName(MI->getOperand(1).getReg());
291 DestName = getRegName(MI->getOperand(0).getReg());
292 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
293 break;
294 case X86::VPUNPCKLQDQYrr:
295 Src2Name = getRegName(MI->getOperand(2).getReg());
296 // FALL THROUGH.
297 case X86::VPUNPCKLQDQYrm:
298 Src1Name = getRegName(MI->getOperand(1).getReg());
299 DestName = getRegName(MI->getOperand(0).getReg());
300 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000301 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000302
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000303 case X86::SHUFPDrri:
Craig Topper83c45922011-11-22 14:27:57 +0000304 case X86::VSHUFPDrri:
305 Src2Name = getRegName(MI->getOperand(2).getReg());
306 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000307 case X86::SHUFPDrmi:
Craig Topper83c45922011-11-22 14:27:57 +0000308 case X86::VSHUFPDrmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000309 if(MI->getOperand(MI->getNumOperands()-1).isImm())
310 DecodeSHUFPMask(MVT::v2f64,
311 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:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000320 if(MI->getOperand(MI->getNumOperands()-1).isImm())
321 DecodeSHUFPMask(MVT::v4f64,
322 MI->getOperand(MI->getNumOperands()-1).getImm(),
323 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000324 Src1Name = getRegName(MI->getOperand(1).getReg());
325 DestName = getRegName(MI->getOperand(0).getReg());
326 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000327
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000328 case X86::SHUFPSrri:
Craig Topper83c45922011-11-22 14:27:57 +0000329 case X86::VSHUFPSrri:
330 Src2Name = getRegName(MI->getOperand(2).getReg());
331 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000332 case X86::SHUFPSrmi:
Craig Topper83c45922011-11-22 14:27:57 +0000333 case X86::VSHUFPSrmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000334 if(MI->getOperand(MI->getNumOperands()-1).isImm())
335 DecodeSHUFPMask(MVT::v4f32,
336 MI->getOperand(MI->getNumOperands()-1).getImm(),
337 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000338 Src1Name = getRegName(MI->getOperand(1).getReg());
339 DestName = getRegName(MI->getOperand(0).getReg());
340 break;
341 case X86::VSHUFPSYrri:
342 Src2Name = getRegName(MI->getOperand(2).getReg());
343 // FALL THROUGH.
344 case X86::VSHUFPSYrmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000345 if(MI->getOperand(MI->getNumOperands()-1).isImm())
346 DecodeSHUFPMask(MVT::v8f32,
347 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:
David Greene20a1cbe2011-02-28 19:06:56 +0000354 case X86::VUNPCKLPDrr:
355 Src2Name = getRegName(MI->getOperand(2).getReg());
356 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000357 case X86::UNPCKLPDrm:
David Greene20a1cbe2011-02-28 19:06:56 +0000358 case X86::VUNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000359 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000360 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000361 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000362 break;
363 case X86::VUNPCKLPDYrr:
364 Src2Name = getRegName(MI->getOperand(2).getReg());
365 // FALL THROUGH.
366 case X86::VUNPCKLPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000367 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000368 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000369 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000370 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000371 case X86::UNPCKLPSrr:
David Greene20a1cbe2011-02-28 19:06:56 +0000372 case X86::VUNPCKLPSrr:
373 Src2Name = getRegName(MI->getOperand(2).getReg());
374 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000375 case X86::UNPCKLPSrm:
David Greene20a1cbe2011-02-28 19:06:56 +0000376 case X86::VUNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000377 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000378 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000379 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000380 break;
381 case X86::VUNPCKLPSYrr:
382 Src2Name = getRegName(MI->getOperand(2).getReg());
383 // FALL THROUGH.
384 case X86::VUNPCKLPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000385 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000386 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000387 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000388 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000389 case X86::UNPCKHPDrr:
Craig Topperccb70972011-11-22 01:57:35 +0000390 case X86::VUNPCKHPDrr:
391 Src2Name = getRegName(MI->getOperand(2).getReg());
392 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000393 case X86::UNPCKHPDrm:
Craig Topperccb70972011-11-22 01:57:35 +0000394 case X86::VUNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000395 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000396 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000397 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000398 break;
399 case X86::VUNPCKHPDYrr:
400 Src2Name = getRegName(MI->getOperand(2).getReg());
401 // FALL THROUGH.
402 case X86::VUNPCKHPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000403 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000404 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000405 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000406 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000407 case X86::UNPCKHPSrr:
Craig Topperccb70972011-11-22 01:57:35 +0000408 case X86::VUNPCKHPSrr:
409 Src2Name = getRegName(MI->getOperand(2).getReg());
410 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000411 case X86::UNPCKHPSrm:
Craig Topperccb70972011-11-22 01:57:35 +0000412 case X86::VUNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000413 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000414 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000415 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000416 break;
417 case X86::VUNPCKHPSYrr:
418 Src2Name = getRegName(MI->getOperand(2).getReg());
419 // FALL THROUGH.
420 case X86::VUNPCKHPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000421 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000422 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000423 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000424 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000425 case X86::VPERMILPSri:
Craig Topperc16db842011-11-29 07:49:05 +0000426 Src1Name = getRegName(MI->getOperand(1).getReg());
427 // FALL THROUGH.
428 case X86::VPERMILPSmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000429 if(MI->getOperand(MI->getNumOperands()-1).isImm())
430 DecodePSHUFMask(MVT::v4f32,
431 MI->getOperand(MI->getNumOperands()-1).getImm(),
432 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000433 DestName = getRegName(MI->getOperand(0).getReg());
Duncan Sands00f39c12011-08-04 15:45:59 +0000434 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000435 case X86::VPERMILPSYri:
Craig Topperc16db842011-11-29 07:49:05 +0000436 Src1Name = getRegName(MI->getOperand(1).getReg());
437 // FALL THROUGH.
438 case X86::VPERMILPSYmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000439 if(MI->getOperand(MI->getNumOperands()-1).isImm())
440 DecodePSHUFMask(MVT::v8f32,
441 MI->getOperand(MI->getNumOperands()-1).getImm(),
442 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000443 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000444 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000445 case X86::VPERMILPDri:
Craig Topperc16db842011-11-29 07:49:05 +0000446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 // FALL THROUGH.
448 case X86::VPERMILPDmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000449 if(MI->getOperand(MI->getNumOperands()-1).isImm())
450 DecodePSHUFMask(MVT::v2f64,
451 MI->getOperand(MI->getNumOperands()-1).getImm(),
452 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000453 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000454 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000455 case X86::VPERMILPDYri:
Craig Topperc16db842011-11-29 07:49:05 +0000456 Src1Name = getRegName(MI->getOperand(1).getReg());
457 // FALL THROUGH.
458 case X86::VPERMILPDYmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000459 if(MI->getOperand(MI->getNumOperands()-1).isImm())
460 DecodePSHUFMask(MVT::v4f64,
461 MI->getOperand(MI->getNumOperands()-1).getImm(),
462 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000463 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000464 break;
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000465 case X86::VPERM2F128rr:
Craig Topperc16db842011-11-29 07:49:05 +0000466 case X86::VPERM2I128rr:
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000467 Src2Name = getRegName(MI->getOperand(2).getReg());
Craig Topperc16db842011-11-29 07:49:05 +0000468 // FALL THROUGH.
469 case X86::VPERM2F128rm:
470 case X86::VPERM2I128rm:
Craig Topper1f710572012-02-06 07:17:51 +0000471 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Kevin Enderbydebfea62014-01-21 00:18:51 +0000472 if(MI->getOperand(MI->getNumOperands()-1).isImm())
473 DecodeVPERM2X128Mask(MVT::v4i64,
474 MI->getOperand(MI->getNumOperands()-1).getImm(),
475 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000476 Src1Name = getRegName(MI->getOperand(1).getReg());
477 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000478 break;
Craig Topper54bdb352012-05-06 18:44:02 +0000479 case X86::VPERMQYri:
480 case X86::VPERMPDYri:
481 Src1Name = getRegName(MI->getOperand(1).getReg());
482 // FALL THROUGH.
483 case X86::VPERMQYmi:
484 case X86::VPERMPDYmi:
Kevin Enderbydebfea62014-01-21 00:18:51 +0000485 if(MI->getOperand(MI->getNumOperands()-1).isImm())
486 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
487 ShuffleMask);
Craig Topper54bdb352012-05-06 18:44:02 +0000488 DestName = getRegName(MI->getOperand(0).getReg());
489 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.
Craig Toppercbc96a62012-03-20 06:42:26 +0000503 ShuffleMask[i] >= (int)e) // From second mask.
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000504 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 << ',';
Benjamin Kramerbc106672012-03-21 13:48:11 +0000514 if (ShuffleMask[i] == SM_SentinelZero) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000515 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.
Craig Toppercbc96a62012-03-20 06:42:26 +0000521 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000522 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
523 OS << (SrcName ? SrcName : "mem") << '[';
524 bool IsFirst = true;
525 while (i != e &&
526 (int)ShuffleMask[i] >= 0 &&
Craig Toppercbc96a62012-03-20 06:42:26 +0000527 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000528 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}