fp.isa (7381:bc68c91e9814) fp.isa (7382:b3c768629a54)
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

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

378
379let {{
380
381 header_output = ""
382 decoder_output = ""
383 exec_output = ""
384
385 vmulSCode = '''
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

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

378
379let {{
380
381 header_output = ""
382 decoder_output = ""
383 exec_output = ""
384
385 vmulSCode = '''
386 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
386 VfpSavedState state = prepVfpFpscr(Fpscr);
387 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
388 FpDest = FpOp1 * FpOp2;
389 __asm__ __volatile__("" :: "m" (FpDest));
390 Fpscr = setVfpFpscr(Fpscr, state);
391 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
392 FpDest = NAN;
393 }

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

398 header_output += VfpRegRegRegOpDeclare.subst(vmulSIop);
399 decoder_output += VfpRegRegRegOpConstructor.subst(vmulSIop);
400 exec_output += PredOpExecute.subst(vmulSIop);
401
402 vmulDCode = '''
403 IntDoubleUnion cOp1, cOp2, cDest;
404 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
405 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
387 VfpSavedState state = prepVfpFpscr(Fpscr);
388 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
389 FpDest = FpOp1 * FpOp2;
390 __asm__ __volatile__("" :: "m" (FpDest));
391 Fpscr = setVfpFpscr(Fpscr, state);
392 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
393 FpDest = NAN;
394 }

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

399 header_output += VfpRegRegRegOpDeclare.subst(vmulSIop);
400 decoder_output += VfpRegRegRegOpConstructor.subst(vmulSIop);
401 exec_output += PredOpExecute.subst(vmulSIop);
402
403 vmulDCode = '''
404 IntDoubleUnion cOp1, cOp2, cDest;
405 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
406 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
407 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
406 VfpSavedState state = prepVfpFpscr(Fpscr);
407 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
408 cDest.fp = cOp1.fp * cOp2.fp;
409 __asm__ __volatile__("" :: "m" (cDest.fp));
410 Fpscr = setVfpFpscr(Fpscr, state);
411 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
412 (isinf(cOp2.fp) && cOp1.fp == 0)) {
413 cDest.fp = NAN;

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

466 vabsDIop = InstObjParams("vabsd", "VabsD", "VfpRegRegOp",
467 { "code": vabsDCode,
468 "predicate_test": predicateTest }, [])
469 header_output += VfpRegRegOpDeclare.subst(vabsDIop);
470 decoder_output += VfpRegRegOpConstructor.subst(vabsDIop);
471 exec_output += PredOpExecute.subst(vabsDIop);
472
473 vaddSCode = '''
408 VfpSavedState state = prepVfpFpscr(Fpscr);
409 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
410 cDest.fp = cOp1.fp * cOp2.fp;
411 __asm__ __volatile__("" :: "m" (cDest.fp));
412 Fpscr = setVfpFpscr(Fpscr, state);
413 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
414 (isinf(cOp2.fp) && cOp1.fp == 0)) {
415 cDest.fp = NAN;

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

468 vabsDIop = InstObjParams("vabsd", "VabsD", "VfpRegRegOp",
469 { "code": vabsDCode,
470 "predicate_test": predicateTest }, [])
471 header_output += VfpRegRegOpDeclare.subst(vabsDIop);
472 decoder_output += VfpRegRegOpConstructor.subst(vabsDIop);
473 exec_output += PredOpExecute.subst(vabsDIop);
474
475 vaddSCode = '''
476 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
474 VfpSavedState state = prepVfpFpscr(Fpscr);
475 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
476 FpDest = FpOp1 + FpOp2;
477 __asm__ __volatile__("" :: "m" (FpDest));
478 Fpscr = setVfpFpscr(Fpscr, state);
479 '''
480 vaddSIop = InstObjParams("vadds", "VaddS", "VfpRegRegRegOp",
481 { "code": vaddSCode,
482 "predicate_test": predicateTest }, [])
483 header_output += VfpRegRegRegOpDeclare.subst(vaddSIop);
484 decoder_output += VfpRegRegRegOpConstructor.subst(vaddSIop);
485 exec_output += PredOpExecute.subst(vaddSIop);
486
487 vaddDCode = '''
488 IntDoubleUnion cOp1, cOp2, cDest;
489 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
490 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
477 VfpSavedState state = prepVfpFpscr(Fpscr);
478 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
479 FpDest = FpOp1 + FpOp2;
480 __asm__ __volatile__("" :: "m" (FpDest));
481 Fpscr = setVfpFpscr(Fpscr, state);
482 '''
483 vaddSIop = InstObjParams("vadds", "VaddS", "VfpRegRegRegOp",
484 { "code": vaddSCode,
485 "predicate_test": predicateTest }, [])
486 header_output += VfpRegRegRegOpDeclare.subst(vaddSIop);
487 decoder_output += VfpRegRegRegOpConstructor.subst(vaddSIop);
488 exec_output += PredOpExecute.subst(vaddSIop);
489
490 vaddDCode = '''
491 IntDoubleUnion cOp1, cOp2, cDest;
492 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
493 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
494 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
491 VfpSavedState state = prepVfpFpscr(Fpscr);
492 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
493 cDest.fp = cOp1.fp + cOp2.fp;
494 __asm__ __volatile__("" :: "m" (cDest.fp));
495 Fpscr = setVfpFpscr(Fpscr, state);
496 FpDestP0.uw = cDest.bits;
497 FpDestP1.uw = cDest.bits >> 32;
498 '''
499 vaddDIop = InstObjParams("vaddd", "VaddD", "VfpRegRegRegOp",
500 { "code": vaddDCode,
501 "predicate_test": predicateTest }, [])
502 header_output += VfpRegRegRegOpDeclare.subst(vaddDIop);
503 decoder_output += VfpRegRegRegOpConstructor.subst(vaddDIop);
504 exec_output += PredOpExecute.subst(vaddDIop);
505
506 vsubSCode = '''
495 VfpSavedState state = prepVfpFpscr(Fpscr);
496 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
497 cDest.fp = cOp1.fp + cOp2.fp;
498 __asm__ __volatile__("" :: "m" (cDest.fp));
499 Fpscr = setVfpFpscr(Fpscr, state);
500 FpDestP0.uw = cDest.bits;
501 FpDestP1.uw = cDest.bits >> 32;
502 '''
503 vaddDIop = InstObjParams("vaddd", "VaddD", "VfpRegRegRegOp",
504 { "code": vaddDCode,
505 "predicate_test": predicateTest }, [])
506 header_output += VfpRegRegRegOpDeclare.subst(vaddDIop);
507 decoder_output += VfpRegRegRegOpConstructor.subst(vaddDIop);
508 exec_output += PredOpExecute.subst(vaddDIop);
509
510 vsubSCode = '''
511 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
507 VfpSavedState state = prepVfpFpscr(Fpscr);
508 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
509 FpDest = FpOp1 - FpOp2;
510 __asm__ __volatile__("" :: "m" (FpDest));
511 Fpscr = setVfpFpscr(Fpscr, state)
512 '''
513 vsubSIop = InstObjParams("vsubs", "VsubS", "VfpRegRegRegOp",
514 { "code": vsubSCode,
515 "predicate_test": predicateTest }, [])
516 header_output += VfpRegRegRegOpDeclare.subst(vsubSIop);
517 decoder_output += VfpRegRegRegOpConstructor.subst(vsubSIop);
518 exec_output += PredOpExecute.subst(vsubSIop);
519
520 vsubDCode = '''
521 IntDoubleUnion cOp1, cOp2, cDest;
522 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
523 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
512 VfpSavedState state = prepVfpFpscr(Fpscr);
513 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
514 FpDest = FpOp1 - FpOp2;
515 __asm__ __volatile__("" :: "m" (FpDest));
516 Fpscr = setVfpFpscr(Fpscr, state)
517 '''
518 vsubSIop = InstObjParams("vsubs", "VsubS", "VfpRegRegRegOp",
519 { "code": vsubSCode,
520 "predicate_test": predicateTest }, [])
521 header_output += VfpRegRegRegOpDeclare.subst(vsubSIop);
522 decoder_output += VfpRegRegRegOpConstructor.subst(vsubSIop);
523 exec_output += PredOpExecute.subst(vsubSIop);
524
525 vsubDCode = '''
526 IntDoubleUnion cOp1, cOp2, cDest;
527 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
528 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
529 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
524 VfpSavedState state = prepVfpFpscr(Fpscr);
525 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
526 cDest.fp = cOp1.fp - cOp2.fp;
527 __asm__ __volatile__("" :: "m" (cDest.fp));
528 Fpscr = setVfpFpscr(Fpscr, state);
529 FpDestP0.uw = cDest.bits;
530 FpDestP1.uw = cDest.bits >> 32;
531 '''
532 vsubDIop = InstObjParams("vsubd", "VsubD", "VfpRegRegRegOp",
533 { "code": vsubDCode,
534 "predicate_test": predicateTest }, [])
535 header_output += VfpRegRegRegOpDeclare.subst(vsubDIop);
536 decoder_output += VfpRegRegRegOpConstructor.subst(vsubDIop);
537 exec_output += PredOpExecute.subst(vsubDIop);
538
539 vdivSCode = '''
530 VfpSavedState state = prepVfpFpscr(Fpscr);
531 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
532 cDest.fp = cOp1.fp - cOp2.fp;
533 __asm__ __volatile__("" :: "m" (cDest.fp));
534 Fpscr = setVfpFpscr(Fpscr, state);
535 FpDestP0.uw = cDest.bits;
536 FpDestP1.uw = cDest.bits >> 32;
537 '''
538 vsubDIop = InstObjParams("vsubd", "VsubD", "VfpRegRegRegOp",
539 { "code": vsubDCode,
540 "predicate_test": predicateTest }, [])
541 header_output += VfpRegRegRegOpDeclare.subst(vsubDIop);
542 decoder_output += VfpRegRegRegOpConstructor.subst(vsubDIop);
543 exec_output += PredOpExecute.subst(vsubDIop);
544
545 vdivSCode = '''
546 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
540 VfpSavedState state = prepVfpFpscr(Fpscr);
541 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
542 FpDest = FpOp1 / FpOp2;
543 __asm__ __volatile__("" :: "m" (FpDest));
544 Fpscr = setVfpFpscr(Fpscr, state);
545 '''
546 vdivSIop = InstObjParams("vdivs", "VdivS", "VfpRegRegRegOp",
547 { "code": vdivSCode,
548 "predicate_test": predicateTest }, [])
549 header_output += VfpRegRegRegOpDeclare.subst(vdivSIop);
550 decoder_output += VfpRegRegRegOpConstructor.subst(vdivSIop);
551 exec_output += PredOpExecute.subst(vdivSIop);
552
553 vdivDCode = '''
554 IntDoubleUnion cOp1, cOp2, cDest;
555 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
556 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
547 VfpSavedState state = prepVfpFpscr(Fpscr);
548 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
549 FpDest = FpOp1 / FpOp2;
550 __asm__ __volatile__("" :: "m" (FpDest));
551 Fpscr = setVfpFpscr(Fpscr, state);
552 '''
553 vdivSIop = InstObjParams("vdivs", "VdivS", "VfpRegRegRegOp",
554 { "code": vdivSCode,
555 "predicate_test": predicateTest }, [])
556 header_output += VfpRegRegRegOpDeclare.subst(vdivSIop);
557 decoder_output += VfpRegRegRegOpConstructor.subst(vdivSIop);
558 exec_output += PredOpExecute.subst(vdivSIop);
559
560 vdivDCode = '''
561 IntDoubleUnion cOp1, cOp2, cDest;
562 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
563 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
564 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
557 VfpSavedState state = prepVfpFpscr(Fpscr);
558 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
559 cDest.fp = cOp1.fp / cOp2.fp;
560 __asm__ __volatile__("" :: "m" (cDest.fp));
561 Fpscr = setVfpFpscr(Fpscr, state);
562 FpDestP0.uw = cDest.bits;
563 FpDestP1.uw = cDest.bits >> 32;
564 '''
565 vdivDIop = InstObjParams("vdivd", "VdivD", "VfpRegRegRegOp",
566 { "code": vdivDCode,
567 "predicate_test": predicateTest }, [])
568 header_output += VfpRegRegRegOpDeclare.subst(vdivDIop);
569 decoder_output += VfpRegRegRegOpConstructor.subst(vdivDIop);
570 exec_output += PredOpExecute.subst(vdivDIop);
571
572 vsqrtSCode = '''
565 VfpSavedState state = prepVfpFpscr(Fpscr);
566 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
567 cDest.fp = cOp1.fp / cOp2.fp;
568 __asm__ __volatile__("" :: "m" (cDest.fp));
569 Fpscr = setVfpFpscr(Fpscr, state);
570 FpDestP0.uw = cDest.bits;
571 FpDestP1.uw = cDest.bits >> 32;
572 '''
573 vdivDIop = InstObjParams("vdivd", "VdivD", "VfpRegRegRegOp",
574 { "code": vdivDCode,
575 "predicate_test": predicateTest }, [])
576 header_output += VfpRegRegRegOpDeclare.subst(vdivDIop);
577 decoder_output += VfpRegRegRegOpConstructor.subst(vdivDIop);
578 exec_output += PredOpExecute.subst(vdivDIop);
579
580 vsqrtSCode = '''
581 vfpFlushToZero(Fpscr, FpOp1);
573 VfpSavedState state = prepVfpFpscr(Fpscr);
574 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
575 FpDest = sqrtf(FpOp1);
576 __asm__ __volatile__("" :: "m" (FpDest));
577 Fpscr = setVfpFpscr(Fpscr, state);
578 if (FpOp1 < 0) {
579 FpDest = NAN;
580 }
581 '''
582 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "VfpRegRegOp",
583 { "code": vsqrtSCode,
584 "predicate_test": predicateTest }, [])
585 header_output += VfpRegRegOpDeclare.subst(vsqrtSIop);
586 decoder_output += VfpRegRegOpConstructor.subst(vsqrtSIop);
587 exec_output += PredOpExecute.subst(vsqrtSIop);
588
589 vsqrtDCode = '''
590 IntDoubleUnion cOp1, cDest;
591 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
582 VfpSavedState state = prepVfpFpscr(Fpscr);
583 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
584 FpDest = sqrtf(FpOp1);
585 __asm__ __volatile__("" :: "m" (FpDest));
586 Fpscr = setVfpFpscr(Fpscr, state);
587 if (FpOp1 < 0) {
588 FpDest = NAN;
589 }
590 '''
591 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "VfpRegRegOp",
592 { "code": vsqrtSCode,
593 "predicate_test": predicateTest }, [])
594 header_output += VfpRegRegOpDeclare.subst(vsqrtSIop);
595 decoder_output += VfpRegRegOpConstructor.subst(vsqrtSIop);
596 exec_output += PredOpExecute.subst(vsqrtSIop);
597
598 vsqrtDCode = '''
599 IntDoubleUnion cOp1, cDest;
600 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
601 vfpFlushToZero(Fpscr, cOp1.fp);
592 VfpSavedState state = prepVfpFpscr(Fpscr);
593 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
594 cDest.fp = sqrt(cOp1.fp);
595 __asm__ __volatile__("" :: "m" (cDest.fp));
596 Fpscr = setVfpFpscr(Fpscr, state);
597 if (cOp1.fp < 0) {
598 cDest.fp = NAN;
599 }

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

610
611let {{
612
613 header_output = ""
614 decoder_output = ""
615 exec_output = ""
616
617 vmlaSCode = '''
602 VfpSavedState state = prepVfpFpscr(Fpscr);
603 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cDest.fp));
604 cDest.fp = sqrt(cOp1.fp);
605 __asm__ __volatile__("" :: "m" (cDest.fp));
606 Fpscr = setVfpFpscr(Fpscr, state);
607 if (cOp1.fp < 0) {
608 cDest.fp = NAN;
609 }

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

620
621let {{
622
623 header_output = ""
624 decoder_output = ""
625 exec_output = ""
626
627 vmlaSCode = '''
628 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
618 VfpSavedState state = prepVfpFpscr(Fpscr);
619 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
620 float mid = FpOp1 * FpOp2;
621 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
622 mid = NAN;
623 }
629 VfpSavedState state = prepVfpFpscr(Fpscr);
630 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
631 float mid = FpOp1 * FpOp2;
632 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
633 mid = NAN;
634 }
635 vfpFlushToZero(Fpscr, FpDest, mid);
624 FpDest = FpDest + mid;
625 __asm__ __volatile__("" :: "m" (FpDest));
626 Fpscr = setVfpFpscr(Fpscr, state);
627 '''
628 vmlaSIop = InstObjParams("vmlas", "VmlaS", "VfpRegRegRegOp",
629 { "code": vmlaSCode,
630 "predicate_test": predicateTest }, [])
631 header_output += VfpRegRegRegOpDeclare.subst(vmlaSIop);
632 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaSIop);
633 exec_output += PredOpExecute.subst(vmlaSIop);
634
635 vmlaDCode = '''
636 IntDoubleUnion cOp1, cOp2, cDest;
637 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
638 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
639 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
636 FpDest = FpDest + mid;
637 __asm__ __volatile__("" :: "m" (FpDest));
638 Fpscr = setVfpFpscr(Fpscr, state);
639 '''
640 vmlaSIop = InstObjParams("vmlas", "VmlaS", "VfpRegRegRegOp",
641 { "code": vmlaSCode,
642 "predicate_test": predicateTest }, [])
643 header_output += VfpRegRegRegOpDeclare.subst(vmlaSIop);
644 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaSIop);
645 exec_output += PredOpExecute.subst(vmlaSIop);
646
647 vmlaDCode = '''
648 IntDoubleUnion cOp1, cOp2, cDest;
649 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
650 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
651 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
652 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
640 VfpSavedState state = prepVfpFpscr(Fpscr);
641 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
642 double mid = cOp1.fp * cOp2.fp;
643 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
644 (isinf(cOp2.fp) && cOp1.fp == 0)) {
645 mid = NAN;
646 }
653 VfpSavedState state = prepVfpFpscr(Fpscr);
654 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
655 double mid = cOp1.fp * cOp2.fp;
656 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
657 (isinf(cOp2.fp) && cOp1.fp == 0)) {
658 mid = NAN;
659 }
660 vfpFlushToZero(Fpscr, cDest.fp, mid);
647 cDest.fp = cDest.fp + mid;
648 __asm__ __volatile__("" :: "m" (cDest.fp));
649 Fpscr = setVfpFpscr(Fpscr, state);
650 FpDestP0.uw = cDest.bits;
651 FpDestP1.uw = cDest.bits >> 32;
652 '''
653 vmlaDIop = InstObjParams("vmlad", "VmlaD", "VfpRegRegRegOp",
654 { "code": vmlaDCode,
655 "predicate_test": predicateTest }, [])
656 header_output += VfpRegRegRegOpDeclare.subst(vmlaDIop);
657 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaDIop);
658 exec_output += PredOpExecute.subst(vmlaDIop);
659
660 vmlsSCode = '''
661 cDest.fp = cDest.fp + mid;
662 __asm__ __volatile__("" :: "m" (cDest.fp));
663 Fpscr = setVfpFpscr(Fpscr, state);
664 FpDestP0.uw = cDest.bits;
665 FpDestP1.uw = cDest.bits >> 32;
666 '''
667 vmlaDIop = InstObjParams("vmlad", "VmlaD", "VfpRegRegRegOp",
668 { "code": vmlaDCode,
669 "predicate_test": predicateTest }, [])
670 header_output += VfpRegRegRegOpDeclare.subst(vmlaDIop);
671 decoder_output += VfpRegRegRegOpConstructor.subst(vmlaDIop);
672 exec_output += PredOpExecute.subst(vmlaDIop);
673
674 vmlsSCode = '''
675 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
661 VfpSavedState state = prepVfpFpscr(Fpscr);
662 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
663 float mid = FpOp1 * FpOp2;
664 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
665 mid = NAN;
666 }
676 VfpSavedState state = prepVfpFpscr(Fpscr);
677 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
678 float mid = FpOp1 * FpOp2;
679 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
680 mid = NAN;
681 }
682 vfpFlushToZero(Fpscr, FpDest, mid);
667 FpDest = FpDest - mid;
668 __asm__ __volatile__("" :: "m" (FpDest));
669 Fpscr = setVfpFpscr(Fpscr, state);
670 '''
671 vmlsSIop = InstObjParams("vmlss", "VmlsS", "VfpRegRegRegOp",
672 { "code": vmlsSCode,
673 "predicate_test": predicateTest }, [])
674 header_output += VfpRegRegRegOpDeclare.subst(vmlsSIop);
675 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsSIop);
676 exec_output += PredOpExecute.subst(vmlsSIop);
677
678 vmlsDCode = '''
679 IntDoubleUnion cOp1, cOp2, cDest;
680 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
681 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
682 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
683 FpDest = FpDest - mid;
684 __asm__ __volatile__("" :: "m" (FpDest));
685 Fpscr = setVfpFpscr(Fpscr, state);
686 '''
687 vmlsSIop = InstObjParams("vmlss", "VmlsS", "VfpRegRegRegOp",
688 { "code": vmlsSCode,
689 "predicate_test": predicateTest }, [])
690 header_output += VfpRegRegRegOpDeclare.subst(vmlsSIop);
691 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsSIop);
692 exec_output += PredOpExecute.subst(vmlsSIop);
693
694 vmlsDCode = '''
695 IntDoubleUnion cOp1, cOp2, cDest;
696 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
697 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
698 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
699 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
683 VfpSavedState state = prepVfpFpscr(Fpscr);
684 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
685 double mid = cOp1.fp * cOp2.fp;
686 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
687 (isinf(cOp2.fp) && cOp1.fp == 0)) {
688 mid = NAN;
689 }
690 cDest.fp = cDest.fp - mid;
700 VfpSavedState state = prepVfpFpscr(Fpscr);
701 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
702 double mid = cOp1.fp * cOp2.fp;
703 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
704 (isinf(cOp2.fp) && cOp1.fp == 0)) {
705 mid = NAN;
706 }
707 cDest.fp = cDest.fp - mid;
708 vfpFlushToZero(Fpscr, cDest.fp, mid);
691 __asm__ __volatile__("" :: "m" (cDest.fp));
692 Fpscr = setVfpFpscr(Fpscr, state);
693 FpDestP0.uw = cDest.bits;
694 FpDestP1.uw = cDest.bits >> 32;
695 '''
696 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "VfpRegRegRegOp",
697 { "code": vmlsDCode,
698 "predicate_test": predicateTest }, [])
699 header_output += VfpRegRegRegOpDeclare.subst(vmlsDIop);
700 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsDIop);
701 exec_output += PredOpExecute.subst(vmlsDIop);
702
703 vnmlaSCode = '''
709 __asm__ __volatile__("" :: "m" (cDest.fp));
710 Fpscr = setVfpFpscr(Fpscr, state);
711 FpDestP0.uw = cDest.bits;
712 FpDestP1.uw = cDest.bits >> 32;
713 '''
714 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "VfpRegRegRegOp",
715 { "code": vmlsDCode,
716 "predicate_test": predicateTest }, [])
717 header_output += VfpRegRegRegOpDeclare.subst(vmlsDIop);
718 decoder_output += VfpRegRegRegOpConstructor.subst(vmlsDIop);
719 exec_output += PredOpExecute.subst(vmlsDIop);
720
721 vnmlaSCode = '''
722 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
704 VfpSavedState state = prepVfpFpscr(Fpscr);
705 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
706 float mid = FpOp1 * FpOp2;
707 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
708 mid = NAN;
709 }
723 VfpSavedState state = prepVfpFpscr(Fpscr);
724 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
725 float mid = FpOp1 * FpOp2;
726 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
727 mid = NAN;
728 }
729 vfpFlushToZero(Fpscr, FpDest, mid);
710 FpDest = -FpDest - mid;
711 __asm__ __volatile__("" :: "m" (FpDest));
712 Fpscr = setVfpFpscr(Fpscr, state);
713 '''
714 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "VfpRegRegRegOp",
715 { "code": vnmlaSCode,
716 "predicate_test": predicateTest }, [])
717 header_output += VfpRegRegRegOpDeclare.subst(vnmlaSIop);
718 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaSIop);
719 exec_output += PredOpExecute.subst(vnmlaSIop);
720
721 vnmlaDCode = '''
722 IntDoubleUnion cOp1, cOp2, cDest;
723 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
724 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
725 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
730 FpDest = -FpDest - mid;
731 __asm__ __volatile__("" :: "m" (FpDest));
732 Fpscr = setVfpFpscr(Fpscr, state);
733 '''
734 vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "VfpRegRegRegOp",
735 { "code": vnmlaSCode,
736 "predicate_test": predicateTest }, [])
737 header_output += VfpRegRegRegOpDeclare.subst(vnmlaSIop);
738 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaSIop);
739 exec_output += PredOpExecute.subst(vnmlaSIop);
740
741 vnmlaDCode = '''
742 IntDoubleUnion cOp1, cOp2, cDest;
743 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
744 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
745 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
746 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
726 VfpSavedState state = prepVfpFpscr(Fpscr);
727 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
728 double mid = cOp1.fp * cOp2.fp;
729 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
730 (isinf(cOp2.fp) && cOp1.fp == 0)) {
731 mid = NAN;
732 }
747 VfpSavedState state = prepVfpFpscr(Fpscr);
748 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
749 double mid = cOp1.fp * cOp2.fp;
750 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
751 (isinf(cOp2.fp) && cOp1.fp == 0)) {
752 mid = NAN;
753 }
754 vfpFlushToZero(Fpscr, cDest.fp, mid);
733 cDest.fp = -cDest.fp - mid;
734 __asm__ __volatile__("" :: "m" (cDest.fp));
735 Fpscr = setVfpFpscr(Fpscr, state);
736 FpDestP0.uw = cDest.bits;
737 FpDestP1.uw = cDest.bits >> 32;
738 '''
739 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "VfpRegRegRegOp",
740 { "code": vnmlaDCode,
741 "predicate_test": predicateTest }, [])
742 header_output += VfpRegRegRegOpDeclare.subst(vnmlaDIop);
743 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaDIop);
744 exec_output += PredOpExecute.subst(vnmlaDIop);
745
746 vnmlsSCode = '''
755 cDest.fp = -cDest.fp - mid;
756 __asm__ __volatile__("" :: "m" (cDest.fp));
757 Fpscr = setVfpFpscr(Fpscr, state);
758 FpDestP0.uw = cDest.bits;
759 FpDestP1.uw = cDest.bits >> 32;
760 '''
761 vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "VfpRegRegRegOp",
762 { "code": vnmlaDCode,
763 "predicate_test": predicateTest }, [])
764 header_output += VfpRegRegRegOpDeclare.subst(vnmlaDIop);
765 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlaDIop);
766 exec_output += PredOpExecute.subst(vnmlaDIop);
767
768 vnmlsSCode = '''
769 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
747 VfpSavedState state = prepVfpFpscr(Fpscr);
748 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
749 float mid = FpOp1 * FpOp2;
750 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
751 mid = NAN;
752 }
770 VfpSavedState state = prepVfpFpscr(Fpscr);
771 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
772 float mid = FpOp1 * FpOp2;
773 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
774 mid = NAN;
775 }
776 vfpFlushToZero(Fpscr, FpDest, mid);
753 FpDest = -FpDest + mid;
754 __asm__ __volatile__("" :: "m" (FpDest));
755 Fpscr = setVfpFpscr(Fpscr, state);
756 '''
757 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "VfpRegRegRegOp",
758 { "code": vnmlsSCode,
759 "predicate_test": predicateTest }, [])
760 header_output += VfpRegRegRegOpDeclare.subst(vnmlsSIop);
761 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsSIop);
762 exec_output += PredOpExecute.subst(vnmlsSIop);
763
764 vnmlsDCode = '''
765 IntDoubleUnion cOp1, cOp2, cDest;
766 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
767 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
768 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
777 FpDest = -FpDest + mid;
778 __asm__ __volatile__("" :: "m" (FpDest));
779 Fpscr = setVfpFpscr(Fpscr, state);
780 '''
781 vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "VfpRegRegRegOp",
782 { "code": vnmlsSCode,
783 "predicate_test": predicateTest }, [])
784 header_output += VfpRegRegRegOpDeclare.subst(vnmlsSIop);
785 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsSIop);
786 exec_output += PredOpExecute.subst(vnmlsSIop);
787
788 vnmlsDCode = '''
789 IntDoubleUnion cOp1, cOp2, cDest;
790 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
791 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
792 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
793 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
769 VfpSavedState state = prepVfpFpscr(Fpscr);
770 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
771 double mid = cOp1.fp * cOp2.fp;
772 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
773 (isinf(cOp2.fp) && cOp1.fp == 0)) {
774 mid = NAN;
775 }
794 VfpSavedState state = prepVfpFpscr(Fpscr);
795 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
796 double mid = cOp1.fp * cOp2.fp;
797 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
798 (isinf(cOp2.fp) && cOp1.fp == 0)) {
799 mid = NAN;
800 }
801 vfpFlushToZero(Fpscr, cDest.fp, mid);
776 cDest.fp = -cDest.fp + mid;
777 __asm__ __volatile__("" :: "m" (cDest.fp));
778 Fpscr = setVfpFpscr(Fpscr, state);
779 FpDestP0.uw = cDest.bits;
780 FpDestP1.uw = cDest.bits >> 32;
781 '''
782 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "VfpRegRegRegOp",
783 { "code": vnmlsDCode,
784 "predicate_test": predicateTest }, [])
785 header_output += VfpRegRegRegOpDeclare.subst(vnmlsDIop);
786 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsDIop);
787 exec_output += PredOpExecute.subst(vnmlsDIop);
788
789 vnmulSCode = '''
802 cDest.fp = -cDest.fp + mid;
803 __asm__ __volatile__("" :: "m" (cDest.fp));
804 Fpscr = setVfpFpscr(Fpscr, state);
805 FpDestP0.uw = cDest.bits;
806 FpDestP1.uw = cDest.bits >> 32;
807 '''
808 vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "VfpRegRegRegOp",
809 { "code": vnmlsDCode,
810 "predicate_test": predicateTest }, [])
811 header_output += VfpRegRegRegOpDeclare.subst(vnmlsDIop);
812 decoder_output += VfpRegRegRegOpConstructor.subst(vnmlsDIop);
813 exec_output += PredOpExecute.subst(vnmlsDIop);
814
815 vnmulSCode = '''
816 vfpFlushToZero(Fpscr, FpOp1, FpOp2);
790 VfpSavedState state = prepVfpFpscr(Fpscr);
791 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
792 float mid = FpOp1 * FpOp2;
793 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
794 mid = NAN;
795 }
796 FpDest = -mid;
797 __asm__ __volatile__("" :: "m" (FpDest));

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

804 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulSIop);
805 exec_output += PredOpExecute.subst(vnmulSIop);
806
807 vnmulDCode = '''
808 IntDoubleUnion cOp1, cOp2, cDest;
809 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
810 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
811 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
817 VfpSavedState state = prepVfpFpscr(Fpscr);
818 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
819 float mid = FpOp1 * FpOp2;
820 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) {
821 mid = NAN;
822 }
823 FpDest = -mid;
824 __asm__ __volatile__("" :: "m" (FpDest));

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

831 decoder_output += VfpRegRegRegOpConstructor.subst(vnmulSIop);
832 exec_output += PredOpExecute.subst(vnmulSIop);
833
834 vnmulDCode = '''
835 IntDoubleUnion cOp1, cOp2, cDest;
836 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
837 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32));
838 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
839 vfpFlushToZero(Fpscr, cOp1.fp, cOp2.fp);
812 VfpSavedState state = prepVfpFpscr(Fpscr);
813 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
814 double mid = cOp1.fp * cOp2.fp;
815 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
816 (isinf(cOp2.fp) && cOp1.fp == 0)) {
817 mid = NAN;
818 }
819 cDest.fp = -mid;

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

894 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "VfpRegRegOp",
895 { "code": vcvtSIntFpDCode,
896 "predicate_test": predicateTest }, [])
897 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpDIop);
898 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
899 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
900
901 vcvtFpUIntSRCode = '''
840 VfpSavedState state = prepVfpFpscr(Fpscr);
841 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
842 double mid = cOp1.fp * cOp2.fp;
843 if ((isinf(cOp1.fp) && cOp2.fp == 0) ||
844 (isinf(cOp2.fp) && cOp1.fp == 0)) {
845 mid = NAN;
846 }
847 cDest.fp = -mid;

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

922 vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "VfpRegRegOp",
923 { "code": vcvtSIntFpDCode,
924 "predicate_test": predicateTest }, [])
925 header_output += VfpRegRegOpDeclare.subst(vcvtSIntFpDIop);
926 decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
927 exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
928
929 vcvtFpUIntSRCode = '''
930 vfpFlushToZero(Fpscr, FpOp1);
902 VfpSavedState state = prepVfpFpscr(Fpscr);
903 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
904 FpDest.uw = FpOp1;
905 __asm__ __volatile__("" :: "m" (FpDest.uw));
906 Fpscr = setVfpFpscr(Fpscr, state);
907 '''
908 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
909 { "code": vcvtFpUIntSRCode,
910 "predicate_test": predicateTest }, [])
911 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
912 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
913 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
914
915 vcvtFpUIntDRCode = '''
916 IntDoubleUnion cOp1;
917 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
931 VfpSavedState state = prepVfpFpscr(Fpscr);
932 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
933 FpDest.uw = FpOp1;
934 __asm__ __volatile__("" :: "m" (FpDest.uw));
935 Fpscr = setVfpFpscr(Fpscr, state);
936 '''
937 vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
938 { "code": vcvtFpUIntSRCode,
939 "predicate_test": predicateTest }, [])
940 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
941 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
942 exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
943
944 vcvtFpUIntDRCode = '''
945 IntDoubleUnion cOp1;
946 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
947 vfpFlushToZero(Fpscr, cOp1.fp);
918 VfpSavedState state = prepVfpFpscr(Fpscr);
919 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
920 uint64_t result = cOp1.fp;
921 __asm__ __volatile__("" :: "m" (result));
922 Fpscr = setVfpFpscr(Fpscr, state);
923 FpDestP0.uw = result;
924 '''
925 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
926 { "code": vcvtFpUIntDRCode,
927 "predicate_test": predicateTest }, [])
928 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
929 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
930 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
931
932 vcvtFpSIntSRCode = '''
948 VfpSavedState state = prepVfpFpscr(Fpscr);
949 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
950 uint64_t result = cOp1.fp;
951 __asm__ __volatile__("" :: "m" (result));
952 Fpscr = setVfpFpscr(Fpscr, state);
953 FpDestP0.uw = result;
954 '''
955 vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
956 { "code": vcvtFpUIntDRCode,
957 "predicate_test": predicateTest }, [])
958 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
959 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
960 exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
961
962 vcvtFpSIntSRCode = '''
963 vfpFlushToZero(Fpscr, FpOp1);
933 VfpSavedState state = prepVfpFpscr(Fpscr);
934 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
935 FpDest.sw = FpOp1;
936 __asm__ __volatile__("" :: "m" (FpDest.sw));
937 Fpscr = setVfpFpscr(Fpscr, state);
938 '''
939 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
940 { "code": vcvtFpSIntSRCode,
941 "predicate_test": predicateTest }, [])
942 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
943 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
944 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
945
946 vcvtFpSIntDRCode = '''
947 IntDoubleUnion cOp1;
948 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
964 VfpSavedState state = prepVfpFpscr(Fpscr);
965 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
966 FpDest.sw = FpOp1;
967 __asm__ __volatile__("" :: "m" (FpDest.sw));
968 Fpscr = setVfpFpscr(Fpscr, state);
969 '''
970 vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
971 { "code": vcvtFpSIntSRCode,
972 "predicate_test": predicateTest }, [])
973 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
974 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
975 exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
976
977 vcvtFpSIntDRCode = '''
978 IntDoubleUnion cOp1;
979 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
980 vfpFlushToZero(Fpscr, cOp1.fp);
949 VfpSavedState state = prepVfpFpscr(Fpscr);
950 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
951 int64_t result = cOp1.fp;
952 __asm__ __volatile__("" :: "m" (result));
953 Fpscr = setVfpFpscr(Fpscr, state);
954 FpDestP0.uw = result;
955 '''
956 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
957 { "code": vcvtFpSIntDRCode,
958 "predicate_test": predicateTest }, [])
959 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
960 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
961 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
962
963 vcvtFpUIntSCode = '''
981 VfpSavedState state = prepVfpFpscr(Fpscr);
982 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
983 int64_t result = cOp1.fp;
984 __asm__ __volatile__("" :: "m" (result));
985 Fpscr = setVfpFpscr(Fpscr, state);
986 FpDestP0.uw = result;
987 '''
988 vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
989 { "code": vcvtFpSIntDRCode,
990 "predicate_test": predicateTest }, [])
991 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
992 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
993 exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
994
995 vcvtFpUIntSCode = '''
996 vfpFlushToZero(Fpscr, FpOp1);
964 VfpSavedState state = prepVfpFpscr(Fpscr);
965 fesetround(FeRoundZero);
966 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
967 FpDest.uw = FpOp1;
968 __asm__ __volatile__("" :: "m" (FpDest.uw));
969 Fpscr = setVfpFpscr(Fpscr, state);
970 '''
971 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "VfpRegRegOp",
972 { "code": vcvtFpUIntSCode,
973 "predicate_test": predicateTest }, [])
974 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSIop);
975 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSIop);
976 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
977
978 vcvtFpUIntDCode = '''
979 IntDoubleUnion cOp1;
980 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
997 VfpSavedState state = prepVfpFpscr(Fpscr);
998 fesetround(FeRoundZero);
999 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1000 FpDest.uw = FpOp1;
1001 __asm__ __volatile__("" :: "m" (FpDest.uw));
1002 Fpscr = setVfpFpscr(Fpscr, state);
1003 '''
1004 vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "VfpRegRegOp",
1005 { "code": vcvtFpUIntSCode,
1006 "predicate_test": predicateTest }, [])
1007 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSIop);
1008 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSIop);
1009 exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
1010
1011 vcvtFpUIntDCode = '''
1012 IntDoubleUnion cOp1;
1013 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1014 vfpFlushToZero(Fpscr, cOp1.fp);
981 VfpSavedState state = prepVfpFpscr(Fpscr);
982 fesetround(FeRoundZero);
983 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
984 uint64_t result = cOp1.fp;
985 __asm__ __volatile__("" :: "m" (result));
986 Fpscr = setVfpFpscr(Fpscr, state);
987 FpDestP0.uw = result;
988 '''
989 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "VfpRegRegOp",
990 { "code": vcvtFpUIntDCode,
991 "predicate_test": predicateTest }, [])
992 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDIop);
993 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDIop);
994 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
995
996 vcvtFpSIntSCode = '''
1015 VfpSavedState state = prepVfpFpscr(Fpscr);
1016 fesetround(FeRoundZero);
1017 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1018 uint64_t result = cOp1.fp;
1019 __asm__ __volatile__("" :: "m" (result));
1020 Fpscr = setVfpFpscr(Fpscr, state);
1021 FpDestP0.uw = result;
1022 '''
1023 vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "VfpRegRegOp",
1024 { "code": vcvtFpUIntDCode,
1025 "predicate_test": predicateTest }, [])
1026 header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDIop);
1027 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDIop);
1028 exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
1029
1030 vcvtFpSIntSCode = '''
1031 vfpFlushToZero(Fpscr, FpOp1);
997 VfpSavedState state = prepVfpFpscr(Fpscr);
998 fesetround(FeRoundZero);
999 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1000 FpDest.sw = FpOp1;
1001 __asm__ __volatile__("" :: "m" (FpDest.sw));
1002 Fpscr = setVfpFpscr(Fpscr, state);
1003 '''
1004 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "VfpRegRegOp",
1005 { "code": vcvtFpSIntSCode,
1006 "predicate_test": predicateTest }, [])
1007 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSIop);
1008 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSIop);
1009 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
1010
1011 vcvtFpSIntDCode = '''
1012 IntDoubleUnion cOp1;
1013 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1032 VfpSavedState state = prepVfpFpscr(Fpscr);
1033 fesetround(FeRoundZero);
1034 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1035 FpDest.sw = FpOp1;
1036 __asm__ __volatile__("" :: "m" (FpDest.sw));
1037 Fpscr = setVfpFpscr(Fpscr, state);
1038 '''
1039 vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "VfpRegRegOp",
1040 { "code": vcvtFpSIntSCode,
1041 "predicate_test": predicateTest }, [])
1042 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSIop);
1043 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSIop);
1044 exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
1045
1046 vcvtFpSIntDCode = '''
1047 IntDoubleUnion cOp1;
1048 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1049 vfpFlushToZero(Fpscr, cOp1.fp);
1014 VfpSavedState state = prepVfpFpscr(Fpscr);
1015 fesetround(FeRoundZero);
1016 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1017 int64_t result = cOp1.fp;
1018 __asm__ __volatile__("" :: "m" (result));
1019 Fpscr = setVfpFpscr(Fpscr, state);
1020 FpDestP0.uw = result;
1021 '''
1022 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "VfpRegRegOp",
1023 { "code": vcvtFpSIntDCode,
1024 "predicate_test": predicateTest }, [])
1025 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDIop);
1026 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDIop);
1027 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
1028
1029 vcvtFpSFpDCode = '''
1030 IntDoubleUnion cDest;
1050 VfpSavedState state = prepVfpFpscr(Fpscr);
1051 fesetround(FeRoundZero);
1052 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1053 int64_t result = cOp1.fp;
1054 __asm__ __volatile__("" :: "m" (result));
1055 Fpscr = setVfpFpscr(Fpscr, state);
1056 FpDestP0.uw = result;
1057 '''
1058 vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "VfpRegRegOp",
1059 { "code": vcvtFpSIntDCode,
1060 "predicate_test": predicateTest }, [])
1061 header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDIop);
1062 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDIop);
1063 exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
1064
1065 vcvtFpSFpDCode = '''
1066 IntDoubleUnion cDest;
1067 vfpFlushToZero(Fpscr, FpOp1);
1031 VfpSavedState state = prepVfpFpscr(Fpscr);
1032 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1033 cDest.fp = FpOp1;
1034 __asm__ __volatile__("" :: "m" (cDest.fp));
1035 Fpscr = setVfpFpscr(Fpscr, state);
1036 FpDestP0.uw = cDest.bits;
1037 FpDestP1.uw = cDest.bits >> 32;
1038 '''
1039 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "VfpRegRegOp",
1040 { "code": vcvtFpSFpDCode,
1041 "predicate_test": predicateTest }, [])
1042 header_output += VfpRegRegOpDeclare.subst(vcvtFpSFpDIop);
1043 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSFpDIop);
1044 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
1045
1046 vcvtFpDFpSCode = '''
1047 IntDoubleUnion cOp1;
1048 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1068 VfpSavedState state = prepVfpFpscr(Fpscr);
1069 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1070 cDest.fp = FpOp1;
1071 __asm__ __volatile__("" :: "m" (cDest.fp));
1072 Fpscr = setVfpFpscr(Fpscr, state);
1073 FpDestP0.uw = cDest.bits;
1074 FpDestP1.uw = cDest.bits >> 32;
1075 '''
1076 vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "VfpRegRegOp",
1077 { "code": vcvtFpSFpDCode,
1078 "predicate_test": predicateTest }, [])
1079 header_output += VfpRegRegOpDeclare.subst(vcvtFpSFpDIop);
1080 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSFpDIop);
1081 exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
1082
1083 vcvtFpDFpSCode = '''
1084 IntDoubleUnion cOp1;
1085 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1086 vfpFlushToZero(Fpscr, cOp1.fp);
1049 VfpSavedState state = prepVfpFpscr(Fpscr);
1050 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1051 FpDest = cOp1.fp;
1052 __asm__ __volatile__("" :: "m" (FpDest));
1053 Fpscr = setVfpFpscr(Fpscr, state);
1054 '''
1055 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "VfpRegRegOp",
1056 { "code": vcvtFpDFpSCode,
1057 "predicate_test": predicateTest }, [])
1058 header_output += VfpRegRegOpDeclare.subst(vcvtFpDFpSIop);
1059 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpDFpSIop);
1060 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
1061
1062 vcmpSCode = '''
1063 FPSCR fpscr = Fpscr;
1087 VfpSavedState state = prepVfpFpscr(Fpscr);
1088 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1089 FpDest = cOp1.fp;
1090 __asm__ __volatile__("" :: "m" (FpDest));
1091 Fpscr = setVfpFpscr(Fpscr, state);
1092 '''
1093 vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "VfpRegRegOp",
1094 { "code": vcvtFpDFpSCode,
1095 "predicate_test": predicateTest }, [])
1096 header_output += VfpRegRegOpDeclare.subst(vcvtFpDFpSIop);
1097 decoder_output += VfpRegRegOpConstructor.subst(vcvtFpDFpSIop);
1098 exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
1099
1100 vcmpSCode = '''
1101 FPSCR fpscr = Fpscr;
1102 vfpFlushToZero(Fpscr, FpDest, FpOp1);
1064 if (FpDest == FpOp1) {
1065 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1066 } else if (FpDest < FpOp1) {
1067 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1068 } else if (FpDest > FpOp1) {
1069 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1070 } else {
1071 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;

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

1078 header_output += VfpRegRegOpDeclare.subst(vcmpSIop);
1079 decoder_output += VfpRegRegOpConstructor.subst(vcmpSIop);
1080 exec_output += PredOpExecute.subst(vcmpSIop);
1081
1082 vcmpDCode = '''
1083 IntDoubleUnion cOp1, cDest;
1084 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1085 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1103 if (FpDest == FpOp1) {
1104 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1105 } else if (FpDest < FpOp1) {
1106 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1107 } else if (FpDest > FpOp1) {
1108 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1109 } else {
1110 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;

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

1117 header_output += VfpRegRegOpDeclare.subst(vcmpSIop);
1118 decoder_output += VfpRegRegOpConstructor.subst(vcmpSIop);
1119 exec_output += PredOpExecute.subst(vcmpSIop);
1120
1121 vcmpDCode = '''
1122 IntDoubleUnion cOp1, cDest;
1123 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1124 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1125 vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
1086 FPSCR fpscr = Fpscr;
1087 if (cDest.fp == cOp1.fp) {
1088 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1089 } else if (cDest.fp < cOp1.fp) {
1090 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1091 } else if (cDest.fp > cOp1.fp) {
1092 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1093 } else {

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

1099 { "code": vcmpDCode,
1100 "predicate_test": predicateTest }, [])
1101 header_output += VfpRegRegOpDeclare.subst(vcmpDIop);
1102 decoder_output += VfpRegRegOpConstructor.subst(vcmpDIop);
1103 exec_output += PredOpExecute.subst(vcmpDIop);
1104
1105 vcmpZeroSCode = '''
1106 FPSCR fpscr = Fpscr;
1126 FPSCR fpscr = Fpscr;
1127 if (cDest.fp == cOp1.fp) {
1128 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1129 } else if (cDest.fp < cOp1.fp) {
1130 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1131 } else if (cDest.fp > cOp1.fp) {
1132 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1133 } else {

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

1139 { "code": vcmpDCode,
1140 "predicate_test": predicateTest }, [])
1141 header_output += VfpRegRegOpDeclare.subst(vcmpDIop);
1142 decoder_output += VfpRegRegOpConstructor.subst(vcmpDIop);
1143 exec_output += PredOpExecute.subst(vcmpDIop);
1144
1145 vcmpZeroSCode = '''
1146 FPSCR fpscr = Fpscr;
1147 vfpFlushToZero(Fpscr, FpDest);
1107 if (FpDest == imm) {
1108 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1109 } else if (FpDest < imm) {
1110 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1111 } else if (FpDest > imm) {
1112 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1113 } else {
1114 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;

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

1120 "predicate_test": predicateTest }, [])
1121 header_output += VfpRegImmOpDeclare.subst(vcmpZeroSIop);
1122 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroSIop);
1123 exec_output += PredOpExecute.subst(vcmpZeroSIop);
1124
1125 vcmpZeroDCode = '''
1126 IntDoubleUnion cDest;
1127 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1148 if (FpDest == imm) {
1149 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1150 } else if (FpDest < imm) {
1151 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1152 } else if (FpDest > imm) {
1153 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1154 } else {
1155 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;

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

1161 "predicate_test": predicateTest }, [])
1162 header_output += VfpRegImmOpDeclare.subst(vcmpZeroSIop);
1163 decoder_output += VfpRegImmOpConstructor.subst(vcmpZeroSIop);
1164 exec_output += PredOpExecute.subst(vcmpZeroSIop);
1165
1166 vcmpZeroDCode = '''
1167 IntDoubleUnion cDest;
1168 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
1169 vfpFlushToZero(Fpscr, cDest.fp);
1128 FPSCR fpscr = Fpscr;
1129 if (cDest.fp == imm) {
1130 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1131 } else if (cDest.fp < imm) {
1132 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1133 } else if (cDest.fp > imm) {
1134 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1135 } else {

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

1147
1148let {{
1149
1150 header_output = ""
1151 decoder_output = ""
1152 exec_output = ""
1153
1154 vcvtFpSFixedSCode = '''
1170 FPSCR fpscr = Fpscr;
1171 if (cDest.fp == imm) {
1172 fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
1173 } else if (cDest.fp < imm) {
1174 fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
1175 } else if (cDest.fp > imm) {
1176 fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
1177 } else {

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

1189
1190let {{
1191
1192 header_output = ""
1193 decoder_output = ""
1194 exec_output = ""
1195
1196 vcvtFpSFixedSCode = '''
1197 vfpFlushToZero(Fpscr, FpOp1);
1155 VfpSavedState state = prepVfpFpscr(Fpscr);
1156 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1157 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1158 __asm__ __volatile__("" :: "m" (FpDest.sw));
1159 Fpscr = setVfpFpscr(Fpscr, state);
1160 '''
1161 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "VfpRegRegImmOp",
1162 { "code": vcvtFpSFixedSCode,
1163 "predicate_test": predicateTest }, [])
1164 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1165 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1166 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1167
1168 vcvtFpSFixedDCode = '''
1169 IntDoubleUnion cOp1;
1170 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1198 VfpSavedState state = prepVfpFpscr(Fpscr);
1199 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1200 FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
1201 __asm__ __volatile__("" :: "m" (FpDest.sw));
1202 Fpscr = setVfpFpscr(Fpscr, state);
1203 '''
1204 vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "VfpRegRegImmOp",
1205 { "code": vcvtFpSFixedSCode,
1206 "predicate_test": predicateTest }, [])
1207 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
1208 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
1209 exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
1210
1211 vcvtFpSFixedDCode = '''
1212 IntDoubleUnion cOp1;
1213 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1214 vfpFlushToZero(Fpscr, cOp1.fp);
1171 VfpSavedState state = prepVfpFpscr(Fpscr);
1172 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1173 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1174 __asm__ __volatile__("" :: "m" (mid));
1175 Fpscr = setVfpFpscr(Fpscr, state);
1176 FpDestP0.uw = mid;
1177 FpDestP1.uw = mid >> 32;
1178 '''
1179 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "VfpRegRegImmOp",
1180 { "code": vcvtFpSFixedDCode,
1181 "predicate_test": predicateTest }, [])
1182 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1183 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1184 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1185
1186 vcvtFpUFixedSCode = '''
1215 VfpSavedState state = prepVfpFpscr(Fpscr);
1216 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1217 uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
1218 __asm__ __volatile__("" :: "m" (mid));
1219 Fpscr = setVfpFpscr(Fpscr, state);
1220 FpDestP0.uw = mid;
1221 FpDestP1.uw = mid >> 32;
1222 '''
1223 vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "VfpRegRegImmOp",
1224 { "code": vcvtFpSFixedDCode,
1225 "predicate_test": predicateTest }, [])
1226 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
1227 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
1228 exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
1229
1230 vcvtFpUFixedSCode = '''
1231 vfpFlushToZero(Fpscr, FpOp1);
1187 VfpSavedState state = prepVfpFpscr(Fpscr);
1188 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1189 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1190 __asm__ __volatile__("" :: "m" (FpDest.uw));
1191 Fpscr = setVfpFpscr(Fpscr, state);
1192 '''
1193 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "VfpRegRegImmOp",
1194 { "code": vcvtFpUFixedSCode,
1195 "predicate_test": predicateTest }, [])
1196 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1197 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1198 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1199
1200 vcvtFpUFixedDCode = '''
1201 IntDoubleUnion cOp1;
1202 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1232 VfpSavedState state = prepVfpFpscr(Fpscr);
1233 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1234 FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
1235 __asm__ __volatile__("" :: "m" (FpDest.uw));
1236 Fpscr = setVfpFpscr(Fpscr, state);
1237 '''
1238 vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "VfpRegRegImmOp",
1239 { "code": vcvtFpUFixedSCode,
1240 "predicate_test": predicateTest }, [])
1241 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
1242 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
1243 exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
1244
1245 vcvtFpUFixedDCode = '''
1246 IntDoubleUnion cOp1;
1247 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1248 vfpFlushToZero(Fpscr, cOp1.fp);
1203 VfpSavedState state = prepVfpFpscr(Fpscr);
1204 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1205 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1206 __asm__ __volatile__("" :: "m" (mid));
1207 Fpscr = setVfpFpscr(Fpscr, state);
1208 FpDestP0.uw = mid;
1209 FpDestP1.uw = mid >> 32;
1210 '''

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

1275 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "VfpRegRegImmOp",
1276 { "code": vcvtUFixedFpDCode,
1277 "predicate_test": predicateTest }, [])
1278 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1279 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1280 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1281
1282 vcvtFpSHFixedSCode = '''
1249 VfpSavedState state = prepVfpFpscr(Fpscr);
1250 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1251 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
1252 __asm__ __volatile__("" :: "m" (mid));
1253 Fpscr = setVfpFpscr(Fpscr, state);
1254 FpDestP0.uw = mid;
1255 FpDestP1.uw = mid >> 32;
1256 '''

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

1321 vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "VfpRegRegImmOp",
1322 { "code": vcvtUFixedFpDCode,
1323 "predicate_test": predicateTest }, [])
1324 header_output += VfpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
1325 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
1326 exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
1327
1328 vcvtFpSHFixedSCode = '''
1329 vfpFlushToZero(Fpscr, FpOp1);
1283 VfpSavedState state = prepVfpFpscr(Fpscr);
1284 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1285 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1286 __asm__ __volatile__("" :: "m" (FpDest.sh));
1287 Fpscr = setVfpFpscr(Fpscr, state);
1288 '''
1289 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1290 "VfpRegRegImmOp",
1291 { "code": vcvtFpSHFixedSCode,
1292 "predicate_test": predicateTest }, [])
1293 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1294 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1295 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1296
1297 vcvtFpSHFixedDCode = '''
1298 IntDoubleUnion cOp1;
1299 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1330 VfpSavedState state = prepVfpFpscr(Fpscr);
1331 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1332 FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
1333 __asm__ __volatile__("" :: "m" (FpDest.sh));
1334 Fpscr = setVfpFpscr(Fpscr, state);
1335 '''
1336 vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
1337 "VfpRegRegImmOp",
1338 { "code": vcvtFpSHFixedSCode,
1339 "predicate_test": predicateTest }, [])
1340 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
1341 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
1342 exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
1343
1344 vcvtFpSHFixedDCode = '''
1345 IntDoubleUnion cOp1;
1346 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1347 vfpFlushToZero(Fpscr, cOp1.fp);
1300 VfpSavedState state = prepVfpFpscr(Fpscr);
1301 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1302 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1303 __asm__ __volatile__("" :: "m" (result));
1304 Fpscr = setVfpFpscr(Fpscr, state);
1305 FpDestP0.uw = result;
1306 FpDestP1.uw = result >> 32;
1307 '''
1308 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1309 "VfpRegRegImmOp",
1310 { "code": vcvtFpSHFixedDCode,
1311 "predicate_test": predicateTest }, [])
1312 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1313 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1314 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1315
1316 vcvtFpUHFixedSCode = '''
1348 VfpSavedState state = prepVfpFpscr(Fpscr);
1349 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1350 uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
1351 __asm__ __volatile__("" :: "m" (result));
1352 Fpscr = setVfpFpscr(Fpscr, state);
1353 FpDestP0.uw = result;
1354 FpDestP1.uw = result >> 32;
1355 '''
1356 vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
1357 "VfpRegRegImmOp",
1358 { "code": vcvtFpSHFixedDCode,
1359 "predicate_test": predicateTest }, [])
1360 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
1361 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
1362 exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
1363
1364 vcvtFpUHFixedSCode = '''
1365 vfpFlushToZero(Fpscr, FpOp1);
1317 VfpSavedState state = prepVfpFpscr(Fpscr);
1318 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1319 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1320 __asm__ __volatile__("" :: "m" (FpDest.uh));
1321 Fpscr = setVfpFpscr(Fpscr, state);
1322 '''
1323 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1324 "VfpRegRegImmOp",
1325 { "code": vcvtFpUHFixedSCode,
1326 "predicate_test": predicateTest }, [])
1327 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1328 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1329 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1330
1331 vcvtFpUHFixedDCode = '''
1332 IntDoubleUnion cOp1;
1333 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1366 VfpSavedState state = prepVfpFpscr(Fpscr);
1367 __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
1368 FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
1369 __asm__ __volatile__("" :: "m" (FpDest.uh));
1370 Fpscr = setVfpFpscr(Fpscr, state);
1371 '''
1372 vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
1373 "VfpRegRegImmOp",
1374 { "code": vcvtFpUHFixedSCode,
1375 "predicate_test": predicateTest }, [])
1376 header_output += VfpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
1377 decoder_output += VfpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
1378 exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
1379
1380 vcvtFpUHFixedDCode = '''
1381 IntDoubleUnion cOp1;
1382 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
1383 vfpFlushToZero(Fpscr, cOp1.fp);
1334 VfpSavedState state = prepVfpFpscr(Fpscr);
1335 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1336 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1337 __asm__ __volatile__("" :: "m" (mid));
1338 Fpscr = setVfpFpscr(Fpscr, state);
1339 FpDestP0.uw = mid;
1340 FpDestP1.uw = mid >> 32;
1341 '''

--- 76 unchanged lines hidden ---
1384 VfpSavedState state = prepVfpFpscr(Fpscr);
1385 __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
1386 uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
1387 __asm__ __volatile__("" :: "m" (mid));
1388 Fpscr = setVfpFpscr(Fpscr, state);
1389 FpDestP0.uw = mid;
1390 FpDestP1.uw = mid >> 32;
1391 '''

--- 76 unchanged lines hidden ---