Deleted Added
full compact
X86InstrMMX.td (198892) X86InstrMMX.td (201360)
1//====- X86InstrMMX.td - Describe the X86 Instruction Set --*- tablegen -*-===//
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//===----------------------------------------------------------------------===//

--- 58 unchanged lines hidden (view full) ---

67// MMX Multiclasses
68//===----------------------------------------------------------------------===//
69
70let Constraints = "$src1 = $dst" in {
71 // MMXI_binop_rm - Simple MMX binary operator.
72 multiclass MMXI_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
73 ValueType OpVT, bit Commutable = 0> {
74 def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
1//====- X86InstrMMX.td - Describe the X86 Instruction Set --*- tablegen -*-===//
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//===----------------------------------------------------------------------===//

--- 58 unchanged lines hidden (view full) ---

67// MMX Multiclasses
68//===----------------------------------------------------------------------===//
69
70let Constraints = "$src1 = $dst" in {
71 // MMXI_binop_rm - Simple MMX binary operator.
72 multiclass MMXI_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
73 ValueType OpVT, bit Commutable = 0> {
74 def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
75 (ins VR64:$src1, VR64:$src2),
75 (ins VR64:$src1, VR64:$src2),
76 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
77 [(set VR64:$dst, (OpVT (OpNode VR64:$src1, VR64:$src2)))]> {
78 let isCommutable = Commutable;
79 }
80 def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
76 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
77 [(set VR64:$dst, (OpVT (OpNode VR64:$src1, VR64:$src2)))]> {
78 let isCommutable = Commutable;
79 }
80 def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
81 (ins VR64:$src1, i64mem:$src2),
81 (ins VR64:$src1, i64mem:$src2),
82 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
83 [(set VR64:$dst, (OpVT (OpNode VR64:$src1,
84 (bitconvert
85 (load_mmx addr:$src2)))))]>;
86 }
87
88 multiclass MMXI_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId,
89 bit Commutable = 0> {
90 def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
82 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
83 [(set VR64:$dst, (OpVT (OpNode VR64:$src1,
84 (bitconvert
85 (load_mmx addr:$src2)))))]>;
86 }
87
88 multiclass MMXI_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId,
89 bit Commutable = 0> {
90 def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
91 (ins VR64:$src1, VR64:$src2),
91 (ins VR64:$src1, VR64:$src2),
92 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
93 [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]> {
94 let isCommutable = Commutable;
95 }
96 def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
92 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
93 [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]> {
94 let isCommutable = Commutable;
95 }
96 def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
97 (ins VR64:$src1, i64mem:$src2),
97 (ins VR64:$src1, i64mem:$src2),
98 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
99 [(set VR64:$dst, (IntId VR64:$src1,
100 (bitconvert (load_mmx addr:$src2))))]>;
101 }
102
103 // MMXI_binop_rm_v1i64 - Simple MMX binary operator whose type is v1i64.
104 //
105 // FIXME: we could eliminate this and use MMXI_binop_rm instead if tblgen knew

--- 33 unchanged lines hidden (view full) ---

139 }
140}
141
142//===----------------------------------------------------------------------===//
143// MMX EMMS & FEMMS Instructions
144//===----------------------------------------------------------------------===//
145
146def MMX_EMMS : MMXI<0x77, RawFrm, (outs), (ins), "emms",
98 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
99 [(set VR64:$dst, (IntId VR64:$src1,
100 (bitconvert (load_mmx addr:$src2))))]>;
101 }
102
103 // MMXI_binop_rm_v1i64 - Simple MMX binary operator whose type is v1i64.
104 //
105 // FIXME: we could eliminate this and use MMXI_binop_rm instead if tblgen knew

--- 33 unchanged lines hidden (view full) ---

139 }
140}
141
142//===----------------------------------------------------------------------===//
143// MMX EMMS & FEMMS Instructions
144//===----------------------------------------------------------------------===//
145
146def MMX_EMMS : MMXI<0x77, RawFrm, (outs), (ins), "emms",
147 [(int_x86_mmx_emms)]>;
147 [(int_x86_mmx_emms)]>;
148def MMX_FEMMS : MMXI<0x0E, RawFrm, (outs), (ins), "femms",
148def MMX_FEMMS : MMXI<0x0E, RawFrm, (outs), (ins), "femms",
149 [(int_x86_mmx_femms)]>;
149 [(int_x86_mmx_femms)]>;
150
151//===----------------------------------------------------------------------===//
152// MMX Scalar Instructions
153//===----------------------------------------------------------------------===//
154
155// Data Transfer Instructions
156def MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
157 "movd\t{$src, $dst|$dst, $src}",
150
151//===----------------------------------------------------------------------===//
152// MMX Scalar Instructions
153//===----------------------------------------------------------------------===//
154
155// Data Transfer Instructions
156def MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
157 "movd\t{$src, $dst|$dst, $src}",
158 [(set VR64:$dst,
159 (v2i32 (scalar_to_vector GR32:$src)))]>;
158 [(set VR64:$dst,
159 (v2i32 (scalar_to_vector GR32:$src)))]>;
160let canFoldAsLoad = 1, isReMaterializable = 1 in
161def MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
162 "movd\t{$src, $dst|$dst, $src}",
163 [(set VR64:$dst,
160let canFoldAsLoad = 1, isReMaterializable = 1 in
161def MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
162 "movd\t{$src, $dst|$dst, $src}",
163 [(set VR64:$dst,
164 (v2i32 (scalar_to_vector (loadi32 addr:$src))))]>;
164 (v2i32 (scalar_to_vector (loadi32 addr:$src))))]>;
165let mayStore = 1 in
166def MMX_MOVD64mr : MMXI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR64:$src),
167 "movd\t{$src, $dst|$dst, $src}", []>;
165let mayStore = 1 in
166def MMX_MOVD64mr : MMXI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR64:$src),
167 "movd\t{$src, $dst|$dst, $src}", []>;
168def MMX_MOVD64grr : MMXI<0x7E, MRMDestReg, (outs), (ins GR32:$dst, VR64:$src),
169 "movd\t{$src, $dst|$dst, $src}", []>;
170def MMX_MOVQ64gmr : MMXRI<0x7E, MRMDestMem, (outs),
171 (ins i64mem:$dst, VR64:$src),
172 "movq\t{$src, $dst|$dst, $src}", []>;
168
169let neverHasSideEffects = 1 in
170def MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
171 "movd\t{$src, $dst|$dst, $src}",
172 []>;
173
174let neverHasSideEffects = 1 in
175// These are 64 bit moves, but since the OS X assembler doesn't
176// recognize a register-register movq, we write them as
177// movd.
178def MMX_MOVD64from64rr : MMXRI<0x7E, MRMDestReg,
179 (outs GR64:$dst), (ins VR64:$src),
180 "movd\t{$src, $dst|$dst, $src}", []>;
181def MMX_MOVD64rrv164 : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
182 "movd\t{$src, $dst|$dst, $src}",
183 [(set VR64:$dst,
173
174let neverHasSideEffects = 1 in
175def MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
176 "movd\t{$src, $dst|$dst, $src}",
177 []>;
178
179let neverHasSideEffects = 1 in
180// These are 64 bit moves, but since the OS X assembler doesn't
181// recognize a register-register movq, we write them as
182// movd.
183def MMX_MOVD64from64rr : MMXRI<0x7E, MRMDestReg,
184 (outs GR64:$dst), (ins VR64:$src),
185 "movd\t{$src, $dst|$dst, $src}", []>;
186def MMX_MOVD64rrv164 : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
187 "movd\t{$src, $dst|$dst, $src}",
188 [(set VR64:$dst,
184 (v1i64 (scalar_to_vector GR64:$src)))]>;
189 (v1i64 (scalar_to_vector GR64:$src)))]>;
185
186let neverHasSideEffects = 1 in
187def MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
188 "movq\t{$src, $dst|$dst, $src}", []>;
189let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in
190def MMX_MOVQ64rm : MMXI<0x6F, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
191 "movq\t{$src, $dst|$dst, $src}",
192 [(set VR64:$dst, (load_mmx addr:$src))]>;

--- 25 unchanged lines hidden (view full) ---

218let AddedComplexity = 15 in
219// movd to MMX register zero-extends
220def MMX_MOVZDI2PDIrr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
221 "movd\t{$src, $dst|$dst, $src}",
222 [(set VR64:$dst,
223 (v2i32 (X86vzmovl (v2i32 (scalar_to_vector GR32:$src)))))]>;
224let AddedComplexity = 20 in
225def MMX_MOVZDI2PDIrm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst),
190
191let neverHasSideEffects = 1 in
192def MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
193 "movq\t{$src, $dst|$dst, $src}", []>;
194let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in
195def MMX_MOVQ64rm : MMXI<0x6F, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
196 "movq\t{$src, $dst|$dst, $src}",
197 [(set VR64:$dst, (load_mmx addr:$src))]>;

--- 25 unchanged lines hidden (view full) ---

223let AddedComplexity = 15 in
224// movd to MMX register zero-extends
225def MMX_MOVZDI2PDIrr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
226 "movd\t{$src, $dst|$dst, $src}",
227 [(set VR64:$dst,
228 (v2i32 (X86vzmovl (v2i32 (scalar_to_vector GR32:$src)))))]>;
229let AddedComplexity = 20 in
230def MMX_MOVZDI2PDIrm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst),
226 (ins i32mem:$src),
231 (ins i32mem:$src),
227 "movd\t{$src, $dst|$dst, $src}",
228 [(set VR64:$dst,
229 (v2i32 (X86vzmovl (v2i32
230 (scalar_to_vector (loadi32 addr:$src))))))]>;
231
232// Arithmetic Instructions
233
234// -- Addition

--- 192 unchanged lines hidden (view full) ---

427 (undef)))]>;
428
429// -- Conversion Instructions
430let neverHasSideEffects = 1 in {
431def MMX_CVTPD2PIrr : MMX2I<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
432 "cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
433let mayLoad = 1 in
434def MMX_CVTPD2PIrm : MMX2I<0x2D, MRMSrcMem, (outs VR64:$dst),
232 "movd\t{$src, $dst|$dst, $src}",
233 [(set VR64:$dst,
234 (v2i32 (X86vzmovl (v2i32
235 (scalar_to_vector (loadi32 addr:$src))))))]>;
236
237// Arithmetic Instructions
238
239// -- Addition

--- 192 unchanged lines hidden (view full) ---

432 (undef)))]>;
433
434// -- Conversion Instructions
435let neverHasSideEffects = 1 in {
436def MMX_CVTPD2PIrr : MMX2I<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
437 "cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
438let mayLoad = 1 in
439def MMX_CVTPD2PIrm : MMX2I<0x2D, MRMSrcMem, (outs VR64:$dst),
435 (ins f128mem:$src),
440 (ins f128mem:$src),
436 "cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
437
438def MMX_CVTPI2PDrr : MMX2I<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
439 "cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
440let mayLoad = 1 in
441def MMX_CVTPI2PDrm : MMX2I<0x2A, MRMSrcMem, (outs VR128:$dst),
441 "cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
442
443def MMX_CVTPI2PDrr : MMX2I<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
444 "cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
445let mayLoad = 1 in
446def MMX_CVTPI2PDrm : MMX2I<0x2A, MRMSrcMem, (outs VR128:$dst),
442 (ins i64mem:$src),
447 (ins i64mem:$src),
443 "cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
444
445def MMX_CVTPI2PSrr : MMXI<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
446 "cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
447let mayLoad = 1 in
448def MMX_CVTPI2PSrm : MMXI<0x2A, MRMSrcMem, (outs VR128:$dst),
448 "cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
449
450def MMX_CVTPI2PSrr : MMXI<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
451 "cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
452let mayLoad = 1 in
453def MMX_CVTPI2PSrm : MMXI<0x2A, MRMSrcMem, (outs VR128:$dst),
449 (ins i64mem:$src),
454 (ins i64mem:$src),
450 "cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
451
452def MMX_CVTPS2PIrr : MMXI<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
453 "cvtps2pi\t{$src, $dst|$dst, $src}", []>;
454let mayLoad = 1 in
455def MMX_CVTPS2PIrm : MMXI<0x2D, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
456 "cvtps2pi\t{$src, $dst|$dst, $src}", []>;
457
458def MMX_CVTTPD2PIrr : MMX2I<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
459 "cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
460let mayLoad = 1 in
461def MMX_CVTTPD2PIrm : MMX2I<0x2C, MRMSrcMem, (outs VR64:$dst),
455 "cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
456
457def MMX_CVTPS2PIrr : MMXI<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
458 "cvtps2pi\t{$src, $dst|$dst, $src}", []>;
459let mayLoad = 1 in
460def MMX_CVTPS2PIrm : MMXI<0x2D, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
461 "cvtps2pi\t{$src, $dst|$dst, $src}", []>;
462
463def MMX_CVTTPD2PIrr : MMX2I<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
464 "cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
465let mayLoad = 1 in
466def MMX_CVTTPD2PIrm : MMX2I<0x2C, MRMSrcMem, (outs VR64:$dst),
462 (ins f128mem:$src),
467 (ins f128mem:$src),
463 "cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
464
465def MMX_CVTTPS2PIrr : MMXI<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
466 "cvttps2pi\t{$src, $dst|$dst, $src}", []>;
467let mayLoad = 1 in
468def MMX_CVTTPS2PIrm : MMXI<0x2C, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
469 "cvttps2pi\t{$src, $dst|$dst, $src}", []>;
470} // end neverHasSideEffects

--- 5 unchanged lines hidden (view full) ---

476
477def MMX_PEXTRWri : MMXIi8<0xC5, MRMSrcReg,
478 (outs GR32:$dst), (ins VR64:$src1, i16i8imm:$src2),
479 "pextrw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
480 [(set GR32:$dst, (MMX_X86pextrw (v4i16 VR64:$src1),
481 (iPTR imm:$src2)))]>;
482let Constraints = "$src1 = $dst" in {
483 def MMX_PINSRWrri : MMXIi8<0xC4, MRMSrcReg,
468 "cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
469
470def MMX_CVTTPS2PIrr : MMXI<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
471 "cvttps2pi\t{$src, $dst|$dst, $src}", []>;
472let mayLoad = 1 in
473def MMX_CVTTPS2PIrm : MMXI<0x2C, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
474 "cvttps2pi\t{$src, $dst|$dst, $src}", []>;
475} // end neverHasSideEffects

--- 5 unchanged lines hidden (view full) ---

481
482def MMX_PEXTRWri : MMXIi8<0xC5, MRMSrcReg,
483 (outs GR32:$dst), (ins VR64:$src1, i16i8imm:$src2),
484 "pextrw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
485 [(set GR32:$dst, (MMX_X86pextrw (v4i16 VR64:$src1),
486 (iPTR imm:$src2)))]>;
487let Constraints = "$src1 = $dst" in {
488 def MMX_PINSRWrri : MMXIi8<0xC4, MRMSrcReg,
484 (outs VR64:$dst), (ins VR64:$src1, GR32:$src2,
485 i16i8imm:$src3),
489 (outs VR64:$dst),
490 (ins VR64:$src1, GR32:$src2,i16i8imm:$src3),
486 "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
487 [(set VR64:$dst, (v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
488 GR32:$src2,(iPTR imm:$src3))))]>;
489 def MMX_PINSRWrmi : MMXIi8<0xC4, MRMSrcMem,
491 "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
492 [(set VR64:$dst, (v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
493 GR32:$src2,(iPTR imm:$src3))))]>;
494 def MMX_PINSRWrmi : MMXIi8<0xC4, MRMSrcMem,
490 (outs VR64:$dst), (ins VR64:$src1, i16mem:$src2,
491 i16i8imm:$src3),
495 (outs VR64:$dst),
496 (ins VR64:$src1, i16mem:$src2, i16i8imm:$src3),
492 "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
493 [(set VR64:$dst,
494 (v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
495 (i32 (anyext (loadi16 addr:$src2))),
496 (iPTR imm:$src3))))]>;
497}
498
499// Mask creation

--- 219 unchanged lines hidden ---
497 "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
498 [(set VR64:$dst,
499 (v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
500 (i32 (anyext (loadi16 addr:$src2))),
501 (iPTR imm:$src3))))]>;
502}
503
504// Mask creation

--- 219 unchanged lines hidden ---