fp.isa (7382:b3c768629a54) fp.isa (7384:f12b4f28e5eb)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40output header {{
41
42template <class Micro>
43class VfpMacroRegRegOp : public VfpMacroOp
44{
45 public:
46 VfpMacroRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
47 IntRegIndex _op1, bool _wide) :
48 VfpMacroOp("VfpMacroRegRegOp", _machInst, No_OpClass, _wide)
49 {
50 numMicroops = machInst.fpscrLen + 1;
51 assert(numMicroops > 1);
52 microOps = new StaticInstPtr[numMicroops];
53 for (unsigned i = 0; i < numMicroops; i++) {
54 VfpMicroMode mode = VfpMicroop;
55 if (i == 0)
56 mode = VfpFirstMicroop;
57 else if (i == numMicroops - 1)
58 mode = VfpLastMicroop;
59 microOps[i] = new Micro(_machInst, _dest, _op1, mode);
60 nextIdxs(_dest, _op1);
61 }
62 }
63
64 %(BasicExecPanic)s
65};
66
67template <class VfpOp>
68static StaticInstPtr
69decodeVfpRegRegOp(ExtMachInst machInst,
70 IntRegIndex dest, IntRegIndex op1, bool wide)
71{
72 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
73 return new VfpOp(machInst, dest, op1);
74 } else {
75 return new VfpMacroRegRegOp<VfpOp>(machInst, dest, op1, wide);
76 }
77}
78
79template <class Micro>
80class VfpMacroRegImmOp : public VfpMacroOp
81{
82 public:
83 VfpMacroRegImmOp(ExtMachInst _machInst, IntRegIndex _dest, uint64_t _imm,
84 bool _wide) :
85 VfpMacroOp("VfpMacroRegImmOp", _machInst, No_OpClass, _wide)
86 {
87 numMicroops = machInst.fpscrLen + 1;
88 microOps = new StaticInstPtr[numMicroops];
89 for (unsigned i = 0; i < numMicroops; i++) {
90 VfpMicroMode mode = VfpMicroop;
91 if (i == 0)
92 mode = VfpFirstMicroop;
93 else if (i == numMicroops - 1)
94 mode = VfpLastMicroop;
95 microOps[i] = new Micro(_machInst, _dest, _imm, mode);
96 nextIdxs(_dest);
97 }
98 }
99
100 %(BasicExecPanic)s
101};
102
103template <class VfpOp>
104static StaticInstPtr
105decodeVfpRegImmOp(ExtMachInst machInst,
106 IntRegIndex dest, uint64_t imm, bool wide)
107{
108 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
109 return new VfpOp(machInst, dest, imm);
110 } else {
111 return new VfpMacroRegImmOp<VfpOp>(machInst, dest, imm, wide);
112 }
113}
114
115template <class Micro>
116class VfpMacroRegRegImmOp : public VfpMacroOp
117{
118 public:
119 VfpMacroRegRegImmOp(ExtMachInst _machInst, IntRegIndex _dest,
120 IntRegIndex _op1, uint64_t _imm, bool _wide) :
121 VfpMacroOp("VfpMacroRegRegImmOp", _machInst, No_OpClass, _wide)
122 {
123 numMicroops = machInst.fpscrLen + 1;
124 microOps = new StaticInstPtr[numMicroops];
125 for (unsigned i = 0; i < numMicroops; i++) {
126 VfpMicroMode mode = VfpMicroop;
127 if (i == 0)
128 mode = VfpFirstMicroop;
129 else if (i == numMicroops - 1)
130 mode = VfpLastMicroop;
131 microOps[i] = new Micro(_machInst, _dest, _op1, _imm, mode);
132 nextIdxs(_dest, _op1);
133 }
134 }
135
136 %(BasicExecPanic)s
137};
138
139template <class VfpOp>
140static StaticInstPtr
141decodeVfpRegRegImmOp(ExtMachInst machInst, IntRegIndex dest,
142 IntRegIndex op1, uint64_t imm, bool wide)
143{
144 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
145 return new VfpOp(machInst, dest, op1, imm);
146 } else {
147 return new VfpMacroRegRegImmOp<VfpOp>(machInst, dest, op1, imm, wide);
148 }
149}
150
151template <class Micro>
152class VfpMacroRegRegRegOp : public VfpMacroOp
153{
154 public:
155 VfpMacroRegRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
156 IntRegIndex _op1, IntRegIndex _op2, bool _wide) :
157 VfpMacroOp("VfpMacroRegRegRegOp", _machInst, No_OpClass, _wide)
158 {
159 numMicroops = machInst.fpscrLen + 1;
160 microOps = new StaticInstPtr[numMicroops];
161 for (unsigned i = 0; i < numMicroops; i++) {
162 VfpMicroMode mode = VfpMicroop;
163 if (i == 0)
164 mode = VfpFirstMicroop;
165 else if (i == numMicroops - 1)
166 mode = VfpLastMicroop;
167 microOps[i] = new Micro(_machInst, _dest, _op1, _op2, mode);
168 nextIdxs(_dest, _op1, _op2);
169 }
170 }
171
172 %(BasicExecPanic)s
173};
174
175template <class VfpOp>
176static StaticInstPtr
177decodeVfpRegRegRegOp(ExtMachInst machInst, IntRegIndex dest,
178 IntRegIndex op1, IntRegIndex op2, bool wide)
179{
180 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
181 return new VfpOp(machInst, dest, op1, op2);
182 } else {
183 return new VfpMacroRegRegRegOp<VfpOp>(machInst, dest, op1, op2, wide);
184 }
185}
186}};
187
188let {{
189
190 header_output = ""
191 decoder_output = ""
192 exec_output = ""
193
194 vmsrIop = InstObjParams("vmsr", "Vmsr", "VfpRegRegOp",
195 { "code": "MiscDest = Op1;",
196 "predicate_test": predicateTest }, [])
197 header_output += VfpRegRegOpDeclare.subst(vmsrIop);
198 decoder_output += VfpRegRegOpConstructor.subst(vmsrIop);
199 exec_output += PredOpExecute.subst(vmsrIop);
200
201 vmrsIop = InstObjParams("vmrs", "Vmrs", "VfpRegRegOp",
202 { "code": "Dest = MiscOp1;",
203 "predicate_test": predicateTest }, [])
204 header_output += VfpRegRegOpDeclare.subst(vmrsIop);
205 decoder_output += VfpRegRegOpConstructor.subst(vmrsIop);
206 exec_output += PredOpExecute.subst(vmrsIop);
207
208 vmovImmSCode = '''
209 FpDest.uw = bits(imm, 31, 0);
210 '''
211 vmovImmSIop = InstObjParams("vmov", "VmovImmS", "VfpRegImmOp",
212 { "code": vmovImmSCode,
213 "predicate_test": predicateTest }, [])
214 header_output += VfpRegImmOpDeclare.subst(vmovImmSIop);
215 decoder_output += VfpRegImmOpConstructor.subst(vmovImmSIop);
216 exec_output += PredOpExecute.subst(vmovImmSIop);
217
218 vmovImmDCode = '''
219 FpDestP0.uw = bits(imm, 31, 0);
220 FpDestP1.uw = bits(imm, 63, 32);
221 '''
222 vmovImmDIop = InstObjParams("vmov", "VmovImmD", "VfpRegImmOp",
223 { "code": vmovImmDCode,
224 "predicate_test": predicateTest }, [])
225 header_output += VfpRegImmOpDeclare.subst(vmovImmDIop);
226 decoder_output += VfpRegImmOpConstructor.subst(vmovImmDIop);
227 exec_output += PredOpExecute.subst(vmovImmDIop);
228
229 vmovImmQCode = '''
230 FpDestP0.uw = bits(imm, 31, 0);
231 FpDestP1.uw = bits(imm, 63, 32);
232 FpDestP2.uw = bits(imm, 31, 0);
233 FpDestP3.uw = bits(imm, 63, 32);
234 '''
235 vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "VfpRegImmOp",
236 { "code": vmovImmQCode,
237 "predicate_test": predicateTest }, [])
238 header_output += VfpRegImmOpDeclare.subst(vmovImmQIop);
239 decoder_output += VfpRegImmOpConstructor.subst(vmovImmQIop);
240 exec_output += PredOpExecute.subst(vmovImmQIop);
241
242 vmovRegSCode = '''
243 FpDest.uw = FpOp1.uw;
244 '''
245 vmovRegSIop = InstObjParams("vmov", "VmovRegS", "VfpRegRegOp",
246 { "code": vmovRegSCode,
247 "predicate_test": predicateTest }, [])
248 header_output += VfpRegRegOpDeclare.subst(vmovRegSIop);
249 decoder_output += VfpRegRegOpConstructor.subst(vmovRegSIop);
250 exec_output += PredOpExecute.subst(vmovRegSIop);
251
252 vmovRegDCode = '''
253 FpDestP0.uw = FpOp1P0.uw;
254 FpDestP1.uw = FpOp1P1.uw;
255 '''
256 vmovRegDIop = InstObjParams("vmov", "VmovRegD", "VfpRegRegOp",
257 { "code": vmovRegDCode,
258 "predicate_test": predicateTest }, [])
259 header_output += VfpRegRegOpDeclare.subst(vmovRegDIop);
260 decoder_output += VfpRegRegOpConstructor.subst(vmovRegDIop);
261 exec_output += PredOpExecute.subst(vmovRegDIop);
262
263 vmovRegQCode = '''
264 FpDestP0.uw = FpOp1P0.uw;
265 FpDestP1.uw = FpOp1P1.uw;
266 FpDestP2.uw = FpOp1P2.uw;
267 FpDestP3.uw = FpOp1P3.uw;
268 '''
269 vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "VfpRegRegOp",
270 { "code": vmovRegQCode,
271 "predicate_test": predicateTest }, [])
272 header_output += VfpRegRegOpDeclare.subst(vmovRegQIop);
273 decoder_output += VfpRegRegOpConstructor.subst(vmovRegQIop);
274 exec_output += PredOpExecute.subst(vmovRegQIop);
275
276 vmovCoreRegBCode = '''
277 FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub);
278 '''
279 vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "VfpRegRegImmOp",
280 { "code": vmovCoreRegBCode,
281 "predicate_test": predicateTest }, [])
282 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
283 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
284 exec_output += PredOpExecute.subst(vmovCoreRegBIop);
285
286 vmovCoreRegHCode = '''
287 FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh);
288 '''
289 vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "VfpRegRegImmOp",
290 { "code": vmovCoreRegHCode,
291 "predicate_test": predicateTest }, [])
292 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
293 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
294 exec_output += PredOpExecute.subst(vmovCoreRegHIop);
295
296 vmovCoreRegWCode = '''
297 FpDest.uw = Op1.uw;
298 '''
299 vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "VfpRegRegOp",
300 { "code": vmovCoreRegWCode,
301 "predicate_test": predicateTest }, [])
302 header_output += VfpRegRegOpDeclare.subst(vmovCoreRegWIop);
303 decoder_output += VfpRegRegOpConstructor.subst(vmovCoreRegWIop);
304 exec_output += PredOpExecute.subst(vmovCoreRegWIop);
305
306 vmovRegCoreUBCode = '''
307 Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7);
308 '''
309 vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "VfpRegRegImmOp",
310 { "code": vmovRegCoreUBCode,
311 "predicate_test": predicateTest }, [])
312 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
313 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
314 exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
315
316 vmovRegCoreUHCode = '''
317 Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15);
318 '''
319 vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "VfpRegRegImmOp",
320 { "code": vmovRegCoreUHCode,
321 "predicate_test": predicateTest }, [])
322 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
323 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
324 exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
325
326 vmovRegCoreSBCode = '''
327 Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7));
328 '''
329 vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "VfpRegRegImmOp",
330 { "code": vmovRegCoreSBCode,
331 "predicate_test": predicateTest }, [])
332 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
333 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
334 exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
335
336 vmovRegCoreSHCode = '''
337 Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15));
338 '''
339 vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "VfpRegRegImmOp",
340 { "code": vmovRegCoreSHCode,
341 "predicate_test": predicateTest }, [])
342 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
343 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
344 exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
345
346 vmovRegCoreWCode = '''
347 Dest = FpOp1.uw;
348 '''
349 vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "VfpRegRegOp",
350 { "code": vmovRegCoreWCode,
351 "predicate_test": predicateTest }, [])
352 header_output += VfpRegRegOpDeclare.subst(vmovRegCoreWIop);
353 decoder_output += VfpRegRegOpConstructor.subst(vmovRegCoreWIop);
354 exec_output += PredOpExecute.subst(vmovRegCoreWIop);
355
356 vmov2Reg2CoreCode = '''
357 FpDestP0.uw = Op1.uw;
358 FpDestP1.uw = Op2.uw;
359 '''
360 vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "VfpRegRegRegOp",
361 { "code": vmov2Reg2CoreCode,
362 "predicate_test": predicateTest }, [])
363 header_output += VfpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
364 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
365 exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
366
367 vmov2Core2RegCode = '''
368 Dest.uw = FpOp2P0.uw;
369 Op1.uw = FpOp2P1.uw;
370 '''
371 vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "VfpRegRegRegOp",
372 { "code": vmov2Core2RegCode,
373 "predicate_test": predicateTest }, [])
374 header_output += VfpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
375 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
376 exec_output += PredOpExecute.subst(vmov2Core2RegIop);
377}};
378
379let {{
380
381 header_output = ""
382 decoder_output = ""
383 exec_output = ""
384
385 vmulSCode = '''
386 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
387 VfpSavedState state = prepVfpFpscr(Fpscr);
388 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40output header {{
41
42template <class Micro>
43class VfpMacroRegRegOp : public VfpMacroOp
44{
45 public:
46 VfpMacroRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
47 IntRegIndex _op1, bool _wide) :
48 VfpMacroOp("VfpMacroRegRegOp", _machInst, No_OpClass, _wide)
49 {
50 numMicroops = machInst.fpscrLen + 1;
51 assert(numMicroops > 1);
52 microOps = new StaticInstPtr[numMicroops];
53 for (unsigned i = 0; i < numMicroops; i++) {
54 VfpMicroMode mode = VfpMicroop;
55 if (i == 0)
56 mode = VfpFirstMicroop;
57 else if (i == numMicroops - 1)
58 mode = VfpLastMicroop;
59 microOps[i] = new Micro(_machInst, _dest, _op1, mode);
60 nextIdxs(_dest, _op1);
61 }
62 }
63
64 %(BasicExecPanic)s
65};
66
67template <class VfpOp>
68static StaticInstPtr
69decodeVfpRegRegOp(ExtMachInst machInst,
70 IntRegIndex dest, IntRegIndex op1, bool wide)
71{
72 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
73 return new VfpOp(machInst, dest, op1);
74 } else {
75 return new VfpMacroRegRegOp<VfpOp>(machInst, dest, op1, wide);
76 }
77}
78
79template <class Micro>
80class VfpMacroRegImmOp : public VfpMacroOp
81{
82 public:
83 VfpMacroRegImmOp(ExtMachInst _machInst, IntRegIndex _dest, uint64_t _imm,
84 bool _wide) :
85 VfpMacroOp("VfpMacroRegImmOp", _machInst, No_OpClass, _wide)
86 {
87 numMicroops = machInst.fpscrLen + 1;
88 microOps = new StaticInstPtr[numMicroops];
89 for (unsigned i = 0; i < numMicroops; i++) {
90 VfpMicroMode mode = VfpMicroop;
91 if (i == 0)
92 mode = VfpFirstMicroop;
93 else if (i == numMicroops - 1)
94 mode = VfpLastMicroop;
95 microOps[i] = new Micro(_machInst, _dest, _imm, mode);
96 nextIdxs(_dest);
97 }
98 }
99
100 %(BasicExecPanic)s
101};
102
103template <class VfpOp>
104static StaticInstPtr
105decodeVfpRegImmOp(ExtMachInst machInst,
106 IntRegIndex dest, uint64_t imm, bool wide)
107{
108 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
109 return new VfpOp(machInst, dest, imm);
110 } else {
111 return new VfpMacroRegImmOp<VfpOp>(machInst, dest, imm, wide);
112 }
113}
114
115template <class Micro>
116class VfpMacroRegRegImmOp : public VfpMacroOp
117{
118 public:
119 VfpMacroRegRegImmOp(ExtMachInst _machInst, IntRegIndex _dest,
120 IntRegIndex _op1, uint64_t _imm, bool _wide) :
121 VfpMacroOp("VfpMacroRegRegImmOp", _machInst, No_OpClass, _wide)
122 {
123 numMicroops = machInst.fpscrLen + 1;
124 microOps = new StaticInstPtr[numMicroops];
125 for (unsigned i = 0; i < numMicroops; i++) {
126 VfpMicroMode mode = VfpMicroop;
127 if (i == 0)
128 mode = VfpFirstMicroop;
129 else if (i == numMicroops - 1)
130 mode = VfpLastMicroop;
131 microOps[i] = new Micro(_machInst, _dest, _op1, _imm, mode);
132 nextIdxs(_dest, _op1);
133 }
134 }
135
136 %(BasicExecPanic)s
137};
138
139template <class VfpOp>
140static StaticInstPtr
141decodeVfpRegRegImmOp(ExtMachInst machInst, IntRegIndex dest,
142 IntRegIndex op1, uint64_t imm, bool wide)
143{
144 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
145 return new VfpOp(machInst, dest, op1, imm);
146 } else {
147 return new VfpMacroRegRegImmOp<VfpOp>(machInst, dest, op1, imm, wide);
148 }
149}
150
151template <class Micro>
152class VfpMacroRegRegRegOp : public VfpMacroOp
153{
154 public:
155 VfpMacroRegRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
156 IntRegIndex _op1, IntRegIndex _op2, bool _wide) :
157 VfpMacroOp("VfpMacroRegRegRegOp", _machInst, No_OpClass, _wide)
158 {
159 numMicroops = machInst.fpscrLen + 1;
160 microOps = new StaticInstPtr[numMicroops];
161 for (unsigned i = 0; i < numMicroops; i++) {
162 VfpMicroMode mode = VfpMicroop;
163 if (i == 0)
164 mode = VfpFirstMicroop;
165 else if (i == numMicroops - 1)
166 mode = VfpLastMicroop;
167 microOps[i] = new Micro(_machInst, _dest, _op1, _op2, mode);
168 nextIdxs(_dest, _op1, _op2);
169 }
170 }
171
172 %(BasicExecPanic)s
173};
174
175template <class VfpOp>
176static StaticInstPtr
177decodeVfpRegRegRegOp(ExtMachInst machInst, IntRegIndex dest,
178 IntRegIndex op1, IntRegIndex op2, bool wide)
179{
180 if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
181 return new VfpOp(machInst, dest, op1, op2);
182 } else {
183 return new VfpMacroRegRegRegOp<VfpOp>(machInst, dest, op1, op2, wide);
184 }
185}
186}};
187
188let {{
189
190 header_output = ""
191 decoder_output = ""
192 exec_output = ""
193
194 vmsrIop = InstObjParams("vmsr", "Vmsr", "VfpRegRegOp",
195 { "code": "MiscDest = Op1;",
196 "predicate_test": predicateTest }, [])
197 header_output += VfpRegRegOpDeclare.subst(vmsrIop);
198 decoder_output += VfpRegRegOpConstructor.subst(vmsrIop);
199 exec_output += PredOpExecute.subst(vmsrIop);
200
201 vmrsIop = InstObjParams("vmrs", "Vmrs", "VfpRegRegOp",
202 { "code": "Dest = MiscOp1;",
203 "predicate_test": predicateTest }, [])
204 header_output += VfpRegRegOpDeclare.subst(vmrsIop);
205 decoder_output += VfpRegRegOpConstructor.subst(vmrsIop);
206 exec_output += PredOpExecute.subst(vmrsIop);
207
208 vmovImmSCode = '''
209 FpDest.uw = bits(imm, 31, 0);
210 '''
211 vmovImmSIop = InstObjParams("vmov", "VmovImmS", "VfpRegImmOp",
212 { "code": vmovImmSCode,
213 "predicate_test": predicateTest }, [])
214 header_output += VfpRegImmOpDeclare.subst(vmovImmSIop);
215 decoder_output += VfpRegImmOpConstructor.subst(vmovImmSIop);
216 exec_output += PredOpExecute.subst(vmovImmSIop);
217
218 vmovImmDCode = '''
219 FpDestP0.uw = bits(imm, 31, 0);
220 FpDestP1.uw = bits(imm, 63, 32);
221 '''
222 vmovImmDIop = InstObjParams("vmov", "VmovImmD", "VfpRegImmOp",
223 { "code": vmovImmDCode,
224 "predicate_test": predicateTest }, [])
225 header_output += VfpRegImmOpDeclare.subst(vmovImmDIop);
226 decoder_output += VfpRegImmOpConstructor.subst(vmovImmDIop);
227 exec_output += PredOpExecute.subst(vmovImmDIop);
228
229 vmovImmQCode = '''
230 FpDestP0.uw = bits(imm, 31, 0);
231 FpDestP1.uw = bits(imm, 63, 32);
232 FpDestP2.uw = bits(imm, 31, 0);
233 FpDestP3.uw = bits(imm, 63, 32);
234 '''
235 vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "VfpRegImmOp",
236 { "code": vmovImmQCode,
237 "predicate_test": predicateTest }, [])
238 header_output += VfpRegImmOpDeclare.subst(vmovImmQIop);
239 decoder_output += VfpRegImmOpConstructor.subst(vmovImmQIop);
240 exec_output += PredOpExecute.subst(vmovImmQIop);
241
242 vmovRegSCode = '''
243 FpDest.uw = FpOp1.uw;
244 '''
245 vmovRegSIop = InstObjParams("vmov", "VmovRegS", "VfpRegRegOp",
246 { "code": vmovRegSCode,
247 "predicate_test": predicateTest }, [])
248 header_output += VfpRegRegOpDeclare.subst(vmovRegSIop);
249 decoder_output += VfpRegRegOpConstructor.subst(vmovRegSIop);
250 exec_output += PredOpExecute.subst(vmovRegSIop);
251
252 vmovRegDCode = '''
253 FpDestP0.uw = FpOp1P0.uw;
254 FpDestP1.uw = FpOp1P1.uw;
255 '''
256 vmovRegDIop = InstObjParams("vmov", "VmovRegD", "VfpRegRegOp",
257 { "code": vmovRegDCode,
258 "predicate_test": predicateTest }, [])
259 header_output += VfpRegRegOpDeclare.subst(vmovRegDIop);
260 decoder_output += VfpRegRegOpConstructor.subst(vmovRegDIop);
261 exec_output += PredOpExecute.subst(vmovRegDIop);
262
263 vmovRegQCode = '''
264 FpDestP0.uw = FpOp1P0.uw;
265 FpDestP1.uw = FpOp1P1.uw;
266 FpDestP2.uw = FpOp1P2.uw;
267 FpDestP3.uw = FpOp1P3.uw;
268 '''
269 vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "VfpRegRegOp",
270 { "code": vmovRegQCode,
271 "predicate_test": predicateTest }, [])
272 header_output += VfpRegRegOpDeclare.subst(vmovRegQIop);
273 decoder_output += VfpRegRegOpConstructor.subst(vmovRegQIop);
274 exec_output += PredOpExecute.subst(vmovRegQIop);
275
276 vmovCoreRegBCode = '''
277 FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub);
278 '''
279 vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "VfpRegRegImmOp",
280 { "code": vmovCoreRegBCode,
281 "predicate_test": predicateTest }, [])
282 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
283 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
284 exec_output += PredOpExecute.subst(vmovCoreRegBIop);
285
286 vmovCoreRegHCode = '''
287 FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh);
288 '''
289 vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "VfpRegRegImmOp",
290 { "code": vmovCoreRegHCode,
291 "predicate_test": predicateTest }, [])
292 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
293 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
294 exec_output += PredOpExecute.subst(vmovCoreRegHIop);
295
296 vmovCoreRegWCode = '''
297 FpDest.uw = Op1.uw;
298 '''
299 vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "VfpRegRegOp",
300 { "code": vmovCoreRegWCode,
301 "predicate_test": predicateTest }, [])
302 header_output += VfpRegRegOpDeclare.subst(vmovCoreRegWIop);
303 decoder_output += VfpRegRegOpConstructor.subst(vmovCoreRegWIop);
304 exec_output += PredOpExecute.subst(vmovCoreRegWIop);
305
306 vmovRegCoreUBCode = '''
307 Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7);
308 '''
309 vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "VfpRegRegImmOp",
310 { "code": vmovRegCoreUBCode,
311 "predicate_test": predicateTest }, [])
312 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
313 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
314 exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
315
316 vmovRegCoreUHCode = '''
317 Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15);
318 '''
319 vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "VfpRegRegImmOp",
320 { "code": vmovRegCoreUHCode,
321 "predicate_test": predicateTest }, [])
322 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
323 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
324 exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
325
326 vmovRegCoreSBCode = '''
327 Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7));
328 '''
329 vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "VfpRegRegImmOp",
330 { "code": vmovRegCoreSBCode,
331 "predicate_test": predicateTest }, [])
332 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
333 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
334 exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
335
336 vmovRegCoreSHCode = '''
337 Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15));
338 '''
339 vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "VfpRegRegImmOp",
340 { "code": vmovRegCoreSHCode,
341 "predicate_test": predicateTest }, [])
342 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
343 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
344 exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
345
346 vmovRegCoreWCode = '''
347 Dest = FpOp1.uw;
348 '''
349 vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "VfpRegRegOp",
350 { "code": vmovRegCoreWCode,
351 "predicate_test": predicateTest }, [])
352 header_output += VfpRegRegOpDeclare.subst(vmovRegCoreWIop);
353 decoder_output += VfpRegRegOpConstructor.subst(vmovRegCoreWIop);
354 exec_output += PredOpExecute.subst(vmovRegCoreWIop);
355
356 vmov2Reg2CoreCode = '''
357 FpDestP0.uw = Op1.uw;
358 FpDestP1.uw = Op2.uw;
359 '''
360 vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "VfpRegRegRegOp",
361 { "code": vmov2Reg2CoreCode,
362 "predicate_test": predicateTest }, [])
363 header_output += VfpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
364 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
365 exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
366
367 vmov2Core2RegCode = '''
368 Dest.uw = FpOp2P0.uw;
369 Op1.uw = FpOp2P1.uw;
370 '''
371 vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "VfpRegRegRegOp",
372 { "code": vmov2Core2RegCode,
373 "predicate_test": predicateTest }, [])
374 header_output += VfpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
375 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
376 exec_output += PredOpExecute.subst(vmov2Core2RegIop);
377}};
378
379let {{
380
381 header_output = ""
382 decoder_output = ""
383 exec_output = ""
384
385 vmulSCode = '''
386 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
387 VfpSavedState state = prepVfpFpscr(Fpscr);
388 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
389 FpDest = FpOp1 * FpOp2;
389 FpDest = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
390 __asm__ __volatile__("" :: "m" (FpDest));
391 Fpscr = setVfpFpscr(Fpscr, state);
392 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
393 FpDest = NAN;
394 }
395 '''
396 vmulSIop = InstObjParams("vmuls", "VmulS", "VfpRegRegRegOp",
397 { "code": vmulSCode,
398 "predicate_test": predicateTest }, [])
399 header_output += VfpRegRegRegOpDeclare.subst(vmulSIop);
400 decoder_output += VfpRegRegRegOpConstructor.subst(vmulSIop);
401 exec_output += PredOpExecute.subst(vmulSIop);
402
403 vmulDCode = '''
404 IntDoubleUnion cOp1, cOp2, cDest;
405 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
406 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
407 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
408 VfpSavedState state = prepVfpFpscr(Fpscr);
409 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
390 __asm__ __volatile__("" :: "m" (FpDest));
391 Fpscr = setVfpFpscr(Fpscr, state);
392 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
393 FpDest = NAN;
394 }
395 '''
396 vmulSIop = InstObjParams("vmuls", "VmulS", "VfpRegRegRegOp",
397 { "code": vmulSCode,
398 "predicate_test": predicateTest }, [])
399 header_output += VfpRegRegRegOpDeclare.subst(vmulSIop);
400 decoder_output += VfpRegRegRegOpConstructor.subst(vmulSIop);
401 exec_output += PredOpExecute.subst(vmulSIop);
402
403 vmulDCode = '''
404 IntDoubleUnion cOp1, cOp2, cDest;
405 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
406 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
407 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
408 VfpSavedState state = prepVfpFpscr(Fpscr);
409 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
410 cDest.fp = cOp1.fp * cOp2.fp;
410 cDest.fp = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
411 __asm__ __volatile__("" :: "m" (cDest.fp));
412 Fpscr = setVfpFpscr(Fpscr, state);
413 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
414 (isinf(cOp2.fp) && cOp1.fp == 0)) {
415 cDest.fp = NAN;
416 }
417 FpDestP0.uw = cDest.bits;
418 FpDestP1.uw = cDest.bits >> 32;
419 '''
420 vmulDIop = InstObjParams("vmuld", "VmulD", "VfpRegRegRegOp",
421 { "code": vmulDCode,
422 "predicate_test": predicateTest }, [])
423 header_output += VfpRegRegRegOpDeclare.subst(vmulDIop);
424 decoder_output += VfpRegRegRegOpConstructor.subst(vmulDIop);
425 exec_output += PredOpExecute.subst(vmulDIop);
426
427 vnegSCode = '''
428 FpDest = -FpOp1;
429 '''
430 vnegSIop = InstObjParams("vnegs", "VnegS", "VfpRegRegOp",
431 { "code": vnegSCode,
432 "predicate_test": predicateTest }, [])
433 header_output += VfpRegRegOpDeclare.subst(vnegSIop);
434 decoder_output += VfpRegRegOpConstructor.subst(vnegSIop);
435 exec_output += PredOpExecute.subst(vnegSIop);
436
437 vnegDCode = '''
438 IntDoubleUnion cOp1, cDest;
439 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
440 cDest.fp = -cOp1.fp;
441 FpDestP0.uw = cDest.bits;
442 FpDestP1.uw = cDest.bits >> 32;
443 '''
444 vnegDIop = InstObjParams("vnegd", "VnegD", "VfpRegRegOp",
445 { "code": vnegDCode,
446 "predicate_test": predicateTest }, [])
447 header_output += VfpRegRegOpDeclare.subst(vnegDIop);
448 decoder_output += VfpRegRegOpConstructor.subst(vnegDIop);
449 exec_output += PredOpExecute.subst(vnegDIop);
450
451 vabsSCode = '''
452 FpDest = fabsf(FpOp1);
453 '''
454 vabsSIop = InstObjParams("vabss", "VabsS", "VfpRegRegOp",
455 { "code": vabsSCode,
456 "predicate_test": predicateTest }, [])
457 header_output += VfpRegRegOpDeclare.subst(vabsSIop);
458 decoder_output += VfpRegRegOpConstructor.subst(vabsSIop);
459 exec_output += PredOpExecute.subst(vabsSIop);
460
461 vabsDCode = '''
462 IntDoubleUnion cOp1, cDest;
463 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
464 cDest.fp = fabs(cOp1.fp);
465 FpDestP0.uw = cDest.bits;
466 FpDestP1.uw = cDest.bits >> 32;
467 '''
468 vabsDIop = InstObjParams("vabsd", "VabsD", "VfpRegRegOp",
469 { "code": vabsDCode,
470 "predicate_test": predicateTest }, [])
471 header_output += VfpRegRegOpDeclare.subst(vabsDIop);
472 decoder_output += VfpRegRegOpConstructor.subst(vabsDIop);
473 exec_output += PredOpExecute.subst(vabsDIop);
474
475 vaddSCode = '''
476 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
477 VfpSavedState state = prepVfpFpscr(Fpscr);
478 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
411 __asm__ __volatile__("" :: "m" (cDest.fp));
412 Fpscr = setVfpFpscr(Fpscr, state);
413 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
414 (isinf(cOp2.fp) && cOp1.fp == 0)) {
415 cDest.fp = NAN;
416 }
417 FpDestP0.uw = cDest.bits;
418 FpDestP1.uw = cDest.bits >> 32;
419 '''
420 vmulDIop = InstObjParams("vmuld", "VmulD", "VfpRegRegRegOp",
421 { "code": vmulDCode,
422 "predicate_test": predicateTest }, [])
423 header_output += VfpRegRegRegOpDeclare.subst(vmulDIop);
424 decoder_output += VfpRegRegRegOpConstructor.subst(vmulDIop);
425 exec_output += PredOpExecute.subst(vmulDIop);
426
427 vnegSCode = '''
428 FpDest = -FpOp1;
429 '''
430 vnegSIop = InstObjParams("vnegs", "VnegS", "VfpRegRegOp",
431 { "code": vnegSCode,
432 "predicate_test": predicateTest }, [])
433 header_output += VfpRegRegOpDeclare.subst(vnegSIop);
434 decoder_output += VfpRegRegOpConstructor.subst(vnegSIop);
435 exec_output += PredOpExecute.subst(vnegSIop);
436
437 vnegDCode = '''
438 IntDoubleUnion cOp1, cDest;
439 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
440 cDest.fp = -cOp1.fp;
441 FpDestP0.uw = cDest.bits;
442 FpDestP1.uw = cDest.bits >> 32;
443 '''
444 vnegDIop = InstObjParams("vnegd", "VnegD", "VfpRegRegOp",
445 { "code": vnegDCode,
446 "predicate_test": predicateTest }, [])
447 header_output += VfpRegRegOpDeclare.subst(vnegDIop);
448 decoder_output += VfpRegRegOpConstructor.subst(vnegDIop);
449 exec_output += PredOpExecute.subst(vnegDIop);
450
451 vabsSCode = '''
452 FpDest = fabsf(FpOp1);
453 '''
454 vabsSIop = InstObjParams("vabss", "VabsS", "VfpRegRegOp",
455 { "code": vabsSCode,
456 "predicate_test": predicateTest }, [])
457 header_output += VfpRegRegOpDeclare.subst(vabsSIop);
458 decoder_output += VfpRegRegOpConstructor.subst(vabsSIop);
459 exec_output += PredOpExecute.subst(vabsSIop);
460
461 vabsDCode = '''
462 IntDoubleUnion cOp1, cDest;
463 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
464 cDest.fp = fabs(cOp1.fp);
465 FpDestP0.uw = cDest.bits;
466 FpDestP1.uw = cDest.bits >> 32;
467 '''
468 vabsDIop = InstObjParams("vabsd", "VabsD", "VfpRegRegOp",
469 { "code": vabsDCode,
470 "predicate_test": predicateTest }, [])
471 header_output += VfpRegRegOpDeclare.subst(vabsDIop);
472 decoder_output += VfpRegRegOpConstructor.subst(vabsDIop);
473 exec_output += PredOpExecute.subst(vabsDIop);
474
475 vaddSCode = '''
476 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
477 VfpSavedState state = prepVfpFpscr(Fpscr);
478 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
479 FpDest = FpOp1 + FpOp2;
479 FpDest = fixNan(Fpscr, FpOp1 + FpOp2, FpOp1, FpOp2);
480 __asm__ __volatile__("" :: "m" (FpDest));
481 Fpscr = setVfpFpscr(Fpscr, state);
482 '''
483 vaddSIop = InstObjParams("vadds", "VaddS", "VfpRegRegRegOp",
484 { "code": vaddSCode,
485 "predicate_test": predicateTest }, [])
486 header_output += VfpRegRegRegOpDeclare.subst(vaddSIop);
487 decoder_output += VfpRegRegRegOpConstructor.subst(vaddSIop);
488 exec_output += PredOpExecute.subst(vaddSIop);
489
490 vaddDCode = '''
491 IntDoubleUnion cOp1, cOp2, cDest;
492 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
493 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
494 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
495 VfpSavedState state = prepVfpFpscr(Fpscr);
496 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
480 __asm__ __volatile__("" :: "m" (FpDest));
481 Fpscr = setVfpFpscr(Fpscr, state);
482 '''
483 vaddSIop = InstObjParams("vadds", "VaddS", "VfpRegRegRegOp",
484 { "code": vaddSCode,
485 "predicate_test": predicateTest }, [])
486 header_output += VfpRegRegRegOpDeclare.subst(vaddSIop);
487 decoder_output += VfpRegRegRegOpConstructor.subst(vaddSIop);
488 exec_output += PredOpExecute.subst(vaddSIop);
489
490 vaddDCode = '''
491 IntDoubleUnion cOp1, cOp2, cDest;
492 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
493 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
494 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
495 VfpSavedState state = prepVfpFpscr(Fpscr);
496 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
497 cDest.fp = cOp1.fp + cOp2.fp;
497 cDest.fp = fixNan(Fpscr, cOp1.fp + cOp2.fp, cOp1.fp, cOp2.fp);
498 __asm__ __volatile__("" :: "m" (cDest.fp));
499 Fpscr = setVfpFpscr(Fpscr, state);
500 FpDestP0.uw = cDest.bits;
501 FpDestP1.uw = cDest.bits >> 32;
502 '''
503 vaddDIop = InstObjParams("vaddd", "VaddD", "VfpRegRegRegOp",
504 { "code": vaddDCode,
505 "predicate_test": predicateTest }, [])
506 header_output += VfpRegRegRegOpDeclare.subst(vaddDIop);
507 decoder_output += VfpRegRegRegOpConstructor.subst(vaddDIop);
508 exec_output += PredOpExecute.subst(vaddDIop);
509
510 vsubSCode = '''
511 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
512 VfpSavedState state = prepVfpFpscr(Fpscr);
513 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
498 __asm__ __volatile__("" :: "m" (cDest.fp));
499 Fpscr = setVfpFpscr(Fpscr, state);
500 FpDestP0.uw = cDest.bits;
501 FpDestP1.uw = cDest.bits >> 32;
502 '''
503 vaddDIop = InstObjParams("vaddd", "VaddD", "VfpRegRegRegOp",
504 { "code": vaddDCode,
505 "predicate_test": predicateTest }, [])
506 header_output += VfpRegRegRegOpDeclare.subst(vaddDIop);
507 decoder_output += VfpRegRegRegOpConstructor.subst(vaddDIop);
508 exec_output += PredOpExecute.subst(vaddDIop);
509
510 vsubSCode = '''
511 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
512 VfpSavedState state = prepVfpFpscr(Fpscr);
513 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
514 FpDest = FpOp1 - FpOp2;
514 FpDest = fixNan(Fpscr, FpOp1 - FpOp2, FpOp1, FpOp2);
515 __asm__ __volatile__("" :: "m" (FpDest));
516 Fpscr = setVfpFpscr(Fpscr, state)
517 '''
518 vsubSIop = InstObjParams("vsubs", "VsubS", "VfpRegRegRegOp",
519 { "code": vsubSCode,
520 "predicate_test": predicateTest }, [])
521 header_output += VfpRegRegRegOpDeclare.subst(vsubSIop);
522 decoder_output += VfpRegRegRegOpConstructor.subst(vsubSIop);
523 exec_output += PredOpExecute.subst(vsubSIop);
524
525 vsubDCode = '''
526 IntDoubleUnion cOp1, cOp2, cDest;
527 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
528 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
529 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
530 VfpSavedState state = prepVfpFpscr(Fpscr);
531 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
515 __asm__ __volatile__("" :: "m" (FpDest));
516 Fpscr = setVfpFpscr(Fpscr, state)
517 '''
518 vsubSIop = InstObjParams("vsubs", "VsubS", "VfpRegRegRegOp",
519 { "code": vsubSCode,
520 "predicate_test": predicateTest }, [])
521 header_output += VfpRegRegRegOpDeclare.subst(vsubSIop);
522 decoder_output += VfpRegRegRegOpConstructor.subst(vsubSIop);
523 exec_output += PredOpExecute.subst(vsubSIop);
524
525 vsubDCode = '''
526 IntDoubleUnion cOp1, cOp2, cDest;
527 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
528 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
529 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
530 VfpSavedState state = prepVfpFpscr(Fpscr);
531 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
532 cDest.fp = cOp1.fp - cOp2.fp;
532 cDest.fp = fixNan(Fpscr, cOp1.fp - cOp2.fp, cOp1.fp, cOp2.fp);
533 __asm__ __volatile__("" :: "m" (cDest.fp));
534 Fpscr = setVfpFpscr(Fpscr, state);
535 FpDestP0.uw = cDest.bits;
536 FpDestP1.uw = cDest.bits >> 32;
537 '''
538 vsubDIop = InstObjParams("vsubd", "VsubD", "VfpRegRegRegOp",
539 { "code": vsubDCode,
540 "predicate_test": predicateTest }, [])
541 header_output += VfpRegRegRegOpDeclare.subst(vsubDIop);
542 decoder_output += VfpRegRegRegOpConstructor.subst(vsubDIop);
543 exec_output += PredOpExecute.subst(vsubDIop);
544
545 vdivSCode = '''
546 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
547 VfpSavedState state = prepVfpFpscr(Fpscr);
548 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
533 __asm__ __volatile__("" :: "m" (cDest.fp));
534 Fpscr = setVfpFpscr(Fpscr, state);
535 FpDestP0.uw = cDest.bits;
536 FpDestP1.uw = cDest.bits >> 32;
537 '''
538 vsubDIop = InstObjParams("vsubd", "VsubD", "VfpRegRegRegOp",
539 { "code": vsubDCode,
540 "predicate_test": predicateTest }, [])
541 header_output += VfpRegRegRegOpDeclare.subst(vsubDIop);
542 decoder_output += VfpRegRegRegOpConstructor.subst(vsubDIop);
543 exec_output += PredOpExecute.subst(vsubDIop);
544
545 vdivSCode = '''
546 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
547 VfpSavedState state = prepVfpFpscr(Fpscr);
548 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
549 FpDest = FpOp1 / FpOp2;
549 FpDest = fixNan(Fpscr, FpOp1 / FpOp2, FpOp1, FpOp2);
550 __asm__ __volatile__("" :: "m" (FpDest));
551 Fpscr = setVfpFpscr(Fpscr, state);
552 '''
553 vdivSIop = InstObjParams("vdivs", "VdivS", "VfpRegRegRegOp",
554 { "code": vdivSCode,
555 "predicate_test": predicateTest }, [])
556 header_output += VfpRegRegRegOpDeclare.subst(vdivSIop);
557 decoder_output += VfpRegRegRegOpConstructor.subst(vdivSIop);
558 exec_output += PredOpExecute.subst(vdivSIop);
559
560 vdivDCode = '''
561 IntDoubleUnion cOp1, cOp2, cDest;
562 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
563 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
564 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
565 VfpSavedState state = prepVfpFpscr(Fpscr);
566 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
550 __asm__ __volatile__("" :: "m" (FpDest));
551 Fpscr = setVfpFpscr(Fpscr, state);
552 '''
553 vdivSIop = InstObjParams("vdivs", "VdivS", "VfpRegRegRegOp",
554 { "code": vdivSCode,
555 "predicate_test": predicateTest }, [])
556 header_output += VfpRegRegRegOpDeclare.subst(vdivSIop);
557 decoder_output += VfpRegRegRegOpConstructor.subst(vdivSIop);
558 exec_output += PredOpExecute.subst(vdivSIop);
559
560 vdivDCode = '''
561 IntDoubleUnion cOp1, cOp2, cDest;
562 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
563 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
564 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
565 VfpSavedState state = prepVfpFpscr(Fpscr);
566 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
567 cDest.fp = cOp1.fp / cOp2.fp;
567 cDest.fp = fixNan(Fpscr, cOp1.fp / cOp2.fp, cOp1.fp, cOp2.fp);
568 __asm__ __volatile__("" :: "m" (cDest.fp));
569 Fpscr = setVfpFpscr(Fpscr, state);
570 FpDestP0.uw = cDest.bits;
571 FpDestP1.uw = cDest.bits >> 32;
572 '''
573 vdivDIop = InstObjParams("vdivd", "VdivD", "VfpRegRegRegOp",
574 { "code": vdivDCode,
575 "predicate_test": predicateTest }, [])
576 header_output += VfpRegRegRegOpDeclare.subst(vdivDIop);
577 decoder_output += VfpRegRegRegOpConstructor.subst(vdivDIop);
578 exec_output += PredOpExecute.subst(vdivDIop);
579
580 vsqrtSCode = '''
581 vfpFlushToZero(Fpscr, FpOp1);
582 VfpSavedState state = prepVfpFpscr(Fpscr);
583 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
584 FpDest = sqrtf(FpOp1);
585 __asm__ __volatile__("" :: "m" (FpDest));
586 Fpscr = setVfpFpscr(Fpscr, state);
587 if (FpOp1 < 0) {
588 FpDest = NAN;
589 }
590 '''
591 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "VfpRegRegOp",
592 { "code": vsqrtSCode,
593 "predicate_test": predicateTest }, [])
594 header_output += VfpRegRegOpDeclare.subst(vsqrtSIop);
595 decoder_output += VfpRegRegOpConstructor.subst(vsqrtSIop);
596 exec_output += PredOpExecute.subst(vsqrtSIop);
597
598 vsqrtDCode = '''
599 IntDoubleUnion cOp1, cDest;
600 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
601 vfpFlushToZero(Fpscr, cOp1.fp);
602 VfpSavedState state = prepVfpFpscr(Fpscr);
603 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
604 cDest.fp = sqrt(cOp1.fp);
605 __asm__ __volatile__("" :: "m" (cDest.fp));
606 Fpscr = setVfpFpscr(Fpscr, state);
607 if (cOp1.fp < 0) {
608 cDest.fp = NAN;
609 }
610 FpDestP0.uw = cDest.bits;
611 FpDestP1.uw = cDest.bits >> 32;
612 '''
613 vsqrtDIop = InstObjParams("vsqrtd", "VsqrtD", "VfpRegRegOp",
614 { "code": vsqrtDCode,
615 "predicate_test": predicateTest }, [])
616 header_output += VfpRegRegOpDeclare.subst(vsqrtDIop);
617 decoder_output += VfpRegRegOpConstructor.subst(vsqrtDIop);
618 exec_output += PredOpExecute.subst(vsqrtDIop);
619}};
620
621let {{
622
623 header_output = ""
624 decoder_output = ""
625 exec_output = ""
626
627 vmlaSCode = '''
628 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
629 VfpSavedState state = prepVfpFpscr(Fpscr);
630 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
568 __asm__ __volatile__("" :: "m" (cDest.fp));
569 Fpscr = setVfpFpscr(Fpscr, state);
570 FpDestP0.uw = cDest.bits;
571 FpDestP1.uw = cDest.bits >> 32;
572 '''
573 vdivDIop = InstObjParams("vdivd", "VdivD", "VfpRegRegRegOp",
574 { "code": vdivDCode,
575 "predicate_test": predicateTest }, [])
576 header_output += VfpRegRegRegOpDeclare.subst(vdivDIop);
577 decoder_output += VfpRegRegRegOpConstructor.subst(vdivDIop);
578 exec_output += PredOpExecute.subst(vdivDIop);
579
580 vsqrtSCode = '''
581 vfpFlushToZero(Fpscr, FpOp1);
582 VfpSavedState state = prepVfpFpscr(Fpscr);
583 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
584 FpDest = sqrtf(FpOp1);
585 __asm__ __volatile__("" :: "m" (FpDest));
586 Fpscr = setVfpFpscr(Fpscr, state);
587 if (FpOp1 < 0) {
588 FpDest = NAN;
589 }
590 '''
591 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "VfpRegRegOp",
592 { "code": vsqrtSCode,
593 "predicate_test": predicateTest }, [])
594 header_output += VfpRegRegOpDeclare.subst(vsqrtSIop);
595 decoder_output += VfpRegRegOpConstructor.subst(vsqrtSIop);
596 exec_output += PredOpExecute.subst(vsqrtSIop);
597
598 vsqrtDCode = '''
599 IntDoubleUnion cOp1, cDest;
600 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
601 vfpFlushToZero(Fpscr, cOp1.fp);
602 VfpSavedState state = prepVfpFpscr(Fpscr);
603 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
604 cDest.fp = sqrt(cOp1.fp);
605 __asm__ __volatile__("" :: "m" (cDest.fp));
606 Fpscr = setVfpFpscr(Fpscr, state);
607 if (cOp1.fp < 0) {
608 cDest.fp = NAN;
609 }
610 FpDestP0.uw = cDest.bits;
611 FpDestP1.uw = cDest.bits >> 32;
612 '''
613 vsqrtDIop = InstObjParams("vsqrtd", "VsqrtD", "VfpRegRegOp",
614 { "code": vsqrtDCode,
615 "predicate_test": predicateTest }, [])
616 header_output += VfpRegRegOpDeclare.subst(vsqrtDIop);
617 decoder_output += VfpRegRegOpConstructor.subst(vsqrtDIop);
618 exec_output += PredOpExecute.subst(vsqrtDIop);
619}};
620
621let {{
622
623 header_output = ""
624 decoder_output = ""
625 exec_output = ""
626
627 vmlaSCode = '''
628 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
629 VfpSavedState state = prepVfpFpscr(Fpscr);
630 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
631 float mid = FpOp1 * FpOp2;
631 float mid = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
632 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
633 mid = NAN;
634 }
635 vfpFlushToZero(Fpscr, FpDest, mid);
632 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
633 mid = NAN;
634 }
635 vfpFlushToZero(Fpscr, FpDest, mid);
636 FpDest = FpDest + mid;
636 FpDest = fixNan(Fpscr, FpDest + mid, FpDest, mid);
637 __asm__ __volatile__("" :: "m" (FpDest));
638 Fpscr = setVfpFpscr(Fpscr, state);
639 '''
640 vmlaSIop = InstObjParams("vmlas", "VmlaS", "VfpRegRegRegOp",
641 { "code": vmlaSCode,
642 "predicate_test": predicateTest }, [])
643 header_output += VfpRegRegRegOpDeclare.subst(vmlaSIop);
644 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaSIop);
645 exec_output += PredOpExecute.subst(vmlaSIop);
646
647 vmlaDCode = '''
648 IntDoubleUnion cOp1, cOp2, cDest;
649 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
650 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
651 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
652 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
653 VfpSavedState state = prepVfpFpscr(Fpscr);
654 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
637 __asm__ __volatile__("" :: "m" (FpDest));
638 Fpscr = setVfpFpscr(Fpscr, state);
639 '''
640 vmlaSIop = InstObjParams("vmlas", "VmlaS", "VfpRegRegRegOp",
641 { "code": vmlaSCode,
642 "predicate_test": predicateTest }, [])
643 header_output += VfpRegRegRegOpDeclare.subst(vmlaSIop);
644 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaSIop);
645 exec_output += PredOpExecute.subst(vmlaSIop);
646
647 vmlaDCode = '''
648 IntDoubleUnion cOp1, cOp2, cDest;
649 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
650 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
651 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
652 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
653 VfpSavedState state = prepVfpFpscr(Fpscr);
654 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
655 double mid = cOp1.fp * cOp2.fp;
655 double mid = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
656 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
657 (isinf(cOp2.fp) && cOp1.fp == 0)) {
658 mid = NAN;
659 }
660 vfpFlushToZero(Fpscr, cDest.fp, mid);
656 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
657 (isinf(cOp2.fp) && cOp1.fp == 0)) {
658 mid = NAN;
659 }
660 vfpFlushToZero(Fpscr, cDest.fp, mid);
661 cDest.fp = cDest.fp + mid;
661 cDest.fp = fixNan(Fpscr, cDest.fp + mid, cDest.fp, mid);
662 __asm__ __volatile__("" :: "m" (cDest.fp));
663 Fpscr = setVfpFpscr(Fpscr, state);
664 FpDestP0.uw = cDest.bits;
665 FpDestP1.uw = cDest.bits >> 32;
666 '''
667 vmlaDIop = InstObjParams("vmlad", "VmlaD", "VfpRegRegRegOp",
668 { "code": vmlaDCode,
669 "predicate_test": predicateTest }, [])
670 header_output += VfpRegRegRegOpDeclare.subst(vmlaDIop);
671 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaDIop);
672 exec_output += PredOpExecute.subst(vmlaDIop);
673
674 vmlsSCode = '''
675 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
676 VfpSavedState state = prepVfpFpscr(Fpscr);
677 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
662 __asm__ __volatile__("" :: "m" (cDest.fp));
663 Fpscr = setVfpFpscr(Fpscr, state);
664 FpDestP0.uw = cDest.bits;
665 FpDestP1.uw = cDest.bits >> 32;
666 '''
667 vmlaDIop = InstObjParams("vmlad", "VmlaD", "VfpRegRegRegOp",
668 { "code": vmlaDCode,
669 "predicate_test": predicateTest }, [])
670 header_output += VfpRegRegRegOpDeclare.subst(vmlaDIop);
671 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaDIop);
672 exec_output += PredOpExecute.subst(vmlaDIop);
673
674 vmlsSCode = '''
675 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
676 VfpSavedState state = prepVfpFpscr(Fpscr);
677 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
678 float mid = FpOp1 * FpOp2;
678 float mid = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
679 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
680 mid = NAN;
681 }
682 vfpFlushToZero(Fpscr, FpDest, mid);
679 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
680 mid = NAN;
681 }
682 vfpFlushToZero(Fpscr, FpDest, mid);
683 FpDest = FpDest - mid;
683 FpDest = fixNan(Fpscr, FpDest - mid, FpDest, mid);
684 __asm__ __volatile__("" :: "m" (FpDest));
685 Fpscr = setVfpFpscr(Fpscr, state);
686 '''
687 vmlsSIop = InstObjParams("vmlss", "VmlsS", "VfpRegRegRegOp",
688 { "code": vmlsSCode,
689 "predicate_test": predicateTest }, [])
690 header_output += VfpRegRegRegOpDeclare.subst(vmlsSIop);
691 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsSIop);
692 exec_output += PredOpExecute.subst(vmlsSIop);
693
694 vmlsDCode = '''
695 IntDoubleUnion cOp1, cOp2, cDest;
696 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
697 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
698 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
699 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
700 VfpSavedState state = prepVfpFpscr(Fpscr);
701 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
684 __asm__ __volatile__("" :: "m" (FpDest));
685 Fpscr = setVfpFpscr(Fpscr, state);
686 '''
687 vmlsSIop = InstObjParams("vmlss", "VmlsS", "VfpRegRegRegOp",
688 { "code": vmlsSCode,
689 "predicate_test": predicateTest }, [])
690 header_output += VfpRegRegRegOpDeclare.subst(vmlsSIop);
691 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsSIop);
692 exec_output += PredOpExecute.subst(vmlsSIop);
693
694 vmlsDCode = '''
695 IntDoubleUnion cOp1, cOp2, cDest;
696 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
697 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
698 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
699 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
700 VfpSavedState state = prepVfpFpscr(Fpscr);
701 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
702 double mid = cOp1.fp * cOp2.fp;
702 double mid = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
703 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
704 (isinf(cOp2.fp) && cOp1.fp == 0)) {
705 mid = NAN;
706 }
703 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
704 (isinf(cOp2.fp) && cOp1.fp == 0)) {
705 mid = NAN;
706 }
707 cDest.fp = cDest.fp - mid;
707 cDest.fp = fixNan(Fpscr, cDest.fp - mid, cDest.fp, mid);
708 vfpFlushToZero(Fpscr, cDest.fp, mid);
709 __asm__ __volatile__("" :: "m" (cDest.fp));
710 Fpscr = setVfpFpscr(Fpscr, state);
711 FpDestP0.uw = cDest.bits;
712 FpDestP1.uw = cDest.bits >> 32;
713 '''
714 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "VfpRegRegRegOp",
715 { "code": vmlsDCode,
716 "predicate_test": predicateTest }, [])
717 header_output += VfpRegRegRegOpDeclare.subst(vmlsDIop);
718 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsDIop);
719 exec_output += PredOpExecute.subst(vmlsDIop);
720
721 vnmlaSCode = '''
722 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
723 VfpSavedState state = prepVfpFpscr(Fpscr);
724 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
708 vfpFlushToZero(Fpscr, cDest.fp, mid);
709 __asm__ __volatile__("" :: "m" (cDest.fp));
710 Fpscr = setVfpFpscr(Fpscr, state);
711 FpDestP0.uw = cDest.bits;
712 FpDestP1.uw = cDest.bits >> 32;
713 '''
714 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "VfpRegRegRegOp",
715 { "code": vmlsDCode,
716 "predicate_test": predicateTest }, [])
717 header_output += VfpRegRegRegOpDeclare.subst(vmlsDIop);
718 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsDIop);
719 exec_output += PredOpExecute.subst(vmlsDIop);
720
721 vnmlaSCode = '''
722 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
723 VfpSavedState state = prepVfpFpscr(Fpscr);
724 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
725 float mid = FpOp1 * FpOp2;
725 float mid = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
726 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
727 mid = NAN;
728 }
729 vfpFlushToZero(Fpscr, FpDest, mid);
726 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
727 mid = NAN;
728 }
729 vfpFlushToZero(Fpscr, FpDest, mid);
730 FpDest = -FpDest - mid;
730 FpDest = fixNan(Fpscr, -FpDest - mid, FpDest, mid);
731 __asm__ __volatile__("" :: "m" (FpDest));
732 Fpscr = setVfpFpscr(Fpscr, state);
733 '''
734 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "VfpRegRegRegOp",
735 { "code": vnmlaSCode,
736 "predicate_test": predicateTest }, [])
737 header_output += VfpRegRegRegOpDeclare.subst(vnmlaSIop);
738 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaSIop);
739 exec_output += PredOpExecute.subst(vnmlaSIop);
740
741 vnmlaDCode = '''
742 IntDoubleUnion cOp1, cOp2, cDest;
743 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
744 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
745 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
746 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
747 VfpSavedState state = prepVfpFpscr(Fpscr);
748 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
731 __asm__ __volatile__("" :: "m" (FpDest));
732 Fpscr = setVfpFpscr(Fpscr, state);
733 '''
734 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "VfpRegRegRegOp",
735 { "code": vnmlaSCode,
736 "predicate_test": predicateTest }, [])
737 header_output += VfpRegRegRegOpDeclare.subst(vnmlaSIop);
738 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaSIop);
739 exec_output += PredOpExecute.subst(vnmlaSIop);
740
741 vnmlaDCode = '''
742 IntDoubleUnion cOp1, cOp2, cDest;
743 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
744 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
745 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
746 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
747 VfpSavedState state = prepVfpFpscr(Fpscr);
748 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
749 double mid = cOp1.fp * cOp2.fp;
749 double mid = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
750 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
751 (isinf(cOp2.fp) && cOp1.fp == 0)) {
752 mid = NAN;
753 }
754 vfpFlushToZero(Fpscr, cDest.fp, mid);
750 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
751 (isinf(cOp2.fp) && cOp1.fp == 0)) {
752 mid = NAN;
753 }
754 vfpFlushToZero(Fpscr, cDest.fp, mid);
755 cDest.fp = -cDest.fp - mid;
755 cDest.fp = fixNan(Fpscr, -cDest.fp - mid, cDest.fp, mid);
756 __asm__ __volatile__("" :: "m" (cDest.fp));
757 Fpscr = setVfpFpscr(Fpscr, state);
758 FpDestP0.uw = cDest.bits;
759 FpDestP1.uw = cDest.bits >> 32;
760 '''
761 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "VfpRegRegRegOp",
762 { "code": vnmlaDCode,
763 "predicate_test": predicateTest }, [])
764 header_output += VfpRegRegRegOpDeclare.subst(vnmlaDIop);
765 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaDIop);
766 exec_output += PredOpExecute.subst(vnmlaDIop);
767
768 vnmlsSCode = '''
769 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
770 VfpSavedState state = prepVfpFpscr(Fpscr);
771 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
756 __asm__ __volatile__("" :: "m" (cDest.fp));
757 Fpscr = setVfpFpscr(Fpscr, state);
758 FpDestP0.uw = cDest.bits;
759 FpDestP1.uw = cDest.bits >> 32;
760 '''
761 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "VfpRegRegRegOp",
762 { "code": vnmlaDCode,
763 "predicate_test": predicateTest }, [])
764 header_output += VfpRegRegRegOpDeclare.subst(vnmlaDIop);
765 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaDIop);
766 exec_output += PredOpExecute.subst(vnmlaDIop);
767
768 vnmlsSCode = '''
769 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
770 VfpSavedState state = prepVfpFpscr(Fpscr);
771 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
772 float mid = FpOp1 * FpOp2;
772 float mid = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
773 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
774 mid = NAN;
775 }
776 vfpFlushToZero(Fpscr, FpDest, mid);
773 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
774 mid = NAN;
775 }
776 vfpFlushToZero(Fpscr, FpDest, mid);
777 FpDest = -FpDest + mid;
777 FpDest = fixNan(Fpscr, -FpDest + mid, FpDest, mid);
778 __asm__ __volatile__("" :: "m" (FpDest));
779 Fpscr = setVfpFpscr(Fpscr, state);
780 '''
781 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "VfpRegRegRegOp",
782 { "code": vnmlsSCode,
783 "predicate_test": predicateTest }, [])
784 header_output += VfpRegRegRegOpDeclare.subst(vnmlsSIop);
785 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsSIop);
786 exec_output += PredOpExecute.subst(vnmlsSIop);
787
788 vnmlsDCode = '''
789 IntDoubleUnion cOp1, cOp2, cDest;
790 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
791 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
792 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
793 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
794 VfpSavedState state = prepVfpFpscr(Fpscr);
795 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
778 __asm__ __volatile__("" :: "m" (FpDest));
779 Fpscr = setVfpFpscr(Fpscr, state);
780 '''
781 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "VfpRegRegRegOp",
782 { "code": vnmlsSCode,
783 "predicate_test": predicateTest }, [])
784 header_output += VfpRegRegRegOpDeclare.subst(vnmlsSIop);
785 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsSIop);
786 exec_output += PredOpExecute.subst(vnmlsSIop);
787
788 vnmlsDCode = '''
789 IntDoubleUnion cOp1, cOp2, cDest;
790 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
791 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
792 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
793 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
794 VfpSavedState state = prepVfpFpscr(Fpscr);
795 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
796 double mid = cOp1.fp * cOp2.fp;
796 double mid = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
797 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
798 (isinf(cOp2.fp) && cOp1.fp == 0)) {
799 mid = NAN;
800 }
801 vfpFlushToZero(Fpscr, cDest.fp, mid);
797 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
798 (isinf(cOp2.fp) && cOp1.fp == 0)) {
799 mid = NAN;
800 }
801 vfpFlushToZero(Fpscr, cDest.fp, mid);
802 cDest.fp = -cDest.fp + mid;
802 cDest.fp = fixNan(Fpscr, -cDest.fp + mid, cDest.fp, mid);
803 __asm__ __volatile__("" :: "m" (cDest.fp));
804 Fpscr = setVfpFpscr(Fpscr, state);
805 FpDestP0.uw = cDest.bits;
806 FpDestP1.uw = cDest.bits >> 32;
807 '''
808 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "VfpRegRegRegOp",
809 { "code": vnmlsDCode,
810 "predicate_test": predicateTest }, [])
811 header_output += VfpRegRegRegOpDeclare.subst(vnmlsDIop);
812 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsDIop);
813 exec_output += PredOpExecute.subst(vnmlsDIop);
814
815 vnmulSCode = '''
816 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
817 VfpSavedState state = prepVfpFpscr(Fpscr);
818 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
803 __asm__ __volatile__("" :: "m" (cDest.fp));
804 Fpscr = setVfpFpscr(Fpscr, state);
805 FpDestP0.uw = cDest.bits;
806 FpDestP1.uw = cDest.bits >> 32;
807 '''
808 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "VfpRegRegRegOp",
809 { "code": vnmlsDCode,
810 "predicate_test": predicateTest }, [])
811 header_output += VfpRegRegRegOpDeclare.subst(vnmlsDIop);
812 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsDIop);
813 exec_output += PredOpExecute.subst(vnmlsDIop);
814
815 vnmulSCode = '''
816 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
817 VfpSavedState state = prepVfpFpscr(Fpscr);
818 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
819 float mid = FpOp1 * FpOp2;
819 float mid = fixNan(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
820 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
821 mid = NAN;
822 }
823 FpDest = -mid;
824 __asm__ __volatile__("" :: "m" (FpDest));
825 Fpscr = setVfpFpscr(Fpscr, state);
826 '''
827 vnmulSIop = InstObjParams("vnmuls", "VnmulS", "VfpRegRegRegOp",
828 { "code": vnmulSCode,
829 "predicate_test": predicateTest }, [])
830 header_output += VfpRegRegRegOpDeclare.subst(vnmulSIop);
831 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulSIop);
832 exec_output += PredOpExecute.subst(vnmulSIop);
833
834 vnmulDCode = '''
835 IntDoubleUnion cOp1, cOp2, cDest;
836 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
837 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
838 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
839 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
840 VfpSavedState state = prepVfpFpscr(Fpscr);
841 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
820 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
821 mid = NAN;
822 }
823 FpDest = -mid;
824 __asm__ __volatile__("" :: "m" (FpDest));
825 Fpscr = setVfpFpscr(Fpscr, state);
826 '''
827 vnmulSIop = InstObjParams("vnmuls", "VnmulS", "VfpRegRegRegOp",
828 { "code": vnmulSCode,
829 "predicate_test": predicateTest }, [])
830 header_output += VfpRegRegRegOpDeclare.subst(vnmulSIop);
831 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulSIop);
832 exec_output += PredOpExecute.subst(vnmulSIop);
833
834 vnmulDCode = '''
835 IntDoubleUnion cOp1, cOp2, cDest;
836 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
837 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
838 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
839 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
840 VfpSavedState state = prepVfpFpscr(Fpscr);
841 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
842 double mid = cOp1.fp * cOp2.fp;
842 double mid = fixNan(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
843 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
844 (isinf(cOp2.fp) && cOp1.fp == 0)) {
845 mid = NAN;
846 }
847 cDest.fp = -mid;
848 __asm__ __volatile__("" :: "m" (cDest.fp));
849 Fpscr = setVfpFpscr(Fpscr, state);
850 FpDestP0.uw = cDest.bits;
851 FpDestP1.uw = cDest.bits >> 32;
852 '''
853 vnmulDIop = InstObjParams("vnmuld", "VnmulD", "VfpRegRegRegOp",
854 { "code": vnmulDCode,
855 "predicate_test": predicateTest }, [])
856 header_output += VfpRegRegRegOpDeclare.subst(vnmulDIop);
857 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulDIop);
858 exec_output += PredOpExecute.subst(vnmulDIop);
859}};
860
861let {{
862
863 header_output = ""
864 decoder_output = ""
865 exec_output = ""
866
867 vcvtUIntFpSCode = '''
868 VfpSavedState state = prepVfpFpscr(Fpscr);
869 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
870 FpDest = FpOp1.uw;
871 __asm__ __volatile__("" :: "m" (FpDest));
872 Fpscr = setVfpFpscr(Fpscr, state);
873 '''
874 vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "VfpRegRegOp",
875 { "code": vcvtUIntFpSCode,
876 "predicate_test": predicateTest }, [])
877 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpSIop);
878 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpSIop);
879 exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
880
881 vcvtUIntFpDCode = '''
882 IntDoubleUnion cDest;
883 VfpSavedState state = prepVfpFpscr(Fpscr);
884 __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
885 cDest.fp = (uint64_t)FpOp1P0.uw;
886 __asm__ __volatile__("" :: "m" (cDest.fp));
887 Fpscr = setVfpFpscr(Fpscr, state);
888 FpDestP0.uw = cDest.bits;
889 FpDestP1.uw = cDest.bits >> 32;
890 '''
891 vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "VfpRegRegOp",
892 { "code": vcvtUIntFpDCode,
893 "predicate_test": predicateTest }, [])
894 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpDIop);
895 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpDIop);
896 exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
897
898 vcvtSIntFpSCode = '''
899 VfpSavedState state = prepVfpFpscr(Fpscr);
900 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
901 FpDest = FpOp1.sw;
902 __asm__ __volatile__("" :: "m" (FpDest));
903 Fpscr = setVfpFpscr(Fpscr, state);
904 '''
905 vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "VfpRegRegOp",
906 { "code": vcvtSIntFpSCode,
907 "predicate_test": predicateTest }, [])
908 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpSIop);
909 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpSIop);
910 exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
911
912 vcvtSIntFpDCode = '''
913 IntDoubleUnion cDest;
914 VfpSavedState state = prepVfpFpscr(Fpscr);
915 __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
916 cDest.fp = FpOp1P0.sw;
917 __asm__ __volatile__("" :: "m" (cDest.fp));
918 Fpscr = setVfpFpscr(Fpscr, state);
919 FpDestP0.uw = cDest.bits;
920 FpDestP1.uw = cDest.bits >> 32;
921 '''
922 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "VfpRegRegOp",
923 { "code": vcvtSIntFpDCode,
924 "predicate_test": predicateTest }, [])
925 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpDIop);
926 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
927 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
928
929 vcvtFpUIntSRCode = '''
930 vfpFlushToZero(Fpscr, FpOp1);
931 VfpSavedState state = prepVfpFpscr(Fpscr);
932 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
933 FpDest.uw = FpOp1;
934 __asm__ __volatile__("" :: "m" (FpDest.uw));
935 Fpscr = setVfpFpscr(Fpscr, state);
936 '''
937 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
938 { "code": vcvtFpUIntSRCode,
939 "predicate_test": predicateTest }, [])
940 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
941 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
942 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
943
944 vcvtFpUIntDRCode = '''
945 IntDoubleUnion cOp1;
946 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
947 vfpFlushToZero(Fpscr, cOp1.fp);
948 VfpSavedState state = prepVfpFpscr(Fpscr);
949 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
950 uint64_t result = cOp1.fp;
951 __asm__ __volatile__("" :: "m" (result));
952 Fpscr = setVfpFpscr(Fpscr, state);
953 FpDestP0.uw = result;
954 '''
955 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
956 { "code": vcvtFpUIntDRCode,
957 "predicate_test": predicateTest }, [])
958 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
959 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
960 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
961
962 vcvtFpSIntSRCode = '''
963 vfpFlushToZero(Fpscr, FpOp1);
964 VfpSavedState state = prepVfpFpscr(Fpscr);
965 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
966 FpDest.sw = FpOp1;
967 __asm__ __volatile__("" :: "m" (FpDest.sw));
968 Fpscr = setVfpFpscr(Fpscr, state);
969 '''
970 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
971 { "code": vcvtFpSIntSRCode,
972 "predicate_test": predicateTest }, [])
973 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
974 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
975 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
976
977 vcvtFpSIntDRCode = '''
978 IntDoubleUnion cOp1;
979 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
980 vfpFlushToZero(Fpscr, cOp1.fp);
981 VfpSavedState state = prepVfpFpscr(Fpscr);
982 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
983 int64_t result = cOp1.fp;
984 __asm__ __volatile__("" :: "m" (result));
985 Fpscr = setVfpFpscr(Fpscr, state);
986 FpDestP0.uw = result;
987 '''
988 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
989 { "code": vcvtFpSIntDRCode,
990 "predicate_test": predicateTest }, [])
991 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
992 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
993 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
994
995 vcvtFpUIntSCode = '''
996 vfpFlushToZero(Fpscr, FpOp1);
997 VfpSavedState state = prepVfpFpscr(Fpscr);
998 fesetround(FeRoundZero);
999 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1000 FpDest.uw = FpOp1;
1001 __asm__ __volatile__("" :: "m" (FpDest.uw));
1002 Fpscr = setVfpFpscr(Fpscr, state);
1003 '''
1004 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "VfpRegRegOp",
1005 { "code": vcvtFpUIntSCode,
1006 "predicate_test": predicateTest }, [])
1007 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSIop);
1008 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSIop);
1009 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
1010
1011 vcvtFpUIntDCode = '''
1012 IntDoubleUnion cOp1;
1013 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1014 vfpFlushToZero(Fpscr, cOp1.fp);
1015 VfpSavedState state = prepVfpFpscr(Fpscr);
1016 fesetround(FeRoundZero);
1017 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1018 uint64_t result = cOp1.fp;
1019 __asm__ __volatile__("" :: "m" (result));
1020 Fpscr = setVfpFpscr(Fpscr, state);
1021 FpDestP0.uw = result;
1022 '''
1023 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "VfpRegRegOp",
1024 { "code": vcvtFpUIntDCode,
1025 "predicate_test": predicateTest }, [])
1026 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDIop);
1027 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDIop);
1028 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
1029
1030 vcvtFpSIntSCode = '''
1031 vfpFlushToZero(Fpscr, FpOp1);
1032 VfpSavedState state = prepVfpFpscr(Fpscr);
1033 fesetround(FeRoundZero);
1034 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1035 FpDest.sw = FpOp1;
1036 __asm__ __volatile__("" :: "m" (FpDest.sw));
1037 Fpscr = setVfpFpscr(Fpscr, state);
1038 '''
1039 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "VfpRegRegOp",
1040 { "code": vcvtFpSIntSCode,
1041 "predicate_test": predicateTest }, [])
1042 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSIop);
1043 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSIop);
1044 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
1045
1046 vcvtFpSIntDCode = '''
1047 IntDoubleUnion cOp1;
1048 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1049 vfpFlushToZero(Fpscr, cOp1.fp);
1050 VfpSavedState state = prepVfpFpscr(Fpscr);
1051 fesetround(FeRoundZero);
1052 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1053 int64_t result = cOp1.fp;
1054 __asm__ __volatile__("" :: "m" (result));
1055 Fpscr = setVfpFpscr(Fpscr, state);
1056 FpDestP0.uw = result;
1057 '''
1058 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "VfpRegRegOp",
1059 { "code": vcvtFpSIntDCode,
1060 "predicate_test": predicateTest }, [])
1061 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDIop);
1062 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDIop);
1063 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
1064
1065 vcvtFpSFpDCode = '''
1066 IntDoubleUnion cDest;
1067 vfpFlushToZero(Fpscr, FpOp1);
1068 VfpSavedState state = prepVfpFpscr(Fpscr);
1069 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1070 cDest.fp = FpOp1;
1071 __asm__ __volatile__("" :: "m" (cDest.fp));
1072 Fpscr = setVfpFpscr(Fpscr, state);
1073 FpDestP0.uw = cDest.bits;
1074 FpDestP1.uw = cDest.bits >> 32;
1075 '''
1076 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "VfpRegRegOp",
1077 { "code": vcvtFpSFpDCode,
1078 "predicate_test": predicateTest }, [])
1079 header_output += VfpRegRegOpDeclare.subst(vcvtFpSFpDIop);
1080 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSFpDIop);
1081 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
1082
1083 vcvtFpDFpSCode = '''
1084 IntDoubleUnion cOp1;
1085 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1086 vfpFlushToZero(Fpscr, cOp1.fp);
1087 VfpSavedState state = prepVfpFpscr(Fpscr);
1088 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1089 FpDest = cOp1.fp;
1090 __asm__ __volatile__("" :: "m" (FpDest));
1091 Fpscr = setVfpFpscr(Fpscr, state);
1092 '''
1093 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "VfpRegRegOp",
1094 { "code": vcvtFpDFpSCode,
1095 "predicate_test": predicateTest }, [])
1096 header_output += VfpRegRegOpDeclare.subst(vcvtFpDFpSIop);
1097 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpDFpSIop);
1098 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
1099
1100 vcmpSCode = '''
1101 FPSCR fpscr = Fpscr;
1102 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1103 if (FpDest == FpOp1) {
1104 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1105 } else if (FpDest < FpOp1) {
1106 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1107 } else if (FpDest > FpOp1) {
1108 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1109 } else {
1110 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1111 }
1112 Fpscr = fpscr;
1113 '''
1114 vcmpSIop = InstObjParams("vcmps", "VcmpS", "VfpRegRegOp",
1115 { "code": vcmpSCode,
1116 "predicate_test": predicateTest }, [])
1117 header_output += VfpRegRegOpDeclare.subst(vcmpSIop);
1118 decoder_output += VfpRegRegOpConstructor.subst(vcmpSIop);
1119 exec_output += PredOpExecute.subst(vcmpSIop);
1120
1121 vcmpDCode = '''
1122 IntDoubleUnion cOp1, cDest;
1123 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1124 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1125 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1126 FPSCR fpscr = Fpscr;
1127 if (cDest.fp == cOp1.fp) {
1128 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1129 } else if (cDest.fp < cOp1.fp) {
1130 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1131 } else if (cDest.fp > cOp1.fp) {
1132 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1133 } else {
1134 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1135 }
1136 Fpscr = fpscr;
1137 '''
1138 vcmpDIop = InstObjParams("vcmpd", "VcmpD", "VfpRegRegOp",
1139 { "code": vcmpDCode,
1140 "predicate_test": predicateTest }, [])
1141 header_output += VfpRegRegOpDeclare.subst(vcmpDIop);
1142 decoder_output += VfpRegRegOpConstructor.subst(vcmpDIop);
1143 exec_output += PredOpExecute.subst(vcmpDIop);
1144
1145 vcmpZeroSCode = '''
1146 FPSCR fpscr = Fpscr;
1147 vfpFlushToZero(Fpscr, FpDest);
1148 if (FpDest == imm) {
1149 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1150 } else if (FpDest < imm) {
1151 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1152 } else if (FpDest > imm) {
1153 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1154 } else {
1155 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1156 }
1157 Fpscr = fpscr;
1158 '''
1159 vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "VfpRegImmOp",
1160 { "code": vcmpZeroSCode,
1161 "predicate_test": predicateTest }, [])
1162 header_output += VfpRegImmOpDeclare.subst(vcmpZeroSIop);
1163 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroSIop);
1164 exec_output += PredOpExecute.subst(vcmpZeroSIop);
1165
1166 vcmpZeroDCode = '''
1167 IntDoubleUnion cDest;
1168 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1169 vfpFlushToZero(Fpscr, cDest.fp);
1170 FPSCR fpscr = Fpscr;
1171 if (cDest.fp == imm) {
1172 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1173 } else if (cDest.fp < imm) {
1174 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1175 } else if (cDest.fp > imm) {
1176 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1177 } else {
1178 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1179 }
1180 Fpscr = fpscr;
1181 '''
1182 vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "VfpRegImmOp",
1183 { "code": vcmpZeroDCode,
1184 "predicate_test": predicateTest }, [])
1185 header_output += VfpRegImmOpDeclare.subst(vcmpZeroDIop);
1186 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroDIop);
1187 exec_output += PredOpExecute.subst(vcmpZeroDIop);
1188}};
1189
1190let {{
1191
1192 header_output = ""
1193 decoder_output = ""
1194 exec_output = ""
1195
1196 vcvtFpSFixedSCode = '''
1197 vfpFlushToZero(Fpscr, FpOp1);
1198 VfpSavedState state = prepVfpFpscr(Fpscr);
1199 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1200 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1201 __asm__ __volatile__("" :: "m" (FpDest.sw));
1202 Fpscr = setVfpFpscr(Fpscr, state);
1203 '''
1204 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "VfpRegRegImmOp",
1205 { "code": vcvtFpSFixedSCode,
1206 "predicate_test": predicateTest }, [])
1207 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1208 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1209 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1210
1211 vcvtFpSFixedDCode = '''
1212 IntDoubleUnion cOp1;
1213 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1214 vfpFlushToZero(Fpscr, cOp1.fp);
1215 VfpSavedState state = prepVfpFpscr(Fpscr);
1216 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1217 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1218 __asm__ __volatile__("" :: "m" (mid));
1219 Fpscr = setVfpFpscr(Fpscr, state);
1220 FpDestP0.uw = mid;
1221 FpDestP1.uw = mid >> 32;
1222 '''
1223 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "VfpRegRegImmOp",
1224 { "code": vcvtFpSFixedDCode,
1225 "predicate_test": predicateTest }, [])
1226 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1227 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1228 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1229
1230 vcvtFpUFixedSCode = '''
1231 vfpFlushToZero(Fpscr, FpOp1);
1232 VfpSavedState state = prepVfpFpscr(Fpscr);
1233 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1234 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1235 __asm__ __volatile__("" :: "m" (FpDest.uw));
1236 Fpscr = setVfpFpscr(Fpscr, state);
1237 '''
1238 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "VfpRegRegImmOp",
1239 { "code": vcvtFpUFixedSCode,
1240 "predicate_test": predicateTest }, [])
1241 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1242 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1243 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1244
1245 vcvtFpUFixedDCode = '''
1246 IntDoubleUnion cOp1;
1247 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1248 vfpFlushToZero(Fpscr, cOp1.fp);
1249 VfpSavedState state = prepVfpFpscr(Fpscr);
1250 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1251 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1252 __asm__ __volatile__("" :: "m" (mid));
1253 Fpscr = setVfpFpscr(Fpscr, state);
1254 FpDestP0.uw = mid;
1255 FpDestP1.uw = mid >> 32;
1256 '''
1257 vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "VfpRegRegImmOp",
1258 { "code": vcvtFpUFixedDCode,
1259 "predicate_test": predicateTest }, [])
1260 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
1261 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
1262 exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
1263
1264 vcvtSFixedFpSCode = '''
1265 VfpSavedState state = prepVfpFpscr(Fpscr);
1266 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
1267 FpDest = vfpSFixedToFpS(FpOp1.sw, false, imm);
1268 __asm__ __volatile__("" :: "m" (FpDest));
1269 Fpscr = setVfpFpscr(Fpscr, state);
1270 '''
1271 vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "VfpRegRegImmOp",
1272 { "code": vcvtSFixedFpSCode,
1273 "predicate_test": predicateTest }, [])
1274 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
1275 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
1276 exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
1277
1278 vcvtSFixedFpDCode = '''
1279 IntDoubleUnion cDest;
1280 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1281 VfpSavedState state = prepVfpFpscr(Fpscr);
1282 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1283 cDest.fp = vfpSFixedToFpD(mid, false, imm);
1284 __asm__ __volatile__("" :: "m" (cDest.fp));
1285 Fpscr = setVfpFpscr(Fpscr, state);
1286 FpDestP0.uw = cDest.bits;
1287 FpDestP1.uw = cDest.bits >> 32;
1288 '''
1289 vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "VfpRegRegImmOp",
1290 { "code": vcvtSFixedFpDCode,
1291 "predicate_test": predicateTest }, [])
1292 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
1293 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
1294 exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
1295
1296 vcvtUFixedFpSCode = '''
1297 VfpSavedState state = prepVfpFpscr(Fpscr);
1298 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
1299 FpDest = vfpUFixedToFpS(FpOp1.uw, false, imm);
1300 __asm__ __volatile__("" :: "m" (FpDest));
1301 Fpscr = setVfpFpscr(Fpscr, state);
1302 '''
1303 vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "VfpRegRegImmOp",
1304 { "code": vcvtUFixedFpSCode,
1305 "predicate_test": predicateTest }, [])
1306 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
1307 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
1308 exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
1309
1310 vcvtUFixedFpDCode = '''
1311 IntDoubleUnion cDest;
1312 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1313 VfpSavedState state = prepVfpFpscr(Fpscr);
1314 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1315 cDest.fp = vfpUFixedToFpD(mid, false, imm);
1316 __asm__ __volatile__("" :: "m" (cDest.fp));
1317 Fpscr = setVfpFpscr(Fpscr, state);
1318 FpDestP0.uw = cDest.bits;
1319 FpDestP1.uw = cDest.bits >> 32;
1320 '''
1321 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "VfpRegRegImmOp",
1322 { "code": vcvtUFixedFpDCode,
1323 "predicate_test": predicateTest }, [])
1324 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1325 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1326 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1327
1328 vcvtFpSHFixedSCode = '''
1329 vfpFlushToZero(Fpscr, FpOp1);
1330 VfpSavedState state = prepVfpFpscr(Fpscr);
1331 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1332 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1333 __asm__ __volatile__("" :: "m" (FpDest.sh));
1334 Fpscr = setVfpFpscr(Fpscr, state);
1335 '''
1336 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1337 "VfpRegRegImmOp",
1338 { "code": vcvtFpSHFixedSCode,
1339 "predicate_test": predicateTest }, [])
1340 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1341 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1342 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1343
1344 vcvtFpSHFixedDCode = '''
1345 IntDoubleUnion cOp1;
1346 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1347 vfpFlushToZero(Fpscr, cOp1.fp);
1348 VfpSavedState state = prepVfpFpscr(Fpscr);
1349 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1350 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1351 __asm__ __volatile__("" :: "m" (result));
1352 Fpscr = setVfpFpscr(Fpscr, state);
1353 FpDestP0.uw = result;
1354 FpDestP1.uw = result >> 32;
1355 '''
1356 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1357 "VfpRegRegImmOp",
1358 { "code": vcvtFpSHFixedDCode,
1359 "predicate_test": predicateTest }, [])
1360 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1361 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1362 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1363
1364 vcvtFpUHFixedSCode = '''
1365 vfpFlushToZero(Fpscr, FpOp1);
1366 VfpSavedState state = prepVfpFpscr(Fpscr);
1367 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1368 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1369 __asm__ __volatile__("" :: "m" (FpDest.uh));
1370 Fpscr = setVfpFpscr(Fpscr, state);
1371 '''
1372 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1373 "VfpRegRegImmOp",
1374 { "code": vcvtFpUHFixedSCode,
1375 "predicate_test": predicateTest }, [])
1376 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1377 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1378 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1379
1380 vcvtFpUHFixedDCode = '''
1381 IntDoubleUnion cOp1;
1382 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1383 vfpFlushToZero(Fpscr, cOp1.fp);
1384 VfpSavedState state = prepVfpFpscr(Fpscr);
1385 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1386 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1387 __asm__ __volatile__("" :: "m" (mid));
1388 Fpscr = setVfpFpscr(Fpscr, state);
1389 FpDestP0.uw = mid;
1390 FpDestP1.uw = mid >> 32;
1391 '''
1392 vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
1393 "VfpRegRegImmOp",
1394 { "code": vcvtFpUHFixedDCode,
1395 "predicate_test": predicateTest }, [])
1396 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
1397 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
1398 exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
1399
1400 vcvtSHFixedFpSCode = '''
1401 VfpSavedState state = prepVfpFpscr(Fpscr);
1402 __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
1403 FpDest = vfpSFixedToFpS(FpOp1.sh, true, imm);
1404 __asm__ __volatile__("" :: "m" (FpDest));
1405 Fpscr = setVfpFpscr(Fpscr, state);
1406 '''
1407 vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
1408 "VfpRegRegImmOp",
1409 { "code": vcvtSHFixedFpSCode,
1410 "predicate_test": predicateTest }, [])
1411 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
1412 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
1413 exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
1414
1415 vcvtSHFixedFpDCode = '''
1416 IntDoubleUnion cDest;
1417 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1418 VfpSavedState state = prepVfpFpscr(Fpscr);
1419 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1420 cDest.fp = vfpSFixedToFpD(mid, true, imm);
1421 __asm__ __volatile__("" :: "m" (cDest.fp));
1422 Fpscr = setVfpFpscr(Fpscr, state);
1423 FpDestP0.uw = cDest.bits;
1424 FpDestP1.uw = cDest.bits >> 32;
1425 '''
1426 vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
1427 "VfpRegRegImmOp",
1428 { "code": vcvtSHFixedFpDCode,
1429 "predicate_test": predicateTest }, [])
1430 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
1431 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
1432 exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
1433
1434 vcvtUHFixedFpSCode = '''
1435 VfpSavedState state = prepVfpFpscr(Fpscr);
1436 __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
1437 FpDest = vfpUFixedToFpS(FpOp1.uh, true, imm);
1438 __asm__ __volatile__("" :: "m" (FpDest));
1439 Fpscr = setVfpFpscr(Fpscr, state);
1440 '''
1441 vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
1442 "VfpRegRegImmOp",
1443 { "code": vcvtUHFixedFpSCode,
1444 "predicate_test": predicateTest }, [])
1445 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
1446 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
1447 exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
1448
1449 vcvtUHFixedFpDCode = '''
1450 IntDoubleUnion cDest;
1451 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1452 VfpSavedState state = prepVfpFpscr(Fpscr);
1453 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1454 cDest.fp = vfpUFixedToFpD(mid, true, imm);
1455 __asm__ __volatile__("" :: "m" (cDest.fp));
1456 Fpscr = setVfpFpscr(Fpscr, state);
1457 FpDestP0.uw = cDest.bits;
1458 FpDestP1.uw = cDest.bits >> 32;
1459 '''
1460 vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
1461 "VfpRegRegImmOp",
1462 { "code": vcvtUHFixedFpDCode,
1463 "predicate_test": predicateTest }, [])
1464 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
1465 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
1466 exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
1467}};
843 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
844 (isinf(cOp2.fp) && cOp1.fp == 0)) {
845 mid = NAN;
846 }
847 cDest.fp = -mid;
848 __asm__ __volatile__("" :: "m" (cDest.fp));
849 Fpscr = setVfpFpscr(Fpscr, state);
850 FpDestP0.uw = cDest.bits;
851 FpDestP1.uw = cDest.bits >> 32;
852 '''
853 vnmulDIop = InstObjParams("vnmuld", "VnmulD", "VfpRegRegRegOp",
854 { "code": vnmulDCode,
855 "predicate_test": predicateTest }, [])
856 header_output += VfpRegRegRegOpDeclare.subst(vnmulDIop);
857 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulDIop);
858 exec_output += PredOpExecute.subst(vnmulDIop);
859}};
860
861let {{
862
863 header_output = ""
864 decoder_output = ""
865 exec_output = ""
866
867 vcvtUIntFpSCode = '''
868 VfpSavedState state = prepVfpFpscr(Fpscr);
869 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
870 FpDest = FpOp1.uw;
871 __asm__ __volatile__("" :: "m" (FpDest));
872 Fpscr = setVfpFpscr(Fpscr, state);
873 '''
874 vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "VfpRegRegOp",
875 { "code": vcvtUIntFpSCode,
876 "predicate_test": predicateTest }, [])
877 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpSIop);
878 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpSIop);
879 exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
880
881 vcvtUIntFpDCode = '''
882 IntDoubleUnion cDest;
883 VfpSavedState state = prepVfpFpscr(Fpscr);
884 __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
885 cDest.fp = (uint64_t)FpOp1P0.uw;
886 __asm__ __volatile__("" :: "m" (cDest.fp));
887 Fpscr = setVfpFpscr(Fpscr, state);
888 FpDestP0.uw = cDest.bits;
889 FpDestP1.uw = cDest.bits >> 32;
890 '''
891 vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "VfpRegRegOp",
892 { "code": vcvtUIntFpDCode,
893 "predicate_test": predicateTest }, [])
894 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpDIop);
895 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpDIop);
896 exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
897
898 vcvtSIntFpSCode = '''
899 VfpSavedState state = prepVfpFpscr(Fpscr);
900 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
901 FpDest = FpOp1.sw;
902 __asm__ __volatile__("" :: "m" (FpDest));
903 Fpscr = setVfpFpscr(Fpscr, state);
904 '''
905 vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "VfpRegRegOp",
906 { "code": vcvtSIntFpSCode,
907 "predicate_test": predicateTest }, [])
908 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpSIop);
909 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpSIop);
910 exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
911
912 vcvtSIntFpDCode = '''
913 IntDoubleUnion cDest;
914 VfpSavedState state = prepVfpFpscr(Fpscr);
915 __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
916 cDest.fp = FpOp1P0.sw;
917 __asm__ __volatile__("" :: "m" (cDest.fp));
918 Fpscr = setVfpFpscr(Fpscr, state);
919 FpDestP0.uw = cDest.bits;
920 FpDestP1.uw = cDest.bits >> 32;
921 '''
922 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "VfpRegRegOp",
923 { "code": vcvtSIntFpDCode,
924 "predicate_test": predicateTest }, [])
925 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpDIop);
926 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
927 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
928
929 vcvtFpUIntSRCode = '''
930 vfpFlushToZero(Fpscr, FpOp1);
931 VfpSavedState state = prepVfpFpscr(Fpscr);
932 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
933 FpDest.uw = FpOp1;
934 __asm__ __volatile__("" :: "m" (FpDest.uw));
935 Fpscr = setVfpFpscr(Fpscr, state);
936 '''
937 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
938 { "code": vcvtFpUIntSRCode,
939 "predicate_test": predicateTest }, [])
940 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
941 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
942 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
943
944 vcvtFpUIntDRCode = '''
945 IntDoubleUnion cOp1;
946 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
947 vfpFlushToZero(Fpscr, cOp1.fp);
948 VfpSavedState state = prepVfpFpscr(Fpscr);
949 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
950 uint64_t result = cOp1.fp;
951 __asm__ __volatile__("" :: "m" (result));
952 Fpscr = setVfpFpscr(Fpscr, state);
953 FpDestP0.uw = result;
954 '''
955 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
956 { "code": vcvtFpUIntDRCode,
957 "predicate_test": predicateTest }, [])
958 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
959 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
960 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
961
962 vcvtFpSIntSRCode = '''
963 vfpFlushToZero(Fpscr, FpOp1);
964 VfpSavedState state = prepVfpFpscr(Fpscr);
965 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
966 FpDest.sw = FpOp1;
967 __asm__ __volatile__("" :: "m" (FpDest.sw));
968 Fpscr = setVfpFpscr(Fpscr, state);
969 '''
970 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
971 { "code": vcvtFpSIntSRCode,
972 "predicate_test": predicateTest }, [])
973 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
974 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
975 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
976
977 vcvtFpSIntDRCode = '''
978 IntDoubleUnion cOp1;
979 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
980 vfpFlushToZero(Fpscr, cOp1.fp);
981 VfpSavedState state = prepVfpFpscr(Fpscr);
982 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
983 int64_t result = cOp1.fp;
984 __asm__ __volatile__("" :: "m" (result));
985 Fpscr = setVfpFpscr(Fpscr, state);
986 FpDestP0.uw = result;
987 '''
988 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
989 { "code": vcvtFpSIntDRCode,
990 "predicate_test": predicateTest }, [])
991 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
992 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
993 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
994
995 vcvtFpUIntSCode = '''
996 vfpFlushToZero(Fpscr, FpOp1);
997 VfpSavedState state = prepVfpFpscr(Fpscr);
998 fesetround(FeRoundZero);
999 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1000 FpDest.uw = FpOp1;
1001 __asm__ __volatile__("" :: "m" (FpDest.uw));
1002 Fpscr = setVfpFpscr(Fpscr, state);
1003 '''
1004 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "VfpRegRegOp",
1005 { "code": vcvtFpUIntSCode,
1006 "predicate_test": predicateTest }, [])
1007 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSIop);
1008 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSIop);
1009 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
1010
1011 vcvtFpUIntDCode = '''
1012 IntDoubleUnion cOp1;
1013 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1014 vfpFlushToZero(Fpscr, cOp1.fp);
1015 VfpSavedState state = prepVfpFpscr(Fpscr);
1016 fesetround(FeRoundZero);
1017 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1018 uint64_t result = cOp1.fp;
1019 __asm__ __volatile__("" :: "m" (result));
1020 Fpscr = setVfpFpscr(Fpscr, state);
1021 FpDestP0.uw = result;
1022 '''
1023 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "VfpRegRegOp",
1024 { "code": vcvtFpUIntDCode,
1025 "predicate_test": predicateTest }, [])
1026 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDIop);
1027 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDIop);
1028 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
1029
1030 vcvtFpSIntSCode = '''
1031 vfpFlushToZero(Fpscr, FpOp1);
1032 VfpSavedState state = prepVfpFpscr(Fpscr);
1033 fesetround(FeRoundZero);
1034 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1035 FpDest.sw = FpOp1;
1036 __asm__ __volatile__("" :: "m" (FpDest.sw));
1037 Fpscr = setVfpFpscr(Fpscr, state);
1038 '''
1039 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "VfpRegRegOp",
1040 { "code": vcvtFpSIntSCode,
1041 "predicate_test": predicateTest }, [])
1042 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSIop);
1043 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSIop);
1044 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
1045
1046 vcvtFpSIntDCode = '''
1047 IntDoubleUnion cOp1;
1048 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1049 vfpFlushToZero(Fpscr, cOp1.fp);
1050 VfpSavedState state = prepVfpFpscr(Fpscr);
1051 fesetround(FeRoundZero);
1052 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1053 int64_t result = cOp1.fp;
1054 __asm__ __volatile__("" :: "m" (result));
1055 Fpscr = setVfpFpscr(Fpscr, state);
1056 FpDestP0.uw = result;
1057 '''
1058 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "VfpRegRegOp",
1059 { "code": vcvtFpSIntDCode,
1060 "predicate_test": predicateTest }, [])
1061 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDIop);
1062 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDIop);
1063 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
1064
1065 vcvtFpSFpDCode = '''
1066 IntDoubleUnion cDest;
1067 vfpFlushToZero(Fpscr, FpOp1);
1068 VfpSavedState state = prepVfpFpscr(Fpscr);
1069 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1070 cDest.fp = FpOp1;
1071 __asm__ __volatile__("" :: "m" (cDest.fp));
1072 Fpscr = setVfpFpscr(Fpscr, state);
1073 FpDestP0.uw = cDest.bits;
1074 FpDestP1.uw = cDest.bits >> 32;
1075 '''
1076 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "VfpRegRegOp",
1077 { "code": vcvtFpSFpDCode,
1078 "predicate_test": predicateTest }, [])
1079 header_output += VfpRegRegOpDeclare.subst(vcvtFpSFpDIop);
1080 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSFpDIop);
1081 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
1082
1083 vcvtFpDFpSCode = '''
1084 IntDoubleUnion cOp1;
1085 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1086 vfpFlushToZero(Fpscr, cOp1.fp);
1087 VfpSavedState state = prepVfpFpscr(Fpscr);
1088 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1089 FpDest = cOp1.fp;
1090 __asm__ __volatile__("" :: "m" (FpDest));
1091 Fpscr = setVfpFpscr(Fpscr, state);
1092 '''
1093 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "VfpRegRegOp",
1094 { "code": vcvtFpDFpSCode,
1095 "predicate_test": predicateTest }, [])
1096 header_output += VfpRegRegOpDeclare.subst(vcvtFpDFpSIop);
1097 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpDFpSIop);
1098 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
1099
1100 vcmpSCode = '''
1101 FPSCR fpscr = Fpscr;
1102 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1103 if (FpDest == FpOp1) {
1104 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1105 } else if (FpDest < FpOp1) {
1106 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1107 } else if (FpDest > FpOp1) {
1108 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1109 } else {
1110 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1111 }
1112 Fpscr = fpscr;
1113 '''
1114 vcmpSIop = InstObjParams("vcmps", "VcmpS", "VfpRegRegOp",
1115 { "code": vcmpSCode,
1116 "predicate_test": predicateTest }, [])
1117 header_output += VfpRegRegOpDeclare.subst(vcmpSIop);
1118 decoder_output += VfpRegRegOpConstructor.subst(vcmpSIop);
1119 exec_output += PredOpExecute.subst(vcmpSIop);
1120
1121 vcmpDCode = '''
1122 IntDoubleUnion cOp1, cDest;
1123 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1124 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1125 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1126 FPSCR fpscr = Fpscr;
1127 if (cDest.fp == cOp1.fp) {
1128 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1129 } else if (cDest.fp < cOp1.fp) {
1130 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1131 } else if (cDest.fp > cOp1.fp) {
1132 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1133 } else {
1134 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1135 }
1136 Fpscr = fpscr;
1137 '''
1138 vcmpDIop = InstObjParams("vcmpd", "VcmpD", "VfpRegRegOp",
1139 { "code": vcmpDCode,
1140 "predicate_test": predicateTest }, [])
1141 header_output += VfpRegRegOpDeclare.subst(vcmpDIop);
1142 decoder_output += VfpRegRegOpConstructor.subst(vcmpDIop);
1143 exec_output += PredOpExecute.subst(vcmpDIop);
1144
1145 vcmpZeroSCode = '''
1146 FPSCR fpscr = Fpscr;
1147 vfpFlushToZero(Fpscr, FpDest);
1148 if (FpDest == imm) {
1149 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1150 } else if (FpDest < imm) {
1151 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1152 } else if (FpDest > imm) {
1153 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1154 } else {
1155 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1156 }
1157 Fpscr = fpscr;
1158 '''
1159 vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "VfpRegImmOp",
1160 { "code": vcmpZeroSCode,
1161 "predicate_test": predicateTest }, [])
1162 header_output += VfpRegImmOpDeclare.subst(vcmpZeroSIop);
1163 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroSIop);
1164 exec_output += PredOpExecute.subst(vcmpZeroSIop);
1165
1166 vcmpZeroDCode = '''
1167 IntDoubleUnion cDest;
1168 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1169 vfpFlushToZero(Fpscr, cDest.fp);
1170 FPSCR fpscr = Fpscr;
1171 if (cDest.fp == imm) {
1172 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1173 } else if (cDest.fp < imm) {
1174 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1175 } else if (cDest.fp > imm) {
1176 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1177 } else {
1178 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1179 }
1180 Fpscr = fpscr;
1181 '''
1182 vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "VfpRegImmOp",
1183 { "code": vcmpZeroDCode,
1184 "predicate_test": predicateTest }, [])
1185 header_output += VfpRegImmOpDeclare.subst(vcmpZeroDIop);
1186 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroDIop);
1187 exec_output += PredOpExecute.subst(vcmpZeroDIop);
1188}};
1189
1190let {{
1191
1192 header_output = ""
1193 decoder_output = ""
1194 exec_output = ""
1195
1196 vcvtFpSFixedSCode = '''
1197 vfpFlushToZero(Fpscr, FpOp1);
1198 VfpSavedState state = prepVfpFpscr(Fpscr);
1199 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1200 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1201 __asm__ __volatile__("" :: "m" (FpDest.sw));
1202 Fpscr = setVfpFpscr(Fpscr, state);
1203 '''
1204 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "VfpRegRegImmOp",
1205 { "code": vcvtFpSFixedSCode,
1206 "predicate_test": predicateTest }, [])
1207 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1208 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1209 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1210
1211 vcvtFpSFixedDCode = '''
1212 IntDoubleUnion cOp1;
1213 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1214 vfpFlushToZero(Fpscr, cOp1.fp);
1215 VfpSavedState state = prepVfpFpscr(Fpscr);
1216 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1217 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1218 __asm__ __volatile__("" :: "m" (mid));
1219 Fpscr = setVfpFpscr(Fpscr, state);
1220 FpDestP0.uw = mid;
1221 FpDestP1.uw = mid >> 32;
1222 '''
1223 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "VfpRegRegImmOp",
1224 { "code": vcvtFpSFixedDCode,
1225 "predicate_test": predicateTest }, [])
1226 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1227 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1228 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1229
1230 vcvtFpUFixedSCode = '''
1231 vfpFlushToZero(Fpscr, FpOp1);
1232 VfpSavedState state = prepVfpFpscr(Fpscr);
1233 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1234 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1235 __asm__ __volatile__("" :: "m" (FpDest.uw));
1236 Fpscr = setVfpFpscr(Fpscr, state);
1237 '''
1238 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "VfpRegRegImmOp",
1239 { "code": vcvtFpUFixedSCode,
1240 "predicate_test": predicateTest }, [])
1241 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1242 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1243 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1244
1245 vcvtFpUFixedDCode = '''
1246 IntDoubleUnion cOp1;
1247 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1248 vfpFlushToZero(Fpscr, cOp1.fp);
1249 VfpSavedState state = prepVfpFpscr(Fpscr);
1250 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1251 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1252 __asm__ __volatile__("" :: "m" (mid));
1253 Fpscr = setVfpFpscr(Fpscr, state);
1254 FpDestP0.uw = mid;
1255 FpDestP1.uw = mid >> 32;
1256 '''
1257 vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "VfpRegRegImmOp",
1258 { "code": vcvtFpUFixedDCode,
1259 "predicate_test": predicateTest }, [])
1260 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
1261 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
1262 exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
1263
1264 vcvtSFixedFpSCode = '''
1265 VfpSavedState state = prepVfpFpscr(Fpscr);
1266 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
1267 FpDest = vfpSFixedToFpS(FpOp1.sw, false, imm);
1268 __asm__ __volatile__("" :: "m" (FpDest));
1269 Fpscr = setVfpFpscr(Fpscr, state);
1270 '''
1271 vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "VfpRegRegImmOp",
1272 { "code": vcvtSFixedFpSCode,
1273 "predicate_test": predicateTest }, [])
1274 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
1275 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
1276 exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
1277
1278 vcvtSFixedFpDCode = '''
1279 IntDoubleUnion cDest;
1280 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1281 VfpSavedState state = prepVfpFpscr(Fpscr);
1282 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1283 cDest.fp = vfpSFixedToFpD(mid, false, imm);
1284 __asm__ __volatile__("" :: "m" (cDest.fp));
1285 Fpscr = setVfpFpscr(Fpscr, state);
1286 FpDestP0.uw = cDest.bits;
1287 FpDestP1.uw = cDest.bits >> 32;
1288 '''
1289 vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "VfpRegRegImmOp",
1290 { "code": vcvtSFixedFpDCode,
1291 "predicate_test": predicateTest }, [])
1292 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
1293 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
1294 exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
1295
1296 vcvtUFixedFpSCode = '''
1297 VfpSavedState state = prepVfpFpscr(Fpscr);
1298 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
1299 FpDest = vfpUFixedToFpS(FpOp1.uw, false, imm);
1300 __asm__ __volatile__("" :: "m" (FpDest));
1301 Fpscr = setVfpFpscr(Fpscr, state);
1302 '''
1303 vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "VfpRegRegImmOp",
1304 { "code": vcvtUFixedFpSCode,
1305 "predicate_test": predicateTest }, [])
1306 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
1307 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
1308 exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
1309
1310 vcvtUFixedFpDCode = '''
1311 IntDoubleUnion cDest;
1312 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1313 VfpSavedState state = prepVfpFpscr(Fpscr);
1314 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1315 cDest.fp = vfpUFixedToFpD(mid, false, imm);
1316 __asm__ __volatile__("" :: "m" (cDest.fp));
1317 Fpscr = setVfpFpscr(Fpscr, state);
1318 FpDestP0.uw = cDest.bits;
1319 FpDestP1.uw = cDest.bits >> 32;
1320 '''
1321 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "VfpRegRegImmOp",
1322 { "code": vcvtUFixedFpDCode,
1323 "predicate_test": predicateTest }, [])
1324 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1325 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1326 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1327
1328 vcvtFpSHFixedSCode = '''
1329 vfpFlushToZero(Fpscr, FpOp1);
1330 VfpSavedState state = prepVfpFpscr(Fpscr);
1331 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1332 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1333 __asm__ __volatile__("" :: "m" (FpDest.sh));
1334 Fpscr = setVfpFpscr(Fpscr, state);
1335 '''
1336 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1337 "VfpRegRegImmOp",
1338 { "code": vcvtFpSHFixedSCode,
1339 "predicate_test": predicateTest }, [])
1340 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1341 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1342 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1343
1344 vcvtFpSHFixedDCode = '''
1345 IntDoubleUnion cOp1;
1346 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1347 vfpFlushToZero(Fpscr, cOp1.fp);
1348 VfpSavedState state = prepVfpFpscr(Fpscr);
1349 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1350 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1351 __asm__ __volatile__("" :: "m" (result));
1352 Fpscr = setVfpFpscr(Fpscr, state);
1353 FpDestP0.uw = result;
1354 FpDestP1.uw = result >> 32;
1355 '''
1356 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1357 "VfpRegRegImmOp",
1358 { "code": vcvtFpSHFixedDCode,
1359 "predicate_test": predicateTest }, [])
1360 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1361 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1362 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1363
1364 vcvtFpUHFixedSCode = '''
1365 vfpFlushToZero(Fpscr, FpOp1);
1366 VfpSavedState state = prepVfpFpscr(Fpscr);
1367 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1368 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1369 __asm__ __volatile__("" :: "m" (FpDest.uh));
1370 Fpscr = setVfpFpscr(Fpscr, state);
1371 '''
1372 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1373 "VfpRegRegImmOp",
1374 { "code": vcvtFpUHFixedSCode,
1375 "predicate_test": predicateTest }, [])
1376 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1377 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1378 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1379
1380 vcvtFpUHFixedDCode = '''
1381 IntDoubleUnion cOp1;
1382 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1383 vfpFlushToZero(Fpscr, cOp1.fp);
1384 VfpSavedState state = prepVfpFpscr(Fpscr);
1385 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1386 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1387 __asm__ __volatile__("" :: "m" (mid));
1388 Fpscr = setVfpFpscr(Fpscr, state);
1389 FpDestP0.uw = mid;
1390 FpDestP1.uw = mid >> 32;
1391 '''
1392 vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
1393 "VfpRegRegImmOp",
1394 { "code": vcvtFpUHFixedDCode,
1395 "predicate_test": predicateTest }, [])
1396 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
1397 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
1398 exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
1399
1400 vcvtSHFixedFpSCode = '''
1401 VfpSavedState state = prepVfpFpscr(Fpscr);
1402 __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
1403 FpDest = vfpSFixedToFpS(FpOp1.sh, true, imm);
1404 __asm__ __volatile__("" :: "m" (FpDest));
1405 Fpscr = setVfpFpscr(Fpscr, state);
1406 '''
1407 vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
1408 "VfpRegRegImmOp",
1409 { "code": vcvtSHFixedFpSCode,
1410 "predicate_test": predicateTest }, [])
1411 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
1412 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
1413 exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
1414
1415 vcvtSHFixedFpDCode = '''
1416 IntDoubleUnion cDest;
1417 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1418 VfpSavedState state = prepVfpFpscr(Fpscr);
1419 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1420 cDest.fp = vfpSFixedToFpD(mid, true, imm);
1421 __asm__ __volatile__("" :: "m" (cDest.fp));
1422 Fpscr = setVfpFpscr(Fpscr, state);
1423 FpDestP0.uw = cDest.bits;
1424 FpDestP1.uw = cDest.bits >> 32;
1425 '''
1426 vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
1427 "VfpRegRegImmOp",
1428 { "code": vcvtSHFixedFpDCode,
1429 "predicate_test": predicateTest }, [])
1430 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
1431 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
1432 exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
1433
1434 vcvtUHFixedFpSCode = '''
1435 VfpSavedState state = prepVfpFpscr(Fpscr);
1436 __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
1437 FpDest = vfpUFixedToFpS(FpOp1.uh, true, imm);
1438 __asm__ __volatile__("" :: "m" (FpDest));
1439 Fpscr = setVfpFpscr(Fpscr, state);
1440 '''
1441 vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
1442 "VfpRegRegImmOp",
1443 { "code": vcvtUHFixedFpSCode,
1444 "predicate_test": predicateTest }, [])
1445 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
1446 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
1447 exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
1448
1449 vcvtUHFixedFpDCode = '''
1450 IntDoubleUnion cDest;
1451 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1452 VfpSavedState state = prepVfpFpscr(Fpscr);
1453 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1454 cDest.fp = vfpUFixedToFpD(mid, true, imm);
1455 __asm__ __volatile__("" :: "m" (cDest.fp));
1456 Fpscr = setVfpFpscr(Fpscr, state);
1457 FpDestP0.uw = cDest.bits;
1458 FpDestP1.uw = cDest.bits >> 32;
1459 '''
1460 vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
1461 "VfpRegRegImmOp",
1462 { "code": vcvtUHFixedFpDCode,
1463 "predicate_test": predicateTest }, [])
1464 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
1465 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
1466 exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
1467}};