1235633Sdim//===-- X86InstrFMA.td - FMA Instruction Set ---------------*- tablegen -*-===//
2212793Sdim//
3212793Sdim//                     The LLVM Compiler Infrastructure
4212793Sdim//
5212793Sdim// This file is distributed under the University of Illinois Open Source
6212793Sdim// License. See LICENSE.TXT for details.
7212793Sdim//
8212793Sdim//===----------------------------------------------------------------------===//
9212793Sdim//
10212793Sdim// This file describes FMA (Fused Multiply-Add) instructions.
11212793Sdim//
12212793Sdim//===----------------------------------------------------------------------===//
13212793Sdim
14212793Sdim//===----------------------------------------------------------------------===//
15212793Sdim// FMA3 - Intel 3 operand Fused Multiply-Add instructions
16212793Sdim//===----------------------------------------------------------------------===//
17212793Sdim
18245431Sdimlet Constraints = "$src1 = $dst" in {
19245431Sdimmulticlass fma3p_rm<bits<8> opc, string OpcodeStr,
20245431Sdim                    PatFrag MemFrag128, PatFrag MemFrag256,
21245431Sdim                    ValueType OpVT128, ValueType OpVT256,
22245431Sdim                    SDPatternOperator Op = null_frag> {
23245431Sdim  let isCommutable = 1 in
24245431Sdim  def r     : FMA3<opc, MRMSrcReg, (outs VR128:$dst),
25245431Sdim                   (ins VR128:$src1, VR128:$src2, VR128:$src3),
26245431Sdim                   !strconcat(OpcodeStr,
27245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
28245431Sdim                   [(set VR128:$dst, (OpVT128 (Op VR128:$src2,
29245431Sdim                                               VR128:$src1, VR128:$src3)))]>;
30245431Sdim
31245431Sdim  let mayLoad = 1 in
32245431Sdim  def m     : FMA3<opc, MRMSrcMem, (outs VR128:$dst),
33245431Sdim                   (ins VR128:$src1, VR128:$src2, f128mem:$src3),
34245431Sdim                   !strconcat(OpcodeStr,
35245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
36245431Sdim                   [(set VR128:$dst, (OpVT128 (Op VR128:$src2, VR128:$src1,
37245431Sdim                                               (MemFrag128 addr:$src3))))]>;
38245431Sdim
39245431Sdim  let isCommutable = 1 in
40245431Sdim  def rY    : FMA3<opc, MRMSrcReg, (outs VR256:$dst),
41245431Sdim                   (ins VR256:$src1, VR256:$src2, VR256:$src3),
42245431Sdim                   !strconcat(OpcodeStr,
43245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
44245431Sdim                   [(set VR256:$dst, (OpVT256 (Op VR256:$src2, VR256:$src1,
45245431Sdim                                               VR256:$src3)))]>, VEX_L;
46245431Sdim
47245431Sdim  let mayLoad = 1 in
48245431Sdim  def mY    : FMA3<opc, MRMSrcMem, (outs VR256:$dst),
49245431Sdim                   (ins VR256:$src1, VR256:$src2, f256mem:$src3),
50245431Sdim                   !strconcat(OpcodeStr,
51245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
52245431Sdim                   [(set VR256:$dst,
53245431Sdim                     (OpVT256 (Op VR256:$src2, VR256:$src1,
54245431Sdim                               (MemFrag256 addr:$src3))))]>, VEX_L;
55212793Sdim}
56245431Sdim} // Constraints = "$src1 = $dst"
57212793Sdim
58235633Sdimmulticlass fma3p_forms<bits<8> opc132, bits<8> opc213, bits<8> opc231,
59245431Sdim                       string OpcodeStr, string PackTy,
60245431Sdim                       PatFrag MemFrag128, PatFrag MemFrag256,
61245431Sdim                       SDNode Op, ValueType OpTy128, ValueType OpTy256> {
62245431Sdim  defm r213 : fma3p_rm<opc213,
63252723Sdim                       !strconcat(OpcodeStr, "213", PackTy),
64245431Sdim                       MemFrag128, MemFrag256, OpTy128, OpTy256, Op>;
65245431Sdimlet neverHasSideEffects = 1 in {
66245431Sdim  defm r132 : fma3p_rm<opc132,
67252723Sdim                       !strconcat(OpcodeStr, "132", PackTy),
68245431Sdim                       MemFrag128, MemFrag256, OpTy128, OpTy256>;
69245431Sdim  defm r231 : fma3p_rm<opc231,
70252723Sdim                       !strconcat(OpcodeStr, "231", PackTy),
71245431Sdim                       MemFrag128, MemFrag256, OpTy128, OpTy256>;
72245431Sdim} // neverHasSideEffects = 1
73212793Sdim}
74212793Sdim
75235633Sdim// Fused Multiply-Add
76235633Sdimlet ExeDomain = SSEPackedSingle in {
77263509Sdim  defm VFMADDPS    : fma3p_forms<0x98, 0xA8, 0xB8, "vfmadd", "ps", loadv4f32,
78263509Sdim                                 loadv8f32, X86Fmadd, v4f32, v8f32>;
79263509Sdim  defm VFMSUBPS    : fma3p_forms<0x9A, 0xAA, 0xBA, "vfmsub", "ps", loadv4f32,
80263509Sdim                                 loadv8f32, X86Fmsub, v4f32, v8f32>;
81245431Sdim  defm VFMADDSUBPS : fma3p_forms<0x96, 0xA6, 0xB6, "vfmaddsub", "ps",
82263509Sdim                                 loadv4f32, loadv8f32, X86Fmaddsub,
83245431Sdim                                 v4f32, v8f32>;
84245431Sdim  defm VFMSUBADDPS : fma3p_forms<0x97, 0xA7, 0xB7, "vfmsubadd", "ps",
85263509Sdim                                 loadv4f32, loadv8f32, X86Fmsubadd,
86245431Sdim                                 v4f32, v8f32>;
87235633Sdim}
88212793Sdim
89235633Sdimlet ExeDomain = SSEPackedDouble in {
90263509Sdim  defm VFMADDPD    : fma3p_forms<0x98, 0xA8, 0xB8, "vfmadd", "pd", loadv2f64,
91263509Sdim                                 loadv4f64, X86Fmadd, v2f64, v4f64>, VEX_W;
92263509Sdim  defm VFMSUBPD    : fma3p_forms<0x9A, 0xAA, 0xBA, "vfmsub", "pd", loadv2f64,
93263509Sdim                                 loadv4f64, X86Fmsub, v2f64, v4f64>, VEX_W;
94245431Sdim  defm VFMADDSUBPD : fma3p_forms<0x96, 0xA6, 0xB6, "vfmaddsub", "pd",
95263509Sdim                                 loadv2f64, loadv4f64, X86Fmaddsub,
96245431Sdim                                 v2f64, v4f64>, VEX_W;
97245431Sdim  defm VFMSUBADDPD : fma3p_forms<0x97, 0xA7, 0xB7, "vfmsubadd", "pd",
98263509Sdim                                 loadv2f64, loadv4f64, X86Fmsubadd,
99245431Sdim                                 v2f64, v4f64>, VEX_W;
100212793Sdim}
101235633Sdim
102235633Sdim// Fused Negative Multiply-Add
103235633Sdimlet ExeDomain = SSEPackedSingle in {
104263509Sdim  defm VFNMADDPS : fma3p_forms<0x9C, 0xAC, 0xBC, "vfnmadd", "ps",  loadv4f32,
105263509Sdim                               loadv8f32, X86Fnmadd, v4f32, v8f32>;
106263509Sdim  defm VFNMSUBPS : fma3p_forms<0x9E, 0xAE, 0xBE, "vfnmsub", "ps",  loadv4f32,
107263509Sdim                               loadv8f32, X86Fnmsub, v4f32, v8f32>;
108235633Sdim}
109235633Sdimlet ExeDomain = SSEPackedDouble in {
110263509Sdim  defm VFNMADDPD : fma3p_forms<0x9C, 0xAC, 0xBC, "vfnmadd", "pd", loadv2f64,
111263509Sdim                               loadv4f64, X86Fnmadd, v2f64, v4f64>, VEX_W;
112245431Sdim  defm VFNMSUBPD : fma3p_forms<0x9E, 0xAE, 0xBE, "vfnmsub", "pd",
113263509Sdim                               loadv2f64, loadv4f64, X86Fnmsub, v2f64,
114245431Sdim                               v4f64>, VEX_W;
115235633Sdim}
116235633Sdim
117245431Sdimlet Constraints = "$src1 = $dst" in {
118245431Sdimmulticlass fma3s_rm<bits<8> opc, string OpcodeStr, X86MemOperand x86memop,
119245431Sdim                    RegisterClass RC, ValueType OpVT, PatFrag mem_frag,
120245431Sdim                    SDPatternOperator OpNode = null_frag> {
121245431Sdim  let isCommutable = 1 in
122245431Sdim  def r     : FMA3<opc, MRMSrcReg, (outs RC:$dst),
123245431Sdim                   (ins RC:$src1, RC:$src2, RC:$src3),
124245431Sdim                   !strconcat(OpcodeStr,
125245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
126245431Sdim                   [(set RC:$dst,
127245431Sdim                     (OpVT (OpNode RC:$src2, RC:$src1, RC:$src3)))]>;
128245431Sdim  let mayLoad = 1 in
129245431Sdim  def m     : FMA3<opc, MRMSrcMem, (outs RC:$dst),
130245431Sdim                   (ins RC:$src1, RC:$src2, x86memop:$src3),
131245431Sdim                   !strconcat(OpcodeStr,
132245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
133245431Sdim                   [(set RC:$dst,
134245431Sdim                     (OpVT (OpNode RC:$src2, RC:$src1,
135245431Sdim                            (mem_frag addr:$src3))))]>;
136235633Sdim}
137235633Sdim
138245431Sdimmulticlass fma3s_rm_int<bits<8> opc, string OpcodeStr, Operand memop,
139245431Sdim                        ComplexPattern mem_cpat, Intrinsic IntId,
140245431Sdim                        RegisterClass RC> {
141245431Sdim  let isCommutable = 1 in
142245431Sdim  def r_Int : FMA3<opc, MRMSrcReg, (outs VR128:$dst),
143245431Sdim                   (ins VR128:$src1, VR128:$src2, VR128:$src3),
144245431Sdim                   !strconcat(OpcodeStr,
145245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
146245431Sdim                   [(set VR128:$dst, (IntId VR128:$src2, VR128:$src1,
147245431Sdim                     VR128:$src3))]>;
148245431Sdim  def m_Int : FMA3<opc, MRMSrcMem, (outs VR128:$dst),
149245431Sdim                   (ins VR128:$src1, VR128:$src2, memop:$src3),
150245431Sdim                   !strconcat(OpcodeStr,
151245431Sdim                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
152245431Sdim                   [(set VR128:$dst,
153245431Sdim                     (IntId VR128:$src2, VR128:$src1, mem_cpat:$src3))]>;
154245431Sdim}
155245431Sdim} // Constraints = "$src1 = $dst"
156245431Sdim
157235633Sdimmulticlass fma3s_forms<bits<8> opc132, bits<8> opc213, bits<8> opc231,
158245431Sdim                       string OpStr, string PackTy, Intrinsic Int,
159245431Sdim                       SDNode OpNode, RegisterClass RC, ValueType OpVT,
160245431Sdim                       X86MemOperand x86memop, Operand memop, PatFrag mem_frag,
161245431Sdim                       ComplexPattern mem_cpat> {
162245431Sdimlet neverHasSideEffects = 1 in {
163252723Sdim  defm r132 : fma3s_rm<opc132, !strconcat(OpStr, "132", PackTy),
164245431Sdim                       x86memop, RC, OpVT, mem_frag>;
165252723Sdim  defm r231 : fma3s_rm<opc231, !strconcat(OpStr, "231", PackTy),
166245431Sdim                       x86memop, RC, OpVT, mem_frag>;
167235633Sdim}
168235633Sdim
169252723Sdimdefm r213 : fma3s_rm<opc213, !strconcat(OpStr, "213", PackTy),
170245431Sdim                     x86memop, RC, OpVT, mem_frag, OpNode>,
171252723Sdim            fma3s_rm_int<opc213, !strconcat(OpStr, "213", PackTy),
172245431Sdim                         memop, mem_cpat, Int, RC>;
173245431Sdim}
174235633Sdim
175245431Sdimmulticlass fma3s<bits<8> opc132, bits<8> opc213, bits<8> opc231,
176245431Sdim                 string OpStr, Intrinsic IntF32, Intrinsic IntF64,
177245431Sdim                 SDNode OpNode> {
178245431Sdim  defm SS : fma3s_forms<opc132, opc213, opc231, OpStr, "ss", IntF32, OpNode,
179245431Sdim                        FR32, f32, f32mem, ssmem, loadf32, sse_load_f32>;
180245431Sdim  defm SD : fma3s_forms<opc132, opc213, opc231, OpStr, "sd", IntF64, OpNode,
181245431Sdim                        FR64, f64, f64mem, sdmem, loadf64, sse_load_f64>, VEX_W;
182245431Sdim}
183235633Sdim
184245431Sdimdefm VFMADD : fma3s<0x99, 0xA9, 0xB9, "vfmadd", int_x86_fma_vfmadd_ss,
185245431Sdim                    int_x86_fma_vfmadd_sd, X86Fmadd>, VEX_LIG;
186245431Sdimdefm VFMSUB : fma3s<0x9B, 0xAB, 0xBB, "vfmsub", int_x86_fma_vfmsub_ss,
187245431Sdim                    int_x86_fma_vfmsub_sd, X86Fmsub>, VEX_LIG;
188245431Sdim
189245431Sdimdefm VFNMADD : fma3s<0x9D, 0xAD, 0xBD, "vfnmadd", int_x86_fma_vfnmadd_ss,
190245431Sdim                     int_x86_fma_vfnmadd_sd, X86Fnmadd>, VEX_LIG;
191245431Sdimdefm VFNMSUB : fma3s<0x9F, 0xAF, 0xBF, "vfnmsub", int_x86_fma_vfnmsub_ss,
192245431Sdim                     int_x86_fma_vfnmsub_sd, X86Fnmsub>, VEX_LIG;
193245431Sdim
194245431Sdim
195235633Sdim//===----------------------------------------------------------------------===//
196235633Sdim// FMA4 - AMD 4 operand Fused Multiply-Add instructions
197235633Sdim//===----------------------------------------------------------------------===//
198235633Sdim
199235633Sdim
200245431Sdimmulticlass fma4s<bits<8> opc, string OpcodeStr, RegisterClass RC,
201245431Sdim                 X86MemOperand x86memop, ValueType OpVT, SDNode OpNode,
202245431Sdim                 PatFrag mem_frag> {
203245431Sdim  let isCommutable = 1 in
204245431Sdim  def rr : FMA4<opc, MRMSrcReg, (outs RC:$dst),
205245431Sdim           (ins RC:$src1, RC:$src2, RC:$src3),
206235633Sdim           !strconcat(OpcodeStr,
207235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
208245431Sdim           [(set RC:$dst,
209263509Sdim             (OpVT (OpNode RC:$src1, RC:$src2, RC:$src3)))]>, VEX_W, VEX_LIG, MemOp4;
210245431Sdim  def rm : FMA4<opc, MRMSrcMem, (outs RC:$dst),
211245431Sdim           (ins RC:$src1, RC:$src2, x86memop:$src3),
212235633Sdim           !strconcat(OpcodeStr,
213235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
214245431Sdim           [(set RC:$dst, (OpNode RC:$src1, RC:$src2,
215263509Sdim                           (mem_frag addr:$src3)))]>, VEX_W, VEX_LIG, MemOp4;
216245431Sdim  def mr : FMA4<opc, MRMSrcMem, (outs RC:$dst),
217245431Sdim           (ins RC:$src1, x86memop:$src2, RC:$src3),
218235633Sdim           !strconcat(OpcodeStr,
219235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
220245431Sdim           [(set RC:$dst,
221263509Sdim             (OpNode RC:$src1, (mem_frag addr:$src2), RC:$src3))]>, VEX_LIG;
222235633Sdim// For disassembler
223252723Sdimlet isCodeGenOnly = 1, hasSideEffects = 0 in
224245431Sdim  def rr_REV : FMA4<opc, MRMSrcReg, (outs RC:$dst),
225245431Sdim               (ins RC:$src1, RC:$src2, RC:$src3),
226235633Sdim               !strconcat(OpcodeStr,
227263509Sdim               "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"), []>,
228263509Sdim               VEX_LIG;
229235633Sdim}
230235633Sdim
231245431Sdimmulticlass fma4s_int<bits<8> opc, string OpcodeStr, Operand memop,
232245431Sdim                     ComplexPattern mem_cpat, Intrinsic Int> {
233245431Sdim  let isCommutable = 1 in
234245431Sdim  def rr_Int : FMA4<opc, MRMSrcReg, (outs VR128:$dst),
235245431Sdim               (ins VR128:$src1, VR128:$src2, VR128:$src3),
236245431Sdim               !strconcat(OpcodeStr,
237245431Sdim               "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
238245431Sdim               [(set VR128:$dst,
239263509Sdim                 (Int VR128:$src1, VR128:$src2, VR128:$src3))]>, VEX_W, VEX_LIG, MemOp4;
240245431Sdim  def rm_Int : FMA4<opc, MRMSrcMem, (outs VR128:$dst),
241245431Sdim               (ins VR128:$src1, VR128:$src2, memop:$src3),
242245431Sdim               !strconcat(OpcodeStr,
243245431Sdim               "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
244245431Sdim               [(set VR128:$dst, (Int VR128:$src1, VR128:$src2,
245263509Sdim                                  mem_cpat:$src3))]>, VEX_W, VEX_LIG, MemOp4;
246245431Sdim  def mr_Int : FMA4<opc, MRMSrcMem, (outs VR128:$dst),
247245431Sdim               (ins VR128:$src1, memop:$src2, VR128:$src3),
248245431Sdim               !strconcat(OpcodeStr,
249245431Sdim               "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
250245431Sdim               [(set VR128:$dst,
251263509Sdim                 (Int VR128:$src1, mem_cpat:$src2, VR128:$src3))]>, VEX_LIG;
252245431Sdim}
253245431Sdim
254245431Sdimmulticlass fma4p<bits<8> opc, string OpcodeStr, SDNode OpNode,
255245431Sdim                 ValueType OpVT128, ValueType OpVT256,
256235633Sdim                 PatFrag ld_frag128, PatFrag ld_frag256> {
257245431Sdim  let isCommutable = 1 in
258235633Sdim  def rr : FMA4<opc, MRMSrcReg, (outs VR128:$dst),
259235633Sdim           (ins VR128:$src1, VR128:$src2, VR128:$src3),
260235633Sdim           !strconcat(OpcodeStr,
261235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
262235633Sdim           [(set VR128:$dst,
263245431Sdim             (OpVT128 (OpNode VR128:$src1, VR128:$src2, VR128:$src3)))]>,
264245431Sdim           VEX_W, MemOp4;
265235633Sdim  def rm : FMA4<opc, MRMSrcMem, (outs VR128:$dst),
266235633Sdim           (ins VR128:$src1, VR128:$src2, f128mem:$src3),
267235633Sdim           !strconcat(OpcodeStr,
268235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
269245431Sdim           [(set VR128:$dst, (OpNode VR128:$src1, VR128:$src2,
270235633Sdim                              (ld_frag128 addr:$src3)))]>, VEX_W, MemOp4;
271235633Sdim  def mr : FMA4<opc, MRMSrcMem, (outs VR128:$dst),
272235633Sdim           (ins VR128:$src1, f128mem:$src2, VR128:$src3),
273235633Sdim           !strconcat(OpcodeStr,
274235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
275235633Sdim           [(set VR128:$dst,
276245431Sdim             (OpNode VR128:$src1, (ld_frag128 addr:$src2), VR128:$src3))]>;
277245431Sdim  let isCommutable = 1 in
278235633Sdim  def rrY : FMA4<opc, MRMSrcReg, (outs VR256:$dst),
279235633Sdim           (ins VR256:$src1, VR256:$src2, VR256:$src3),
280235633Sdim           !strconcat(OpcodeStr,
281235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
282235633Sdim           [(set VR256:$dst,
283245431Sdim             (OpVT256 (OpNode VR256:$src1, VR256:$src2, VR256:$src3)))]>,
284245431Sdim           VEX_W, MemOp4, VEX_L;
285235633Sdim  def rmY : FMA4<opc, MRMSrcMem, (outs VR256:$dst),
286235633Sdim           (ins VR256:$src1, VR256:$src2, f256mem:$src3),
287235633Sdim           !strconcat(OpcodeStr,
288235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
289245431Sdim           [(set VR256:$dst, (OpNode VR256:$src1, VR256:$src2,
290245431Sdim                              (ld_frag256 addr:$src3)))]>, VEX_W, MemOp4, VEX_L;
291235633Sdim  def mrY : FMA4<opc, MRMSrcMem, (outs VR256:$dst),
292235633Sdim           (ins VR256:$src1, f256mem:$src2, VR256:$src3),
293235633Sdim           !strconcat(OpcodeStr,
294235633Sdim           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
295245431Sdim           [(set VR256:$dst, (OpNode VR256:$src1,
296245431Sdim                              (ld_frag256 addr:$src2), VR256:$src3))]>, VEX_L;
297235633Sdim// For disassembler
298252723Sdimlet isCodeGenOnly = 1, hasSideEffects = 0 in {
299235633Sdim  def rr_REV : FMA4<opc, MRMSrcReg, (outs VR128:$dst),
300235633Sdim               (ins VR128:$src1, VR128:$src2, VR128:$src3),
301235633Sdim               !strconcat(OpcodeStr,
302235633Sdim               "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"), []>;
303235633Sdim  def rrY_REV : FMA4<opc, MRMSrcReg, (outs VR256:$dst),
304235633Sdim                (ins VR256:$src1, VR256:$src2, VR256:$src3),
305235633Sdim                !strconcat(OpcodeStr,
306245431Sdim                "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"), []>,
307245431Sdim                VEX_L;
308235633Sdim} // isCodeGenOnly = 1
309235633Sdim}
310235633Sdim
311245431Sdimdefm VFMADDSS4  : fma4s<0x6A, "vfmaddss", FR32, f32mem, f32, X86Fmadd, loadf32>,
312245431Sdim                  fma4s_int<0x6A, "vfmaddss", ssmem, sse_load_f32,
313245431Sdim                            int_x86_fma_vfmadd_ss>;
314245431Sdimdefm VFMADDSD4  : fma4s<0x6B, "vfmaddsd", FR64, f64mem, f64, X86Fmadd, loadf64>,
315245431Sdim                  fma4s_int<0x6B, "vfmaddsd", sdmem, sse_load_f64,
316245431Sdim                            int_x86_fma_vfmadd_sd>;
317245431Sdimdefm VFMSUBSS4  : fma4s<0x6E, "vfmsubss", FR32, f32mem, f32, X86Fmsub, loadf32>,
318245431Sdim                  fma4s_int<0x6E, "vfmsubss", ssmem, sse_load_f32,
319245431Sdim                            int_x86_fma_vfmsub_ss>;
320245431Sdimdefm VFMSUBSD4  : fma4s<0x6F, "vfmsubsd", FR64, f64mem, f64, X86Fmsub, loadf64>,
321245431Sdim                  fma4s_int<0x6F, "vfmsubsd", sdmem, sse_load_f64,
322245431Sdim                            int_x86_fma_vfmsub_sd>;
323245431Sdimdefm VFNMADDSS4 : fma4s<0x7A, "vfnmaddss", FR32, f32mem, f32,
324245431Sdim                        X86Fnmadd, loadf32>,
325245431Sdim                  fma4s_int<0x7A, "vfnmaddss", ssmem, sse_load_f32,
326245431Sdim                            int_x86_fma_vfnmadd_ss>;
327245431Sdimdefm VFNMADDSD4 : fma4s<0x7B, "vfnmaddsd", FR64, f64mem, f64,
328245431Sdim                        X86Fnmadd, loadf64>,
329245431Sdim                  fma4s_int<0x7B, "vfnmaddsd", sdmem, sse_load_f64,
330245431Sdim                            int_x86_fma_vfnmadd_sd>;
331245431Sdimdefm VFNMSUBSS4 : fma4s<0x7E, "vfnmsubss", FR32, f32mem, f32,
332245431Sdim                        X86Fnmsub, loadf32>,
333245431Sdim                  fma4s_int<0x7E, "vfnmsubss", ssmem, sse_load_f32,
334245431Sdim                            int_x86_fma_vfnmsub_ss>;
335245431Sdimdefm VFNMSUBSD4 : fma4s<0x7F, "vfnmsubsd", FR64, f64mem, f64,
336245431Sdim                        X86Fnmsub, loadf64>,
337245431Sdim                  fma4s_int<0x7F, "vfnmsubsd", sdmem, sse_load_f64,
338245431Sdim                            int_x86_fma_vfnmsub_sd>;
339245431Sdim
340252723Sdimlet ExeDomain = SSEPackedSingle in {
341252723Sdim  defm VFMADDPS4    : fma4p<0x68, "vfmaddps", X86Fmadd, v4f32, v8f32,
342263509Sdim                            loadv4f32, loadv8f32>;
343252723Sdim  defm VFMSUBPS4    : fma4p<0x6C, "vfmsubps", X86Fmsub, v4f32, v8f32,
344263509Sdim                            loadv4f32, loadv8f32>;
345252723Sdim  defm VFNMADDPS4   : fma4p<0x78, "vfnmaddps", X86Fnmadd, v4f32, v8f32,
346263509Sdim                            loadv4f32, loadv8f32>;
347252723Sdim  defm VFNMSUBPS4   : fma4p<0x7C, "vfnmsubps", X86Fnmsub, v4f32, v8f32,
348263509Sdim                            loadv4f32, loadv8f32>;
349252723Sdim  defm VFMADDSUBPS4 : fma4p<0x5C, "vfmaddsubps", X86Fmaddsub, v4f32, v8f32,
350263509Sdim                            loadv4f32, loadv8f32>;
351252723Sdim  defm VFMSUBADDPS4 : fma4p<0x5E, "vfmsubaddps", X86Fmsubadd, v4f32, v8f32,
352263509Sdim                            loadv4f32, loadv8f32>;
353252723Sdim}
354245431Sdim
355252723Sdimlet ExeDomain = SSEPackedDouble in {
356252723Sdim  defm VFMADDPD4    : fma4p<0x69, "vfmaddpd", X86Fmadd, v2f64, v4f64,
357263509Sdim                            loadv2f64, loadv4f64>;
358252723Sdim  defm VFMSUBPD4    : fma4p<0x6D, "vfmsubpd", X86Fmsub, v2f64, v4f64,
359263509Sdim                            loadv2f64, loadv4f64>;
360252723Sdim  defm VFNMADDPD4   : fma4p<0x79, "vfnmaddpd", X86Fnmadd, v2f64, v4f64,
361263509Sdim                            loadv2f64, loadv4f64>;
362252723Sdim  defm VFNMSUBPD4   : fma4p<0x7D, "vfnmsubpd", X86Fnmsub, v2f64, v4f64,
363263509Sdim                            loadv2f64, loadv4f64>;
364252723Sdim  defm VFMADDSUBPD4 : fma4p<0x5D, "vfmaddsubpd", X86Fmaddsub, v2f64, v4f64,
365263509Sdim                            loadv2f64, loadv4f64>;
366252723Sdim  defm VFMSUBADDPD4 : fma4p<0x5F, "vfmsubaddpd", X86Fmsubadd, v2f64, v4f64,
367263509Sdim                            loadv2f64, loadv4f64>;
368252723Sdim}
369252723Sdim
370