3 // Copyright (c) 2015 RISC-V Foundation
4 // Copyright (c) 2016 The University of Virginia
5 // All rights reserved.
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are
9 // met: redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer;
11 // redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution;
14 // neither the name of the copyright holders nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 // Authors: Alec Roelke
32 ////////////////////////////////////////////////////////////////////
34 // The RISC-V ISA decoder
37 decode OPCODE default Unknown::unknown() {
67 Fd_bits = (uint64_t)Mem_uw;
78 }}, IsNonSpeculative, IsMemBarrier, No_OpClass);
80 }}, IsNonSpeculative, IsSerializeAfter, No_OpClass);
93 Rd = (Rs1_sd < imm) ? 1 : 0;
96 Rd = (Rs1 < (uint64_t)imm) ? 1 : 0;
99 Rd = Rs1 ^ (uint64_t)imm;
106 Rd_sd = Rs1_sd >> SHAMT6;
110 Rd = Rs1 | (uint64_t)imm;
113 Rd = Rs1 & (uint64_t)imm;
122 0x1b: decode FUNCT3 {
125 Rd_sd = (int32_t)Rs1 + (int32_t)imm;
128 Rd_sd = Rs1_sw << SHAMT5;
132 Rd = Rs1_uw >> SHAMT5;
135 Rd_sd = Rs1_sw >> SHAMT5;
141 0x23: decode FUNCT3 {
158 0x27: decode FUNCT3 {
161 Mem_uw = (uint32_t)Fs2_bits;
169 0x2f: decode FUNCT3 {
170 0x2: decode AMOFUNCT {
171 0x2: LoadReserved::lr_w({{
174 0x3: StoreCond::sc_w({{
178 }}, inst_flags=IsStoreConditional, mem_flags=LLSC);
180 0x0: amoadd_w({{Rt_sd = Mem_sw;}}, {{
181 Mem_sw = Rs2_sw + Rt_sd;
184 0x1: amoswap_w({{Rt_sd = Mem_sw;}}, {{
188 0x4: amoxor_w({{Rt_sd = Mem_sw;}}, {{
189 Mem_sw = Rs2_uw^Rt_sd;
192 0x8: amoor_w({{Rt_sd = Mem_sw;}}, {{
193 Mem_sw = Rs2_uw | Rt_sd;
196 0xc: amoand_w({{Rt_sd = Mem_sw;}}, {{
197 Mem_sw = Rs2_uw&Rt_sd;
200 0x10: amomin_w({{Rt_sd = Mem_sw;}}, {{
201 Mem_sw = std::min<int32_t>(Rs2_sw, Rt_sd);
204 0x14: amomax_w({{Rt_sd = Mem_sw;}}, {{
205 Mem_sw = std::max<int32_t>(Rs2_sw, Rt_sd);
208 0x18: amominu_w({{Rt_sd = Mem_sw;}}, {{
209 Mem_sw = std::min<uint32_t>(Rs2_uw, Rt_sd);
212 0x1c: amomaxu_w({{Rt_sd = Mem_sw;}}, {{
213 Mem_sw = std::max<uint32_t>(Rs2_uw, Rt_sd);
218 0x3: decode AMOFUNCT {
219 0x2: LoadReserved::lr_d({{
222 0x3: StoreCond::sc_d({{
226 }}, mem_flags=LLSC, inst_flags=IsStoreConditional);
228 0x0: amoadd_d({{Rt_sd = Mem_sd;}}, {{
229 Mem_sd = Rs2_sd + Rt_sd;
232 0x1: amoswap_d({{Rt = Mem;}}, {{
236 0x4: amoxor_d({{Rt = Mem;}}, {{
240 0x8: amoor_d({{Rt = Mem;}}, {{
244 0xc: amoand_d({{Rt = Mem;}}, {{
248 0x10: amomin_d({{Rt_sd = Mem_sd;}}, {{
249 Mem_sd = std::min(Rs2_sd, Rt_sd);
252 0x14: amomax_d({{Rt_sd = Mem_sd;}}, {{
253 Mem_sd = std::max(Rs2_sd, Rt_sd);
256 0x18: amominu_d({{Rt = Mem;}}, {{
257 Mem = std::min(Rs2, Rt);
260 0x1c: amomaxu_d({{Rt = Mem;}}, {{
261 Mem = std::max(Rs2, Rt);
267 0x33: decode FUNCT3 {
271 Rd = Rs1_sd + Rs2_sd;
277 Rd = Rs1_sd - Rs2_sd;
282 Rd = Rs1 << Rs2<5:0>;
285 bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
287 uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
288 uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
289 uint64_t Rs2_lo = (uint32_t)std::abs(Rs2_sd);
290 uint64_t Rs2_hi = (uint64_t)std::abs(Rs2_sd) >> 32;
292 uint64_t hi = Rs1_hi*Rs2_hi;
293 uint64_t mid1 = Rs1_hi*Rs2_lo;
294 uint64_t mid2 = Rs1_lo*Rs2_hi;
295 uint64_t lo = Rs2_lo*Rs1_lo;
296 uint64_t carry = ((uint64_t)(uint32_t)mid1
297 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
299 uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
300 Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0) : res;
305 Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
308 bool negate = Rs1_sd < 0;
309 uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
310 uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
311 uint64_t Rs2_lo = (uint32_t)Rs2;
312 uint64_t Rs2_hi = Rs2 >> 32;
314 uint64_t hi = Rs1_hi*Rs2_hi;
315 uint64_t mid1 = Rs1_hi*Rs2_lo;
316 uint64_t mid2 = Rs1_lo*Rs2_hi;
317 uint64_t lo = Rs1_lo*Rs2_lo;
318 uint64_t carry = ((uint64_t)(uint32_t)mid1
319 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
321 uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
322 Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
327 Rd = (Rs1 < Rs2) ? 1 : 0;
330 uint64_t Rs1_lo = (uint32_t)Rs1;
331 uint64_t Rs1_hi = Rs1 >> 32;
332 uint64_t Rs2_lo = (uint32_t)Rs2;
333 uint64_t Rs2_hi = Rs2 >> 32;
335 uint64_t hi = Rs1_hi*Rs2_hi;
336 uint64_t mid1 = Rs1_hi*Rs2_lo;
337 uint64_t mid2 = Rs1_lo*Rs2_hi;
338 uint64_t lo = Rs1_lo*Rs2_lo;
339 uint64_t carry = ((uint64_t)(uint32_t)mid1
340 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
342 Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
352 } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
354 Rd_sd = std::numeric_limits<int64_t>::min();
356 Rd_sd = Rs1_sd/Rs2_sd;
362 Rd = Rs1 >> Rs2<5:0>;
366 Rd = std::numeric_limits<uint64_t>::max();
372 Rd_sd = Rs1_sd >> Rs2<5:0>;
382 } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
409 0x3b: decode FUNCT3 {
413 Rd_sd = Rs1_sw + Rs2_sw;
416 Rd_sd = (int32_t)(Rs1_sw*Rs2_sw);
419 Rd_sd = Rs1_sw - Rs2_sw;
423 Rd_sd = Rs1_sw << Rs2<4:0>;
428 } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
430 Rd_sd = std::numeric_limits<int32_t>::min();
432 Rd_sd = Rs1_sw/Rs2_sw;
437 Rd_uw = Rs1_uw >> Rs2<4:0>;
441 Rd_sd = std::numeric_limits<IntReg>::max();
443 Rd_sd = (int32_t)(Rs1_uw/Rs2_uw);
447 Rd_sd = Rs1_sw >> Rs2<4:0>;
453 } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
457 Rd_sd = Rs1_sw%Rs2_sw;
462 Rd_sd = (int32_t)Rs1_uw;
464 Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
471 0x43: decode FUNCT2 {
474 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
475 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
476 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
479 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
480 if (issignalingnan(fs1) || issignalingnan(fs2)
481 || issignalingnan(fs3)) {
482 FFLAGS |= FloatInvalid;
484 fd = std::numeric_limits<float>::quiet_NaN();
485 } else if (std::isinf(fs1) || std::isinf(fs2) ||
487 if (std::signbit(fs1) == std::signbit(fs2)
488 && !std::isinf(fs3)) {
489 fd = std::numeric_limits<float>::infinity();
490 } else if (std::signbit(fs1) != std::signbit(fs2)
491 && !std::isinf(fs3)) {
492 fd = -std::numeric_limits<float>::infinity();
493 } else { // Fs3_sf is infinity
499 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
502 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
503 if (issignalingnan(Fs1) || issignalingnan(Fs2)
504 || issignalingnan(Fs3)) {
505 FFLAGS |= FloatInvalid;
507 Fd = std::numeric_limits<double>::quiet_NaN();
508 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
510 if (std::signbit(Fs1) == std::signbit(Fs2)
511 && !std::isinf(Fs3)) {
512 Fd = std::numeric_limits<double>::infinity();
513 } else if (std::signbit(Fs1) != std::signbit(Fs2)
514 && !std::isinf(Fs3)) {
515 Fd = -std::numeric_limits<double>::infinity();
524 0x47: decode FUNCT2 {
527 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
528 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
529 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
532 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
533 if (issignalingnan(fs1) || issignalingnan(fs2)
534 || issignalingnan(fs3)) {
535 FFLAGS |= FloatInvalid;
537 fd = std::numeric_limits<float>::quiet_NaN();
538 } else if (std::isinf(fs1) || std::isinf(fs2) ||
540 if (std::signbit(fs1) == std::signbit(fs2)
541 && !std::isinf(fs3)) {
542 fd = std::numeric_limits<float>::infinity();
543 } else if (std::signbit(fs1) != std::signbit(fs2)
544 && !std::isinf(fs3)) {
545 fd = -std::numeric_limits<float>::infinity();
546 } else { // Fs3_sf is infinity
552 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
555 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
556 if (issignalingnan(Fs1) || issignalingnan(Fs2)
557 || issignalingnan(Fs3)) {
558 FFLAGS |= FloatInvalid;
560 Fd = std::numeric_limits<double>::quiet_NaN();
561 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
563 if (std::signbit(Fs1) == std::signbit(Fs2)
564 && !std::isinf(Fs3)) {
565 Fd = std::numeric_limits<double>::infinity();
566 } else if (std::signbit(Fs1) != std::signbit(Fs2)
567 && !std::isinf(Fs3)) {
568 Fd = -std::numeric_limits<double>::infinity();
577 0x4b: decode FUNCT2 {
580 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
581 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
582 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
585 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
586 if (issignalingnan(fs1) || issignalingnan(fs2)
587 || issignalingnan(fs3)) {
588 FFLAGS |= FloatInvalid;
590 fd = std::numeric_limits<float>::quiet_NaN();
591 } else if (std::isinf(fs1) || std::isinf(fs2) ||
593 if (std::signbit(fs1) == std::signbit(fs2)
594 && !std::isinf(fs3)) {
595 fd = -std::numeric_limits<float>::infinity();
596 } else if (std::signbit(fs1) != std::signbit(fs2)
597 && !std::isinf(fs3)) {
598 fd = std::numeric_limits<float>::infinity();
599 } else { // Fs3_sf is infinity
603 fd = -(fs1*fs2 - fs3);
605 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
608 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
609 if (issignalingnan(Fs1) || issignalingnan(Fs2)
610 || issignalingnan(Fs3)) {
611 FFLAGS |= FloatInvalid;
613 Fd = std::numeric_limits<double>::quiet_NaN();
614 } else if (std::isinf(Fs1) || std::isinf(Fs2)
615 || std::isinf(Fs3)) {
616 if (std::signbit(Fs1) == std::signbit(Fs2)
617 && !std::isinf(Fs3)) {
618 Fd = -std::numeric_limits<double>::infinity();
619 } else if (std::signbit(Fs1) != std::signbit(Fs2)
620 && !std::isinf(Fs3)) {
621 Fd = std::numeric_limits<double>::infinity();
626 Fd = -(Fs1*Fs2 - Fs3);
630 0x4f: decode FUNCT2 {
633 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
634 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
635 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
638 if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
639 if (issignalingnan(fs1) || issignalingnan(fs2)
640 || issignalingnan(fs3)) {
641 FFLAGS |= FloatInvalid;
643 fd = std::numeric_limits<float>::quiet_NaN();
644 } else if (std::isinf(fs1) || std::isinf(fs2) ||
646 if (std::signbit(fs1) == std::signbit(fs2)
647 && !std::isinf(fs3)) {
648 fd = -std::numeric_limits<float>::infinity();
649 } else if (std::signbit(fs1) != std::signbit(fs2)
650 && !std::isinf(fs3)) {
651 fd = std::numeric_limits<float>::infinity();
652 } else { // Fs3_sf is infinity
656 fd = -(fs1*fs2 + fs3);
658 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
661 if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
662 if (issignalingnan(Fs1) || issignalingnan(Fs2)
663 || issignalingnan(Fs3)) {
664 FFLAGS |= FloatInvalid;
666 Fd = std::numeric_limits<double>::quiet_NaN();
667 } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
669 if (std::signbit(Fs1) == std::signbit(Fs2)
670 && !std::isinf(Fs3)) {
671 Fd = -std::numeric_limits<double>::infinity();
672 } else if (std::signbit(Fs1) != std::signbit(Fs2)
673 && !std::isinf(Fs3)) {
674 Fd = std::numeric_limits<double>::infinity();
679 Fd = -(Fs1*Fs2 + Fs3);
685 0x53: decode FUNCT7 {
689 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
690 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
693 if (std::isnan(fs1) || std::isnan(fs2)) {
694 if (issignalingnan(fs1) || issignalingnan(fs2)) {
695 FFLAGS |= FloatInvalid;
697 fd = std::numeric_limits<float>::quiet_NaN();
701 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
704 if (std::isnan(Fs1) || std::isnan(Fs2)) {
705 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
706 FFLAGS |= FloatInvalid;
708 Fd = std::numeric_limits<double>::quiet_NaN();
715 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
716 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
719 if (std::isnan(fs1) || std::isnan(fs2)) {
720 if (issignalingnan(fs1) || issignalingnan(fs2)) {
721 FFLAGS |= FloatInvalid;
723 fd = std::numeric_limits<float>::quiet_NaN();
727 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
730 if (std::isnan(Fs1) || std::isnan(Fs2)) {
731 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
732 FFLAGS |= FloatInvalid;
734 Fd = std::numeric_limits<double>::quiet_NaN();
741 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
742 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
745 if (std::isnan(fs1) || std::isnan(fs2)) {
746 if (issignalingnan(fs1) || issignalingnan(fs2)) {
747 FFLAGS |= FloatInvalid;
749 fd = std::numeric_limits<float>::quiet_NaN();
753 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
756 if (std::isnan(Fs1) || std::isnan(Fs2)) {
757 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
758 FFLAGS |= FloatInvalid;
760 Fd = std::numeric_limits<double>::quiet_NaN();
767 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
768 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
771 if (std::isnan(fs1) || std::isnan(fs2)) {
772 if (issignalingnan(fs1) || issignalingnan(fs2)) {
773 FFLAGS |= FloatInvalid;
775 fd = std::numeric_limits<float>::quiet_NaN();
779 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
782 if (std::isnan(Fs1) || std::isnan(Fs2)) {
783 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
784 FFLAGS |= FloatInvalid;
786 Fd = std::numeric_limits<double>::quiet_NaN();
791 0x10: decode ROUND_MODE {
794 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
795 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
798 if (issignalingnan(fs1)) {
799 fd = std::numeric_limits<float>::signaling_NaN();
800 std::feclearexcept(FE_INVALID);
802 fd = std::copysign(fs1, fs2);
804 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
808 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
809 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
812 if (issignalingnan(fs1)) {
813 fd = std::numeric_limits<float>::signaling_NaN();
814 std::feclearexcept(FE_INVALID);
816 fd = std::copysign(fs1, -fs2);
818 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
822 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
823 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
826 if (issignalingnan(fs1)) {
827 fd = std::numeric_limits<float>::signaling_NaN();
828 std::feclearexcept(FE_INVALID);
830 fd = fs1*(std::signbit(fs2) ? -1.0 : 1.0);
832 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
835 0x11: decode ROUND_MODE {
837 if (issignalingnan(Fs1)) {
838 Fd = std::numeric_limits<double>::signaling_NaN();
839 std::feclearexcept(FE_INVALID);
841 Fd = std::copysign(Fs1, Fs2);
845 if (issignalingnan(Fs1)) {
846 Fd = std::numeric_limits<double>::signaling_NaN();
847 std::feclearexcept(FE_INVALID);
849 Fd = std::copysign(Fs1, -Fs2);
853 if (issignalingnan(Fs1)) {
854 Fd = std::numeric_limits<double>::signaling_NaN();
855 std::feclearexcept(FE_INVALID);
857 Fd = Fs1*(std::signbit(Fs2) ? -1.0 : 1.0);
861 0x14: decode ROUND_MODE {
864 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
865 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
868 if (issignalingnan(fs2)) {
870 FFLAGS |= FloatInvalid;
871 } else if (issignalingnan(fs1)) {
873 FFLAGS |= FloatInvalid;
875 fd = std::fmin(fs1, fs2);
877 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
881 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
882 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
885 if (issignalingnan(fs2)) {
887 FFLAGS |= FloatInvalid;
888 } else if (issignalingnan(fs1)) {
890 FFLAGS |= FloatInvalid;
892 fd = std::fmax(fs1, fs2);
894 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
897 0x15: decode ROUND_MODE {
899 if (issignalingnan(Fs2)) {
901 FFLAGS |= FloatInvalid;
902 } else if (issignalingnan(Fs1)) {
904 FFLAGS |= FloatInvalid;
906 Fd = std::fmin(Fs1, Fs2);
910 if (issignalingnan(Fs2)) {
912 FFLAGS |= FloatInvalid;
913 } else if (issignalingnan(Fs1)) {
915 FFLAGS |= FloatInvalid;
917 Fd = std::fmax(Fs1, Fs2);
922 assert(CONV_SGN == 1);
924 if (issignalingnan(Fs1)) {
925 fd = std::numeric_limits<float>::quiet_NaN();
926 FFLAGS |= FloatInvalid;
930 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
933 assert(CONV_SGN == 0);
935 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
937 if (issignalingnan(fs1)) {
938 Fd = std::numeric_limits<double>::quiet_NaN();
939 FFLAGS |= FloatInvalid;
947 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
950 if (issignalingnan(Fs1_sf)) {
951 FFLAGS |= FloatInvalid;
954 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
960 0x50: decode ROUND_MODE {
963 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
964 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
966 if (std::isnan(fs1) || std::isnan(fs2)) {
967 FFLAGS |= FloatInvalid;
970 Rd = fs1 <= fs2 ? 1 : 0;
975 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
976 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
978 if (std::isnan(fs1) || std::isnan(fs2)) {
979 FFLAGS |= FloatInvalid;
982 Rd = fs1 < fs2 ? 1 : 0;
987 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
988 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
990 if (issignalingnan(fs1) || issignalingnan(fs2)) {
991 FFLAGS |= FloatInvalid;
993 Rd = fs1 == fs2 ? 1 : 0;
996 0x51: decode ROUND_MODE {
998 if (std::isnan(Fs1) || std::isnan(Fs2)) {
999 FFLAGS |= FloatInvalid;
1002 Rd = Fs1 <= Fs2 ? 1 : 0;
1006 if (std::isnan(Fs1) || std::isnan(Fs2)) {
1007 FFLAGS |= FloatInvalid;
1010 Rd = Fs1 < Fs2 ? 1 : 0;
1014 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1015 FFLAGS |= FloatInvalid;
1017 Rd = Fs1 == Fs2 ? 1 : 0;
1020 0x60: decode CONV_SGN {
1023 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1025 if (std::isnan(fs1)) {
1026 Rd_sd = std::numeric_limits<int32_t>::max();
1027 FFLAGS |= FloatInvalid;
1029 Rd_sd = (int32_t)fs1;
1030 if (std::fetestexcept(FE_INVALID)) {
1031 if (std::signbit(fs1)) {
1032 Rd_sd = std::numeric_limits<int32_t>::min();
1034 Rd_sd = std::numeric_limits<int32_t>::max();
1036 std::feclearexcept(FE_INEXACT);
1042 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1046 FFLAGS |= FloatInvalid;
1049 if (std::fetestexcept(FE_INVALID)) {
1050 Rd = std::numeric_limits<uint64_t>::max();
1051 std::feclearexcept(FE_INEXACT);
1057 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1059 if (std::isnan(fs1)) {
1060 Rd_sd = std::numeric_limits<int64_t>::max();
1061 FFLAGS |= FloatInvalid;
1063 Rd_sd = (int64_t)fs1;
1064 if (std::fetestexcept(FE_INVALID)) {
1065 if (std::signbit(fs1)) {
1066 Rd_sd = std::numeric_limits<int64_t>::min();
1068 Rd_sd = std::numeric_limits<int64_t>::max();
1070 std::feclearexcept(FE_INEXACT);
1076 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1080 FFLAGS |= FloatInvalid;
1083 if (std::fetestexcept(FE_INVALID)) {
1084 Rd = std::numeric_limits<uint64_t>::max();
1085 std::feclearexcept(FE_INEXACT);
1090 0x61: decode CONV_SGN {
1092 Rd_sd = (int32_t)Fs1;
1093 if (std::fetestexcept(FE_INVALID)) {
1095 Rd_sd = std::numeric_limits<int32_t>::min();
1097 Rd_sd = std::numeric_limits<int32_t>::max();
1099 std::feclearexcept(FE_INEXACT);
1105 FFLAGS |= FloatInvalid;
1108 if (std::fetestexcept(FE_INVALID)) {
1109 Rd = std::numeric_limits<uint64_t>::max();
1110 std::feclearexcept(FE_INEXACT);
1116 if (std::fetestexcept(FE_INVALID)) {
1118 Rd_sd = std::numeric_limits<int64_t>::min();
1120 Rd_sd = std::numeric_limits<int64_t>::max();
1122 std::feclearexcept(FE_INEXACT);
1128 FFLAGS |= FloatInvalid;
1131 if (std::fetestexcept(FE_INVALID)) {
1132 Rd = std::numeric_limits<uint64_t>::max();
1133 std::feclearexcept(FE_INEXACT);
1138 0x68: decode CONV_SGN {
1140 float temp = (float)Rs1_sw;
1141 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1144 float temp = (float)Rs1_uw;
1145 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1148 float temp = (float)Rs1_sd;
1149 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1152 float temp = (float)Rs1;
1153 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1156 0x69: decode CONV_SGN {
1158 Fd = (double)Rs1_sw;
1161 Fd = (double)Rs1_uw;
1164 Fd = (double)Rs1_sd;
1170 0x70: decode ROUND_MODE {
1172 Rd = (uint32_t)Fs1_bits;
1173 if ((Rd&0x80000000) != 0) {
1174 Rd |= (0xFFFFFFFFULL << 32);
1179 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1180 switch (std::fpclassify(fs1)) {
1182 if (std::signbit(fs1)) {
1189 if (issignalingnan(fs1)) {
1196 if (std::signbit(fs1)) {
1203 if (std::signbit(fs1)) {
1210 if (std::signbit(fs1)) {
1217 panic("Unknown classification for operand.");
1222 0x71: decode ROUND_MODE {
1227 switch (std::fpclassify(Fs1)) {
1229 if (std::signbit(Fs1)) {
1236 if (issignalingnan(Fs1)) {
1243 if (std::signbit(Fs1)) {
1250 if (std::signbit(Fs1)) {
1257 if (std::signbit(Fs1)) {
1264 panic("Unknown classification for operand.");
1270 Fd_bits = (uint64_t)Rs1_uw;
1277 0x63: decode FUNCT3 {
1285 }}, IsDirectControl, IsCondControl);
1292 }}, IsDirectControl, IsCondControl);
1294 if (Rs1_sd < Rs2_sd) {
1299 }}, IsDirectControl, IsCondControl);
1301 if (Rs1_sd >= Rs2_sd) {
1306 }}, IsDirectControl, IsCondControl);
1313 }}, IsDirectControl, IsCondControl);
1320 }}, IsDirectControl, IsCondControl);
1324 0x67: decode FUNCT3 {
1327 NPC = (imm + Rs1) & (~0x1);
1328 }}, IsIndirectControl, IsUncondControl, IsCall);
1334 }}, IsDirectControl, IsUncondControl, IsCall);
1336 0x73: decode FUNCT3 {
1338 0x0: decode FUNCT12 {
1340 fault = std::make_shared<SyscallFault>();
1341 }}, IsSerializeAfter, IsNonSpeculative, IsSyscall, No_OpClass);
1343 fault = std::make_shared<BreakpointFault>();
1344 }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
1346 fault = std::make_shared<UnimplementedFault>("eret");
1350 Rd = xc->readMiscReg(FUNCT12);
1351 xc->setMiscReg(FUNCT12, Rs1);
1352 }}, IsNonSpeculative, No_OpClass);
1354 Rd = xc->readMiscReg(FUNCT12);
1356 xc->setMiscReg(FUNCT12, Rd | Rs1);
1358 }}, IsNonSpeculative, No_OpClass);
1360 Rd = xc->readMiscReg(FUNCT12);
1362 xc->setMiscReg(FUNCT12, Rd & ~Rs1);
1364 }}, IsNonSpeculative, No_OpClass);
1366 Rd = xc->readMiscReg(FUNCT12);
1367 xc->setMiscReg(FUNCT12, ZIMM);
1368 }}, IsNonSpeculative, No_OpClass);
1370 Rd = xc->readMiscReg(FUNCT12);
1372 xc->setMiscReg(FUNCT12, Rd | ZIMM);
1374 }}, IsNonSpeculative, No_OpClass);
1376 Rd = xc->readMiscReg(FUNCT12);
1378 xc->setMiscReg(FUNCT12, Rd & ~ZIMM);
1380 }}, IsNonSpeculative, No_OpClass);