blob: c5268d93f9e1ece050fa7d085f05baf525bec6cd [file] [log] [blame]
Bill Wendling2695d8e2010-10-15 21:50:45 +00001//===- ARMInstrVFP.td - VFP support for ARM ----------------*- tablegen -*-===//
Evan Chenga8e29892007-01-19 07:51:42 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Evan Chenga8e29892007-01-19 07:51:42 +00007//
8//===----------------------------------------------------------------------===//
9//
Jim Grosbache5d20f92008-09-11 21:41:29 +000010// This file describes the ARM VFP instruction set.
Evan Chenga8e29892007-01-19 07:51:42 +000011//
12//===----------------------------------------------------------------------===//
13
Bill Wendling2695d8e2010-10-15 21:50:45 +000014def SDT_FTOI : SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>;
15def SDT_ITOF : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>;
16def SDT_CMPFP0 : SDTypeProfile<0, 1, [SDTCisFP<0>]>;
17def SDT_VMOVDRR : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>,
18 SDTCisSameAs<1, 2>]>;
Evan Chenga8e29892007-01-19 07:51:42 +000019
Bill Wendling2695d8e2010-10-15 21:50:45 +000020def arm_ftoui : SDNode<"ARMISD::FTOUI", SDT_FTOI>;
21def arm_ftosi : SDNode<"ARMISD::FTOSI", SDT_FTOI>;
22def arm_sitof : SDNode<"ARMISD::SITOF", SDT_ITOF>;
23def arm_uitof : SDNode<"ARMISD::UITOF", SDT_ITOF>;
24def arm_fmstat : SDNode<"ARMISD::FMSTAT", SDTNone, [SDNPInFlag, SDNPOutFlag]>;
25def arm_cmpfp : SDNode<"ARMISD::CMPFP", SDT_ARMCmp, [SDNPOutFlag]>;
26def arm_cmpfp0 : SDNode<"ARMISD::CMPFPw0", SDT_CMPFP0, [SDNPOutFlag]>;
27def arm_fmdrr : SDNode<"ARMISD::VMOVDRR", SDT_VMOVDRR>;
Evan Chenga8e29892007-01-19 07:51:42 +000028
Bill Wendling88cf0382010-10-14 01:02:08 +000029
Evan Chenga8e29892007-01-19 07:51:42 +000030//===----------------------------------------------------------------------===//
Evan Cheng39382422009-10-28 01:44:26 +000031// Operand Definitions.
32//
33
Evan Cheng39382422009-10-28 01:44:26 +000034def vfp_f32imm : Operand<f32>,
35 PatLeaf<(f32 fpimm), [{
36 return ARM::getVFPf32Imm(N->getValueAPF()) != -1;
37 }]> {
38 let PrintMethod = "printVFPf32ImmOperand";
39}
40
41def vfp_f64imm : Operand<f64>,
42 PatLeaf<(f64 fpimm), [{
43 return ARM::getVFPf64Imm(N->getValueAPF()) != -1;
44 }]> {
45 let PrintMethod = "printVFPf64ImmOperand";
46}
47
48
49//===----------------------------------------------------------------------===//
Evan Chenga8e29892007-01-19 07:51:42 +000050// Load / store Instructions.
51//
52
Dan Gohmanbc9d98b2010-02-27 23:47:46 +000053let canFoldAsLoad = 1, isReMaterializable = 1 in {
Jim Grosbache5165492009-11-09 00:11:35 +000054def VLDRD : ADI5<0b1101, 0b01, (outs DPR:$dst), (ins addrmode5:$addr),
55 IIC_fpLoad64, "vldr", ".64\t$dst, $addr",
Chris Lattnerd10a53d2010-03-08 18:51:21 +000056 [(set DPR:$dst, (f64 (load addrmode5:$addr)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +000057
Jim Grosbache5165492009-11-09 00:11:35 +000058def VLDRS : ASI5<0b1101, 0b01, (outs SPR:$dst), (ins addrmode5:$addr),
59 IIC_fpLoad32, "vldr", ".32\t$dst, $addr",
Evan Chenga8e29892007-01-19 07:51:42 +000060 [(set SPR:$dst, (load addrmode5:$addr))]>;
Dan Gohman15511cf2008-12-03 18:15:48 +000061} // canFoldAsLoad
Evan Chenga8e29892007-01-19 07:51:42 +000062
Jim Grosbache5165492009-11-09 00:11:35 +000063def VSTRD : ADI5<0b1101, 0b00, (outs), (ins DPR:$src, addrmode5:$addr),
64 IIC_fpStore64, "vstr", ".64\t$src, $addr",
Chris Lattnerd10a53d2010-03-08 18:51:21 +000065 [(store (f64 DPR:$src), addrmode5:$addr)]>;
Evan Chenga8e29892007-01-19 07:51:42 +000066
Jim Grosbache5165492009-11-09 00:11:35 +000067def VSTRS : ASI5<0b1101, 0b00, (outs), (ins SPR:$src, addrmode5:$addr),
68 IIC_fpStore32, "vstr", ".32\t$src, $addr",
Evan Chenga8e29892007-01-19 07:51:42 +000069 [(store SPR:$src, addrmode5:$addr)]>;
Evan Chenga8e29892007-01-19 07:51:42 +000070
71//===----------------------------------------------------------------------===//
72// Load / store multiple Instructions.
73//
74
Evan Cheng5fd1c9b2010-05-19 06:07:03 +000075let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
Jim Grosbach72db1822010-09-08 00:25:50 +000076def VLDMD : AXDI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$dsts,
Evan Cheng5a50cee2010-10-07 01:50:48 +000077 variable_ops), IndexModeNone, IIC_fpLoad_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +000078 "vldm${addr:submode}${p}\t$addr, $dsts", "", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +000079 let Inst{20} = 1;
80}
Evan Chenga8e29892007-01-19 07:51:42 +000081
Jim Grosbach72db1822010-09-08 00:25:50 +000082def VLDMS : AXSI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$dsts,
Evan Cheng5a50cee2010-10-07 01:50:48 +000083 variable_ops), IndexModeNone, IIC_fpLoad_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +000084 "vldm${addr:submode}${p}\t$addr, $dsts", "", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +000085 let Inst{20} = 1;
86}
87
Jim Grosbach72db1822010-09-08 00:25:50 +000088def VLDMD_UPD : AXDI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +000089 reglist:$dsts, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +000090 IndexModeUpd, IIC_fpLoad_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +000091 "vldm${addr:submode}${p}\t$addr!, $dsts",
92 "$addr.addr = $wb", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +000093 let Inst{20} = 1;
94}
95
Jim Grosbach72db1822010-09-08 00:25:50 +000096def VLDMS_UPD : AXSI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +000097 reglist:$dsts, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +000098 IndexModeUpd, IIC_fpLoad_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +000099 "vldm${addr:submode}${p}\t$addr!, $dsts",
100 "$addr.addr = $wb", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000101 let Inst{20} = 1;
102}
Evan Cheng5fd1c9b2010-05-19 06:07:03 +0000103} // mayLoad, neverHasSideEffects, hasExtraDefRegAllocReq
Evan Chenga8e29892007-01-19 07:51:42 +0000104
Evan Cheng5fd1c9b2010-05-19 06:07:03 +0000105let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
Jim Grosbach72db1822010-09-08 00:25:50 +0000106def VSTMD : AXDI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$srcs,
Evan Cheng5a50cee2010-10-07 01:50:48 +0000107 variable_ops), IndexModeNone, IIC_fpStore_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000108 "vstm${addr:submode}${p}\t$addr, $srcs", "", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000109 let Inst{20} = 0;
110}
Evan Chenga8e29892007-01-19 07:51:42 +0000111
Jim Grosbach72db1822010-09-08 00:25:50 +0000112def VSTMS : AXSI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$srcs,
Evan Cheng5a50cee2010-10-07 01:50:48 +0000113 variable_ops), IndexModeNone, IIC_fpStore_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000114 "vstm${addr:submode}${p}\t$addr, $srcs", "", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +0000115 let Inst{20} = 0;
116}
117
Jim Grosbach72db1822010-09-08 00:25:50 +0000118def VSTMD_UPD : AXDI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +0000119 reglist:$srcs, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +0000120 IndexModeUpd, IIC_fpStore_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000121 "vstm${addr:submode}${p}\t$addr!, $srcs",
122 "$addr.addr = $wb", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +0000123 let Inst{20} = 0;
124}
125
Jim Grosbach72db1822010-09-08 00:25:50 +0000126def VSTMS_UPD : AXSI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +0000127 reglist:$srcs, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +0000128 IndexModeUpd, IIC_fpStore_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000129 "vstm${addr:submode}${p}\t$addr!, $srcs",
130 "$addr.addr = $wb", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000131 let Inst{20} = 0;
132}
Evan Cheng5fd1c9b2010-05-19 06:07:03 +0000133} // mayStore, neverHasSideEffects, hasExtraSrcRegAllocReq
Evan Chenga8e29892007-01-19 07:51:42 +0000134
135// FLDMX, FSTMX - mixing S/D registers for pre-armv6 cores
136
Bill Wendling52061f82010-10-12 23:06:54 +0000137
138// FIXME: Can these be placed into the base class?
139class ADbI_Encode<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops,
140 dag iops, InstrItinClass itin, string opc, string asm,
141 list<dag> pattern>
142 : ADbI<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
143 // Instruction operands.
144 bits<5> Dd;
145 bits<5> Dn;
146 bits<5> Dm;
147
148 // Encode instruction operands.
149 let Inst{3-0} = Dm{3-0};
150 let Inst{5} = Dm{4};
151 let Inst{19-16} = Dn{3-0};
152 let Inst{7} = Dn{4};
153 let Inst{15-12} = Dd{3-0};
154 let Inst{22} = Dd{4};
155}
156
Bill Wendlingcd776862010-10-13 00:04:29 +0000157class ADuI_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
158 bits<2> opcod4, bit opcod5, dag oops, dag iops,
159 InstrItinClass itin, string opc, string asm,
160 list<dag> pattern>
161 : ADuI<opcod1, opcod2, opcod3, opcod4, opcod5, oops, iops, itin, opc,
162 asm, pattern> {
163 // Instruction operands.
164 bits<5> Dd;
165 bits<5> Dm;
166
167 // Encode instruction operands.
168 let Inst{3-0} = Dm{3-0};
169 let Inst{5} = Dm{4};
170 let Inst{15-12} = Dd{3-0};
171 let Inst{22} = Dd{4};
172}
173
Bill Wendlingcaa3d462010-10-12 23:22:27 +0000174class ASbI_Encode<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops,
175 dag iops, InstrItinClass itin, string opc, string asm,
176 list<dag> pattern>
177 : ASbI<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
178 // Instruction operands.
179 bits<5> Sd;
180 bits<5> Sn;
181 bits<5> Sm;
182
183 // Encode instruction operands.
184 let Inst{3-0} = Sm{4-1};
185 let Inst{5} = Sm{0};
186 let Inst{19-16} = Sn{4-1};
187 let Inst{7} = Sn{0};
188 let Inst{15-12} = Sd{4-1};
189 let Inst{22} = Sd{0};
190}
191
Bill Wendling52061f82010-10-12 23:06:54 +0000192class ASbIn_Encode<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops,
193 dag iops, InstrItinClass itin, string opc, string asm,
194 list<dag> pattern>
195 : ASbIn<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
196 // Instruction operands.
197 bits<5> Sd;
198 bits<5> Sn;
199 bits<5> Sm;
200
201 // Encode instruction operands.
202 let Inst{3-0} = Sm{4-1};
203 let Inst{5} = Sm{0};
204 let Inst{19-16} = Sn{4-1};
205 let Inst{7} = Sn{0};
206 let Inst{15-12} = Sd{4-1};
207 let Inst{22} = Sd{0};
208}
209
Bill Wendling1fc6d882010-10-13 00:38:07 +0000210class ASuI_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
211 bits<2> opcod4, bit opcod5, dag oops, dag iops,
212 InstrItinClass itin, string opc, string asm,
213 list<dag> pattern>
214 : ASuI<opcod1, opcod2, opcod3, opcod4, opcod5, oops, iops, itin, opc,
215 asm, pattern> {
216 // Instruction operands.
217 bits<5> Sd;
218 bits<5> Sm;
219
220 // Encode instruction operands.
221 let Inst{3-0} = Sm{4-1};
222 let Inst{5} = Sm{0};
223 let Inst{15-12} = Sd{4-1};
224 let Inst{22} = Sd{0};
225}
226
227class ASuIn_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
228 bits<2> opcod4, bit opcod5, dag oops, dag iops,
229 InstrItinClass itin, string opc, string asm,
230 list<dag> pattern>
231 : ASuIn<opcod1, opcod2, opcod3, opcod4, opcod5, oops, iops, itin, opc,
232 asm, pattern> {
233 // Instruction operands.
234 bits<5> Sd;
235 bits<5> Sm;
236
237 // Encode instruction operands.
238 let Inst{3-0} = Sm{4-1};
239 let Inst{5} = Sm{0};
240 let Inst{15-12} = Sd{4-1};
241 let Inst{22} = Sd{0};
242}
243
Evan Chenga8e29892007-01-19 07:51:42 +0000244//===----------------------------------------------------------------------===//
245// FP Binary Operations.
246//
247
Bill Wendling52061f82010-10-12 23:06:54 +0000248def VADDD : ADbI_Encode<0b11100, 0b11, 0, 0,
249 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
250 IIC_fpALU64, "vadd", ".f64\t$Dd, $Dn, $Dm",
251 [(set DPR:$Dd, (fadd DPR:$Dn, (f64 DPR:$Dm)))]>;
Bill Wendling174777b2010-10-12 22:08:41 +0000252
Bill Wendling52061f82010-10-12 23:06:54 +0000253def VADDS : ASbIn_Encode<0b11100, 0b11, 0, 0,
254 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
255 IIC_fpALU32, "vadd", ".f32\t$Sd, $Sn, $Sm",
256 [(set SPR:$Sd, (fadd SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000257
Bill Wendling52061f82010-10-12 23:06:54 +0000258def VSUBD : ADbI_Encode<0b11100, 0b11, 1, 0,
259 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
260 IIC_fpALU64, "vsub", ".f64\t$Dd, $Dn, $Dm",
261 [(set DPR:$Dd, (fsub DPR:$Dn, (f64 DPR:$Dm)))]>;
Jim Grosbach499e8862010-10-12 21:22:40 +0000262
Bill Wendling52061f82010-10-12 23:06:54 +0000263def VSUBS : ASbIn_Encode<0b11100, 0b11, 1, 0,
264 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
265 IIC_fpALU32, "vsub", ".f32\t$Sd, $Sn, $Sm",
266 [(set SPR:$Sd, (fsub SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000267
Bill Wendlingcaa3d462010-10-12 23:22:27 +0000268def VDIVD : ADbI_Encode<0b11101, 0b00, 0, 0,
269 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
270 IIC_fpDIV64, "vdiv", ".f64\t$Dd, $Dn, $Dm",
271 [(set DPR:$Dd, (fdiv DPR:$Dn, (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000272
Bill Wendlingcaa3d462010-10-12 23:22:27 +0000273def VDIVS : ASbI_Encode<0b11101, 0b00, 0, 0,
274 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
275 IIC_fpDIV32, "vdiv", ".f32\t$Sd, $Sn, $Sm",
276 [(set SPR:$Sd, (fdiv SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000277
Bill Wendlingcaa3d462010-10-12 23:22:27 +0000278def VMULD : ADbI_Encode<0b11100, 0b10, 0, 0,
279 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
280 IIC_fpMUL64, "vmul", ".f64\t$Dd, $Dn, $Dm",
281 [(set DPR:$Dd, (fmul DPR:$Dn, (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000282
Bill Wendlingcaa3d462010-10-12 23:22:27 +0000283def VMULS : ASbIn_Encode<0b11100, 0b10, 0, 0,
284 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
285 IIC_fpMUL32, "vmul", ".f32\t$Sd, $Sn, $Sm",
286 [(set SPR:$Sd, (fmul SPR:$Sn, SPR:$Sm))]>;
Jim Grosbache5165492009-11-09 00:11:35 +0000287
Bill Wendling5a1fd8c2010-10-12 23:47:37 +0000288def VNMULD : ADbI_Encode<0b11100, 0b10, 1, 0,
289 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
290 IIC_fpMUL64, "vnmul", ".f64\t$Dd, $Dn, $Dm",
291 [(set DPR:$Dd, (fneg (fmul DPR:$Dn, (f64 DPR:$Dm))))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000292
Bill Wendling5a1fd8c2010-10-12 23:47:37 +0000293def VNMULS : ASbI_Encode<0b11100, 0b10, 1, 0,
294 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
295 IIC_fpMUL32, "vnmul", ".f32\t$Sd, $Sn, $Sm",
296 [(set SPR:$Sd, (fneg (fmul SPR:$Sn, SPR:$Sm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000297
Chris Lattner72939122007-05-03 00:32:00 +0000298// Match reassociated forms only if not sign dependent rounding.
Chris Lattnerd10a53d2010-03-08 18:51:21 +0000299def : Pat<(fmul (fneg DPR:$a), (f64 DPR:$b)),
Jim Grosbache5165492009-11-09 00:11:35 +0000300 (VNMULD DPR:$a, DPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
Chris Lattner72939122007-05-03 00:32:00 +0000301def : Pat<(fmul (fneg SPR:$a), SPR:$b),
Jim Grosbache5165492009-11-09 00:11:35 +0000302 (VNMULS SPR:$a, SPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
Chris Lattner72939122007-05-03 00:32:00 +0000303
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000304// These are encoded as unary instructions.
305let Defs = [FPSCR] in {
Bill Wendlingcd776862010-10-13 00:04:29 +0000306def VCMPED : ADuI_Encode<0b11101, 0b11, 0b0100, 0b11, 0,
Bill Wendling67a704d2010-10-13 20:58:46 +0000307 (outs), (ins DPR:$Dd, DPR:$Dm),
Bill Wendlingcd776862010-10-13 00:04:29 +0000308 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, $Dm",
309 [(arm_cmpfp DPR:$Dd, (f64 DPR:$Dm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000310
Bill Wendlingcd776862010-10-13 00:04:29 +0000311def VCMPES : ASuI_Encode<0b11101, 0b11, 0b0100, 0b11, 0,
Bill Wendling67a704d2010-10-13 20:58:46 +0000312 (outs), (ins SPR:$Sd, SPR:$Sm),
Bill Wendlingcd776862010-10-13 00:04:29 +0000313 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, $Sm",
314 [(arm_cmpfp SPR:$Sd, SPR:$Sm)]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000315
Bill Wendling67a704d2010-10-13 20:58:46 +0000316// FIXME: Verify encoding after integrated assembler is working.
317def VCMPD : ADuI_Encode<0b11101, 0b11, 0b0100, 0b01, 0,
318 (outs), (ins DPR:$Dd, DPR:$Dm),
319 IIC_fpCMP64, "vcmp", ".f64\t$Dd, $Dm",
320 [/* For disassembly only; pattern left blank */]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000321
Bill Wendling67a704d2010-10-13 20:58:46 +0000322def VCMPS : ASuI_Encode<0b11101, 0b11, 0b0100, 0b01, 0,
323 (outs), (ins SPR:$Sd, SPR:$Sm),
324 IIC_fpCMP32, "vcmp", ".f32\t$Sd, $Sm",
325 [/* For disassembly only; pattern left blank */]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000326}
Evan Chenga8e29892007-01-19 07:51:42 +0000327
328//===----------------------------------------------------------------------===//
329// FP Unary Operations.
330//
331
Bill Wendling1fc6d882010-10-13 00:38:07 +0000332def VABSD : ADuI_Encode<0b11101, 0b11, 0b0000, 0b11, 0,
333 (outs DPR:$Dd), (ins DPR:$Dm),
334 IIC_fpUNA64, "vabs", ".f64\t$Dd, $Dm",
335 [(set DPR:$Dd, (fabs (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000336
Bill Wendling1fc6d882010-10-13 00:38:07 +0000337def VABSS : ASuIn_Encode<0b11101, 0b11, 0b0000, 0b11, 0,
338 (outs SPR:$Sd), (ins SPR:$Sm),
339 IIC_fpUNA32, "vabs", ".f32\t$Sd, $Sm",
340 [(set SPR:$Sd, (fabs SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000341
Evan Cheng91449a82009-07-20 02:12:31 +0000342let Defs = [FPSCR] in {
Bill Wendling1fc6d882010-10-13 00:38:07 +0000343def VCMPEZD : ADuI_Encode<0b11101, 0b11, 0b0101, 0b11, 0,
344 (outs), (ins DPR:$Dd),
345 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, #0",
346 [(arm_cmpfp0 (f64 DPR:$Dd))]> {
347 let Inst{3-0} = 0b0000;
348 let Inst{5} = 0;
349}
350
351def VCMPEZS : ASuI_Encode<0b11101, 0b11, 0b0101, 0b11, 0,
352 (outs), (ins SPR:$Sd),
353 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, #0",
354 [(arm_cmpfp0 SPR:$Sd)]> {
355 let Inst{3-0} = 0b0000;
356 let Inst{5} = 0;
357}
Evan Chenga8e29892007-01-19 07:51:42 +0000358
Bill Wendling67a704d2010-10-13 20:58:46 +0000359// FIXME: Verify encoding after integrated assembler is working.
360def VCMPZD : ADuI_Encode<0b11101, 0b11, 0b0101, 0b01, 0,
361 (outs), (ins DPR:$Dd),
362 IIC_fpCMP64, "vcmp", ".f64\t$Dd, #0",
363 [/* For disassembly only; pattern left blank */]> {
364 let Inst{3-0} = 0b0000;
365 let Inst{5} = 0;
366}
Johnny Chen7edd8e32010-02-08 19:41:48 +0000367
Bill Wendling67a704d2010-10-13 20:58:46 +0000368def VCMPZS : ASuI_Encode<0b11101, 0b11, 0b0101, 0b01, 0,
369 (outs), (ins SPR:$Sd),
370 IIC_fpCMP32, "vcmp", ".f32\t$Sd, #0",
371 [/* For disassembly only; pattern left blank */]> {
372 let Inst{3-0} = 0b0000;
373 let Inst{5} = 0;
374}
Evan Cheng91449a82009-07-20 02:12:31 +0000375}
Evan Chenga8e29892007-01-19 07:51:42 +0000376
Bill Wendling54908dd2010-10-13 00:56:35 +0000377def VCVTDS : ASuI<0b11101, 0b11, 0b0111, 0b11, 0,
378 (outs DPR:$Dd), (ins SPR:$Sm),
379 IIC_fpCVTDS, "vcvt", ".f64.f32\t$Dd, $Sm",
380 [(set DPR:$Dd, (fextend SPR:$Sm))]> {
381 // Instruction operands.
382 bits<5> Dd;
383 bits<5> Sm;
384
385 // Encode instruction operands.
386 let Inst{3-0} = Sm{4-1};
387 let Inst{5} = Sm{0};
388 let Inst{15-12} = Dd{3-0};
389 let Inst{22} = Dd{4};
390}
Evan Chenga8e29892007-01-19 07:51:42 +0000391
Evan Cheng96581d32008-11-11 02:11:05 +0000392// Special case encoding: bits 11-8 is 0b1011.
Bill Wendling54908dd2010-10-13 00:56:35 +0000393def VCVTSD : VFPAI<(outs SPR:$Sd), (ins DPR:$Dm), VFPUnaryFrm,
394 IIC_fpCVTSD, "vcvt", ".f32.f64\t$Sd, $Dm",
395 [(set SPR:$Sd, (fround DPR:$Dm))]> {
396 // Instruction operands.
397 bits<5> Sd;
398 bits<5> Dm;
399
400 // Encode instruction operands.
401 let Inst{3-0} = Dm{3-0};
402 let Inst{5} = Dm{4};
403 let Inst{15-12} = Sd{4-1};
404 let Inst{22} = Sd{0};
405
Evan Cheng96581d32008-11-11 02:11:05 +0000406 let Inst{27-23} = 0b11101;
407 let Inst{21-16} = 0b110111;
408 let Inst{11-8} = 0b1011;
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000409 let Inst{7-6} = 0b11;
410 let Inst{4} = 0;
Evan Cheng96581d32008-11-11 02:11:05 +0000411}
Evan Chenga8e29892007-01-19 07:51:42 +0000412
Johnny Chen2d658df2010-02-09 17:21:56 +0000413// Between half-precision and single-precision. For disassembly only.
414
Bill Wendling67a704d2010-10-13 20:58:46 +0000415// FIXME: Verify encoding after integrated assembler is working.
Jim Grosbach18f30e62010-06-02 21:53:11 +0000416def VCVTBSH: ASuI<0b11101, 0b11, 0b0010, 0b01, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000417 /* FIXME */ IIC_fpCVTSH, "vcvtb", ".f32.f16\t$dst, $a",
Anton Korobeynikovf0d50072010-03-18 22:35:37 +0000418 [/* For disassembly only; pattern left blank */]>;
419
Bob Wilson76a312b2010-03-19 22:51:32 +0000420def : ARMPat<(f32_to_f16 SPR:$a),
421 (i32 (COPY_TO_REGCLASS (VCVTBSH SPR:$a), GPR))>;
Johnny Chen2d658df2010-02-09 17:21:56 +0000422
Jim Grosbach18f30e62010-06-02 21:53:11 +0000423def VCVTBHS: ASuI<0b11101, 0b11, 0b0011, 0b01, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000424 /* FIXME */ IIC_fpCVTHS, "vcvtb", ".f16.f32\t$dst, $a",
Anton Korobeynikovf0d50072010-03-18 22:35:37 +0000425 [/* For disassembly only; pattern left blank */]>;
426
Bob Wilson76a312b2010-03-19 22:51:32 +0000427def : ARMPat<(f16_to_f32 GPR:$a),
428 (VCVTBHS (COPY_TO_REGCLASS GPR:$a, SPR))>;
Johnny Chen2d658df2010-02-09 17:21:56 +0000429
Jim Grosbach18f30e62010-06-02 21:53:11 +0000430def VCVTTSH: ASuI<0b11101, 0b11, 0b0010, 0b11, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000431 /* FIXME */ IIC_fpCVTSH, "vcvtt", ".f32.f16\t$dst, $a",
Johnny Chen2d658df2010-02-09 17:21:56 +0000432 [/* For disassembly only; pattern left blank */]>;
433
Jim Grosbach18f30e62010-06-02 21:53:11 +0000434def VCVTTHS: ASuI<0b11101, 0b11, 0b0011, 0b11, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000435 /* FIXME */ IIC_fpCVTHS, "vcvtt", ".f16.f32\t$dst, $a",
Johnny Chen2d658df2010-02-09 17:21:56 +0000436 [/* For disassembly only; pattern left blank */]>;
437
Bill Wendling69326432010-10-13 01:17:33 +0000438def VNEGD : ADuI_Encode<0b11101, 0b11, 0b0001, 0b01, 0,
439 (outs DPR:$Dd), (ins DPR:$Dm),
440 IIC_fpUNA64, "vneg", ".f64\t$Dd, $Dm",
441 [(set DPR:$Dd, (fneg (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000442
Bill Wendling69326432010-10-13 01:17:33 +0000443def VNEGS : ASuIn_Encode<0b11101, 0b11, 0b0001, 0b01, 0,
444 (outs SPR:$Sd), (ins SPR:$Sm),
445 IIC_fpUNA32, "vneg", ".f32\t$Sd, $Sm",
446 [(set SPR:$Sd, (fneg SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000447
Bill Wendling69326432010-10-13 01:17:33 +0000448def VSQRTD : ADuI_Encode<0b11101, 0b11, 0b0001, 0b11, 0,
449 (outs DPR:$Dd), (ins DPR:$Dm),
450 IIC_fpSQRT64, "vsqrt", ".f64\t$Dd, $Dm",
451 [(set DPR:$Dd, (fsqrt (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000452
Bill Wendling69326432010-10-13 01:17:33 +0000453def VSQRTS : ASuI_Encode<0b11101, 0b11, 0b0001, 0b11, 0,
454 (outs SPR:$Sd), (ins SPR:$Sm),
455 IIC_fpSQRT32, "vsqrt", ".f32\t$Sd, $Sm",
456 [(set SPR:$Sd, (fsqrt SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000457
Bill Wendling67a704d2010-10-13 20:58:46 +0000458let neverHasSideEffects = 1 in {
459def VMOVD : ADuI_Encode<0b11101, 0b11, 0b0000, 0b01, 0,
460 (outs DPR:$Dd), (ins DPR:$Dm),
461 IIC_fpUNA64, "vmov", ".f64\t$Dd, $Dm", []>;
462
463def VMOVS : ASuI_Encode<0b11101, 0b11, 0b0000, 0b01, 0,
464 (outs SPR:$Sd), (ins SPR:$Sm),
465 IIC_fpUNA32, "vmov", ".f32\t$Sd, $Sm", []>;
466} // neverHasSideEffects
467
Evan Chenga8e29892007-01-19 07:51:42 +0000468//===----------------------------------------------------------------------===//
469// FP <-> GPR Copies. Int <-> FP Conversions.
470//
471
Jim Grosbache5165492009-11-09 00:11:35 +0000472def VMOVRS : AVConv2I<0b11100001, 0b1010, (outs GPR:$dst), (ins SPR:$src),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000473 IIC_fpMOVSI, "vmov", "\t$dst, $src",
Evan Chenga8e29892007-01-19 07:51:42 +0000474 [(set GPR:$dst, (bitconvert SPR:$src))]>;
475
Jim Grosbache5165492009-11-09 00:11:35 +0000476def VMOVSR : AVConv4I<0b11100000, 0b1010, (outs SPR:$dst), (ins GPR:$src),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000477 IIC_fpMOVIS, "vmov", "\t$dst, $src",
Evan Chenga8e29892007-01-19 07:51:42 +0000478 [(set SPR:$dst, (bitconvert GPR:$src))]>;
479
Evan Cheng020cc1b2010-05-13 00:16:46 +0000480let neverHasSideEffects = 1 in {
Jim Grosbache5165492009-11-09 00:11:35 +0000481def VMOVRRD : AVConv3I<0b11000101, 0b1011,
Evan Chengd20d6582009-10-01 01:33:39 +0000482 (outs GPR:$wb, GPR:$dst2), (ins DPR:$src),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000483 IIC_fpMOVDI, "vmov", "\t$wb, $dst2, $src",
Johnny Chen7acca672010-02-05 18:04:58 +0000484 [/* FIXME: Can't write pattern for multiple result instr*/]> {
485 let Inst{7-6} = 0b00;
486}
Evan Chenga8e29892007-01-19 07:51:42 +0000487
Johnny Chen23401d62010-02-08 17:26:09 +0000488def VMOVRRS : AVConv3I<0b11000101, 0b1010,
489 (outs GPR:$wb, GPR:$dst2), (ins SPR:$src1, SPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000490 IIC_fpMOVDI, "vmov", "\t$wb, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000491 [/* For disassembly only; pattern left blank */]> {
492 let Inst{7-6} = 0b00;
493}
Evan Cheng020cc1b2010-05-13 00:16:46 +0000494} // neverHasSideEffects
Johnny Chen23401d62010-02-08 17:26:09 +0000495
Evan Chenga8e29892007-01-19 07:51:42 +0000496// FMDHR: GPR -> SPR
497// FMDLR: GPR -> SPR
498
Jim Grosbache5165492009-11-09 00:11:35 +0000499def VMOVDRR : AVConv5I<0b11000100, 0b1011,
Evan Cheng38b6fd62008-12-11 22:02:02 +0000500 (outs DPR:$dst), (ins GPR:$src1, GPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000501 IIC_fpMOVID, "vmov", "\t$dst, $src1, $src2",
Johnny Chen7acca672010-02-05 18:04:58 +0000502 [(set DPR:$dst, (arm_fmdrr GPR:$src1, GPR:$src2))]> {
503 let Inst{7-6} = 0b00;
504}
Evan Chenga8e29892007-01-19 07:51:42 +0000505
Evan Cheng020cc1b2010-05-13 00:16:46 +0000506let neverHasSideEffects = 1 in
Johnny Chen23401d62010-02-08 17:26:09 +0000507def VMOVSRR : AVConv5I<0b11000100, 0b1010,
508 (outs SPR:$dst1, SPR:$dst2), (ins GPR:$src1, GPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000509 IIC_fpMOVID, "vmov", "\t$dst1, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000510 [/* For disassembly only; pattern left blank */]> {
511 let Inst{7-6} = 0b00;
512}
513
Evan Chenga8e29892007-01-19 07:51:42 +0000514// FMRDH: SPR -> GPR
515// FMRDL: SPR -> GPR
516// FMRRS: SPR -> GPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000517// FMRX: SPR system reg -> GPR
Evan Chenga8e29892007-01-19 07:51:42 +0000518// FMSRR: GPR -> SPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000519// FMXR: GPR -> VFP system reg
Evan Chenga8e29892007-01-19 07:51:42 +0000520
521
Bill Wendling67a704d2010-10-13 20:58:46 +0000522// Int -> FP:
Evan Chenga8e29892007-01-19 07:51:42 +0000523
Bill Wendling67a704d2010-10-13 20:58:46 +0000524class AVConv1IDs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
525 bits<4> opcod4, dag oops, dag iops,
526 InstrItinClass itin, string opc, string asm,
527 list<dag> pattern>
528 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
529 pattern> {
530 // Instruction operands.
531 bits<5> Dd;
532 bits<5> Sm;
533
534 // Encode instruction operands.
535 let Inst{3-0} = Sm{4-1};
536 let Inst{5} = Sm{0};
537 let Inst{15-12} = Dd{3-0};
538 let Inst{22} = Dd{4};
539}
540
541class AVConv1InSs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
542 bits<4> opcod4, dag oops, dag iops,InstrItinClass itin,
543 string opc, string asm, list<dag> pattern>
544 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
545 pattern> {
546 // Instruction operands.
547 bits<5> Sd;
548 bits<5> Sm;
549
550 // Encode instruction operands.
551 let Inst{3-0} = Sm{4-1};
552 let Inst{5} = Sm{0};
553 let Inst{15-12} = Sd{4-1};
554 let Inst{22} = Sd{0};
555}
556
557def VSITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
558 (outs DPR:$Dd), (ins SPR:$Sm),
559 IIC_fpCVTID, "vcvt", ".f64.s32\t$Dd, $Sm",
560 [(set DPR:$Dd, (f64 (arm_sitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000561 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000562}
Evan Chenga8e29892007-01-19 07:51:42 +0000563
Bill Wendling67a704d2010-10-13 20:58:46 +0000564def VSITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
565 (outs SPR:$Sd),(ins SPR:$Sm),
566 IIC_fpCVTIS, "vcvt", ".f32.s32\t$Sd, $Sm",
567 [(set SPR:$Sd, (arm_sitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000568 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000569}
Evan Chenga8e29892007-01-19 07:51:42 +0000570
Bill Wendling67a704d2010-10-13 20:58:46 +0000571def VUITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
572 (outs DPR:$Dd), (ins SPR:$Sm),
573 IIC_fpCVTID, "vcvt", ".f64.u32\t$Dd, $Sm",
574 [(set DPR:$Dd, (f64 (arm_uitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000575 let Inst{7} = 0; // u32
576}
Evan Chenga8e29892007-01-19 07:51:42 +0000577
Bill Wendling67a704d2010-10-13 20:58:46 +0000578def VUITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
579 (outs SPR:$Sd), (ins SPR:$Sm),
580 IIC_fpCVTIS, "vcvt", ".f32.u32\t$Sd, $Sm",
581 [(set SPR:$Sd, (arm_uitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000582 let Inst{7} = 0; // u32
583}
Evan Chenga8e29892007-01-19 07:51:42 +0000584
Bill Wendling67a704d2010-10-13 20:58:46 +0000585// FP -> Int:
586
587class AVConv1IsD_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
588 bits<4> opcod4, dag oops, dag iops,
589 InstrItinClass itin, string opc, string asm,
590 list<dag> pattern>
591 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
592 pattern> {
593 // Instruction operands.
594 bits<5> Sd;
595 bits<5> Dm;
596
597 // Encode instruction operands.
598 let Inst{3-0} = Dm{3-0};
599 let Inst{5} = Dm{4};
600 let Inst{15-12} = Sd{4-1};
601 let Inst{22} = Sd{0};
602}
603
604class AVConv1InsS_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
605 bits<4> opcod4, dag oops, dag iops,
606 InstrItinClass itin, string opc, string asm,
607 list<dag> pattern>
608 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
609 pattern> {
610 // Instruction operands.
611 bits<5> Sd;
612 bits<5> Sm;
613
614 // Encode instruction operands.
615 let Inst{3-0} = Sm{4-1};
616 let Inst{5} = Sm{0};
617 let Inst{15-12} = Sd{4-1};
618 let Inst{22} = Sd{0};
619}
620
Evan Chenga8e29892007-01-19 07:51:42 +0000621// Always set Z bit in the instruction, i.e. "round towards zero" variants.
Bill Wendling67a704d2010-10-13 20:58:46 +0000622def VTOSIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
623 (outs SPR:$Sd), (ins DPR:$Dm),
624 IIC_fpCVTDI, "vcvt", ".s32.f64\t$Sd, $Dm",
625 [(set SPR:$Sd, (arm_ftosi (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000626 let Inst{7} = 1; // Z bit
627}
Evan Chenga8e29892007-01-19 07:51:42 +0000628
Bill Wendling67a704d2010-10-13 20:58:46 +0000629def VTOSIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
630 (outs SPR:$Sd), (ins SPR:$Sm),
631 IIC_fpCVTSI, "vcvt", ".s32.f32\t$Sd, $Sm",
632 [(set SPR:$Sd, (arm_ftosi SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000633 let Inst{7} = 1; // Z bit
634}
Evan Chenga8e29892007-01-19 07:51:42 +0000635
Bill Wendling67a704d2010-10-13 20:58:46 +0000636def VTOUIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
637 (outs SPR:$Sd), (ins DPR:$Dm),
638 IIC_fpCVTDI, "vcvt", ".u32.f64\t$Sd, $Dm",
639 [(set SPR:$Sd, (arm_ftoui (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000640 let Inst{7} = 1; // Z bit
641}
Evan Chenga8e29892007-01-19 07:51:42 +0000642
Bill Wendling67a704d2010-10-13 20:58:46 +0000643def VTOUIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
644 (outs SPR:$Sd), (ins SPR:$Sm),
645 IIC_fpCVTSI, "vcvt", ".u32.f32\t$Sd, $Sm",
646 [(set SPR:$Sd, (arm_ftoui SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000647 let Inst{7} = 1; // Z bit
648}
Evan Chenga8e29892007-01-19 07:51:42 +0000649
Johnny Chen15b423f2010-02-08 22:02:41 +0000650// And the Z bit '0' variants, i.e. use the rounding mode specified by FPSCR.
651// For disassembly only.
Nate Begemand1fb5832010-08-03 21:31:55 +0000652let Uses = [FPSCR] in {
Bill Wendling67a704d2010-10-13 20:58:46 +0000653// FIXME: Verify encoding after integrated assembler is working.
654def VTOSIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
655 (outs SPR:$Sd), (ins DPR:$Dm),
656 IIC_fpCVTDI, "vcvtr", ".s32.f64\t$Sd, $Dm",
657 [(set SPR:$Sd, (int_arm_vcvtr (f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000658 let Inst{7} = 0; // Z bit
659}
660
Bill Wendling67a704d2010-10-13 20:58:46 +0000661def VTOSIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
662 (outs SPR:$Sd), (ins SPR:$Sm),
663 IIC_fpCVTSI, "vcvtr", ".s32.f32\t$Sd, $Sm",
664 [(set SPR:$Sd, (int_arm_vcvtr SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000665 let Inst{7} = 0; // Z bit
666}
667
Bill Wendling67a704d2010-10-13 20:58:46 +0000668def VTOUIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
669 (outs SPR:$Sd), (ins DPR:$Dm),
670 IIC_fpCVTDI, "vcvtr", ".u32.f64\t$Sd, $Dm",
Bill Wendling88cf0382010-10-14 01:02:08 +0000671 [(set SPR:$Sd, (int_arm_vcvtru(f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000672 let Inst{7} = 0; // Z bit
673}
674
Bill Wendling67a704d2010-10-13 20:58:46 +0000675def VTOUIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
676 (outs SPR:$Sd), (ins SPR:$Sm),
677 IIC_fpCVTSI, "vcvtr", ".u32.f32\t$Sd, $Sm",
678 [(set SPR:$Sd, (int_arm_vcvtru SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000679 let Inst{7} = 0; // Z bit
680}
Nate Begemand1fb5832010-08-03 21:31:55 +0000681}
Johnny Chen15b423f2010-02-08 22:02:41 +0000682
Johnny Chen27bb8d02010-02-11 18:17:16 +0000683// Convert between floating-point and fixed-point
684// Data type for fixed-point naming convention:
685// S16 (U=0, sx=0) -> SH
686// U16 (U=1, sx=0) -> UH
687// S32 (U=0, sx=1) -> SL
688// U32 (U=1, sx=1) -> UL
689
690let Constraints = "$a = $dst" in {
691
692// FP to Fixed-Point:
693
Daniel Dunbar3bcd9f72010-08-11 04:46:13 +0000694let isCodeGenOnly = 1 in {
Johnny Chen27bb8d02010-02-11 18:17:16 +0000695def VTOSHS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 0,
696 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
697 IIC_fpCVTSI, "vcvt", ".s16.f32\t$dst, $a, $fbits",
698 [/* For disassembly only; pattern left blank */]>;
699
700def VTOUHS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 0,
701 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
702 IIC_fpCVTSI, "vcvt", ".u16.f32\t$dst, $a, $fbits",
703 [/* For disassembly only; pattern left blank */]>;
704
705def VTOSLS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 1,
706 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
707 IIC_fpCVTSI, "vcvt", ".s32.f32\t$dst, $a, $fbits",
708 [/* For disassembly only; pattern left blank */]>;
709
710def VTOULS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 1,
711 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
712 IIC_fpCVTSI, "vcvt", ".u32.f32\t$dst, $a, $fbits",
713 [/* For disassembly only; pattern left blank */]>;
714
715def VTOSHD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 0,
716 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
717 IIC_fpCVTDI, "vcvt", ".s16.f64\t$dst, $a, $fbits",
718 [/* For disassembly only; pattern left blank */]>;
719
720def VTOUHD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 0,
721 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
722 IIC_fpCVTDI, "vcvt", ".u16.f64\t$dst, $a, $fbits",
723 [/* For disassembly only; pattern left blank */]>;
724
725def VTOSLD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 1,
726 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
727 IIC_fpCVTDI, "vcvt", ".s32.f64\t$dst, $a, $fbits",
728 [/* For disassembly only; pattern left blank */]>;
729
730def VTOULD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 1,
731 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
732 IIC_fpCVTDI, "vcvt", ".u32.f64\t$dst, $a, $fbits",
733 [/* For disassembly only; pattern left blank */]>;
Bill Wendling88cf0382010-10-14 01:02:08 +0000734} // End of 'let isCodeGenOnly = 1 in'
Johnny Chen27bb8d02010-02-11 18:17:16 +0000735
736// Fixed-Point to FP:
737
Daniel Dunbar3bcd9f72010-08-11 04:46:13 +0000738let isCodeGenOnly = 1 in {
Johnny Chen27bb8d02010-02-11 18:17:16 +0000739def VSHTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 0,
740 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
741 IIC_fpCVTIS, "vcvt", ".f32.s16\t$dst, $a, $fbits",
742 [/* For disassembly only; pattern left blank */]>;
743
744def VUHTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 0,
745 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
746 IIC_fpCVTIS, "vcvt", ".f32.u16\t$dst, $a, $fbits",
747 [/* For disassembly only; pattern left blank */]>;
748
749def VSLTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 1,
750 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
751 IIC_fpCVTIS, "vcvt", ".f32.s32\t$dst, $a, $fbits",
752 [/* For disassembly only; pattern left blank */]>;
753
754def VULTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 1,
755 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
756 IIC_fpCVTIS, "vcvt", ".f32.u32\t$dst, $a, $fbits",
757 [/* For disassembly only; pattern left blank */]>;
758
759def VSHTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 0,
760 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
761 IIC_fpCVTID, "vcvt", ".f64.s16\t$dst, $a, $fbits",
762 [/* For disassembly only; pattern left blank */]>;
763
764def VUHTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 0,
765 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
766 IIC_fpCVTID, "vcvt", ".f64.u16\t$dst, $a, $fbits",
767 [/* For disassembly only; pattern left blank */]>;
768
769def VSLTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 1,
770 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
771 IIC_fpCVTID, "vcvt", ".f64.s32\t$dst, $a, $fbits",
772 [/* For disassembly only; pattern left blank */]>;
773
774def VULTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 1,
775 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
776 IIC_fpCVTID, "vcvt", ".f64.u32\t$dst, $a, $fbits",
777 [/* For disassembly only; pattern left blank */]>;
Bill Wendling88cf0382010-10-14 01:02:08 +0000778} // End of 'let isCodeGenOnly = 1 in'
Johnny Chen27bb8d02010-02-11 18:17:16 +0000779
780} // End of 'let Constraints = "$src = $dst" in'
781
Evan Chenga8e29892007-01-19 07:51:42 +0000782//===----------------------------------------------------------------------===//
783// FP FMA Operations.
784//
785
Bill Wendling88cf0382010-10-14 01:02:08 +0000786class ADbI_vmlX_Encode<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4,
787 dag oops, dag iops, InstrItinClass itin, string opc,
788 string asm, list<dag> pattern>
789 : ADbI_vmlX<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
790 // Instruction operands.
791 bits<5> Dd;
792 bits<5> Dn;
793 bits<5> Dm;
Evan Chenga8e29892007-01-19 07:51:42 +0000794
Bill Wendling88cf0382010-10-14 01:02:08 +0000795 // Encode instruction operands.
796 let Inst{19-16} = Dn{3-0};
797 let Inst{7} = Dn{4};
798 let Inst{15-12} = Dd{3-0};
799 let Inst{22} = Dd{4};
800 let Inst{3-0} = Dm{3-0};
801 let Inst{5} = Dm{4};
802}
Evan Chenga8e29892007-01-19 07:51:42 +0000803
Bill Wendling88cf0382010-10-14 01:02:08 +0000804def VMLAD : ADbI_vmlX_Encode<0b11100, 0b00, 0, 0,
805 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
806 IIC_fpMAC64, "vmla", ".f64\t$Dd, $Dn, $Dm",
807 [(set DPR:$Dd, (fadd (fmul DPR:$Dn, DPR:$Dm),
808 (f64 DPR:$Ddin)))]>,
809 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000810
Bill Wendling88cf0382010-10-14 01:02:08 +0000811def VMLAS : ASbIn_Encode<0b11100, 0b00, 0, 0,
812 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
813 IIC_fpMAC32, "vmla", ".f32\t$Sd, $Sn, $Sm",
814 [(set SPR:$Sd, (fadd (fmul SPR:$Sn, SPR:$Sm),
815 SPR:$Sdin))]>,
816 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000817
Bill Wendling88cf0382010-10-14 01:02:08 +0000818def : Pat<(fadd DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
819 (VMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
820def : Pat<(fadd SPR:$dstin, (fmul SPR:$a, SPR:$b)),
821 (VMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000822
Bill Wendling88cf0382010-10-14 01:02:08 +0000823def VMLSD : ADbI_vmlX_Encode<0b11100, 0b00, 1, 0,
824 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
825 IIC_fpMAC64, "vmls", ".f64\t$Dd, $Dn, $Dm",
826 [(set DPR:$Dd, (fadd (fneg (fmul DPR:$Dn,DPR:$Dm)),
827 (f64 DPR:$Ddin)))]>,
828 RegConstraint<"$Ddin = $Dd">;
829
830def VMLSS : ASbIn_Encode<0b11100, 0b00, 1, 0,
831 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
832 IIC_fpMAC32, "vmls", ".f32\t$Sd, $Sn, $Sm",
833 [(set SPR:$Sd, (fadd (fneg (fmul SPR:$Sn, SPR:$Sm)),
834 SPR:$Sdin))]>,
835 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000836
Chris Lattnerd10a53d2010-03-08 18:51:21 +0000837def : Pat<(fsub DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
Jim Grosbache5165492009-11-09 00:11:35 +0000838 (VMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000839def : Pat<(fsub SPR:$dstin, (fmul SPR:$a, SPR:$b)),
Jim Grosbache5165492009-11-09 00:11:35 +0000840 (VMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000841
Bill Wendling88cf0382010-10-14 01:02:08 +0000842def VNMLAD : ADbI_vmlX_Encode<0b11100, 0b01, 1, 0,
843 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
844 IIC_fpMAC64, "vnmla", ".f64\t$Dd, $Dn, $Dm",
845 [(set DPR:$Dd,(fsub (fneg (fmul DPR:$Dn,DPR:$Dm)),
846 (f64 DPR:$Ddin)))]>,
847 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000848
Bill Wendling88cf0382010-10-14 01:02:08 +0000849def VNMLAS : ASbI_Encode<0b11100, 0b01, 1, 0,
850 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
851 IIC_fpMAC32, "vnmla", ".f32\t$Sd, $Sn, $Sm",
852 [(set SPR:$Sd, (fsub (fneg (fmul SPR:$Sn, SPR:$Sm)),
853 SPR:$Sdin))]>,
854 RegConstraint<"$Sdin = $Sd">;
855
856def : Pat<(fsub (fneg (fmul DPR:$a, (f64 DPR:$b))), DPR:$dstin),
857 (VNMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
858def : Pat<(fsub (fneg (fmul SPR:$a, SPR:$b)), SPR:$dstin),
859 (VNMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
860
861def VNMLSD : ADbI_vmlX_Encode<0b11100, 0b01, 0, 0,
862 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
863 IIC_fpMAC64, "vnmls", ".f64\t$Dd, $Dn, $Dm",
864 [(set DPR:$Dd, (fsub (fmul DPR:$Dn, DPR:$Dm),
865 (f64 DPR:$Ddin)))]>,
866 RegConstraint<"$Ddin = $Dd">;
867
868def VNMLSS : ASbI_Encode<0b11100, 0b01, 0, 0,
869 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
870 IIC_fpMAC32, "vnmls", ".f32\t$Sd, $Sn, $Sm",
871 [(set SPR:$Sd, (fsub (fmul SPR:$Sn, SPR:$Sm),
872 SPR:$Sdin))]>,
873 RegConstraint<"$Sdin = $Sd">;
874
875def : Pat<(fsub (fmul DPR:$a, (f64 DPR:$b)), DPR:$dstin),
876 (VNMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
877def : Pat<(fsub (fmul SPR:$a, SPR:$b), SPR:$dstin),
878 (VNMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
879
Evan Chenga8e29892007-01-19 07:51:42 +0000880
881//===----------------------------------------------------------------------===//
882// FP Conditional moves.
883//
884
Evan Cheng020cc1b2010-05-13 00:16:46 +0000885let neverHasSideEffects = 1 in {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000886def VMOVDcc : ADuI<0b11101, 0b11, 0b0000, 0b01, 0,
Evan Cheng78be83d2008-11-11 19:40:26 +0000887 (outs DPR:$dst), (ins DPR:$false, DPR:$true),
Jim Grosbache5165492009-11-09 00:11:35 +0000888 IIC_fpUNA64, "vmov", ".f64\t$dst, $true",
Evan Chengc85e8322007-07-05 07:13:32 +0000889 [/*(set DPR:$dst, (ARMcmov DPR:$false, DPR:$true, imm:$cc))*/]>,
890 RegConstraint<"$false = $dst">;
Evan Chenga8e29892007-01-19 07:51:42 +0000891
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000892def VMOVScc : ASuI<0b11101, 0b11, 0b0000, 0b01, 0,
Evan Cheng78be83d2008-11-11 19:40:26 +0000893 (outs SPR:$dst), (ins SPR:$false, SPR:$true),
Jim Grosbache5165492009-11-09 00:11:35 +0000894 IIC_fpUNA32, "vmov", ".f32\t$dst, $true",
Evan Chengc85e8322007-07-05 07:13:32 +0000895 [/*(set SPR:$dst, (ARMcmov SPR:$false, SPR:$true, imm:$cc))*/]>,
896 RegConstraint<"$false = $dst">;
Evan Chenga8e29892007-01-19 07:51:42 +0000897
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000898def VNEGDcc : ADuI<0b11101, 0b11, 0b0001, 0b01, 0,
Evan Cheng78be83d2008-11-11 19:40:26 +0000899 (outs DPR:$dst), (ins DPR:$false, DPR:$true),
Jim Grosbache5165492009-11-09 00:11:35 +0000900 IIC_fpUNA64, "vneg", ".f64\t$dst, $true",
Evan Chengc85e8322007-07-05 07:13:32 +0000901 [/*(set DPR:$dst, (ARMcneg DPR:$false, DPR:$true, imm:$cc))*/]>,
902 RegConstraint<"$false = $dst">;
Evan Chenga8e29892007-01-19 07:51:42 +0000903
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000904def VNEGScc : ASuI<0b11101, 0b11, 0b0001, 0b01, 0,
Evan Cheng78be83d2008-11-11 19:40:26 +0000905 (outs SPR:$dst), (ins SPR:$false, SPR:$true),
Jim Grosbache5165492009-11-09 00:11:35 +0000906 IIC_fpUNA32, "vneg", ".f32\t$dst, $true",
Evan Chengc85e8322007-07-05 07:13:32 +0000907 [/*(set SPR:$dst, (ARMcneg SPR:$false, SPR:$true, imm:$cc))*/]>,
908 RegConstraint<"$false = $dst">;
Evan Cheng020cc1b2010-05-13 00:16:46 +0000909} // neverHasSideEffects
Evan Cheng78be83d2008-11-11 19:40:26 +0000910
911//===----------------------------------------------------------------------===//
912// Misc.
913//
914
Evan Cheng1e13c792009-11-10 19:44:56 +0000915// APSR is the application level alias of CPSR. This FPSCR N, Z, C, V flags
916// to APSR.
Evan Cheng91449a82009-07-20 02:12:31 +0000917let Defs = [CPSR], Uses = [FPSCR] in
Jim Grosbache5165492009-11-09 00:11:35 +0000918def FMSTAT : VFPAI<(outs), (ins), VFPMiscFrm, IIC_fpSTAT, "vmrs",
Jim Grosbachf4cbc0e2009-11-13 01:17:22 +0000919 "\tapsr_nzcv, fpscr",
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000920 [(arm_fmstat)]> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000921 let Inst{27-20} = 0b11101111;
922 let Inst{19-16} = 0b0001;
923 let Inst{15-12} = 0b1111;
924 let Inst{11-8} = 0b1010;
925 let Inst{7} = 0;
Bill Wendling946a2742010-10-14 01:19:34 +0000926 let Inst{6-5} = 0b00;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000927 let Inst{4} = 1;
Bill Wendling946a2742010-10-14 01:19:34 +0000928 let Inst{3-0} = 0b0000;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000929}
Evan Cheng39382422009-10-28 01:44:26 +0000930
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000931// FPSCR <-> GPR
Nate Begemand1fb5832010-08-03 21:31:55 +0000932let hasSideEffects = 1, Uses = [FPSCR] in
Bill Wendling88cf0382010-10-14 01:02:08 +0000933def VMRS : VFPAI<(outs GPR:$Rt), (ins), VFPMiscFrm, IIC_fpSTAT,
934 "vmrs", "\t$Rt, fpscr",
935 [(set GPR:$Rt, (int_arm_get_fpscr))]> {
936 // Instruction operand.
937 bits<4> Rt;
938
939 // Encode instruction operand.
940 let Inst{15-12} = Rt;
941
Johnny Chenc9745042010-02-09 22:35:38 +0000942 let Inst{27-20} = 0b11101111;
943 let Inst{19-16} = 0b0001;
944 let Inst{11-8} = 0b1010;
945 let Inst{7} = 0;
Bill Wendling88cf0382010-10-14 01:02:08 +0000946 let Inst{6-5} = 0b00;
Johnny Chenc9745042010-02-09 22:35:38 +0000947 let Inst{4} = 1;
Bill Wendling88cf0382010-10-14 01:02:08 +0000948 let Inst{3-0} = 0b0000;
Johnny Chenc9745042010-02-09 22:35:38 +0000949}
Johnny Chenc9745042010-02-09 22:35:38 +0000950
Nate Begemand1fb5832010-08-03 21:31:55 +0000951let Defs = [FPSCR] in
952def VMSR : VFPAI<(outs), (ins GPR:$src), VFPMiscFrm, IIC_fpSTAT,
953 "vmsr", "\tfpscr, $src",
Bill Wendling88cf0382010-10-14 01:02:08 +0000954 [(int_arm_set_fpscr GPR:$src)]> {
955 // Instruction operand.
956 bits<4> src;
957
958 // Encode instruction operand.
959 let Inst{15-12} = src;
960
Johnny Chenc9745042010-02-09 22:35:38 +0000961 let Inst{27-20} = 0b11101110;
962 let Inst{19-16} = 0b0001;
963 let Inst{11-8} = 0b1010;
964 let Inst{7} = 0;
965 let Inst{4} = 1;
966}
Evan Cheng39382422009-10-28 01:44:26 +0000967
968// Materialize FP immediates. VFP3 only.
Jim Grosbache5165492009-11-09 00:11:35 +0000969let isReMaterializable = 1 in {
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000970def FCONSTD : VFPAI<(outs DPR:$Dd), (ins vfp_f64imm:$imm),
Anton Korobeynikov63401e32010-04-07 18:19:56 +0000971 VFPMiscFrm, IIC_fpUNA64,
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000972 "vmov", ".f64\t$Dd, $imm",
973 [(set DPR:$Dd, vfp_f64imm:$imm)]>, Requires<[HasVFP3]> {
974 // Instruction operands.
975 bits<5> Dd;
976 bits<32> imm;
977
978 // Encode instruction operands.
979 let Inst{15-12} = Dd{3-0};
980 let Inst{22} = Dd{4};
981 let Inst{19} = imm{31};
982 let Inst{18-16} = imm{22-20};
983 let Inst{3-0} = imm{19-16};
984
985 // Encode remaining instruction bits.
Jim Grosbache5165492009-11-09 00:11:35 +0000986 let Inst{27-23} = 0b11101;
987 let Inst{21-20} = 0b11;
988 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000989 let Inst{8} = 1; // Double precision.
Jim Grosbache5165492009-11-09 00:11:35 +0000990 let Inst{7-4} = 0b0000;
991}
992
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000993def FCONSTS : VFPAI<(outs SPR:$Sd), (ins vfp_f32imm:$imm),
994 VFPMiscFrm, IIC_fpUNA32,
995 "vmov", ".f32\t$Sd, $imm",
996 [(set SPR:$Sd, vfp_f32imm:$imm)]>, Requires<[HasVFP3]> {
997 // Instruction operands.
998 bits<5> Sd;
999 bits<32> imm;
1000
1001 // Encode instruction operands.
1002 let Inst{15-12} = Sd{4-1};
1003 let Inst{22} = Sd{0};
1004 let Inst{19} = imm{31}; // The immediate is handled as a double.
1005 let Inst{18-16} = imm{22-20};
1006 let Inst{3-0} = imm{19-16};
1007
1008 // Encode remaining instruction bits.
Evan Cheng39382422009-10-28 01:44:26 +00001009 let Inst{27-23} = 0b11101;
1010 let Inst{21-20} = 0b11;
1011 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +00001012 let Inst{8} = 0; // Single precision.
Evan Cheng39382422009-10-28 01:44:26 +00001013 let Inst{7-4} = 0b0000;
1014}
Evan Cheng39382422009-10-28 01:44:26 +00001015}