3 // Copyright (c) 2015 RISC-V Foundation
4 // Copyright (c) 2017 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 QUADRANT default Unknown::unknown() {
39 0x0: CUIOp::c_addi4spn({{
40 imm = CIMM8<1:1> << 2 |
48 format CompressedLoad {
50 ldisp = CIMM3 << 3 | CIMM2 << 6;
57 ldisp = CIMM2<1:1> << 2 |
66 ldisp = CIMM3 << 3 | CIMM2 << 6;
73 format CompressedStore {
75 sdisp = CIMM3 << 3 | CIMM2 << 6;
82 sdisp = CIMM2<1:1> << 2 |
91 sdisp = CIMM3 << 3 | CIMM2 << 6;
104 imm |= ~((uint64_t)0x1F);
106 assert((RC1 == 0) == (imm == 0));
107 Rc1_sd = Rc1_sd + imm;
112 imm |= ~((uint64_t)0x1F);
115 Rc1_sd = (int32_t)Rc1_sd + imm;
120 imm |= ~((uint64_t)0x1F);
127 imm = CIMM5<4:4> << 4 |
132 imm |= ~((int64_t)0x1FF);
140 imm |= ~((uint64_t)0x1FFFF);
142 assert(RC1 != 0 && RC1 != 2);
148 0x4: decode CFUNCT2HIGH {
151 imm = CIMM5 | (CIMM1 << 5);
157 imm = CIMM5 | (CIMM1 << 5);
160 Rp1_sd = Rp1_sd >> imm;
165 imm |= ~((uint64_t)0x1F);
171 0x3: decode CFUNCT1 {
172 0x0: decode CFUNCT2LOW {
186 0x1: decode CFUNCT2LOW {
188 Rp1_sd = (int32_t)Rp1_sd - Rp2_sw;
191 Rp1_sd = (int32_t)Rp1_sd + Rp2_sw;
198 int64_t offset = CJUMPIMM<3:1> << 1 |
205 if (CJUMPIMM<10:10> > 0)
206 offset |= ~((int64_t)0x7FF);
208 }}, IsIndirectControl, IsUncondControl, IsCall);
211 int64_t offset = CIMM5<2:1> << 1 |
216 offset |= ~((int64_t)0xFF);
222 }}, IsDirectControl, IsCondControl);
224 int64_t offset = CIMM5<2:1> << 1 |
229 offset |= ~((int64_t)0xFF);
235 }}, IsDirectControl, IsCondControl);
238 0x2: decode COPCODE {
239 0x0: CUIOp::c_slli({{
240 imm = CIMM5 | (CIMM1 << 5);
246 format CompressedLoad {
248 ldisp = CIMM5<4:3> << 3 |
257 ldisp = CIMM5<4:2> << 2 |
267 ldisp = CIMM5<4:3> << 3 |
277 0x4: decode CFUNCT1 {
282 }}, IsIndirectControl, IsUncondControl, IsCall);
283 default: CROp::c_mv({{
289 0x0: SystemOp::c_ebreak({{
291 fault = make_shared<BreakpointFault>();
292 }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
293 default: decode RC2 {
298 }}, IsIndirectControl, IsUncondControl, IsCall);
299 default: ROp::c_add({{
300 Rc1_sd = Rc1_sd + Rc2_sd;
305 format CompressedStore {
307 sdisp = CIMM6<5:3> << 3 |
315 sdisp = CIMM6<5:2> << 2 |
323 sdisp = CIMM6<5:3> << 3 |
333 0x00: decode FUNCT3 {
359 0x01: decode FUNCT3 {
362 Fd_bits = (uint64_t)Mem_uw;
370 0x03: decode FUNCT3 {
373 }}, IsNonSpeculative, IsMemBarrier, No_OpClass);
375 }}, IsNonSpeculative, IsSerializeAfter, No_OpClass);
379 0x04: decode FUNCT3 {
382 Rd_sd = Rs1_sd + imm;
388 Rd = (Rs1_sd < imm) ? 1 : 0;
391 Rd = (Rs1 < (uint64_t)imm) ? 1 : 0;
394 Rd = Rs1 ^ (uint64_t)imm;
401 Rd_sd = Rs1_sd >> SHAMT6;
405 Rd = Rs1 | (uint64_t)imm;
408 Rd = Rs1 & (uint64_t)imm;
417 0x06: decode FUNCT3 {
420 Rd_sd = (int32_t)Rs1 + (int32_t)imm;
423 Rd_sd = Rs1_sw << SHAMT5;
427 Rd = Rs1_uw >> SHAMT5;
430 Rd_sd = Rs1_sw >> SHAMT5;
436 0x08: decode FUNCT3 {
453 0x09: decode FUNCT3 {
456 Mem_uw = (uint32_t)Fs2_bits;
464 0x0b: decode FUNCT3 {
465 0x2: decode AMOFUNCT {
466 0x2: LoadReserved::lr_w({{
469 0x3: StoreCond::sc_w({{
473 }}, inst_flags=IsStoreConditional, mem_flags=LLSC);
475 0x0: amoadd_w({{Rt_sd = Mem_sw;}}, {{
476 Mem_sw = Rs2_sw + Rt_sd;
479 0x1: amoswap_w({{Rt_sd = Mem_sw;}}, {{
483 0x4: amoxor_w({{Rt_sd = Mem_sw;}}, {{
484 Mem_sw = Rs2_uw^Rt_sd;
487 0x8: amoor_w({{Rt_sd = Mem_sw;}}, {{
488 Mem_sw = Rs2_uw | Rt_sd;
491 0xc: amoand_w({{Rt_sd = Mem_sw;}}, {{
492 Mem_sw = Rs2_uw&Rt_sd;
495 0x10: amomin_w({{Rt_sd = Mem_sw;}}, {{
496 Mem_sw = min<int32_t>(Rs2_sw, Rt_sd);
499 0x14: amomax_w({{Rt_sd = Mem_sw;}}, {{
500 Mem_sw = max<int32_t>(Rs2_sw, Rt_sd);
503 0x18: amominu_w({{Rt_sd = Mem_sw;}}, {{
504 Mem_sw = min<uint32_t>(Rs2_uw, Rt_sd);
507 0x1c: amomaxu_w({{Rt_sd = Mem_sw;}}, {{
508 Mem_sw = max<uint32_t>(Rs2_uw, Rt_sd);
513 0x3: decode AMOFUNCT {
514 0x2: LoadReserved::lr_d({{
517 0x3: StoreCond::sc_d({{
521 }}, mem_flags=LLSC, inst_flags=IsStoreConditional);
523 0x0: amoadd_d({{Rt_sd = Mem_sd;}}, {{
524 Mem_sd = Rs2_sd + Rt_sd;
527 0x1: amoswap_d({{Rt = Mem;}}, {{
531 0x4: amoxor_d({{Rt = Mem;}}, {{
535 0x8: amoor_d({{Rt = Mem;}}, {{
539 0xc: amoand_d({{Rt = Mem;}}, {{
543 0x10: amomin_d({{Rt_sd = Mem_sd;}}, {{
544 Mem_sd = min(Rs2_sd, Rt_sd);
547 0x14: amomax_d({{Rt_sd = Mem_sd;}}, {{
548 Mem_sd = max(Rs2_sd, Rt_sd);
551 0x18: amominu_d({{Rt = Mem;}}, {{
555 0x1c: amomaxu_d({{Rt = Mem;}}, {{
562 0x0c: decode FUNCT3 {
566 Rd = Rs1_sd + Rs2_sd;
572 Rd = Rs1_sd - Rs2_sd;
577 Rd = Rs1 << Rs2<5:0>;
580 bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
582 uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd);
583 uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32;
584 uint64_t Rs2_lo = (uint32_t)abs(Rs2_sd);
585 uint64_t Rs2_hi = (uint64_t)abs(Rs2_sd) >> 32;
587 uint64_t hi = Rs1_hi*Rs2_hi;
588 uint64_t mid1 = Rs1_hi*Rs2_lo;
589 uint64_t mid2 = Rs1_lo*Rs2_hi;
590 uint64_t lo = Rs2_lo*Rs1_lo;
591 uint64_t carry = ((uint64_t)(uint32_t)mid1
592 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
598 Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0)
604 Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
607 bool negate = Rs1_sd < 0;
608 uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd);
609 uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32;
610 uint64_t Rs2_lo = (uint32_t)Rs2;
611 uint64_t Rs2_hi = Rs2 >> 32;
613 uint64_t hi = Rs1_hi*Rs2_hi;
614 uint64_t mid1 = Rs1_hi*Rs2_lo;
615 uint64_t mid2 = Rs1_lo*Rs2_hi;
616 uint64_t lo = Rs1_lo*Rs2_lo;
617 uint64_t carry = ((uint64_t)(uint32_t)mid1
618 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
624 Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
629 Rd = (Rs1 < Rs2) ? 1 : 0;
632 uint64_t Rs1_lo = (uint32_t)Rs1;
633 uint64_t Rs1_hi = Rs1 >> 32;
634 uint64_t Rs2_lo = (uint32_t)Rs2;
635 uint64_t Rs2_hi = Rs2 >> 32;
637 uint64_t hi = Rs1_hi*Rs2_hi;
638 uint64_t mid1 = Rs1_hi*Rs2_lo;
639 uint64_t mid2 = Rs1_lo*Rs2_hi;
640 uint64_t lo = Rs1_lo*Rs2_lo;
641 uint64_t carry = ((uint64_t)(uint32_t)mid1
642 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
644 Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
654 } else if (Rs1_sd == numeric_limits<int64_t>::min()
656 Rd_sd = numeric_limits<int64_t>::min();
658 Rd_sd = Rs1_sd/Rs2_sd;
664 Rd = Rs1 >> Rs2<5:0>;
668 Rd = numeric_limits<uint64_t>::max();
674 Rd_sd = Rs1_sd >> Rs2<5:0>;
684 } else if (Rs1_sd == numeric_limits<int64_t>::min()
711 0x0e: decode FUNCT3 {
715 Rd_sd = Rs1_sw + Rs2_sw;
718 Rd_sd = (int32_t)(Rs1_sw*Rs2_sw);
721 Rd_sd = Rs1_sw - Rs2_sw;
725 Rd_sd = Rs1_sw << Rs2<4:0>;
730 } else if (Rs1_sw == numeric_limits<int32_t>::min()
732 Rd_sd = numeric_limits<int32_t>::min();
734 Rd_sd = Rs1_sw/Rs2_sw;
739 Rd_uw = Rs1_uw >> Rs2<4:0>;
743 Rd_sd = numeric_limits<IntReg>::max();
745 Rd_sd = (int32_t)(Rs1_uw/Rs2_uw);
749 Rd_sd = Rs1_sw >> Rs2<4:0>;
755 } else if (Rs1_sw == numeric_limits<int32_t>::min()
759 Rd_sd = Rs1_sw%Rs2_sw;
764 Rd_sd = (int32_t)Rs1_uw;
766 Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
773 0x10: decode FUNCT2 {
776 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
777 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
778 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
781 if (isnan(fs1) || isnan(fs2) || isnan(fs3)) {
782 if (issignalingnan(fs1) || issignalingnan(fs2)
783 || issignalingnan(fs3)) {
784 FFLAGS |= FloatInvalid;
786 fd = numeric_limits<float>::quiet_NaN();
787 } else if (isinf(fs1) || isinf(fs2) ||
789 if (signbit(fs1) == signbit(fs2)
791 fd = numeric_limits<float>::infinity();
792 } else if (signbit(fs1) != signbit(fs2)
794 fd = -numeric_limits<float>::infinity();
795 } else { // Fs3_sf is infinity
801 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
804 if (isnan(Fs1) || isnan(Fs2) || isnan(Fs3)) {
805 if (issignalingnan(Fs1) || issignalingnan(Fs2)
806 || issignalingnan(Fs3)) {
807 FFLAGS |= FloatInvalid;
809 Fd = numeric_limits<double>::quiet_NaN();
810 } else if (isinf(Fs1) || isinf(Fs2) ||
812 if (signbit(Fs1) == signbit(Fs2)
814 Fd = numeric_limits<double>::infinity();
815 } else if (signbit(Fs1) != signbit(Fs2)
817 Fd = -numeric_limits<double>::infinity();
826 0x11: decode FUNCT2 {
829 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
830 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
831 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
834 if (isnan(fs1) || isnan(fs2) || isnan(fs3)) {
835 if (issignalingnan(fs1) || issignalingnan(fs2)
836 || issignalingnan(fs3)) {
837 FFLAGS |= FloatInvalid;
839 fd = numeric_limits<float>::quiet_NaN();
840 } else if (isinf(fs1) || isinf(fs2) ||
842 if (signbit(fs1) == signbit(fs2)
844 fd = numeric_limits<float>::infinity();
845 } else if (signbit(fs1) != signbit(fs2)
847 fd = -numeric_limits<float>::infinity();
848 } else { // Fs3_sf is infinity
854 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
857 if (isnan(Fs1) || isnan(Fs2) || isnan(Fs3)) {
858 if (issignalingnan(Fs1) || issignalingnan(Fs2)
859 || issignalingnan(Fs3)) {
860 FFLAGS |= FloatInvalid;
862 Fd = numeric_limits<double>::quiet_NaN();
863 } else if (isinf(Fs1) || isinf(Fs2) ||
865 if (signbit(Fs1) == signbit(Fs2)
867 Fd = numeric_limits<double>::infinity();
868 } else if (signbit(Fs1) != signbit(Fs2)
870 Fd = -numeric_limits<double>::infinity();
879 0x12: decode FUNCT2 {
882 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
883 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
884 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
887 if (isnan(fs1) || isnan(fs2) || isnan(fs3)) {
888 if (issignalingnan(fs1) || issignalingnan(fs2)
889 || issignalingnan(fs3)) {
890 FFLAGS |= FloatInvalid;
892 fd = numeric_limits<float>::quiet_NaN();
893 } else if (isinf(fs1) || isinf(fs2) ||
895 if (signbit(fs1) == signbit(fs2)
897 fd = -numeric_limits<float>::infinity();
898 } else if (signbit(fs1) != signbit(fs2)
900 fd = numeric_limits<float>::infinity();
901 } else { // Fs3_sf is infinity
905 fd = -(fs1*fs2 - fs3);
907 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
910 if (isnan(Fs1) || isnan(Fs2) || isnan(Fs3)) {
911 if (issignalingnan(Fs1) || issignalingnan(Fs2)
912 || issignalingnan(Fs3)) {
913 FFLAGS |= FloatInvalid;
915 Fd = numeric_limits<double>::quiet_NaN();
916 } else if (isinf(Fs1) || isinf(Fs2)
918 if (signbit(Fs1) == signbit(Fs2)
920 Fd = -numeric_limits<double>::infinity();
921 } else if (signbit(Fs1) != signbit(Fs2)
923 Fd = numeric_limits<double>::infinity();
928 Fd = -(Fs1*Fs2 - Fs3);
932 0x13: decode FUNCT2 {
935 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
936 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
937 float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
940 if (isnan(fs1) || isnan(fs2) || isnan(fs3)) {
941 if (issignalingnan(fs1) || issignalingnan(fs2)
942 || issignalingnan(fs3)) {
943 FFLAGS |= FloatInvalid;
945 fd = numeric_limits<float>::quiet_NaN();
946 } else if (isinf(fs1) || isinf(fs2) ||
948 if (signbit(fs1) == signbit(fs2)
950 fd = -numeric_limits<float>::infinity();
951 } else if (signbit(fs1) != signbit(fs2)
953 fd = numeric_limits<float>::infinity();
954 } else { // Fs3_sf is infinity
958 fd = -(fs1*fs2 + fs3);
960 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
963 if (isnan(Fs1) || isnan(Fs2) || isnan(Fs3)) {
964 if (issignalingnan(Fs1) || issignalingnan(Fs2)
965 || issignalingnan(Fs3)) {
966 FFLAGS |= FloatInvalid;
968 Fd = numeric_limits<double>::quiet_NaN();
969 } else if (isinf(Fs1) || isinf(Fs2) ||
971 if (signbit(Fs1) == signbit(Fs2)
973 Fd = -numeric_limits<double>::infinity();
974 } else if (signbit(Fs1) != signbit(Fs2)
976 Fd = numeric_limits<double>::infinity();
981 Fd = -(Fs1*Fs2 + Fs3);
985 0x14: decode FUNCT7 {
988 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
989 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
992 if (isnan(fs1) || isnan(fs2)) {
993 if (issignalingnan(fs1) || issignalingnan(fs2)) {
994 FFLAGS |= FloatInvalid;
996 fd = numeric_limits<float>::quiet_NaN();
1000 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1003 if (isnan(Fs1) || isnan(Fs2)) {
1004 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1005 FFLAGS |= FloatInvalid;
1007 Fd = numeric_limits<double>::quiet_NaN();
1014 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1015 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1018 if (isnan(fs1) || isnan(fs2)) {
1019 if (issignalingnan(fs1) || issignalingnan(fs2)) {
1020 FFLAGS |= FloatInvalid;
1022 fd = numeric_limits<float>::quiet_NaN();
1026 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1029 if (isnan(Fs1) || isnan(Fs2)) {
1030 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1031 FFLAGS |= FloatInvalid;
1033 Fd = numeric_limits<double>::quiet_NaN();
1040 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1041 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1044 if (isnan(fs1) || isnan(fs2)) {
1045 if (issignalingnan(fs1) || issignalingnan(fs2)) {
1046 FFLAGS |= FloatInvalid;
1048 fd = numeric_limits<float>::quiet_NaN();
1052 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1055 if (isnan(Fs1) || isnan(Fs2)) {
1056 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1057 FFLAGS |= FloatInvalid;
1059 Fd = numeric_limits<double>::quiet_NaN();
1066 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1067 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1070 if (isnan(fs1) || isnan(fs2)) {
1071 if (issignalingnan(fs1) || issignalingnan(fs2)) {
1072 FFLAGS |= FloatInvalid;
1074 fd = numeric_limits<float>::quiet_NaN();
1078 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1081 if (isnan(Fs1) || isnan(Fs2)) {
1082 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1083 FFLAGS |= FloatInvalid;
1085 Fd = numeric_limits<double>::quiet_NaN();
1090 0x10: decode ROUND_MODE {
1093 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1094 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1097 if (issignalingnan(fs1)) {
1098 fd = numeric_limits<float>::signaling_NaN();
1099 feclearexcept(FE_INVALID);
1101 fd = copysign(fs1, fs2);
1103 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1107 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1108 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1111 if (issignalingnan(fs1)) {
1112 fd = numeric_limits<float>::signaling_NaN();
1113 feclearexcept(FE_INVALID);
1115 fd = copysign(fs1, -fs2);
1117 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1121 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1122 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1125 if (issignalingnan(fs1)) {
1126 fd = numeric_limits<float>::signaling_NaN();
1127 feclearexcept(FE_INVALID);
1129 fd = fs1*(signbit(fs2) ? -1.0 : 1.0);
1131 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1134 0x11: decode ROUND_MODE {
1136 if (issignalingnan(Fs1)) {
1137 Fd = numeric_limits<double>::signaling_NaN();
1138 feclearexcept(FE_INVALID);
1140 Fd = copysign(Fs1, Fs2);
1144 if (issignalingnan(Fs1)) {
1145 Fd = numeric_limits<double>::signaling_NaN();
1146 feclearexcept(FE_INVALID);
1148 Fd = copysign(Fs1, -Fs2);
1152 if (issignalingnan(Fs1)) {
1153 Fd = numeric_limits<double>::signaling_NaN();
1154 feclearexcept(FE_INVALID);
1156 Fd = Fs1*(signbit(Fs2) ? -1.0 : 1.0);
1160 0x14: decode ROUND_MODE {
1163 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1164 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1167 if (issignalingnan(fs2)) {
1169 FFLAGS |= FloatInvalid;
1170 } else if (issignalingnan(fs1)) {
1172 FFLAGS |= FloatInvalid;
1174 fd = fmin(fs1, fs2);
1176 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1180 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1181 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1184 if (issignalingnan(fs2)) {
1186 FFLAGS |= FloatInvalid;
1187 } else if (issignalingnan(fs1)) {
1189 FFLAGS |= FloatInvalid;
1191 fd = fmax(fs1, fs2);
1193 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1196 0x15: decode ROUND_MODE {
1198 if (issignalingnan(Fs2)) {
1200 FFLAGS |= FloatInvalid;
1201 } else if (issignalingnan(Fs1)) {
1203 FFLAGS |= FloatInvalid;
1205 Fd = fmin(Fs1, Fs2);
1209 if (issignalingnan(Fs2)) {
1211 FFLAGS |= FloatInvalid;
1212 } else if (issignalingnan(Fs1)) {
1214 FFLAGS |= FloatInvalid;
1216 Fd = fmax(Fs1, Fs2);
1221 assert(CONV_SGN == 1);
1223 if (issignalingnan(Fs1)) {
1224 fd = numeric_limits<float>::quiet_NaN();
1225 FFLAGS |= FloatInvalid;
1229 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1232 assert(CONV_SGN == 0);
1234 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1236 if (issignalingnan(fs1)) {
1237 Fd = numeric_limits<double>::quiet_NaN();
1238 FFLAGS |= FloatInvalid;
1246 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1249 if (issignalingnan(Fs1_sf)) {
1250 FFLAGS |= FloatInvalid;
1253 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
1259 0x50: decode ROUND_MODE {
1262 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1263 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1265 if (isnan(fs1) || isnan(fs2)) {
1266 FFLAGS |= FloatInvalid;
1269 Rd = fs1 <= fs2 ? 1 : 0;
1274 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1275 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1277 if (isnan(fs1) || isnan(fs2)) {
1278 FFLAGS |= FloatInvalid;
1281 Rd = fs1 < fs2 ? 1 : 0;
1286 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1287 float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
1289 if (issignalingnan(fs1) || issignalingnan(fs2)) {
1290 FFLAGS |= FloatInvalid;
1292 Rd = fs1 == fs2 ? 1 : 0;
1295 0x51: decode ROUND_MODE {
1297 if (isnan(Fs1) || isnan(Fs2)) {
1298 FFLAGS |= FloatInvalid;
1301 Rd = Fs1 <= Fs2 ? 1 : 0;
1305 if (isnan(Fs1) || isnan(Fs2)) {
1306 FFLAGS |= FloatInvalid;
1309 Rd = Fs1 < Fs2 ? 1 : 0;
1313 if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
1314 FFLAGS |= FloatInvalid;
1316 Rd = Fs1 == Fs2 ? 1 : 0;
1319 0x60: decode CONV_SGN {
1322 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1325 Rd_sd = numeric_limits<int32_t>::max();
1326 FFLAGS |= FloatInvalid;
1328 Rd_sd = (int32_t)fs1;
1329 if (fetestexcept(FE_INVALID)) {
1331 Rd_sd = numeric_limits<int32_t>::min();
1333 Rd_sd = numeric_limits<int32_t>::max();
1335 feclearexcept(FE_INEXACT);
1341 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1345 FFLAGS |= FloatInvalid;
1348 if (fetestexcept(FE_INVALID)) {
1349 Rd = numeric_limits<uint64_t>::max();
1350 feclearexcept(FE_INEXACT);
1356 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1359 Rd_sd = numeric_limits<int64_t>::max();
1360 FFLAGS |= FloatInvalid;
1362 Rd_sd = (int64_t)fs1;
1363 if (fetestexcept(FE_INVALID)) {
1365 Rd_sd = numeric_limits<int64_t>::min();
1367 Rd_sd = numeric_limits<int64_t>::max();
1369 feclearexcept(FE_INEXACT);
1375 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1379 FFLAGS |= FloatInvalid;
1382 if (fetestexcept(FE_INVALID)) {
1383 Rd = numeric_limits<uint64_t>::max();
1384 feclearexcept(FE_INEXACT);
1389 0x61: decode CONV_SGN {
1391 Rd_sd = (int32_t)Fs1;
1392 if (fetestexcept(FE_INVALID)) {
1394 Rd_sd = numeric_limits<int32_t>::min();
1396 Rd_sd = numeric_limits<int32_t>::max();
1398 feclearexcept(FE_INEXACT);
1404 FFLAGS |= FloatInvalid;
1407 if (fetestexcept(FE_INVALID)) {
1408 Rd = numeric_limits<uint64_t>::max();
1409 feclearexcept(FE_INEXACT);
1415 if (fetestexcept(FE_INVALID)) {
1417 Rd_sd = numeric_limits<int64_t>::min();
1419 Rd_sd = numeric_limits<int64_t>::max();
1421 feclearexcept(FE_INEXACT);
1427 FFLAGS |= FloatInvalid;
1430 if (fetestexcept(FE_INVALID)) {
1431 Rd = numeric_limits<uint64_t>::max();
1432 feclearexcept(FE_INEXACT);
1437 0x68: decode CONV_SGN {
1439 float temp = (float)Rs1_sw;
1440 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1443 float temp = (float)Rs1_uw;
1444 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1447 float temp = (float)Rs1_sd;
1448 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1451 float temp = (float)Rs1;
1452 Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
1455 0x69: decode CONV_SGN {
1457 Fd = (double)Rs1_sw;
1460 Fd = (double)Rs1_uw;
1463 Fd = (double)Rs1_sd;
1469 0x70: decode ROUND_MODE {
1471 Rd = (uint32_t)Fs1_bits;
1472 if ((Rd&0x80000000) != 0) {
1473 Rd |= (0xFFFFFFFFULL << 32);
1478 float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
1479 switch (fpclassify(fs1)) {
1488 if (issignalingnan(fs1)) {
1516 panic("Unknown classification for operand.");
1521 0x71: decode ROUND_MODE {
1526 switch (fpclassify(Fs1)) {
1535 if (issignalingnan(Fs1)) {
1563 panic("Unknown classification for operand.");
1569 Fd_bits = (uint64_t)Rs1_uw;
1577 0x18: decode FUNCT3 {
1585 }}, IsDirectControl, IsCondControl);
1592 }}, IsDirectControl, IsCondControl);
1594 if (Rs1_sd < Rs2_sd) {
1599 }}, IsDirectControl, IsCondControl);
1601 if (Rs1_sd >= Rs2_sd) {
1606 }}, IsDirectControl, IsCondControl);
1613 }}, IsDirectControl, IsCondControl);
1620 }}, IsDirectControl, IsCondControl);
1624 0x19: decode FUNCT3 {
1627 NPC = (imm + Rs1) & (~0x1);
1628 }}, IsIndirectControl, IsUncondControl, IsCall);
1634 }}, IsDirectControl, IsUncondControl, IsCall);
1636 0x1c: decode FUNCT3 {
1638 0x0: decode FUNCT12 {
1640 fault = make_shared<SyscallFault>();
1641 }}, IsSerializeAfter, IsNonSpeculative, IsSyscall,
1644 fault = make_shared<BreakpointFault>();
1645 }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
1647 fault = make_shared<UnimplementedFault>("eret");
1653 Rd = xc->readMiscReg(csr);
1654 xc->setMiscReg(csr, Rs1);
1655 }}, IsNonSpeculative, No_OpClass);
1657 Rd = xc->readMiscReg(csr);
1659 xc->setMiscReg(csr, Rd | Rs1);
1661 }}, IsNonSpeculative, No_OpClass);
1663 Rd = xc->readMiscReg(csr);
1665 xc->setMiscReg(csr, Rd & ~Rs1);
1667 }}, IsNonSpeculative, No_OpClass);
1669 Rd = xc->readMiscReg(csr);
1670 xc->setMiscReg(csr, uimm);
1671 }}, IsNonSpeculative, No_OpClass);
1673 Rd = xc->readMiscReg(csr);
1675 xc->setMiscReg(csr, Rd | uimm);
1677 }}, IsNonSpeculative, No_OpClass);
1679 Rd = xc->readMiscReg(csr);
1681 xc->setMiscReg(csr, Rd & ~uimm);
1683 }}, IsNonSpeculative, No_OpClass);