blob: 0f6eeb19bccdcf62da381d4d7a8bfe33556e32b3 [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 case X86::VINSERTPSrr:
38 DestName = getRegName(MI->getOperand(0).getReg());
Chris Lattner7a05e6d2010-08-28 20:42:31 +000039 Src1Name = getRegName(MI->getOperand(1).getReg());
40 Src2Name = getRegName(MI->getOperand(2).getReg());
41 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
42 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000043
Chris Lattner38ccc8b2010-08-29 03:08:08 +000044 case X86::MOVLHPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000045 case X86::VMOVLHPSrr:
46 Src2Name = getRegName(MI->getOperand(2).getReg());
47 Src1Name = getRegName(MI->getOperand(1).getReg());
48 DestName = getRegName(MI->getOperand(0).getReg());
49 DecodeMOVLHPSMask(2, ShuffleMask);
50 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000051
Chris Lattner38ccc8b2010-08-29 03:08:08 +000052 case X86::MOVHLPSrr:
Craig Topper83c45922011-11-22 14:27:57 +000053 case X86::VMOVHLPSrr:
54 Src2Name = getRegName(MI->getOperand(2).getReg());
55 Src1Name = getRegName(MI->getOperand(1).getReg());
56 DestName = getRegName(MI->getOperand(0).getReg());
57 DecodeMOVHLPSMask(2, ShuffleMask);
58 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +000059
Benjamin Kramer6a935962013-01-26 13:31:37 +000060 case X86::PALIGNR128rr:
61 case X86::VPALIGNR128rr:
62 Src1Name = getRegName(MI->getOperand(2).getReg());
63 // FALL THROUGH.
64 case X86::PALIGNR128rm:
65 case X86::VPALIGNR128rm:
66 Src2Name = getRegName(MI->getOperand(1).getReg());
67 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper8fb09f02013-01-28 06:48:25 +000068 DecodePALIGNRMask(MVT::v16i8,
69 MI->getOperand(MI->getNumOperands()-1).getImm(),
70 ShuffleMask);
Benjamin Kramer6a935962013-01-26 13:31:37 +000071 break;
72 case X86::VPALIGNR256rr:
73 Src1Name = getRegName(MI->getOperand(2).getReg());
74 // FALL THROUGH.
75 case X86::VPALIGNR256rm:
76 Src2Name = getRegName(MI->getOperand(1).getReg());
77 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper8fb09f02013-01-28 06:48:25 +000078 DecodePALIGNRMask(MVT::v32i8,
79 MI->getOperand(MI->getNumOperands()-1).getImm(),
80 ShuffleMask);
Craig Topper71d99ff2013-01-28 07:19:11 +000081 break;
Benjamin Kramer6a935962013-01-26 13:31:37 +000082
Chris Lattner7a05e6d2010-08-28 20:42:31 +000083 case X86::PSHUFDri:
Craig Topper83c45922011-11-22 14:27:57 +000084 case X86::VPSHUFDri:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000085 Src1Name = getRegName(MI->getOperand(1).getReg());
86 // FALL THROUGH.
87 case X86::PSHUFDmi:
Craig Topper83c45922011-11-22 14:27:57 +000088 case X86::VPSHUFDmi:
Chris Lattner7a05e6d2010-08-28 20:42:31 +000089 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topper1f710572012-02-06 07:17:51 +000090 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
91 ShuffleMask);
92 break;
93 case X86::VPSHUFDYri:
94 Src1Name = getRegName(MI->getOperand(1).getReg());
95 // FALL THROUGH.
96 case X86::VPSHUFDYmi:
97 DestName = getRegName(MI->getOperand(0).getReg());
98 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner7a05e6d2010-08-28 20:42:31 +000099 ShuffleMask);
100 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000101
Craig Topper1f710572012-02-06 07:17:51 +0000102
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000103 case X86::PSHUFHWri:
Craig Topper83c45922011-11-22 14:27:57 +0000104 case X86::VPSHUFHWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000105 Src1Name = getRegName(MI->getOperand(1).getReg());
106 // FALL THROUGH.
107 case X86::PSHUFHWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000108 case X86::VPSHUFHWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000109 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperc73bc392012-05-02 08:03:44 +0000110 DecodePSHUFHWMask(MVT::v8i16,
111 MI->getOperand(MI->getNumOperands()-1).getImm(),
112 ShuffleMask);
113 break;
114 case X86::VPSHUFHWYri:
115 Src1Name = getRegName(MI->getOperand(1).getReg());
116 // FALL THROUGH.
117 case X86::VPSHUFHWYmi:
118 DestName = getRegName(MI->getOperand(0).getReg());
119 DecodePSHUFHWMask(MVT::v16i16,
120 MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000121 ShuffleMask);
122 break;
123 case X86::PSHUFLWri:
Craig Topper83c45922011-11-22 14:27:57 +0000124 case X86::VPSHUFLWri:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000125 Src1Name = getRegName(MI->getOperand(1).getReg());
126 // FALL THROUGH.
127 case X86::PSHUFLWmi:
Craig Topper83c45922011-11-22 14:27:57 +0000128 case X86::VPSHUFLWmi:
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000129 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperc73bc392012-05-02 08:03:44 +0000130 DecodePSHUFLWMask(MVT::v8i16,
131 MI->getOperand(MI->getNumOperands()-1).getImm(),
132 ShuffleMask);
133 break;
134 case X86::VPSHUFLWYri:
135 Src1Name = getRegName(MI->getOperand(1).getReg());
136 // FALL THROUGH.
137 case X86::VPSHUFLWYmi:
138 DestName = getRegName(MI->getOperand(0).getReg());
139 DecodePSHUFLWMask(MVT::v16i16,
140 MI->getOperand(MI->getNumOperands()-1).getImm(),
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000141 ShuffleMask);
142 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000143
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000144 case X86::PUNPCKHBWrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000145 case X86::VPUNPCKHBWrr:
146 Src2Name = getRegName(MI->getOperand(2).getReg());
147 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000148 case X86::PUNPCKHBWrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000149 case X86::VPUNPCKHBWrm:
150 Src1Name = getRegName(MI->getOperand(1).getReg());
151 DestName = getRegName(MI->getOperand(0).getReg());
152 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
153 break;
154 case X86::VPUNPCKHBWYrr:
155 Src2Name = getRegName(MI->getOperand(2).getReg());
156 // FALL THROUGH.
157 case X86::VPUNPCKHBWYrm:
158 Src1Name = getRegName(MI->getOperand(1).getReg());
159 DestName = getRegName(MI->getOperand(0).getReg());
160 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000161 break;
162 case X86::PUNPCKHWDrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000163 case X86::VPUNPCKHWDrr:
164 Src2Name = getRegName(MI->getOperand(2).getReg());
165 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000166 case X86::PUNPCKHWDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000167 case X86::VPUNPCKHWDrm:
168 Src1Name = getRegName(MI->getOperand(1).getReg());
169 DestName = getRegName(MI->getOperand(0).getReg());
170 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
171 break;
172 case X86::VPUNPCKHWDYrr:
173 Src2Name = getRegName(MI->getOperand(2).getReg());
174 // FALL THROUGH.
175 case X86::VPUNPCKHWDYrm:
176 Src1Name = getRegName(MI->getOperand(1).getReg());
177 DestName = getRegName(MI->getOperand(0).getReg());
178 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000179 break;
180 case X86::PUNPCKHDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000181 case X86::VPUNPCKHDQrr:
182 Src2Name = getRegName(MI->getOperand(2).getReg());
183 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000184 case X86::PUNPCKHDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000185 case X86::VPUNPCKHDQrm:
186 Src1Name = getRegName(MI->getOperand(1).getReg());
187 DestName = getRegName(MI->getOperand(0).getReg());
188 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
189 break;
190 case X86::VPUNPCKHDQYrr:
191 Src2Name = getRegName(MI->getOperand(2).getReg());
192 // FALL THROUGH.
193 case X86::VPUNPCKHDQYrm:
194 Src1Name = getRegName(MI->getOperand(1).getReg());
195 DestName = getRegName(MI->getOperand(0).getReg());
196 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000197 break;
198 case X86::PUNPCKHQDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000199 case X86::VPUNPCKHQDQrr:
200 Src2Name = getRegName(MI->getOperand(2).getReg());
201 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000202 case X86::PUNPCKHQDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000203 case X86::VPUNPCKHQDQrm:
204 Src1Name = getRegName(MI->getOperand(1).getReg());
205 DestName = getRegName(MI->getOperand(0).getReg());
206 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
207 break;
208 case X86::VPUNPCKHQDQYrr:
209 Src2Name = getRegName(MI->getOperand(2).getReg());
210 // FALL THROUGH.
211 case X86::VPUNPCKHQDQYrm:
212 Src1Name = getRegName(MI->getOperand(1).getReg());
213 DestName = getRegName(MI->getOperand(0).getReg());
214 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000215 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000216
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000217 case X86::PUNPCKLBWrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000218 case X86::VPUNPCKLBWrr:
219 Src2Name = getRegName(MI->getOperand(2).getReg());
220 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000221 case X86::PUNPCKLBWrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000222 case X86::VPUNPCKLBWrm:
223 Src1Name = getRegName(MI->getOperand(1).getReg());
224 DestName = getRegName(MI->getOperand(0).getReg());
225 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
226 break;
227 case X86::VPUNPCKLBWYrr:
228 Src2Name = getRegName(MI->getOperand(2).getReg());
229 // FALL THROUGH.
230 case X86::VPUNPCKLBWYrm:
231 Src1Name = getRegName(MI->getOperand(1).getReg());
232 DestName = getRegName(MI->getOperand(0).getReg());
233 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000234 break;
235 case X86::PUNPCKLWDrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000236 case X86::VPUNPCKLWDrr:
237 Src2Name = getRegName(MI->getOperand(2).getReg());
238 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000239 case X86::PUNPCKLWDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000240 case X86::VPUNPCKLWDrm:
241 Src1Name = getRegName(MI->getOperand(1).getReg());
242 DestName = getRegName(MI->getOperand(0).getReg());
243 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
244 break;
245 case X86::VPUNPCKLWDYrr:
246 Src2Name = getRegName(MI->getOperand(2).getReg());
247 // FALL THROUGH.
248 case X86::VPUNPCKLWDYrm:
249 Src1Name = getRegName(MI->getOperand(1).getReg());
250 DestName = getRegName(MI->getOperand(0).getReg());
251 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000252 break;
253 case X86::PUNPCKLDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000254 case X86::VPUNPCKLDQrr:
255 Src2Name = getRegName(MI->getOperand(2).getReg());
256 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000257 case X86::PUNPCKLDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000258 case X86::VPUNPCKLDQrm:
259 Src1Name = getRegName(MI->getOperand(1).getReg());
260 DestName = getRegName(MI->getOperand(0).getReg());
261 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
262 break;
263 case X86::VPUNPCKLDQYrr:
264 Src2Name = getRegName(MI->getOperand(2).getReg());
265 // FALL THROUGH.
266 case X86::VPUNPCKLDQYrm:
267 Src1Name = getRegName(MI->getOperand(1).getReg());
268 DestName = getRegName(MI->getOperand(0).getReg());
269 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000270 break;
271 case X86::PUNPCKLQDQrr:
Craig Topper3cb802c2011-12-06 05:31:16 +0000272 case X86::VPUNPCKLQDQrr:
273 Src2Name = getRegName(MI->getOperand(2).getReg());
274 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000275 case X86::PUNPCKLQDQrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000276 case X86::VPUNPCKLQDQrm:
277 Src1Name = getRegName(MI->getOperand(1).getReg());
278 DestName = getRegName(MI->getOperand(0).getReg());
279 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
280 break;
281 case X86::VPUNPCKLQDQYrr:
282 Src2Name = getRegName(MI->getOperand(2).getReg());
283 // FALL THROUGH.
284 case X86::VPUNPCKLQDQYrm:
285 Src1Name = getRegName(MI->getOperand(1).getReg());
286 DestName = getRegName(MI->getOperand(0).getReg());
287 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000288 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000289
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000290 case X86::SHUFPDrri:
Craig Topper83c45922011-11-22 14:27:57 +0000291 case X86::VSHUFPDrri:
292 Src2Name = getRegName(MI->getOperand(2).getReg());
293 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000294 case X86::SHUFPDrmi:
Craig Topper83c45922011-11-22 14:27:57 +0000295 case X86::VSHUFPDrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000296 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
297 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000298 Src1Name = getRegName(MI->getOperand(1).getReg());
299 DestName = getRegName(MI->getOperand(0).getReg());
300 break;
301 case X86::VSHUFPDYrri:
302 Src2Name = getRegName(MI->getOperand(2).getReg());
303 // FALL THROUGH.
304 case X86::VSHUFPDYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000305 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
306 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000307 Src1Name = getRegName(MI->getOperand(1).getReg());
308 DestName = getRegName(MI->getOperand(0).getReg());
309 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000310
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000311 case X86::SHUFPSrri:
Craig Topper83c45922011-11-22 14:27:57 +0000312 case X86::VSHUFPSrri:
313 Src2Name = getRegName(MI->getOperand(2).getReg());
314 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000315 case X86::SHUFPSrmi:
Craig Topper83c45922011-11-22 14:27:57 +0000316 case X86::VSHUFPSrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000317 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
318 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000319 Src1Name = getRegName(MI->getOperand(1).getReg());
320 DestName = getRegName(MI->getOperand(0).getReg());
321 break;
322 case X86::VSHUFPSYrri:
323 Src2Name = getRegName(MI->getOperand(2).getReg());
324 // FALL THROUGH.
325 case X86::VSHUFPSYrmi:
Craig Topper1d63ae32011-11-29 07:58:09 +0000326 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
327 ShuffleMask);
Craig Topper83c45922011-11-22 14:27:57 +0000328 Src1Name = getRegName(MI->getOperand(1).getReg());
329 DestName = getRegName(MI->getOperand(0).getReg());
330 break;
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000331
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000332 case X86::UNPCKLPDrr:
David Greene20a1cbe2011-02-28 19:06:56 +0000333 case X86::VUNPCKLPDrr:
334 Src2Name = getRegName(MI->getOperand(2).getReg());
335 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000336 case X86::UNPCKLPDrm:
David Greene20a1cbe2011-02-28 19:06:56 +0000337 case X86::VUNPCKLPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000338 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000339 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000340 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000341 break;
342 case X86::VUNPCKLPDYrr:
343 Src2Name = getRegName(MI->getOperand(2).getReg());
344 // FALL THROUGH.
345 case X86::VUNPCKLPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000346 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000347 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000348 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000349 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000350 case X86::UNPCKLPSrr:
David Greene20a1cbe2011-02-28 19:06:56 +0000351 case X86::VUNPCKLPSrr:
352 Src2Name = getRegName(MI->getOperand(2).getReg());
353 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000354 case X86::UNPCKLPSrm:
David Greene20a1cbe2011-02-28 19:06:56 +0000355 case X86::VUNPCKLPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000356 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
David Greene20a1cbe2011-02-28 19:06:56 +0000357 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000358 DestName = getRegName(MI->getOperand(0).getReg());
David Greene20a1cbe2011-02-28 19:06:56 +0000359 break;
360 case X86::VUNPCKLPSYrr:
361 Src2Name = getRegName(MI->getOperand(2).getReg());
362 // FALL THROUGH.
363 case X86::VUNPCKLPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000364 DecodeUNPCKLMask(MVT::v8f32, 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;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000368 case X86::UNPCKHPDrr:
Craig Topperccb70972011-11-22 01:57:35 +0000369 case X86::VUNPCKHPDrr:
370 Src2Name = getRegName(MI->getOperand(2).getReg());
371 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000372 case X86::UNPCKHPDrm:
Craig Topperccb70972011-11-22 01:57:35 +0000373 case X86::VUNPCKHPDrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000374 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000375 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000376 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000377 break;
378 case X86::VUNPCKHPDYrr:
379 Src2Name = getRegName(MI->getOperand(2).getReg());
380 // FALL THROUGH.
381 case X86::VUNPCKHPDYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000382 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000383 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000384 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000385 break;
Chris Lattner38ccc8b2010-08-29 03:08:08 +0000386 case X86::UNPCKHPSrr:
Craig Topperccb70972011-11-22 01:57:35 +0000387 case X86::VUNPCKHPSrr:
388 Src2Name = getRegName(MI->getOperand(2).getReg());
389 // FALL THROUGH.
Craig Topperc0481542013-01-29 07:54:31 +0000390 case X86::UNPCKHPSrm:
Craig Topperccb70972011-11-22 01:57:35 +0000391 case X86::VUNPCKHPSrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000392 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000393 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000394 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000395 break;
396 case X86::VUNPCKHPSYrr:
397 Src2Name = getRegName(MI->getOperand(2).getReg());
398 // FALL THROUGH.
399 case X86::VUNPCKHPSYrm:
Craig Topper3cb802c2011-12-06 05:31:16 +0000400 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
Craig Topperccb70972011-11-22 01:57:35 +0000401 Src1Name = getRegName(MI->getOperand(1).getReg());
Craig Topper83c45922011-11-22 14:27:57 +0000402 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperccb70972011-11-22 01:57:35 +0000403 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000404 case X86::VPERMILPSri:
Craig Topperc16db842011-11-29 07:49:05 +0000405 Src1Name = getRegName(MI->getOperand(1).getReg());
406 // FALL THROUGH.
407 case X86::VPERMILPSmi:
Craig Topper1f710572012-02-06 07:17:51 +0000408 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
409 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000410 DestName = getRegName(MI->getOperand(0).getReg());
Duncan Sands00f39c12011-08-04 15:45:59 +0000411 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000412 case X86::VPERMILPSYri:
Craig Topperc16db842011-11-29 07:49:05 +0000413 Src1Name = getRegName(MI->getOperand(1).getReg());
414 // FALL THROUGH.
415 case X86::VPERMILPSYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000416 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
417 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000418 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000419 break;
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000420 case X86::VPERMILPDri:
Craig Topperc16db842011-11-29 07:49:05 +0000421 Src1Name = getRegName(MI->getOperand(1).getReg());
422 // FALL THROUGH.
423 case X86::VPERMILPDmi:
Craig Topper1f710572012-02-06 07:17:51 +0000424 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
425 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000426 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopes795f5582011-07-29 01:31:11 +0000427 break;
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000428 case X86::VPERMILPDYri:
Craig Topperc16db842011-11-29 07:49:05 +0000429 Src1Name = getRegName(MI->getOperand(1).getReg());
430 // FALL THROUGH.
431 case X86::VPERMILPDYmi:
Craig Topper1f710572012-02-06 07:17:51 +0000432 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperbafd2242011-11-30 06:25:25 +0000433 ShuffleMask);
Craig Topperc16db842011-11-29 07:49:05 +0000434 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesb878caa2011-07-21 01:55:47 +0000435 break;
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000436 case X86::VPERM2F128rr:
Craig Topperc16db842011-11-29 07:49:05 +0000437 case X86::VPERM2I128rr:
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000438 Src2Name = getRegName(MI->getOperand(2).getReg());
Craig Topperc16db842011-11-29 07:49:05 +0000439 // FALL THROUGH.
440 case X86::VPERM2F128rm:
441 case X86::VPERM2I128rm:
Craig Topper1f710572012-02-06 07:17:51 +0000442 // For instruction comments purpose, assume the 256-bit vector is v4i64.
443 DecodeVPERM2X128Mask(MVT::v4i64,
444 MI->getOperand(MI->getNumOperands()-1).getImm(),
Craig Topperc16db842011-11-29 07:49:05 +0000445 ShuffleMask);
446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 DestName = getRegName(MI->getOperand(0).getReg());
Bruno Cardoso Lopesf15dfe52011-08-12 21:48:26 +0000448 break;
Craig Topper54bdb352012-05-06 18:44:02 +0000449 case X86::VPERMQYri:
450 case X86::VPERMPDYri:
451 Src1Name = getRegName(MI->getOperand(1).getReg());
452 // FALL THROUGH.
453 case X86::VPERMQYmi:
454 case X86::VPERMPDYmi:
455 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
456 ShuffleMask);
457 DestName = getRegName(MI->getOperand(0).getReg());
458 break;
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000459 }
460
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000461
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000462 // If this was a shuffle operation, print the shuffle mask.
463 if (!ShuffleMask.empty()) {
464 if (DestName == 0) DestName = Src1Name;
465 OS << (DestName ? DestName : "mem") << " = ";
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000466
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000467 // If the two sources are the same, canonicalize the input elements to be
468 // from the first src so that we get larger element spans.
469 if (Src1Name == Src2Name) {
470 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
471 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
Craig Toppercbc96a62012-03-20 06:42:26 +0000472 ShuffleMask[i] >= (int)e) // From second mask.
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000473 ShuffleMask[i] -= e;
474 }
475 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000476
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000477 // The shuffle mask specifies which elements of the src1/src2 fill in the
478 // destination, with a few sentinel values. Loop through and print them
479 // out.
480 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
481 if (i != 0)
482 OS << ',';
Benjamin Kramerbc106672012-03-21 13:48:11 +0000483 if (ShuffleMask[i] == SM_SentinelZero) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000484 OS << "zero";
485 continue;
486 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000487
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000488 // Otherwise, it must come from src1 or src2. Print the span of elements
489 // that comes from this src.
Craig Toppercbc96a62012-03-20 06:42:26 +0000490 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000491 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
492 OS << (SrcName ? SrcName : "mem") << '[';
493 bool IsFirst = true;
494 while (i != e &&
495 (int)ShuffleMask[i] >= 0 &&
Craig Toppercbc96a62012-03-20 06:42:26 +0000496 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000497 if (!IsFirst)
498 OS << ',';
499 else
500 IsFirst = false;
501 OS << ShuffleMask[i] % ShuffleMask.size();
502 ++i;
503 }
504 OS << ']';
505 --i; // For loop increments element #.
506 }
507 //MI->print(OS, 0);
508 OS << "\n";
509 }
Bruno Cardoso Lopesc79f5012010-09-02 18:40:13 +0000510
Chris Lattner7a05e6d2010-08-28 20:42:31 +0000511}