xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYInstrFormatsF1.td (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
1*04eeddc0SDimitry Andric//===- CSKYInstrFormatsF1.td - CSKY Float1.0 Instr Format --*- tablegen -*-===//
2*04eeddc0SDimitry Andric//
3*04eeddc0SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*04eeddc0SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*04eeddc0SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*04eeddc0SDimitry Andric//
7*04eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
8*04eeddc0SDimitry Andric//
9*04eeddc0SDimitry Andric// CSKY Instruction Format Float1.0 Definitions.
10*04eeddc0SDimitry Andric//
11*04eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
12*04eeddc0SDimitry Andric
13*04eeddc0SDimitry Andricclass CSKYFP1Inst<dag outs, dag ins, string asmstr, list<dag> pattern>
14*04eeddc0SDimitry Andric  : CSKY32Inst<AddrModeNone, 0x3d, outs, ins, asmstr, pattern>, Requires<[HasFPUv2_SF]> {
15*04eeddc0SDimitry Andric}
16*04eeddc0SDimitry Andric
17*04eeddc0SDimitry Andricclass F_XYZ_BASE<bits<5> datatype, bits<6> sop, dag outs, dag ins, string opcodestr, list<dag> pattern>
18*04eeddc0SDimitry Andric  : CSKYFP1Inst<outs, ins, opcodestr, pattern> {
19*04eeddc0SDimitry Andric  bits<4> vrx;
20*04eeddc0SDimitry Andric  bits<4> vry;
21*04eeddc0SDimitry Andric  bits<4> vrz;
22*04eeddc0SDimitry Andric  let Inst{25 - 21} = {0, vry};
23*04eeddc0SDimitry Andric  let Inst{20 - 16} = {0, vrx};
24*04eeddc0SDimitry Andric  let Inst{15 - 11} = datatype;
25*04eeddc0SDimitry Andric  let Inst{10 - 5} = sop;
26*04eeddc0SDimitry Andric  let Inst{4 - 0} = {0, vrz};
27*04eeddc0SDimitry Andric}
28*04eeddc0SDimitry Andric
29*04eeddc0SDimitry Andricclass F_XZ_GF<bits<5> datatype, bits<6> sop, dag outs, dag ins, string opcodestr, list<dag> pattern>
30*04eeddc0SDimitry Andric  : CSKYFP1Inst<outs, ins, opcodestr, pattern> {
31*04eeddc0SDimitry Andric  bits<4> vrx;
32*04eeddc0SDimitry Andric  bits<5> rz;
33*04eeddc0SDimitry Andric  let Inst{25 - 21} = 0;
34*04eeddc0SDimitry Andric  let Inst{20 - 16} = {0, vrx};
35*04eeddc0SDimitry Andric  let Inst{15 - 11} = datatype;
36*04eeddc0SDimitry Andric  let Inst{10 - 5} = sop;
37*04eeddc0SDimitry Andric  let Inst{4 - 0} = {rz};
38*04eeddc0SDimitry Andric}
39*04eeddc0SDimitry Andric
40*04eeddc0SDimitry Andricclass F_XZ_FG<bits<5> datatype, bits<6> sop, dag outs, dag ins, string opcodestr, list<dag> pattern>
41*04eeddc0SDimitry Andric  : CSKYFP1Inst<outs, ins, opcodestr, pattern> {
42*04eeddc0SDimitry Andric  bits<5> rx;
43*04eeddc0SDimitry Andric  bits<4> vrz;
44*04eeddc0SDimitry Andric  let Inst{25 - 21} = 0;
45*04eeddc0SDimitry Andric  let Inst{20 - 16} = {rx};
46*04eeddc0SDimitry Andric  let Inst{15 - 11} = datatype;
47*04eeddc0SDimitry Andric  let Inst{10 - 5} = sop;
48*04eeddc0SDimitry Andric  let Inst{4 - 0} = {0, vrz};
49*04eeddc0SDimitry Andric}
50*04eeddc0SDimitry Andric
51*04eeddc0SDimitry Andricclass F_XZ_TRANS_FROM<bits<6> sop, string op, RegisterOperand regtype1, RegisterOperand regtype2>
52*04eeddc0SDimitry Andric  : F_XZ_GF<3, sop, (outs regtype1:$rz), (ins regtype2:$vrx), !strconcat(op, "\t$rz, $vrx"),
53*04eeddc0SDimitry Andric  []>;
54*04eeddc0SDimitry Andric
55*04eeddc0SDimitry Andricclass F_XZ_TRANS_TO<bits<6> sop, string op, RegisterOperand regtype1, RegisterOperand regtype2>
56*04eeddc0SDimitry Andric  : F_XZ_FG<3, sop, (outs regtype1:$vrz), (ins regtype2:$rx), !strconcat(op, "\t$vrz, $rx"),
57*04eeddc0SDimitry Andric  []>;
58*04eeddc0SDimitry Andric
59*04eeddc0SDimitry Andriclet vry = 0 in {
60*04eeddc0SDimitry Andricclass F_XZ<bits<5> datatype, bits<6> sop, string op, string op_su, PatFrag opnode, RegisterOperand regtype>
61*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs regtype:$vrz), (ins regtype:$vrx), !strconcat(op#op_su, "\t$vrz, $vrx"),
62*04eeddc0SDimitry Andric  [(set regtype:$vrz, (opnode regtype:$vrx))]>;
63*04eeddc0SDimitry Andric
64*04eeddc0SDimitry Andricclass F_MOV<bits<5> datatype, bits<6> sop, string op, string op_su, RegisterOperand regtype>
65*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs regtype:$vrz), (ins regtype:$vrx), !strconcat(op#op_su, "\t$vrz, $vrx"),
66*04eeddc0SDimitry Andric  []>;
67*04eeddc0SDimitry Andric
68*04eeddc0SDimitry Andricclass F_XZ_TRANS<bits<6> sop, string op, RegisterOperand regtype1, RegisterOperand regtype2>
69*04eeddc0SDimitry Andric  : F_XYZ_BASE<3, sop, (outs regtype1:$vrz), (ins regtype2:$vrx), !strconcat(op, "\t$vrz, $vrx"),
70*04eeddc0SDimitry Andric  []>;
71*04eeddc0SDimitry Andric
72*04eeddc0SDimitry Andricclass F_XZ_TRANS_DS<bits<6> sop, string op, PatFrag opnode>
73*04eeddc0SDimitry Andric  : F_XYZ_BASE<3, sop, (outs sFPR32Op:$vrz), (ins sFPR64Op:$vrx), !strconcat(op, "\t$vrz, $vrx"),
74*04eeddc0SDimitry Andric  [(set sFPR32Op:$vrz, (opnode sFPR64Op:$vrx))]>;
75*04eeddc0SDimitry Andric
76*04eeddc0SDimitry Andricclass F_XZ_TRANS_SD<bits<6> sop, string op, PatFrag opnode>
77*04eeddc0SDimitry Andric  : F_XYZ_BASE<3, sop, (outs sFPR64Op:$vrz), (ins sFPR32Op:$vrx), !strconcat(op, "\t$vrz, $vrx"),
78*04eeddc0SDimitry Andric  [(set sFPR64Op:$vrz, (opnode sFPR32Op:$vrx))]>;
79*04eeddc0SDimitry Andric}
80*04eeddc0SDimitry Andric
81*04eeddc0SDimitry Andricmulticlass FT_MOV<bits<6> sop, string op> {
82*04eeddc0SDimitry Andric  def _S :  F_MOV<0, sop, op, "s", sFPR32Op>;
83*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
84*04eeddc0SDimitry Andric  def _D :  F_MOV<1, sop, op, "d", sFPR64Op>;
85*04eeddc0SDimitry Andric}
86*04eeddc0SDimitry Andric
87*04eeddc0SDimitry Andricmulticlass FT_XZ<bits<6> sop, string op, PatFrag opnode> {
88*04eeddc0SDimitry Andric  def _S :  F_XZ<0, sop, op, "s", opnode, sFPR32Op>;
89*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
90*04eeddc0SDimitry Andric  def _D :  F_XZ<1, sop, op, "d", opnode, sFPR64Op>;
91*04eeddc0SDimitry Andric}
92*04eeddc0SDimitry Andric
93*04eeddc0SDimitry Andriclet vrz = 0, isCompare = 1 in {
94*04eeddc0SDimitry Andricclass F_CMPXY<bits<5> datatype, bits<6> sop, string op, string op_su, RegisterOperand regtype>
95*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs CARRY:$ca), (ins regtype:$vrx, regtype:$vry), !strconcat(op#op_su, "\t$vrx, $vry"),
96*04eeddc0SDimitry Andric  []>;
97*04eeddc0SDimitry Andric
98*04eeddc0SDimitry Andriclet vry = 0 in{
99*04eeddc0SDimitry Andricclass F_CMPZX<bits<5> datatype, bits<6> sop, string op, string op_su, RegisterOperand regtype>
100*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs CARRY:$ca), (ins regtype:$vrx), !strconcat(op#op_su, "\t$vrx"),
101*04eeddc0SDimitry Andric  []>;
102*04eeddc0SDimitry Andric}
103*04eeddc0SDimitry Andric}
104*04eeddc0SDimitry Andric
105*04eeddc0SDimitry Andricclass F_XYZ<bits<5> datatype, bits<6> sop, string op, string op_su, PatFrag opnode, RegisterOperand regtype>
106*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs regtype:$vrz), (ins regtype:$vrx, regtype:$vry),
107*04eeddc0SDimitry Andric    !strconcat(op#op_su, "\t$vrz, $vrx, $vry"),
108*04eeddc0SDimitry Andric  [(set regtype:$vrz, (opnode regtype:$vrx, regtype:$vry))]>;
109*04eeddc0SDimitry Andric
110*04eeddc0SDimitry Andricmulticlass FT_XYZ<bits<6> sop, string op, PatFrag opnode> {
111*04eeddc0SDimitry Andric  def _S :  F_XYZ<0, sop, op, "s", opnode, sFPR32Op>;
112*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
113*04eeddc0SDimitry Andric  def _D :  F_XYZ<1, sop, op, "d", opnode, sFPR64Op>;
114*04eeddc0SDimitry Andric}
115*04eeddc0SDimitry Andric
116*04eeddc0SDimitry Andriclet Constraints = "$vrt = $vrz" in {
117*04eeddc0SDimitry Andricclass F_ACCUM_XYZ<bits<5> datatype, bits<6> sop, string op, string op_su, PatFrag opnode, RegisterOperand regtype>
118*04eeddc0SDimitry Andric  : F_XYZ_BASE<datatype, sop, (outs regtype:$vrz), (ins regtype:$vrt, regtype:$vrx, regtype:$vry),
119*04eeddc0SDimitry Andric    !strconcat(op#op_su, "\t$vrz, $vrx, $vry"),
120*04eeddc0SDimitry Andric  [(set regtype:$vrz, (opnode regtype:$vrt, regtype:$vrx, regtype:$vry))]>;
121*04eeddc0SDimitry Andric}
122*04eeddc0SDimitry Andric
123*04eeddc0SDimitry Andricmulticlass FT_ACCUM_XYZ<bits<6> sop, string op, PatFrag opnode> {
124*04eeddc0SDimitry Andric  def _S :  F_ACCUM_XYZ<0, sop, op, "s", opnode, sFPR32Op>;
125*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
126*04eeddc0SDimitry Andric  def _D :  F_ACCUM_XYZ<1, sop, op, "d", opnode, sFPR64Op>;
127*04eeddc0SDimitry Andric}
128*04eeddc0SDimitry Andric
129*04eeddc0SDimitry Andricmulticlass FT_CMPXY<bits<6> sop, string op> {
130*04eeddc0SDimitry Andric  def _S :  F_CMPXY<0, sop, op, "s", sFPR32Op>;
131*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
132*04eeddc0SDimitry Andric  def _D :  F_CMPXY<1, sop, op, "d", sFPR64Op>;
133*04eeddc0SDimitry Andric}
134*04eeddc0SDimitry Andric
135*04eeddc0SDimitry Andric
136*04eeddc0SDimitry Andricmulticlass FT_CMPZX<bits<6> sop, string op> {
137*04eeddc0SDimitry Andric  def _S :  F_CMPZX<0, sop, op, "s", sFPR32Op>;
138*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
139*04eeddc0SDimitry Andric  def _D :  F_CMPZX<1, sop, op, "d", sFPR64Op>;
140*04eeddc0SDimitry Andric}
141*04eeddc0SDimitry Andric
142*04eeddc0SDimitry Andricclass F_I8_XY_MEM<bits<7> sop, bits<1> sop_su, dag outs, dag ins, string opcodestr, list<dag> pattern>
143*04eeddc0SDimitry Andric  : CSKY32Inst<AddrMode32SDF, 0x3d, outs, ins, opcodestr, pattern> {
144*04eeddc0SDimitry Andric  bits<5> rx;
145*04eeddc0SDimitry Andric  bits<4> vrz;
146*04eeddc0SDimitry Andric  bits<8> imm8;
147*04eeddc0SDimitry Andric  let Inst{25} = 0;
148*04eeddc0SDimitry Andric  let Inst{24 - 21} = imm8{7 - 4};  //imm4h
149*04eeddc0SDimitry Andric  let Inst{20 - 16} = rx;  //rx
150*04eeddc0SDimitry Andric  let Inst{15 - 9} = sop;
151*04eeddc0SDimitry Andric  let Inst{8} = sop_su;
152*04eeddc0SDimitry Andric  let Inst{7 - 4} = imm8{3 - 0}; // imm4l
153*04eeddc0SDimitry Andric  let Inst{3 - 0} = vrz;
154*04eeddc0SDimitry Andric}
155*04eeddc0SDimitry Andric
156*04eeddc0SDimitry Andricclass F_I4_XY_MEM<bits<7> sop, bits<1> sop_su, dag outs, dag ins, string opcodestr, list<dag> pattern>
157*04eeddc0SDimitry Andric  : CSKY32Inst<AddrMode32SDF, 0x3d, outs, ins, opcodestr, pattern> {
158*04eeddc0SDimitry Andric  bits<10> regs;
159*04eeddc0SDimitry Andric  bits<5> rx;
160*04eeddc0SDimitry Andric
161*04eeddc0SDimitry Andric  let Inst{25} = 0;
162*04eeddc0SDimitry Andric  let Inst{24 - 21} = regs{3-0};  //imm4
163*04eeddc0SDimitry Andric  let Inst{20 - 16} = rx;  //rx
164*04eeddc0SDimitry Andric  let Inst{15 - 9} = sop;
165*04eeddc0SDimitry Andric  let Inst{8} = sop_su;
166*04eeddc0SDimitry Andric  let Inst{7 - 4} = 0;
167*04eeddc0SDimitry Andric  let Inst{3 - 0} = regs{8-5};
168*04eeddc0SDimitry Andric}
169*04eeddc0SDimitry Andric
170*04eeddc0SDimitry Andricclass F_I8_Z_MEM<bits<7> sop, bits<1> sop_su, dag outs, dag ins, string opcodestr, list<dag> pattern>
171*04eeddc0SDimitry Andric  : CSKY32Inst<AddrModeNone, 0x3d, outs, ins, opcodestr, pattern> {
172*04eeddc0SDimitry Andric  bits<4> vrz;
173*04eeddc0SDimitry Andric  bits<8> imm8;
174*04eeddc0SDimitry Andric  let Inst{25} = 0;
175*04eeddc0SDimitry Andric  let Inst{24 - 21} = imm8{7 - 4};  //imm4h
176*04eeddc0SDimitry Andric  let Inst{20 - 16} = 0;  //rx
177*04eeddc0SDimitry Andric  let Inst{15 - 9} = sop;
178*04eeddc0SDimitry Andric  let Inst{8} = sop_su;
179*04eeddc0SDimitry Andric  let Inst{7 - 4} = imm8{3 - 0}; // imm4l
180*04eeddc0SDimitry Andric  let Inst{3 - 0} = vrz;
181*04eeddc0SDimitry Andric}
182*04eeddc0SDimitry Andric
183*04eeddc0SDimitry Andricclass F_XYZ_MEM<bits<7> sop, bits<1> sop_su, dag outs, dag ins, string opcodestr, list<dag> pattern>
184*04eeddc0SDimitry Andric  : CSKY32Inst<AddrModeNone, 0x3d, outs, ins, opcodestr, pattern> {
185*04eeddc0SDimitry Andric  bits<5> rx;
186*04eeddc0SDimitry Andric  bits<5> ry;
187*04eeddc0SDimitry Andric  bits<4> vrz;
188*04eeddc0SDimitry Andric  bits<2> imm;
189*04eeddc0SDimitry Andric
190*04eeddc0SDimitry Andric  let Inst{25 - 21} = ry;  // ry;
191*04eeddc0SDimitry Andric  let Inst{20 - 16} = rx;  // rx;
192*04eeddc0SDimitry Andric  let Inst{15 - 9} = sop;
193*04eeddc0SDimitry Andric  let Inst{8} = sop_su;
194*04eeddc0SDimitry Andric  let Inst{7} = 0;
195*04eeddc0SDimitry Andric  let Inst{6,5} = imm;  // shift;
196*04eeddc0SDimitry Andric  let Inst{4} = 0;
197*04eeddc0SDimitry Andric  let Inst{3 - 0} = vrz;
198*04eeddc0SDimitry Andric}
199*04eeddc0SDimitry Andric
200*04eeddc0SDimitry Andricclass F_XYAI_LD<bits<7> sop, bits<1> sop_su, string op, string op_su,
201*04eeddc0SDimitry Andric                 RegisterOperand regtype, Operand operand>
202*04eeddc0SDimitry Andric  : F_I8_XY_MEM<sop, sop_su, (outs regtype:$vrz), (ins GPR:$rx, operand:$imm8),
203*04eeddc0SDimitry Andric    !strconcat(op#op_su, "\t$vrz, ($rx, ${imm8})"), []>;
204*04eeddc0SDimitry Andric
205*04eeddc0SDimitry Andricclass F_XYAR_LD<bits<7> sop, bits<1> sop_su, string op, string op_su,
206*04eeddc0SDimitry Andric                 RegisterOperand regtype>
207*04eeddc0SDimitry Andric  : F_XYZ_MEM<sop, sop_su, (outs regtype:$vrz), (ins GPR:$rx, GPR:$ry, uimm2:$imm),
208*04eeddc0SDimitry Andric    op#op_su#"\t$vrz, ($rx, $ry << ${imm})", []>;
209*04eeddc0SDimitry Andric
210*04eeddc0SDimitry Andricclass F_XYAI_ST<bits<7> sop, bits<1> sop_su, string op, string op_su,
211*04eeddc0SDimitry Andric                 RegisterOperand regtype, Operand operand>
212*04eeddc0SDimitry Andric  : F_I8_XY_MEM<sop, sop_su, (outs), (ins regtype:$vrz, GPR:$rx, operand:$imm8),
213*04eeddc0SDimitry Andric    !strconcat(op#op_su, "\t$vrz, ($rx, ${imm8})"), []>;
214*04eeddc0SDimitry Andric
215*04eeddc0SDimitry Andricclass F_XYAR_ST<bits<7> sop, bits<1> sop_su, string op, string op_su,
216*04eeddc0SDimitry Andric                 RegisterOperand regtype>
217*04eeddc0SDimitry Andric  : F_XYZ_MEM<sop, sop_su, (outs), (ins regtype:$vrz, GPR:$rx, GPR:$ry, uimm2:$imm),
218*04eeddc0SDimitry Andric    op#op_su#"\t$vrz, ($rx, $ry << ${imm})", []>;
219*04eeddc0SDimitry Andric
220*04eeddc0SDimitry Andricdef Mem8SL2 : Operand<iPTR>, ComplexPattern<iPTR, 2, "SelectAddrRegImm8", []> {
221*04eeddc0SDimitry Andric  let MIOperandInfo = (ops GPR, i32imm);
222*04eeddc0SDimitry Andric  let PrintMethod = "printAddrModeRegImmOperand";
223*04eeddc0SDimitry Andric  let EncoderMethod = "getAddrModeFloatImm8_sl2OpValue";
224*04eeddc0SDimitry Andric}
225*04eeddc0SDimitry Andric
226*04eeddc0SDimitry Andricdef FRRS : Operand<iPTR>, ComplexPattern<iPTR, 3, "SelectAddrRegReg", []> {
227*04eeddc0SDimitry Andric  let MIOperandInfo = (ops GPR, GPR, i32imm);
228*04eeddc0SDimitry Andric  let PrintMethod = "printAddrModeRegRegSLOperand";
229*04eeddc0SDimitry Andric  let EncoderMethod = "getAddrModeFloatRegRegSLOpValue";
230*04eeddc0SDimitry Andric}
231*04eeddc0SDimitry Andric
232*04eeddc0SDimitry Andricmulticlass FT_XYAI_LD<bits<7> sop, string op> {
233*04eeddc0SDimitry Andric  def _S :  F_XYAI_LD<sop, 0, op, "s", sFPR32Op, uimm8_2>;
234*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
235*04eeddc0SDimitry Andric  def _D :  F_XYAI_LD<sop, 1, op, "d", sFPR64Op, uimm8_2>;
236*04eeddc0SDimitry Andric}
237*04eeddc0SDimitry Andric
238*04eeddc0SDimitry Andricmulticlass FT_XYAR_LD<bits<7> sop, string op> {
239*04eeddc0SDimitry Andric  def _S :  F_XYAR_LD<sop, 0, op, "s", sFPR32Op>;
240*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
241*04eeddc0SDimitry Andric  def _D :  F_XYAR_LD<sop, 1, op, "d", sFPR64Op>;
242*04eeddc0SDimitry Andric}
243*04eeddc0SDimitry Andric
244*04eeddc0SDimitry Andricmulticlass FT_XYAI_ST<bits<7> sop, string op> {
245*04eeddc0SDimitry Andric  def _S :  F_XYAI_ST<sop, 0, op, "s", sFPR32Op, uimm8_2>;
246*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
247*04eeddc0SDimitry Andric  def _D :  F_XYAI_ST<sop, 1, op, "d", sFPR64Op, uimm8_2>;
248*04eeddc0SDimitry Andric}
249*04eeddc0SDimitry Andric
250*04eeddc0SDimitry Andricmulticlass FT_XYAR_ST<bits<7> sop, string op> {
251*04eeddc0SDimitry Andric  def _S :  F_XYAR_ST<sop, 0, op, "s", sFPR32Op>;
252*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
253*04eeddc0SDimitry Andric  def _D :  F_XYAR_ST<sop, 1, op, "d", sFPR64Op>;
254*04eeddc0SDimitry Andric}
255*04eeddc0SDimitry Andric
256*04eeddc0SDimitry Andricmulticlass FT_XYAR_STM<bits<7> sop, string op> {
257*04eeddc0SDimitry Andric  def _S :  F_I4_XY_MEM<sop, 0, (outs),
258*04eeddc0SDimitry Andric    (ins GPR:$rx, regseq_f1:$regs, variable_ops),
259*04eeddc0SDimitry Andric      !strconcat(op#"s", "\t$regs, (${rx})"), []>;
260*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
261*04eeddc0SDimitry Andric  def _D :  F_I4_XY_MEM<sop, 1, (outs),
262*04eeddc0SDimitry Andric    (ins GPR:$rx, regseq_d1:$regs, variable_ops),
263*04eeddc0SDimitry Andric      !strconcat(op#"d", "\t$regs, (${rx})"), []>;
264*04eeddc0SDimitry Andric}
265*04eeddc0SDimitry Andric
266*04eeddc0SDimitry Andricmulticlass FT_XYAR_LDM<bits<7> sop, string op> {
267*04eeddc0SDimitry Andric  def _S :  F_I4_XY_MEM<sop, 0, (outs),
268*04eeddc0SDimitry Andric    (ins GPR:$rx, regseq_f1:$regs, variable_ops),
269*04eeddc0SDimitry Andric      !strconcat(op#"s", "\t$regs, (${rx})"), []>;
270*04eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
271*04eeddc0SDimitry Andric  def _D :  F_I4_XY_MEM<sop, 1, (outs),
272*04eeddc0SDimitry Andric    (ins GPR:$rx, regseq_d1:$regs, variable_ops),
273*04eeddc0SDimitry Andric      !strconcat(op#"d", "\t$regs, (${rx})"), []>;
274*04eeddc0SDimitry Andric}
275