decoder.isa (11724:d92c26d481b7) decoder.isa (11725:eb58f1bbeac8)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2015 RISC-V Foundation
4// Copyright (c) 2016 The University of Virginia
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions are

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

56 Rd = Mem_uh;
57 }});
58 0x6: lwu({{
59 Rd = Mem_uw;
60 }});
61 }
62 }
63
1// -*- mode:c++ -*-
2
3// Copyright (c) 2015 RISC-V Foundation
4// Copyright (c) 2016 The University of Virginia
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions are

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

56 Rd = Mem_uh;
57 }});
58 0x6: lwu({{
59 Rd = Mem_uw;
60 }});
61 }
62 }
63
64 0x07: decode FUNCT3 {
65 format Load {
66 0x2: flw({{
67 Fd_bits = (uint64_t)Mem_uw;
68 }});
69 0x3: fld({{
70 Fd_bits = Mem;
71 }});
72 }
73 }
74
64 0x0f: decode FUNCT3 {
65 format IOp {
66 0x0: fence({{
67 }}, IsNonSpeculative, IsMemBarrier, No_OpClass);
68 0x1: fence_i({{
69 }}, IsNonSpeculative, IsSerializeAfter, No_OpClass);
70 }
71 }

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

139 Mem_uw = Rs2_uw;
140 }});
141 0x3: sd({{
142 Mem_ud = Rs2_ud;
143 }});
144 }
145 }
146
75 0x0f: decode FUNCT3 {
76 format IOp {
77 0x0: fence({{
78 }}, IsNonSpeculative, IsMemBarrier, No_OpClass);
79 0x1: fence_i({{
80 }}, IsNonSpeculative, IsSerializeAfter, No_OpClass);
81 }
82 }

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

150 Mem_uw = Rs2_uw;
151 }});
152 0x3: sd({{
153 Mem_ud = Rs2_ud;
154 }});
155 }
156 }
157
158 0x27: decode FUNCT3 {
159 format Store {
160 0x2: fsw({{
161 Mem_uw = (uint32_t)Fs2_bits;
162 }});
163 0x3: fsd({{
164 Mem_ud = Fs2_bits;
165 }});
166 }
167 }
168
147 0x33: decode FUNCT3 {
148 format ROp {
149 0x0: decode FUNCT7 {
150 0x0: add({{
151 Rd = Rs1_sd + Rs2_sd;
152 }});
153 0x1: mul({{
154 Rd = Rs1_sd*Rs2_sd;

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

342 Rd_sd = (int32_t)Rs1_uw;
343 } else {
344 Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
345 }
346 }}, IntDivOp);
347 }
348 }
349
169 0x33: decode FUNCT3 {
170 format ROp {
171 0x0: decode FUNCT7 {
172 0x0: add({{
173 Rd = Rs1_sd + Rs2_sd;
174 }});
175 0x1: mul({{
176 Rd = Rs1_sd*Rs2_sd;

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

364 Rd_sd = (int32_t)Rs1_uw;
365 } else {
366 Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
367 }
368 }}, IntDivOp);
369 }
370 }
371
372 format FPR4Op {
373 0x43: decode FUNCT2 {
374 0x0: fmadd_s({{
375 uint32_t temp;
376 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
377 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
378 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
379 float fd;
380
381 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
382 if (issignalingnan(fs1) || issignalingnan(fs2)
383 || issignalingnan(fs3)) {
384 FFLAGS |= FloatInvalid;
385 }
386 fd = std::numeric_limits<float>::quiet_NaN();
387 } else if (std::isinf(fs1) || std::isinf(fs2) ||
388 std::isinf(fs3)) {
389 if (std::signbit(fs1) == std::signbit(fs2)
390 && !std::isinf(fs3)) {
391 fd = std::numeric_limits<float>::infinity();
392 } else if (std::signbit(fs1) != std::signbit(fs2)
393 && !std::isinf(fs3)) {
394 fd = -std::numeric_limits<float>::infinity();
395 } else { // Fs3_sf is infinity
396 fd = fs3;
397 }
398 } else {
399 fd = fs1*fs2 + fs3;
400 }
401 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
402 }}, FloatMultOp);
403 0x1: fmadd_d({{
404 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
405 if (issignalingnan(Fs1) || issignalingnan(Fs2)
406 || issignalingnan(Fs3)) {
407 FFLAGS |= FloatInvalid;
408 }
409 Fd = std::numeric_limits<double>::quiet_NaN();
410 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
411 std::isinf(Fs3)) {
412 if (std::signbit(Fs1) == std::signbit(Fs2)
413 && !std::isinf(Fs3)) {
414 Fd = std::numeric_limits<double>::infinity();
415 } else if (std::signbit(Fs1) != std::signbit(Fs2)
416 && !std::isinf(Fs3)) {
417 Fd = -std::numeric_limits<double>::infinity();
418 } else {
419 Fd = Fs3;
420 }
421 } else {
422 Fd = Fs1*Fs2 + Fs3;
423 }
424 }}, FloatMultOp);
425 }
426 0x47: decode FUNCT2 {
427 0x0: fmsub_s({{
428 uint32_t temp;
429 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
430 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
431 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
432 float fd;
433
434 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
435 if (issignalingnan(fs1) || issignalingnan(fs2)
436 || issignalingnan(fs3)) {
437 FFLAGS |= FloatInvalid;
438 }
439 fd = std::numeric_limits<float>::quiet_NaN();
440 } else if (std::isinf(fs1) || std::isinf(fs2) ||
441 std::isinf(fs3)) {
442 if (std::signbit(fs1) == std::signbit(fs2)
443 && !std::isinf(fs3)) {
444 fd = std::numeric_limits<float>::infinity();
445 } else if (std::signbit(fs1) != std::signbit(fs2)
446 && !std::isinf(fs3)) {
447 fd = -std::numeric_limits<float>::infinity();
448 } else { // Fs3_sf is infinity
449 fd = -fs3;
450 }
451 } else {
452 fd = fs1*fs2 - fs3;
453 }
454 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
455 }}, FloatMultOp);
456 0x1: fmsub_d({{
457 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
458 if (issignalingnan(Fs1) || issignalingnan(Fs2)
459 || issignalingnan(Fs3)) {
460 FFLAGS |= FloatInvalid;
461 }
462 Fd = std::numeric_limits<double>::quiet_NaN();
463 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
464 std::isinf(Fs3)) {
465 if (std::signbit(Fs1) == std::signbit(Fs2)
466 && !std::isinf(Fs3)) {
467 Fd = std::numeric_limits<double>::infinity();
468 } else if (std::signbit(Fs1) != std::signbit(Fs2)
469 && !std::isinf(Fs3)) {
470 Fd = -std::numeric_limits<double>::infinity();
471 } else {
472 Fd = -Fs3;
473 }
474 } else {
475 Fd = Fs1*Fs2 - Fs3;
476 }
477 }}, FloatMultOp);
478 }
479 0x4b: decode FUNCT2 {
480 0x0: fnmsub_s({{
481 uint32_t temp;
482 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
483 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
484 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
485 float fd;
486
487 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
488 if (issignalingnan(fs1) || issignalingnan(fs2)
489 || issignalingnan(fs3)) {
490 FFLAGS |= FloatInvalid;
491 }
492 fd = std::numeric_limits<float>::quiet_NaN();
493 } else if (std::isinf(fs1) || std::isinf(fs2) ||
494 std::isinf(fs3)) {
495 if (std::signbit(fs1) == std::signbit(fs2)
496 && !std::isinf(fs3)) {
497 fd = -std::numeric_limits<float>::infinity();
498 } else if (std::signbit(fs1) != std::signbit(fs2)
499 && !std::isinf(fs3)) {
500 fd = std::numeric_limits<float>::infinity();
501 } else { // Fs3_sf is infinity
502 fd = fs3;
503 }
504 } else {
505 fd = -(fs1*fs2 - fs3);
506 }
507 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
508 }}, FloatMultOp);
509 0x1: fnmsub_d({{
510 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
511 if (issignalingnan(Fs1) || issignalingnan(Fs2)
512 || issignalingnan(Fs3)) {
513 FFLAGS |= FloatInvalid;
514 }
515 Fd = std::numeric_limits<double>::quiet_NaN();
516 } else if (std::isinf(Fs1) || std::isinf(Fs2)
517 || std::isinf(Fs3)) {
518 if (std::signbit(Fs1) == std::signbit(Fs2)
519 && !std::isinf(Fs3)) {
520 Fd = -std::numeric_limits<double>::infinity();
521 } else if (std::signbit(Fs1) != std::signbit(Fs2)
522 && !std::isinf(Fs3)) {
523 Fd = std::numeric_limits<double>::infinity();
524 } else {
525 Fd = Fs3;
526 }
527 } else {
528 Fd = -(Fs1*Fs2 - Fs3);
529 }
530 }}, FloatMultOp);
531 }
532 0x4f: decode FUNCT2 {
533 0x0: fnmadd_s({{
534 uint32_t temp;
535 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
536 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
537 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
538 float fd;
539
540 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
541 if (issignalingnan(fs1) || issignalingnan(fs2)
542 || issignalingnan(fs3)) {
543 FFLAGS |= FloatInvalid;
544 }
545 fd = std::numeric_limits<float>::quiet_NaN();
546 } else if (std::isinf(fs1) || std::isinf(fs2) ||
547 std::isinf(fs3)) {
548 if (std::signbit(fs1) == std::signbit(fs2)
549 && !std::isinf(fs3)) {
550 fd = -std::numeric_limits<float>::infinity();
551 } else if (std::signbit(fs1) != std::signbit(fs2)
552 && !std::isinf(fs3)) {
553 fd = std::numeric_limits<float>::infinity();
554 } else { // Fs3_sf is infinity
555 fd = -fs3;
556 }
557 } else {
558 fd = -(fs1*fs2 + fs3);
559 }
560 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
561 }}, FloatMultOp);
562 0x1: fnmadd_d({{
563 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
564 if (issignalingnan(Fs1) || issignalingnan(Fs2)
565 || issignalingnan(Fs3)) {
566 FFLAGS |= FloatInvalid;
567 }
568 Fd = std::numeric_limits<double>::quiet_NaN();
569 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
570 std::isinf(Fs3)) {
571 if (std::signbit(Fs1) == std::signbit(Fs2)
572 && !std::isinf(Fs3)) {
573 Fd = -std::numeric_limits<double>::infinity();
574 } else if (std::signbit(Fs1) != std::signbit(Fs2)
575 && !std::isinf(Fs3)) {
576 Fd = std::numeric_limits<double>::infinity();
577 } else {
578 Fd = -Fs3;
579 }
580 } else {
581 Fd = -(Fs1*Fs2 + Fs3);
582 }
583 }}, FloatMultOp);
584 }
585 }
586
587 0x53: decode FUNCT7 {
588 format FPROp {
589 0x0: fadd_s({{
590 uint32_t temp;
591 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
592 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
593 float fd;
594
595 if (std::isnan(fs1) || std::isnan(fs2)) {
596 if (issignalingnan(fs1) || issignalingnan(fs2)) {
597 FFLAGS |= FloatInvalid;
598 }
599 fd = std::numeric_limits<float>::quiet_NaN();
600 } else {
601 fd = fs1 + fs2;
602 }
603 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
604 }}, FloatAddOp);
605 0x1: fadd_d({{
606 if (std::isnan(Fs1) || std::isnan(Fs2)) {
607 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
608 FFLAGS |= FloatInvalid;
609 }
610 Fd = std::numeric_limits<double>::quiet_NaN();
611 } else {
612 Fd = Fs1 + Fs2;
613 }
614 }}, FloatAddOp);
615 0x4: fsub_s({{
616 uint32_t temp;
617 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
618 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
619 float fd;
620
621 if (std::isnan(fs1) || std::isnan(fs2)) {
622 if (issignalingnan(fs1) || issignalingnan(fs2)) {
623 FFLAGS |= FloatInvalid;
624 }
625 fd = std::numeric_limits<float>::quiet_NaN();
626 } else {
627 fd = fs1 - fs2;
628 }
629 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
630 }}, FloatAddOp);
631 0x5: fsub_d({{
632 if (std::isnan(Fs1) || std::isnan(Fs2)) {
633 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
634 FFLAGS |= FloatInvalid;
635 }
636 Fd = std::numeric_limits<double>::quiet_NaN();
637 } else {
638 Fd = Fs1 - Fs2;
639 }
640 }}, FloatAddOp);
641 0x8: fmul_s({{
642 uint32_t temp;
643 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
644 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
645 float fd;
646
647 if (std::isnan(fs1) || std::isnan(fs2)) {
648 if (issignalingnan(fs1) || issignalingnan(fs2)) {
649 FFLAGS |= FloatInvalid;
650 }
651 fd = std::numeric_limits<float>::quiet_NaN();
652 } else {
653 fd = fs1*fs2;
654 }
655 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
656 }}, FloatMultOp);
657 0x9: fmul_d({{
658 if (std::isnan(Fs1) || std::isnan(Fs2)) {
659 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
660 FFLAGS |= FloatInvalid;
661 }
662 Fd = std::numeric_limits<double>::quiet_NaN();
663 } else {
664 Fd = Fs1*Fs2;
665 }
666 }}, FloatMultOp);
667 0xc: fdiv_s({{
668 uint32_t temp;
669 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
670 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
671 float fd;
672
673 if (std::isnan(fs1) || std::isnan(fs2)) {
674 if (issignalingnan(fs1) || issignalingnan(fs2)) {
675 FFLAGS |= FloatInvalid;
676 }
677 fd = std::numeric_limits<float>::quiet_NaN();
678 } else {
679 fd = fs1/fs2;
680 }
681 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
682 }}, FloatDivOp);
683 0xd: fdiv_d({{
684 if (std::isnan(Fs1) || std::isnan(Fs2)) {
685 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
686 FFLAGS |= FloatInvalid;
687 }
688 Fd = std::numeric_limits<double>::quiet_NaN();
689 } else {
690 Fd = Fs1/Fs2;
691 }
692 }}, FloatDivOp);
693 0x10: decode ROUND_MODE {
694 0x0: fsgnj_s({{
695 uint32_t temp;
696 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
697 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
698 float fd;
699
700 if (issignalingnan(fs1)) {
701 fd = std::numeric_limits<float>::signaling_NaN();
702 std::feclearexcept(FE_INVALID);
703 } else {
704 fd = std::copysign(fs1, fs2);
705 }
706 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
707 }});
708 0x1: fsgnjn_s({{
709 uint32_t temp;
710 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
711 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
712 float fd;
713
714 if (issignalingnan(fs1)) {
715 fd = std::numeric_limits<float>::signaling_NaN();
716 std::feclearexcept(FE_INVALID);
717 } else {
718 fd = std::copysign(fs1, -fs2);
719 }
720 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
721 }});
722 0x2: fsgnjx_s({{
723 uint32_t temp;
724 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
725 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
726 float fd;
727
728 if (issignalingnan(fs1)) {
729 fd = std::numeric_limits<float>::signaling_NaN();
730 std::feclearexcept(FE_INVALID);
731 } else {
732 fd = fs1*(std::signbit(fs2) ? -1.0 : 1.0);
733 }
734 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
735 }});
736 }
737 0x11: decode ROUND_MODE {
738 0x0: fsgnj_d({{
739 if (issignalingnan(Fs1)) {
740 Fd = std::numeric_limits<double>::signaling_NaN();
741 std::feclearexcept(FE_INVALID);
742 } else {
743 Fd = std::copysign(Fs1, Fs2);
744 }
745 }});
746 0x1: fsgnjn_d({{
747 if (issignalingnan(Fs1)) {
748 Fd = std::numeric_limits<double>::signaling_NaN();
749 std::feclearexcept(FE_INVALID);
750 } else {
751 Fd = std::copysign(Fs1, -Fs2);
752 }
753 }});
754 0x2: fsgnjx_d({{
755 if (issignalingnan(Fs1)) {
756 Fd = std::numeric_limits<double>::signaling_NaN();
757 std::feclearexcept(FE_INVALID);
758 } else {
759 Fd = Fs1*(std::signbit(Fs2) ? -1.0 : 1.0);
760 }
761 }});
762 }
763 0x14: decode ROUND_MODE {
764 0x0: fmin_s({{
765 uint32_t temp;
766 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
767 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
768 float fd;
769
770 if (issignalingnan(fs2)) {
771 fd = fs1;
772 FFLAGS |= FloatInvalid;
773 } else if (issignalingnan(fs1)) {
774 fd = fs2;
775 FFLAGS |= FloatInvalid;
776 } else {
777 fd = std::fmin(fs1, fs2);
778 }
779 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
780 }}, FloatCmpOp);
781 0x1: fmax_s({{
782 uint32_t temp;
783 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
784 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
785 float fd;
786
787 if (issignalingnan(fs2)) {
788 fd = fs1;
789 FFLAGS |= FloatInvalid;
790 } else if (issignalingnan(fs1)) {
791 fd = fs2;
792 FFLAGS |= FloatInvalid;
793 } else {
794 fd = std::fmax(fs1, fs2);
795 }
796 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
797 }}, FloatCmpOp);
798 }
799 0x15: decode ROUND_MODE {
800 0x0: fmin_d({{
801 if (issignalingnan(Fs2)) {
802 Fd = Fs1;
803 FFLAGS |= FloatInvalid;
804 } else if (issignalingnan(Fs1)) {
805 Fd = Fs2;
806 FFLAGS |= FloatInvalid;
807 } else {
808 Fd = std::fmin(Fs1, Fs2);
809 }
810 }}, FloatCmpOp);
811 0x1: fmax_d({{
812 if (issignalingnan(Fs2)) {
813 Fd = Fs1;
814 FFLAGS |= FloatInvalid;
815 } else if (issignalingnan(Fs1)) {
816 Fd = Fs2;
817 FFLAGS |= FloatInvalid;
818 } else {
819 Fd = std::fmax(Fs1, Fs2);
820 }
821 }}, FloatCmpOp);
822 }
823 0x20: fcvt_s_d({{
824 assert(CONV_SGN == 1);
825 float fd;
826 if (issignalingnan(Fs1)) {
827 fd = std::numeric_limits<float>::quiet_NaN();
828 FFLAGS |= FloatInvalid;
829 } else {
830 fd = (float)Fs1;
831 }
832 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
833 }}, FloatCvtOp);
834 0x21: fcvt_d_s({{
835 assert(CONV_SGN == 0);
836 uint32_t temp;
837 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
838
839 if (issignalingnan(fs1)) {
840 Fd = std::numeric_limits<double>::quiet_NaN();
841 FFLAGS |= FloatInvalid;
842 } else {
843 Fd = (double)fs1;
844 }
845 }}, FloatCvtOp);
846 0x2c: fsqrt_s({{
847 assert(RS2 == 0);
848 uint32_t temp;
849 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
850 float fd;
851
852 if (issignalingnan(Fs1_sf)) {
853 FFLAGS |= FloatInvalid;
854 }
855 fd = std::sqrt(fs1);
856 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
857 }}, FloatSqrtOp);
858 0x2d: fsqrt_d({{
859 assert(RS2 == 0);
860 Fd = std::sqrt(Fs1);
861 }}, FloatSqrtOp);
862 0x50: decode ROUND_MODE {
863 0x0: fle_s({{
864 uint32_t temp;
865 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
866 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
867
868 if (std::isnan(fs1) || std::isnan(fs2)) {
869 FFLAGS |= FloatInvalid;
870 Rd = 0;
871 } else {
872 Rd = fs1 <= fs2 ? 1 : 0;
873 }
874 }}, FloatCmpOp);
875 0x1: flt_s({{
876 uint32_t temp;
877 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
878 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
879
880 if (std::isnan(fs1) || std::isnan(fs2)) {
881 FFLAGS |= FloatInvalid;
882 Rd = 0;
883 } else {
884 Rd = fs1 < fs2 ? 1 : 0;
885 }
886 }}, FloatCmpOp);
887 0x2: feq_s({{
888 uint32_t temp;
889 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
890 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
891
892 if (issignalingnan(fs1) || issignalingnan(fs2)) {
893 FFLAGS |= FloatInvalid;
894 }
895 Rd = fs1 == fs2 ? 1 : 0;
896 }}, FloatCmpOp);
897 }
898 0x51: decode ROUND_MODE {
899 0x0: fle_d({{
900 if (std::isnan(Fs1) || std::isnan(Fs2)) {
901 FFLAGS |= FloatInvalid;
902 Rd = 0;
903 } else {
904 Rd = Fs1 <= Fs2 ? 1 : 0;
905 }
906 }}, FloatCmpOp);
907 0x1: flt_d({{
908 if (std::isnan(Fs1) || std::isnan(Fs2)) {
909 FFLAGS |= FloatInvalid;
910 Rd = 0;
911 } else {
912 Rd = Fs1 < Fs2 ? 1 : 0;
913 }
914 }}, FloatCmpOp);
915 0x2: feq_d({{
916 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
917 FFLAGS |= FloatInvalid;
918 }
919 Rd = Fs1 == Fs2 ? 1 : 0;
920 }}, FloatCmpOp);
921 }
922 0x60: decode CONV_SGN {
923 0x0: fcvt_w_s({{
924 uint32_t temp;
925 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
926
927 if (std::isnan(fs1)) {
928 Rd_sd = std::numeric_limits<int32_t>::max();
929 FFLAGS |= FloatInvalid;
930 } else {
931 Rd_sd = (int32_t)fs1;
932 if (std::fetestexcept(FE_INVALID)) {
933 if (std::signbit(fs1)) {
934 Rd_sd = std::numeric_limits<int32_t>::min();
935 } else {
936 Rd_sd = std::numeric_limits<int32_t>::max();
937 }
938 std::feclearexcept(FE_INEXACT);
939 }
940 }
941 }}, FloatCvtOp);
942 0x1: fcvt_wu_s({{
943 uint32_t temp;
944 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
945
946 if (fs1 < 0.0) {
947 Rd = 0;
948 FFLAGS |= FloatInvalid;
949 } else {
950 Rd = (uint32_t)fs1;
951 if (std::fetestexcept(FE_INVALID)) {
952 Rd = std::numeric_limits<uint64_t>::max();
953 std::feclearexcept(FE_INEXACT);
954 }
955 }
956 }}, FloatCvtOp);
957 0x2: fcvt_l_s({{
958 uint32_t temp;
959 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
960
961 if (std::isnan(fs1)) {
962 Rd_sd = std::numeric_limits<int64_t>::max();
963 FFLAGS |= FloatInvalid;
964 } else {
965 Rd_sd = (int64_t)fs1;
966 if (std::fetestexcept(FE_INVALID)) {
967 if (std::signbit(fs1)) {
968 Rd_sd = std::numeric_limits<int64_t>::min();
969 } else {
970 Rd_sd = std::numeric_limits<int64_t>::max();
971 }
972 std::feclearexcept(FE_INEXACT);
973 }
974 }
975 }}, FloatCvtOp);
976 0x3: fcvt_lu_s({{
977 uint32_t temp;
978 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
979
980 if (fs1 < 0.0) {
981 Rd = 0;
982 FFLAGS |= FloatInvalid;
983 } else {
984 Rd = (uint64_t)fs1;
985 if (std::fetestexcept(FE_INVALID)) {
986 Rd = std::numeric_limits<uint64_t>::max();
987 std::feclearexcept(FE_INEXACT);
988 }
989 }
990 }}, FloatCvtOp);
991 }
992 0x61: decode CONV_SGN {
993 0x0: fcvt_w_d({{
994 Rd_sd = (int32_t)Fs1;
995 if (std::fetestexcept(FE_INVALID)) {
996 if (Fs1 < 0.0) {
997 Rd_sd = std::numeric_limits<int32_t>::min();
998 } else {
999 Rd_sd = std::numeric_limits<int32_t>::max();
1000 }
1001 std::feclearexcept(FE_INEXACT);
1002 }
1003 }}, FloatCvtOp);
1004 0x1: fcvt_wu_d({{
1005 if (Fs1 < 0.0) {
1006 Rd = 0;
1007 FFLAGS |= FloatInvalid;
1008 } else {
1009 Rd = (uint32_t)Fs1;
1010 if (std::fetestexcept(FE_INVALID)) {
1011 Rd = std::numeric_limits<uint64_t>::max();
1012 std::feclearexcept(FE_INEXACT);
1013 }
1014 }
1015 }}, FloatCvtOp);
1016 0x2: fcvt_l_d({{
1017 Rd_sd = Fs1;
1018 if (std::fetestexcept(FE_INVALID)) {
1019 if (Fs1 < 0.0) {
1020 Rd_sd = std::numeric_limits<int64_t>::min();
1021 } else {
1022 Rd_sd = std::numeric_limits<int64_t>::max();
1023 }
1024 std::feclearexcept(FE_INEXACT);
1025 }
1026 }}, FloatCvtOp);
1027 0x3: fcvt_lu_d({{
1028 if (Fs1 < 0.0) {
1029 Rd = 0;
1030 FFLAGS |= FloatInvalid;
1031 } else {
1032 Rd = (uint64_t)Fs1;
1033 if (std::fetestexcept(FE_INVALID)) {
1034 Rd = std::numeric_limits<uint64_t>::max();
1035 std::feclearexcept(FE_INEXACT);
1036 }
1037 }
1038 }}, FloatCvtOp);
1039 }
1040 0x68: decode CONV_SGN {
1041 0x0: fcvt_s_w({{
1042 float temp = (float)Rs1_sw;
1043 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1044 }}, FloatCvtOp);
1045 0x1: fcvt_s_wu({{
1046 float temp = (float)Rs1_uw;
1047 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1048 }}, FloatCvtOp);
1049 0x2: fcvt_s_l({{
1050 float temp = (float)Rs1_sd;
1051 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1052 }}, FloatCvtOp);
1053 0x3: fcvt_s_lu({{
1054 float temp = (float)Rs1;
1055 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1056 }}, FloatCvtOp);
1057 }
1058 0x69: decode CONV_SGN {
1059 0x0: fcvt_d_w({{
1060 Fd = (double)Rs1_sw;
1061 }}, FloatCvtOp);
1062 0x1: fcvt_d_wu({{
1063 Fd = (double)Rs1_uw;
1064 }}, FloatCvtOp);
1065 0x2: fcvt_d_l({{
1066 Fd = (double)Rs1_sd;
1067 }}, FloatCvtOp);
1068 0x3: fcvt_d_lu({{
1069 Fd = (double)Rs1;
1070 }}, FloatCvtOp);
1071 }
1072 0x70: decode ROUND_MODE {
1073 0x0: fmv_x_s({{
1074 Rd = (uint32_t)Fs1_bits;
1075 if ((Rd&0x80000000) != 0) {
1076 Rd |= (0xFFFFFFFFULL << 32);
1077 }
1078 }}, FloatCvtOp);
1079 0x1: fclass_s({{
1080 uint32_t temp;
1081 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1082 switch (std::fpclassify(fs1)) {
1083 case FP_INFINITE:
1084 if (std::signbit(fs1)) {
1085 Rd = 1 << 0;
1086 } else {
1087 Rd = 1 << 7;
1088 }
1089 break;
1090 case FP_NAN:
1091 if (issignalingnan(fs1)) {
1092 Rd = 1 << 8;
1093 } else {
1094 Rd = 1 << 9;
1095 }
1096 break;
1097 case FP_ZERO:
1098 if (std::signbit(fs1)) {
1099 Rd = 1 << 3;
1100 } else {
1101 Rd = 1 << 4;
1102 }
1103 break;
1104 case FP_SUBNORMAL:
1105 if (std::signbit(fs1)) {
1106 Rd = 1 << 2;
1107 } else {
1108 Rd = 1 << 5;
1109 }
1110 break;
1111 case FP_NORMAL:
1112 if (std::signbit(fs1)) {
1113 Rd = 1 << 1;
1114 } else {
1115 Rd = 1 << 6;
1116 }
1117 break;
1118 default:
1119 panic("Unknown classification for operand.");
1120 break;
1121 }
1122 }});
1123 }
1124 0x71: decode ROUND_MODE {
1125 0x0: fmv_x_d({{
1126 Rd = Fs1_bits;
1127 }}, FloatCvtOp);
1128 0x1: fclass_d({{
1129 switch (std::fpclassify(Fs1)) {
1130 case FP_INFINITE:
1131 if (std::signbit(Fs1)) {
1132 Rd = 1 << 0;
1133 } else {
1134 Rd = 1 << 7;
1135 }
1136 break;
1137 case FP_NAN:
1138 if (issignalingnan(Fs1)) {
1139 Rd = 1 << 8;
1140 } else {
1141 Rd = 1 << 9;
1142 }
1143 break;
1144 case FP_ZERO:
1145 if (std::signbit(Fs1)) {
1146 Rd = 1 << 3;
1147 } else {
1148 Rd = 1 << 4;
1149 }
1150 break;
1151 case FP_SUBNORMAL:
1152 if (std::signbit(Fs1)) {
1153 Rd = 1 << 2;
1154 } else {
1155 Rd = 1 << 5;
1156 }
1157 break;
1158 case FP_NORMAL:
1159 if (std::signbit(Fs1)) {
1160 Rd = 1 << 1;
1161 } else {
1162 Rd = 1 << 6;
1163 }
1164 break;
1165 default:
1166 panic("Unknown classification for operand.");
1167 break;
1168 }
1169 }});
1170 }
1171 0x78: fmv_s_x({{
1172 Fd_bits = (uint64_t)Rs1_uw;
1173 }}, FloatCvtOp);
1174 0x79: fmv_d_x({{
1175 Fd_bits = Rs1;
1176 }}, FloatCvtOp);
1177 }
1178 }
350 0x63: decode FUNCT3 {
351 format SBOp {
352 0x0: beq({{
353 if (Rs1 == Rs2) {
354 NPC = PC + imm;
355 } else {
356 NPC = NPC;
357 }

--- 99 unchanged lines hidden ---
1179 0x63: decode FUNCT3 {
1180 format SBOp {
1181 0x0: beq({{
1182 if (Rs1 == Rs2) {
1183 NPC = PC + imm;
1184 } else {
1185 NPC = NPC;
1186 }

--- 99 unchanged lines hidden ---