blob: 34a794066ccbc076af170f3caee1420d5e6b15c3 [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
Chris Lattner39ee0362010-10-31 19:10:56 +000075let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1,
76 isCodeGenOnly = 1 in {
Jim Grosbach72db1822010-09-08 00:25:50 +000077def VLDMD : AXDI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$dsts,
Evan Cheng5a50cee2010-10-07 01:50:48 +000078 variable_ops), IndexModeNone, IIC_fpLoad_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +000079 "vldm${addr:submode}${p}\t$addr, $dsts", "", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +000080 let Inst{20} = 1;
81}
Evan Chenga8e29892007-01-19 07:51:42 +000082
Jim Grosbach72db1822010-09-08 00:25:50 +000083def VLDMS : AXSI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$dsts,
Evan Cheng5a50cee2010-10-07 01:50:48 +000084 variable_ops), IndexModeNone, IIC_fpLoad_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +000085 "vldm${addr:submode}${p}\t$addr, $dsts", "", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +000086 let Inst{20} = 1;
87}
88
Jim Grosbach72db1822010-09-08 00:25:50 +000089def VLDMD_UPD : AXDI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +000090 reglist:$dsts, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +000091 IndexModeUpd, IIC_fpLoad_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +000092 "vldm${addr:submode}${p}\t$addr!, $dsts",
93 "$addr.addr = $wb", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +000094 let Inst{20} = 1;
95}
96
Jim Grosbach72db1822010-09-08 00:25:50 +000097def VLDMS_UPD : AXSI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +000098 reglist:$dsts, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +000099 IndexModeUpd, IIC_fpLoad_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000100 "vldm${addr:submode}${p}\t$addr!, $dsts",
101 "$addr.addr = $wb", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000102 let Inst{20} = 1;
103}
Evan Cheng5fd1c9b2010-05-19 06:07:03 +0000104} // mayLoad, neverHasSideEffects, hasExtraDefRegAllocReq
Evan Chenga8e29892007-01-19 07:51:42 +0000105
Chris Lattner39ee0362010-10-31 19:10:56 +0000106let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1,
107 isCodeGenOnly = 1 in {
Jim Grosbach72db1822010-09-08 00:25:50 +0000108def VSTMD : AXDI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$srcs,
Evan Cheng5a50cee2010-10-07 01:50:48 +0000109 variable_ops), IndexModeNone, IIC_fpStore_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000110 "vstm${addr:submode}${p}\t$addr, $srcs", "", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000111 let Inst{20} = 0;
112}
Evan Chenga8e29892007-01-19 07:51:42 +0000113
Jim Grosbach72db1822010-09-08 00:25:50 +0000114def VSTMS : AXSI4<(outs), (ins addrmode4:$addr, pred:$p, reglist:$srcs,
Evan Cheng5a50cee2010-10-07 01:50:48 +0000115 variable_ops), IndexModeNone, IIC_fpStore_m,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000116 "vstm${addr:submode}${p}\t$addr, $srcs", "", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +0000117 let Inst{20} = 0;
118}
119
Jim Grosbach72db1822010-09-08 00:25:50 +0000120def VSTMD_UPD : AXDI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +0000121 reglist:$srcs, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +0000122 IndexModeUpd, IIC_fpStore_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000123 "vstm${addr:submode}${p}\t$addr!, $srcs",
124 "$addr.addr = $wb", []> {
Bob Wilson815baeb2010-03-13 01:08:20 +0000125 let Inst{20} = 0;
126}
127
Jim Grosbach72db1822010-09-08 00:25:50 +0000128def VSTMS_UPD : AXSI4<(outs GPR:$wb), (ins addrmode4:$addr, pred:$p,
Bob Wilson815baeb2010-03-13 01:08:20 +0000129 reglist:$srcs, variable_ops),
Evan Cheng5a50cee2010-10-07 01:50:48 +0000130 IndexModeUpd, IIC_fpStore_mu,
Bob Wilsond4bfd542010-08-27 23:18:17 +0000131 "vstm${addr:submode}${p}\t$addr!, $srcs",
132 "$addr.addr = $wb", []> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000133 let Inst{20} = 0;
134}
Evan Cheng5fd1c9b2010-05-19 06:07:03 +0000135} // mayStore, neverHasSideEffects, hasExtraSrcRegAllocReq
Evan Chenga8e29892007-01-19 07:51:42 +0000136
137// FLDMX, FSTMX - mixing S/D registers for pre-armv6 cores
138
139//===----------------------------------------------------------------------===//
140// FP Binary Operations.
141//
142
Bill Wendling69661192010-11-01 06:00:39 +0000143def VADDD : ADbI<0b11100, 0b11, 0, 0,
144 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
145 IIC_fpALU64, "vadd", ".f64\t$Dd, $Dn, $Dm",
146 [(set DPR:$Dd, (fadd DPR:$Dn, (f64 DPR:$Dm)))]>;
Bill Wendling174777b2010-10-12 22:08:41 +0000147
Bill Wendling69661192010-11-01 06:00:39 +0000148def VADDS : ASbIn<0b11100, 0b11, 0, 0,
149 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
150 IIC_fpALU32, "vadd", ".f32\t$Sd, $Sn, $Sm",
151 [(set SPR:$Sd, (fadd SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000152
Bill Wendling69661192010-11-01 06:00:39 +0000153def VSUBD : ADbI<0b11100, 0b11, 1, 0,
154 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
155 IIC_fpALU64, "vsub", ".f64\t$Dd, $Dn, $Dm",
156 [(set DPR:$Dd, (fsub DPR:$Dn, (f64 DPR:$Dm)))]>;
Jim Grosbach499e8862010-10-12 21:22:40 +0000157
Bill Wendling69661192010-11-01 06:00:39 +0000158def VSUBS : ASbIn<0b11100, 0b11, 1, 0,
159 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
160 IIC_fpALU32, "vsub", ".f32\t$Sd, $Sn, $Sm",
161 [(set SPR:$Sd, (fsub SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000162
Bill Wendling69661192010-11-01 06:00:39 +0000163def VDIVD : ADbI<0b11101, 0b00, 0, 0,
164 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
165 IIC_fpDIV64, "vdiv", ".f64\t$Dd, $Dn, $Dm",
166 [(set DPR:$Dd, (fdiv DPR:$Dn, (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000167
Bill Wendling69661192010-11-01 06:00:39 +0000168def VDIVS : ASbI<0b11101, 0b00, 0, 0,
169 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
170 IIC_fpDIV32, "vdiv", ".f32\t$Sd, $Sn, $Sm",
171 [(set SPR:$Sd, (fdiv SPR:$Sn, SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000172
Bill Wendling69661192010-11-01 06:00:39 +0000173def VMULD : ADbI<0b11100, 0b10, 0, 0,
174 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
175 IIC_fpMUL64, "vmul", ".f64\t$Dd, $Dn, $Dm",
176 [(set DPR:$Dd, (fmul DPR:$Dn, (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000177
Bill Wendling69661192010-11-01 06:00:39 +0000178def VMULS : ASbIn<0b11100, 0b10, 0, 0,
179 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
180 IIC_fpMUL32, "vmul", ".f32\t$Sd, $Sn, $Sm",
181 [(set SPR:$Sd, (fmul SPR:$Sn, SPR:$Sm))]>;
Jim Grosbache5165492009-11-09 00:11:35 +0000182
Bill Wendling69661192010-11-01 06:00:39 +0000183def VNMULD : ADbI<0b11100, 0b10, 1, 0,
184 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
185 IIC_fpMUL64, "vnmul", ".f64\t$Dd, $Dn, $Dm",
186 [(set DPR:$Dd, (fneg (fmul DPR:$Dn, (f64 DPR:$Dm))))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000187
Bill Wendling69661192010-11-01 06:00:39 +0000188def VNMULS : ASbI<0b11100, 0b10, 1, 0,
189 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
190 IIC_fpMUL32, "vnmul", ".f32\t$Sd, $Sn, $Sm",
191 [(set SPR:$Sd, (fneg (fmul SPR:$Sn, SPR:$Sm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000192
Chris Lattner72939122007-05-03 00:32:00 +0000193// Match reassociated forms only if not sign dependent rounding.
Chris Lattnerd10a53d2010-03-08 18:51:21 +0000194def : Pat<(fmul (fneg DPR:$a), (f64 DPR:$b)),
Jim Grosbache5165492009-11-09 00:11:35 +0000195 (VNMULD DPR:$a, DPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
Chris Lattner72939122007-05-03 00:32:00 +0000196def : Pat<(fmul (fneg SPR:$a), SPR:$b),
Jim Grosbache5165492009-11-09 00:11:35 +0000197 (VNMULS SPR:$a, SPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
Chris Lattner72939122007-05-03 00:32:00 +0000198
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000199// These are encoded as unary instructions.
200let Defs = [FPSCR] in {
Bill Wendling69661192010-11-01 06:00:39 +0000201def VCMPED : ADuI<0b11101, 0b11, 0b0100, 0b11, 0,
202 (outs), (ins DPR:$Dd, DPR:$Dm),
203 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, $Dm",
204 [(arm_cmpfp DPR:$Dd, (f64 DPR:$Dm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000205
Bill Wendling69661192010-11-01 06:00:39 +0000206def VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0,
207 (outs), (ins SPR:$Sd, SPR:$Sm),
208 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, $Sm",
209 [(arm_cmpfp SPR:$Sd, SPR:$Sm)]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000210
Bill Wendling67a704d2010-10-13 20:58:46 +0000211// FIXME: Verify encoding after integrated assembler is working.
Bill Wendling69661192010-11-01 06:00:39 +0000212def VCMPD : ADuI<0b11101, 0b11, 0b0100, 0b01, 0,
213 (outs), (ins DPR:$Dd, DPR:$Dm),
214 IIC_fpCMP64, "vcmp", ".f64\t$Dd, $Dm",
215 [/* For disassembly only; pattern left blank */]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000216
Bill Wendling69661192010-11-01 06:00:39 +0000217def VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0,
218 (outs), (ins SPR:$Sd, SPR:$Sm),
219 IIC_fpCMP32, "vcmp", ".f32\t$Sd, $Sm",
220 [/* For disassembly only; pattern left blank */]>;
Bill Wendlingdd3bc112010-10-12 22:55:35 +0000221}
Evan Chenga8e29892007-01-19 07:51:42 +0000222
223//===----------------------------------------------------------------------===//
224// FP Unary Operations.
225//
226
Bill Wendling69661192010-11-01 06:00:39 +0000227def VABSD : ADuI<0b11101, 0b11, 0b0000, 0b11, 0,
228 (outs DPR:$Dd), (ins DPR:$Dm),
229 IIC_fpUNA64, "vabs", ".f64\t$Dd, $Dm",
230 [(set DPR:$Dd, (fabs (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000231
Bill Wendling69661192010-11-01 06:00:39 +0000232def VABSS : ASuIn<0b11101, 0b11, 0b0000, 0b11, 0,
233 (outs SPR:$Sd), (ins SPR:$Sm),
234 IIC_fpUNA32, "vabs", ".f32\t$Sd, $Sm",
235 [(set SPR:$Sd, (fabs SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000236
Evan Cheng91449a82009-07-20 02:12:31 +0000237let Defs = [FPSCR] in {
Bill Wendling69661192010-11-01 06:00:39 +0000238def VCMPEZD : ADuI<0b11101, 0b11, 0b0101, 0b11, 0,
239 (outs), (ins DPR:$Dd),
240 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, #0",
241 [(arm_cmpfp0 (f64 DPR:$Dd))]> {
242 let Inst{3-0} = 0b0000;
243 let Inst{5} = 0;
Bill Wendling1fc6d882010-10-13 00:38:07 +0000244}
245
Bill Wendling69661192010-11-01 06:00:39 +0000246def VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0,
247 (outs), (ins SPR:$Sd),
248 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, #0",
249 [(arm_cmpfp0 SPR:$Sd)]> {
250 let Inst{3-0} = 0b0000;
251 let Inst{5} = 0;
Bill Wendling1fc6d882010-10-13 00:38:07 +0000252}
Evan Chenga8e29892007-01-19 07:51:42 +0000253
Bill Wendling67a704d2010-10-13 20:58:46 +0000254// FIXME: Verify encoding after integrated assembler is working.
Bill Wendling69661192010-11-01 06:00:39 +0000255def VCMPZD : ADuI<0b11101, 0b11, 0b0101, 0b01, 0,
256 (outs), (ins DPR:$Dd),
257 IIC_fpCMP64, "vcmp", ".f64\t$Dd, #0",
258 [/* For disassembly only; pattern left blank */]> {
259 let Inst{3-0} = 0b0000;
260 let Inst{5} = 0;
Bill Wendling67a704d2010-10-13 20:58:46 +0000261}
Johnny Chen7edd8e32010-02-08 19:41:48 +0000262
Bill Wendling69661192010-11-01 06:00:39 +0000263def VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0,
264 (outs), (ins SPR:$Sd),
265 IIC_fpCMP32, "vcmp", ".f32\t$Sd, #0",
266 [/* For disassembly only; pattern left blank */]> {
267 let Inst{3-0} = 0b0000;
268 let Inst{5} = 0;
Bill Wendling67a704d2010-10-13 20:58:46 +0000269}
Evan Cheng91449a82009-07-20 02:12:31 +0000270}
Evan Chenga8e29892007-01-19 07:51:42 +0000271
Bill Wendling54908dd2010-10-13 00:56:35 +0000272def VCVTDS : ASuI<0b11101, 0b11, 0b0111, 0b11, 0,
273 (outs DPR:$Dd), (ins SPR:$Sm),
274 IIC_fpCVTDS, "vcvt", ".f64.f32\t$Dd, $Sm",
275 [(set DPR:$Dd, (fextend SPR:$Sm))]> {
276 // Instruction operands.
277 bits<5> Dd;
278 bits<5> Sm;
279
280 // Encode instruction operands.
281 let Inst{3-0} = Sm{4-1};
282 let Inst{5} = Sm{0};
283 let Inst{15-12} = Dd{3-0};
284 let Inst{22} = Dd{4};
285}
Evan Chenga8e29892007-01-19 07:51:42 +0000286
Evan Cheng96581d32008-11-11 02:11:05 +0000287// Special case encoding: bits 11-8 is 0b1011.
Bill Wendling54908dd2010-10-13 00:56:35 +0000288def VCVTSD : VFPAI<(outs SPR:$Sd), (ins DPR:$Dm), VFPUnaryFrm,
289 IIC_fpCVTSD, "vcvt", ".f32.f64\t$Sd, $Dm",
290 [(set SPR:$Sd, (fround DPR:$Dm))]> {
291 // Instruction operands.
292 bits<5> Sd;
293 bits<5> Dm;
294
295 // Encode instruction operands.
296 let Inst{3-0} = Dm{3-0};
297 let Inst{5} = Dm{4};
298 let Inst{15-12} = Sd{4-1};
299 let Inst{22} = Sd{0};
300
Evan Cheng96581d32008-11-11 02:11:05 +0000301 let Inst{27-23} = 0b11101;
302 let Inst{21-16} = 0b110111;
303 let Inst{11-8} = 0b1011;
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000304 let Inst{7-6} = 0b11;
305 let Inst{4} = 0;
Evan Cheng96581d32008-11-11 02:11:05 +0000306}
Evan Chenga8e29892007-01-19 07:51:42 +0000307
Johnny Chen2d658df2010-02-09 17:21:56 +0000308// Between half-precision and single-precision. For disassembly only.
309
Bill Wendling67a704d2010-10-13 20:58:46 +0000310// FIXME: Verify encoding after integrated assembler is working.
Jim Grosbach18f30e62010-06-02 21:53:11 +0000311def VCVTBSH: ASuI<0b11101, 0b11, 0b0010, 0b01, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000312 /* FIXME */ IIC_fpCVTSH, "vcvtb", ".f32.f16\t$dst, $a",
Anton Korobeynikovf0d50072010-03-18 22:35:37 +0000313 [/* For disassembly only; pattern left blank */]>;
314
Bob Wilson76a312b2010-03-19 22:51:32 +0000315def : ARMPat<(f32_to_f16 SPR:$a),
316 (i32 (COPY_TO_REGCLASS (VCVTBSH SPR:$a), GPR))>;
Johnny Chen2d658df2010-02-09 17:21:56 +0000317
Jim Grosbach18f30e62010-06-02 21:53:11 +0000318def VCVTBHS: ASuI<0b11101, 0b11, 0b0011, 0b01, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000319 /* FIXME */ IIC_fpCVTHS, "vcvtb", ".f16.f32\t$dst, $a",
Anton Korobeynikovf0d50072010-03-18 22:35:37 +0000320 [/* For disassembly only; pattern left blank */]>;
321
Bob Wilson76a312b2010-03-19 22:51:32 +0000322def : ARMPat<(f16_to_f32 GPR:$a),
323 (VCVTBHS (COPY_TO_REGCLASS GPR:$a, SPR))>;
Johnny Chen2d658df2010-02-09 17:21:56 +0000324
Jim Grosbach18f30e62010-06-02 21:53:11 +0000325def VCVTTSH: ASuI<0b11101, 0b11, 0b0010, 0b11, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000326 /* FIXME */ IIC_fpCVTSH, "vcvtt", ".f32.f16\t$dst, $a",
Johnny Chen2d658df2010-02-09 17:21:56 +0000327 [/* For disassembly only; pattern left blank */]>;
328
Jim Grosbach18f30e62010-06-02 21:53:11 +0000329def VCVTTHS: ASuI<0b11101, 0b11, 0b0011, 0b11, 0, (outs SPR:$dst), (ins SPR:$a),
Anton Korobeynikovc492e092010-04-07 18:19:46 +0000330 /* FIXME */ IIC_fpCVTHS, "vcvtt", ".f16.f32\t$dst, $a",
Johnny Chen2d658df2010-02-09 17:21:56 +0000331 [/* For disassembly only; pattern left blank */]>;
332
Bill Wendling69661192010-11-01 06:00:39 +0000333def VNEGD : ADuI<0b11101, 0b11, 0b0001, 0b01, 0,
334 (outs DPR:$Dd), (ins DPR:$Dm),
335 IIC_fpUNA64, "vneg", ".f64\t$Dd, $Dm",
336 [(set DPR:$Dd, (fneg (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000337
Bill Wendling69661192010-11-01 06:00:39 +0000338def VNEGS : ASuIn<0b11101, 0b11, 0b0001, 0b01, 0,
339 (outs SPR:$Sd), (ins SPR:$Sm),
340 IIC_fpUNA32, "vneg", ".f32\t$Sd, $Sm",
341 [(set SPR:$Sd, (fneg SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000342
Bill Wendling69661192010-11-01 06:00:39 +0000343def VSQRTD : ADuI<0b11101, 0b11, 0b0001, 0b11, 0,
344 (outs DPR:$Dd), (ins DPR:$Dm),
345 IIC_fpSQRT64, "vsqrt", ".f64\t$Dd, $Dm",
346 [(set DPR:$Dd, (fsqrt (f64 DPR:$Dm)))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000347
Bill Wendling69661192010-11-01 06:00:39 +0000348def VSQRTS : ASuI<0b11101, 0b11, 0b0001, 0b11, 0,
349 (outs SPR:$Sd), (ins SPR:$Sm),
350 IIC_fpSQRT32, "vsqrt", ".f32\t$Sd, $Sm",
351 [(set SPR:$Sd, (fsqrt SPR:$Sm))]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000352
Bill Wendling67a704d2010-10-13 20:58:46 +0000353let neverHasSideEffects = 1 in {
Bill Wendling69661192010-11-01 06:00:39 +0000354def VMOVD : ADuI<0b11101, 0b11, 0b0000, 0b01, 0,
355 (outs DPR:$Dd), (ins DPR:$Dm),
356 IIC_fpUNA64, "vmov", ".f64\t$Dd, $Dm", []>;
Bill Wendling67a704d2010-10-13 20:58:46 +0000357
Bill Wendling69661192010-11-01 06:00:39 +0000358def VMOVS : ASuI<0b11101, 0b11, 0b0000, 0b01, 0,
359 (outs SPR:$Sd), (ins SPR:$Sm),
360 IIC_fpUNA32, "vmov", ".f32\t$Sd, $Sm", []>;
Bill Wendling67a704d2010-10-13 20:58:46 +0000361} // neverHasSideEffects
362
Evan Chenga8e29892007-01-19 07:51:42 +0000363//===----------------------------------------------------------------------===//
364// FP <-> GPR Copies. Int <-> FP Conversions.
365//
366
Bill Wendling7d31a162010-10-20 22:44:54 +0000367def VMOVRS : AVConv2I<0b11100001, 0b1010,
368 (outs GPR:$Rt), (ins SPR:$Sn),
369 IIC_fpMOVSI, "vmov", "\t$Rt, $Sn",
370 [(set GPR:$Rt, (bitconvert SPR:$Sn))]> {
371 // Instruction operands.
372 bits<4> Rt;
373 bits<5> Sn;
Evan Chenga8e29892007-01-19 07:51:42 +0000374
Bill Wendling7d31a162010-10-20 22:44:54 +0000375 // Encode instruction operands.
376 let Inst{19-16} = Sn{4-1};
377 let Inst{7} = Sn{0};
378 let Inst{15-12} = Rt;
379
380 let Inst{6-5} = 0b00;
381 let Inst{3-0} = 0b0000;
382}
383
384def VMOVSR : AVConv4I<0b11100000, 0b1010,
385 (outs SPR:$Sn), (ins GPR:$Rt),
386 IIC_fpMOVIS, "vmov", "\t$Sn, $Rt",
387 [(set SPR:$Sn, (bitconvert GPR:$Rt))]> {
388 // Instruction operands.
389 bits<5> Sn;
390 bits<4> Rt;
391
392 // Encode instruction operands.
393 let Inst{19-16} = Sn{4-1};
394 let Inst{7} = Sn{0};
395 let Inst{15-12} = Rt;
396
397 let Inst{6-5} = 0b00;
398 let Inst{3-0} = 0b0000;
399}
Evan Chenga8e29892007-01-19 07:51:42 +0000400
Evan Cheng020cc1b2010-05-13 00:16:46 +0000401let neverHasSideEffects = 1 in {
Jim Grosbache5165492009-11-09 00:11:35 +0000402def VMOVRRD : AVConv3I<0b11000101, 0b1011,
Bill Wendling01aabda2010-10-20 23:37:40 +0000403 (outs GPR:$Rt, GPR:$Rt2), (ins DPR:$Dm),
404 IIC_fpMOVDI, "vmov", "\t$Rt, $Rt2, $Dm",
Johnny Chen7acca672010-02-05 18:04:58 +0000405 [/* FIXME: Can't write pattern for multiple result instr*/]> {
Bill Wendling01aabda2010-10-20 23:37:40 +0000406 // Instruction operands.
407 bits<5> Dm;
408 bits<4> Rt;
409 bits<4> Rt2;
410
411 // Encode instruction operands.
412 let Inst{3-0} = Dm{3-0};
413 let Inst{5} = Dm{4};
414 let Inst{15-12} = Rt;
415 let Inst{19-16} = Rt2;
416
Johnny Chen7acca672010-02-05 18:04:58 +0000417 let Inst{7-6} = 0b00;
418}
Evan Chenga8e29892007-01-19 07:51:42 +0000419
Johnny Chen23401d62010-02-08 17:26:09 +0000420def VMOVRRS : AVConv3I<0b11000101, 0b1010,
421 (outs GPR:$wb, GPR:$dst2), (ins SPR:$src1, SPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000422 IIC_fpMOVDI, "vmov", "\t$wb, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000423 [/* For disassembly only; pattern left blank */]> {
424 let Inst{7-6} = 0b00;
425}
Evan Cheng020cc1b2010-05-13 00:16:46 +0000426} // neverHasSideEffects
Johnny Chen23401d62010-02-08 17:26:09 +0000427
Evan Chenga8e29892007-01-19 07:51:42 +0000428// FMDHR: GPR -> SPR
429// FMDLR: GPR -> SPR
430
Jim Grosbache5165492009-11-09 00:11:35 +0000431def VMOVDRR : AVConv5I<0b11000100, 0b1011,
Bill Wendling01aabda2010-10-20 23:37:40 +0000432 (outs DPR:$Dm), (ins GPR:$Rt, GPR:$Rt2),
433 IIC_fpMOVID, "vmov", "\t$Dm, $Rt, $Rt2",
434 [(set DPR:$Dm, (arm_fmdrr GPR:$Rt, GPR:$Rt2))]> {
435 // Instruction operands.
436 bits<5> Dm;
437 bits<4> Rt;
438 bits<4> Rt2;
439
440 // Encode instruction operands.
441 let Inst{3-0} = Dm{3-0};
442 let Inst{5} = Dm{4};
443 let Inst{15-12} = Rt;
444 let Inst{19-16} = Rt2;
445
446 let Inst{7-6} = 0b00;
Johnny Chen7acca672010-02-05 18:04:58 +0000447}
Evan Chenga8e29892007-01-19 07:51:42 +0000448
Evan Cheng020cc1b2010-05-13 00:16:46 +0000449let neverHasSideEffects = 1 in
Johnny Chen23401d62010-02-08 17:26:09 +0000450def VMOVSRR : AVConv5I<0b11000100, 0b1010,
451 (outs SPR:$dst1, SPR:$dst2), (ins GPR:$src1, GPR:$src2),
Anton Korobeynikova31c6fb2010-04-07 18:20:02 +0000452 IIC_fpMOVID, "vmov", "\t$dst1, $dst2, $src1, $src2",
Johnny Chen23401d62010-02-08 17:26:09 +0000453 [/* For disassembly only; pattern left blank */]> {
454 let Inst{7-6} = 0b00;
455}
456
Evan Chenga8e29892007-01-19 07:51:42 +0000457// FMRDH: SPR -> GPR
458// FMRDL: SPR -> GPR
459// FMRRS: SPR -> GPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000460// FMRX: SPR system reg -> GPR
Evan Chenga8e29892007-01-19 07:51:42 +0000461// FMSRR: GPR -> SPR
Bill Wendling67a704d2010-10-13 20:58:46 +0000462// FMXR: GPR -> VFP system reg
Evan Chenga8e29892007-01-19 07:51:42 +0000463
464
Bill Wendling67a704d2010-10-13 20:58:46 +0000465// Int -> FP:
Evan Chenga8e29892007-01-19 07:51:42 +0000466
Bill Wendling67a704d2010-10-13 20:58:46 +0000467class AVConv1IDs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
468 bits<4> opcod4, dag oops, dag iops,
469 InstrItinClass itin, string opc, string asm,
470 list<dag> pattern>
471 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
472 pattern> {
473 // Instruction operands.
474 bits<5> Dd;
475 bits<5> Sm;
476
477 // Encode instruction operands.
478 let Inst{3-0} = Sm{4-1};
479 let Inst{5} = Sm{0};
480 let Inst{15-12} = Dd{3-0};
481 let Inst{22} = Dd{4};
482}
483
484class AVConv1InSs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
485 bits<4> opcod4, dag oops, dag iops,InstrItinClass itin,
486 string opc, string asm, list<dag> pattern>
487 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
488 pattern> {
489 // Instruction operands.
490 bits<5> Sd;
491 bits<5> Sm;
492
493 // Encode instruction operands.
494 let Inst{3-0} = Sm{4-1};
495 let Inst{5} = Sm{0};
496 let Inst{15-12} = Sd{4-1};
497 let Inst{22} = Sd{0};
498}
499
500def VSITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
501 (outs DPR:$Dd), (ins SPR:$Sm),
502 IIC_fpCVTID, "vcvt", ".f64.s32\t$Dd, $Sm",
503 [(set DPR:$Dd, (f64 (arm_sitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000504 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000505}
Evan Chenga8e29892007-01-19 07:51:42 +0000506
Bill Wendling67a704d2010-10-13 20:58:46 +0000507def VSITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
508 (outs SPR:$Sd),(ins SPR:$Sm),
509 IIC_fpCVTIS, "vcvt", ".f32.s32\t$Sd, $Sm",
510 [(set SPR:$Sd, (arm_sitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000511 let Inst{7} = 1; // s32
Evan Cheng78be83d2008-11-11 19:40:26 +0000512}
Evan Chenga8e29892007-01-19 07:51:42 +0000513
Bill Wendling67a704d2010-10-13 20:58:46 +0000514def VUITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,
515 (outs DPR:$Dd), (ins SPR:$Sm),
516 IIC_fpCVTID, "vcvt", ".f64.u32\t$Dd, $Sm",
517 [(set DPR:$Dd, (f64 (arm_uitof SPR:$Sm)))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000518 let Inst{7} = 0; // u32
519}
Evan Chenga8e29892007-01-19 07:51:42 +0000520
Bill Wendling67a704d2010-10-13 20:58:46 +0000521def VUITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,
522 (outs SPR:$Sd), (ins SPR:$Sm),
523 IIC_fpCVTIS, "vcvt", ".f32.u32\t$Sd, $Sm",
524 [(set SPR:$Sd, (arm_uitof SPR:$Sm))]> {
Johnny Chen69a8c7f2010-01-29 23:21:10 +0000525 let Inst{7} = 0; // u32
526}
Evan Chenga8e29892007-01-19 07:51:42 +0000527
Bill Wendling67a704d2010-10-13 20:58:46 +0000528// FP -> Int:
529
530class AVConv1IsD_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
531 bits<4> opcod4, dag oops, dag iops,
532 InstrItinClass itin, string opc, string asm,
533 list<dag> pattern>
534 : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
535 pattern> {
536 // Instruction operands.
537 bits<5> Sd;
538 bits<5> Dm;
539
540 // Encode instruction operands.
541 let Inst{3-0} = Dm{3-0};
542 let Inst{5} = Dm{4};
543 let Inst{15-12} = Sd{4-1};
544 let Inst{22} = Sd{0};
545}
546
547class AVConv1InsS_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3,
548 bits<4> opcod4, dag oops, dag iops,
549 InstrItinClass itin, string opc, string asm,
550 list<dag> pattern>
551 : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
552 pattern> {
553 // Instruction operands.
554 bits<5> Sd;
555 bits<5> Sm;
556
557 // Encode instruction operands.
558 let Inst{3-0} = Sm{4-1};
559 let Inst{5} = Sm{0};
560 let Inst{15-12} = Sd{4-1};
561 let Inst{22} = Sd{0};
562}
563
Evan Chenga8e29892007-01-19 07:51:42 +0000564// Always set Z bit in the instruction, i.e. "round towards zero" variants.
Bill Wendling67a704d2010-10-13 20:58:46 +0000565def VTOSIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
566 (outs SPR:$Sd), (ins DPR:$Dm),
567 IIC_fpCVTDI, "vcvt", ".s32.f64\t$Sd, $Dm",
568 [(set SPR:$Sd, (arm_ftosi (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000569 let Inst{7} = 1; // Z bit
570}
Evan Chenga8e29892007-01-19 07:51:42 +0000571
Bill Wendling67a704d2010-10-13 20:58:46 +0000572def VTOSIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
573 (outs SPR:$Sd), (ins SPR:$Sm),
574 IIC_fpCVTSI, "vcvt", ".s32.f32\t$Sd, $Sm",
575 [(set SPR:$Sd, (arm_ftosi SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000576 let Inst{7} = 1; // Z bit
577}
Evan Chenga8e29892007-01-19 07:51:42 +0000578
Bill Wendling67a704d2010-10-13 20:58:46 +0000579def VTOUIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
580 (outs SPR:$Sd), (ins DPR:$Dm),
581 IIC_fpCVTDI, "vcvt", ".u32.f64\t$Sd, $Dm",
582 [(set SPR:$Sd, (arm_ftoui (f64 DPR:$Dm)))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000583 let Inst{7} = 1; // Z bit
584}
Evan Chenga8e29892007-01-19 07:51:42 +0000585
Bill Wendling67a704d2010-10-13 20:58:46 +0000586def VTOUIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
587 (outs SPR:$Sd), (ins SPR:$Sm),
588 IIC_fpCVTSI, "vcvt", ".u32.f32\t$Sd, $Sm",
589 [(set SPR:$Sd, (arm_ftoui SPR:$Sm))]> {
Evan Cheng78be83d2008-11-11 19:40:26 +0000590 let Inst{7} = 1; // Z bit
591}
Evan Chenga8e29892007-01-19 07:51:42 +0000592
Johnny Chen15b423f2010-02-08 22:02:41 +0000593// And the Z bit '0' variants, i.e. use the rounding mode specified by FPSCR.
594// For disassembly only.
Nate Begemand1fb5832010-08-03 21:31:55 +0000595let Uses = [FPSCR] in {
Bill Wendling67a704d2010-10-13 20:58:46 +0000596// FIXME: Verify encoding after integrated assembler is working.
597def VTOSIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,
598 (outs SPR:$Sd), (ins DPR:$Dm),
599 IIC_fpCVTDI, "vcvtr", ".s32.f64\t$Sd, $Dm",
600 [(set SPR:$Sd, (int_arm_vcvtr (f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000601 let Inst{7} = 0; // Z bit
602}
603
Bill Wendling67a704d2010-10-13 20:58:46 +0000604def VTOSIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,
605 (outs SPR:$Sd), (ins SPR:$Sm),
606 IIC_fpCVTSI, "vcvtr", ".s32.f32\t$Sd, $Sm",
607 [(set SPR:$Sd, (int_arm_vcvtr SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000608 let Inst{7} = 0; // Z bit
609}
610
Bill Wendling67a704d2010-10-13 20:58:46 +0000611def VTOUIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,
612 (outs SPR:$Sd), (ins DPR:$Dm),
613 IIC_fpCVTDI, "vcvtr", ".u32.f64\t$Sd, $Dm",
Bill Wendling88cf0382010-10-14 01:02:08 +0000614 [(set SPR:$Sd, (int_arm_vcvtru(f64 DPR:$Dm)))]>{
Johnny Chen15b423f2010-02-08 22:02:41 +0000615 let Inst{7} = 0; // Z bit
616}
617
Bill Wendling67a704d2010-10-13 20:58:46 +0000618def VTOUIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,
619 (outs SPR:$Sd), (ins SPR:$Sm),
620 IIC_fpCVTSI, "vcvtr", ".u32.f32\t$Sd, $Sm",
621 [(set SPR:$Sd, (int_arm_vcvtru SPR:$Sm))]> {
Johnny Chen15b423f2010-02-08 22:02:41 +0000622 let Inst{7} = 0; // Z bit
623}
Nate Begemand1fb5832010-08-03 21:31:55 +0000624}
Johnny Chen15b423f2010-02-08 22:02:41 +0000625
Johnny Chen27bb8d02010-02-11 18:17:16 +0000626// Convert between floating-point and fixed-point
627// Data type for fixed-point naming convention:
628// S16 (U=0, sx=0) -> SH
629// U16 (U=1, sx=0) -> UH
630// S32 (U=0, sx=1) -> SL
631// U32 (U=1, sx=1) -> UL
632
Bill Wendling160acca2010-11-01 23:11:22 +0000633// FIXME: Marking these as codegen only seems wrong. They are real
634// instructions(?)
635let Constraints = "$a = $dst", isCodeGenOnly = 1 in {
Johnny Chen27bb8d02010-02-11 18:17:16 +0000636
637// FP to Fixed-Point:
638
639def VTOSHS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 0,
Bill Wendling160acca2010-11-01 23:11:22 +0000640 (outs SPR:$dst), (ins SPR_S16:$a, i32imm:$fbits),
Johnny Chen27bb8d02010-02-11 18:17:16 +0000641 IIC_fpCVTSI, "vcvt", ".s16.f32\t$dst, $a, $fbits",
642 [/* For disassembly only; pattern left blank */]>;
643
644def VTOUHS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 0,
645 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
646 IIC_fpCVTSI, "vcvt", ".u16.f32\t$dst, $a, $fbits",
647 [/* For disassembly only; pattern left blank */]>;
648
649def VTOSLS : AVConv1XI<0b11101, 0b11, 0b1110, 0b1010, 1,
650 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
651 IIC_fpCVTSI, "vcvt", ".s32.f32\t$dst, $a, $fbits",
652 [/* For disassembly only; pattern left blank */]>;
653
654def VTOULS : AVConv1XI<0b11101, 0b11, 0b1111, 0b1010, 1,
655 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
656 IIC_fpCVTSI, "vcvt", ".u32.f32\t$dst, $a, $fbits",
657 [/* For disassembly only; pattern left blank */]>;
658
659def VTOSHD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 0,
660 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
661 IIC_fpCVTDI, "vcvt", ".s16.f64\t$dst, $a, $fbits",
662 [/* For disassembly only; pattern left blank */]>;
663
664def VTOUHD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 0,
665 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
666 IIC_fpCVTDI, "vcvt", ".u16.f64\t$dst, $a, $fbits",
667 [/* For disassembly only; pattern left blank */]>;
668
669def VTOSLD : AVConv1XI<0b11101, 0b11, 0b1110, 0b1011, 1,
670 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
671 IIC_fpCVTDI, "vcvt", ".s32.f64\t$dst, $a, $fbits",
672 [/* For disassembly only; pattern left blank */]>;
673
674def VTOULD : AVConv1XI<0b11101, 0b11, 0b1111, 0b1011, 1,
675 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
676 IIC_fpCVTDI, "vcvt", ".u32.f64\t$dst, $a, $fbits",
677 [/* For disassembly only; pattern left blank */]>;
678
679// Fixed-Point to FP:
680
681def VSHTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 0,
682 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
683 IIC_fpCVTIS, "vcvt", ".f32.s16\t$dst, $a, $fbits",
684 [/* For disassembly only; pattern left blank */]>;
685
686def VUHTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 0,
687 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
688 IIC_fpCVTIS, "vcvt", ".f32.u16\t$dst, $a, $fbits",
689 [/* For disassembly only; pattern left blank */]>;
690
691def VSLTOS : AVConv1XI<0b11101, 0b11, 0b1010, 0b1010, 1,
692 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
693 IIC_fpCVTIS, "vcvt", ".f32.s32\t$dst, $a, $fbits",
694 [/* For disassembly only; pattern left blank */]>;
695
696def VULTOS : AVConv1XI<0b11101, 0b11, 0b1011, 0b1010, 1,
697 (outs SPR:$dst), (ins SPR:$a, i32imm:$fbits),
698 IIC_fpCVTIS, "vcvt", ".f32.u32\t$dst, $a, $fbits",
699 [/* For disassembly only; pattern left blank */]>;
700
701def VSHTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 0,
702 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
703 IIC_fpCVTID, "vcvt", ".f64.s16\t$dst, $a, $fbits",
704 [/* For disassembly only; pattern left blank */]>;
705
706def VUHTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 0,
707 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
708 IIC_fpCVTID, "vcvt", ".f64.u16\t$dst, $a, $fbits",
709 [/* For disassembly only; pattern left blank */]>;
710
711def VSLTOD : AVConv1XI<0b11101, 0b11, 0b1010, 0b1011, 1,
712 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
713 IIC_fpCVTID, "vcvt", ".f64.s32\t$dst, $a, $fbits",
714 [/* For disassembly only; pattern left blank */]>;
715
716def VULTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 1,
717 (outs DPR:$dst), (ins DPR:$a, i32imm:$fbits),
718 IIC_fpCVTID, "vcvt", ".f64.u32\t$dst, $a, $fbits",
719 [/* For disassembly only; pattern left blank */]>;
720
Bill Wendling160acca2010-11-01 23:11:22 +0000721} // End of 'let Constraints = "$a = $dst", isCodeGenOnly = 1 in'
Johnny Chen27bb8d02010-02-11 18:17:16 +0000722
Evan Chenga8e29892007-01-19 07:51:42 +0000723//===----------------------------------------------------------------------===//
724// FP FMA Operations.
725//
726
Bill Wendlingc2bf5022010-11-01 21:17:06 +0000727def VMLAD : ADbI_vmlX<0b11100, 0b00, 0, 0,
728 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
729 IIC_fpMAC64, "vmla", ".f64\t$Dd, $Dn, $Dm",
730 [(set DPR:$Dd, (fadd (fmul DPR:$Dn, DPR:$Dm),
731 (f64 DPR:$Ddin)))]>,
732 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000733
Bill Wendling69661192010-11-01 06:00:39 +0000734def VMLAS : ASbIn<0b11100, 0b00, 0, 0,
735 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
736 IIC_fpMAC32, "vmla", ".f32\t$Sd, $Sn, $Sm",
737 [(set SPR:$Sd, (fadd (fmul SPR:$Sn, SPR:$Sm),
738 SPR:$Sdin))]>,
739 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000740
Bill Wendling88cf0382010-10-14 01:02:08 +0000741def : Pat<(fadd DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
742 (VMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
743def : Pat<(fadd SPR:$dstin, (fmul SPR:$a, SPR:$b)),
744 (VMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
Evan Chenga8e29892007-01-19 07:51:42 +0000745
Bill Wendlingc2bf5022010-11-01 21:17:06 +0000746def VMLSD : ADbI_vmlX<0b11100, 0b00, 1, 0,
747 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
748 IIC_fpMAC64, "vmls", ".f64\t$Dd, $Dn, $Dm",
749 [(set DPR:$Dd, (fadd (fneg (fmul DPR:$Dn,DPR:$Dm)),
750 (f64 DPR:$Ddin)))]>,
751 RegConstraint<"$Ddin = $Dd">;
Bill Wendling88cf0382010-10-14 01:02:08 +0000752
Bill Wendling69661192010-11-01 06:00:39 +0000753def VMLSS : ASbIn<0b11100, 0b00, 1, 0,
754 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
755 IIC_fpMAC32, "vmls", ".f32\t$Sd, $Sn, $Sm",
756 [(set SPR:$Sd, (fadd (fneg (fmul SPR:$Sn, SPR:$Sm)),
757 SPR:$Sdin))]>,
758 RegConstraint<"$Sdin = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000759
Chris Lattnerd10a53d2010-03-08 18:51:21 +0000760def : Pat<(fsub DPR:$dstin, (fmul DPR:$a, (f64 DPR:$b))),
Jim Grosbache5165492009-11-09 00:11:35 +0000761 (VMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000762def : Pat<(fsub SPR:$dstin, (fmul SPR:$a, SPR:$b)),
Jim Grosbache5165492009-11-09 00:11:35 +0000763 (VMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
David Goodwinb84f3d42009-08-04 18:44:29 +0000764
Bill Wendlingc2bf5022010-11-01 21:17:06 +0000765def VNMLAD : ADbI_vmlX<0b11100, 0b01, 1, 0,
766 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
767 IIC_fpMAC64, "vnmla", ".f64\t$Dd, $Dn, $Dm",
768 [(set DPR:$Dd,(fsub (fneg (fmul DPR:$Dn,DPR:$Dm)),
769 (f64 DPR:$Ddin)))]>,
Bill Wendling88cf0382010-10-14 01:02:08 +0000770 RegConstraint<"$Ddin = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000771
Bill Wendling69661192010-11-01 06:00:39 +0000772def VNMLAS : ASbI<0b11100, 0b01, 1, 0,
773 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
774 IIC_fpMAC32, "vnmla", ".f32\t$Sd, $Sn, $Sm",
775 [(set SPR:$Sd, (fsub (fneg (fmul SPR:$Sn, SPR:$Sm)),
776 SPR:$Sdin))]>,
777 RegConstraint<"$Sdin = $Sd">;
Bill Wendling88cf0382010-10-14 01:02:08 +0000778
779def : Pat<(fsub (fneg (fmul DPR:$a, (f64 DPR:$b))), DPR:$dstin),
780 (VNMLAD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
781def : Pat<(fsub (fneg (fmul SPR:$a, SPR:$b)), SPR:$dstin),
782 (VNMLAS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
783
Bill Wendlingc2bf5022010-11-01 21:17:06 +0000784def VNMLSD : ADbI_vmlX<0b11100, 0b01, 0, 0,
785 (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
786 IIC_fpMAC64, "vnmls", ".f64\t$Dd, $Dn, $Dm",
787 [(set DPR:$Dd, (fsub (fmul DPR:$Dn, DPR:$Dm),
788 (f64 DPR:$Ddin)))]>,
789 RegConstraint<"$Ddin = $Dd">;
Bill Wendling88cf0382010-10-14 01:02:08 +0000790
Bill Wendling69661192010-11-01 06:00:39 +0000791def VNMLSS : ASbI<0b11100, 0b01, 0, 0,
792 (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
793 IIC_fpMAC32, "vnmls", ".f32\t$Sd, $Sn, $Sm",
794 [(set SPR:$Sd, (fsub (fmul SPR:$Sn, SPR:$Sm), SPR:$Sdin))]>,
Bill Wendling88cf0382010-10-14 01:02:08 +0000795 RegConstraint<"$Sdin = $Sd">;
796
797def : Pat<(fsub (fmul DPR:$a, (f64 DPR:$b)), DPR:$dstin),
798 (VNMLSD DPR:$dstin, DPR:$a, DPR:$b)>, Requires<[DontUseNEONForFP]>;
799def : Pat<(fsub (fmul SPR:$a, SPR:$b), SPR:$dstin),
800 (VNMLSS SPR:$dstin, SPR:$a, SPR:$b)>, Requires<[DontUseNEONForFP]>;
801
Evan Chenga8e29892007-01-19 07:51:42 +0000802
803//===----------------------------------------------------------------------===//
804// FP Conditional moves.
805//
806
Evan Cheng020cc1b2010-05-13 00:16:46 +0000807let neverHasSideEffects = 1 in {
Bill Wendling69661192010-11-01 06:00:39 +0000808def VMOVDcc : ADuI<0b11101, 0b11, 0b0000, 0b01, 0,
809 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
810 IIC_fpUNA64, "vmov", ".f64\t$Dd, $Dm",
811 [/*(set DPR:$Dd, (ARMcmov DPR:$Dn, DPR:$Dm, imm:$cc))*/]>,
812 RegConstraint<"$Dn = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000813
Bill Wendling69661192010-11-01 06:00:39 +0000814def VMOVScc : ASuI<0b11101, 0b11, 0b0000, 0b01, 0,
815 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
816 IIC_fpUNA32, "vmov", ".f32\t$Sd, $Sm",
817 [/*(set SPR:$Sd, (ARMcmov SPR:$Sn, SPR:$Sm, imm:$cc))*/]>,
818 RegConstraint<"$Sn = $Sd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000819
Bill Wendling69661192010-11-01 06:00:39 +0000820def VNEGDcc : ADuI<0b11101, 0b11, 0b0001, 0b01, 0,
821 (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),
822 IIC_fpUNA64, "vneg", ".f64\t$Dd, $Dm",
823 [/*(set DPR:$Dd, (ARMcneg DPR:$Dn, DPR:$Dm, imm:$cc))*/]>,
824 RegConstraint<"$Dn = $Dd">;
Evan Chenga8e29892007-01-19 07:51:42 +0000825
Bill Wendling69661192010-11-01 06:00:39 +0000826def VNEGScc : ASuI<0b11101, 0b11, 0b0001, 0b01, 0,
827 (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),
828 IIC_fpUNA32, "vneg", ".f32\t$Sd, $Sm",
829 [/*(set SPR:$Sd, (ARMcneg SPR:$Sn, SPR:$Sm, imm:$cc))*/]>,
830 RegConstraint<"$Sn = $Sd">;
Evan Cheng020cc1b2010-05-13 00:16:46 +0000831} // neverHasSideEffects
Evan Cheng78be83d2008-11-11 19:40:26 +0000832
833//===----------------------------------------------------------------------===//
834// Misc.
835//
836
Evan Cheng1e13c792009-11-10 19:44:56 +0000837// APSR is the application level alias of CPSR. This FPSCR N, Z, C, V flags
838// to APSR.
Evan Cheng91449a82009-07-20 02:12:31 +0000839let Defs = [CPSR], Uses = [FPSCR] in
Bill Wendling160acca2010-11-01 23:11:22 +0000840def FMSTAT : VFPAI<(outs), (ins), VFPMiscFrm, IIC_fpSTAT,
841 "vmrs", "\tapsr_nzcv, fpscr",
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000842 [(arm_fmstat)]> {
Evan Chengcd8e66a2008-11-11 21:48:44 +0000843 let Inst{27-20} = 0b11101111;
844 let Inst{19-16} = 0b0001;
845 let Inst{15-12} = 0b1111;
846 let Inst{11-8} = 0b1010;
847 let Inst{7} = 0;
Bill Wendling946a2742010-10-14 01:19:34 +0000848 let Inst{6-5} = 0b00;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000849 let Inst{4} = 1;
Bill Wendling946a2742010-10-14 01:19:34 +0000850 let Inst{3-0} = 0b0000;
Evan Chengcd8e66a2008-11-11 21:48:44 +0000851}
Evan Cheng39382422009-10-28 01:44:26 +0000852
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000853// FPSCR <-> GPR
Nate Begemand1fb5832010-08-03 21:31:55 +0000854let hasSideEffects = 1, Uses = [FPSCR] in
Bill Wendling88cf0382010-10-14 01:02:08 +0000855def VMRS : VFPAI<(outs GPR:$Rt), (ins), VFPMiscFrm, IIC_fpSTAT,
856 "vmrs", "\t$Rt, fpscr",
857 [(set GPR:$Rt, (int_arm_get_fpscr))]> {
858 // Instruction operand.
859 bits<4> Rt;
860
861 // Encode instruction operand.
862 let Inst{15-12} = Rt;
863
Johnny Chenc9745042010-02-09 22:35:38 +0000864 let Inst{27-20} = 0b11101111;
865 let Inst{19-16} = 0b0001;
866 let Inst{11-8} = 0b1010;
867 let Inst{7} = 0;
Bill Wendling88cf0382010-10-14 01:02:08 +0000868 let Inst{6-5} = 0b00;
Johnny Chenc9745042010-02-09 22:35:38 +0000869 let Inst{4} = 1;
Bill Wendling88cf0382010-10-14 01:02:08 +0000870 let Inst{3-0} = 0b0000;
Johnny Chenc9745042010-02-09 22:35:38 +0000871}
Johnny Chenc9745042010-02-09 22:35:38 +0000872
Nate Begemand1fb5832010-08-03 21:31:55 +0000873let Defs = [FPSCR] in
874def VMSR : VFPAI<(outs), (ins GPR:$src), VFPMiscFrm, IIC_fpSTAT,
875 "vmsr", "\tfpscr, $src",
Bill Wendling88cf0382010-10-14 01:02:08 +0000876 [(int_arm_set_fpscr GPR:$src)]> {
877 // Instruction operand.
878 bits<4> src;
879
880 // Encode instruction operand.
881 let Inst{15-12} = src;
882
Johnny Chenc9745042010-02-09 22:35:38 +0000883 let Inst{27-20} = 0b11101110;
884 let Inst{19-16} = 0b0001;
885 let Inst{11-8} = 0b1010;
886 let Inst{7} = 0;
887 let Inst{4} = 1;
888}
Evan Cheng39382422009-10-28 01:44:26 +0000889
890// Materialize FP immediates. VFP3 only.
Jim Grosbache5165492009-11-09 00:11:35 +0000891let isReMaterializable = 1 in {
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000892def FCONSTD : VFPAI<(outs DPR:$Dd), (ins vfp_f64imm:$imm),
Anton Korobeynikov63401e32010-04-07 18:19:56 +0000893 VFPMiscFrm, IIC_fpUNA64,
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000894 "vmov", ".f64\t$Dd, $imm",
895 [(set DPR:$Dd, vfp_f64imm:$imm)]>, Requires<[HasVFP3]> {
896 // Instruction operands.
897 bits<5> Dd;
898 bits<32> imm;
899
900 // Encode instruction operands.
901 let Inst{15-12} = Dd{3-0};
902 let Inst{22} = Dd{4};
903 let Inst{19} = imm{31};
904 let Inst{18-16} = imm{22-20};
905 let Inst{3-0} = imm{19-16};
906
907 // Encode remaining instruction bits.
Jim Grosbache5165492009-11-09 00:11:35 +0000908 let Inst{27-23} = 0b11101;
909 let Inst{21-20} = 0b11;
910 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000911 let Inst{8} = 1; // Double precision.
Jim Grosbache5165492009-11-09 00:11:35 +0000912 let Inst{7-4} = 0b0000;
913}
914
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000915def FCONSTS : VFPAI<(outs SPR:$Sd), (ins vfp_f32imm:$imm),
916 VFPMiscFrm, IIC_fpUNA32,
917 "vmov", ".f32\t$Sd, $imm",
918 [(set SPR:$Sd, vfp_f32imm:$imm)]>, Requires<[HasVFP3]> {
919 // Instruction operands.
920 bits<5> Sd;
921 bits<32> imm;
922
923 // Encode instruction operands.
924 let Inst{15-12} = Sd{4-1};
925 let Inst{22} = Sd{0};
926 let Inst{19} = imm{31}; // The immediate is handled as a double.
927 let Inst{18-16} = imm{22-20};
928 let Inst{3-0} = imm{19-16};
929
930 // Encode remaining instruction bits.
Evan Cheng39382422009-10-28 01:44:26 +0000931 let Inst{27-23} = 0b11101;
932 let Inst{21-20} = 0b11;
933 let Inst{11-9} = 0b101;
Bill Wendlingbbbdcd42010-10-14 02:33:26 +0000934 let Inst{8} = 0; // Single precision.
Evan Cheng39382422009-10-28 01:44:26 +0000935 let Inst{7-4} = 0b0000;
936}
Evan Cheng39382422009-10-28 01:44:26 +0000937}