fp.isa (7392:43b0cd94ced6) fp.isa (7396:53454ef35b46)
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

--- 177 unchanged lines hidden (view full) ---

186}};
187
188let {{
189
190 header_output = ""
191 decoder_output = ""
192 exec_output = ""
193
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

--- 177 unchanged lines hidden (view full) ---

186}};
187
188let {{
189
190 header_output = ""
191 decoder_output = ""
192 exec_output = ""
193
194 vmsrIop = InstObjParams("vmsr", "Vmsr", "VfpRegRegOp",
194 vmsrIop = InstObjParams("vmsr", "Vmsr", "FpRegRegOp",
195 { "code": "MiscDest = Op1;",
196 "predicate_test": predicateTest }, [])
195 { "code": "MiscDest = Op1;",
196 "predicate_test": predicateTest }, [])
197 header_output += VfpRegRegOpDeclare.subst(vmsrIop);
198 decoder_output += VfpRegRegOpConstructor.subst(vmsrIop);
197 header_output += FpRegRegOpDeclare.subst(vmsrIop);
198 decoder_output += FpRegRegOpConstructor.subst(vmsrIop);
199 exec_output += PredOpExecute.subst(vmsrIop);
200
199 exec_output += PredOpExecute.subst(vmsrIop);
200
201 vmrsIop = InstObjParams("vmrs", "Vmrs", "VfpRegRegOp",
201 vmrsIop = InstObjParams("vmrs", "Vmrs", "FpRegRegOp",
202 { "code": "Dest = MiscOp1;",
203 "predicate_test": predicateTest }, [])
202 { "code": "Dest = MiscOp1;",
203 "predicate_test": predicateTest }, [])
204 header_output += VfpRegRegOpDeclare.subst(vmrsIop);
205 decoder_output += VfpRegRegOpConstructor.subst(vmrsIop);
204 header_output += FpRegRegOpDeclare.subst(vmrsIop);
205 decoder_output += FpRegRegOpConstructor.subst(vmrsIop);
206 exec_output += PredOpExecute.subst(vmrsIop);
207
208 vmrsApsrCode = "Dest = (MiscOp1 & imm) | (Dest & ~imm);"
206 exec_output += PredOpExecute.subst(vmrsIop);
207
208 vmrsApsrCode = "Dest = (MiscOp1 & imm) | (Dest & ~imm);"
209 vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "VfpRegRegImmOp",
209 vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "FpRegRegImmOp",
210 { "code": vmrsApsrCode,
211 "predicate_test": predicateTest }, [])
210 { "code": vmrsApsrCode,
211 "predicate_test": predicateTest }, [])
212 header_output += VfpRegRegImmOpDeclare.subst(vmrsApsrIop);
213 decoder_output += VfpRegRegImmOpConstructor.subst(vmrsApsrIop);
212 header_output += FpRegRegImmOpDeclare.subst(vmrsApsrIop);
213 decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrIop);
214 exec_output += PredOpExecute.subst(vmrsApsrIop);
215
216 vmovImmSCode = '''
217 FpDest.uw = bits(imm, 31, 0);
218 '''
214 exec_output += PredOpExecute.subst(vmrsApsrIop);
215
216 vmovImmSCode = '''
217 FpDest.uw = bits(imm, 31, 0);
218 '''
219 vmovImmSIop = InstObjParams("vmov", "VmovImmS", "VfpRegImmOp",
219 vmovImmSIop = InstObjParams("vmov", "VmovImmS", "FpRegImmOp",
220 { "code": vmovImmSCode,
221 "predicate_test": predicateTest }, [])
220 { "code": vmovImmSCode,
221 "predicate_test": predicateTest }, [])
222 header_output += VfpRegImmOpDeclare.subst(vmovImmSIop);
223 decoder_output += VfpRegImmOpConstructor.subst(vmovImmSIop);
222 header_output += FpRegImmOpDeclare.subst(vmovImmSIop);
223 decoder_output += FpRegImmOpConstructor.subst(vmovImmSIop);
224 exec_output += PredOpExecute.subst(vmovImmSIop);
225
226 vmovImmDCode = '''
227 FpDestP0.uw = bits(imm, 31, 0);
228 FpDestP1.uw = bits(imm, 63, 32);
229 '''
224 exec_output += PredOpExecute.subst(vmovImmSIop);
225
226 vmovImmDCode = '''
227 FpDestP0.uw = bits(imm, 31, 0);
228 FpDestP1.uw = bits(imm, 63, 32);
229 '''
230 vmovImmDIop = InstObjParams("vmov", "VmovImmD", "VfpRegImmOp",
230 vmovImmDIop = InstObjParams("vmov", "VmovImmD", "FpRegImmOp",
231 { "code": vmovImmDCode,
232 "predicate_test": predicateTest }, [])
231 { "code": vmovImmDCode,
232 "predicate_test": predicateTest }, [])
233 header_output += VfpRegImmOpDeclare.subst(vmovImmDIop);
234 decoder_output += VfpRegImmOpConstructor.subst(vmovImmDIop);
233 header_output += FpRegImmOpDeclare.subst(vmovImmDIop);
234 decoder_output += FpRegImmOpConstructor.subst(vmovImmDIop);
235 exec_output += PredOpExecute.subst(vmovImmDIop);
236
237 vmovImmQCode = '''
238 FpDestP0.uw = bits(imm, 31, 0);
239 FpDestP1.uw = bits(imm, 63, 32);
240 FpDestP2.uw = bits(imm, 31, 0);
241 FpDestP3.uw = bits(imm, 63, 32);
242 '''
235 exec_output += PredOpExecute.subst(vmovImmDIop);
236
237 vmovImmQCode = '''
238 FpDestP0.uw = bits(imm, 31, 0);
239 FpDestP1.uw = bits(imm, 63, 32);
240 FpDestP2.uw = bits(imm, 31, 0);
241 FpDestP3.uw = bits(imm, 63, 32);
242 '''
243 vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "VfpRegImmOp",
243 vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "FpRegImmOp",
244 { "code": vmovImmQCode,
245 "predicate_test": predicateTest }, [])
244 { "code": vmovImmQCode,
245 "predicate_test": predicateTest }, [])
246 header_output += VfpRegImmOpDeclare.subst(vmovImmQIop);
247 decoder_output += VfpRegImmOpConstructor.subst(vmovImmQIop);
246 header_output += FpRegImmOpDeclare.subst(vmovImmQIop);
247 decoder_output += FpRegImmOpConstructor.subst(vmovImmQIop);
248 exec_output += PredOpExecute.subst(vmovImmQIop);
249
250 vmovRegSCode = '''
251 FpDest.uw = FpOp1.uw;
252 '''
248 exec_output += PredOpExecute.subst(vmovImmQIop);
249
250 vmovRegSCode = '''
251 FpDest.uw = FpOp1.uw;
252 '''
253 vmovRegSIop = InstObjParams("vmov", "VmovRegS", "VfpRegRegOp",
253 vmovRegSIop = InstObjParams("vmov", "VmovRegS", "FpRegRegOp",
254 { "code": vmovRegSCode,
255 "predicate_test": predicateTest }, [])
254 { "code": vmovRegSCode,
255 "predicate_test": predicateTest }, [])
256 header_output += VfpRegRegOpDeclare.subst(vmovRegSIop);
257 decoder_output += VfpRegRegOpConstructor.subst(vmovRegSIop);
256 header_output += FpRegRegOpDeclare.subst(vmovRegSIop);
257 decoder_output += FpRegRegOpConstructor.subst(vmovRegSIop);
258 exec_output += PredOpExecute.subst(vmovRegSIop);
259
260 vmovRegDCode = '''
261 FpDestP0.uw = FpOp1P0.uw;
262 FpDestP1.uw = FpOp1P1.uw;
263 '''
258 exec_output += PredOpExecute.subst(vmovRegSIop);
259
260 vmovRegDCode = '''
261 FpDestP0.uw = FpOp1P0.uw;
262 FpDestP1.uw = FpOp1P1.uw;
263 '''
264 vmovRegDIop = InstObjParams("vmov", "VmovRegD", "VfpRegRegOp",
264 vmovRegDIop = InstObjParams("vmov", "VmovRegD", "FpRegRegOp",
265 { "code": vmovRegDCode,
266 "predicate_test": predicateTest }, [])
265 { "code": vmovRegDCode,
266 "predicate_test": predicateTest }, [])
267 header_output += VfpRegRegOpDeclare.subst(vmovRegDIop);
268 decoder_output += VfpRegRegOpConstructor.subst(vmovRegDIop);
267 header_output += FpRegRegOpDeclare.subst(vmovRegDIop);
268 decoder_output += FpRegRegOpConstructor.subst(vmovRegDIop);
269 exec_output += PredOpExecute.subst(vmovRegDIop);
270
271 vmovRegQCode = '''
272 FpDestP0.uw = FpOp1P0.uw;
273 FpDestP1.uw = FpOp1P1.uw;
274 FpDestP2.uw = FpOp1P2.uw;
275 FpDestP3.uw = FpOp1P3.uw;
276 '''
269 exec_output += PredOpExecute.subst(vmovRegDIop);
270
271 vmovRegQCode = '''
272 FpDestP0.uw = FpOp1P0.uw;
273 FpDestP1.uw = FpOp1P1.uw;
274 FpDestP2.uw = FpOp1P2.uw;
275 FpDestP3.uw = FpOp1P3.uw;
276 '''
277 vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "VfpRegRegOp",
277 vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "FpRegRegOp",
278 { "code": vmovRegQCode,
279 "predicate_test": predicateTest }, [])
278 { "code": vmovRegQCode,
279 "predicate_test": predicateTest }, [])
280 header_output += VfpRegRegOpDeclare.subst(vmovRegQIop);
281 decoder_output += VfpRegRegOpConstructor.subst(vmovRegQIop);
280 header_output += FpRegRegOpDeclare.subst(vmovRegQIop);
281 decoder_output += FpRegRegOpConstructor.subst(vmovRegQIop);
282 exec_output += PredOpExecute.subst(vmovRegQIop);
283
284 vmovCoreRegBCode = '''
285 FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub);
286 '''
282 exec_output += PredOpExecute.subst(vmovRegQIop);
283
284 vmovCoreRegBCode = '''
285 FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub);
286 '''
287 vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "VfpRegRegImmOp",
287 vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "FpRegRegImmOp",
288 { "code": vmovCoreRegBCode,
289 "predicate_test": predicateTest }, [])
288 { "code": vmovCoreRegBCode,
289 "predicate_test": predicateTest }, [])
290 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
291 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
290 header_output += FpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
291 decoder_output += FpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
292 exec_output += PredOpExecute.subst(vmovCoreRegBIop);
293
294 vmovCoreRegHCode = '''
295 FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh);
296 '''
292 exec_output += PredOpExecute.subst(vmovCoreRegBIop);
293
294 vmovCoreRegHCode = '''
295 FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh);
296 '''
297 vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "VfpRegRegImmOp",
297 vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "FpRegRegImmOp",
298 { "code": vmovCoreRegHCode,
299 "predicate_test": predicateTest }, [])
298 { "code": vmovCoreRegHCode,
299 "predicate_test": predicateTest }, [])
300 header_output += VfpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
301 decoder_output += VfpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
300 header_output += FpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
301 decoder_output += FpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
302 exec_output += PredOpExecute.subst(vmovCoreRegHIop);
303
304 vmovCoreRegWCode = '''
305 FpDest.uw = Op1.uw;
306 '''
302 exec_output += PredOpExecute.subst(vmovCoreRegHIop);
303
304 vmovCoreRegWCode = '''
305 FpDest.uw = Op1.uw;
306 '''
307 vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "VfpRegRegOp",
307 vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "FpRegRegOp",
308 { "code": vmovCoreRegWCode,
309 "predicate_test": predicateTest }, [])
308 { "code": vmovCoreRegWCode,
309 "predicate_test": predicateTest }, [])
310 header_output += VfpRegRegOpDeclare.subst(vmovCoreRegWIop);
311 decoder_output += VfpRegRegOpConstructor.subst(vmovCoreRegWIop);
310 header_output += FpRegRegOpDeclare.subst(vmovCoreRegWIop);
311 decoder_output += FpRegRegOpConstructor.subst(vmovCoreRegWIop);
312 exec_output += PredOpExecute.subst(vmovCoreRegWIop);
313
314 vmovRegCoreUBCode = '''
315 Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7);
316 '''
312 exec_output += PredOpExecute.subst(vmovCoreRegWIop);
313
314 vmovRegCoreUBCode = '''
315 Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7);
316 '''
317 vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "VfpRegRegImmOp",
317 vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "FpRegRegImmOp",
318 { "code": vmovRegCoreUBCode,
319 "predicate_test": predicateTest }, [])
318 { "code": vmovRegCoreUBCode,
319 "predicate_test": predicateTest }, [])
320 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
321 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
320 header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
321 decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
322 exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
323
324 vmovRegCoreUHCode = '''
325 Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15);
326 '''
322 exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
323
324 vmovRegCoreUHCode = '''
325 Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15);
326 '''
327 vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "VfpRegRegImmOp",
327 vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "FpRegRegImmOp",
328 { "code": vmovRegCoreUHCode,
329 "predicate_test": predicateTest }, [])
328 { "code": vmovRegCoreUHCode,
329 "predicate_test": predicateTest }, [])
330 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
331 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
330 header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
331 decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
332 exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
333
334 vmovRegCoreSBCode = '''
335 Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7));
336 '''
332 exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
333
334 vmovRegCoreSBCode = '''
335 Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7));
336 '''
337 vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "VfpRegRegImmOp",
337 vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "FpRegRegImmOp",
338 { "code": vmovRegCoreSBCode,
339 "predicate_test": predicateTest }, [])
338 { "code": vmovRegCoreSBCode,
339 "predicate_test": predicateTest }, [])
340 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
341 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
340 header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
341 decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
342 exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
343
344 vmovRegCoreSHCode = '''
345 Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15));
346 '''
342 exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
343
344 vmovRegCoreSHCode = '''
345 Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15));
346 '''
347 vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "VfpRegRegImmOp",
347 vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "FpRegRegImmOp",
348 { "code": vmovRegCoreSHCode,
349 "predicate_test": predicateTest }, [])
348 { "code": vmovRegCoreSHCode,
349 "predicate_test": predicateTest }, [])
350 header_output += VfpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
351 decoder_output += VfpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
350 header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
351 decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
352 exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
353
354 vmovRegCoreWCode = '''
355 Dest = FpOp1.uw;
356 '''
352 exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
353
354 vmovRegCoreWCode = '''
355 Dest = FpOp1.uw;
356 '''
357 vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "VfpRegRegOp",
357 vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "FpRegRegOp",
358 { "code": vmovRegCoreWCode,
359 "predicate_test": predicateTest }, [])
358 { "code": vmovRegCoreWCode,
359 "predicate_test": predicateTest }, [])
360 header_output += VfpRegRegOpDeclare.subst(vmovRegCoreWIop);
361 decoder_output += VfpRegRegOpConstructor.subst(vmovRegCoreWIop);
360 header_output += FpRegRegOpDeclare.subst(vmovRegCoreWIop);
361 decoder_output += FpRegRegOpConstructor.subst(vmovRegCoreWIop);
362 exec_output += PredOpExecute.subst(vmovRegCoreWIop);
363
364 vmov2Reg2CoreCode = '''
365 FpDestP0.uw = Op1.uw;
366 FpDestP1.uw = Op2.uw;
367 '''
362 exec_output += PredOpExecute.subst(vmovRegCoreWIop);
363
364 vmov2Reg2CoreCode = '''
365 FpDestP0.uw = Op1.uw;
366 FpDestP1.uw = Op2.uw;
367 '''
368 vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "VfpRegRegRegOp",
368 vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "FpRegRegRegOp",
369 { "code": vmov2Reg2CoreCode,
370 "predicate_test": predicateTest }, [])
369 { "code": vmov2Reg2CoreCode,
370 "predicate_test": predicateTest }, [])
371 header_output += VfpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
372 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
371 header_output += FpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
372 decoder_output += FpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
373 exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
374
375 vmov2Core2RegCode = '''
376 Dest.uw = FpOp2P0.uw;
377 Op1.uw = FpOp2P1.uw;
378 '''
373 exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
374
375 vmov2Core2RegCode = '''
376 Dest.uw = FpOp2P0.uw;
377 Op1.uw = FpOp2P1.uw;
378 '''
379 vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "VfpRegRegRegOp",
379 vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "FpRegRegRegOp",
380 { "code": vmov2Core2RegCode,
381 "predicate_test": predicateTest }, [])
380 { "code": vmov2Core2RegCode,
381 "predicate_test": predicateTest }, [])
382 header_output += VfpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
383 decoder_output += VfpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
382 header_output += FpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
383 decoder_output += FpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
384 exec_output += PredOpExecute.subst(vmov2Core2RegIop);
385}};
386
387let {{
388
389 header_output = ""
390 decoder_output = ""
391 exec_output = ""
392
384 exec_output += PredOpExecute.subst(vmov2Core2RegIop);
385}};
386
387let {{
388
389 header_output = ""
390 decoder_output = ""
391 exec_output = ""
392
393 vmulSCode = '''
394 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
395 VfpSavedState state = prepVfpFpscr(Fpscr);
396 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
397 FpDest = fixMultDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
398 __asm__ __volatile__("" :: "m" (FpDest));
399 Fpscr = setVfpFpscr(Fpscr, state);
400 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
401 FpDest = NAN;
402 }
393 singleCode = '''
394 FPSCR fpscr = Fpscr;
395 FpDest = %(op)s;
396 Fpscr = fpscr;
403 '''
397 '''
404 vmulSIop = InstObjParams("vmuls", "VmulS", "VfpRegRegRegOp",
405 { "code": vmulSCode,
406 "predicate_test": predicateTest }, [])
407 header_output += VfpRegRegRegOpDeclare.subst(vmulSIop);
408 decoder_output += VfpRegRegRegOpConstructor.subst(vmulSIop);
409 exec_output += PredOpExecute.subst(vmulSIop);
410
411 vmulDCode = '''
412 IntDoubleUnion cOp1, cOp2, cDest;
413 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
414 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
415 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
416 VfpSavedState state = prepVfpFpscr(Fpscr);
417 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
418 cDest.fp = fixMultDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
419 __asm__ __volatile__("" :: "m" (cDest.fp));
420 Fpscr = setVfpFpscr(Fpscr, state);
421 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
422 (isinf(cOp2.fp) && cOp1.fp == 0)) {
423 cDest.fp = NAN;
424 }
425 FpDestP0.uw = cDest.bits;
426 FpDestP1.uw = cDest.bits >> 32;
398 singleBinOp = "binaryOp(fpscr, FpOp1, FpOp2," + \
399 "%(func)s, fpscr.fz, fpscr.rMode)"
400 singleUnaryOp = "unaryOp(fpscr, FpOp1, %(func)s, fpscr.fz, fpscr.rMode)"
401 doubleCode = '''
402 FPSCR fpscr = Fpscr;
403 double dest = %(op)s;
404 Fpscr = fpscr;
405 FpDestP0.uw = dblLow(dest);
406 FpDestP1.uw = dblHi(dest);
427 '''
407 '''
428 vmulDIop = InstObjParams("vmuld", "VmulD", "VfpRegRegRegOp",
429 { "code": vmulDCode,
430 "predicate_test": predicateTest }, [])
431 header_output += VfpRegRegRegOpDeclare.subst(vmulDIop);
432 decoder_output += VfpRegRegRegOpConstructor.subst(vmulDIop);
433 exec_output += PredOpExecute.subst(vmulDIop);
434
435 vnegSCode = '''
436 FpDest = -FpOp1;
408 doubleBinOp = '''
409 binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
410 dbl(FpOp2P0.uw, FpOp2P1.uw),
411 %(func)s, fpscr.fz, fpscr.rMode);
437 '''
412 '''
438 vnegSIop = InstObjParams("vnegs", "VnegS", "VfpRegRegOp",
439 { "code": vnegSCode,
440 "predicate_test": predicateTest }, [])
441 header_output += VfpRegRegOpDeclare.subst(vnegSIop);
442 decoder_output += VfpRegRegOpConstructor.subst(vnegSIop);
443 exec_output += PredOpExecute.subst(vnegSIop);
444
445 vnegDCode = '''
446 IntDoubleUnion cOp1, cDest;
447 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
448 cDest.fp = -cOp1.fp;
449 FpDestP0.uw = cDest.bits;
450 FpDestP1.uw = cDest.bits >> 32;
413 doubleUnaryOp = '''
414 unaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), %(func)s,
415 fpscr.fz, fpscr.rMode)
451 '''
416 '''
452 vnegDIop = InstObjParams("vnegd", "VnegD", "VfpRegRegOp",
453 { "code": vnegDCode,
454 "predicate_test": predicateTest }, [])
455 header_output += VfpRegRegOpDeclare.subst(vnegDIop);
456 decoder_output += VfpRegRegOpConstructor.subst(vnegDIop);
457 exec_output += PredOpExecute.subst(vnegDIop);
458
417
459 vabsSCode = '''
460 FpDest = fabsf(FpOp1);
461 '''
462 vabsSIop = InstObjParams("vabss", "VabsS", "VfpRegRegOp",
463 { "code": vabsSCode,
464 "predicate_test": predicateTest }, [])
465 header_output += VfpRegRegOpDeclare.subst(vabsSIop);
466 decoder_output += VfpRegRegOpConstructor.subst(vabsSIop);
467 exec_output += PredOpExecute.subst(vabsSIop);
418 def buildBinFpOp(name, Name, base, singleOp, doubleOp):
419 global header_output, decoder_output, exec_output
468
420
469 vabsDCode = '''
470 IntDoubleUnion cOp1, cDest;
471 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
472 cDest.fp = fabs(cOp1.fp);
473 FpDestP0.uw = cDest.bits;
474 FpDestP1.uw = cDest.bits >> 32;
475 '''
476 vabsDIop = InstObjParams("vabsd", "VabsD", "VfpRegRegOp",
477 { "code": vabsDCode,
478 "predicate_test": predicateTest }, [])
479 header_output += VfpRegRegOpDeclare.subst(vabsDIop);
480 decoder_output += VfpRegRegOpConstructor.subst(vabsDIop);
481 exec_output += PredOpExecute.subst(vabsDIop);
421 code = singleCode % { "op": singleBinOp }
422 code = code % { "func": singleOp }
423 sIop = InstObjParams(name + "s", Name + "S", base,
424 { "code": code, "predicate_test": predicateTest }, [])
425 code = doubleCode % { "op": doubleBinOp }
426 code = code % { "func": doubleOp }
427 dIop = InstObjParams(name + "d", Name + "D", base,
428 { "code": code, "predicate_test": predicateTest }, [])
482
429
483 vaddSCode = '''
484 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
485 VfpSavedState state = prepVfpFpscr(Fpscr);
486 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
487 FpDest = fixDest(Fpscr, FpOp1 + FpOp2, FpOp1, FpOp2);
488 __asm__ __volatile__("" :: "m" (FpDest));
489 Fpscr = setVfpFpscr(Fpscr, state);
490 '''
491 vaddSIop = InstObjParams("vadds", "VaddS", "VfpRegRegRegOp",
492 { "code": vaddSCode,
493 "predicate_test": predicateTest }, [])
494 header_output += VfpRegRegRegOpDeclare.subst(vaddSIop);
495 decoder_output += VfpRegRegRegOpConstructor.subst(vaddSIop);
496 exec_output += PredOpExecute.subst(vaddSIop);
430 declareTempl = eval(base + "Declare");
431 constructorTempl = eval(base + "Constructor");
497
432
498 vaddDCode = '''
499 IntDoubleUnion cOp1, cOp2, cDest;
500 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
501 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
502 DPRINTFN("cOp1.bits = %#x, cOp1.fp = %f.\\n", cOp1.bits, cOp1.fp);
503 DPRINTFN("cOp2.bits = %#x, cOp2.fp = %f.\\n", cOp2.bits, cOp2.fp);
504 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
505 VfpSavedState state = prepVfpFpscr(Fpscr);
506 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
507 cDest.fp = fixDest(Fpscr, cOp1.fp + cOp2.fp, cOp1.fp, cOp2.fp);
508 DPRINTFN("cDest.bits = %#x, cDest.fp = %f.\\n", cDest.bits, cDest.fp);
509 __asm__ __volatile__("" :: "m" (cDest.fp));
510 Fpscr = setVfpFpscr(Fpscr, state);
511 FpDestP0.uw = cDest.bits;
512 FpDestP1.uw = cDest.bits >> 32;
513 '''
514 vaddDIop = InstObjParams("vaddd", "VaddD", "VfpRegRegRegOp",
515 { "code": vaddDCode,
516 "predicate_test": predicateTest }, [])
517 header_output += VfpRegRegRegOpDeclare.subst(vaddDIop);
518 decoder_output += VfpRegRegRegOpConstructor.subst(vaddDIop);
519 exec_output += PredOpExecute.subst(vaddDIop);
433 for iop in sIop, dIop:
434 header_output += declareTempl.subst(iop)
435 decoder_output += constructorTempl.subst(iop)
436 exec_output += PredOpExecute.subst(iop)
520
437
521 vsubSCode = '''
522 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
523 VfpSavedState state = prepVfpFpscr(Fpscr);
524 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
525 FpDest = fixDest(Fpscr, FpOp1 - FpOp2, FpOp1, FpOp2);
526 __asm__ __volatile__("" :: "m" (FpDest));
527 Fpscr = setVfpFpscr(Fpscr, state)
528 '''
529 vsubSIop = InstObjParams("vsubs", "VsubS", "VfpRegRegRegOp",
530 { "code": vsubSCode,
531 "predicate_test": predicateTest }, [])
532 header_output += VfpRegRegRegOpDeclare.subst(vsubSIop);
533 decoder_output += VfpRegRegRegOpConstructor.subst(vsubSIop);
534 exec_output += PredOpExecute.subst(vsubSIop);
438 buildBinFpOp("vadd", "Vadd", "FpRegRegRegOp", "fpAddS", "fpAddD")
439 buildBinFpOp("vsub", "Vsub", "FpRegRegRegOp", "fpSubS", "fpSubD")
440 buildBinFpOp("vdiv", "Vdiv", "FpRegRegRegOp", "fpDivS", "fpDivD")
441 buildBinFpOp("vmul", "Vmul", "FpRegRegRegOp", "fpMulS", "fpMulD")
535
442
536 vsubDCode = '''
537 IntDoubleUnion cOp1, cOp2, cDest;
538 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
539 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
540 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
541 VfpSavedState state = prepVfpFpscr(Fpscr);
542 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
543 cDest.fp = fixDest(Fpscr, cOp1.fp - cOp2.fp, cOp1.fp, cOp2.fp);
544 __asm__ __volatile__("" :: "m" (cDest.fp));
545 Fpscr = setVfpFpscr(Fpscr, state);
546 FpDestP0.uw = cDest.bits;
547 FpDestP1.uw = cDest.bits >> 32;
548 '''
549 vsubDIop = InstObjParams("vsubd", "VsubD", "VfpRegRegRegOp",
550 { "code": vsubDCode,
551 "predicate_test": predicateTest }, [])
552 header_output += VfpRegRegRegOpDeclare.subst(vsubDIop);
553 decoder_output += VfpRegRegRegOpConstructor.subst(vsubDIop);
554 exec_output += PredOpExecute.subst(vsubDIop);
443 def buildUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
444 if doubleOp is None:
445 doubleOp = singleOp
446 global header_output, decoder_output, exec_output
555
447
556 vdivSCode = '''
557 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
558 VfpSavedState state = prepVfpFpscr(Fpscr);
559 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
560 FpDest = fixDest(Fpscr, FpOp1 / FpOp2, FpOp1, FpOp2);
561 __asm__ __volatile__("" :: "m" (FpDest));
562 Fpscr = setVfpFpscr(Fpscr, state);
563 '''
564 vdivSIop = InstObjParams("vdivs", "VdivS", "VfpRegRegRegOp",
565 { "code": vdivSCode,
566 "predicate_test": predicateTest }, [])
567 header_output += VfpRegRegRegOpDeclare.subst(vdivSIop);
568 decoder_output += VfpRegRegRegOpConstructor.subst(vdivSIop);
569 exec_output += PredOpExecute.subst(vdivSIop);
448 code = singleCode % { "op": singleUnaryOp }
449 code = code % { "func": singleOp }
450 sIop = InstObjParams(name + "s", Name + "S", base,
451 { "code": code, "predicate_test": predicateTest }, [])
452 code = doubleCode % { "op": doubleUnaryOp }
453 code = code % { "func": doubleOp }
454 dIop = InstObjParams(name + "d", Name + "D", base,
455 { "code": code, "predicate_test": predicateTest }, [])
570
456
571 vdivDCode = '''
572 IntDoubleUnion cOp1, cOp2, cDest;
573 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
574 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
575 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
576 VfpSavedState state = prepVfpFpscr(Fpscr);
577 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
578 cDest.fp = fixDest(Fpscr, cOp1.fp / cOp2.fp, cOp1.fp, cOp2.fp);
579 __asm__ __volatile__("" :: "m" (cDest.fp));
580 Fpscr = setVfpFpscr(Fpscr, state);
581 FpDestP0.uw = cDest.bits;
582 FpDestP1.uw = cDest.bits >> 32;
583 '''
584 vdivDIop = InstObjParams("vdivd", "VdivD", "VfpRegRegRegOp",
585 { "code": vdivDCode,
586 "predicate_test": predicateTest }, [])
587 header_output += VfpRegRegRegOpDeclare.subst(vdivDIop);
588 decoder_output += VfpRegRegRegOpConstructor.subst(vdivDIop);
589 exec_output += PredOpExecute.subst(vdivDIop);
457 declareTempl = eval(base + "Declare");
458 constructorTempl = eval(base + "Constructor");
590
459
591 vsqrtSCode = '''
592 vfpFlushToZero(Fpscr, FpOp1);
593 VfpSavedState state = prepVfpFpscr(Fpscr);
594 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
595 FpDest = sqrtf(FpOp1);
596 __asm__ __volatile__("" :: "m" (FpDest));
597 Fpscr = setVfpFpscr(Fpscr, state);
598 if (FpOp1 < 0) {
599 FpDest = NAN;
600 }
601 '''
602 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "VfpRegRegOp",
603 { "code": vsqrtSCode,
604 "predicate_test": predicateTest }, [])
605 header_output += VfpRegRegOpDeclare.subst(vsqrtSIop);
606 decoder_output += VfpRegRegOpConstructor.subst(vsqrtSIop);
607 exec_output += PredOpExecute.subst(vsqrtSIop);
460 for iop in sIop, dIop:
461 header_output += declareTempl.subst(iop)
462 decoder_output += constructorTempl.subst(iop)
463 exec_output += PredOpExecute.subst(iop)
608
464
609 vsqrtDCode = '''
610 IntDoubleUnion cOp1, cDest;
611 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
612 vfpFlushToZero(Fpscr, cOp1.fp);
613 VfpSavedState state = prepVfpFpscr(Fpscr);
614 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
615 cDest.fp = sqrt(cOp1.fp);
616 __asm__ __volatile__("" :: "m" (cDest.fp));
617 Fpscr = setVfpFpscr(Fpscr, state);
618 if (cOp1.fp < 0) {
619 cDest.fp = NAN;
620 }
621 FpDestP0.uw = cDest.bits;
622 FpDestP1.uw = cDest.bits >> 32;
623 '''
624 vsqrtDIop = InstObjParams("vsqrtd", "VsqrtD", "VfpRegRegOp",
625 { "code": vsqrtDCode,
626 "predicate_test": predicateTest }, [])
627 header_output += VfpRegRegOpDeclare.subst(vsqrtDIop);
628 decoder_output += VfpRegRegOpConstructor.subst(vsqrtDIop);
629 exec_output += PredOpExecute.subst(vsqrtDIop);
465 buildUnaryFpOp("vsqrt", "Vsqrt", "FpRegRegOp", "sqrtf", "sqrt")
466
467 def buildSimpleUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
468 if doubleOp is None:
469 doubleOp = singleOp
470 global header_output, decoder_output, exec_output
471
472 sIop = InstObjParams(name + "s", Name + "S", base,
473 { "code": singleCode % { "op": singleOp },
474 "predicate_test": predicateTest }, [])
475 dIop = InstObjParams(name + "d", Name + "D", base,
476 { "code": doubleCode % { "op": doubleOp },
477 "predicate_test": predicateTest }, [])
478
479 declareTempl = eval(base + "Declare");
480 constructorTempl = eval(base + "Constructor");
481
482 for iop in sIop, dIop:
483 header_output += declareTempl.subst(iop)
484 decoder_output += constructorTempl.subst(iop)
485 exec_output += PredOpExecute.subst(iop)
486
487 buildSimpleUnaryFpOp("vneg", "Vneg", "FpRegRegOp",
488 "-FpOp1", "-dbl(FpOp1P0.uw, FpOp1P1.uw)")
489 buildSimpleUnaryFpOp("vabs", "Vabs", "FpRegRegOp",
490 "fabsf(FpOp1)", "fabs(dbl(FpOp1P0.uw, FpOp1P1.uw))")
630}};
631
632let {{
633
634 header_output = ""
635 decoder_output = ""
636 exec_output = ""
637
638 vmlaSCode = '''
491}};
492
493let {{
494
495 header_output = ""
496 decoder_output = ""
497 exec_output = ""
498
499 vmlaSCode = '''
639 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
640 VfpSavedState state = prepVfpFpscr(Fpscr);
641 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
642 float mid = fixDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
643 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
644 mid = NAN;
645 }
646 vfpFlushToZero(Fpscr, FpDest, mid);
647 FpDest = fixDest(Fpscr, FpDest + mid, FpDest, mid);
648 __asm__ __volatile__("" :: "m" (FpDest));
649 Fpscr = setVfpFpscr(Fpscr, state);
500 FPSCR fpscr = Fpscr;
501 float mid = binaryOp(fpscr, FpOp1, FpOp2,
502 fpMulS, fpscr.fz, fpscr.rMode);
503 FpDest = binaryOp(fpscr, FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode);
504 Fpscr = fpscr;
650 '''
505 '''
651 vmlaSIop = InstObjParams("vmlas", "VmlaS", "VfpRegRegRegOp",
506 vmlaSIop = InstObjParams("vmlas", "VmlaS", "FpRegRegRegOp",
652 { "code": vmlaSCode,
653 "predicate_test": predicateTest }, [])
507 { "code": vmlaSCode,
508 "predicate_test": predicateTest }, [])
654 header_output += VfpRegRegRegOpDeclare.subst(vmlaSIop);
655 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaSIop);
509 header_output += FpRegRegRegOpDeclare.subst(vmlaSIop);
510 decoder_output += FpRegRegRegOpConstructor.subst(vmlaSIop);
656 exec_output += PredOpExecute.subst(vmlaSIop);
657
658 vmlaDCode = '''
511 exec_output += PredOpExecute.subst(vmlaSIop);
512
513 vmlaDCode = '''
659 IntDoubleUnion cOp1, cOp2, cDest;
660 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
661 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
662 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
663 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
664 VfpSavedState state = prepVfpFpscr(Fpscr);
665 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
666 double mid = fixDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
667 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
668 (isinf(cOp2.fp) && cOp1.fp == 0)) {
669 mid = NAN;
670 }
671 vfpFlushToZero(Fpscr, cDest.fp, mid);
672 cDest.fp = fixDest(Fpscr, cDest.fp + mid, cDest.fp, mid);
673 __asm__ __volatile__("" :: "m" (cDest.fp));
674 Fpscr = setVfpFpscr(Fpscr, state);
675 FpDestP0.uw = cDest.bits;
676 FpDestP1.uw = cDest.bits >> 32;
514 FPSCR fpscr = Fpscr;
515 double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
516 dbl(FpOp2P0.uw, FpOp2P1.uw),
517 fpMulD, fpscr.fz, fpscr.rMode);
518 double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
519 mid, fpAddD, fpscr.fz, fpscr.rMode);
520 Fpscr = fpscr;
521 FpDestP0.uw = dblLow(dest);
522 FpDestP1.uw = dblHi(dest);
677 '''
523 '''
678 vmlaDIop = InstObjParams("vmlad", "VmlaD", "VfpRegRegRegOp",
524 vmlaDIop = InstObjParams("vmlad", "VmlaD", "FpRegRegRegOp",
679 { "code": vmlaDCode,
680 "predicate_test": predicateTest }, [])
525 { "code": vmlaDCode,
526 "predicate_test": predicateTest }, [])
681 header_output += VfpRegRegRegOpDeclare.subst(vmlaDIop);
682 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaDIop);
527 header_output += FpRegRegRegOpDeclare.subst(vmlaDIop);
528 decoder_output += FpRegRegRegOpConstructor.subst(vmlaDIop);
683 exec_output += PredOpExecute.subst(vmlaDIop);
684
685 vmlsSCode = '''
529 exec_output += PredOpExecute.subst(vmlaDIop);
530
531 vmlsSCode = '''
686 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
687 VfpSavedState state = prepVfpFpscr(Fpscr);
688 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
689 float mid = fixDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
690 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
691 mid = NAN;
692 }
693 vfpFlushToZero(Fpscr, FpDest, mid);
694 FpDest = fixDest(Fpscr, FpDest - mid, FpDest, -mid);
695 __asm__ __volatile__("" :: "m" (FpDest));
696 Fpscr = setVfpFpscr(Fpscr, state);
532 FPSCR fpscr = Fpscr;
533 float mid = binaryOp(fpscr, FpOp1, FpOp2,
534 fpMulS, fpscr.fz, fpscr.rMode);
535 FpDest = binaryOp(fpscr, FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode);
536 Fpscr = fpscr;
697 '''
537 '''
698 vmlsSIop = InstObjParams("vmlss", "VmlsS", "VfpRegRegRegOp",
538 vmlsSIop = InstObjParams("vmlss", "VmlsS", "FpRegRegRegOp",
699 { "code": vmlsSCode,
700 "predicate_test": predicateTest }, [])
539 { "code": vmlsSCode,
540 "predicate_test": predicateTest }, [])
701 header_output += VfpRegRegRegOpDeclare.subst(vmlsSIop);
702 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsSIop);
541 header_output += FpRegRegRegOpDeclare.subst(vmlsSIop);
542 decoder_output += FpRegRegRegOpConstructor.subst(vmlsSIop);
703 exec_output += PredOpExecute.subst(vmlsSIop);
704
705 vmlsDCode = '''
543 exec_output += PredOpExecute.subst(vmlsSIop);
544
545 vmlsDCode = '''
706 IntDoubleUnion cOp1, cOp2, cDest;
707 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
708 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
709 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
710 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
711 VfpSavedState state = prepVfpFpscr(Fpscr);
712 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
713 double mid = fixDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
714 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
715 (isinf(cOp2.fp) && cOp1.fp == 0)) {
716 mid = NAN;
717 }
718 cDest.fp = fixDest(Fpscr, cDest.fp - mid, cDest.fp, -mid);
719 vfpFlushToZero(Fpscr, cDest.fp, mid);
720 __asm__ __volatile__("" :: "m" (cDest.fp));
721 Fpscr = setVfpFpscr(Fpscr, state);
722 FpDestP0.uw = cDest.bits;
723 FpDestP1.uw = cDest.bits >> 32;
546 FPSCR fpscr = Fpscr;
547 double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
548 dbl(FpOp2P0.uw, FpOp2P1.uw),
549 fpMulD, fpscr.fz, fpscr.rMode);
550 double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
551 -mid, fpAddD, fpscr.fz, fpscr.rMode);
552 Fpscr = fpscr;
553 FpDestP0.uw = dblLow(dest);
554 FpDestP1.uw = dblHi(dest);
724 '''
555 '''
725 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "VfpRegRegRegOp",
556 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "FpRegRegRegOp",
726 { "code": vmlsDCode,
727 "predicate_test": predicateTest }, [])
557 { "code": vmlsDCode,
558 "predicate_test": predicateTest }, [])
728 header_output += VfpRegRegRegOpDeclare.subst(vmlsDIop);
729 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsDIop);
559 header_output += FpRegRegRegOpDeclare.subst(vmlsDIop);
560 decoder_output += FpRegRegRegOpConstructor.subst(vmlsDIop);
730 exec_output += PredOpExecute.subst(vmlsDIop);
731
732 vnmlaSCode = '''
561 exec_output += PredOpExecute.subst(vmlsDIop);
562
563 vnmlaSCode = '''
733 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
734 VfpSavedState state = prepVfpFpscr(Fpscr);
735 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
736 float mid = fixDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
737 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
738 mid = NAN;
739 }
740 vfpFlushToZero(Fpscr, FpDest, mid);
741 FpDest = fixDest(Fpscr, -FpDest - mid, -FpDest, -mid);
742 __asm__ __volatile__("" :: "m" (FpDest));
743 Fpscr = setVfpFpscr(Fpscr, state);
564 FPSCR fpscr = Fpscr;
565 float mid = binaryOp(fpscr, FpOp1, FpOp2,
566 fpMulS, fpscr.fz, fpscr.rMode);
567 FpDest = binaryOp(fpscr, -FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode);
568 Fpscr = fpscr;
744 '''
569 '''
745 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "VfpRegRegRegOp",
570 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "FpRegRegRegOp",
746 { "code": vnmlaSCode,
747 "predicate_test": predicateTest }, [])
571 { "code": vnmlaSCode,
572 "predicate_test": predicateTest }, [])
748 header_output += VfpRegRegRegOpDeclare.subst(vnmlaSIop);
749 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaSIop);
573 header_output += FpRegRegRegOpDeclare.subst(vnmlaSIop);
574 decoder_output += FpRegRegRegOpConstructor.subst(vnmlaSIop);
750 exec_output += PredOpExecute.subst(vnmlaSIop);
751
752 vnmlaDCode = '''
575 exec_output += PredOpExecute.subst(vnmlaSIop);
576
577 vnmlaDCode = '''
753 IntDoubleUnion cOp1, cOp2, cDest;
754 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
755 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
756 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
757 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
758 VfpSavedState state = prepVfpFpscr(Fpscr);
759 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
760 double mid = fixDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
761 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
762 (isinf(cOp2.fp) && cOp1.fp == 0)) {
763 mid = NAN;
764 }
765 vfpFlushToZero(Fpscr, cDest.fp, mid);
766 cDest.fp = fixDest(Fpscr, -cDest.fp - mid, -cDest.fp, -mid);
767 __asm__ __volatile__("" :: "m" (cDest.fp));
768 Fpscr = setVfpFpscr(Fpscr, state);
769 FpDestP0.uw = cDest.bits;
770 FpDestP1.uw = cDest.bits >> 32;
578 FPSCR fpscr = Fpscr;
579 double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
580 dbl(FpOp2P0.uw, FpOp2P1.uw),
581 fpMulD, fpscr.fz, fpscr.rMode);
582 double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
583 -mid, fpAddD, fpscr.fz, fpscr.rMode);
584 Fpscr = fpscr;
585 FpDestP0.uw = dblLow(dest);
586 FpDestP1.uw = dblHi(dest);
771 '''
587 '''
772 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "VfpRegRegRegOp",
588 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "FpRegRegRegOp",
773 { "code": vnmlaDCode,
774 "predicate_test": predicateTest }, [])
589 { "code": vnmlaDCode,
590 "predicate_test": predicateTest }, [])
775 header_output += VfpRegRegRegOpDeclare.subst(vnmlaDIop);
776 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaDIop);
591 header_output += FpRegRegRegOpDeclare.subst(vnmlaDIop);
592 decoder_output += FpRegRegRegOpConstructor.subst(vnmlaDIop);
777 exec_output += PredOpExecute.subst(vnmlaDIop);
778
779 vnmlsSCode = '''
593 exec_output += PredOpExecute.subst(vnmlaDIop);
594
595 vnmlsSCode = '''
780 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
781 VfpSavedState state = prepVfpFpscr(Fpscr);
782 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
783 float mid = fixDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
784 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
785 mid = NAN;
786 }
787 vfpFlushToZero(Fpscr, FpDest, mid);
788 FpDest = fixDest(Fpscr, -FpDest + mid, -FpDest, mid);
789 __asm__ __volatile__("" :: "m" (FpDest));
790 Fpscr = setVfpFpscr(Fpscr, state);
596 FPSCR fpscr = Fpscr;
597 float mid = binaryOp(fpscr, FpOp1, FpOp2,
598 fpMulS, fpscr.fz, fpscr.rMode);
599 FpDest = binaryOp(fpscr, -FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode);
600 Fpscr = fpscr;
791 '''
601 '''
792 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "VfpRegRegRegOp",
602 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "FpRegRegRegOp",
793 { "code": vnmlsSCode,
794 "predicate_test": predicateTest }, [])
603 { "code": vnmlsSCode,
604 "predicate_test": predicateTest }, [])
795 header_output += VfpRegRegRegOpDeclare.subst(vnmlsSIop);
796 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsSIop);
605 header_output += FpRegRegRegOpDeclare.subst(vnmlsSIop);
606 decoder_output += FpRegRegRegOpConstructor.subst(vnmlsSIop);
797 exec_output += PredOpExecute.subst(vnmlsSIop);
798
799 vnmlsDCode = '''
607 exec_output += PredOpExecute.subst(vnmlsSIop);
608
609 vnmlsDCode = '''
800 IntDoubleUnion cOp1, cOp2, cDest;
801 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
802 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
803 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
804 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
805 VfpSavedState state = prepVfpFpscr(Fpscr);
806 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
807 double mid = fixDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
808 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
809 (isinf(cOp2.fp) && cOp1.fp == 0)) {
810 mid = NAN;
811 }
812 vfpFlushToZero(Fpscr, cDest.fp, mid);
813 cDest.fp = fixDest(Fpscr, -cDest.fp + mid, -cDest.fp, mid);
814 __asm__ __volatile__("" :: "m" (cDest.fp));
815 Fpscr = setVfpFpscr(Fpscr, state);
816 FpDestP0.uw = cDest.bits;
817 FpDestP1.uw = cDest.bits >> 32;
610 FPSCR fpscr = Fpscr;
611 double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
612 dbl(FpOp2P0.uw, FpOp2P1.uw),
613 fpMulD, fpscr.fz, fpscr.rMode);
614 double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
615 mid, fpAddD, fpscr.fz, fpscr.rMode);
616 Fpscr = fpscr;
617 FpDestP0.uw = dblLow(dest);
618 FpDestP1.uw = dblHi(dest);
818 '''
619 '''
819 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "VfpRegRegRegOp",
620 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "FpRegRegRegOp",
820 { "code": vnmlsDCode,
821 "predicate_test": predicateTest }, [])
621 { "code": vnmlsDCode,
622 "predicate_test": predicateTest }, [])
822 header_output += VfpRegRegRegOpDeclare.subst(vnmlsDIop);
823 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsDIop);
623 header_output += FpRegRegRegOpDeclare.subst(vnmlsDIop);
624 decoder_output += FpRegRegRegOpConstructor.subst(vnmlsDIop);
824 exec_output += PredOpExecute.subst(vnmlsDIop);
825
826 vnmulSCode = '''
625 exec_output += PredOpExecute.subst(vnmlsDIop);
626
627 vnmulSCode = '''
827 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
828 VfpSavedState state = prepVfpFpscr(Fpscr);
829 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
830 float mid = fixDest(Fpscr, FpOp1 * FpOp2, FpOp1, FpOp2);
831 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
832 mid = NAN;
833 }
834 FpDest = -mid;
835 __asm__ __volatile__("" :: "m" (FpDest));
836 Fpscr = setVfpFpscr(Fpscr, state);
628 FPSCR fpscr = Fpscr;
629 FpDest = -binaryOp(fpscr, FpOp1, FpOp2, fpMulS, fpscr.fz, fpscr.rMode);
630 Fpscr = fpscr;
837 '''
631 '''
838 vnmulSIop = InstObjParams("vnmuls", "VnmulS", "VfpRegRegRegOp",
632 vnmulSIop = InstObjParams("vnmuls", "VnmulS", "FpRegRegRegOp",
839 { "code": vnmulSCode,
840 "predicate_test": predicateTest }, [])
633 { "code": vnmulSCode,
634 "predicate_test": predicateTest }, [])
841 header_output += VfpRegRegRegOpDeclare.subst(vnmulSIop);
842 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulSIop);
635 header_output += FpRegRegRegOpDeclare.subst(vnmulSIop);
636 decoder_output += FpRegRegRegOpConstructor.subst(vnmulSIop);
843 exec_output += PredOpExecute.subst(vnmulSIop);
844
845 vnmulDCode = '''
637 exec_output += PredOpExecute.subst(vnmulSIop);
638
639 vnmulDCode = '''
846 IntDoubleUnion cOp1, cOp2, cDest;
847 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
848 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
849 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
850 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
851 VfpSavedState state = prepVfpFpscr(Fpscr);
852 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
853 double mid = fixDest(Fpscr, cOp1.fp * cOp2.fp, cOp1.fp, cOp2.fp);
854 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
855 (isinf(cOp2.fp) && cOp1.fp == 0)) {
856 mid = NAN;
857 }
858 cDest.fp = -mid;
859 __asm__ __volatile__("" :: "m" (cDest.fp));
860 Fpscr = setVfpFpscr(Fpscr, state);
861 FpDestP0.uw = cDest.bits;
862 FpDestP1.uw = cDest.bits >> 32;
640 FPSCR fpscr = Fpscr;
641 double dest = -binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
642 dbl(FpOp2P0.uw, FpOp2P1.uw),
643 fpMulD, fpscr.fz, fpscr.rMode);
644 Fpscr = fpscr;
645 FpDestP0.uw = dblLow(dest);
646 FpDestP1.uw = dblHi(dest);
863 '''
647 '''
864 vnmulDIop = InstObjParams("vnmuld", "VnmulD", "VfpRegRegRegOp",
648 vnmulDIop = InstObjParams("vnmuld", "VnmulD", "FpRegRegRegOp",
865 { "code": vnmulDCode,
866 "predicate_test": predicateTest }, [])
649 { "code": vnmulDCode,
650 "predicate_test": predicateTest }, [])
867 header_output += VfpRegRegRegOpDeclare.subst(vnmulDIop);
868 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulDIop);
651 header_output += FpRegRegRegOpDeclare.subst(vnmulDIop);
652 decoder_output += FpRegRegRegOpConstructor.subst(vnmulDIop);
869 exec_output += PredOpExecute.subst(vnmulDIop);
870}};
871
872let {{
873
874 header_output = ""
875 decoder_output = ""
876 exec_output = ""
877
878 vcvtUIntFpSCode = '''
879 VfpSavedState state = prepVfpFpscr(Fpscr);
880 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
881 FpDest = FpOp1.uw;
882 __asm__ __volatile__("" :: "m" (FpDest));
883 Fpscr = setVfpFpscr(Fpscr, state);
884 '''
653 exec_output += PredOpExecute.subst(vnmulDIop);
654}};
655
656let {{
657
658 header_output = ""
659 decoder_output = ""
660 exec_output = ""
661
662 vcvtUIntFpSCode = '''
663 VfpSavedState state = prepVfpFpscr(Fpscr);
664 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
665 FpDest = FpOp1.uw;
666 __asm__ __volatile__("" :: "m" (FpDest));
667 Fpscr = setVfpFpscr(Fpscr, state);
668 '''
885 vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "VfpRegRegOp",
669 vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "FpRegRegOp",
886 { "code": vcvtUIntFpSCode,
887 "predicate_test": predicateTest }, [])
670 { "code": vcvtUIntFpSCode,
671 "predicate_test": predicateTest }, [])
888 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpSIop);
889 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpSIop);
672 header_output += FpRegRegOpDeclare.subst(vcvtUIntFpSIop);
673 decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpSIop);
890 exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
891
892 vcvtUIntFpDCode = '''
893 IntDoubleUnion cDest;
894 VfpSavedState state = prepVfpFpscr(Fpscr);
895 __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
896 cDest.fp = (uint64_t)FpOp1P0.uw;
897 __asm__ __volatile__("" :: "m" (cDest.fp));
898 Fpscr = setVfpFpscr(Fpscr, state);
899 FpDestP0.uw = cDest.bits;
900 FpDestP1.uw = cDest.bits >> 32;
901 '''
674 exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
675
676 vcvtUIntFpDCode = '''
677 IntDoubleUnion cDest;
678 VfpSavedState state = prepVfpFpscr(Fpscr);
679 __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
680 cDest.fp = (uint64_t)FpOp1P0.uw;
681 __asm__ __volatile__("" :: "m" (cDest.fp));
682 Fpscr = setVfpFpscr(Fpscr, state);
683 FpDestP0.uw = cDest.bits;
684 FpDestP1.uw = cDest.bits >> 32;
685 '''
902 vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "VfpRegRegOp",
686 vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "FpRegRegOp",
903 { "code": vcvtUIntFpDCode,
904 "predicate_test": predicateTest }, [])
687 { "code": vcvtUIntFpDCode,
688 "predicate_test": predicateTest }, [])
905 header_output += VfpRegRegOpDeclare.subst(vcvtUIntFpDIop);
906 decoder_output += VfpRegRegOpConstructor.subst(vcvtUIntFpDIop);
689 header_output += FpRegRegOpDeclare.subst(vcvtUIntFpDIop);
690 decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpDIop);
907 exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
908
909 vcvtSIntFpSCode = '''
910 VfpSavedState state = prepVfpFpscr(Fpscr);
911 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
912 FpDest = FpOp1.sw;
913 __asm__ __volatile__("" :: "m" (FpDest));
914 Fpscr = setVfpFpscr(Fpscr, state);
915 '''
691 exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
692
693 vcvtSIntFpSCode = '''
694 VfpSavedState state = prepVfpFpscr(Fpscr);
695 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
696 FpDest = FpOp1.sw;
697 __asm__ __volatile__("" :: "m" (FpDest));
698 Fpscr = setVfpFpscr(Fpscr, state);
699 '''
916 vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "VfpRegRegOp",
700 vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "FpRegRegOp",
917 { "code": vcvtSIntFpSCode,
918 "predicate_test": predicateTest }, [])
701 { "code": vcvtSIntFpSCode,
702 "predicate_test": predicateTest }, [])
919 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpSIop);
920 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpSIop);
703 header_output += FpRegRegOpDeclare.subst(vcvtSIntFpSIop);
704 decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpSIop);
921 exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
922
923 vcvtSIntFpDCode = '''
924 IntDoubleUnion cDest;
925 VfpSavedState state = prepVfpFpscr(Fpscr);
926 __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
927 cDest.fp = FpOp1P0.sw;
928 __asm__ __volatile__("" :: "m" (cDest.fp));
929 Fpscr = setVfpFpscr(Fpscr, state);
930 FpDestP0.uw = cDest.bits;
931 FpDestP1.uw = cDest.bits >> 32;
932 '''
705 exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
706
707 vcvtSIntFpDCode = '''
708 IntDoubleUnion cDest;
709 VfpSavedState state = prepVfpFpscr(Fpscr);
710 __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
711 cDest.fp = FpOp1P0.sw;
712 __asm__ __volatile__("" :: "m" (cDest.fp));
713 Fpscr = setVfpFpscr(Fpscr, state);
714 FpDestP0.uw = cDest.bits;
715 FpDestP1.uw = cDest.bits >> 32;
716 '''
933 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "VfpRegRegOp",
717 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "FpRegRegOp",
934 { "code": vcvtSIntFpDCode,
935 "predicate_test": predicateTest }, [])
718 { "code": vcvtSIntFpDCode,
719 "predicate_test": predicateTest }, [])
936 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpDIop);
937 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
720 header_output += FpRegRegOpDeclare.subst(vcvtSIntFpDIop);
721 decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpDIop);
938 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
939
940 vcvtFpUIntSRCode = '''
941 vfpFlushToZero(Fpscr, FpOp1);
942 VfpSavedState state = prepVfpFpscr(Fpscr);
943 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
944 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false);
945 __asm__ __volatile__("" :: "m" (FpDest.uw));
946 Fpscr = setVfpFpscr(Fpscr, state);
947 '''
722 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
723
724 vcvtFpUIntSRCode = '''
725 vfpFlushToZero(Fpscr, FpOp1);
726 VfpSavedState state = prepVfpFpscr(Fpscr);
727 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
728 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false);
729 __asm__ __volatile__("" :: "m" (FpDest.uw));
730 Fpscr = setVfpFpscr(Fpscr, state);
731 '''
948 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
732 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "FpRegRegOp",
949 { "code": vcvtFpUIntSRCode,
950 "predicate_test": predicateTest }, [])
733 { "code": vcvtFpUIntSRCode,
734 "predicate_test": predicateTest }, [])
951 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
952 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
735 header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
736 decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
953 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
954
955 vcvtFpUIntDRCode = '''
956 IntDoubleUnion cOp1;
957 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
958 vfpFlushToZero(Fpscr, cOp1.fp);
959 VfpSavedState state = prepVfpFpscr(Fpscr);
960 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
961 uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0, false);
962 __asm__ __volatile__("" :: "m" (result));
963 Fpscr = setVfpFpscr(Fpscr, state);
964 FpDestP0.uw = result;
965 '''
737 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
738
739 vcvtFpUIntDRCode = '''
740 IntDoubleUnion cOp1;
741 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
742 vfpFlushToZero(Fpscr, cOp1.fp);
743 VfpSavedState state = prepVfpFpscr(Fpscr);
744 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
745 uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0, false);
746 __asm__ __volatile__("" :: "m" (result));
747 Fpscr = setVfpFpscr(Fpscr, state);
748 FpDestP0.uw = result;
749 '''
966 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
750 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "FpRegRegOp",
967 { "code": vcvtFpUIntDRCode,
968 "predicate_test": predicateTest }, [])
751 { "code": vcvtFpUIntDRCode,
752 "predicate_test": predicateTest }, [])
969 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
970 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
753 header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
754 decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
971 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
972
973 vcvtFpSIntSRCode = '''
974 vfpFlushToZero(Fpscr, FpOp1);
975 VfpSavedState state = prepVfpFpscr(Fpscr);
976 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
977 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false);
978 __asm__ __volatile__("" :: "m" (FpDest.sw));
979 Fpscr = setVfpFpscr(Fpscr, state);
980 '''
755 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
756
757 vcvtFpSIntSRCode = '''
758 vfpFlushToZero(Fpscr, FpOp1);
759 VfpSavedState state = prepVfpFpscr(Fpscr);
760 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
761 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false);
762 __asm__ __volatile__("" :: "m" (FpDest.sw));
763 Fpscr = setVfpFpscr(Fpscr, state);
764 '''
981 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
765 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "FpRegRegOp",
982 { "code": vcvtFpSIntSRCode,
983 "predicate_test": predicateTest }, [])
766 { "code": vcvtFpSIntSRCode,
767 "predicate_test": predicateTest }, [])
984 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
985 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
768 header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
769 decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
986 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
987
988 vcvtFpSIntDRCode = '''
989 IntDoubleUnion cOp1;
990 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
991 vfpFlushToZero(Fpscr, cOp1.fp);
992 VfpSavedState state = prepVfpFpscr(Fpscr);
993 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
994 int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0, false);
995 __asm__ __volatile__("" :: "m" (result));
996 Fpscr = setVfpFpscr(Fpscr, state);
997 FpDestP0.uw = result;
998 '''
770 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
771
772 vcvtFpSIntDRCode = '''
773 IntDoubleUnion cOp1;
774 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
775 vfpFlushToZero(Fpscr, cOp1.fp);
776 VfpSavedState state = prepVfpFpscr(Fpscr);
777 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
778 int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0, false);
779 __asm__ __volatile__("" :: "m" (result));
780 Fpscr = setVfpFpscr(Fpscr, state);
781 FpDestP0.uw = result;
782 '''
999 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
783 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "FpRegRegOp",
1000 { "code": vcvtFpSIntDRCode,
1001 "predicate_test": predicateTest }, [])
784 { "code": vcvtFpSIntDRCode,
785 "predicate_test": predicateTest }, [])
1002 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
1003 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
786 header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
787 decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
1004 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
1005
1006 vcvtFpUIntSCode = '''
1007 vfpFlushToZero(Fpscr, FpOp1);
1008 VfpSavedState state = prepVfpFpscr(Fpscr);
1009 fesetround(FeRoundZero);
1010 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1011 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0);
1012 __asm__ __volatile__("" :: "m" (FpDest.uw));
1013 Fpscr = setVfpFpscr(Fpscr, state);
1014 '''
788 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
789
790 vcvtFpUIntSCode = '''
791 vfpFlushToZero(Fpscr, FpOp1);
792 VfpSavedState state = prepVfpFpscr(Fpscr);
793 fesetround(FeRoundZero);
794 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
795 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0);
796 __asm__ __volatile__("" :: "m" (FpDest.uw));
797 Fpscr = setVfpFpscr(Fpscr, state);
798 '''
1015 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "VfpRegRegOp",
799 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "FpRegRegOp",
1016 { "code": vcvtFpUIntSCode,
1017 "predicate_test": predicateTest }, [])
800 { "code": vcvtFpUIntSCode,
801 "predicate_test": predicateTest }, [])
1018 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSIop);
1019 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSIop);
802 header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSIop);
803 decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSIop);
1020 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
1021
1022 vcvtFpUIntDCode = '''
1023 IntDoubleUnion cOp1;
1024 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1025 vfpFlushToZero(Fpscr, cOp1.fp);
1026 VfpSavedState state = prepVfpFpscr(Fpscr);
1027 fesetround(FeRoundZero);
1028 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1029 uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0);
1030 __asm__ __volatile__("" :: "m" (result));
1031 Fpscr = setVfpFpscr(Fpscr, state);
1032 FpDestP0.uw = result;
1033 '''
804 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
805
806 vcvtFpUIntDCode = '''
807 IntDoubleUnion cOp1;
808 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
809 vfpFlushToZero(Fpscr, cOp1.fp);
810 VfpSavedState state = prepVfpFpscr(Fpscr);
811 fesetround(FeRoundZero);
812 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
813 uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0);
814 __asm__ __volatile__("" :: "m" (result));
815 Fpscr = setVfpFpscr(Fpscr, state);
816 FpDestP0.uw = result;
817 '''
1034 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "VfpRegRegOp",
818 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "FpRegRegOp",
1035 { "code": vcvtFpUIntDCode,
1036 "predicate_test": predicateTest }, [])
819 { "code": vcvtFpUIntDCode,
820 "predicate_test": predicateTest }, [])
1037 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDIop);
1038 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDIop);
821 header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDIop);
822 decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDIop);
1039 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
1040
1041 vcvtFpSIntSCode = '''
1042 vfpFlushToZero(Fpscr, FpOp1);
1043 VfpSavedState state = prepVfpFpscr(Fpscr);
1044 fesetround(FeRoundZero);
1045 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1046 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0);
1047 __asm__ __volatile__("" :: "m" (FpDest.sw));
1048 Fpscr = setVfpFpscr(Fpscr, state);
1049 '''
823 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
824
825 vcvtFpSIntSCode = '''
826 vfpFlushToZero(Fpscr, FpOp1);
827 VfpSavedState state = prepVfpFpscr(Fpscr);
828 fesetround(FeRoundZero);
829 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
830 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0);
831 __asm__ __volatile__("" :: "m" (FpDest.sw));
832 Fpscr = setVfpFpscr(Fpscr, state);
833 '''
1050 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "VfpRegRegOp",
834 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "FpRegRegOp",
1051 { "code": vcvtFpSIntSCode,
1052 "predicate_test": predicateTest }, [])
835 { "code": vcvtFpSIntSCode,
836 "predicate_test": predicateTest }, [])
1053 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSIop);
1054 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSIop);
837 header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSIop);
838 decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSIop);
1055 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
1056
1057 vcvtFpSIntDCode = '''
1058 IntDoubleUnion cOp1;
1059 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1060 vfpFlushToZero(Fpscr, cOp1.fp);
1061 VfpSavedState state = prepVfpFpscr(Fpscr);
1062 fesetround(FeRoundZero);
1063 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1064 int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0);
1065 __asm__ __volatile__("" :: "m" (result));
1066 Fpscr = setVfpFpscr(Fpscr, state);
1067 FpDestP0.uw = result;
1068 '''
839 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
840
841 vcvtFpSIntDCode = '''
842 IntDoubleUnion cOp1;
843 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
844 vfpFlushToZero(Fpscr, cOp1.fp);
845 VfpSavedState state = prepVfpFpscr(Fpscr);
846 fesetround(FeRoundZero);
847 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
848 int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0);
849 __asm__ __volatile__("" :: "m" (result));
850 Fpscr = setVfpFpscr(Fpscr, state);
851 FpDestP0.uw = result;
852 '''
1069 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "VfpRegRegOp",
853 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "FpRegRegOp",
1070 { "code": vcvtFpSIntDCode,
1071 "predicate_test": predicateTest }, [])
854 { "code": vcvtFpSIntDCode,
855 "predicate_test": predicateTest }, [])
1072 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDIop);
1073 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDIop);
856 header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDIop);
857 decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDIop);
1074 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
1075
1076 vcvtFpSFpDCode = '''
1077 IntDoubleUnion cDest;
1078 vfpFlushToZero(Fpscr, FpOp1);
1079 VfpSavedState state = prepVfpFpscr(Fpscr);
1080 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
858 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
859
860 vcvtFpSFpDCode = '''
861 IntDoubleUnion cDest;
862 vfpFlushToZero(Fpscr, FpOp1);
863 VfpSavedState state = prepVfpFpscr(Fpscr);
864 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1081 cDest.fp = FpOp1;
865 cDest.fp = fixFpSFpDDest(Fpscr, FpOp1);
1082 __asm__ __volatile__("" :: "m" (cDest.fp));
1083 Fpscr = setVfpFpscr(Fpscr, state);
1084 FpDestP0.uw = cDest.bits;
1085 FpDestP1.uw = cDest.bits >> 32;
1086 '''
866 __asm__ __volatile__("" :: "m" (cDest.fp));
867 Fpscr = setVfpFpscr(Fpscr, state);
868 FpDestP0.uw = cDest.bits;
869 FpDestP1.uw = cDest.bits >> 32;
870 '''
1087 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "VfpRegRegOp",
871 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "FpRegRegOp",
1088 { "code": vcvtFpSFpDCode,
1089 "predicate_test": predicateTest }, [])
872 { "code": vcvtFpSFpDCode,
873 "predicate_test": predicateTest }, [])
1090 header_output += VfpRegRegOpDeclare.subst(vcvtFpSFpDIop);
1091 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSFpDIop);
874 header_output += FpRegRegOpDeclare.subst(vcvtFpSFpDIop);
875 decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpDIop);
1092 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
1093
1094 vcvtFpDFpSCode = '''
1095 IntDoubleUnion cOp1;
1096 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1097 vfpFlushToZero(Fpscr, cOp1.fp);
1098 VfpSavedState state = prepVfpFpscr(Fpscr);
1099 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1100 FpDest = fixFpDFpSDest(Fpscr, cOp1.fp);
1101 __asm__ __volatile__("" :: "m" (FpDest));
1102 Fpscr = setVfpFpscr(Fpscr, state);
1103 '''
876 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
877
878 vcvtFpDFpSCode = '''
879 IntDoubleUnion cOp1;
880 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
881 vfpFlushToZero(Fpscr, cOp1.fp);
882 VfpSavedState state = prepVfpFpscr(Fpscr);
883 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
884 FpDest = fixFpDFpSDest(Fpscr, cOp1.fp);
885 __asm__ __volatile__("" :: "m" (FpDest));
886 Fpscr = setVfpFpscr(Fpscr, state);
887 '''
1104 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "VfpRegRegOp",
888 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "FpRegRegOp",
1105 { "code": vcvtFpDFpSCode,
1106 "predicate_test": predicateTest }, [])
889 { "code": vcvtFpDFpSCode,
890 "predicate_test": predicateTest }, [])
1107 header_output += VfpRegRegOpDeclare.subst(vcvtFpDFpSIop);
1108 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpDFpSIop);
891 header_output += FpRegRegOpDeclare.subst(vcvtFpDFpSIop);
892 decoder_output += FpRegRegOpConstructor.subst(vcvtFpDFpSIop);
1109 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
1110
1111 vcmpSCode = '''
1112 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1113 FPSCR fpscr = Fpscr;
1114 if (FpDest == FpOp1) {
1115 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1116 } else if (FpDest < FpOp1) {
1117 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1118 } else if (FpDest > FpOp1) {
1119 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1120 } else {
1121 const uint32_t qnan = 0x7fc00000;
893 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
894
895 vcmpSCode = '''
896 vfpFlushToZero(Fpscr, FpDest, FpOp1);
897 FPSCR fpscr = Fpscr;
898 if (FpDest == FpOp1) {
899 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
900 } else if (FpDest < FpOp1) {
901 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
902 } else if (FpDest > FpOp1) {
903 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
904 } else {
905 const uint32_t qnan = 0x7fc00000;
1122 union
1123 {
1124 float fp;
1125 uint32_t bits;
1126 } cvtr;
1127 cvtr.fp = FpDest;
1128 const bool nan1 = std::isnan(FpDest);
906 const bool nan1 = std::isnan(FpDest);
1129 const bool signal1 = nan1 && ((cvtr.bits & qnan) != qnan);
1130 cvtr.fp = FpOp1;
907 const bool signal1 = nan1 && ((fpToBits(FpDest) & qnan) != qnan);
1131 const bool nan2 = std::isnan(FpOp1);
908 const bool nan2 = std::isnan(FpOp1);
1132 const bool signal2 = nan2 && ((cvtr.bits & qnan) != qnan);
909 const bool signal2 = nan2 && ((fpToBits(FpOp1) & qnan) != qnan);
1133 if (signal1 || signal2)
1134 fpscr.ioc = 1;
1135 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1136 }
1137 Fpscr = fpscr;
1138 '''
910 if (signal1 || signal2)
911 fpscr.ioc = 1;
912 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
913 }
914 Fpscr = fpscr;
915 '''
1139 vcmpSIop = InstObjParams("vcmps", "VcmpS", "VfpRegRegOp",
916 vcmpSIop = InstObjParams("vcmps", "VcmpS", "FpRegRegOp",
1140 { "code": vcmpSCode,
1141 "predicate_test": predicateTest }, [])
917 { "code": vcmpSCode,
918 "predicate_test": predicateTest }, [])
1142 header_output += VfpRegRegOpDeclare.subst(vcmpSIop);
1143 decoder_output += VfpRegRegOpConstructor.subst(vcmpSIop);
919 header_output += FpRegRegOpDeclare.subst(vcmpSIop);
920 decoder_output += FpRegRegOpConstructor.subst(vcmpSIop);
1144 exec_output += PredOpExecute.subst(vcmpSIop);
1145
1146 vcmpDCode = '''
1147 IntDoubleUnion cOp1, cDest;
1148 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1149 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1150 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1151 FPSCR fpscr = Fpscr;

--- 10 unchanged lines hidden (view full) ---

1162 const bool nan2 = std::isnan(cOp1.fp);
1163 const bool signal2 = nan2 && ((cOp1.bits & qnan) != qnan);
1164 if (signal1 || signal2)
1165 fpscr.ioc = 1;
1166 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1167 }
1168 Fpscr = fpscr;
1169 '''
921 exec_output += PredOpExecute.subst(vcmpSIop);
922
923 vcmpDCode = '''
924 IntDoubleUnion cOp1, cDest;
925 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
926 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
927 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
928 FPSCR fpscr = Fpscr;

--- 10 unchanged lines hidden (view full) ---

939 const bool nan2 = std::isnan(cOp1.fp);
940 const bool signal2 = nan2 && ((cOp1.bits & qnan) != qnan);
941 if (signal1 || signal2)
942 fpscr.ioc = 1;
943 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
944 }
945 Fpscr = fpscr;
946 '''
1170 vcmpDIop = InstObjParams("vcmpd", "VcmpD", "VfpRegRegOp",
947 vcmpDIop = InstObjParams("vcmpd", "VcmpD", "FpRegRegOp",
1171 { "code": vcmpDCode,
1172 "predicate_test": predicateTest }, [])
948 { "code": vcmpDCode,
949 "predicate_test": predicateTest }, [])
1173 header_output += VfpRegRegOpDeclare.subst(vcmpDIop);
1174 decoder_output += VfpRegRegOpConstructor.subst(vcmpDIop);
950 header_output += FpRegRegOpDeclare.subst(vcmpDIop);
951 decoder_output += FpRegRegOpConstructor.subst(vcmpDIop);
1175 exec_output += PredOpExecute.subst(vcmpDIop);
1176
1177 vcmpZeroSCode = '''
1178 vfpFlushToZero(Fpscr, FpDest);
1179 FPSCR fpscr = Fpscr;
1180 // This only handles imm == 0 for now.
1181 assert(imm == 0);
1182 if (FpDest == imm) {
1183 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1184 } else if (FpDest < imm) {
1185 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1186 } else if (FpDest > imm) {
1187 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1188 } else {
1189 const uint32_t qnan = 0x7fc00000;
952 exec_output += PredOpExecute.subst(vcmpDIop);
953
954 vcmpZeroSCode = '''
955 vfpFlushToZero(Fpscr, FpDest);
956 FPSCR fpscr = Fpscr;
957 // This only handles imm == 0 for now.
958 assert(imm == 0);
959 if (FpDest == imm) {
960 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
961 } else if (FpDest < imm) {
962 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
963 } else if (FpDest > imm) {
964 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
965 } else {
966 const uint32_t qnan = 0x7fc00000;
1190 union
1191 {
1192 float fp;
1193 uint32_t bits;
1194 } cvtr;
1195 cvtr.fp = FpDest;
1196 const bool nan = std::isnan(FpDest);
967 const bool nan = std::isnan(FpDest);
1197 const bool signal = nan && ((cvtr.bits & qnan) != qnan);
968 const bool signal = nan && ((fpToBits(FpDest) & qnan) != qnan);
1198 if (signal)
1199 fpscr.ioc = 1;
1200 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1201 }
1202 Fpscr = fpscr;
1203 '''
969 if (signal)
970 fpscr.ioc = 1;
971 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
972 }
973 Fpscr = fpscr;
974 '''
1204 vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "VfpRegImmOp",
975 vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "FpRegImmOp",
1205 { "code": vcmpZeroSCode,
1206 "predicate_test": predicateTest }, [])
976 { "code": vcmpZeroSCode,
977 "predicate_test": predicateTest }, [])
1207 header_output += VfpRegImmOpDeclare.subst(vcmpZeroSIop);
1208 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroSIop);
978 header_output += FpRegImmOpDeclare.subst(vcmpZeroSIop);
979 decoder_output += FpRegImmOpConstructor.subst(vcmpZeroSIop);
1209 exec_output += PredOpExecute.subst(vcmpZeroSIop);
1210
1211 vcmpZeroDCode = '''
1212 IntDoubleUnion cDest;
1213 // This only handles imm == 0 for now.
1214 assert(imm == 0);
1215 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1216 vfpFlushToZero(Fpscr, cDest.fp);

--- 9 unchanged lines hidden (view full) ---

1226 const bool nan = std::isnan(cDest.fp);
1227 const bool signal = nan && ((cDest.bits & qnan) != qnan);
1228 if (signal)
1229 fpscr.ioc = 1;
1230 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1231 }
1232 Fpscr = fpscr;
1233 '''
980 exec_output += PredOpExecute.subst(vcmpZeroSIop);
981
982 vcmpZeroDCode = '''
983 IntDoubleUnion cDest;
984 // This only handles imm == 0 for now.
985 assert(imm == 0);
986 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
987 vfpFlushToZero(Fpscr, cDest.fp);

--- 9 unchanged lines hidden (view full) ---

997 const bool nan = std::isnan(cDest.fp);
998 const bool signal = nan && ((cDest.bits & qnan) != qnan);
999 if (signal)
1000 fpscr.ioc = 1;
1001 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1002 }
1003 Fpscr = fpscr;
1004 '''
1234 vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "VfpRegImmOp",
1005 vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "FpRegImmOp",
1235 { "code": vcmpZeroDCode,
1236 "predicate_test": predicateTest }, [])
1006 { "code": vcmpZeroDCode,
1007 "predicate_test": predicateTest }, [])
1237 header_output += VfpRegImmOpDeclare.subst(vcmpZeroDIop);
1238 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroDIop);
1008 header_output += FpRegImmOpDeclare.subst(vcmpZeroDIop);
1009 decoder_output += FpRegImmOpConstructor.subst(vcmpZeroDIop);
1239 exec_output += PredOpExecute.subst(vcmpZeroDIop);
1240
1241 vcmpeSCode = '''
1242 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1243 FPSCR fpscr = Fpscr;
1244 if (FpDest == FpOp1) {
1245 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1246 } else if (FpDest < FpOp1) {
1247 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1248 } else if (FpDest > FpOp1) {
1249 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1250 } else {
1251 fpscr.ioc = 1;
1252 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1253 }
1254 Fpscr = fpscr;
1255 '''
1010 exec_output += PredOpExecute.subst(vcmpZeroDIop);
1011
1012 vcmpeSCode = '''
1013 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1014 FPSCR fpscr = Fpscr;
1015 if (FpDest == FpOp1) {
1016 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1017 } else if (FpDest < FpOp1) {
1018 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1019 } else if (FpDest > FpOp1) {
1020 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1021 } else {
1022 fpscr.ioc = 1;
1023 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1024 }
1025 Fpscr = fpscr;
1026 '''
1256 vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "VfpRegRegOp",
1027 vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "FpRegRegOp",
1257 { "code": vcmpeSCode,
1258 "predicate_test": predicateTest }, [])
1028 { "code": vcmpeSCode,
1029 "predicate_test": predicateTest }, [])
1259 header_output += VfpRegRegOpDeclare.subst(vcmpeSIop);
1260 decoder_output += VfpRegRegOpConstructor.subst(vcmpeSIop);
1030 header_output += FpRegRegOpDeclare.subst(vcmpeSIop);
1031 decoder_output += FpRegRegOpConstructor.subst(vcmpeSIop);
1261 exec_output += PredOpExecute.subst(vcmpeSIop);
1262
1263 vcmpeDCode = '''
1264 IntDoubleUnion cOp1, cDest;
1265 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1266 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1267 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1268 FPSCR fpscr = Fpscr;

--- 4 unchanged lines hidden (view full) ---

1273 } else if (cDest.fp > cOp1.fp) {
1274 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1275 } else {
1276 fpscr.ioc = 1;
1277 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1278 }
1279 Fpscr = fpscr;
1280 '''
1032 exec_output += PredOpExecute.subst(vcmpeSIop);
1033
1034 vcmpeDCode = '''
1035 IntDoubleUnion cOp1, cDest;
1036 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1037 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1038 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1039 FPSCR fpscr = Fpscr;

--- 4 unchanged lines hidden (view full) ---

1044 } else if (cDest.fp > cOp1.fp) {
1045 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1046 } else {
1047 fpscr.ioc = 1;
1048 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1049 }
1050 Fpscr = fpscr;
1051 '''
1281 vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "VfpRegRegOp",
1052 vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "FpRegRegOp",
1282 { "code": vcmpeDCode,
1283 "predicate_test": predicateTest }, [])
1053 { "code": vcmpeDCode,
1054 "predicate_test": predicateTest }, [])
1284 header_output += VfpRegRegOpDeclare.subst(vcmpeDIop);
1285 decoder_output += VfpRegRegOpConstructor.subst(vcmpeDIop);
1055 header_output += FpRegRegOpDeclare.subst(vcmpeDIop);
1056 decoder_output += FpRegRegOpConstructor.subst(vcmpeDIop);
1286 exec_output += PredOpExecute.subst(vcmpeDIop);
1287
1288 vcmpeZeroSCode = '''
1289 vfpFlushToZero(Fpscr, FpDest);
1290 FPSCR fpscr = Fpscr;
1291 if (FpDest == imm) {
1292 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1293 } else if (FpDest < imm) {
1294 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1295 } else if (FpDest > imm) {
1296 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1297 } else {
1298 fpscr.ioc = 1;
1299 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1300 }
1301 Fpscr = fpscr;
1302 '''
1057 exec_output += PredOpExecute.subst(vcmpeDIop);
1058
1059 vcmpeZeroSCode = '''
1060 vfpFlushToZero(Fpscr, FpDest);
1061 FPSCR fpscr = Fpscr;
1062 if (FpDest == imm) {
1063 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1064 } else if (FpDest < imm) {
1065 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1066 } else if (FpDest > imm) {
1067 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1068 } else {
1069 fpscr.ioc = 1;
1070 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1071 }
1072 Fpscr = fpscr;
1073 '''
1303 vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "VfpRegImmOp",
1074 vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "FpRegImmOp",
1304 { "code": vcmpeZeroSCode,
1305 "predicate_test": predicateTest }, [])
1075 { "code": vcmpeZeroSCode,
1076 "predicate_test": predicateTest }, [])
1306 header_output += VfpRegImmOpDeclare.subst(vcmpeZeroSIop);
1307 decoder_output += VfpRegImmOpConstructor.subst(vcmpeZeroSIop);
1077 header_output += FpRegImmOpDeclare.subst(vcmpeZeroSIop);
1078 decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroSIop);
1308 exec_output += PredOpExecute.subst(vcmpeZeroSIop);
1309
1310 vcmpeZeroDCode = '''
1311 IntDoubleUnion cDest;
1312 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1313 vfpFlushToZero(Fpscr, cDest.fp);
1314 FPSCR fpscr = Fpscr;
1315 if (cDest.fp == imm) {
1316 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1317 } else if (cDest.fp < imm) {
1318 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1319 } else if (cDest.fp > imm) {
1320 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1321 } else {
1322 fpscr.ioc = 1;
1323 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1324 }
1325 Fpscr = fpscr;
1326 '''
1079 exec_output += PredOpExecute.subst(vcmpeZeroSIop);
1080
1081 vcmpeZeroDCode = '''
1082 IntDoubleUnion cDest;
1083 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1084 vfpFlushToZero(Fpscr, cDest.fp);
1085 FPSCR fpscr = Fpscr;
1086 if (cDest.fp == imm) {
1087 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1088 } else if (cDest.fp < imm) {
1089 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1090 } else if (cDest.fp > imm) {
1091 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1092 } else {
1093 fpscr.ioc = 1;
1094 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
1095 }
1096 Fpscr = fpscr;
1097 '''
1327 vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "VfpRegImmOp",
1098 vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "FpRegImmOp",
1328 { "code": vcmpeZeroDCode,
1329 "predicate_test": predicateTest }, [])
1099 { "code": vcmpeZeroDCode,
1100 "predicate_test": predicateTest }, [])
1330 header_output += VfpRegImmOpDeclare.subst(vcmpeZeroDIop);
1331 decoder_output += VfpRegImmOpConstructor.subst(vcmpeZeroDIop);
1101 header_output += FpRegImmOpDeclare.subst(vcmpeZeroDIop);
1102 decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroDIop);
1332 exec_output += PredOpExecute.subst(vcmpeZeroDIop);
1333}};
1334
1335let {{
1336
1337 header_output = ""
1338 decoder_output = ""
1339 exec_output = ""
1340
1341 vcvtFpSFixedSCode = '''
1342 vfpFlushToZero(Fpscr, FpOp1);
1343 VfpSavedState state = prepVfpFpscr(Fpscr);
1344 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1345 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1346 __asm__ __volatile__("" :: "m" (FpDest.sw));
1347 Fpscr = setVfpFpscr(Fpscr, state);
1348 '''
1103 exec_output += PredOpExecute.subst(vcmpeZeroDIop);
1104}};
1105
1106let {{
1107
1108 header_output = ""
1109 decoder_output = ""
1110 exec_output = ""
1111
1112 vcvtFpSFixedSCode = '''
1113 vfpFlushToZero(Fpscr, FpOp1);
1114 VfpSavedState state = prepVfpFpscr(Fpscr);
1115 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1116 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1117 __asm__ __volatile__("" :: "m" (FpDest.sw));
1118 Fpscr = setVfpFpscr(Fpscr, state);
1119 '''
1349 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "VfpRegRegImmOp",
1120 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "FpRegRegImmOp",
1350 { "code": vcvtFpSFixedSCode,
1351 "predicate_test": predicateTest }, [])
1121 { "code": vcvtFpSFixedSCode,
1122 "predicate_test": predicateTest }, [])
1352 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1353 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1123 header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1124 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1354 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1355
1356 vcvtFpSFixedDCode = '''
1357 IntDoubleUnion cOp1;
1358 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1359 vfpFlushToZero(Fpscr, cOp1.fp);
1360 VfpSavedState state = prepVfpFpscr(Fpscr);
1361 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1362 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1363 __asm__ __volatile__("" :: "m" (mid));
1364 Fpscr = setVfpFpscr(Fpscr, state);
1365 FpDestP0.uw = mid;
1366 FpDestP1.uw = mid >> 32;
1367 '''
1125 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1126
1127 vcvtFpSFixedDCode = '''
1128 IntDoubleUnion cOp1;
1129 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1130 vfpFlushToZero(Fpscr, cOp1.fp);
1131 VfpSavedState state = prepVfpFpscr(Fpscr);
1132 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1133 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1134 __asm__ __volatile__("" :: "m" (mid));
1135 Fpscr = setVfpFpscr(Fpscr, state);
1136 FpDestP0.uw = mid;
1137 FpDestP1.uw = mid >> 32;
1138 '''
1368 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "VfpRegRegImmOp",
1139 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "FpRegRegImmOp",
1369 { "code": vcvtFpSFixedDCode,
1370 "predicate_test": predicateTest }, [])
1140 { "code": vcvtFpSFixedDCode,
1141 "predicate_test": predicateTest }, [])
1371 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1372 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1142 header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1143 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1373 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1374
1375 vcvtFpUFixedSCode = '''
1376 vfpFlushToZero(Fpscr, FpOp1);
1377 VfpSavedState state = prepVfpFpscr(Fpscr);
1378 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1379 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1380 __asm__ __volatile__("" :: "m" (FpDest.uw));
1381 Fpscr = setVfpFpscr(Fpscr, state);
1382 '''
1144 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1145
1146 vcvtFpUFixedSCode = '''
1147 vfpFlushToZero(Fpscr, FpOp1);
1148 VfpSavedState state = prepVfpFpscr(Fpscr);
1149 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1150 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1151 __asm__ __volatile__("" :: "m" (FpDest.uw));
1152 Fpscr = setVfpFpscr(Fpscr, state);
1153 '''
1383 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "VfpRegRegImmOp",
1154 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "FpRegRegImmOp",
1384 { "code": vcvtFpUFixedSCode,
1385 "predicate_test": predicateTest }, [])
1155 { "code": vcvtFpUFixedSCode,
1156 "predicate_test": predicateTest }, [])
1386 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1387 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1157 header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1158 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1388 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1389
1390 vcvtFpUFixedDCode = '''
1391 IntDoubleUnion cOp1;
1392 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1393 vfpFlushToZero(Fpscr, cOp1.fp);
1394 VfpSavedState state = prepVfpFpscr(Fpscr);
1395 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1396 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1397 __asm__ __volatile__("" :: "m" (mid));
1398 Fpscr = setVfpFpscr(Fpscr, state);
1399 FpDestP0.uw = mid;
1400 FpDestP1.uw = mid >> 32;
1401 '''
1159 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1160
1161 vcvtFpUFixedDCode = '''
1162 IntDoubleUnion cOp1;
1163 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1164 vfpFlushToZero(Fpscr, cOp1.fp);
1165 VfpSavedState state = prepVfpFpscr(Fpscr);
1166 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1167 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1168 __asm__ __volatile__("" :: "m" (mid));
1169 Fpscr = setVfpFpscr(Fpscr, state);
1170 FpDestP0.uw = mid;
1171 FpDestP1.uw = mid >> 32;
1172 '''
1402 vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "VfpRegRegImmOp",
1173 vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "FpRegRegImmOp",
1403 { "code": vcvtFpUFixedDCode,
1404 "predicate_test": predicateTest }, [])
1174 { "code": vcvtFpUFixedDCode,
1175 "predicate_test": predicateTest }, [])
1405 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
1406 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
1176 header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
1177 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
1407 exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
1408
1409 vcvtSFixedFpSCode = '''
1410 VfpSavedState state = prepVfpFpscr(Fpscr);
1411 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
1412 FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sw, false, imm);
1413 __asm__ __volatile__("" :: "m" (FpDest));
1414 Fpscr = setVfpFpscr(Fpscr, state);
1415 '''
1178 exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
1179
1180 vcvtSFixedFpSCode = '''
1181 VfpSavedState state = prepVfpFpscr(Fpscr);
1182 __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
1183 FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sw, false, imm);
1184 __asm__ __volatile__("" :: "m" (FpDest));
1185 Fpscr = setVfpFpscr(Fpscr, state);
1186 '''
1416 vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "VfpRegRegImmOp",
1187 vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "FpRegRegImmOp",
1417 { "code": vcvtSFixedFpSCode,
1418 "predicate_test": predicateTest }, [])
1188 { "code": vcvtSFixedFpSCode,
1189 "predicate_test": predicateTest }, [])
1419 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
1420 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
1190 header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
1191 decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
1421 exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
1422
1423 vcvtSFixedFpDCode = '''
1424 IntDoubleUnion cDest;
1425 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1426 VfpSavedState state = prepVfpFpscr(Fpscr);
1427 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1428 cDest.fp = vfpSFixedToFpD(Fpscr, mid, false, imm);
1429 __asm__ __volatile__("" :: "m" (cDest.fp));
1430 Fpscr = setVfpFpscr(Fpscr, state);
1431 FpDestP0.uw = cDest.bits;
1432 FpDestP1.uw = cDest.bits >> 32;
1433 '''
1192 exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
1193
1194 vcvtSFixedFpDCode = '''
1195 IntDoubleUnion cDest;
1196 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1197 VfpSavedState state = prepVfpFpscr(Fpscr);
1198 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1199 cDest.fp = vfpSFixedToFpD(Fpscr, mid, false, imm);
1200 __asm__ __volatile__("" :: "m" (cDest.fp));
1201 Fpscr = setVfpFpscr(Fpscr, state);
1202 FpDestP0.uw = cDest.bits;
1203 FpDestP1.uw = cDest.bits >> 32;
1204 '''
1434 vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "VfpRegRegImmOp",
1205 vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "FpRegRegImmOp",
1435 { "code": vcvtSFixedFpDCode,
1436 "predicate_test": predicateTest }, [])
1206 { "code": vcvtSFixedFpDCode,
1207 "predicate_test": predicateTest }, [])
1437 header_output += VfpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
1438 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
1208 header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
1209 decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
1439 exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
1440
1441 vcvtUFixedFpSCode = '''
1442 VfpSavedState state = prepVfpFpscr(Fpscr);
1443 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
1444 FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uw, false, imm);
1445 __asm__ __volatile__("" :: "m" (FpDest));
1446 Fpscr = setVfpFpscr(Fpscr, state);
1447 '''
1210 exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
1211
1212 vcvtUFixedFpSCode = '''
1213 VfpSavedState state = prepVfpFpscr(Fpscr);
1214 __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
1215 FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uw, false, imm);
1216 __asm__ __volatile__("" :: "m" (FpDest));
1217 Fpscr = setVfpFpscr(Fpscr, state);
1218 '''
1448 vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "VfpRegRegImmOp",
1219 vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "FpRegRegImmOp",
1449 { "code": vcvtUFixedFpSCode,
1450 "predicate_test": predicateTest }, [])
1220 { "code": vcvtUFixedFpSCode,
1221 "predicate_test": predicateTest }, [])
1451 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
1452 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
1222 header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
1223 decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
1453 exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
1454
1455 vcvtUFixedFpDCode = '''
1456 IntDoubleUnion cDest;
1457 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1458 VfpSavedState state = prepVfpFpscr(Fpscr);
1459 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1460 cDest.fp = vfpUFixedToFpD(Fpscr, mid, false, imm);
1461 __asm__ __volatile__("" :: "m" (cDest.fp));
1462 Fpscr = setVfpFpscr(Fpscr, state);
1463 FpDestP0.uw = cDest.bits;
1464 FpDestP1.uw = cDest.bits >> 32;
1465 '''
1224 exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
1225
1226 vcvtUFixedFpDCode = '''
1227 IntDoubleUnion cDest;
1228 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1229 VfpSavedState state = prepVfpFpscr(Fpscr);
1230 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1231 cDest.fp = vfpUFixedToFpD(Fpscr, mid, false, imm);
1232 __asm__ __volatile__("" :: "m" (cDest.fp));
1233 Fpscr = setVfpFpscr(Fpscr, state);
1234 FpDestP0.uw = cDest.bits;
1235 FpDestP1.uw = cDest.bits >> 32;
1236 '''
1466 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "VfpRegRegImmOp",
1237 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "FpRegRegImmOp",
1467 { "code": vcvtUFixedFpDCode,
1468 "predicate_test": predicateTest }, [])
1238 { "code": vcvtUFixedFpDCode,
1239 "predicate_test": predicateTest }, [])
1469 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1470 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1240 header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1241 decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1471 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1472
1473 vcvtFpSHFixedSCode = '''
1474 vfpFlushToZero(Fpscr, FpOp1);
1475 VfpSavedState state = prepVfpFpscr(Fpscr);
1476 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1477 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1478 __asm__ __volatile__("" :: "m" (FpDest.sh));
1479 Fpscr = setVfpFpscr(Fpscr, state);
1480 '''
1481 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1242 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1243
1244 vcvtFpSHFixedSCode = '''
1245 vfpFlushToZero(Fpscr, FpOp1);
1246 VfpSavedState state = prepVfpFpscr(Fpscr);
1247 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1248 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1249 __asm__ __volatile__("" :: "m" (FpDest.sh));
1250 Fpscr = setVfpFpscr(Fpscr, state);
1251 '''
1252 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1482 "VfpRegRegImmOp",
1253 "FpRegRegImmOp",
1483 { "code": vcvtFpSHFixedSCode,
1484 "predicate_test": predicateTest }, [])
1254 { "code": vcvtFpSHFixedSCode,
1255 "predicate_test": predicateTest }, [])
1485 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1486 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1256 header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1257 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1487 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1488
1489 vcvtFpSHFixedDCode = '''
1490 IntDoubleUnion cOp1;
1491 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1492 vfpFlushToZero(Fpscr, cOp1.fp);
1493 VfpSavedState state = prepVfpFpscr(Fpscr);
1494 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1495 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1496 __asm__ __volatile__("" :: "m" (result));
1497 Fpscr = setVfpFpscr(Fpscr, state);
1498 FpDestP0.uw = result;
1499 FpDestP1.uw = result >> 32;
1500 '''
1501 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1258 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1259
1260 vcvtFpSHFixedDCode = '''
1261 IntDoubleUnion cOp1;
1262 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1263 vfpFlushToZero(Fpscr, cOp1.fp);
1264 VfpSavedState state = prepVfpFpscr(Fpscr);
1265 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1266 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1267 __asm__ __volatile__("" :: "m" (result));
1268 Fpscr = setVfpFpscr(Fpscr, state);
1269 FpDestP0.uw = result;
1270 FpDestP1.uw = result >> 32;
1271 '''
1272 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1502 "VfpRegRegImmOp",
1273 "FpRegRegImmOp",
1503 { "code": vcvtFpSHFixedDCode,
1504 "predicate_test": predicateTest }, [])
1274 { "code": vcvtFpSHFixedDCode,
1275 "predicate_test": predicateTest }, [])
1505 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1506 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1276 header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1277 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1507 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1508
1509 vcvtFpUHFixedSCode = '''
1510 vfpFlushToZero(Fpscr, FpOp1);
1511 VfpSavedState state = prepVfpFpscr(Fpscr);
1512 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1513 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1514 __asm__ __volatile__("" :: "m" (FpDest.uh));
1515 Fpscr = setVfpFpscr(Fpscr, state);
1516 '''
1517 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1278 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1279
1280 vcvtFpUHFixedSCode = '''
1281 vfpFlushToZero(Fpscr, FpOp1);
1282 VfpSavedState state = prepVfpFpscr(Fpscr);
1283 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1284 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1285 __asm__ __volatile__("" :: "m" (FpDest.uh));
1286 Fpscr = setVfpFpscr(Fpscr, state);
1287 '''
1288 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1518 "VfpRegRegImmOp",
1289 "FpRegRegImmOp",
1519 { "code": vcvtFpUHFixedSCode,
1520 "predicate_test": predicateTest }, [])
1290 { "code": vcvtFpUHFixedSCode,
1291 "predicate_test": predicateTest }, [])
1521 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1522 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1292 header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1293 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1523 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1524
1525 vcvtFpUHFixedDCode = '''
1526 IntDoubleUnion cOp1;
1527 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1528 vfpFlushToZero(Fpscr, cOp1.fp);
1529 VfpSavedState state = prepVfpFpscr(Fpscr);
1530 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1531 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1532 __asm__ __volatile__("" :: "m" (mid));
1533 Fpscr = setVfpFpscr(Fpscr, state);
1534 FpDestP0.uw = mid;
1535 FpDestP1.uw = mid >> 32;
1536 '''
1537 vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
1294 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1295
1296 vcvtFpUHFixedDCode = '''
1297 IntDoubleUnion cOp1;
1298 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1299 vfpFlushToZero(Fpscr, cOp1.fp);
1300 VfpSavedState state = prepVfpFpscr(Fpscr);
1301 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1302 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1303 __asm__ __volatile__("" :: "m" (mid));
1304 Fpscr = setVfpFpscr(Fpscr, state);
1305 FpDestP0.uw = mid;
1306 FpDestP1.uw = mid >> 32;
1307 '''
1308 vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
1538 "VfpRegRegImmOp",
1309 "FpRegRegImmOp",
1539 { "code": vcvtFpUHFixedDCode,
1540 "predicate_test": predicateTest }, [])
1310 { "code": vcvtFpUHFixedDCode,
1311 "predicate_test": predicateTest }, [])
1541 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
1542 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
1312 header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
1313 decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
1543 exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
1544
1545 vcvtSHFixedFpSCode = '''
1546 VfpSavedState state = prepVfpFpscr(Fpscr);
1547 __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
1548 FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sh, true, imm);
1549 __asm__ __volatile__("" :: "m" (FpDest));
1550 Fpscr = setVfpFpscr(Fpscr, state);
1551 '''
1552 vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
1314 exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
1315
1316 vcvtSHFixedFpSCode = '''
1317 VfpSavedState state = prepVfpFpscr(Fpscr);
1318 __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
1319 FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sh, true, imm);
1320 __asm__ __volatile__("" :: "m" (FpDest));
1321 Fpscr = setVfpFpscr(Fpscr, state);
1322 '''
1323 vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
1553 "VfpRegRegImmOp",
1324 "FpRegRegImmOp",
1554 { "code": vcvtSHFixedFpSCode,
1555 "predicate_test": predicateTest }, [])
1325 { "code": vcvtSHFixedFpSCode,
1326 "predicate_test": predicateTest }, [])
1556 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
1557 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
1327 header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
1328 decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
1558 exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
1559
1560 vcvtSHFixedFpDCode = '''
1561 IntDoubleUnion cDest;
1562 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1563 VfpSavedState state = prepVfpFpscr(Fpscr);
1564 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1565 cDest.fp = vfpSFixedToFpD(Fpscr, mid, true, imm);
1566 __asm__ __volatile__("" :: "m" (cDest.fp));
1567 Fpscr = setVfpFpscr(Fpscr, state);
1568 FpDestP0.uw = cDest.bits;
1569 FpDestP1.uw = cDest.bits >> 32;
1570 '''
1571 vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
1329 exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
1330
1331 vcvtSHFixedFpDCode = '''
1332 IntDoubleUnion cDest;
1333 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1334 VfpSavedState state = prepVfpFpscr(Fpscr);
1335 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1336 cDest.fp = vfpSFixedToFpD(Fpscr, mid, true, imm);
1337 __asm__ __volatile__("" :: "m" (cDest.fp));
1338 Fpscr = setVfpFpscr(Fpscr, state);
1339 FpDestP0.uw = cDest.bits;
1340 FpDestP1.uw = cDest.bits >> 32;
1341 '''
1342 vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
1572 "VfpRegRegImmOp",
1343 "FpRegRegImmOp",
1573 { "code": vcvtSHFixedFpDCode,
1574 "predicate_test": predicateTest }, [])
1344 { "code": vcvtSHFixedFpDCode,
1345 "predicate_test": predicateTest }, [])
1575 header_output += VfpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
1576 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
1346 header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
1347 decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
1577 exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
1578
1579 vcvtUHFixedFpSCode = '''
1580 VfpSavedState state = prepVfpFpscr(Fpscr);
1581 __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
1582 FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uh, true, imm);
1583 __asm__ __volatile__("" :: "m" (FpDest));
1584 Fpscr = setVfpFpscr(Fpscr, state);
1585 '''
1586 vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
1348 exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
1349
1350 vcvtUHFixedFpSCode = '''
1351 VfpSavedState state = prepVfpFpscr(Fpscr);
1352 __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
1353 FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uh, true, imm);
1354 __asm__ __volatile__("" :: "m" (FpDest));
1355 Fpscr = setVfpFpscr(Fpscr, state);
1356 '''
1357 vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
1587 "VfpRegRegImmOp",
1358 "FpRegRegImmOp",
1588 { "code": vcvtUHFixedFpSCode,
1589 "predicate_test": predicateTest }, [])
1359 { "code": vcvtUHFixedFpSCode,
1360 "predicate_test": predicateTest }, [])
1590 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
1591 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
1361 header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
1362 decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
1592 exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
1593
1594 vcvtUHFixedFpDCode = '''
1595 IntDoubleUnion cDest;
1596 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1597 VfpSavedState state = prepVfpFpscr(Fpscr);
1598 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1599 cDest.fp = vfpUFixedToFpD(Fpscr, mid, true, imm);
1600 __asm__ __volatile__("" :: "m" (cDest.fp));
1601 Fpscr = setVfpFpscr(Fpscr, state);
1602 FpDestP0.uw = cDest.bits;
1603 FpDestP1.uw = cDest.bits >> 32;
1604 '''
1605 vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
1363 exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
1364
1365 vcvtUHFixedFpDCode = '''
1366 IntDoubleUnion cDest;
1367 uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1368 VfpSavedState state = prepVfpFpscr(Fpscr);
1369 __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
1370 cDest.fp = vfpUFixedToFpD(Fpscr, mid, true, imm);
1371 __asm__ __volatile__("" :: "m" (cDest.fp));
1372 Fpscr = setVfpFpscr(Fpscr, state);
1373 FpDestP0.uw = cDest.bits;
1374 FpDestP1.uw = cDest.bits >> 32;
1375 '''
1376 vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
1606 "VfpRegRegImmOp",
1377 "FpRegRegImmOp",
1607 { "code": vcvtUHFixedFpDCode,
1608 "predicate_test": predicateTest }, [])
1378 { "code": vcvtUHFixedFpDCode,
1379 "predicate_test": predicateTest }, [])
1609 header_output += VfpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
1610 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
1380 header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
1381 decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
1611 exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
1612}};
1382 exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
1383}};