blob: 0b9da8a26ef3c4ee2d57d0d84dc8c98980e756a2 [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 {
Bill Wendling7d31a162010-10-20 22:44:54 +000054def VLDRD : ADI5<0b1101, 0b01, (outs DPR:$Dd), (ins addrmode5:$addr),
55 IIC_fpLoad64, "vldr", ".64\t$Dd, $addr",
56 [(set DPR:$Dd, (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
Bill Wendling7d31a162010-10-20 22:44:54 +0000472def VMOVRS : AVConv2I<0b11100001, 0b1010,
473 (outs GPR:$Rt), (ins SPR:$Sn),
474 IIC_fpMOVSI, "vmov", "\t$Rt, $Sn",
475 [(set GPR:$Rt, (bitconvert SPR:$Sn))]> {
476 // Instruction operands.
477 bits<4> Rt;
478 bits<5> Sn;
Evan Chenga8e29892007-01-19 07:51:42 +0000479
Bill Wendling7d31a162010-10-20 22:44:54 +0000480 // Encode instruction operands.
481 let Inst{19-16} = Sn{4-1};
482 let Inst{7} = Sn{0};
483 let Inst{15-12} = Rt;
484
485 let Inst{6-5} = 0b00;
486 let Inst{3-0} = 0b0000;
487}
488
489def VMOVSR : AVConv4I<0b11100000, 0b1010,
490 (outs SPR:$Sn), (ins GPR:$Rt),
491 IIC_fpMOVIS, "vmov", "\t$Sn, $Rt",
492 [(set SPR:$Sn, (bitconvert GPR:$Rt))]> {
493 // Instruction operands.
494 bits<5> Sn;
495 bits<4> Rt;
496
497 // Encode instruction operands.
498 let Inst{19-16} = Sn{4-1};
499 let Inst{7} = Sn{0};
500 let Inst{15-12} = Rt;
501
502 let Inst{6-5} = 0b00;
503 let Inst{3-0} = 0b0000;
504}
Evan Chenga8e29892007-01-19 07:51:42 +0000505
Evan Cheng020cc1b2010-05-13 00:16:46 +0000506let neverHasSideEffects = 1 in {
Jim Grosbache5165492009-11-09 00:11:35 +0000507def VMOVRRD : AVConv3I<0b11000101, 0b1011,
Evan Chengd20d6582009-10-01 01:33:39 +0000508 (outs GPR:$wb, GPR:$dst2), (ins DPR:$src),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000509 IIC_fpMOVDI, "vmov", "\t$wb, $dst2, $src",
Johnny Chen7acca672010-02-05 18:04:58 +0000510 [/* FIXME: Can't write pattern for multiple result instr*/]> {
511 let Inst{7-6} = 0b00;
512}
Evan Chenga8e29892007-01-19 07:51:42 +0000513
Johnny Chen23401d62010-02-08 17:26:09 +0000514def VMOVRRS : AVConv3I<0b11000101, 0b1010,
515 (outs GPR:$wb, GPR:$dst2), (ins SPR:$src1, SPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000516 IIC_fpMOVDI, "vmov", "\t$wb, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000517 [/* For disassembly only; pattern left blank */]> {
518 let Inst{7-6} = 0b00;
519}
Evan Cheng020cc1b2010-05-13 00:16:46 +0000520} // neverHasSideEffects
Johnny Chen23401d62010-02-08 17:26:09 +0000521
Evan Chenga8e29892007-01-19 07:51:42 +0000522// FMDHR: GPR -> SPR
523// FMDLR: GPR -> SPR
524
Jim Grosbache5165492009-11-09 00:11:35 +0000525def VMOVDRR : AVConv5I<0b11000100, 0b1011,
Evan Cheng38b6fd62008-12-11 22:02:02 +0000526 (outs DPR:$dst), (ins GPR:$src1, GPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000527 IIC_fpMOVID, "vmov", "\t$dst, $src1, $src2",
Johnny Chen7acca672010-02-05 18:04:58 +0000528 [(set DPR:$dst, (arm_fmdrr GPR:$src1, GPR:$src2))]> {
529 let Inst{7-6} = 0b00;
530}
Evan Chenga8e29892007-01-19 07:51:42 +0000531
Evan Cheng020cc1b2010-05-13 00:16:46 +0000532let neverHasSideEffects = 1 in
Johnny Chen23401d62010-02-08 17:26:09 +0000533def VMOVSRR : AVConv5I<0b11000100, 0b1010,
534 (outs SPR:$dst1, SPR:$dst2), (ins GPR:$src1, GPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000535 IIC_fpMOVID, "vmov", "\t$dst1, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000536 [/* For disassembly only; pattern left blank */]> {
537 let Inst{7-6} = 0b00;
538}
539
Evan Chenga8e29892007-01-19 07:51:42 +0000540// FMRDH: SPR -> GPR
541// FMRDL: SPR -> GPR
542// FMRRS: SPR -> GPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000543// FMRX: SPR system reg -> GPR
Evan Chenga8e29892007-01-19 07:51:42 +0000544// FMSRR: GPR -> SPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000545// FMXR: GPR -> VFP system reg
Evan Chenga8e29892007-01-19 07:51:42 +0000546
547
Bill Wendling67a704d2010-10-13 20:58:46 +0000548// Int -> FP:
Evan Chenga8e29892007-01-19 07:51:42 +0000549
Bill Wendling67a704d2010-10-13 20:58:46 +0000550class AVConv1IDs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
551 bits<4> opcod4, dag oops, dag iops,
552 InstrItinClass itin, string opc, string asm,
553 list<dag> pattern>
554 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
555 pattern> {
556 // Instruction operands.
557 bits<5> Dd;
558 bits<5> Sm;
559
560 // Encode instruction operands.
561 let Inst{3-0} = Sm{4-1};
562 let Inst{5} = Sm{0};
563 let Inst{15-12} = Dd{3-0};
564 let Inst{22} = Dd{4};
565}
566
567class AVConv1InSs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
568 bits<4> opcod4, dag oops, dag iops,InstrItinClass itin,
569 string opc, string asm, list<dag> pattern>
570 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
571 pattern> {
572 // Instruction operands.
573 bits<5> Sd;
574 bits<5> Sm;
575
576 // Encode instruction operands.
577 let Inst{3-0} = Sm{4-1};
578 let Inst{5} = Sm{0};
579 let Inst{15-12} = Sd{4-1};
580 let Inst{22} = Sd{0};
581}
582
583def VSITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
584 (outs DPR:$Dd), (ins SPR:$Sm),
585 IIC_fpCVTID, "vcvt", ".f64.s32\t$Dd, $Sm",
586 [(set DPR:$Dd, (f64 (arm_sitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000587 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000588}
Evan Chenga8e29892007-01-19 07:51:42 +0000589
Bill Wendling67a704d2010-10-13 20:58:46 +0000590def VSITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
591 (outs SPR:$Sd),(ins SPR:$Sm),
592 IIC_fpCVTIS, "vcvt", ".f32.s32\t$Sd, $Sm",
593 [(set SPR:$Sd, (arm_sitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000594 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000595}
Evan Chenga8e29892007-01-19 07:51:42 +0000596
Bill Wendling67a704d2010-10-13 20:58:46 +0000597def VUITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
598 (outs DPR:$Dd), (ins SPR:$Sm),
599 IIC_fpCVTID, "vcvt", ".f64.u32\t$Dd, $Sm",
600 [(set DPR:$Dd, (f64 (arm_uitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000601 let Inst{7} = 0; // u32
602}
Evan Chenga8e29892007-01-19 07:51:42 +0000603
Bill Wendling67a704d2010-10-13 20:58:46 +0000604def VUITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
605 (outs SPR:$Sd), (ins SPR:$Sm),
606 IIC_fpCVTIS, "vcvt", ".f32.u32\t$Sd, $Sm",
607 [(set SPR:$Sd, (arm_uitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000608 let Inst{7} = 0; // u32
609}
Evan Chenga8e29892007-01-19 07:51:42 +0000610
Bill Wendling67a704d2010-10-13 20:58:46 +0000611// FP -> Int:
612
613class AVConv1IsD_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
614 bits<4> opcod4, dag oops, dag iops,
615 InstrItinClass itin, string opc, string asm,
616 list<dag> pattern>
617 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
618 pattern> {
619 // Instruction operands.
620 bits<5> Sd;
621 bits<5> Dm;
622
623 // Encode instruction operands.
624 let Inst{3-0} = Dm{3-0};
625 let Inst{5} = Dm{4};
626 let Inst{15-12} = Sd{4-1};
627 let Inst{22} = Sd{0};
628}
629
630class AVConv1InsS_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
631 bits<4> opcod4, dag oops, dag iops,
632 InstrItinClass itin, string opc, string asm,
633 list<dag> pattern>
634 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
635 pattern> {
636 // Instruction operands.
637 bits<5> Sd;
638 bits<5> Sm;
639
640 // Encode instruction operands.
641 let Inst{3-0} = Sm{4-1};
642 let Inst{5} = Sm{0};
643 let Inst{15-12} = Sd{4-1};
644 let Inst{22} = Sd{0};
645}
646
Evan Chenga8e29892007-01-19 07:51:42 +0000647// Always set Z bit in the instruction, i.e. "round towards zero" variants.
Bill Wendling67a704d2010-10-13 20:58:46 +0000648def VTOSIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
649 (outs SPR:$Sd), (ins DPR:$Dm),
650 IIC_fpCVTDI, "vcvt", ".s32.f64\t$Sd, $Dm",
651 [(set SPR:$Sd, (arm_ftosi (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000652 let Inst{7} = 1; // Z bit
653}
Evan Chenga8e29892007-01-19 07:51:42 +0000654
Bill Wendling67a704d2010-10-13 20:58:46 +0000655def VTOSIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
656 (outs SPR:$Sd), (ins SPR:$Sm),
657 IIC_fpCVTSI, "vcvt", ".s32.f32\t$Sd, $Sm",
658 [(set SPR:$Sd, (arm_ftosi SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000659 let Inst{7} = 1; // Z bit
660}
Evan Chenga8e29892007-01-19 07:51:42 +0000661
Bill Wendling67a704d2010-10-13 20:58:46 +0000662def VTOUIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
663 (outs SPR:$Sd), (ins DPR:$Dm),
664 IIC_fpCVTDI, "vcvt", ".u32.f64\t$Sd, $Dm",
665 [(set SPR:$Sd, (arm_ftoui (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000666 let Inst{7} = 1; // Z bit
667}
Evan Chenga8e29892007-01-19 07:51:42 +0000668
Bill Wendling67a704d2010-10-13 20:58:46 +0000669def VTOUIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
670 (outs SPR:$Sd), (ins SPR:$Sm),
671 IIC_fpCVTSI, "vcvt", ".u32.f32\t$Sd, $Sm",
672 [(set SPR:$Sd, (arm_ftoui SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000673 let Inst{7} = 1; // Z bit
674}
Evan Chenga8e29892007-01-19 07:51:42 +0000675
Johnny Chen15b423f2010-02-08 22:02:41 +0000676// And the Z bit '0' variants, i.e. use the rounding mode specified by FPSCR.
677// For disassembly only.
Nate Begemand1fb5832010-08-03 21:31:55 +0000678let Uses = [FPSCR] in {
Bill Wendling67a704d2010-10-13 20:58:46 +0000679// FIXME: Verify encoding after integrated assembler is working.
680def VTOSIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
681 (outs SPR:$Sd), (ins DPR:$Dm),
682 IIC_fpCVTDI, "vcvtr", ".s32.f64\t$Sd, $Dm",
683 [(set SPR:$Sd, (int_arm_vcvtr (f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000684 let Inst{7} = 0; // Z bit
685}
686
Bill Wendling67a704d2010-10-13 20:58:46 +0000687def VTOSIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
688 (outs SPR:$Sd), (ins SPR:$Sm),
689 IIC_fpCVTSI, "vcvtr", ".s32.f32\t$Sd, $Sm",
690 [(set SPR:$Sd, (int_arm_vcvtr SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000691 let Inst{7} = 0; // Z bit
692}
693
Bill Wendling67a704d2010-10-13 20:58:46 +0000694def VTOUIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
695 (outs SPR:$Sd), (ins DPR:$Dm),
696 IIC_fpCVTDI, "vcvtr", ".u32.f64\t$Sd, $Dm",
Bill Wendling88cf0382010-10-14 01:02:08 +0000697 [(set SPR:$Sd, (int_arm_vcvtru(f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000698 let Inst{7} = 0; // Z bit
699}
700
Bill Wendling67a704d2010-10-13 20:58:46 +0000701def VTOUIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
702 (outs SPR:$Sd), (ins SPR:$Sm),
703 IIC_fpCVTSI, "vcvtr", ".u32.f32\t$Sd, $Sm",
704 [(set SPR:$Sd, (int_arm_vcvtru SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000705 let Inst{7} = 0; // Z bit
706}
Nate Begemand1fb5832010-08-03 21:31:55 +0000707}
Johnny Chen15b423f2010-02-08 22:02:41 +0000708
Johnny Chen27bb8d02010-02-11 18:17:16 +0000709// Convert between floating-point and fixed-point
710// Data type for fixed-point naming convention:
711// S16 (U=0, sx=0) -> SH
712// U16 (U=1, sx=0) -> UH
713// S32 (U=0, sx=1) -> SL
714// U32 (U=1, sx=1) -> UL
715
716let Constraints = "$a = $dst" in {
717
718// FP to Fixed-Point:
719
Daniel Dunbar3bcd9f72010-08-11 04:46:13 +0000720let isCodeGenOnly = 1 in {
Johnny Chen27bb8d02010-02-11 18:17:16 +0000721def VTOSHS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 0,
722 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
723 IIC_fpCVTSI, "vcvt", ".s16.f32\t$dst, $a, $fbits",
724 [/* For disassembly only; pattern left blank */]>;
725
726def VTOUHS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 0,
727 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
728 IIC_fpCVTSI, "vcvt", ".u16.f32\t$dst, $a, $fbits",
729 [/* For disassembly only; pattern left blank */]>;
730
731def VTOSLS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 1,
732 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
733 IIC_fpCVTSI, "vcvt", ".s32.f32\t$dst, $a, $fbits",
734 [/* For disassembly only; pattern left blank */]>;
735
736def VTOULS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 1,
737 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
738 IIC_fpCVTSI, "vcvt", ".u32.f32\t$dst, $a, $fbits",
739 [/* For disassembly only; pattern left blank */]>;
740
741def VTOSHD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 0,
742 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
743 IIC_fpCVTDI, "vcvt", ".s16.f64\t$dst, $a, $fbits",
744 [/* For disassembly only; pattern left blank */]>;
745
746def VTOUHD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 0,
747 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
748 IIC_fpCVTDI, "vcvt", ".u16.f64\t$dst, $a, $fbits",
749 [/* For disassembly only; pattern left blank */]>;
750
751def VTOSLD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 1,
752 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
753 IIC_fpCVTDI, "vcvt", ".s32.f64\t$dst, $a, $fbits",
754 [/* For disassembly only; pattern left blank */]>;
755
756def VTOULD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 1,
757 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
758 IIC_fpCVTDI, "vcvt", ".u32.f64\t$dst, $a, $fbits",
759 [/* For disassembly only; pattern left blank */]>;
Bill Wendling88cf0382010-10-14 01:02:08 +0000760} // End of 'let isCodeGenOnly = 1 in'
Johnny Chen27bb8d02010-02-11 18:17:16 +0000761
762// Fixed-Point to FP:
763
Daniel Dunbar3bcd9f72010-08-11 04:46:13 +0000764let isCodeGenOnly = 1 in {
Johnny Chen27bb8d02010-02-11 18:17:16 +0000765def VSHTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 0,
766 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
767 IIC_fpCVTIS, "vcvt", ".f32.s16\t$dst, $a, $fbits",
768 [/* For disassembly only; pattern left blank */]>;
769
770def VUHTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 0,
771 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
772 IIC_fpCVTIS, "vcvt", ".f32.u16\t$dst, $a, $fbits",
773 [/* For disassembly only; pattern left blank */]>;
774
775def VSLTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 1,
776 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
777 IIC_fpCVTIS, "vcvt", ".f32.s32\t$dst, $a, $fbits",
778 [/* For disassembly only; pattern left blank */]>;
779
780def VULTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 1,
781 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
782 IIC_fpCVTIS, "vcvt", ".f32.u32\t$dst, $a, $fbits",
783 [/* For disassembly only; pattern left blank */]>;
784
785def VSHTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 0,
786 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
787 IIC_fpCVTID, "vcvt", ".f64.s16\t$dst, $a, $fbits",
788 [/* For disassembly only; pattern left blank */]>;
789
790def VUHTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 0,
791 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
792 IIC_fpCVTID, "vcvt", ".f64.u16\t$dst, $a, $fbits",
793 [/* For disassembly only; pattern left blank */]>;
794
795def VSLTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 1,
796 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
797 IIC_fpCVTID, "vcvt", ".f64.s32\t$dst, $a, $fbits",
798 [/* For disassembly only; pattern left blank */]>;
799
800def VULTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 1,
801 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
802 IIC_fpCVTID, "vcvt", ".f64.u32\t$dst, $a, $fbits",
803 [/* For disassembly only; pattern left blank */]>;
Bill Wendling88cf0382010-10-14 01:02:08 +0000804} // End of 'let isCodeGenOnly = 1 in'
Johnny Chen27bb8d02010-02-11 18:17:16 +0000805
806} // End of 'let Constraints = "$src = $dst" in'
807
Evan Chenga8e29892007-01-19 07:51:42 +0000808//===----------------------------------------------------------------------===//
809// FP FMA Operations.
810//
811
Bill Wendling88cf0382010-10-14 01:02:08 +0000812class ADbI_vmlX_Encode<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4,
813 dag oops, dag iops, InstrItinClass itin, string opc,
814 string asm, list<dag> pattern>
815 : ADbI_vmlX<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
816 // Instruction operands.
817 bits<5> Dd;
818 bits<5> Dn;
819 bits<5> Dm;
Evan Chenga8e29892007-01-19 07:51:42 +0000820
Bill Wendling88cf0382010-10-14 01:02:08 +0000821 // Encode instruction operands.
822 let Inst{19-16} = Dn{3-0};
823 let Inst{7} = Dn{4};
824 let Inst{15-12} = Dd{3-0};
825 let Inst{22} = Dd{4};
826 let Inst{3-0} = Dm{3-0};
827 let Inst{5} = Dm{4};
828}
Evan Chenga8e29892007-01-19 07:51:42 +0000829
Bill Wendling88cf0382010-10-14 01:02:08 +0000830def VMLAD : ADbI_vmlX_Encode<0b11100, 0b00, 0, 0,
831 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
832 IIC_fpMAC64, "vmla", ".f64\t$Dd, $Dn, $Dm",
833 [(set DPR:$Dd, (fadd (fmul DPR:$Dn, DPR:$Dm),
834 (f64 DPR:$Ddin)))]>,
835 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000836
Bill Wendling88cf0382010-10-14 01:02:08 +0000837def VMLAS : ASbIn_Encode<0b11100, 0b00, 0, 0,
838 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
839 IIC_fpMAC32, "vmla", ".f32\t$Sd, $Sn, $Sm",
840 [(set SPR:$Sd, (fadd (fmul SPR:$Sn, SPR:$Sm),
841 SPR:$Sdin))]>,
842 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000843
Bill Wendling88cf0382010-10-14 01:02:08 +0000844def : Pat<(fadd DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
845 (VMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
846def : Pat<(fadd SPR:$dstin, (fmul SPR:$a, SPR:$b)),
847 (VMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000848
Bill Wendling88cf0382010-10-14 01:02:08 +0000849def VMLSD : ADbI_vmlX_Encode<0b11100, 0b00, 1, 0,
850 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
851 IIC_fpMAC64, "vmls", ".f64\t$Dd, $Dn, $Dm",
852 [(set DPR:$Dd, (fadd (fneg (fmul DPR:$Dn,DPR:$Dm)),
853 (f64 DPR:$Ddin)))]>,
854 RegConstraint<"$Ddin = $Dd">;
855
856def VMLSS : ASbIn_Encode<0b11100, 0b00, 1, 0,
857 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
858 IIC_fpMAC32, "vmls", ".f32\t$Sd, $Sn, $Sm",
859 [(set SPR:$Sd, (fadd (fneg (fmul SPR:$Sn, SPR:$Sm)),
860 SPR:$Sdin))]>,
861 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000862
Chris Lattnerd10a53d2010-03-08 18:51:21 +0000863def : Pat<(fsub DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
Jim Grosbache5165492009-11-09 00:11:35 +0000864 (VMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000865def : Pat<(fsub SPR:$dstin, (fmul SPR:$a, SPR:$b)),
Jim Grosbache5165492009-11-09 00:11:35 +0000866 (VMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000867
Bill Wendling88cf0382010-10-14 01:02:08 +0000868def VNMLAD : ADbI_vmlX_Encode<0b11100, 0b01, 1, 0,
869 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
870 IIC_fpMAC64, "vnmla", ".f64\t$Dd, $Dn, $Dm",
871 [(set DPR:$Dd,(fsub (fneg (fmul DPR:$Dn,DPR:$Dm)),
872 (f64 DPR:$Ddin)))]>,
873 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000874
Bill Wendling88cf0382010-10-14 01:02:08 +0000875def VNMLAS : ASbI_Encode<0b11100, 0b01, 1, 0,
876 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
877 IIC_fpMAC32, "vnmla", ".f32\t$Sd, $Sn, $Sm",
878 [(set SPR:$Sd, (fsub (fneg (fmul SPR:$Sn, SPR:$Sm)),
879 SPR:$Sdin))]>,
880 RegConstraint<"$Sdin = $Sd">;
881
882def : Pat<(fsub (fneg (fmul DPR:$a, (f64 DPR:$b))), DPR:$dstin),
883 (VNMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
884def : Pat<(fsub (fneg (fmul SPR:$a, SPR:$b)), SPR:$dstin),
885 (VNMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
886
887def VNMLSD : ADbI_vmlX_Encode<0b11100, 0b01, 0, 0,
888 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
889 IIC_fpMAC64, "vnmls", ".f64\t$Dd, $Dn, $Dm",
890 [(set DPR:$Dd, (fsub (fmul DPR:$Dn, DPR:$Dm),
891 (f64 DPR:$Ddin)))]>,
892 RegConstraint<"$Ddin = $Dd">;
893
894def VNMLSS : ASbI_Encode<0b11100, 0b01, 0, 0,
895 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
896 IIC_fpMAC32, "vnmls", ".f32\t$Sd, $Sn, $Sm",
897 [(set SPR:$Sd, (fsub (fmul SPR:$Sn, SPR:$Sm),
898 SPR:$Sdin))]>,
899 RegConstraint<"$Sdin = $Sd">;
900
901def : Pat<(fsub (fmul DPR:$a, (f64 DPR:$b)), DPR:$dstin),
902 (VNMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
903def : Pat<(fsub (fmul SPR:$a, SPR:$b), SPR:$dstin),
904 (VNMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
905
Evan Chenga8e29892007-01-19 07:51:42 +0000906
907//===----------------------------------------------------------------------===//
908// FP Conditional moves.
909//
910
Evan Cheng020cc1b2010-05-13 00:16:46 +0000911let neverHasSideEffects = 1 in {
Bill Wendling7d31a162010-10-20 22:44:54 +0000912def VMOVDcc : ADuI_Encode<0b11101, 0b11, 0b0000, 0b01, 0,
913 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
914 IIC_fpUNA64, "vmov", ".f64\t$Dd, $Dm",
915 [/*(set DPR:$Dd, (ARMcmov DPR:$Dn, DPR:$Dm, imm:$cc))*/]>,
916 RegConstraint<"$Dn = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000917
Bill Wendling7d31a162010-10-20 22:44:54 +0000918def VMOVScc : ASuI_Encode<0b11101, 0b11, 0b0000, 0b01, 0,
919 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
920 IIC_fpUNA32, "vmov", ".f32\t$Sd, $Sm",
921 [/*(set SPR:$Sd, (ARMcmov SPR:$Sn, SPR:$Sm, imm:$cc))*/]>,
922 RegConstraint<"$Sn = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000923
Bill Wendling7d31a162010-10-20 22:44:54 +0000924def VNEGDcc : ADuI_Encode<0b11101, 0b11, 0b0001, 0b01, 0,
925 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
926 IIC_fpUNA64, "vneg", ".f64\t$Dd, $Dm",
927 [/*(set DPR:$Dd, (ARMcneg DPR:$Dn, DPR:$Dm, imm:$cc))*/]>,
928 RegConstraint<"$Dn = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000929
Bill Wendling7d31a162010-10-20 22:44:54 +0000930def VNEGScc : ASuI_Encode<0b11101, 0b11, 0b0001, 0b01, 0,
931 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
932 IIC_fpUNA32, "vneg", ".f32\t$Sd, $Sm",
933 [/*(set SPR:$Sd, (ARMcneg SPR:$Sn, SPR:$Sm, imm:$cc))*/]>,
934 RegConstraint<"$Sn = $Sd">;
Evan Cheng020cc1b2010-05-13 00:16:46 +0000935} // neverHasSideEffects
Evan Cheng78be83d2008-11-11 19:40:26 +0000936
937//===----------------------------------------------------------------------===//
938// Misc.
939//
940
Evan Cheng1e13c792009-11-10 19:44:56 +0000941// APSR is the application level alias of CPSR. This FPSCR N, Z, C, V flags
942// to APSR.
Evan Cheng91449a82009-07-20 02:12:31 +0000943let Defs = [CPSR], Uses = [FPSCR] in
Jim Grosbache5165492009-11-09 00:11:35 +0000944def FMSTAT : VFPAI<(outs), (ins), VFPMiscFrm, IIC_fpSTAT, "vmrs",
Jim Grosbachf4cbc0e2009-11-13 01:17:22 +0000945 "\tapsr_nzcv, fpscr",
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000946 [(arm_fmstat)]> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000947 let Inst{27-20} = 0b11101111;
948 let Inst{19-16} = 0b0001;
949 let Inst{15-12} = 0b1111;
950 let Inst{11-8} = 0b1010;
951 let Inst{7} = 0;
Bill Wendling946a2742010-10-14 01:19:34 +0000952 let Inst{6-5} = 0b00;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000953 let Inst{4} = 1;
Bill Wendling946a2742010-10-14 01:19:34 +0000954 let Inst{3-0} = 0b0000;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000955}
Evan Cheng39382422009-10-28 01:44:26 +0000956
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000957// FPSCR <-> GPR
Nate Begemand1fb5832010-08-03 21:31:55 +0000958let hasSideEffects = 1, Uses = [FPSCR] in
Bill Wendling88cf0382010-10-14 01:02:08 +0000959def VMRS : VFPAI<(outs GPR:$Rt), (ins), VFPMiscFrm, IIC_fpSTAT,
960 "vmrs", "\t$Rt, fpscr",
961 [(set GPR:$Rt, (int_arm_get_fpscr))]> {
962 // Instruction operand.
963 bits<4> Rt;
964
965 // Encode instruction operand.
966 let Inst{15-12} = Rt;
967
Johnny Chenc9745042010-02-09 22:35:38 +0000968 let Inst{27-20} = 0b11101111;
969 let Inst{19-16} = 0b0001;
970 let Inst{11-8} = 0b1010;
971 let Inst{7} = 0;
Bill Wendling88cf0382010-10-14 01:02:08 +0000972 let Inst{6-5} = 0b00;
Johnny Chenc9745042010-02-09 22:35:38 +0000973 let Inst{4} = 1;
Bill Wendling88cf0382010-10-14 01:02:08 +0000974 let Inst{3-0} = 0b0000;
Johnny Chenc9745042010-02-09 22:35:38 +0000975}
Johnny Chenc9745042010-02-09 22:35:38 +0000976
Nate Begemand1fb5832010-08-03 21:31:55 +0000977let Defs = [FPSCR] in
978def VMSR : VFPAI<(outs), (ins GPR:$src), VFPMiscFrm, IIC_fpSTAT,
979 "vmsr", "\tfpscr, $src",
Bill Wendling88cf0382010-10-14 01:02:08 +0000980 [(int_arm_set_fpscr GPR:$src)]> {
981 // Instruction operand.
982 bits<4> src;
983
984 // Encode instruction operand.
985 let Inst{15-12} = src;
986
Johnny Chenc9745042010-02-09 22:35:38 +0000987 let Inst{27-20} = 0b11101110;
988 let Inst{19-16} = 0b0001;
989 let Inst{11-8} = 0b1010;
990 let Inst{7} = 0;
991 let Inst{4} = 1;
992}
Evan Cheng39382422009-10-28 01:44:26 +0000993
994// Materialize FP immediates. VFP3 only.
Jim Grosbache5165492009-11-09 00:11:35 +0000995let isReMaterializable = 1 in {
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000996def FCONSTD : VFPAI<(outs DPR:$Dd), (ins vfp_f64imm:$imm),
Anton Korobeynikov63401e32010-04-07 18:19:56 +0000997 VFPMiscFrm, IIC_fpUNA64,
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000998 "vmov", ".f64\t$Dd, $imm",
999 [(set DPR:$Dd, vfp_f64imm:$imm)]>, Requires<[HasVFP3]> {
1000 // Instruction operands.
1001 bits<5> Dd;
1002 bits<32> imm;
1003
1004 // Encode instruction operands.
1005 let Inst{15-12} = Dd{3-0};
1006 let Inst{22} = Dd{4};
1007 let Inst{19} = imm{31};
1008 let Inst{18-16} = imm{22-20};
1009 let Inst{3-0} = imm{19-16};
1010
1011 // Encode remaining instruction bits.
Jim Grosbache5165492009-11-09 00:11:35 +00001012 let Inst{27-23} = 0b11101;
1013 let Inst{21-20} = 0b11;
1014 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +00001015 let Inst{8} = 1; // Double precision.
Jim Grosbache5165492009-11-09 00:11:35 +00001016 let Inst{7-4} = 0b0000;
1017}
1018
Bill Wendlingbbbdcd42010-10-14 02:33:26 +00001019def FCONSTS : VFPAI<(outs SPR:$Sd), (ins vfp_f32imm:$imm),
1020 VFPMiscFrm, IIC_fpUNA32,
1021 "vmov", ".f32\t$Sd, $imm",
1022 [(set SPR:$Sd, vfp_f32imm:$imm)]>, Requires<[HasVFP3]> {
1023 // Instruction operands.
1024 bits<5> Sd;
1025 bits<32> imm;
1026
1027 // Encode instruction operands.
1028 let Inst{15-12} = Sd{4-1};
1029 let Inst{22} = Sd{0};
1030 let Inst{19} = imm{31}; // The immediate is handled as a double.
1031 let Inst{18-16} = imm{22-20};
1032 let Inst{3-0} = imm{19-16};
1033
1034 // Encode remaining instruction bits.
Evan Cheng39382422009-10-28 01:44:26 +00001035 let Inst{27-23} = 0b11101;
1036 let Inst{21-20} = 0b11;
1037 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +00001038 let Inst{8} = 0; // Single precision.
Evan Cheng39382422009-10-28 01:44:26 +00001039 let Inst{7-4} = 0b0000;
1040}
Evan Cheng39382422009-10-28 01:44:26 +00001041}