blob: 79440990fb9d40ab8316fdc2f6fb7b1a822c51e5 [file] [log] [blame]
Evan Cheng6e595b92006-02-21 19:13:53 +00001//====- X86InstrMMX.td - Describe the X86 Instruction Set -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the X86 MMX instruction set, defining the instructions,
11// and properties of the instructions which are needed for code generation,
12// machine code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
Evan Cheng09a95622006-04-11 06:57:30 +000016// Instruction templates
17// MMXi8 - MMX instructions with ImmT == Imm8 and TB prefix.
18class MMXIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
19 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasMMX]> {
20 let Pattern = pattern;
21}
22
Evan Chenge6448442006-03-20 06:04:52 +000023// Some 'special' instructions
24def IMPLICIT_DEF_VR64 : I<0, Pseudo, (ops VR64:$dst),
25 "#IMPLICIT_DEF $dst",
26 [(set VR64:$dst, (v8i8 (undef)))]>,
27 Requires<[HasMMX]>;
28
29def : Pat<(v4i16 (undef)), (IMPLICIT_DEF_VR64)>, Requires<[HasMMX]>;
30def : Pat<(v2i32 (undef)), (IMPLICIT_DEF_VR64)>, Requires<[HasMMX]>;
31
Evan Cheng6e595b92006-02-21 19:13:53 +000032// Move Instructions
33def MOVD64rr : I<0x6E, MRMSrcReg, (ops VR64:$dst, R32:$src),
Evan Chengbaea59c2006-03-21 23:04:23 +000034 "movd {$src, $dst|$dst, $src}", []>, TB,
Evan Cheng6e595b92006-02-21 19:13:53 +000035 Requires<[HasMMX]>;
36def MOVD64rm : I<0x6E, MRMSrcMem, (ops VR64:$dst, i32mem:$src),
37 "movd {$src, $dst|$dst, $src}", []>, TB,
38 Requires<[HasMMX]>;
39def MOVD64mr : I<0x7E, MRMDestMem, (ops i32mem:$dst, VR64:$src),
40 "movd {$src, $dst|$dst, $src}", []>, TB,
41 Requires<[HasMMX]>;
42
Evan Cheng6e595b92006-02-21 19:13:53 +000043def MOVQ64rr : I<0x6F, MRMSrcReg, (ops VR64:$dst, VR64:$src),
44 "movq {$src, $dst|$dst, $src}", []>, TB,
45 Requires<[HasMMX]>;
46def MOVQ64rm : I<0x6F, MRMSrcMem, (ops VR64:$dst, i64mem:$src),
47 "movq {$src, $dst|$dst, $src}", []>, TB,
48 Requires<[HasMMX]>;
49def MOVQ64mr : I<0x7F, MRMDestMem, (ops i64mem:$dst, VR64:$src),
50 "movq {$src, $dst|$dst, $src}", []>, TB,
51 Requires<[HasMMX]>;
Evan Cheng8e481df2006-03-25 01:31:59 +000052
53// Conversion instructions
54def CVTTPS2PIrr: I<0x2C, MRMSrcReg, (ops VR64:$dst, VR128:$src),
55 "cvttps2pi {$src, $dst|$dst, $src}", []>, TB,
56 Requires<[HasSSE2]>;
Evan Cheng1aaa7282006-03-25 06:00:03 +000057def CVTTPS2PIrm: I<0x2C, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng8e481df2006-03-25 01:31:59 +000058 "cvttps2pi {$src, $dst|$dst, $src}", []>, TB,
59 Requires<[HasMMX]>;
Evan Cheng09a95622006-04-11 06:57:30 +000060
61// Shuffle and unpack instructions
62def PSHUFWri : MMXIi8<0x70, MRMSrcReg,
63 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
64 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
65def PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
66 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
67 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
68
69// Misc.
70def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
71 "movntq {$src, $dst|$dst, $src}", []>, TB,
72 Requires<[HasMMX]>;
73
74def MASKMOVQ : I<0xF7, MRMDestMem, (ops VR64:$src, VR64:$mask),
75 "maskmovq {$mask, $src|$src, $mask}", []>, TB,
76 Requires<[HasMMX]>;
77