decoder.isa revision 11725
111723Sar4jc@virginia.edu// -*- mode:c++ -*-
211723Sar4jc@virginia.edu
311723Sar4jc@virginia.edu// Copyright (c) 2015 RISC-V Foundation
411723Sar4jc@virginia.edu// Copyright (c) 2016 The University of Virginia
511723Sar4jc@virginia.edu// All rights reserved.
611723Sar4jc@virginia.edu//
711723Sar4jc@virginia.edu// Redistribution and use in source and binary forms, with or without
811723Sar4jc@virginia.edu// modification, are permitted provided that the following conditions are
911723Sar4jc@virginia.edu// met: redistributions of source code must retain the above copyright
1011723Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer;
1111723Sar4jc@virginia.edu// redistributions in binary form must reproduce the above copyright
1211723Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer in the
1311723Sar4jc@virginia.edu// documentation and/or other materials provided with the distribution;
1411723Sar4jc@virginia.edu// neither the name of the copyright holders nor the names of its
1511723Sar4jc@virginia.edu// contributors may be used to endorse or promote products derived from
1611723Sar4jc@virginia.edu// this software without specific prior written permission.
1711723Sar4jc@virginia.edu//
1811723Sar4jc@virginia.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1911723Sar4jc@virginia.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2011723Sar4jc@virginia.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2111723Sar4jc@virginia.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2211723Sar4jc@virginia.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2311723Sar4jc@virginia.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2411723Sar4jc@virginia.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2511723Sar4jc@virginia.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2611723Sar4jc@virginia.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2711723Sar4jc@virginia.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2811723Sar4jc@virginia.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2911723Sar4jc@virginia.edu//
3011723Sar4jc@virginia.edu// Authors: Alec Roelke
3111723Sar4jc@virginia.edu
3211723Sar4jc@virginia.edu////////////////////////////////////////////////////////////////////
3311723Sar4jc@virginia.edu//
3411723Sar4jc@virginia.edu// The RISC-V ISA decoder
3511723Sar4jc@virginia.edu//
3611723Sar4jc@virginia.edu
3711723Sar4jc@virginia.edudecode OPCODE default Unknown::unknown() {
3811723Sar4jc@virginia.edu    0x03: decode FUNCT3 {
3911723Sar4jc@virginia.edu        format Load {
4011723Sar4jc@virginia.edu            0x0: lb({{
4111723Sar4jc@virginia.edu                Rd_sd = Mem_sb;
4211723Sar4jc@virginia.edu            }});
4311723Sar4jc@virginia.edu            0x1: lh({{
4411723Sar4jc@virginia.edu                Rd_sd = Mem_sh;
4511723Sar4jc@virginia.edu            }});
4611723Sar4jc@virginia.edu            0x2: lw({{
4711723Sar4jc@virginia.edu                Rd_sd = Mem_sw;
4811723Sar4jc@virginia.edu            }});
4911723Sar4jc@virginia.edu            0x3: ld({{
5011723Sar4jc@virginia.edu                Rd_sd = Mem_sd;
5111723Sar4jc@virginia.edu            }});
5211723Sar4jc@virginia.edu            0x4: lbu({{
5311723Sar4jc@virginia.edu                Rd = Mem_ub;
5411723Sar4jc@virginia.edu            }});
5511723Sar4jc@virginia.edu            0x5: lhu({{
5611723Sar4jc@virginia.edu                Rd = Mem_uh;
5711723Sar4jc@virginia.edu            }});
5811723Sar4jc@virginia.edu            0x6: lwu({{
5911723Sar4jc@virginia.edu                Rd = Mem_uw;
6011723Sar4jc@virginia.edu            }});
6111723Sar4jc@virginia.edu        }
6211723Sar4jc@virginia.edu    }
6311723Sar4jc@virginia.edu
6411725Sar4jc@virginia.edu    0x07: decode FUNCT3 {
6511725Sar4jc@virginia.edu        format Load {
6611725Sar4jc@virginia.edu            0x2: flw({{
6711725Sar4jc@virginia.edu                Fd_bits = (uint64_t)Mem_uw;
6811725Sar4jc@virginia.edu            }});
6911725Sar4jc@virginia.edu            0x3: fld({{
7011725Sar4jc@virginia.edu                Fd_bits = Mem;
7111725Sar4jc@virginia.edu            }});
7211725Sar4jc@virginia.edu        }
7311725Sar4jc@virginia.edu    }
7411725Sar4jc@virginia.edu
7511723Sar4jc@virginia.edu    0x0f: decode FUNCT3 {
7611723Sar4jc@virginia.edu        format IOp {
7711723Sar4jc@virginia.edu            0x0: fence({{
7811723Sar4jc@virginia.edu            }}, IsNonSpeculative, IsMemBarrier, No_OpClass);
7911723Sar4jc@virginia.edu            0x1: fence_i({{
8011723Sar4jc@virginia.edu            }}, IsNonSpeculative, IsSerializeAfter, No_OpClass);
8111723Sar4jc@virginia.edu        }
8211723Sar4jc@virginia.edu    }
8311723Sar4jc@virginia.edu
8411723Sar4jc@virginia.edu    0x13: decode FUNCT3 {
8511723Sar4jc@virginia.edu        format IOp {
8611723Sar4jc@virginia.edu            0x0: addi({{
8711723Sar4jc@virginia.edu                Rd_sd = Rs1_sd + imm;
8811723Sar4jc@virginia.edu            }});
8911723Sar4jc@virginia.edu            0x1: slli({{
9011723Sar4jc@virginia.edu                Rd = Rs1 << SHAMT6;
9111723Sar4jc@virginia.edu            }});
9211723Sar4jc@virginia.edu            0x2: slti({{
9311723Sar4jc@virginia.edu                Rd = (Rs1_sd < imm) ? 1 : 0;
9411723Sar4jc@virginia.edu            }});
9511723Sar4jc@virginia.edu            0x3: sltiu({{
9611723Sar4jc@virginia.edu                Rd = (Rs1 < (uint64_t)imm) ? 1 : 0;
9711723Sar4jc@virginia.edu            }});
9811723Sar4jc@virginia.edu            0x4: xori({{
9911723Sar4jc@virginia.edu                Rd = Rs1 ^ (uint64_t)imm;
10011723Sar4jc@virginia.edu            }});
10111723Sar4jc@virginia.edu            0x5: decode SRTYPE {
10211723Sar4jc@virginia.edu                0x0: srli({{
10311723Sar4jc@virginia.edu                    Rd = Rs1 >> SHAMT6;
10411723Sar4jc@virginia.edu                }});
10511723Sar4jc@virginia.edu                0x1: srai({{
10611723Sar4jc@virginia.edu                    Rd_sd = Rs1_sd >> SHAMT6;
10711723Sar4jc@virginia.edu                }});
10811723Sar4jc@virginia.edu            }
10911723Sar4jc@virginia.edu            0x6: ori({{
11011723Sar4jc@virginia.edu                Rd = Rs1 | (uint64_t)imm;
11111723Sar4jc@virginia.edu            }});
11211723Sar4jc@virginia.edu            0x7: andi({{
11311723Sar4jc@virginia.edu                Rd = Rs1 & (uint64_t)imm;
11411723Sar4jc@virginia.edu            }});
11511723Sar4jc@virginia.edu        }
11611723Sar4jc@virginia.edu    }
11711723Sar4jc@virginia.edu
11811723Sar4jc@virginia.edu    0x17: UOp::auipc({{
11911723Sar4jc@virginia.edu        Rd = PC + imm;
12011723Sar4jc@virginia.edu    }});
12111723Sar4jc@virginia.edu
12211723Sar4jc@virginia.edu    0x1b: decode FUNCT3 {
12311723Sar4jc@virginia.edu        format IOp {
12411723Sar4jc@virginia.edu            0x0: addiw({{
12511723Sar4jc@virginia.edu                Rd_sd = (int32_t)Rs1 + (int32_t)imm;
12611723Sar4jc@virginia.edu            }});
12711723Sar4jc@virginia.edu            0x1: slliw({{
12811723Sar4jc@virginia.edu                Rd_sd = Rs1_sw << SHAMT5;
12911723Sar4jc@virginia.edu            }});
13011723Sar4jc@virginia.edu            0x5: decode SRTYPE {
13111723Sar4jc@virginia.edu                0x0: srliw({{
13211723Sar4jc@virginia.edu                    Rd = Rs1_uw >> SHAMT5;
13311723Sar4jc@virginia.edu                }});
13411723Sar4jc@virginia.edu                0x1: sraiw({{
13511723Sar4jc@virginia.edu                    Rd_sd = Rs1_sw >> SHAMT5;
13611723Sar4jc@virginia.edu                }});
13711723Sar4jc@virginia.edu            }
13811723Sar4jc@virginia.edu        }
13911723Sar4jc@virginia.edu    }
14011723Sar4jc@virginia.edu
14111723Sar4jc@virginia.edu    0x23: decode FUNCT3 {
14211723Sar4jc@virginia.edu        format Store {
14311723Sar4jc@virginia.edu            0x0: sb({{
14411723Sar4jc@virginia.edu                Mem_ub = Rs2_ub;
14511723Sar4jc@virginia.edu            }});
14611723Sar4jc@virginia.edu            0x1: sh({{
14711723Sar4jc@virginia.edu                Mem_uh = Rs2_uh;
14811723Sar4jc@virginia.edu            }});
14911723Sar4jc@virginia.edu            0x2: sw({{
15011723Sar4jc@virginia.edu                Mem_uw = Rs2_uw;
15111723Sar4jc@virginia.edu            }});
15211723Sar4jc@virginia.edu            0x3: sd({{
15311723Sar4jc@virginia.edu                Mem_ud = Rs2_ud;
15411723Sar4jc@virginia.edu            }});
15511723Sar4jc@virginia.edu        }
15611723Sar4jc@virginia.edu    }
15711723Sar4jc@virginia.edu
15811725Sar4jc@virginia.edu    0x27: decode FUNCT3 {
15911725Sar4jc@virginia.edu        format Store {
16011725Sar4jc@virginia.edu            0x2: fsw({{
16111725Sar4jc@virginia.edu                Mem_uw = (uint32_t)Fs2_bits;
16211725Sar4jc@virginia.edu            }});
16311725Sar4jc@virginia.edu            0x3: fsd({{
16411725Sar4jc@virginia.edu                Mem_ud = Fs2_bits;
16511725Sar4jc@virginia.edu            }});
16611725Sar4jc@virginia.edu        }
16711725Sar4jc@virginia.edu    }
16811725Sar4jc@virginia.edu
16911723Sar4jc@virginia.edu    0x33: decode FUNCT3 {
17011723Sar4jc@virginia.edu        format ROp {
17111723Sar4jc@virginia.edu            0x0: decode FUNCT7 {
17211723Sar4jc@virginia.edu                0x0: add({{
17311723Sar4jc@virginia.edu                    Rd = Rs1_sd + Rs2_sd;
17411723Sar4jc@virginia.edu                }});
17511724Sar4jc@virginia.edu                0x1: mul({{
17611724Sar4jc@virginia.edu                    Rd = Rs1_sd*Rs2_sd;
17711724Sar4jc@virginia.edu                }}, IntMultOp);
17811723Sar4jc@virginia.edu                0x20: sub({{
17911723Sar4jc@virginia.edu                    Rd = Rs1_sd - Rs2_sd;
18011723Sar4jc@virginia.edu                }});
18111723Sar4jc@virginia.edu            }
18211723Sar4jc@virginia.edu            0x1: decode FUNCT7 {
18311723Sar4jc@virginia.edu                0x0: sll({{
18411723Sar4jc@virginia.edu                    Rd = Rs1 << Rs2<5:0>;
18511723Sar4jc@virginia.edu                }});
18611724Sar4jc@virginia.edu                0x1: mulh({{
18711724Sar4jc@virginia.edu                    bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
18811724Sar4jc@virginia.edu
18911724Sar4jc@virginia.edu                    uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
19011724Sar4jc@virginia.edu                    uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
19111724Sar4jc@virginia.edu                    uint64_t Rs2_lo = (uint32_t)std::abs(Rs2_sd);
19211724Sar4jc@virginia.edu                    uint64_t Rs2_hi = (uint64_t)std::abs(Rs2_sd) >> 32;
19311724Sar4jc@virginia.edu
19411724Sar4jc@virginia.edu                    uint64_t hi = Rs1_hi*Rs2_hi;
19511724Sar4jc@virginia.edu                    uint64_t mid1 = Rs1_hi*Rs2_lo;
19611724Sar4jc@virginia.edu                    uint64_t mid2 = Rs1_lo*Rs2_hi;
19711724Sar4jc@virginia.edu                    uint64_t lo = Rs2_lo*Rs1_lo;
19811724Sar4jc@virginia.edu                    uint64_t carry = ((uint64_t)(uint32_t)mid1
19911724Sar4jc@virginia.edu                            + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
20011724Sar4jc@virginia.edu
20111724Sar4jc@virginia.edu                    uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
20211724Sar4jc@virginia.edu                    Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0) : res;
20311724Sar4jc@virginia.edu                }}, IntMultOp);
20411723Sar4jc@virginia.edu            }
20511723Sar4jc@virginia.edu            0x2: decode FUNCT7 {
20611723Sar4jc@virginia.edu                0x0: slt({{
20711723Sar4jc@virginia.edu                    Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
20811723Sar4jc@virginia.edu                }});
20911724Sar4jc@virginia.edu                0x1: mulhsu({{
21011724Sar4jc@virginia.edu                    bool negate = Rs1_sd < 0;
21111724Sar4jc@virginia.edu                    uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
21211724Sar4jc@virginia.edu                    uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
21311724Sar4jc@virginia.edu                    uint64_t Rs2_lo = (uint32_t)Rs2;
21411724Sar4jc@virginia.edu                    uint64_t Rs2_hi = Rs2 >> 32;
21511724Sar4jc@virginia.edu
21611724Sar4jc@virginia.edu                    uint64_t hi = Rs1_hi*Rs2_hi;
21711724Sar4jc@virginia.edu                    uint64_t mid1 = Rs1_hi*Rs2_lo;
21811724Sar4jc@virginia.edu                    uint64_t mid2 = Rs1_lo*Rs2_hi;
21911724Sar4jc@virginia.edu                    uint64_t lo = Rs1_lo*Rs2_lo;
22011724Sar4jc@virginia.edu                    uint64_t carry = ((uint64_t)(uint32_t)mid1
22111724Sar4jc@virginia.edu                            + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
22211724Sar4jc@virginia.edu
22311724Sar4jc@virginia.edu                    uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
22411724Sar4jc@virginia.edu                    Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
22511724Sar4jc@virginia.edu                }}, IntMultOp);
22611723Sar4jc@virginia.edu            }
22711723Sar4jc@virginia.edu            0x3: decode FUNCT7 {
22811723Sar4jc@virginia.edu                0x0: sltu({{
22911723Sar4jc@virginia.edu                    Rd = (Rs1 < Rs2) ? 1 : 0;
23011723Sar4jc@virginia.edu                }});
23111724Sar4jc@virginia.edu                0x1: mulhu({{
23211724Sar4jc@virginia.edu                    uint64_t Rs1_lo = (uint32_t)Rs1;
23311724Sar4jc@virginia.edu                    uint64_t Rs1_hi = Rs1 >> 32;
23411724Sar4jc@virginia.edu                    uint64_t Rs2_lo = (uint32_t)Rs2;
23511724Sar4jc@virginia.edu                    uint64_t Rs2_hi = Rs2 >> 32;
23611724Sar4jc@virginia.edu
23711724Sar4jc@virginia.edu                    uint64_t hi = Rs1_hi*Rs2_hi;
23811724Sar4jc@virginia.edu                    uint64_t mid1 = Rs1_hi*Rs2_lo;
23911724Sar4jc@virginia.edu                    uint64_t mid2 = Rs1_lo*Rs2_hi;
24011724Sar4jc@virginia.edu                    uint64_t lo = Rs1_lo*Rs2_lo;
24111724Sar4jc@virginia.edu                    uint64_t carry = ((uint64_t)(uint32_t)mid1
24211724Sar4jc@virginia.edu                            + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
24311724Sar4jc@virginia.edu
24411724Sar4jc@virginia.edu                    Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
24511724Sar4jc@virginia.edu                }}, IntMultOp);
24611723Sar4jc@virginia.edu            }
24711723Sar4jc@virginia.edu            0x4: decode FUNCT7 {
24811723Sar4jc@virginia.edu                0x0: xor({{
24911723Sar4jc@virginia.edu                    Rd = Rs1 ^ Rs2;
25011723Sar4jc@virginia.edu                }});
25111724Sar4jc@virginia.edu                0x1: div({{
25211724Sar4jc@virginia.edu                    if (Rs2_sd == 0) {
25311724Sar4jc@virginia.edu                        Rd_sd = -1;
25411724Sar4jc@virginia.edu                    } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
25511724Sar4jc@virginia.edu                            && Rs2_sd == -1) {
25611724Sar4jc@virginia.edu                        Rd_sd = std::numeric_limits<int64_t>::min();
25711724Sar4jc@virginia.edu                    } else {
25811724Sar4jc@virginia.edu                        Rd_sd = Rs1_sd/Rs2_sd;
25911724Sar4jc@virginia.edu                    }
26011724Sar4jc@virginia.edu                }}, IntDivOp);
26111723Sar4jc@virginia.edu            }
26211723Sar4jc@virginia.edu            0x5: decode FUNCT7 {
26311723Sar4jc@virginia.edu                0x0: srl({{
26411723Sar4jc@virginia.edu                    Rd = Rs1 >> Rs2<5:0>;
26511723Sar4jc@virginia.edu                }});
26611724Sar4jc@virginia.edu                0x1: divu({{
26711724Sar4jc@virginia.edu                    if (Rs2 == 0) {
26811724Sar4jc@virginia.edu                        Rd = std::numeric_limits<uint64_t>::max();
26911724Sar4jc@virginia.edu                    } else {
27011724Sar4jc@virginia.edu                        Rd = Rs1/Rs2;
27111724Sar4jc@virginia.edu                    }
27211724Sar4jc@virginia.edu                }}, IntDivOp);
27311723Sar4jc@virginia.edu                0x20: sra({{
27411723Sar4jc@virginia.edu                    Rd_sd = Rs1_sd >> Rs2<5:0>;
27511723Sar4jc@virginia.edu                }});
27611723Sar4jc@virginia.edu            }
27711723Sar4jc@virginia.edu            0x6: decode FUNCT7 {
27811723Sar4jc@virginia.edu                0x0: or({{
27911723Sar4jc@virginia.edu                    Rd = Rs1 | Rs2;
28011723Sar4jc@virginia.edu                }});
28111724Sar4jc@virginia.edu                0x1: rem({{
28211724Sar4jc@virginia.edu                    if (Rs2_sd == 0) {
28311724Sar4jc@virginia.edu                        Rd = Rs1_sd;
28411724Sar4jc@virginia.edu                    } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
28511724Sar4jc@virginia.edu                            && Rs2_sd == -1) {
28611724Sar4jc@virginia.edu                        Rd = 0;
28711724Sar4jc@virginia.edu                    } else {
28811724Sar4jc@virginia.edu                        Rd = Rs1_sd%Rs2_sd;
28911724Sar4jc@virginia.edu                    }
29011724Sar4jc@virginia.edu                }}, IntDivOp);
29111723Sar4jc@virginia.edu            }
29211723Sar4jc@virginia.edu            0x7: decode FUNCT7 {
29311723Sar4jc@virginia.edu                0x0: and({{
29411723Sar4jc@virginia.edu                    Rd = Rs1 & Rs2;
29511723Sar4jc@virginia.edu                }});
29611724Sar4jc@virginia.edu                0x1: remu({{
29711724Sar4jc@virginia.edu                    if (Rs2 == 0) {
29811724Sar4jc@virginia.edu                        Rd = Rs1;
29911724Sar4jc@virginia.edu                    } else {
30011724Sar4jc@virginia.edu                        Rd = Rs1%Rs2;
30111724Sar4jc@virginia.edu                    }
30211724Sar4jc@virginia.edu                }}, IntDivOp);
30311723Sar4jc@virginia.edu            }
30411723Sar4jc@virginia.edu        }
30511723Sar4jc@virginia.edu    }
30611723Sar4jc@virginia.edu
30711723Sar4jc@virginia.edu    0x37: UOp::lui({{
30811723Sar4jc@virginia.edu        Rd = (uint64_t)imm;
30911723Sar4jc@virginia.edu    }});
31011723Sar4jc@virginia.edu
31111723Sar4jc@virginia.edu    0x3b: decode FUNCT3 {
31211723Sar4jc@virginia.edu        format ROp {
31311723Sar4jc@virginia.edu            0x0: decode FUNCT7 {
31411723Sar4jc@virginia.edu                0x0: addw({{
31511723Sar4jc@virginia.edu                    Rd_sd = Rs1_sw + Rs2_sw;
31611723Sar4jc@virginia.edu                }});
31711724Sar4jc@virginia.edu                0x1: mulw({{
31811724Sar4jc@virginia.edu                    Rd_sd = (int32_t)(Rs1_sw*Rs2_sw);
31911724Sar4jc@virginia.edu                }}, IntMultOp);
32011723Sar4jc@virginia.edu                0x20: subw({{
32111723Sar4jc@virginia.edu                    Rd_sd = Rs1_sw - Rs2_sw;
32211723Sar4jc@virginia.edu                }});
32311723Sar4jc@virginia.edu            }
32411723Sar4jc@virginia.edu            0x1: sllw({{
32511723Sar4jc@virginia.edu                Rd_sd = Rs1_sw << Rs2<4:0>;
32611723Sar4jc@virginia.edu            }});
32711724Sar4jc@virginia.edu            0x4: divw({{
32811724Sar4jc@virginia.edu                if (Rs2_sw == 0) {
32911724Sar4jc@virginia.edu                    Rd_sd = -1;
33011724Sar4jc@virginia.edu                } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
33111724Sar4jc@virginia.edu                        && Rs2_sw == -1) {
33211724Sar4jc@virginia.edu                    Rd_sd = std::numeric_limits<int32_t>::min();
33311724Sar4jc@virginia.edu                } else {
33411724Sar4jc@virginia.edu                    Rd_sd = Rs1_sw/Rs2_sw;
33511724Sar4jc@virginia.edu                }
33611724Sar4jc@virginia.edu            }}, IntDivOp);
33711723Sar4jc@virginia.edu            0x5: decode FUNCT7 {
33811723Sar4jc@virginia.edu                0x0: srlw({{
33911723Sar4jc@virginia.edu                    Rd_uw = Rs1_uw >> Rs2<4:0>;
34011723Sar4jc@virginia.edu                }});
34111724Sar4jc@virginia.edu                0x1: divuw({{
34211724Sar4jc@virginia.edu                    if (Rs2_uw == 0) {
34311724Sar4jc@virginia.edu                        Rd_sd = std::numeric_limits<IntReg>::max();
34411724Sar4jc@virginia.edu                    } else {
34511724Sar4jc@virginia.edu                        Rd_sd = (int32_t)(Rs1_uw/Rs2_uw);
34611724Sar4jc@virginia.edu                    }
34711724Sar4jc@virginia.edu                }}, IntDivOp);
34811723Sar4jc@virginia.edu                0x20: sraw({{
34911723Sar4jc@virginia.edu                    Rd_sd = Rs1_sw >> Rs2<4:0>;
35011723Sar4jc@virginia.edu                }});
35111723Sar4jc@virginia.edu            }
35211724Sar4jc@virginia.edu            0x6: remw({{
35311724Sar4jc@virginia.edu                if (Rs2_sw == 0) {
35411724Sar4jc@virginia.edu                    Rd_sd = Rs1_sw;
35511724Sar4jc@virginia.edu                } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
35611724Sar4jc@virginia.edu                        && Rs2_sw == -1) {
35711724Sar4jc@virginia.edu                    Rd_sd = 0;
35811724Sar4jc@virginia.edu                } else {
35911724Sar4jc@virginia.edu                    Rd_sd = Rs1_sw%Rs2_sw;
36011724Sar4jc@virginia.edu                }
36111724Sar4jc@virginia.edu            }}, IntDivOp);
36211724Sar4jc@virginia.edu            0x7: remuw({{
36311724Sar4jc@virginia.edu                if (Rs2_uw == 0) {
36411724Sar4jc@virginia.edu                    Rd_sd = (int32_t)Rs1_uw;
36511724Sar4jc@virginia.edu                } else {
36611724Sar4jc@virginia.edu                    Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
36711724Sar4jc@virginia.edu                }
36811724Sar4jc@virginia.edu            }}, IntDivOp);
36911723Sar4jc@virginia.edu        }
37011723Sar4jc@virginia.edu    }
37111723Sar4jc@virginia.edu
37211725Sar4jc@virginia.edu    format FPR4Op {
37311725Sar4jc@virginia.edu        0x43: decode FUNCT2 {
37411725Sar4jc@virginia.edu            0x0: fmadd_s({{
37511725Sar4jc@virginia.edu                uint32_t temp;
37611725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
37711725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
37811725Sar4jc@virginia.edu                float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
37911725Sar4jc@virginia.edu                float fd;
38011725Sar4jc@virginia.edu
38111725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
38211725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)
38311725Sar4jc@virginia.edu                            || issignalingnan(fs3)) {
38411725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
38511725Sar4jc@virginia.edu                    }
38611725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
38711725Sar4jc@virginia.edu                } else if (std::isinf(fs1) || std::isinf(fs2) ||
38811725Sar4jc@virginia.edu                        std::isinf(fs3)) {
38911725Sar4jc@virginia.edu                    if (std::signbit(fs1) == std::signbit(fs2)
39011725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
39111725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::infinity();
39211725Sar4jc@virginia.edu                    } else if (std::signbit(fs1) != std::signbit(fs2)
39311725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
39411725Sar4jc@virginia.edu                        fd = -std::numeric_limits<float>::infinity();
39511725Sar4jc@virginia.edu                    } else { // Fs3_sf is infinity
39611725Sar4jc@virginia.edu                        fd = fs3;
39711725Sar4jc@virginia.edu                    }
39811725Sar4jc@virginia.edu                } else {
39911725Sar4jc@virginia.edu                    fd = fs1*fs2 + fs3;
40011725Sar4jc@virginia.edu                }
40111725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
40211725Sar4jc@virginia.edu            }}, FloatMultOp);
40311725Sar4jc@virginia.edu            0x1: fmadd_d({{
40411725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
40511725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)
40611725Sar4jc@virginia.edu                            || issignalingnan(Fs3)) {
40711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
40811725Sar4jc@virginia.edu                    }
40911725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
41011725Sar4jc@virginia.edu                } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
41111725Sar4jc@virginia.edu                        std::isinf(Fs3)) {
41211725Sar4jc@virginia.edu                    if (std::signbit(Fs1) == std::signbit(Fs2)
41311725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
41411725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::infinity();
41511725Sar4jc@virginia.edu                    } else if (std::signbit(Fs1) != std::signbit(Fs2)
41611725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
41711725Sar4jc@virginia.edu                        Fd = -std::numeric_limits<double>::infinity();
41811725Sar4jc@virginia.edu                    } else {
41911725Sar4jc@virginia.edu                        Fd = Fs3;
42011725Sar4jc@virginia.edu                    }
42111725Sar4jc@virginia.edu                } else {
42211725Sar4jc@virginia.edu                    Fd = Fs1*Fs2 + Fs3;
42311725Sar4jc@virginia.edu                }
42411725Sar4jc@virginia.edu            }}, FloatMultOp);
42511725Sar4jc@virginia.edu        }
42611725Sar4jc@virginia.edu        0x47: decode FUNCT2 {
42711725Sar4jc@virginia.edu            0x0: fmsub_s({{
42811725Sar4jc@virginia.edu                uint32_t temp;
42911725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
43011725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
43111725Sar4jc@virginia.edu                float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
43211725Sar4jc@virginia.edu                float fd;
43311725Sar4jc@virginia.edu
43411725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
43511725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)
43611725Sar4jc@virginia.edu                            || issignalingnan(fs3)) {
43711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
43811725Sar4jc@virginia.edu                    }
43911725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
44011725Sar4jc@virginia.edu                } else if (std::isinf(fs1) || std::isinf(fs2) ||
44111725Sar4jc@virginia.edu                        std::isinf(fs3)) {
44211725Sar4jc@virginia.edu                    if (std::signbit(fs1) == std::signbit(fs2)
44311725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
44411725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::infinity();
44511725Sar4jc@virginia.edu                    } else if (std::signbit(fs1) != std::signbit(fs2)
44611725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
44711725Sar4jc@virginia.edu                        fd = -std::numeric_limits<float>::infinity();
44811725Sar4jc@virginia.edu                    } else { // Fs3_sf is infinity
44911725Sar4jc@virginia.edu                        fd = -fs3;
45011725Sar4jc@virginia.edu                    }
45111725Sar4jc@virginia.edu                } else {
45211725Sar4jc@virginia.edu                    fd = fs1*fs2 - fs3;
45311725Sar4jc@virginia.edu                }
45411725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
45511725Sar4jc@virginia.edu            }}, FloatMultOp);
45611725Sar4jc@virginia.edu            0x1: fmsub_d({{
45711725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
45811725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)
45911725Sar4jc@virginia.edu                            || issignalingnan(Fs3)) {
46011725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
46111725Sar4jc@virginia.edu                    }
46211725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
46311725Sar4jc@virginia.edu                } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
46411725Sar4jc@virginia.edu                        std::isinf(Fs3)) {
46511725Sar4jc@virginia.edu                    if (std::signbit(Fs1) == std::signbit(Fs2)
46611725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
46711725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::infinity();
46811725Sar4jc@virginia.edu                    } else if (std::signbit(Fs1) != std::signbit(Fs2)
46911725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
47011725Sar4jc@virginia.edu                        Fd = -std::numeric_limits<double>::infinity();
47111725Sar4jc@virginia.edu                    } else {
47211725Sar4jc@virginia.edu                        Fd = -Fs3;
47311725Sar4jc@virginia.edu                    }
47411725Sar4jc@virginia.edu                } else {
47511725Sar4jc@virginia.edu                    Fd = Fs1*Fs2 - Fs3;
47611725Sar4jc@virginia.edu                }
47711725Sar4jc@virginia.edu            }}, FloatMultOp);
47811725Sar4jc@virginia.edu        }
47911725Sar4jc@virginia.edu        0x4b: decode FUNCT2 {
48011725Sar4jc@virginia.edu            0x0: fnmsub_s({{
48111725Sar4jc@virginia.edu                uint32_t temp;
48211725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
48311725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
48411725Sar4jc@virginia.edu                float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
48511725Sar4jc@virginia.edu                float fd;
48611725Sar4jc@virginia.edu
48711725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
48811725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)
48911725Sar4jc@virginia.edu                            || issignalingnan(fs3)) {
49011725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
49111725Sar4jc@virginia.edu                    }
49211725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
49311725Sar4jc@virginia.edu                } else if (std::isinf(fs1) || std::isinf(fs2) ||
49411725Sar4jc@virginia.edu                        std::isinf(fs3)) {
49511725Sar4jc@virginia.edu                    if (std::signbit(fs1) == std::signbit(fs2)
49611725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
49711725Sar4jc@virginia.edu                        fd = -std::numeric_limits<float>::infinity();
49811725Sar4jc@virginia.edu                    } else if (std::signbit(fs1) != std::signbit(fs2)
49911725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
50011725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::infinity();
50111725Sar4jc@virginia.edu                    } else { // Fs3_sf is infinity
50211725Sar4jc@virginia.edu                        fd = fs3;
50311725Sar4jc@virginia.edu                    }
50411725Sar4jc@virginia.edu                } else {
50511725Sar4jc@virginia.edu                    fd = -(fs1*fs2 - fs3);
50611725Sar4jc@virginia.edu                }
50711725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
50811725Sar4jc@virginia.edu            }}, FloatMultOp);
50911725Sar4jc@virginia.edu            0x1: fnmsub_d({{
51011725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
51111725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)
51211725Sar4jc@virginia.edu                            || issignalingnan(Fs3)) {
51311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
51411725Sar4jc@virginia.edu                    }
51511725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
51611725Sar4jc@virginia.edu                } else if (std::isinf(Fs1) || std::isinf(Fs2)
51711725Sar4jc@virginia.edu                        || std::isinf(Fs3)) {
51811725Sar4jc@virginia.edu                    if (std::signbit(Fs1) == std::signbit(Fs2)
51911725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
52011725Sar4jc@virginia.edu                        Fd = -std::numeric_limits<double>::infinity();
52111725Sar4jc@virginia.edu                    } else if (std::signbit(Fs1) != std::signbit(Fs2)
52211725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
52311725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::infinity();
52411725Sar4jc@virginia.edu                    } else {
52511725Sar4jc@virginia.edu                        Fd = Fs3;
52611725Sar4jc@virginia.edu                    }
52711725Sar4jc@virginia.edu                } else {
52811725Sar4jc@virginia.edu                    Fd = -(Fs1*Fs2 - Fs3);
52911725Sar4jc@virginia.edu                }
53011725Sar4jc@virginia.edu            }}, FloatMultOp);
53111725Sar4jc@virginia.edu        }
53211725Sar4jc@virginia.edu        0x4f: decode FUNCT2 {
53311725Sar4jc@virginia.edu            0x0: fnmadd_s({{
53411725Sar4jc@virginia.edu                uint32_t temp;
53511725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
53611725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
53711725Sar4jc@virginia.edu                float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
53811725Sar4jc@virginia.edu                float fd;
53911725Sar4jc@virginia.edu
54011725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2) || std::isnan(fs3)) {
54111725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)
54211725Sar4jc@virginia.edu                            || issignalingnan(fs3)) {
54311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
54411725Sar4jc@virginia.edu                    }
54511725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
54611725Sar4jc@virginia.edu                } else if (std::isinf(fs1) || std::isinf(fs2) ||
54711725Sar4jc@virginia.edu                        std::isinf(fs3)) {
54811725Sar4jc@virginia.edu                    if (std::signbit(fs1) == std::signbit(fs2)
54911725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
55011725Sar4jc@virginia.edu                        fd = -std::numeric_limits<float>::infinity();
55111725Sar4jc@virginia.edu                    } else if (std::signbit(fs1) != std::signbit(fs2)
55211725Sar4jc@virginia.edu                            && !std::isinf(fs3)) {
55311725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::infinity();
55411725Sar4jc@virginia.edu                    } else { // Fs3_sf is infinity
55511725Sar4jc@virginia.edu                        fd = -fs3;
55611725Sar4jc@virginia.edu                    }
55711725Sar4jc@virginia.edu                } else {
55811725Sar4jc@virginia.edu                    fd = -(fs1*fs2 + fs3);
55911725Sar4jc@virginia.edu                }
56011725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
56111725Sar4jc@virginia.edu            }}, FloatMultOp);
56211725Sar4jc@virginia.edu            0x1: fnmadd_d({{
56311725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2) || std::isnan(Fs3)) {
56411725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)
56511725Sar4jc@virginia.edu                            || issignalingnan(Fs3)) {
56611725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
56711725Sar4jc@virginia.edu                    }
56811725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
56911725Sar4jc@virginia.edu                } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
57011725Sar4jc@virginia.edu                        std::isinf(Fs3)) {
57111725Sar4jc@virginia.edu                    if (std::signbit(Fs1) == std::signbit(Fs2)
57211725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
57311725Sar4jc@virginia.edu                        Fd = -std::numeric_limits<double>::infinity();
57411725Sar4jc@virginia.edu                    } else if (std::signbit(Fs1) != std::signbit(Fs2)
57511725Sar4jc@virginia.edu                            && !std::isinf(Fs3)) {
57611725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::infinity();
57711725Sar4jc@virginia.edu                    } else {
57811725Sar4jc@virginia.edu                        Fd = -Fs3;
57911725Sar4jc@virginia.edu                    }
58011725Sar4jc@virginia.edu                } else {
58111725Sar4jc@virginia.edu                    Fd = -(Fs1*Fs2 + Fs3);
58211725Sar4jc@virginia.edu                }
58311725Sar4jc@virginia.edu            }}, FloatMultOp);
58411725Sar4jc@virginia.edu        }
58511725Sar4jc@virginia.edu    }
58611725Sar4jc@virginia.edu
58711725Sar4jc@virginia.edu    0x53: decode FUNCT7 {
58811725Sar4jc@virginia.edu        format FPROp {
58911725Sar4jc@virginia.edu            0x0: fadd_s({{
59011725Sar4jc@virginia.edu                uint32_t temp;
59111725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
59211725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
59311725Sar4jc@virginia.edu                float fd;
59411725Sar4jc@virginia.edu
59511725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2)) {
59611725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)) {
59711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
59811725Sar4jc@virginia.edu                    }
59911725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
60011725Sar4jc@virginia.edu                } else {
60111725Sar4jc@virginia.edu                    fd = fs1 + fs2;
60211725Sar4jc@virginia.edu                }
60311725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
60411725Sar4jc@virginia.edu            }}, FloatAddOp);
60511725Sar4jc@virginia.edu            0x1: fadd_d({{
60611725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2)) {
60711725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
60811725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
60911725Sar4jc@virginia.edu                    }
61011725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
61111725Sar4jc@virginia.edu                } else {
61211725Sar4jc@virginia.edu                    Fd = Fs1 + Fs2;
61311725Sar4jc@virginia.edu                }
61411725Sar4jc@virginia.edu            }}, FloatAddOp);
61511725Sar4jc@virginia.edu            0x4: fsub_s({{
61611725Sar4jc@virginia.edu                uint32_t temp;
61711725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
61811725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
61911725Sar4jc@virginia.edu                float fd;
62011725Sar4jc@virginia.edu
62111725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2)) {
62211725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)) {
62311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
62411725Sar4jc@virginia.edu                    }
62511725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
62611725Sar4jc@virginia.edu                } else {
62711725Sar4jc@virginia.edu                    fd = fs1 - fs2;
62811725Sar4jc@virginia.edu                }
62911725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
63011725Sar4jc@virginia.edu            }}, FloatAddOp);
63111725Sar4jc@virginia.edu            0x5: fsub_d({{
63211725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2)) {
63311725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
63411725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
63511725Sar4jc@virginia.edu                    }
63611725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
63711725Sar4jc@virginia.edu                } else {
63811725Sar4jc@virginia.edu                    Fd = Fs1 - Fs2;
63911725Sar4jc@virginia.edu                }
64011725Sar4jc@virginia.edu            }}, FloatAddOp);
64111725Sar4jc@virginia.edu            0x8: fmul_s({{
64211725Sar4jc@virginia.edu                uint32_t temp;
64311725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
64411725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
64511725Sar4jc@virginia.edu                float fd;
64611725Sar4jc@virginia.edu
64711725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2)) {
64811725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)) {
64911725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
65011725Sar4jc@virginia.edu                    }
65111725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
65211725Sar4jc@virginia.edu                } else {
65311725Sar4jc@virginia.edu                    fd = fs1*fs2;
65411725Sar4jc@virginia.edu                }
65511725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
65611725Sar4jc@virginia.edu            }}, FloatMultOp);
65711725Sar4jc@virginia.edu            0x9: fmul_d({{
65811725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2)) {
65911725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
66011725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
66111725Sar4jc@virginia.edu                    }
66211725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
66311725Sar4jc@virginia.edu                } else {
66411725Sar4jc@virginia.edu                    Fd = Fs1*Fs2;
66511725Sar4jc@virginia.edu                }
66611725Sar4jc@virginia.edu            }}, FloatMultOp);
66711725Sar4jc@virginia.edu            0xc: fdiv_s({{
66811725Sar4jc@virginia.edu                uint32_t temp;
66911725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
67011725Sar4jc@virginia.edu                float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
67111725Sar4jc@virginia.edu                float fd;
67211725Sar4jc@virginia.edu
67311725Sar4jc@virginia.edu                if (std::isnan(fs1) || std::isnan(fs2)) {
67411725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)) {
67511725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
67611725Sar4jc@virginia.edu                    }
67711725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
67811725Sar4jc@virginia.edu                } else {
67911725Sar4jc@virginia.edu                    fd = fs1/fs2;
68011725Sar4jc@virginia.edu                }
68111725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
68211725Sar4jc@virginia.edu            }}, FloatDivOp);
68311725Sar4jc@virginia.edu            0xd: fdiv_d({{
68411725Sar4jc@virginia.edu                if (std::isnan(Fs1) || std::isnan(Fs2)) {
68511725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
68611725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
68711725Sar4jc@virginia.edu                    }
68811725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
68911725Sar4jc@virginia.edu                } else {
69011725Sar4jc@virginia.edu                    Fd = Fs1/Fs2;
69111725Sar4jc@virginia.edu                }
69211725Sar4jc@virginia.edu            }}, FloatDivOp);
69311725Sar4jc@virginia.edu            0x10: decode ROUND_MODE {
69411725Sar4jc@virginia.edu                0x0: fsgnj_s({{
69511725Sar4jc@virginia.edu                    uint32_t temp;
69611725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
69711725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
69811725Sar4jc@virginia.edu                    float fd;
69911725Sar4jc@virginia.edu
70011725Sar4jc@virginia.edu                    if (issignalingnan(fs1)) {
70111725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::signaling_NaN();
70211725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
70311725Sar4jc@virginia.edu                    } else {
70411725Sar4jc@virginia.edu                        fd = std::copysign(fs1, fs2);
70511725Sar4jc@virginia.edu                    }
70611725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
70711725Sar4jc@virginia.edu                }});
70811725Sar4jc@virginia.edu                0x1: fsgnjn_s({{
70911725Sar4jc@virginia.edu                    uint32_t temp;
71011725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
71111725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
71211725Sar4jc@virginia.edu                    float fd;
71311725Sar4jc@virginia.edu
71411725Sar4jc@virginia.edu                    if (issignalingnan(fs1)) {
71511725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::signaling_NaN();
71611725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
71711725Sar4jc@virginia.edu                    } else {
71811725Sar4jc@virginia.edu                        fd = std::copysign(fs1, -fs2);
71911725Sar4jc@virginia.edu                    }
72011725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
72111725Sar4jc@virginia.edu                }});
72211725Sar4jc@virginia.edu                0x2: fsgnjx_s({{
72311725Sar4jc@virginia.edu                    uint32_t temp;
72411725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
72511725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
72611725Sar4jc@virginia.edu                    float fd;
72711725Sar4jc@virginia.edu
72811725Sar4jc@virginia.edu                    if (issignalingnan(fs1)) {
72911725Sar4jc@virginia.edu                        fd = std::numeric_limits<float>::signaling_NaN();
73011725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
73111725Sar4jc@virginia.edu                    } else {
73211725Sar4jc@virginia.edu                        fd = fs1*(std::signbit(fs2) ? -1.0 : 1.0);
73311725Sar4jc@virginia.edu                    }
73411725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
73511725Sar4jc@virginia.edu                }});
73611725Sar4jc@virginia.edu            }
73711725Sar4jc@virginia.edu            0x11: decode ROUND_MODE {
73811725Sar4jc@virginia.edu                0x0: fsgnj_d({{
73911725Sar4jc@virginia.edu                    if (issignalingnan(Fs1)) {
74011725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::signaling_NaN();
74111725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
74211725Sar4jc@virginia.edu                    } else {
74311725Sar4jc@virginia.edu                        Fd = std::copysign(Fs1, Fs2);
74411725Sar4jc@virginia.edu                    }
74511725Sar4jc@virginia.edu                }});
74611725Sar4jc@virginia.edu                0x1: fsgnjn_d({{
74711725Sar4jc@virginia.edu                    if (issignalingnan(Fs1)) {
74811725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::signaling_NaN();
74911725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
75011725Sar4jc@virginia.edu                    } else {
75111725Sar4jc@virginia.edu                        Fd = std::copysign(Fs1, -Fs2);
75211725Sar4jc@virginia.edu                    }
75311725Sar4jc@virginia.edu                }});
75411725Sar4jc@virginia.edu                0x2: fsgnjx_d({{
75511725Sar4jc@virginia.edu                    if (issignalingnan(Fs1)) {
75611725Sar4jc@virginia.edu                        Fd = std::numeric_limits<double>::signaling_NaN();
75711725Sar4jc@virginia.edu                        std::feclearexcept(FE_INVALID);
75811725Sar4jc@virginia.edu                    } else {
75911725Sar4jc@virginia.edu                        Fd = Fs1*(std::signbit(Fs2) ? -1.0 : 1.0);
76011725Sar4jc@virginia.edu                    }
76111725Sar4jc@virginia.edu                }});
76211725Sar4jc@virginia.edu            }
76311725Sar4jc@virginia.edu            0x14: decode ROUND_MODE {
76411725Sar4jc@virginia.edu                0x0: fmin_s({{
76511725Sar4jc@virginia.edu                    uint32_t temp;
76611725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
76711725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
76811725Sar4jc@virginia.edu                    float fd;
76911725Sar4jc@virginia.edu
77011725Sar4jc@virginia.edu                    if (issignalingnan(fs2)) {
77111725Sar4jc@virginia.edu                        fd = fs1;
77211725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
77311725Sar4jc@virginia.edu                    } else if (issignalingnan(fs1)) {
77411725Sar4jc@virginia.edu                        fd = fs2;
77511725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
77611725Sar4jc@virginia.edu                    } else {
77711725Sar4jc@virginia.edu                        fd = std::fmin(fs1, fs2);
77811725Sar4jc@virginia.edu                    }
77911725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
78011725Sar4jc@virginia.edu                }}, FloatCmpOp);
78111725Sar4jc@virginia.edu                0x1: fmax_s({{
78211725Sar4jc@virginia.edu                    uint32_t temp;
78311725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
78411725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
78511725Sar4jc@virginia.edu                    float fd;
78611725Sar4jc@virginia.edu
78711725Sar4jc@virginia.edu                    if (issignalingnan(fs2)) {
78811725Sar4jc@virginia.edu                        fd = fs1;
78911725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
79011725Sar4jc@virginia.edu                    } else if (issignalingnan(fs1)) {
79111725Sar4jc@virginia.edu                        fd = fs2;
79211725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
79311725Sar4jc@virginia.edu                    } else {
79411725Sar4jc@virginia.edu                        fd = std::fmax(fs1, fs2);
79511725Sar4jc@virginia.edu                    }
79611725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
79711725Sar4jc@virginia.edu                }}, FloatCmpOp);
79811725Sar4jc@virginia.edu            }
79911725Sar4jc@virginia.edu            0x15: decode ROUND_MODE {
80011725Sar4jc@virginia.edu                0x0: fmin_d({{
80111725Sar4jc@virginia.edu                    if (issignalingnan(Fs2)) {
80211725Sar4jc@virginia.edu                        Fd = Fs1;
80311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
80411725Sar4jc@virginia.edu                    } else if (issignalingnan(Fs1)) {
80511725Sar4jc@virginia.edu                        Fd = Fs2;
80611725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
80711725Sar4jc@virginia.edu                    } else {
80811725Sar4jc@virginia.edu                        Fd = std::fmin(Fs1, Fs2);
80911725Sar4jc@virginia.edu                    }
81011725Sar4jc@virginia.edu                }}, FloatCmpOp);
81111725Sar4jc@virginia.edu                0x1: fmax_d({{
81211725Sar4jc@virginia.edu                    if (issignalingnan(Fs2)) {
81311725Sar4jc@virginia.edu                        Fd = Fs1;
81411725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
81511725Sar4jc@virginia.edu                    } else if (issignalingnan(Fs1)) {
81611725Sar4jc@virginia.edu                        Fd = Fs2;
81711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
81811725Sar4jc@virginia.edu                    } else {
81911725Sar4jc@virginia.edu                        Fd = std::fmax(Fs1, Fs2);
82011725Sar4jc@virginia.edu                    }
82111725Sar4jc@virginia.edu                }}, FloatCmpOp);
82211725Sar4jc@virginia.edu            }
82311725Sar4jc@virginia.edu            0x20: fcvt_s_d({{
82411725Sar4jc@virginia.edu                assert(CONV_SGN == 1);
82511725Sar4jc@virginia.edu                float fd;
82611725Sar4jc@virginia.edu                if (issignalingnan(Fs1)) {
82711725Sar4jc@virginia.edu                    fd = std::numeric_limits<float>::quiet_NaN();
82811725Sar4jc@virginia.edu                    FFLAGS |= FloatInvalid;
82911725Sar4jc@virginia.edu                } else {
83011725Sar4jc@virginia.edu                    fd = (float)Fs1;
83111725Sar4jc@virginia.edu                }
83211725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
83311725Sar4jc@virginia.edu            }}, FloatCvtOp);
83411725Sar4jc@virginia.edu            0x21: fcvt_d_s({{
83511725Sar4jc@virginia.edu                assert(CONV_SGN == 0);
83611725Sar4jc@virginia.edu                uint32_t temp;
83711725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
83811725Sar4jc@virginia.edu
83911725Sar4jc@virginia.edu                if (issignalingnan(fs1)) {
84011725Sar4jc@virginia.edu                    Fd = std::numeric_limits<double>::quiet_NaN();
84111725Sar4jc@virginia.edu                    FFLAGS |= FloatInvalid;
84211725Sar4jc@virginia.edu                } else {
84311725Sar4jc@virginia.edu                    Fd = (double)fs1;
84411725Sar4jc@virginia.edu                }
84511725Sar4jc@virginia.edu            }}, FloatCvtOp);
84611725Sar4jc@virginia.edu            0x2c: fsqrt_s({{
84711725Sar4jc@virginia.edu                assert(RS2 == 0);
84811725Sar4jc@virginia.edu                uint32_t temp;
84911725Sar4jc@virginia.edu                float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
85011725Sar4jc@virginia.edu                float fd;
85111725Sar4jc@virginia.edu
85211725Sar4jc@virginia.edu                if (issignalingnan(Fs1_sf)) {
85311725Sar4jc@virginia.edu                    FFLAGS |= FloatInvalid;
85411725Sar4jc@virginia.edu                }
85511725Sar4jc@virginia.edu                fd = std::sqrt(fs1);
85611725Sar4jc@virginia.edu                Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
85711725Sar4jc@virginia.edu            }}, FloatSqrtOp);
85811725Sar4jc@virginia.edu            0x2d: fsqrt_d({{
85911725Sar4jc@virginia.edu                assert(RS2 == 0);
86011725Sar4jc@virginia.edu                Fd = std::sqrt(Fs1);
86111725Sar4jc@virginia.edu            }}, FloatSqrtOp);
86211725Sar4jc@virginia.edu            0x50: decode ROUND_MODE {
86311725Sar4jc@virginia.edu                0x0: fle_s({{
86411725Sar4jc@virginia.edu                    uint32_t temp;
86511725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
86611725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
86711725Sar4jc@virginia.edu
86811725Sar4jc@virginia.edu                    if (std::isnan(fs1) || std::isnan(fs2)) {
86911725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
87011725Sar4jc@virginia.edu                        Rd = 0;
87111725Sar4jc@virginia.edu                    } else {
87211725Sar4jc@virginia.edu                        Rd = fs1 <= fs2 ? 1 : 0;
87311725Sar4jc@virginia.edu                    }
87411725Sar4jc@virginia.edu                }}, FloatCmpOp);
87511725Sar4jc@virginia.edu                0x1: flt_s({{
87611725Sar4jc@virginia.edu                    uint32_t temp;
87711725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
87811725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
87911725Sar4jc@virginia.edu
88011725Sar4jc@virginia.edu                    if (std::isnan(fs1) || std::isnan(fs2)) {
88111725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
88211725Sar4jc@virginia.edu                        Rd = 0;
88311725Sar4jc@virginia.edu                    } else {
88411725Sar4jc@virginia.edu                        Rd = fs1 < fs2 ? 1 : 0;
88511725Sar4jc@virginia.edu                    }
88611725Sar4jc@virginia.edu                }}, FloatCmpOp);
88711725Sar4jc@virginia.edu                0x2: feq_s({{
88811725Sar4jc@virginia.edu                    uint32_t temp;
88911725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
89011725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
89111725Sar4jc@virginia.edu
89211725Sar4jc@virginia.edu                    if (issignalingnan(fs1) || issignalingnan(fs2)) {
89311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
89411725Sar4jc@virginia.edu                    }
89511725Sar4jc@virginia.edu                    Rd = fs1 == fs2 ? 1 : 0;
89611725Sar4jc@virginia.edu                }}, FloatCmpOp);
89711725Sar4jc@virginia.edu            }
89811725Sar4jc@virginia.edu            0x51: decode ROUND_MODE {
89911725Sar4jc@virginia.edu                0x0: fle_d({{
90011725Sar4jc@virginia.edu                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
90111725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
90211725Sar4jc@virginia.edu                        Rd = 0;
90311725Sar4jc@virginia.edu                    } else {
90411725Sar4jc@virginia.edu                        Rd = Fs1 <= Fs2 ? 1 : 0;
90511725Sar4jc@virginia.edu                    }
90611725Sar4jc@virginia.edu                }}, FloatCmpOp);
90711725Sar4jc@virginia.edu                0x1: flt_d({{
90811725Sar4jc@virginia.edu                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
90911725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
91011725Sar4jc@virginia.edu                        Rd = 0;
91111725Sar4jc@virginia.edu                    } else {
91211725Sar4jc@virginia.edu                        Rd = Fs1 < Fs2 ? 1 : 0;
91311725Sar4jc@virginia.edu                    }
91411725Sar4jc@virginia.edu                }}, FloatCmpOp);
91511725Sar4jc@virginia.edu                0x2: feq_d({{
91611725Sar4jc@virginia.edu                    if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
91711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
91811725Sar4jc@virginia.edu                    }
91911725Sar4jc@virginia.edu                    Rd = Fs1 == Fs2 ? 1 : 0;
92011725Sar4jc@virginia.edu                }}, FloatCmpOp);
92111725Sar4jc@virginia.edu            }
92211725Sar4jc@virginia.edu            0x60: decode CONV_SGN {
92311725Sar4jc@virginia.edu                0x0: fcvt_w_s({{
92411725Sar4jc@virginia.edu                    uint32_t temp;
92511725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
92611725Sar4jc@virginia.edu
92711725Sar4jc@virginia.edu                    if (std::isnan(fs1)) {
92811725Sar4jc@virginia.edu                        Rd_sd = std::numeric_limits<int32_t>::max();
92911725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
93011725Sar4jc@virginia.edu                    } else {
93111725Sar4jc@virginia.edu                        Rd_sd = (int32_t)fs1;
93211725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
93311725Sar4jc@virginia.edu                            if (std::signbit(fs1)) {
93411725Sar4jc@virginia.edu                                Rd_sd = std::numeric_limits<int32_t>::min();
93511725Sar4jc@virginia.edu                            } else {
93611725Sar4jc@virginia.edu                                Rd_sd = std::numeric_limits<int32_t>::max();
93711725Sar4jc@virginia.edu                            }
93811725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
93911725Sar4jc@virginia.edu                        }
94011725Sar4jc@virginia.edu                    }
94111725Sar4jc@virginia.edu                }}, FloatCvtOp);
94211725Sar4jc@virginia.edu                0x1: fcvt_wu_s({{
94311725Sar4jc@virginia.edu                    uint32_t temp;
94411725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
94511725Sar4jc@virginia.edu
94611725Sar4jc@virginia.edu                    if (fs1 < 0.0) {
94711725Sar4jc@virginia.edu                        Rd = 0;
94811725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
94911725Sar4jc@virginia.edu                    } else {
95011725Sar4jc@virginia.edu                        Rd = (uint32_t)fs1;
95111725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
95211725Sar4jc@virginia.edu                            Rd = std::numeric_limits<uint64_t>::max();
95311725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
95411725Sar4jc@virginia.edu                        }
95511725Sar4jc@virginia.edu                    }
95611725Sar4jc@virginia.edu                }}, FloatCvtOp);
95711725Sar4jc@virginia.edu                0x2: fcvt_l_s({{
95811725Sar4jc@virginia.edu                    uint32_t temp;
95911725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
96011725Sar4jc@virginia.edu
96111725Sar4jc@virginia.edu                    if (std::isnan(fs1)) {
96211725Sar4jc@virginia.edu                        Rd_sd = std::numeric_limits<int64_t>::max();
96311725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
96411725Sar4jc@virginia.edu                    } else {
96511725Sar4jc@virginia.edu                        Rd_sd = (int64_t)fs1;
96611725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
96711725Sar4jc@virginia.edu                            if (std::signbit(fs1)) {
96811725Sar4jc@virginia.edu                                Rd_sd = std::numeric_limits<int64_t>::min();
96911725Sar4jc@virginia.edu                            } else {
97011725Sar4jc@virginia.edu                                Rd_sd = std::numeric_limits<int64_t>::max();
97111725Sar4jc@virginia.edu                            }
97211725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
97311725Sar4jc@virginia.edu                        }
97411725Sar4jc@virginia.edu                    }
97511725Sar4jc@virginia.edu                }}, FloatCvtOp);
97611725Sar4jc@virginia.edu                0x3: fcvt_lu_s({{
97711725Sar4jc@virginia.edu                    uint32_t temp;
97811725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
97911725Sar4jc@virginia.edu
98011725Sar4jc@virginia.edu                    if (fs1 < 0.0) {
98111725Sar4jc@virginia.edu                        Rd = 0;
98211725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
98311725Sar4jc@virginia.edu                    } else {
98411725Sar4jc@virginia.edu                        Rd = (uint64_t)fs1;
98511725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
98611725Sar4jc@virginia.edu                            Rd = std::numeric_limits<uint64_t>::max();
98711725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
98811725Sar4jc@virginia.edu                        }
98911725Sar4jc@virginia.edu                    }
99011725Sar4jc@virginia.edu                }}, FloatCvtOp);
99111725Sar4jc@virginia.edu            }
99211725Sar4jc@virginia.edu            0x61: decode CONV_SGN {
99311725Sar4jc@virginia.edu                0x0: fcvt_w_d({{
99411725Sar4jc@virginia.edu                    Rd_sd = (int32_t)Fs1;
99511725Sar4jc@virginia.edu                    if (std::fetestexcept(FE_INVALID)) {
99611725Sar4jc@virginia.edu                        if (Fs1 < 0.0) {
99711725Sar4jc@virginia.edu                            Rd_sd = std::numeric_limits<int32_t>::min();
99811725Sar4jc@virginia.edu                        } else {
99911725Sar4jc@virginia.edu                            Rd_sd = std::numeric_limits<int32_t>::max();
100011725Sar4jc@virginia.edu                        }
100111725Sar4jc@virginia.edu                        std::feclearexcept(FE_INEXACT);
100211725Sar4jc@virginia.edu                    }
100311725Sar4jc@virginia.edu                }}, FloatCvtOp);
100411725Sar4jc@virginia.edu                0x1: fcvt_wu_d({{
100511725Sar4jc@virginia.edu                    if (Fs1 < 0.0) {
100611725Sar4jc@virginia.edu                        Rd = 0;
100711725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
100811725Sar4jc@virginia.edu                    } else {
100911725Sar4jc@virginia.edu                        Rd = (uint32_t)Fs1;
101011725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
101111725Sar4jc@virginia.edu                            Rd = std::numeric_limits<uint64_t>::max();
101211725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
101311725Sar4jc@virginia.edu                        }
101411725Sar4jc@virginia.edu                    }
101511725Sar4jc@virginia.edu                }}, FloatCvtOp);
101611725Sar4jc@virginia.edu                0x2: fcvt_l_d({{
101711725Sar4jc@virginia.edu                    Rd_sd = Fs1;
101811725Sar4jc@virginia.edu                    if (std::fetestexcept(FE_INVALID)) {
101911725Sar4jc@virginia.edu                        if (Fs1 < 0.0) {
102011725Sar4jc@virginia.edu                            Rd_sd = std::numeric_limits<int64_t>::min();
102111725Sar4jc@virginia.edu                        } else {
102211725Sar4jc@virginia.edu                            Rd_sd = std::numeric_limits<int64_t>::max();
102311725Sar4jc@virginia.edu                        }
102411725Sar4jc@virginia.edu                        std::feclearexcept(FE_INEXACT);
102511725Sar4jc@virginia.edu                    }
102611725Sar4jc@virginia.edu                }}, FloatCvtOp);
102711725Sar4jc@virginia.edu                0x3: fcvt_lu_d({{
102811725Sar4jc@virginia.edu                    if (Fs1 < 0.0) {
102911725Sar4jc@virginia.edu                        Rd = 0;
103011725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
103111725Sar4jc@virginia.edu                    } else {
103211725Sar4jc@virginia.edu                        Rd = (uint64_t)Fs1;
103311725Sar4jc@virginia.edu                        if (std::fetestexcept(FE_INVALID)) {
103411725Sar4jc@virginia.edu                            Rd = std::numeric_limits<uint64_t>::max();
103511725Sar4jc@virginia.edu                            std::feclearexcept(FE_INEXACT);
103611725Sar4jc@virginia.edu                        }
103711725Sar4jc@virginia.edu                    }
103811725Sar4jc@virginia.edu                }}, FloatCvtOp);
103911725Sar4jc@virginia.edu            }
104011725Sar4jc@virginia.edu            0x68: decode CONV_SGN {
104111725Sar4jc@virginia.edu                0x0: fcvt_s_w({{
104211725Sar4jc@virginia.edu                    float temp = (float)Rs1_sw;
104311725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
104411725Sar4jc@virginia.edu                }}, FloatCvtOp);
104511725Sar4jc@virginia.edu                0x1: fcvt_s_wu({{
104611725Sar4jc@virginia.edu                    float temp = (float)Rs1_uw;
104711725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
104811725Sar4jc@virginia.edu                }}, FloatCvtOp);
104911725Sar4jc@virginia.edu                0x2: fcvt_s_l({{
105011725Sar4jc@virginia.edu                    float temp = (float)Rs1_sd;
105111725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
105211725Sar4jc@virginia.edu                }}, FloatCvtOp);
105311725Sar4jc@virginia.edu                0x3: fcvt_s_lu({{
105411725Sar4jc@virginia.edu                    float temp = (float)Rs1;
105511725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
105611725Sar4jc@virginia.edu                }}, FloatCvtOp);
105711725Sar4jc@virginia.edu            }
105811725Sar4jc@virginia.edu            0x69: decode CONV_SGN {
105911725Sar4jc@virginia.edu                0x0: fcvt_d_w({{
106011725Sar4jc@virginia.edu                    Fd = (double)Rs1_sw;
106111725Sar4jc@virginia.edu                }}, FloatCvtOp);
106211725Sar4jc@virginia.edu                0x1: fcvt_d_wu({{
106311725Sar4jc@virginia.edu                    Fd = (double)Rs1_uw;
106411725Sar4jc@virginia.edu                }}, FloatCvtOp);
106511725Sar4jc@virginia.edu                0x2: fcvt_d_l({{
106611725Sar4jc@virginia.edu                    Fd = (double)Rs1_sd;
106711725Sar4jc@virginia.edu                }}, FloatCvtOp);
106811725Sar4jc@virginia.edu                0x3: fcvt_d_lu({{
106911725Sar4jc@virginia.edu                    Fd = (double)Rs1;
107011725Sar4jc@virginia.edu                }}, FloatCvtOp);
107111725Sar4jc@virginia.edu            }
107211725Sar4jc@virginia.edu            0x70: decode ROUND_MODE {
107311725Sar4jc@virginia.edu                0x0: fmv_x_s({{
107411725Sar4jc@virginia.edu                    Rd = (uint32_t)Fs1_bits;
107511725Sar4jc@virginia.edu                    if ((Rd&0x80000000) != 0) {
107611725Sar4jc@virginia.edu                        Rd |= (0xFFFFFFFFULL << 32);
107711725Sar4jc@virginia.edu                    }
107811725Sar4jc@virginia.edu                }}, FloatCvtOp);
107911725Sar4jc@virginia.edu                0x1: fclass_s({{
108011725Sar4jc@virginia.edu                    uint32_t temp;
108111725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
108211725Sar4jc@virginia.edu                    switch (std::fpclassify(fs1)) {
108311725Sar4jc@virginia.edu                    case FP_INFINITE:
108411725Sar4jc@virginia.edu                        if (std::signbit(fs1)) {
108511725Sar4jc@virginia.edu                            Rd = 1 << 0;
108611725Sar4jc@virginia.edu                        } else {
108711725Sar4jc@virginia.edu                            Rd = 1 << 7;
108811725Sar4jc@virginia.edu                        }
108911725Sar4jc@virginia.edu                        break;
109011725Sar4jc@virginia.edu                    case FP_NAN:
109111725Sar4jc@virginia.edu                        if (issignalingnan(fs1)) {
109211725Sar4jc@virginia.edu                            Rd = 1 << 8;
109311725Sar4jc@virginia.edu                        } else {
109411725Sar4jc@virginia.edu                            Rd = 1 << 9;
109511725Sar4jc@virginia.edu                        }
109611725Sar4jc@virginia.edu                        break;
109711725Sar4jc@virginia.edu                    case FP_ZERO:
109811725Sar4jc@virginia.edu                        if (std::signbit(fs1)) {
109911725Sar4jc@virginia.edu                            Rd = 1 << 3;
110011725Sar4jc@virginia.edu                        } else {
110111725Sar4jc@virginia.edu                            Rd = 1 << 4;
110211725Sar4jc@virginia.edu                        }
110311725Sar4jc@virginia.edu                        break;
110411725Sar4jc@virginia.edu                    case FP_SUBNORMAL:
110511725Sar4jc@virginia.edu                        if (std::signbit(fs1)) {
110611725Sar4jc@virginia.edu                            Rd = 1 << 2;
110711725Sar4jc@virginia.edu                        } else {
110811725Sar4jc@virginia.edu                            Rd = 1 << 5;
110911725Sar4jc@virginia.edu                        }
111011725Sar4jc@virginia.edu                        break;
111111725Sar4jc@virginia.edu                    case FP_NORMAL:
111211725Sar4jc@virginia.edu                        if (std::signbit(fs1)) {
111311725Sar4jc@virginia.edu                            Rd = 1 << 1;
111411725Sar4jc@virginia.edu                        } else {
111511725Sar4jc@virginia.edu                            Rd = 1 << 6;
111611725Sar4jc@virginia.edu                        }
111711725Sar4jc@virginia.edu                        break;
111811725Sar4jc@virginia.edu                    default:
111911725Sar4jc@virginia.edu                        panic("Unknown classification for operand.");
112011725Sar4jc@virginia.edu                        break;
112111725Sar4jc@virginia.edu                    }
112211725Sar4jc@virginia.edu                }});
112311725Sar4jc@virginia.edu            }
112411725Sar4jc@virginia.edu            0x71: decode ROUND_MODE {
112511725Sar4jc@virginia.edu                0x0: fmv_x_d({{
112611725Sar4jc@virginia.edu                    Rd = Fs1_bits;
112711725Sar4jc@virginia.edu                }}, FloatCvtOp);
112811725Sar4jc@virginia.edu                0x1: fclass_d({{
112911725Sar4jc@virginia.edu                    switch (std::fpclassify(Fs1)) {
113011725Sar4jc@virginia.edu                    case FP_INFINITE:
113111725Sar4jc@virginia.edu                        if (std::signbit(Fs1)) {
113211725Sar4jc@virginia.edu                            Rd = 1 << 0;
113311725Sar4jc@virginia.edu                        } else {
113411725Sar4jc@virginia.edu                            Rd = 1 << 7;
113511725Sar4jc@virginia.edu                        }
113611725Sar4jc@virginia.edu                        break;
113711725Sar4jc@virginia.edu                    case FP_NAN:
113811725Sar4jc@virginia.edu                        if (issignalingnan(Fs1)) {
113911725Sar4jc@virginia.edu                            Rd = 1 << 8;
114011725Sar4jc@virginia.edu                        } else {
114111725Sar4jc@virginia.edu                            Rd = 1 << 9;
114211725Sar4jc@virginia.edu                        }
114311725Sar4jc@virginia.edu                        break;
114411725Sar4jc@virginia.edu                    case FP_ZERO:
114511725Sar4jc@virginia.edu                        if (std::signbit(Fs1)) {
114611725Sar4jc@virginia.edu                            Rd = 1 << 3;
114711725Sar4jc@virginia.edu                        } else {
114811725Sar4jc@virginia.edu                            Rd = 1 << 4;
114911725Sar4jc@virginia.edu                        }
115011725Sar4jc@virginia.edu                        break;
115111725Sar4jc@virginia.edu                    case FP_SUBNORMAL:
115211725Sar4jc@virginia.edu                        if (std::signbit(Fs1)) {
115311725Sar4jc@virginia.edu                            Rd = 1 << 2;
115411725Sar4jc@virginia.edu                        } else {
115511725Sar4jc@virginia.edu                            Rd = 1 << 5;
115611725Sar4jc@virginia.edu                        }
115711725Sar4jc@virginia.edu                        break;
115811725Sar4jc@virginia.edu                    case FP_NORMAL:
115911725Sar4jc@virginia.edu                        if (std::signbit(Fs1)) {
116011725Sar4jc@virginia.edu                            Rd = 1 << 1;
116111725Sar4jc@virginia.edu                        } else {
116211725Sar4jc@virginia.edu                            Rd = 1 << 6;
116311725Sar4jc@virginia.edu                        }
116411725Sar4jc@virginia.edu                        break;
116511725Sar4jc@virginia.edu                    default:
116611725Sar4jc@virginia.edu                        panic("Unknown classification for operand.");
116711725Sar4jc@virginia.edu                        break;
116811725Sar4jc@virginia.edu                    }
116911725Sar4jc@virginia.edu                }});
117011725Sar4jc@virginia.edu            }
117111725Sar4jc@virginia.edu            0x78: fmv_s_x({{
117211725Sar4jc@virginia.edu                Fd_bits = (uint64_t)Rs1_uw;
117311725Sar4jc@virginia.edu            }}, FloatCvtOp);
117411725Sar4jc@virginia.edu            0x79: fmv_d_x({{
117511725Sar4jc@virginia.edu                Fd_bits = Rs1;
117611725Sar4jc@virginia.edu            }}, FloatCvtOp);
117711725Sar4jc@virginia.edu        }
117811725Sar4jc@virginia.edu    }
117911723Sar4jc@virginia.edu    0x63: decode FUNCT3 {
118011723Sar4jc@virginia.edu        format SBOp {
118111723Sar4jc@virginia.edu            0x0: beq({{
118211723Sar4jc@virginia.edu                if (Rs1 == Rs2) {
118311723Sar4jc@virginia.edu                    NPC = PC + imm;
118411723Sar4jc@virginia.edu                } else {
118511723Sar4jc@virginia.edu                    NPC = NPC;
118611723Sar4jc@virginia.edu                }
118711723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
118811723Sar4jc@virginia.edu            0x1: bne({{
118911723Sar4jc@virginia.edu                if (Rs1 != Rs2) {
119011723Sar4jc@virginia.edu                    NPC = PC + imm;
119111723Sar4jc@virginia.edu                } else {
119211723Sar4jc@virginia.edu                    NPC = NPC;
119311723Sar4jc@virginia.edu                }
119411723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
119511723Sar4jc@virginia.edu            0x4: blt({{
119611723Sar4jc@virginia.edu                if (Rs1_sd < Rs2_sd) {
119711723Sar4jc@virginia.edu                    NPC = PC + imm;
119811723Sar4jc@virginia.edu                } else {
119911723Sar4jc@virginia.edu                    NPC = NPC;
120011723Sar4jc@virginia.edu                }
120111723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
120211723Sar4jc@virginia.edu            0x5: bge({{
120311723Sar4jc@virginia.edu                if (Rs1_sd >= Rs2_sd) {
120411723Sar4jc@virginia.edu                    NPC = PC + imm;
120511723Sar4jc@virginia.edu                } else {
120611723Sar4jc@virginia.edu                    NPC = NPC;
120711723Sar4jc@virginia.edu                }
120811723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
120911723Sar4jc@virginia.edu            0x6: bltu({{
121011723Sar4jc@virginia.edu                if (Rs1 < Rs2) {
121111723Sar4jc@virginia.edu                    NPC = PC + imm;
121211723Sar4jc@virginia.edu                } else {
121311723Sar4jc@virginia.edu                    NPC = NPC;
121411723Sar4jc@virginia.edu                }
121511723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
121611723Sar4jc@virginia.edu            0x7: bgeu({{
121711723Sar4jc@virginia.edu                if (Rs1 >= Rs2) {
121811723Sar4jc@virginia.edu                    NPC = PC + imm;
121911723Sar4jc@virginia.edu                } else {
122011723Sar4jc@virginia.edu                    NPC = NPC;
122111723Sar4jc@virginia.edu                }
122211723Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
122311723Sar4jc@virginia.edu        }
122411723Sar4jc@virginia.edu    }
122511723Sar4jc@virginia.edu
122611723Sar4jc@virginia.edu    0x67: decode FUNCT3 {
122711723Sar4jc@virginia.edu        0x0: Jump::jalr({{
122811723Sar4jc@virginia.edu            Rd = NPC;
122911723Sar4jc@virginia.edu            NPC = (imm + Rs1) & (~0x1);
123011723Sar4jc@virginia.edu        }}, IsIndirectControl, IsUncondControl, IsCall);
123111723Sar4jc@virginia.edu    }
123211723Sar4jc@virginia.edu
123311723Sar4jc@virginia.edu    0x6f: UJOp::jal({{
123411723Sar4jc@virginia.edu        Rd = NPC;
123511723Sar4jc@virginia.edu        NPC = PC + imm;
123611723Sar4jc@virginia.edu    }}, IsDirectControl, IsUncondControl, IsCall);
123711723Sar4jc@virginia.edu
123811723Sar4jc@virginia.edu    0x73: decode FUNCT3 {
123911723Sar4jc@virginia.edu        format IOp {
124011723Sar4jc@virginia.edu            0x0: decode FUNCT12 {
124111723Sar4jc@virginia.edu                0x0: ecall({{
124211723Sar4jc@virginia.edu                    fault = std::make_shared<SyscallFault>();
124311723Sar4jc@virginia.edu                }}, IsSerializeAfter, IsNonSpeculative, IsSyscall, No_OpClass);
124411723Sar4jc@virginia.edu                0x1: ebreak({{
124511723Sar4jc@virginia.edu                    fault = std::make_shared<BreakpointFault>();
124611723Sar4jc@virginia.edu                }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
124711723Sar4jc@virginia.edu                0x100: eret({{
124811723Sar4jc@virginia.edu                    fault = std::make_shared<UnimplementedFault>("eret");
124911723Sar4jc@virginia.edu                }}, No_OpClass);
125011723Sar4jc@virginia.edu            }
125111723Sar4jc@virginia.edu            0x1: csrrw({{
125211723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
125311723Sar4jc@virginia.edu                xc->setMiscReg(FUNCT12, Rs1);
125411723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
125511723Sar4jc@virginia.edu            0x2: csrrs({{
125611723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
125711723Sar4jc@virginia.edu                if (Rs1 != 0) {
125811723Sar4jc@virginia.edu                    xc->setMiscReg(FUNCT12, Rd | Rs1);
125911723Sar4jc@virginia.edu                }
126011723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
126111723Sar4jc@virginia.edu            0x3: csrrc({{
126211723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
126311723Sar4jc@virginia.edu                if (Rs1 != 0) {
126411723Sar4jc@virginia.edu                    xc->setMiscReg(FUNCT12, Rd & ~Rs1);
126511723Sar4jc@virginia.edu                }
126611723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
126711723Sar4jc@virginia.edu            0x5: csrrwi({{
126811723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
126911723Sar4jc@virginia.edu                xc->setMiscReg(FUNCT12, ZIMM);
127011723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
127111723Sar4jc@virginia.edu            0x6: csrrsi({{
127211723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
127311723Sar4jc@virginia.edu                if (ZIMM != 0) {
127411723Sar4jc@virginia.edu                    xc->setMiscReg(FUNCT12, Rd | ZIMM);
127511723Sar4jc@virginia.edu                }
127611723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
127711723Sar4jc@virginia.edu            0x7: csrrci({{
127811723Sar4jc@virginia.edu                Rd = xc->readMiscReg(FUNCT12);
127911723Sar4jc@virginia.edu                if (ZIMM != 0) {
128011723Sar4jc@virginia.edu                    xc->setMiscReg(FUNCT12, Rd & ~ZIMM);
128111723Sar4jc@virginia.edu                }
128211723Sar4jc@virginia.edu            }}, IsNonSpeculative, No_OpClass);
128311723Sar4jc@virginia.edu        }
128411723Sar4jc@virginia.edu    }
128511723Sar4jc@virginia.edu}
1286