decoder.isa revision 12535
111723Sar4jc@virginia.edu// -*- mode:c++ -*-
211723Sar4jc@virginia.edu
311723Sar4jc@virginia.edu// Copyright (c) 2015 RISC-V Foundation
412120Sar4jc@virginia.edu// Copyright (c) 2017 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
3712120Sar4jc@virginia.edudecode QUADRANT default Unknown::unknown() {
3812120Sar4jc@virginia.edu    0x0: decode COPCODE {
3912428Sar4jc@virginia.edu        0x0: CIOp::c_addi4spn({{
4012120Sar4jc@virginia.edu            imm = CIMM8<1:1> << 2 |
4112120Sar4jc@virginia.edu                  CIMM8<0:0> << 3 |
4212120Sar4jc@virginia.edu                  CIMM8<7:6> << 4 |
4312120Sar4jc@virginia.edu                  CIMM8<5:2> << 6;
4412120Sar4jc@virginia.edu        }}, {{
4512136Sar4jc@virginia.edu            if (machInst == 0)
4612136Sar4jc@virginia.edu                fault = make_shared<IllegalInstFault>("zero instruction");
4712120Sar4jc@virginia.edu            Rp2 = sp + imm;
4812428Sar4jc@virginia.edu        }}, uint64_t);
4912120Sar4jc@virginia.edu        format CompressedLoad {
5012120Sar4jc@virginia.edu            0x1: c_fld({{
5112322Sar4jc@virginia.edu                offset = CIMM3 << 3 | CIMM2 << 6;
5212120Sar4jc@virginia.edu            }}, {{
5312120Sar4jc@virginia.edu                Fp2_bits = Mem;
5412120Sar4jc@virginia.edu            }}, {{
5512322Sar4jc@virginia.edu                EA = Rp1 + offset;
5611723Sar4jc@virginia.edu            }});
5712120Sar4jc@virginia.edu            0x2: c_lw({{
5812322Sar4jc@virginia.edu                offset = CIMM2<1:1> << 2 |
5912322Sar4jc@virginia.edu                         CIMM3 << 3 |
6012322Sar4jc@virginia.edu                         CIMM2<0:0> << 6;
6112120Sar4jc@virginia.edu            }}, {{
6212120Sar4jc@virginia.edu                Rp2_sd = Mem_sw;
6312120Sar4jc@virginia.edu            }}, {{
6412322Sar4jc@virginia.edu                EA = Rp1 + offset;
6511723Sar4jc@virginia.edu            }});
6612120Sar4jc@virginia.edu            0x3: c_ld({{
6712322Sar4jc@virginia.edu                offset = CIMM3 << 3 | CIMM2 << 6;
6812120Sar4jc@virginia.edu            }}, {{
6912120Sar4jc@virginia.edu                Rp2_sd = Mem_sd;
7012120Sar4jc@virginia.edu            }}, {{
7112322Sar4jc@virginia.edu                EA = Rp1 + offset;
7211723Sar4jc@virginia.edu            }});
7312120Sar4jc@virginia.edu        }
7412120Sar4jc@virginia.edu        format CompressedStore {
7512120Sar4jc@virginia.edu            0x5: c_fsd({{
7612322Sar4jc@virginia.edu                offset = CIMM3 << 3 | CIMM2 << 6;
7712120Sar4jc@virginia.edu            }}, {{
7812120Sar4jc@virginia.edu                Mem = Fp2_bits;
7912120Sar4jc@virginia.edu            }}, {{
8012322Sar4jc@virginia.edu                EA = Rp1 + offset;
8111723Sar4jc@virginia.edu            }});
8212120Sar4jc@virginia.edu            0x6: c_sw({{
8312322Sar4jc@virginia.edu                offset = CIMM2<1:1> << 2 |
8412322Sar4jc@virginia.edu                         CIMM3 << 3 |
8512322Sar4jc@virginia.edu                         CIMM2<0:0> << 6;
8612120Sar4jc@virginia.edu            }}, {{
8712120Sar4jc@virginia.edu                Mem_uw = Rp2_uw;
8812120Sar4jc@virginia.edu            }}, ea_code={{
8912322Sar4jc@virginia.edu                EA = Rp1 + offset;
9011723Sar4jc@virginia.edu            }});
9112120Sar4jc@virginia.edu            0x7: c_sd({{
9212322Sar4jc@virginia.edu                offset = CIMM3 << 3 | CIMM2 << 6;
9312120Sar4jc@virginia.edu            }}, {{
9412120Sar4jc@virginia.edu                    Mem_ud = Rp2_ud;
9512120Sar4jc@virginia.edu            }}, {{
9612322Sar4jc@virginia.edu                EA = Rp1 + offset;
9711723Sar4jc@virginia.edu            }});
9811723Sar4jc@virginia.edu        }
9911723Sar4jc@virginia.edu    }
10012120Sar4jc@virginia.edu    0x1: decode COPCODE {
10112120Sar4jc@virginia.edu        format CIOp {
10212120Sar4jc@virginia.edu            0x0: c_addi({{
10312120Sar4jc@virginia.edu                imm = CIMM5;
10412120Sar4jc@virginia.edu                if (CIMM1 > 0)
10512120Sar4jc@virginia.edu                    imm |= ~((uint64_t)0x1F);
10612120Sar4jc@virginia.edu            }}, {{
10712136Sar4jc@virginia.edu                if ((RC1 == 0) != (imm == 0)) {
10812136Sar4jc@virginia.edu                    if (RC1 == 0) {
10912136Sar4jc@virginia.edu                        fault = make_shared<IllegalInstFault>("source reg x0");
11012136Sar4jc@virginia.edu                    } else // imm == 0
11112136Sar4jc@virginia.edu                        fault = make_shared<IllegalInstFault>("immediate = 0");
11212136Sar4jc@virginia.edu                }
11312120Sar4jc@virginia.edu                Rc1_sd = Rc1_sd + imm;
11412120Sar4jc@virginia.edu            }});
11512120Sar4jc@virginia.edu            0x1: c_addiw({{
11612120Sar4jc@virginia.edu                imm = CIMM5;
11712120Sar4jc@virginia.edu                if (CIMM1 > 0)
11812120Sar4jc@virginia.edu                    imm |= ~((uint64_t)0x1F);
11912120Sar4jc@virginia.edu            }}, {{
12012120Sar4jc@virginia.edu                assert(RC1 != 0);
12112120Sar4jc@virginia.edu                Rc1_sd = (int32_t)Rc1_sd + imm;
12212120Sar4jc@virginia.edu            }});
12312120Sar4jc@virginia.edu            0x2: c_li({{
12412120Sar4jc@virginia.edu                imm = CIMM5;
12512120Sar4jc@virginia.edu                if (CIMM1 > 0)
12612120Sar4jc@virginia.edu                    imm |= ~((uint64_t)0x1F);
12712120Sar4jc@virginia.edu            }}, {{
12812120Sar4jc@virginia.edu                assert(RC1 != 0);
12912120Sar4jc@virginia.edu                Rc1_sd = imm;
13012120Sar4jc@virginia.edu            }});
13112120Sar4jc@virginia.edu            0x3: decode RC1 {
13212120Sar4jc@virginia.edu                0x2: c_addi16sp({{
13312120Sar4jc@virginia.edu                    imm = CIMM5<4:4> << 4 |
13412120Sar4jc@virginia.edu                          CIMM5<0:0> << 5 |
13512120Sar4jc@virginia.edu                          CIMM5<3:3> << 6 |
13612120Sar4jc@virginia.edu                          CIMM5<2:1> << 7;
13712120Sar4jc@virginia.edu                    if (CIMM1 > 0)
13812120Sar4jc@virginia.edu                        imm |= ~((int64_t)0x1FF);
13912120Sar4jc@virginia.edu                }}, {{
14012120Sar4jc@virginia.edu                    assert(imm != 0);
14112120Sar4jc@virginia.edu                    sp_sd = sp_sd + imm;
14212120Sar4jc@virginia.edu                }});
14312120Sar4jc@virginia.edu                default: c_lui({{
14412120Sar4jc@virginia.edu                    imm = CIMM5 << 12;
14512120Sar4jc@virginia.edu                    if (CIMM1 > 0)
14612120Sar4jc@virginia.edu                        imm |= ~((uint64_t)0x1FFFF);
14712120Sar4jc@virginia.edu                }}, {{
14812120Sar4jc@virginia.edu                    assert(RC1 != 0 && RC1 != 2);
14912120Sar4jc@virginia.edu                    assert(imm != 0);
15012120Sar4jc@virginia.edu                    Rc1_sd = imm;
15112120Sar4jc@virginia.edu                }});
15212120Sar4jc@virginia.edu            }
15312120Sar4jc@virginia.edu        }
15412120Sar4jc@virginia.edu        0x4: decode CFUNCT2HIGH {
15512428Sar4jc@virginia.edu            format CIOp {
15612120Sar4jc@virginia.edu                0x0: c_srli({{
15712120Sar4jc@virginia.edu                    imm = CIMM5 | (CIMM1 << 5);
15812120Sar4jc@virginia.edu                    assert(imm != 0);
15912120Sar4jc@virginia.edu                }}, {{
16012120Sar4jc@virginia.edu                    Rp1 = Rp1 >> imm;
16112428Sar4jc@virginia.edu                }}, uint64_t);
16212120Sar4jc@virginia.edu                0x1: c_srai({{
16312120Sar4jc@virginia.edu                    imm = CIMM5 | (CIMM1 << 5);
16412120Sar4jc@virginia.edu                    assert(imm != 0);
16512120Sar4jc@virginia.edu                }}, {{
16612120Sar4jc@virginia.edu                    Rp1_sd = Rp1_sd >> imm;
16712428Sar4jc@virginia.edu                }}, uint64_t);
16812120Sar4jc@virginia.edu                0x2: c_andi({{
16912120Sar4jc@virginia.edu                    imm = CIMM5;
17012120Sar4jc@virginia.edu                    if (CIMM1 > 0)
17112120Sar4jc@virginia.edu                        imm |= ~((uint64_t)0x1F);
17212120Sar4jc@virginia.edu                }}, {{
17312120Sar4jc@virginia.edu                    Rp1 = Rp1 & imm;
17412428Sar4jc@virginia.edu                }}, uint64_t);
17512120Sar4jc@virginia.edu            }
17612120Sar4jc@virginia.edu            format ROp {
17712120Sar4jc@virginia.edu                0x3: decode CFUNCT1 {
17812120Sar4jc@virginia.edu                    0x0: decode CFUNCT2LOW {
17912120Sar4jc@virginia.edu                        0x0: c_sub({{
18012120Sar4jc@virginia.edu                            Rp1 = Rp1 - Rp2;
18112120Sar4jc@virginia.edu                        }});
18212120Sar4jc@virginia.edu                        0x1: c_xor({{
18312120Sar4jc@virginia.edu                            Rp1 = Rp1 ^ Rp2;
18412120Sar4jc@virginia.edu                        }});
18512120Sar4jc@virginia.edu                        0x2: c_or({{
18612120Sar4jc@virginia.edu                            Rp1 = Rp1 | Rp2;
18712120Sar4jc@virginia.edu                        }});
18812120Sar4jc@virginia.edu                        0x3: c_and({{
18912120Sar4jc@virginia.edu                            Rp1 = Rp1 & Rp2;
19012120Sar4jc@virginia.edu                        }});
19112120Sar4jc@virginia.edu                    }
19212120Sar4jc@virginia.edu                    0x1: decode CFUNCT2LOW {
19312120Sar4jc@virginia.edu                        0x0: c_subw({{
19412120Sar4jc@virginia.edu                            Rp1_sd = (int32_t)Rp1_sd - Rp2_sw;
19512120Sar4jc@virginia.edu                        }});
19612120Sar4jc@virginia.edu                        0x1: c_addw({{
19712120Sar4jc@virginia.edu                            Rp1_sd = (int32_t)Rp1_sd + Rp2_sw;
19812120Sar4jc@virginia.edu                        }});
19912120Sar4jc@virginia.edu                    }
20012120Sar4jc@virginia.edu                }
20112120Sar4jc@virginia.edu            }
20212120Sar4jc@virginia.edu        }
20312120Sar4jc@virginia.edu        0x5: JOp::c_j({{
20412120Sar4jc@virginia.edu            int64_t offset = CJUMPIMM<3:1> << 1 |
20512322Sar4jc@virginia.edu                             CJUMPIMM<9:9> << 4 |
20612322Sar4jc@virginia.edu                             CJUMPIMM<0:0> << 5 |
20712322Sar4jc@virginia.edu                             CJUMPIMM<5:5> << 6 |
20812322Sar4jc@virginia.edu                             CJUMPIMM<4:4> << 7 |
20912322Sar4jc@virginia.edu                             CJUMPIMM<8:7> << 8 |
21012322Sar4jc@virginia.edu                             CJUMPIMM<6:6> << 10;
21112120Sar4jc@virginia.edu            if (CJUMPIMM<10:10> > 0)
21212120Sar4jc@virginia.edu                offset |= ~((int64_t)0x7FF);
21312120Sar4jc@virginia.edu            NPC = PC + offset;
21412120Sar4jc@virginia.edu        }}, IsIndirectControl, IsUncondControl, IsCall);
21512535Sar4jc@virginia.edu        format CBOp {
21612120Sar4jc@virginia.edu            0x6: c_beqz({{
21712120Sar4jc@virginia.edu                if (Rp1 == 0)
21812535Sar4jc@virginia.edu                    NPC = PC + imm;
21912120Sar4jc@virginia.edu                else
22012120Sar4jc@virginia.edu                    NPC = NPC;
22112120Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
22212120Sar4jc@virginia.edu            0x7: c_bnez({{
22312120Sar4jc@virginia.edu                if (Rp1 != 0)
22412535Sar4jc@virginia.edu                    NPC = PC + imm;
22512120Sar4jc@virginia.edu                else
22612120Sar4jc@virginia.edu                    NPC = NPC;
22712120Sar4jc@virginia.edu            }}, IsDirectControl, IsCondControl);
22812120Sar4jc@virginia.edu        }
22912120Sar4jc@virginia.edu    }
23012120Sar4jc@virginia.edu    0x2: decode COPCODE {
23112428Sar4jc@virginia.edu        0x0: CIOp::c_slli({{
23212120Sar4jc@virginia.edu            imm = CIMM5 | (CIMM1 << 5);
23312120Sar4jc@virginia.edu            assert(imm != 0);
23412120Sar4jc@virginia.edu        }}, {{
23512120Sar4jc@virginia.edu            assert(RC1 != 0);
23612120Sar4jc@virginia.edu            Rc1 = Rc1 << imm;
23712428Sar4jc@virginia.edu        }}, uint64_t);
23812120Sar4jc@virginia.edu        format CompressedLoad {
23912120Sar4jc@virginia.edu            0x1: c_fldsp({{
24012322Sar4jc@virginia.edu                offset = CIMM5<4:3> << 3 |
24112322Sar4jc@virginia.edu                         CIMM1 << 5 |
24212322Sar4jc@virginia.edu                         CIMM5<2:0> << 6;
24312120Sar4jc@virginia.edu            }}, {{
24412120Sar4jc@virginia.edu                Fc1_bits = Mem;
24512120Sar4jc@virginia.edu            }}, {{
24612322Sar4jc@virginia.edu                EA = sp + offset;
24711725Sar4jc@virginia.edu            }});
24812120Sar4jc@virginia.edu            0x2: c_lwsp({{
24912322Sar4jc@virginia.edu                offset = CIMM5<4:2> << 2 |
25012322Sar4jc@virginia.edu                         CIMM1 << 5 |
25112322Sar4jc@virginia.edu                         CIMM5<1:0> << 6;
25212120Sar4jc@virginia.edu            }}, {{
25312120Sar4jc@virginia.edu                assert(RC1 != 0);
25412120Sar4jc@virginia.edu                Rc1_sd = Mem_sw;
25512120Sar4jc@virginia.edu            }}, {{
25612322Sar4jc@virginia.edu                EA = sp + offset;
25712120Sar4jc@virginia.edu            }});
25812120Sar4jc@virginia.edu            0x3: c_ldsp({{
25912322Sar4jc@virginia.edu                offset = CIMM5<4:3> << 3 |
26012322Sar4jc@virginia.edu                         CIMM1 << 5 |
26112322Sar4jc@virginia.edu                         CIMM5<2:0> << 6;
26212120Sar4jc@virginia.edu            }}, {{
26312120Sar4jc@virginia.edu                assert(RC1 != 0);
26412120Sar4jc@virginia.edu                Rc1_sd = Mem_sd;
26512120Sar4jc@virginia.edu            }}, {{
26612322Sar4jc@virginia.edu                EA = sp + offset;
26712120Sar4jc@virginia.edu            }});
26812120Sar4jc@virginia.edu        }
26912120Sar4jc@virginia.edu        0x4: decode CFUNCT1 {
27012120Sar4jc@virginia.edu            0x0: decode RC2 {
27112120Sar4jc@virginia.edu                0x0: Jump::c_jr({{
27212120Sar4jc@virginia.edu                    assert(RC1 != 0);
27312120Sar4jc@virginia.edu                    NPC = Rc1;
27412120Sar4jc@virginia.edu                }}, IsIndirectControl, IsUncondControl, IsCall);
27512120Sar4jc@virginia.edu                default: CROp::c_mv({{
27612120Sar4jc@virginia.edu                    assert(RC1 != 0);
27712120Sar4jc@virginia.edu                    Rc1 = Rc2;
27812120Sar4jc@virginia.edu                }});
27912120Sar4jc@virginia.edu            }
28012120Sar4jc@virginia.edu            0x1: decode RC1 {
28112120Sar4jc@virginia.edu                0x0: SystemOp::c_ebreak({{
28212120Sar4jc@virginia.edu                    assert(RC2 == 0);
28312120Sar4jc@virginia.edu                    fault = make_shared<BreakpointFault>();
28412120Sar4jc@virginia.edu                }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
28512120Sar4jc@virginia.edu                default: decode RC2 {
28612120Sar4jc@virginia.edu                    0x0: Jump::c_jalr({{
28712120Sar4jc@virginia.edu                        assert(RC1 != 0);
28812120Sar4jc@virginia.edu                        ra = NPC;
28912120Sar4jc@virginia.edu                        NPC = Rc1;
29012120Sar4jc@virginia.edu                    }}, IsIndirectControl, IsUncondControl, IsCall);
29112120Sar4jc@virginia.edu                    default: ROp::c_add({{
29212120Sar4jc@virginia.edu                        Rc1_sd = Rc1_sd + Rc2_sd;
29312120Sar4jc@virginia.edu                    }});
29412120Sar4jc@virginia.edu                }
29512120Sar4jc@virginia.edu            }
29612120Sar4jc@virginia.edu        }
29712120Sar4jc@virginia.edu        format CompressedStore {
29812120Sar4jc@virginia.edu            0x5: c_fsdsp({{
29912322Sar4jc@virginia.edu                offset = CIMM6<5:3> << 3 |
30012322Sar4jc@virginia.edu                         CIMM6<2:0> << 6;
30112120Sar4jc@virginia.edu            }}, {{
30212120Sar4jc@virginia.edu                Mem_ud = Fc2_bits;
30312120Sar4jc@virginia.edu            }}, {{
30412322Sar4jc@virginia.edu                EA = sp + offset;
30512120Sar4jc@virginia.edu            }});
30612120Sar4jc@virginia.edu            0x6: c_swsp({{
30712322Sar4jc@virginia.edu                offset = CIMM6<5:2> << 2 |
30812322Sar4jc@virginia.edu                         CIMM6<1:0> << 6;
30912120Sar4jc@virginia.edu            }}, {{
31012120Sar4jc@virginia.edu                Mem_uw = Rc2_uw;
31112120Sar4jc@virginia.edu            }}, {{
31212322Sar4jc@virginia.edu                EA = sp + offset;
31312120Sar4jc@virginia.edu            }});
31412120Sar4jc@virginia.edu            0x7: c_sdsp({{
31512322Sar4jc@virginia.edu                offset = CIMM6<5:3> << 3 |
31612322Sar4jc@virginia.edu                         CIMM6<2:0> << 6;
31712120Sar4jc@virginia.edu            }}, {{
31812120Sar4jc@virginia.edu                Mem = Rc2;
31912120Sar4jc@virginia.edu            }}, {{
32012322Sar4jc@virginia.edu                EA = sp + offset;
32111725Sar4jc@virginia.edu            }});
32211725Sar4jc@virginia.edu        }
32311725Sar4jc@virginia.edu    }
32412120Sar4jc@virginia.edu    0x3: decode OPCODE {
32512120Sar4jc@virginia.edu        0x00: decode FUNCT3 {
32612120Sar4jc@virginia.edu            format Load {
32712120Sar4jc@virginia.edu                0x0: lb({{
32812120Sar4jc@virginia.edu                    Rd_sd = Mem_sb;
32911723Sar4jc@virginia.edu                }});
33012120Sar4jc@virginia.edu                0x1: lh({{
33112120Sar4jc@virginia.edu                    Rd_sd = Mem_sh;
33211723Sar4jc@virginia.edu                }});
33312120Sar4jc@virginia.edu                0x2: lw({{
33412120Sar4jc@virginia.edu                    Rd_sd = Mem_sw;
33511723Sar4jc@virginia.edu                }});
33612120Sar4jc@virginia.edu                0x3: ld({{
33712120Sar4jc@virginia.edu                    Rd_sd = Mem_sd;
33812120Sar4jc@virginia.edu                }});
33912120Sar4jc@virginia.edu                0x4: lbu({{
34012120Sar4jc@virginia.edu                    Rd = Mem_ub;
34112120Sar4jc@virginia.edu                }});
34212120Sar4jc@virginia.edu                0x5: lhu({{
34312120Sar4jc@virginia.edu                    Rd = Mem_uh;
34412120Sar4jc@virginia.edu                }});
34512120Sar4jc@virginia.edu                0x6: lwu({{
34612120Sar4jc@virginia.edu                    Rd = Mem_uw;
34711723Sar4jc@virginia.edu                }});
34811723Sar4jc@virginia.edu            }
34911723Sar4jc@virginia.edu        }
35011723Sar4jc@virginia.edu
35112120Sar4jc@virginia.edu        0x01: decode FUNCT3 {
35212120Sar4jc@virginia.edu            format Load {
35312120Sar4jc@virginia.edu                0x2: flw({{
35412120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)Mem_uw;
35512445Sar4jc@virginia.edu                }}, inst_flags=FloatMemReadOp);
35612120Sar4jc@virginia.edu                0x3: fld({{
35712120Sar4jc@virginia.edu                    Fd_bits = Mem;
35812445Sar4jc@virginia.edu                }}, inst_flags=FloatMemReadOp);
35911726Sar4jc@virginia.edu            }
36011726Sar4jc@virginia.edu        }
36112120Sar4jc@virginia.edu
36212120Sar4jc@virginia.edu        0x03: decode FUNCT3 {
36312120Sar4jc@virginia.edu            format IOp {
36412120Sar4jc@virginia.edu                0x0: fence({{
36512428Sar4jc@virginia.edu                }}, uint64_t, IsNonSpeculative, IsMemBarrier, No_OpClass);
36612120Sar4jc@virginia.edu                0x1: fence_i({{
36712428Sar4jc@virginia.edu                }}, uint64_t, IsNonSpeculative, IsSerializeAfter, No_OpClass);
36811726Sar4jc@virginia.edu            }
36911726Sar4jc@virginia.edu        }
37012120Sar4jc@virginia.edu
37112120Sar4jc@virginia.edu        0x04: decode FUNCT3 {
37212120Sar4jc@virginia.edu            format IOp {
37312120Sar4jc@virginia.edu                0x0: addi({{
37412120Sar4jc@virginia.edu                    Rd_sd = Rs1_sd + imm;
37511723Sar4jc@virginia.edu                }});
37612120Sar4jc@virginia.edu                0x1: slli({{
37712120Sar4jc@virginia.edu                    Rd = Rs1 << SHAMT6;
37812120Sar4jc@virginia.edu                }});
37912120Sar4jc@virginia.edu                0x2: slti({{
38012120Sar4jc@virginia.edu                    Rd = (Rs1_sd < imm) ? 1 : 0;
38112120Sar4jc@virginia.edu                }});
38212120Sar4jc@virginia.edu                0x3: sltiu({{
38312428Sar4jc@virginia.edu                    Rd = (Rs1 < imm) ? 1 : 0;
38412428Sar4jc@virginia.edu                }}, uint64_t);
38512120Sar4jc@virginia.edu                0x4: xori({{
38612428Sar4jc@virginia.edu                    Rd = Rs1 ^ imm;
38712428Sar4jc@virginia.edu                }}, uint64_t);
38812120Sar4jc@virginia.edu                0x5: decode SRTYPE {
38912120Sar4jc@virginia.edu                    0x0: srli({{
39012120Sar4jc@virginia.edu                        Rd = Rs1 >> SHAMT6;
39112120Sar4jc@virginia.edu                    }});
39212120Sar4jc@virginia.edu                    0x1: srai({{
39312120Sar4jc@virginia.edu                        Rd_sd = Rs1_sd >> SHAMT6;
39412120Sar4jc@virginia.edu                    }});
39512120Sar4jc@virginia.edu                }
39612120Sar4jc@virginia.edu                0x6: ori({{
39712428Sar4jc@virginia.edu                    Rd = Rs1 | imm;
39812428Sar4jc@virginia.edu                }}, uint64_t);
39912120Sar4jc@virginia.edu                0x7: andi({{
40012428Sar4jc@virginia.edu                    Rd = Rs1 & imm;
40112428Sar4jc@virginia.edu                }}, uint64_t);
40211723Sar4jc@virginia.edu            }
40312120Sar4jc@virginia.edu        }
40412120Sar4jc@virginia.edu
40512120Sar4jc@virginia.edu        0x05: UOp::auipc({{
40612120Sar4jc@virginia.edu            Rd = PC + imm;
40712120Sar4jc@virginia.edu        }});
40812120Sar4jc@virginia.edu
40912120Sar4jc@virginia.edu        0x06: decode FUNCT3 {
41012120Sar4jc@virginia.edu            format IOp {
41112120Sar4jc@virginia.edu                0x0: addiw({{
41212428Sar4jc@virginia.edu                    Rd_sd = Rs1_sw + imm;
41312428Sar4jc@virginia.edu                }}, int32_t);
41412120Sar4jc@virginia.edu                0x1: slliw({{
41512120Sar4jc@virginia.edu                    Rd_sd = Rs1_sw << SHAMT5;
41612120Sar4jc@virginia.edu                }});
41712120Sar4jc@virginia.edu                0x5: decode SRTYPE {
41812120Sar4jc@virginia.edu                    0x0: srliw({{
41912120Sar4jc@virginia.edu                        Rd = Rs1_uw >> SHAMT5;
42012120Sar4jc@virginia.edu                    }});
42112120Sar4jc@virginia.edu                    0x1: sraiw({{
42212120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw >> SHAMT5;
42312120Sar4jc@virginia.edu                    }});
42412120Sar4jc@virginia.edu                }
42512120Sar4jc@virginia.edu            }
42612120Sar4jc@virginia.edu        }
42711724Sar4jc@virginia.edu
42812120Sar4jc@virginia.edu        0x08: decode FUNCT3 {
42912120Sar4jc@virginia.edu            format Store {
43012120Sar4jc@virginia.edu                0x0: sb({{
43112120Sar4jc@virginia.edu                    Mem_ub = Rs2_ub;
43212120Sar4jc@virginia.edu                }});
43312120Sar4jc@virginia.edu                0x1: sh({{
43412120Sar4jc@virginia.edu                    Mem_uh = Rs2_uh;
43512120Sar4jc@virginia.edu                }});
43612120Sar4jc@virginia.edu                0x2: sw({{
43712120Sar4jc@virginia.edu                    Mem_uw = Rs2_uw;
43812120Sar4jc@virginia.edu                }});
43912120Sar4jc@virginia.edu                0x3: sd({{
44012120Sar4jc@virginia.edu                    Mem_ud = Rs2_ud;
44112120Sar4jc@virginia.edu                }});
44212120Sar4jc@virginia.edu            }
44312120Sar4jc@virginia.edu        }
44411724Sar4jc@virginia.edu
44512120Sar4jc@virginia.edu        0x09: decode FUNCT3 {
44612120Sar4jc@virginia.edu            format Store {
44712120Sar4jc@virginia.edu                0x2: fsw({{
44812120Sar4jc@virginia.edu                    Mem_uw = (uint32_t)Fs2_bits;
44912445Sar4jc@virginia.edu                }}, inst_flags=FloatMemWriteOp);
45012120Sar4jc@virginia.edu                0x3: fsd({{
45112120Sar4jc@virginia.edu                    Mem_ud = Fs2_bits;
45212445Sar4jc@virginia.edu                }}, inst_flags=FloatMemWriteOp);
45312120Sar4jc@virginia.edu            }
45412120Sar4jc@virginia.edu        }
45511724Sar4jc@virginia.edu
45612120Sar4jc@virginia.edu        0x0b: decode FUNCT3 {
45712120Sar4jc@virginia.edu            0x2: decode AMOFUNCT {
45812120Sar4jc@virginia.edu                0x2: LoadReserved::lr_w({{
45912120Sar4jc@virginia.edu                    Rd_sd = Mem_sw;
46012120Sar4jc@virginia.edu                }}, mem_flags=LLSC);
46112120Sar4jc@virginia.edu                0x3: StoreCond::sc_w({{
46212120Sar4jc@virginia.edu                    Mem_uw = Rs2_uw;
46312120Sar4jc@virginia.edu                }}, {{
46412120Sar4jc@virginia.edu                    Rd = result;
46512120Sar4jc@virginia.edu                }}, inst_flags=IsStoreConditional, mem_flags=LLSC);
46612120Sar4jc@virginia.edu                format AtomicMemOp {
46712120Sar4jc@virginia.edu                    0x0: amoadd_w({{Rt_sd = Mem_sw;}}, {{
46812120Sar4jc@virginia.edu                        Mem_sw = Rs2_sw + Rt_sd;
46912120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
47012120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
47112120Sar4jc@virginia.edu                    0x1: amoswap_w({{Rt_sd = Mem_sw;}}, {{
47212120Sar4jc@virginia.edu                        Mem_sw = Rs2_uw;
47312120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
47412120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
47512120Sar4jc@virginia.edu                    0x4: amoxor_w({{Rt_sd = Mem_sw;}}, {{
47612120Sar4jc@virginia.edu                        Mem_sw = Rs2_uw^Rt_sd;
47712120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
47812120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
47912120Sar4jc@virginia.edu                    0x8: amoor_w({{Rt_sd = Mem_sw;}}, {{
48012120Sar4jc@virginia.edu                        Mem_sw = Rs2_uw | Rt_sd;
48112120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
48212120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
48312120Sar4jc@virginia.edu                    0xc: amoand_w({{Rt_sd = Mem_sw;}}, {{
48412120Sar4jc@virginia.edu                        Mem_sw = Rs2_uw&Rt_sd;
48512120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
48612120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
48712120Sar4jc@virginia.edu                    0x10: amomin_w({{Rt_sd = Mem_sw;}}, {{
48812120Sar4jc@virginia.edu                        Mem_sw = min<int32_t>(Rs2_sw, Rt_sd);
48912120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
49012120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
49112120Sar4jc@virginia.edu                    0x14: amomax_w({{Rt_sd = Mem_sw;}}, {{
49212120Sar4jc@virginia.edu                        Mem_sw = max<int32_t>(Rs2_sw, Rt_sd);
49312120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
49412120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
49512120Sar4jc@virginia.edu                    0x18: amominu_w({{Rt_sd = Mem_sw;}}, {{
49612120Sar4jc@virginia.edu                        Mem_sw = min<uint32_t>(Rs2_uw, Rt_sd);
49712120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
49812120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
49912120Sar4jc@virginia.edu                    0x1c: amomaxu_w({{Rt_sd = Mem_sw;}}, {{
50012120Sar4jc@virginia.edu                        Mem_sw = max<uint32_t>(Rs2_uw, Rt_sd);
50112120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
50212120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
50312120Sar4jc@virginia.edu                }
50411723Sar4jc@virginia.edu            }
50512120Sar4jc@virginia.edu            0x3: decode AMOFUNCT {
50612120Sar4jc@virginia.edu                0x2: LoadReserved::lr_d({{
50712120Sar4jc@virginia.edu                    Rd_sd = Mem_sd;
50812120Sar4jc@virginia.edu                }}, mem_flags=LLSC);
50912120Sar4jc@virginia.edu                0x3: StoreCond::sc_d({{
51012120Sar4jc@virginia.edu                    Mem = Rs2;
51112120Sar4jc@virginia.edu                }}, {{
51212120Sar4jc@virginia.edu                    Rd = result;
51312120Sar4jc@virginia.edu                }}, mem_flags=LLSC, inst_flags=IsStoreConditional);
51412120Sar4jc@virginia.edu                format AtomicMemOp {
51512120Sar4jc@virginia.edu                    0x0: amoadd_d({{Rt_sd = Mem_sd;}}, {{
51612120Sar4jc@virginia.edu                        Mem_sd = Rs2_sd + Rt_sd;
51712120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
51812120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
51912120Sar4jc@virginia.edu                    0x1: amoswap_d({{Rt = Mem;}}, {{
52012120Sar4jc@virginia.edu                        Mem = Rs2;
52112120Sar4jc@virginia.edu                        Rd = Rt;
52212120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
52312120Sar4jc@virginia.edu                    0x4: amoxor_d({{Rt = Mem;}}, {{
52412120Sar4jc@virginia.edu                        Mem = Rs2^Rt;
52512120Sar4jc@virginia.edu                        Rd = Rt;
52612120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
52712120Sar4jc@virginia.edu                    0x8: amoor_d({{Rt = Mem;}}, {{
52812120Sar4jc@virginia.edu                        Mem = Rs2 | Rt;
52912120Sar4jc@virginia.edu                        Rd = Rt;
53012120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
53112120Sar4jc@virginia.edu                    0xc: amoand_d({{Rt = Mem;}}, {{
53212120Sar4jc@virginia.edu                        Mem = Rs2&Rt;
53312120Sar4jc@virginia.edu                        Rd = Rt;
53412120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
53512120Sar4jc@virginia.edu                    0x10: amomin_d({{Rt_sd = Mem_sd;}}, {{
53612120Sar4jc@virginia.edu                        Mem_sd = min(Rs2_sd, Rt_sd);
53712120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
53812120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
53912120Sar4jc@virginia.edu                    0x14: amomax_d({{Rt_sd = Mem_sd;}}, {{
54012120Sar4jc@virginia.edu                        Mem_sd = max(Rs2_sd, Rt_sd);
54112120Sar4jc@virginia.edu                        Rd_sd = Rt_sd;
54212120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
54312120Sar4jc@virginia.edu                    0x18: amominu_d({{Rt = Mem;}}, {{
54412120Sar4jc@virginia.edu                        Mem = min(Rs2, Rt);
54512120Sar4jc@virginia.edu                        Rd = Rt;
54612120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
54712120Sar4jc@virginia.edu                    0x1c: amomaxu_d({{Rt = Mem;}}, {{
54812120Sar4jc@virginia.edu                        Mem = max(Rs2, Rt);
54912120Sar4jc@virginia.edu                        Rd = Rt;
55012120Sar4jc@virginia.edu                    }}, {{EA = Rs1;}});
55112120Sar4jc@virginia.edu                }
55212120Sar4jc@virginia.edu            }
55312120Sar4jc@virginia.edu        }
55412120Sar4jc@virginia.edu        0x0c: decode FUNCT3 {
55512120Sar4jc@virginia.edu            format ROp {
55612120Sar4jc@virginia.edu                0x0: decode FUNCT7 {
55712120Sar4jc@virginia.edu                    0x0: add({{
55812120Sar4jc@virginia.edu                        Rd = Rs1_sd + Rs2_sd;
55912120Sar4jc@virginia.edu                    }});
56012120Sar4jc@virginia.edu                    0x1: mul({{
56112120Sar4jc@virginia.edu                        Rd = Rs1_sd*Rs2_sd;
56212120Sar4jc@virginia.edu                    }}, IntMultOp);
56312120Sar4jc@virginia.edu                    0x20: sub({{
56412120Sar4jc@virginia.edu                        Rd = Rs1_sd - Rs2_sd;
56512120Sar4jc@virginia.edu                    }});
56612120Sar4jc@virginia.edu                }
56712120Sar4jc@virginia.edu                0x1: decode FUNCT7 {
56812120Sar4jc@virginia.edu                    0x0: sll({{
56912120Sar4jc@virginia.edu                        Rd = Rs1 << Rs2<5:0>;
57012120Sar4jc@virginia.edu                    }});
57112120Sar4jc@virginia.edu                    0x1: mulh({{
57212120Sar4jc@virginia.edu                        bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
57312120Sar4jc@virginia.edu
57412120Sar4jc@virginia.edu                        uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd);
57512120Sar4jc@virginia.edu                        uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32;
57612120Sar4jc@virginia.edu                        uint64_t Rs2_lo = (uint32_t)abs(Rs2_sd);
57712120Sar4jc@virginia.edu                        uint64_t Rs2_hi = (uint64_t)abs(Rs2_sd) >> 32;
57812120Sar4jc@virginia.edu
57912120Sar4jc@virginia.edu                        uint64_t hi = Rs1_hi*Rs2_hi;
58012120Sar4jc@virginia.edu                        uint64_t mid1 = Rs1_hi*Rs2_lo;
58112120Sar4jc@virginia.edu                        uint64_t mid2 = Rs1_lo*Rs2_hi;
58212120Sar4jc@virginia.edu                        uint64_t lo = Rs2_lo*Rs1_lo;
58312120Sar4jc@virginia.edu                        uint64_t carry = ((uint64_t)(uint32_t)mid1
58412120Sar4jc@virginia.edu                                + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
58512120Sar4jc@virginia.edu
58612120Sar4jc@virginia.edu                        uint64_t res = hi +
58712120Sar4jc@virginia.edu                                       (mid1 >> 32) +
58812120Sar4jc@virginia.edu                                       (mid2 >> 32) +
58912120Sar4jc@virginia.edu                                       carry;
59012120Sar4jc@virginia.edu                        Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0)
59112120Sar4jc@virginia.edu                                    : res;
59212120Sar4jc@virginia.edu                    }}, IntMultOp);
59312120Sar4jc@virginia.edu                }
59412120Sar4jc@virginia.edu                0x2: decode FUNCT7 {
59512120Sar4jc@virginia.edu                    0x0: slt({{
59612120Sar4jc@virginia.edu                        Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
59712120Sar4jc@virginia.edu                    }});
59812120Sar4jc@virginia.edu                    0x1: mulhsu({{
59912120Sar4jc@virginia.edu                        bool negate = Rs1_sd < 0;
60012120Sar4jc@virginia.edu                        uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd);
60112120Sar4jc@virginia.edu                        uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32;
60212120Sar4jc@virginia.edu                        uint64_t Rs2_lo = (uint32_t)Rs2;
60312120Sar4jc@virginia.edu                        uint64_t Rs2_hi = Rs2 >> 32;
60412120Sar4jc@virginia.edu
60512120Sar4jc@virginia.edu                        uint64_t hi = Rs1_hi*Rs2_hi;
60612120Sar4jc@virginia.edu                        uint64_t mid1 = Rs1_hi*Rs2_lo;
60712120Sar4jc@virginia.edu                        uint64_t mid2 = Rs1_lo*Rs2_hi;
60812120Sar4jc@virginia.edu                        uint64_t lo = Rs1_lo*Rs2_lo;
60912120Sar4jc@virginia.edu                        uint64_t carry = ((uint64_t)(uint32_t)mid1
61012120Sar4jc@virginia.edu                                + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
61112120Sar4jc@virginia.edu
61212120Sar4jc@virginia.edu                        uint64_t res = hi +
61312120Sar4jc@virginia.edu                                       (mid1 >> 32) +
61412120Sar4jc@virginia.edu                                       (mid2 >> 32) +
61512120Sar4jc@virginia.edu                                       carry;
61612120Sar4jc@virginia.edu                        Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
61712120Sar4jc@virginia.edu                    }}, IntMultOp);
61812120Sar4jc@virginia.edu                }
61912120Sar4jc@virginia.edu                0x3: decode FUNCT7 {
62012120Sar4jc@virginia.edu                    0x0: sltu({{
62112120Sar4jc@virginia.edu                        Rd = (Rs1 < Rs2) ? 1 : 0;
62212120Sar4jc@virginia.edu                    }});
62312120Sar4jc@virginia.edu                    0x1: mulhu({{
62412120Sar4jc@virginia.edu                        uint64_t Rs1_lo = (uint32_t)Rs1;
62512120Sar4jc@virginia.edu                        uint64_t Rs1_hi = Rs1 >> 32;
62612120Sar4jc@virginia.edu                        uint64_t Rs2_lo = (uint32_t)Rs2;
62712120Sar4jc@virginia.edu                        uint64_t Rs2_hi = Rs2 >> 32;
62812120Sar4jc@virginia.edu
62912120Sar4jc@virginia.edu                        uint64_t hi = Rs1_hi*Rs2_hi;
63012120Sar4jc@virginia.edu                        uint64_t mid1 = Rs1_hi*Rs2_lo;
63112120Sar4jc@virginia.edu                        uint64_t mid2 = Rs1_lo*Rs2_hi;
63212120Sar4jc@virginia.edu                        uint64_t lo = Rs1_lo*Rs2_lo;
63312120Sar4jc@virginia.edu                        uint64_t carry = ((uint64_t)(uint32_t)mid1
63412120Sar4jc@virginia.edu                                + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
63512120Sar4jc@virginia.edu
63612120Sar4jc@virginia.edu                        Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
63712120Sar4jc@virginia.edu                    }}, IntMultOp);
63812120Sar4jc@virginia.edu                }
63912120Sar4jc@virginia.edu                0x4: decode FUNCT7 {
64012120Sar4jc@virginia.edu                    0x0: xor({{
64112120Sar4jc@virginia.edu                        Rd = Rs1 ^ Rs2;
64212120Sar4jc@virginia.edu                    }});
64312120Sar4jc@virginia.edu                    0x1: div({{
64412120Sar4jc@virginia.edu                        if (Rs2_sd == 0) {
64512120Sar4jc@virginia.edu                            Rd_sd = -1;
64612120Sar4jc@virginia.edu                        } else if (Rs1_sd == numeric_limits<int64_t>::min()
64712120Sar4jc@virginia.edu                                && Rs2_sd == -1) {
64812120Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::min();
64912120Sar4jc@virginia.edu                        } else {
65012120Sar4jc@virginia.edu                            Rd_sd = Rs1_sd/Rs2_sd;
65112120Sar4jc@virginia.edu                        }
65212120Sar4jc@virginia.edu                    }}, IntDivOp);
65312120Sar4jc@virginia.edu                }
65412120Sar4jc@virginia.edu                0x5: decode FUNCT7 {
65512120Sar4jc@virginia.edu                    0x0: srl({{
65612120Sar4jc@virginia.edu                        Rd = Rs1 >> Rs2<5:0>;
65712120Sar4jc@virginia.edu                    }});
65812120Sar4jc@virginia.edu                    0x1: divu({{
65912120Sar4jc@virginia.edu                        if (Rs2 == 0) {
66012120Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
66112120Sar4jc@virginia.edu                        } else {
66212120Sar4jc@virginia.edu                            Rd = Rs1/Rs2;
66312120Sar4jc@virginia.edu                        }
66412120Sar4jc@virginia.edu                    }}, IntDivOp);
66512120Sar4jc@virginia.edu                    0x20: sra({{
66612120Sar4jc@virginia.edu                        Rd_sd = Rs1_sd >> Rs2<5:0>;
66712120Sar4jc@virginia.edu                    }});
66812120Sar4jc@virginia.edu                }
66912120Sar4jc@virginia.edu                0x6: decode FUNCT7 {
67012120Sar4jc@virginia.edu                    0x0: or({{
67112120Sar4jc@virginia.edu                        Rd = Rs1 | Rs2;
67212120Sar4jc@virginia.edu                    }});
67312120Sar4jc@virginia.edu                    0x1: rem({{
67412120Sar4jc@virginia.edu                        if (Rs2_sd == 0) {
67512120Sar4jc@virginia.edu                            Rd = Rs1_sd;
67612120Sar4jc@virginia.edu                        } else if (Rs1_sd == numeric_limits<int64_t>::min()
67712120Sar4jc@virginia.edu                                && Rs2_sd == -1) {
67812120Sar4jc@virginia.edu                            Rd = 0;
67912120Sar4jc@virginia.edu                        } else {
68012120Sar4jc@virginia.edu                            Rd = Rs1_sd%Rs2_sd;
68112120Sar4jc@virginia.edu                        }
68212120Sar4jc@virginia.edu                    }}, IntDivOp);
68312120Sar4jc@virginia.edu                }
68412120Sar4jc@virginia.edu                0x7: decode FUNCT7 {
68512120Sar4jc@virginia.edu                    0x0: and({{
68612120Sar4jc@virginia.edu                        Rd = Rs1 & Rs2;
68712120Sar4jc@virginia.edu                    }});
68812120Sar4jc@virginia.edu                    0x1: remu({{
68912120Sar4jc@virginia.edu                        if (Rs2 == 0) {
69012120Sar4jc@virginia.edu                            Rd = Rs1;
69112120Sar4jc@virginia.edu                        } else {
69212120Sar4jc@virginia.edu                            Rd = Rs1%Rs2;
69312120Sar4jc@virginia.edu                        }
69412120Sar4jc@virginia.edu                    }}, IntDivOp);
69512120Sar4jc@virginia.edu                }
69612120Sar4jc@virginia.edu            }
69712120Sar4jc@virginia.edu        }
69812120Sar4jc@virginia.edu
69912120Sar4jc@virginia.edu        0x0d: UOp::lui({{
70012120Sar4jc@virginia.edu            Rd = (uint64_t)imm;
70112120Sar4jc@virginia.edu        }});
70212120Sar4jc@virginia.edu
70312120Sar4jc@virginia.edu        0x0e: decode FUNCT3 {
70412120Sar4jc@virginia.edu            format ROp {
70512120Sar4jc@virginia.edu                0x0: decode FUNCT7 {
70612120Sar4jc@virginia.edu                    0x0: addw({{
70712120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw + Rs2_sw;
70812120Sar4jc@virginia.edu                    }});
70912120Sar4jc@virginia.edu                    0x1: mulw({{
71012120Sar4jc@virginia.edu                        Rd_sd = (int32_t)(Rs1_sw*Rs2_sw);
71112120Sar4jc@virginia.edu                    }}, IntMultOp);
71212120Sar4jc@virginia.edu                    0x20: subw({{
71312120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw - Rs2_sw;
71412120Sar4jc@virginia.edu                    }});
71512120Sar4jc@virginia.edu                }
71612120Sar4jc@virginia.edu                0x1: sllw({{
71712120Sar4jc@virginia.edu                    Rd_sd = Rs1_sw << Rs2<4:0>;
71811723Sar4jc@virginia.edu                }});
71912120Sar4jc@virginia.edu                0x4: divw({{
72012120Sar4jc@virginia.edu                    if (Rs2_sw == 0) {
72111724Sar4jc@virginia.edu                        Rd_sd = -1;
72212120Sar4jc@virginia.edu                    } else if (Rs1_sw == numeric_limits<int32_t>::min()
72312120Sar4jc@virginia.edu                            && Rs2_sw == -1) {
72412120Sar4jc@virginia.edu                        Rd_sd = numeric_limits<int32_t>::min();
72511724Sar4jc@virginia.edu                    } else {
72612120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw/Rs2_sw;
72711724Sar4jc@virginia.edu                    }
72811724Sar4jc@virginia.edu                }}, IntDivOp);
72912120Sar4jc@virginia.edu                0x5: decode FUNCT7 {
73012120Sar4jc@virginia.edu                    0x0: srlw({{
73112120Sar4jc@virginia.edu                        Rd_uw = Rs1_uw >> Rs2<4:0>;
73212120Sar4jc@virginia.edu                    }});
73312120Sar4jc@virginia.edu                    0x1: divuw({{
73412120Sar4jc@virginia.edu                        if (Rs2_uw == 0) {
73512120Sar4jc@virginia.edu                            Rd_sd = numeric_limits<IntReg>::max();
73612120Sar4jc@virginia.edu                        } else {
73712120Sar4jc@virginia.edu                            Rd_sd = (int32_t)(Rs1_uw/Rs2_uw);
73812120Sar4jc@virginia.edu                        }
73912120Sar4jc@virginia.edu                    }}, IntDivOp);
74012120Sar4jc@virginia.edu                    0x20: sraw({{
74112120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw >> Rs2<4:0>;
74212120Sar4jc@virginia.edu                    }});
74312120Sar4jc@virginia.edu                }
74412120Sar4jc@virginia.edu                0x6: remw({{
74512120Sar4jc@virginia.edu                    if (Rs2_sw == 0) {
74612120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw;
74712120Sar4jc@virginia.edu                    } else if (Rs1_sw == numeric_limits<int32_t>::min()
74812120Sar4jc@virginia.edu                            && Rs2_sw == -1) {
74912120Sar4jc@virginia.edu                        Rd_sd = 0;
75011724Sar4jc@virginia.edu                    } else {
75112120Sar4jc@virginia.edu                        Rd_sd = Rs1_sw%Rs2_sw;
75211724Sar4jc@virginia.edu                    }
75311724Sar4jc@virginia.edu                }}, IntDivOp);
75412120Sar4jc@virginia.edu                0x7: remuw({{
75512120Sar4jc@virginia.edu                    if (Rs2_uw == 0) {
75612120Sar4jc@virginia.edu                        Rd_sd = (int32_t)Rs1_uw;
75711724Sar4jc@virginia.edu                    } else {
75812120Sar4jc@virginia.edu                        Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
75911724Sar4jc@virginia.edu                    }
76011724Sar4jc@virginia.edu                }}, IntDivOp);
76111723Sar4jc@virginia.edu            }
76211723Sar4jc@virginia.edu        }
76311723Sar4jc@virginia.edu
76412120Sar4jc@virginia.edu        format FPROp {
76512120Sar4jc@virginia.edu            0x10: decode FUNCT2 {
76612120Sar4jc@virginia.edu                0x0: fmadd_s({{
76712120Sar4jc@virginia.edu                    uint32_t temp;
76812120Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
76912120Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
77012120Sar4jc@virginia.edu                    float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
77112120Sar4jc@virginia.edu                    float fd;
77211723Sar4jc@virginia.edu
77312138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2) ||
77412138Sgabeblack@google.com                            std::isnan(fs3)) {
77512120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)
77612120Sar4jc@virginia.edu                                || issignalingnan(fs3)) {
77712120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
77812120Sar4jc@virginia.edu                        }
77912120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
78012138Sgabeblack@google.com                    } else if (std::isinf(fs1) || std::isinf(fs2) ||
78112138Sgabeblack@google.com                            std::isinf(fs3)) {
78212120Sar4jc@virginia.edu                        if (signbit(fs1) == signbit(fs2)
78312138Sgabeblack@google.com                                && !std::isinf(fs3)) {
78412120Sar4jc@virginia.edu                            fd = numeric_limits<float>::infinity();
78512120Sar4jc@virginia.edu                        } else if (signbit(fs1) != signbit(fs2)
78612138Sgabeblack@google.com                                && !std::isinf(fs3)) {
78712120Sar4jc@virginia.edu                            fd = -numeric_limits<float>::infinity();
78812120Sar4jc@virginia.edu                        } else { // Fs3_sf is infinity
78912120Sar4jc@virginia.edu                            fd = fs3;
79012120Sar4jc@virginia.edu                        }
79112120Sar4jc@virginia.edu                    } else {
79212120Sar4jc@virginia.edu                        fd = fs1*fs2 + fs3;
79312120Sar4jc@virginia.edu                    }
79412120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
79512445Sar4jc@virginia.edu                }}, FloatMultAccOp);
79612120Sar4jc@virginia.edu                0x1: fmadd_d({{
79712138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2) ||
79812138Sgabeblack@google.com                            std::isnan(Fs3)) {
79912120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)
80012120Sar4jc@virginia.edu                                || issignalingnan(Fs3)) {
80112120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
80212120Sar4jc@virginia.edu                        }
80312120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
80412138Sgabeblack@google.com                    } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
80512138Sgabeblack@google.com                            std::isinf(Fs3)) {
80612120Sar4jc@virginia.edu                        if (signbit(Fs1) == signbit(Fs2)
80712138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
80812120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::infinity();
80912120Sar4jc@virginia.edu                        } else if (signbit(Fs1) != signbit(Fs2)
81012138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
81112120Sar4jc@virginia.edu                            Fd = -numeric_limits<double>::infinity();
81212120Sar4jc@virginia.edu                        } else {
81312120Sar4jc@virginia.edu                            Fd = Fs3;
81412120Sar4jc@virginia.edu                        }
81512120Sar4jc@virginia.edu                    } else {
81612120Sar4jc@virginia.edu                        Fd = Fs1*Fs2 + Fs3;
81712120Sar4jc@virginia.edu                    }
81812445Sar4jc@virginia.edu                }}, FloatMultAccOp);
81911723Sar4jc@virginia.edu            }
82012120Sar4jc@virginia.edu            0x11: decode FUNCT2 {
82112120Sar4jc@virginia.edu                0x0: fmsub_s({{
82212120Sar4jc@virginia.edu                    uint32_t temp;
82312120Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
82412120Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
82512120Sar4jc@virginia.edu                    float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
82612120Sar4jc@virginia.edu                    float fd;
82712120Sar4jc@virginia.edu
82812138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2) ||
82912138Sgabeblack@google.com                            std::isnan(fs3)) {
83012120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)
83112120Sar4jc@virginia.edu                                || issignalingnan(fs3)) {
83212120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
83312120Sar4jc@virginia.edu                        }
83412120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
83512138Sgabeblack@google.com                    } else if (std::isinf(fs1) || std::isinf(fs2) ||
83612138Sgabeblack@google.com                            std::isinf(fs3)) {
83712120Sar4jc@virginia.edu                        if (signbit(fs1) == signbit(fs2)
83812138Sgabeblack@google.com                                && !std::isinf(fs3)) {
83912120Sar4jc@virginia.edu                            fd = numeric_limits<float>::infinity();
84012120Sar4jc@virginia.edu                        } else if (signbit(fs1) != signbit(fs2)
84112138Sgabeblack@google.com                                && !std::isinf(fs3)) {
84212120Sar4jc@virginia.edu                            fd = -numeric_limits<float>::infinity();
84312120Sar4jc@virginia.edu                        } else { // Fs3_sf is infinity
84412120Sar4jc@virginia.edu                            fd = -fs3;
84512120Sar4jc@virginia.edu                        }
84611724Sar4jc@virginia.edu                    } else {
84712120Sar4jc@virginia.edu                        fd = fs1*fs2 - fs3;
84811724Sar4jc@virginia.edu                    }
84912120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
85012445Sar4jc@virginia.edu                }}, FloatMultAccOp);
85112120Sar4jc@virginia.edu                0x1: fmsub_d({{
85212138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2) ||
85312138Sgabeblack@google.com                            std::isnan(Fs3)) {
85412120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)
85512120Sar4jc@virginia.edu                                || issignalingnan(Fs3)) {
85612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
85712120Sar4jc@virginia.edu                        }
85812120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
85912138Sgabeblack@google.com                    } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
86012138Sgabeblack@google.com                            std::isinf(Fs3)) {
86112120Sar4jc@virginia.edu                        if (signbit(Fs1) == signbit(Fs2)
86212138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
86312120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::infinity();
86412120Sar4jc@virginia.edu                        } else if (signbit(Fs1) != signbit(Fs2)
86512138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
86612120Sar4jc@virginia.edu                            Fd = -numeric_limits<double>::infinity();
86712120Sar4jc@virginia.edu                        } else {
86812120Sar4jc@virginia.edu                            Fd = -Fs3;
86912120Sar4jc@virginia.edu                        }
87012120Sar4jc@virginia.edu                    } else {
87112120Sar4jc@virginia.edu                        Fd = Fs1*Fs2 - Fs3;
87212120Sar4jc@virginia.edu                    }
87312445Sar4jc@virginia.edu                }}, FloatMultAccOp);
87411723Sar4jc@virginia.edu            }
87512120Sar4jc@virginia.edu            0x12: decode FUNCT2 {
87612120Sar4jc@virginia.edu                0x0: fnmsub_s({{
87712120Sar4jc@virginia.edu                    uint32_t temp;
87812120Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
87912120Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
88012120Sar4jc@virginia.edu                    float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
88112120Sar4jc@virginia.edu                    float fd;
88211723Sar4jc@virginia.edu
88312138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2) ||
88412138Sgabeblack@google.com                            std::isnan(fs3)) {
88512120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)
88612120Sar4jc@virginia.edu                                || issignalingnan(fs3)) {
88712120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
88812120Sar4jc@virginia.edu                        }
88912120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
89012138Sgabeblack@google.com                    } else if (std::isinf(fs1) || std::isinf(fs2) ||
89112138Sgabeblack@google.com                            std::isinf(fs3)) {
89212120Sar4jc@virginia.edu                        if (signbit(fs1) == signbit(fs2)
89312138Sgabeblack@google.com                                && !std::isinf(fs3)) {
89412120Sar4jc@virginia.edu                            fd = -numeric_limits<float>::infinity();
89512120Sar4jc@virginia.edu                        } else if (signbit(fs1) != signbit(fs2)
89612138Sgabeblack@google.com                                && !std::isinf(fs3)) {
89712120Sar4jc@virginia.edu                            fd = numeric_limits<float>::infinity();
89812120Sar4jc@virginia.edu                        } else { // Fs3_sf is infinity
89912120Sar4jc@virginia.edu                            fd = fs3;
90012120Sar4jc@virginia.edu                        }
90112120Sar4jc@virginia.edu                    } else {
90212120Sar4jc@virginia.edu                        fd = -(fs1*fs2 - fs3);
90312120Sar4jc@virginia.edu                    }
90412120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
90512445Sar4jc@virginia.edu                }}, FloatMultAccOp);
90612120Sar4jc@virginia.edu                0x1: fnmsub_d({{
90712138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2) ||
90812138Sgabeblack@google.com                            std::isnan(Fs3)) {
90912120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)
91012120Sar4jc@virginia.edu                                || issignalingnan(Fs3)) {
91112120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
91212120Sar4jc@virginia.edu                        }
91312120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
91412138Sgabeblack@google.com                    } else if (std::isinf(Fs1) || std::isinf(Fs2)
91512138Sgabeblack@google.com                            || std::isinf(Fs3)) {
91612120Sar4jc@virginia.edu                        if (signbit(Fs1) == signbit(Fs2)
91712138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
91812120Sar4jc@virginia.edu                            Fd = -numeric_limits<double>::infinity();
91912120Sar4jc@virginia.edu                        } else if (signbit(Fs1) != signbit(Fs2)
92012138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
92112120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::infinity();
92212120Sar4jc@virginia.edu                        } else {
92312120Sar4jc@virginia.edu                            Fd = Fs3;
92412120Sar4jc@virginia.edu                        }
92512120Sar4jc@virginia.edu                    } else {
92612120Sar4jc@virginia.edu                        Fd = -(Fs1*Fs2 - Fs3);
92712120Sar4jc@virginia.edu                    }
92812445Sar4jc@virginia.edu                }}, FloatMultAccOp);
92912120Sar4jc@virginia.edu            }
93012120Sar4jc@virginia.edu            0x13: decode FUNCT2 {
93112120Sar4jc@virginia.edu                0x0: fnmadd_s({{
93212120Sar4jc@virginia.edu                    uint32_t temp;
93312120Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
93412120Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
93512120Sar4jc@virginia.edu                    float fs3 = reinterpret_cast<float&>(temp = Fs3_bits);
93612120Sar4jc@virginia.edu                    float fd;
93711725Sar4jc@virginia.edu
93812138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2) ||
93912138Sgabeblack@google.com                            std::isnan(fs3)) {
94012120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)
94112120Sar4jc@virginia.edu                                || issignalingnan(fs3)) {
94212120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
94312120Sar4jc@virginia.edu                        }
94412120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
94512138Sgabeblack@google.com                    } else if (std::isinf(fs1) || std::isinf(fs2) ||
94612138Sgabeblack@google.com                            std::isinf(fs3)) {
94712120Sar4jc@virginia.edu                        if (signbit(fs1) == signbit(fs2)
94812138Sgabeblack@google.com                                && !std::isinf(fs3)) {
94912120Sar4jc@virginia.edu                            fd = -numeric_limits<float>::infinity();
95012120Sar4jc@virginia.edu                        } else if (signbit(fs1) != signbit(fs2)
95112138Sgabeblack@google.com                                && !std::isinf(fs3)) {
95212120Sar4jc@virginia.edu                            fd = numeric_limits<float>::infinity();
95312120Sar4jc@virginia.edu                        } else { // Fs3_sf is infinity
95412120Sar4jc@virginia.edu                            fd = -fs3;
95512120Sar4jc@virginia.edu                        }
95612120Sar4jc@virginia.edu                    } else {
95712120Sar4jc@virginia.edu                        fd = -(fs1*fs2 + fs3);
95811725Sar4jc@virginia.edu                    }
95912120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
96012445Sar4jc@virginia.edu                }}, FloatMultAccOp);
96112120Sar4jc@virginia.edu                0x1: fnmadd_d({{
96212138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2) ||
96312138Sgabeblack@google.com                            std::isnan(Fs3)) {
96412120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)
96512120Sar4jc@virginia.edu                                || issignalingnan(Fs3)) {
96612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
96712120Sar4jc@virginia.edu                        }
96812120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
96912138Sgabeblack@google.com                    } else if (std::isinf(Fs1) || std::isinf(Fs2) ||
97012138Sgabeblack@google.com                            std::isinf(Fs3)) {
97112120Sar4jc@virginia.edu                        if (signbit(Fs1) == signbit(Fs2)
97212138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
97312120Sar4jc@virginia.edu                            Fd = -numeric_limits<double>::infinity();
97412120Sar4jc@virginia.edu                        } else if (signbit(Fs1) != signbit(Fs2)
97512138Sgabeblack@google.com                                && !std::isinf(Fs3)) {
97612120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::infinity();
97712120Sar4jc@virginia.edu                        } else {
97812120Sar4jc@virginia.edu                            Fd = -Fs3;
97912120Sar4jc@virginia.edu                        }
98012120Sar4jc@virginia.edu                    } else {
98112120Sar4jc@virginia.edu                        Fd = -(Fs1*Fs2 + Fs3);
98211725Sar4jc@virginia.edu                    }
98312445Sar4jc@virginia.edu                }}, FloatMultAccOp);
98412120Sar4jc@virginia.edu            }
98512120Sar4jc@virginia.edu            0x14: decode FUNCT7 {
98612120Sar4jc@virginia.edu                0x0: fadd_s({{
98711725Sar4jc@virginia.edu                    uint32_t temp;
98811725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
98911725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
99011725Sar4jc@virginia.edu                    float fd;
99111725Sar4jc@virginia.edu
99212138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2)) {
99312120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)) {
99412120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
99512120Sar4jc@virginia.edu                        }
99612120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
99711725Sar4jc@virginia.edu                    } else {
99812120Sar4jc@virginia.edu                        fd = fs1 + fs2;
99911725Sar4jc@virginia.edu                    }
100011725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
100112120Sar4jc@virginia.edu                }}, FloatAddOp);
100212120Sar4jc@virginia.edu                0x1: fadd_d({{
100312138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
100412120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
100512120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
100612120Sar4jc@virginia.edu                        }
100712120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
100812120Sar4jc@virginia.edu                    } else {
100912120Sar4jc@virginia.edu                        Fd = Fs1 + Fs2;
101012120Sar4jc@virginia.edu                    }
101112120Sar4jc@virginia.edu                }}, FloatAddOp);
101212120Sar4jc@virginia.edu                0x4: fsub_s({{
101311725Sar4jc@virginia.edu                    uint32_t temp;
101411725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
101511725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
101611725Sar4jc@virginia.edu                    float fd;
101711725Sar4jc@virginia.edu
101812138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2)) {
101912120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)) {
102012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
102112120Sar4jc@virginia.edu                        }
102212120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
102311725Sar4jc@virginia.edu                    } else {
102412120Sar4jc@virginia.edu                        fd = fs1 - fs2;
102511725Sar4jc@virginia.edu                    }
102611725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
102712120Sar4jc@virginia.edu                }}, FloatAddOp);
102812120Sar4jc@virginia.edu                0x5: fsub_d({{
102912138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
103012120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
103112120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
103212120Sar4jc@virginia.edu                        }
103312120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
103412120Sar4jc@virginia.edu                    } else {
103512120Sar4jc@virginia.edu                        Fd = Fs1 - Fs2;
103612120Sar4jc@virginia.edu                    }
103712120Sar4jc@virginia.edu                }}, FloatAddOp);
103812120Sar4jc@virginia.edu                0x8: fmul_s({{
103911725Sar4jc@virginia.edu                    uint32_t temp;
104011725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
104111725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
104211725Sar4jc@virginia.edu                    float fd;
104311725Sar4jc@virginia.edu
104412138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2)) {
104512120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)) {
104612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
104712120Sar4jc@virginia.edu                        }
104812120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
104911725Sar4jc@virginia.edu                    } else {
105012120Sar4jc@virginia.edu                        fd = fs1*fs2;
105111725Sar4jc@virginia.edu                    }
105211725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
105312120Sar4jc@virginia.edu                }}, FloatMultOp);
105412120Sar4jc@virginia.edu                0x9: fmul_d({{
105512138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
105612120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
105712120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
105812120Sar4jc@virginia.edu                        }
105912120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
106011725Sar4jc@virginia.edu                    } else {
106112120Sar4jc@virginia.edu                        Fd = Fs1*Fs2;
106211725Sar4jc@virginia.edu                    }
106312120Sar4jc@virginia.edu                }}, FloatMultOp);
106412120Sar4jc@virginia.edu                0xc: fdiv_s({{
106511725Sar4jc@virginia.edu                    uint32_t temp;
106611725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
106711725Sar4jc@virginia.edu                    float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
106811725Sar4jc@virginia.edu                    float fd;
106911725Sar4jc@virginia.edu
107012138Sgabeblack@google.com                    if (std::isnan(fs1) || std::isnan(fs2)) {
107112120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)) {
107212120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
107312120Sar4jc@virginia.edu                        }
107412120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
107512120Sar4jc@virginia.edu                    } else {
107612120Sar4jc@virginia.edu                        fd = fs1/fs2;
107712120Sar4jc@virginia.edu                    }
107812120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
107912120Sar4jc@virginia.edu                }}, FloatDivOp);
108012120Sar4jc@virginia.edu                0xd: fdiv_d({{
108112138Sgabeblack@google.com                    if (std::isnan(Fs1) || std::isnan(Fs2)) {
108212120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
108312120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
108412120Sar4jc@virginia.edu                        }
108512120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
108612120Sar4jc@virginia.edu                    } else {
108712120Sar4jc@virginia.edu                        Fd = Fs1/Fs2;
108812120Sar4jc@virginia.edu                    }
108912120Sar4jc@virginia.edu                }}, FloatDivOp);
109012120Sar4jc@virginia.edu                0x10: decode ROUND_MODE {
109112120Sar4jc@virginia.edu                    0x0: fsgnj_s({{
109212120Sar4jc@virginia.edu                        uint32_t temp;
109312120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
109412120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
109512120Sar4jc@virginia.edu                        float fd;
109612120Sar4jc@virginia.edu
109712120Sar4jc@virginia.edu                        if (issignalingnan(fs1)) {
109812120Sar4jc@virginia.edu                            fd = numeric_limits<float>::signaling_NaN();
109912120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
110012120Sar4jc@virginia.edu                        } else {
110112120Sar4jc@virginia.edu                            fd = copysign(fs1, fs2);
110212120Sar4jc@virginia.edu                        }
110312120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
110412445Sar4jc@virginia.edu                    }}, FloatMiscOp);
110512120Sar4jc@virginia.edu                    0x1: fsgnjn_s({{
110612120Sar4jc@virginia.edu                        uint32_t temp;
110712120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
110812120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
110912120Sar4jc@virginia.edu                        float fd;
111012120Sar4jc@virginia.edu
111112120Sar4jc@virginia.edu                        if (issignalingnan(fs1)) {
111212120Sar4jc@virginia.edu                            fd = numeric_limits<float>::signaling_NaN();
111312120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
111412120Sar4jc@virginia.edu                        } else {
111512120Sar4jc@virginia.edu                            fd = copysign(fs1, -fs2);
111612120Sar4jc@virginia.edu                        }
111712120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
111812445Sar4jc@virginia.edu                    }}, FloatMiscOp);
111912120Sar4jc@virginia.edu                    0x2: fsgnjx_s({{
112012120Sar4jc@virginia.edu                        uint32_t temp;
112112120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
112212120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
112312120Sar4jc@virginia.edu                        float fd;
112412120Sar4jc@virginia.edu
112512120Sar4jc@virginia.edu                        if (issignalingnan(fs1)) {
112612120Sar4jc@virginia.edu                            fd = numeric_limits<float>::signaling_NaN();
112712120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
112812120Sar4jc@virginia.edu                        } else {
112912120Sar4jc@virginia.edu                            fd = fs1*(signbit(fs2) ? -1.0 : 1.0);
113012120Sar4jc@virginia.edu                        }
113112120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
113212445Sar4jc@virginia.edu                    }}, FloatMiscOp);
113312120Sar4jc@virginia.edu                }
113412120Sar4jc@virginia.edu                0x11: decode ROUND_MODE {
113512120Sar4jc@virginia.edu                    0x0: fsgnj_d({{
113612120Sar4jc@virginia.edu                        if (issignalingnan(Fs1)) {
113712120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::signaling_NaN();
113812120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
113912120Sar4jc@virginia.edu                        } else {
114012120Sar4jc@virginia.edu                            Fd = copysign(Fs1, Fs2);
114112120Sar4jc@virginia.edu                        }
114212445Sar4jc@virginia.edu                    }}, FloatMiscOp);
114312120Sar4jc@virginia.edu                    0x1: fsgnjn_d({{
114412120Sar4jc@virginia.edu                        if (issignalingnan(Fs1)) {
114512120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::signaling_NaN();
114612120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
114712120Sar4jc@virginia.edu                        } else {
114812120Sar4jc@virginia.edu                            Fd = copysign(Fs1, -Fs2);
114912120Sar4jc@virginia.edu                        }
115012445Sar4jc@virginia.edu                    }}, FloatMiscOp);
115112120Sar4jc@virginia.edu                    0x2: fsgnjx_d({{
115212120Sar4jc@virginia.edu                        if (issignalingnan(Fs1)) {
115312120Sar4jc@virginia.edu                            Fd = numeric_limits<double>::signaling_NaN();
115412120Sar4jc@virginia.edu                            feclearexcept(FE_INVALID);
115512120Sar4jc@virginia.edu                        } else {
115612120Sar4jc@virginia.edu                            Fd = Fs1*(signbit(Fs2) ? -1.0 : 1.0);
115712120Sar4jc@virginia.edu                        }
115812445Sar4jc@virginia.edu                    }}, FloatMiscOp);
115912120Sar4jc@virginia.edu                }
116012120Sar4jc@virginia.edu                0x14: decode ROUND_MODE {
116112120Sar4jc@virginia.edu                    0x0: fmin_s({{
116212120Sar4jc@virginia.edu                        uint32_t temp;
116312120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
116412120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
116512120Sar4jc@virginia.edu                        float fd;
116612120Sar4jc@virginia.edu
116712120Sar4jc@virginia.edu                        if (issignalingnan(fs2)) {
116812120Sar4jc@virginia.edu                            fd = fs1;
116912120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
117012120Sar4jc@virginia.edu                        } else if (issignalingnan(fs1)) {
117112120Sar4jc@virginia.edu                            fd = fs2;
117212120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
117312120Sar4jc@virginia.edu                        } else {
117412120Sar4jc@virginia.edu                            fd = fmin(fs1, fs2);
117512120Sar4jc@virginia.edu                        }
117612120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
117712120Sar4jc@virginia.edu                    }}, FloatCmpOp);
117812120Sar4jc@virginia.edu                    0x1: fmax_s({{
117912120Sar4jc@virginia.edu                        uint32_t temp;
118012120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
118112120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
118212120Sar4jc@virginia.edu                        float fd;
118312120Sar4jc@virginia.edu
118412120Sar4jc@virginia.edu                        if (issignalingnan(fs2)) {
118512120Sar4jc@virginia.edu                            fd = fs1;
118612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
118712120Sar4jc@virginia.edu                        } else if (issignalingnan(fs1)) {
118812120Sar4jc@virginia.edu                            fd = fs2;
118912120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
119012120Sar4jc@virginia.edu                        } else {
119112120Sar4jc@virginia.edu                            fd = fmax(fs1, fs2);
119212120Sar4jc@virginia.edu                        }
119312120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
119412120Sar4jc@virginia.edu                    }}, FloatCmpOp);
119512120Sar4jc@virginia.edu                }
119612120Sar4jc@virginia.edu                0x15: decode ROUND_MODE {
119712120Sar4jc@virginia.edu                    0x0: fmin_d({{
119812120Sar4jc@virginia.edu                        if (issignalingnan(Fs2)) {
119912120Sar4jc@virginia.edu                            Fd = Fs1;
120012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
120112120Sar4jc@virginia.edu                        } else if (issignalingnan(Fs1)) {
120212120Sar4jc@virginia.edu                            Fd = Fs2;
120312120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
120412120Sar4jc@virginia.edu                        } else {
120512120Sar4jc@virginia.edu                            Fd = fmin(Fs1, Fs2);
120612120Sar4jc@virginia.edu                        }
120712120Sar4jc@virginia.edu                    }}, FloatCmpOp);
120812120Sar4jc@virginia.edu                    0x1: fmax_d({{
120912120Sar4jc@virginia.edu                        if (issignalingnan(Fs2)) {
121012120Sar4jc@virginia.edu                            Fd = Fs1;
121112120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
121212120Sar4jc@virginia.edu                        } else if (issignalingnan(Fs1)) {
121312120Sar4jc@virginia.edu                            Fd = Fs2;
121412120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
121512120Sar4jc@virginia.edu                        } else {
121612120Sar4jc@virginia.edu                            Fd = fmax(Fs1, Fs2);
121712120Sar4jc@virginia.edu                        }
121812120Sar4jc@virginia.edu                    }}, FloatCmpOp);
121912120Sar4jc@virginia.edu                }
122012120Sar4jc@virginia.edu                0x20: fcvt_s_d({{
122112120Sar4jc@virginia.edu                    assert(CONV_SGN == 1);
122212120Sar4jc@virginia.edu                    float fd;
122312120Sar4jc@virginia.edu                    if (issignalingnan(Fs1)) {
122412120Sar4jc@virginia.edu                        fd = numeric_limits<float>::quiet_NaN();
122511725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
122611725Sar4jc@virginia.edu                    } else {
122712120Sar4jc@virginia.edu                        fd = (float)Fs1;
122811725Sar4jc@virginia.edu                    }
122911725Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
123012120Sar4jc@virginia.edu                }}, FloatCvtOp);
123112120Sar4jc@virginia.edu                0x21: fcvt_d_s({{
123212120Sar4jc@virginia.edu                    assert(CONV_SGN == 0);
123311725Sar4jc@virginia.edu                    uint32_t temp;
123411725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
123511725Sar4jc@virginia.edu
123612120Sar4jc@virginia.edu                    if (issignalingnan(fs1)) {
123712120Sar4jc@virginia.edu                        Fd = numeric_limits<double>::quiet_NaN();
123811725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
123911725Sar4jc@virginia.edu                    } else {
124012120Sar4jc@virginia.edu                        Fd = (double)fs1;
124111725Sar4jc@virginia.edu                    }
124211725Sar4jc@virginia.edu                }}, FloatCvtOp);
124312120Sar4jc@virginia.edu                0x2c: fsqrt_s({{
124412120Sar4jc@virginia.edu                    assert(RS2 == 0);
124511725Sar4jc@virginia.edu                    uint32_t temp;
124611725Sar4jc@virginia.edu                    float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
124712120Sar4jc@virginia.edu                    float fd;
124811725Sar4jc@virginia.edu
124912120Sar4jc@virginia.edu                    if (issignalingnan(Fs1_sf)) {
125011725Sar4jc@virginia.edu                        FFLAGS |= FloatInvalid;
125112120Sar4jc@virginia.edu                    }
125212120Sar4jc@virginia.edu                    fd = sqrt(fs1);
125312120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd);
125412120Sar4jc@virginia.edu                }}, FloatSqrtOp);
125512120Sar4jc@virginia.edu                0x2d: fsqrt_d({{
125612120Sar4jc@virginia.edu                    assert(RS2 == 0);
125712120Sar4jc@virginia.edu                    Fd = sqrt(Fs1);
125812120Sar4jc@virginia.edu                }}, FloatSqrtOp);
125912120Sar4jc@virginia.edu                0x50: decode ROUND_MODE {
126012120Sar4jc@virginia.edu                    0x0: fle_s({{
126112120Sar4jc@virginia.edu                        uint32_t temp;
126212120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
126312120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
126412120Sar4jc@virginia.edu
126512138Sgabeblack@google.com                        if (std::isnan(fs1) || std::isnan(fs2)) {
126612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
126712120Sar4jc@virginia.edu                            Rd = 0;
126812120Sar4jc@virginia.edu                        } else {
126912120Sar4jc@virginia.edu                            Rd = fs1 <= fs2 ? 1 : 0;
127011725Sar4jc@virginia.edu                        }
127112120Sar4jc@virginia.edu                    }}, FloatCmpOp);
127212120Sar4jc@virginia.edu                    0x1: flt_s({{
127312120Sar4jc@virginia.edu                        uint32_t temp;
127412120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
127512120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
127612120Sar4jc@virginia.edu
127712138Sgabeblack@google.com                        if (std::isnan(fs1) || std::isnan(fs2)) {
127812120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
127912120Sar4jc@virginia.edu                            Rd = 0;
128012120Sar4jc@virginia.edu                        } else {
128112120Sar4jc@virginia.edu                            Rd = fs1 < fs2 ? 1 : 0;
128212120Sar4jc@virginia.edu                        }
128312120Sar4jc@virginia.edu                    }}, FloatCmpOp);
128412120Sar4jc@virginia.edu                    0x2: feq_s({{
128512120Sar4jc@virginia.edu                        uint32_t temp;
128612120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
128712120Sar4jc@virginia.edu                        float fs2 = reinterpret_cast<float&>(temp = Fs2_bits);
128812120Sar4jc@virginia.edu
128912120Sar4jc@virginia.edu                        if (issignalingnan(fs1) || issignalingnan(fs2)) {
129012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
129112120Sar4jc@virginia.edu                        }
129212120Sar4jc@virginia.edu                        Rd = fs1 == fs2 ? 1 : 0;
129312120Sar4jc@virginia.edu                    }}, FloatCmpOp);
129412120Sar4jc@virginia.edu                }
129512120Sar4jc@virginia.edu                0x51: decode ROUND_MODE {
129612120Sar4jc@virginia.edu                    0x0: fle_d({{
129712138Sgabeblack@google.com                        if (std::isnan(Fs1) || std::isnan(Fs2)) {
129812120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
129912120Sar4jc@virginia.edu                            Rd = 0;
130012120Sar4jc@virginia.edu                        } else {
130112120Sar4jc@virginia.edu                            Rd = Fs1 <= Fs2 ? 1 : 0;
130212120Sar4jc@virginia.edu                        }
130312120Sar4jc@virginia.edu                    }}, FloatCmpOp);
130412120Sar4jc@virginia.edu                    0x1: flt_d({{
130512138Sgabeblack@google.com                        if (std::isnan(Fs1) || std::isnan(Fs2)) {
130612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
130712120Sar4jc@virginia.edu                            Rd = 0;
130812120Sar4jc@virginia.edu                        } else {
130912120Sar4jc@virginia.edu                            Rd = Fs1 < Fs2 ? 1 : 0;
131012120Sar4jc@virginia.edu                        }
131112120Sar4jc@virginia.edu                    }}, FloatCmpOp);
131212120Sar4jc@virginia.edu                    0x2: feq_d({{
131312120Sar4jc@virginia.edu                        if (issignalingnan(Fs1) || issignalingnan(Fs2)) {
131412120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
131512120Sar4jc@virginia.edu                        }
131612120Sar4jc@virginia.edu                        Rd = Fs1 == Fs2 ? 1 : 0;
131712120Sar4jc@virginia.edu                    }}, FloatCmpOp);
131812120Sar4jc@virginia.edu                }
131912120Sar4jc@virginia.edu                0x60: decode CONV_SGN {
132012120Sar4jc@virginia.edu                    0x0: fcvt_w_s({{
132112120Sar4jc@virginia.edu                        uint32_t temp;
132212120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
132312120Sar4jc@virginia.edu
132412138Sgabeblack@google.com                        if (std::isnan(fs1)) {
132512120Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::max();
132612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
132712444Sar4jc@virginia.edu                        } else if (fs1 >= numeric_limits<int32_t>::max()) {
132812444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::max();
132912444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
133012444Sar4jc@virginia.edu                        } else if (fs1 <= numeric_limits<int32_t>::min()) {
133112444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::min();
133212444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
133312120Sar4jc@virginia.edu                        } else {
133412120Sar4jc@virginia.edu                            Rd_sd = (int32_t)fs1;
133512120Sar4jc@virginia.edu                        }
133612120Sar4jc@virginia.edu                    }}, FloatCvtOp);
133712120Sar4jc@virginia.edu                    0x1: fcvt_wu_s({{
133812120Sar4jc@virginia.edu                        uint32_t temp;
133912120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
134012120Sar4jc@virginia.edu
134112444Sar4jc@virginia.edu                        if (std::isnan(fs1)) {
134212444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
134312444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
134412444Sar4jc@virginia.edu                        } else if (fs1 < 0.0) {
134512120Sar4jc@virginia.edu                            Rd = 0;
134612120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
134712444Sar4jc@virginia.edu                        } else if (fs1 > numeric_limits<uint32_t>::max()) {
134812444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
134912444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
135012120Sar4jc@virginia.edu                        } else {
135112120Sar4jc@virginia.edu                            Rd = (uint32_t)fs1;
135212120Sar4jc@virginia.edu                        }
135312120Sar4jc@virginia.edu                    }}, FloatCvtOp);
135412120Sar4jc@virginia.edu                    0x2: fcvt_l_s({{
135512120Sar4jc@virginia.edu                        uint32_t temp;
135612120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
135712120Sar4jc@virginia.edu
135812138Sgabeblack@google.com                        if (std::isnan(fs1)) {
135912120Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::max();
136012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
136112444Sar4jc@virginia.edu                        } else if (fs1 > numeric_limits<int64_t>::max()) {
136212444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::max();
136312444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
136412444Sar4jc@virginia.edu                        } else if (fs1 < numeric_limits<int64_t>::min()) {
136512444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::min();
136612444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
136712120Sar4jc@virginia.edu                        } else {
136812120Sar4jc@virginia.edu                            Rd_sd = (int64_t)fs1;
136912120Sar4jc@virginia.edu                        }
137012120Sar4jc@virginia.edu                    }}, FloatCvtOp);
137112120Sar4jc@virginia.edu                    0x3: fcvt_lu_s({{
137212120Sar4jc@virginia.edu                        uint32_t temp;
137312120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
137412120Sar4jc@virginia.edu
137512444Sar4jc@virginia.edu                        if (std::isnan(fs1)) {
137612444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
137712444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
137812444Sar4jc@virginia.edu                        } else if (fs1 < 0.0) {
137912120Sar4jc@virginia.edu                            Rd = 0;
138012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
138112444Sar4jc@virginia.edu                        } else if (fs1 > numeric_limits<uint64_t>::max()) {
138212444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
138312444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
138412120Sar4jc@virginia.edu                        } else {
138512120Sar4jc@virginia.edu                            Rd = (uint64_t)fs1;
138612120Sar4jc@virginia.edu                        }
138712120Sar4jc@virginia.edu                    }}, FloatCvtOp);
138812120Sar4jc@virginia.edu                }
138912120Sar4jc@virginia.edu                0x61: decode CONV_SGN {
139012120Sar4jc@virginia.edu                    0x0: fcvt_w_d({{
139112444Sar4jc@virginia.edu                        if (std::isnan(Fs1)) {
139212444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::max();
139312444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
139412444Sar4jc@virginia.edu                        } else if (Fs1 > numeric_limits<int32_t>::max()) {
139512444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::max();
139612444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
139712444Sar4jc@virginia.edu                        } else if (Fs1 < numeric_limits<int32_t>::min()) {
139812444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int32_t>::min();
139912444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
140012444Sar4jc@virginia.edu                        } else {
140112444Sar4jc@virginia.edu                            Rd_sd = (int32_t)Fs1;
140212120Sar4jc@virginia.edu                        }
140312120Sar4jc@virginia.edu                    }}, FloatCvtOp);
140412120Sar4jc@virginia.edu                    0x1: fcvt_wu_d({{
140512444Sar4jc@virginia.edu                        if (std::isnan(Fs1)) {
140612444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
140712444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
140812444Sar4jc@virginia.edu                        } else if (Fs1 < 0) {
140912120Sar4jc@virginia.edu                            Rd = 0;
141012120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
141112444Sar4jc@virginia.edu                        } else if (Fs1 > numeric_limits<uint32_t>::max()) {
141212444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
141312444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
141412120Sar4jc@virginia.edu                        } else {
141512120Sar4jc@virginia.edu                            Rd = (uint32_t)Fs1;
141612120Sar4jc@virginia.edu                        }
141712120Sar4jc@virginia.edu                    }}, FloatCvtOp);
141812120Sar4jc@virginia.edu                    0x2: fcvt_l_d({{
141912444Sar4jc@virginia.edu                        if (std::isnan(Fs1)) {
142012444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::max();
142112444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
142212444Sar4jc@virginia.edu                        } else if (Fs1 > numeric_limits<int64_t>::max()) {
142312444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::max();
142412444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
142512444Sar4jc@virginia.edu                        } else if (Fs1 < numeric_limits<int64_t>::min()) {
142612444Sar4jc@virginia.edu                            Rd_sd = numeric_limits<int64_t>::min();
142712444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
142812444Sar4jc@virginia.edu                        } else {
142912444Sar4jc@virginia.edu                            Rd_sd = Fs1;
143012120Sar4jc@virginia.edu                        }
143112120Sar4jc@virginia.edu                    }}, FloatCvtOp);
143212120Sar4jc@virginia.edu                    0x3: fcvt_lu_d({{
143312444Sar4jc@virginia.edu                        if (std::isnan(Fs1)) {
143412444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
143512444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
143612444Sar4jc@virginia.edu                        } else if (Fs1 < 0) {
143712120Sar4jc@virginia.edu                            Rd = 0;
143812120Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
143912444Sar4jc@virginia.edu                        } else if (Fs1 > numeric_limits<uint64_t>::max()) {
144012444Sar4jc@virginia.edu                            Rd = numeric_limits<uint64_t>::max();
144112444Sar4jc@virginia.edu                            FFLAGS |= FloatInvalid;
144212120Sar4jc@virginia.edu                        } else {
144312444Sar4jc@virginia.edu                            Rd = Fs1;
144412120Sar4jc@virginia.edu                        }
144512120Sar4jc@virginia.edu                    }}, FloatCvtOp);
144612120Sar4jc@virginia.edu                }
144712120Sar4jc@virginia.edu                0x68: decode CONV_SGN {
144812120Sar4jc@virginia.edu                    0x0: fcvt_s_w({{
144912120Sar4jc@virginia.edu                        float temp = (float)Rs1_sw;
145012120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
145112120Sar4jc@virginia.edu                    }}, FloatCvtOp);
145212120Sar4jc@virginia.edu                    0x1: fcvt_s_wu({{
145312120Sar4jc@virginia.edu                        float temp = (float)Rs1_uw;
145412120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
145512120Sar4jc@virginia.edu                    }}, FloatCvtOp);
145612120Sar4jc@virginia.edu                    0x2: fcvt_s_l({{
145712120Sar4jc@virginia.edu                        float temp = (float)Rs1_sd;
145812120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
145912120Sar4jc@virginia.edu                    }}, FloatCvtOp);
146012120Sar4jc@virginia.edu                    0x3: fcvt_s_lu({{
146112120Sar4jc@virginia.edu                        float temp = (float)Rs1;
146212120Sar4jc@virginia.edu                        Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp);
146312120Sar4jc@virginia.edu                    }}, FloatCvtOp);
146412120Sar4jc@virginia.edu                }
146512120Sar4jc@virginia.edu                0x69: decode CONV_SGN {
146612120Sar4jc@virginia.edu                    0x0: fcvt_d_w({{
146712120Sar4jc@virginia.edu                        Fd = (double)Rs1_sw;
146812120Sar4jc@virginia.edu                    }}, FloatCvtOp);
146912120Sar4jc@virginia.edu                    0x1: fcvt_d_wu({{
147012120Sar4jc@virginia.edu                        Fd = (double)Rs1_uw;
147112120Sar4jc@virginia.edu                    }}, FloatCvtOp);
147212120Sar4jc@virginia.edu                    0x2: fcvt_d_l({{
147312120Sar4jc@virginia.edu                        Fd = (double)Rs1_sd;
147412120Sar4jc@virginia.edu                    }}, FloatCvtOp);
147512120Sar4jc@virginia.edu                    0x3: fcvt_d_lu({{
147612120Sar4jc@virginia.edu                        Fd = (double)Rs1;
147712120Sar4jc@virginia.edu                    }}, FloatCvtOp);
147812120Sar4jc@virginia.edu                }
147912120Sar4jc@virginia.edu                0x70: decode ROUND_MODE {
148012120Sar4jc@virginia.edu                    0x0: fmv_x_s({{
148112120Sar4jc@virginia.edu                        Rd = (uint32_t)Fs1_bits;
148212120Sar4jc@virginia.edu                        if ((Rd&0x80000000) != 0) {
148312120Sar4jc@virginia.edu                            Rd |= (0xFFFFFFFFULL << 32);
148412120Sar4jc@virginia.edu                        }
148512120Sar4jc@virginia.edu                    }}, FloatCvtOp);
148612120Sar4jc@virginia.edu                    0x1: fclass_s({{
148712120Sar4jc@virginia.edu                        uint32_t temp;
148812120Sar4jc@virginia.edu                        float fs1 = reinterpret_cast<float&>(temp = Fs1_bits);
148912120Sar4jc@virginia.edu                        switch (fpclassify(fs1)) {
149012445Sar4jc@virginia.edu                          case FP_INFINITE:
149112120Sar4jc@virginia.edu                            if (signbit(fs1)) {
149212120Sar4jc@virginia.edu                                Rd = 1 << 0;
149312120Sar4jc@virginia.edu                            } else {
149412120Sar4jc@virginia.edu                                Rd = 1 << 7;
149512120Sar4jc@virginia.edu                            }
149612120Sar4jc@virginia.edu                            break;
149712445Sar4jc@virginia.edu                          case FP_NAN:
149812120Sar4jc@virginia.edu                            if (issignalingnan(fs1)) {
149912120Sar4jc@virginia.edu                                Rd = 1 << 8;
150012120Sar4jc@virginia.edu                            } else {
150112120Sar4jc@virginia.edu                                Rd = 1 << 9;
150212120Sar4jc@virginia.edu                            }
150312120Sar4jc@virginia.edu                            break;
150412445Sar4jc@virginia.edu                          case FP_ZERO:
150512120Sar4jc@virginia.edu                            if (signbit(fs1)) {
150612120Sar4jc@virginia.edu                                Rd = 1 << 3;
150712120Sar4jc@virginia.edu                            } else {
150812120Sar4jc@virginia.edu                                Rd = 1 << 4;
150912120Sar4jc@virginia.edu                            }
151012120Sar4jc@virginia.edu                            break;
151112445Sar4jc@virginia.edu                          case FP_SUBNORMAL:
151212120Sar4jc@virginia.edu                            if (signbit(fs1)) {
151312120Sar4jc@virginia.edu                                Rd = 1 << 2;
151412120Sar4jc@virginia.edu                            } else {
151512120Sar4jc@virginia.edu                                Rd = 1 << 5;
151612120Sar4jc@virginia.edu                            }
151712120Sar4jc@virginia.edu                            break;
151812445Sar4jc@virginia.edu                          case FP_NORMAL:
151912120Sar4jc@virginia.edu                            if (signbit(fs1)) {
152012120Sar4jc@virginia.edu                                Rd = 1 << 1;
152112120Sar4jc@virginia.edu                            } else {
152212120Sar4jc@virginia.edu                                Rd = 1 << 6;
152312120Sar4jc@virginia.edu                            }
152412120Sar4jc@virginia.edu                            break;
152512445Sar4jc@virginia.edu                          default:
152612120Sar4jc@virginia.edu                            panic("Unknown classification for operand.");
152712120Sar4jc@virginia.edu                            break;
152812120Sar4jc@virginia.edu                        }
152912445Sar4jc@virginia.edu                    }}, FloatMiscOp);
153012120Sar4jc@virginia.edu                }
153112120Sar4jc@virginia.edu                0x71: decode ROUND_MODE {
153212120Sar4jc@virginia.edu                    0x0: fmv_x_d({{
153312120Sar4jc@virginia.edu                        Rd = Fs1_bits;
153412120Sar4jc@virginia.edu                    }}, FloatCvtOp);
153512120Sar4jc@virginia.edu                    0x1: fclass_d({{
153612120Sar4jc@virginia.edu                        switch (fpclassify(Fs1)) {
153712445Sar4jc@virginia.edu                          case FP_INFINITE:
153812120Sar4jc@virginia.edu                            if (signbit(Fs1)) {
153912120Sar4jc@virginia.edu                                Rd = 1 << 0;
154012120Sar4jc@virginia.edu                            } else {
154112120Sar4jc@virginia.edu                                Rd = 1 << 7;
154212120Sar4jc@virginia.edu                            }
154312120Sar4jc@virginia.edu                            break;
154412445Sar4jc@virginia.edu                          case FP_NAN:
154512120Sar4jc@virginia.edu                            if (issignalingnan(Fs1)) {
154612120Sar4jc@virginia.edu                                Rd = 1 << 8;
154712120Sar4jc@virginia.edu                            } else {
154812120Sar4jc@virginia.edu                                Rd = 1 << 9;
154912120Sar4jc@virginia.edu                            }
155012120Sar4jc@virginia.edu                            break;
155112445Sar4jc@virginia.edu                          case FP_ZERO:
155212120Sar4jc@virginia.edu                            if (signbit(Fs1)) {
155312120Sar4jc@virginia.edu                                Rd = 1 << 3;
155412120Sar4jc@virginia.edu                            } else {
155512120Sar4jc@virginia.edu                                Rd = 1 << 4;
155612120Sar4jc@virginia.edu                            }
155712120Sar4jc@virginia.edu                            break;
155812445Sar4jc@virginia.edu                          case FP_SUBNORMAL:
155912120Sar4jc@virginia.edu                            if (signbit(Fs1)) {
156012120Sar4jc@virginia.edu                                Rd = 1 << 2;
156112120Sar4jc@virginia.edu                            } else {
156212120Sar4jc@virginia.edu                                Rd = 1 << 5;
156312120Sar4jc@virginia.edu                            }
156412120Sar4jc@virginia.edu                            break;
156512445Sar4jc@virginia.edu                          case FP_NORMAL:
156612120Sar4jc@virginia.edu                            if (signbit(Fs1)) {
156712120Sar4jc@virginia.edu                                Rd = 1 << 1;
156812120Sar4jc@virginia.edu                            } else {
156912120Sar4jc@virginia.edu                                Rd = 1 << 6;
157012120Sar4jc@virginia.edu                            }
157112120Sar4jc@virginia.edu                            break;
157212445Sar4jc@virginia.edu                          default:
157312120Sar4jc@virginia.edu                            panic("Unknown classification for operand.");
157412120Sar4jc@virginia.edu                            break;
157512120Sar4jc@virginia.edu                        }
157612445Sar4jc@virginia.edu                    }}, FloatMiscOp);
157712120Sar4jc@virginia.edu                }
157812120Sar4jc@virginia.edu                0x78: fmv_s_x({{
157912120Sar4jc@virginia.edu                    Fd_bits = (uint64_t)Rs1_uw;
158011725Sar4jc@virginia.edu                }}, FloatCvtOp);
158112120Sar4jc@virginia.edu                0x79: fmv_d_x({{
158212120Sar4jc@virginia.edu                    Fd_bits = Rs1;
158311725Sar4jc@virginia.edu                }}, FloatCvtOp);
158411725Sar4jc@virginia.edu            }
158512120Sar4jc@virginia.edu        }
158612120Sar4jc@virginia.edu
158712120Sar4jc@virginia.edu        0x18: decode FUNCT3 {
158812120Sar4jc@virginia.edu            format BOp {
158912120Sar4jc@virginia.edu                0x0: beq({{
159012120Sar4jc@virginia.edu                    if (Rs1 == Rs2) {
159112120Sar4jc@virginia.edu                        NPC = PC + imm;
159212120Sar4jc@virginia.edu                    } else {
159312120Sar4jc@virginia.edu                        NPC = NPC;
159411725Sar4jc@virginia.edu                    }
159512120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
159612120Sar4jc@virginia.edu                0x1: bne({{
159712120Sar4jc@virginia.edu                    if (Rs1 != Rs2) {
159812120Sar4jc@virginia.edu                        NPC = PC + imm;
159911725Sar4jc@virginia.edu                    } else {
160012120Sar4jc@virginia.edu                        NPC = NPC;
160111725Sar4jc@virginia.edu                    }
160212120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
160312120Sar4jc@virginia.edu                0x4: blt({{
160412120Sar4jc@virginia.edu                    if (Rs1_sd < Rs2_sd) {
160512120Sar4jc@virginia.edu                        NPC = PC + imm;
160612120Sar4jc@virginia.edu                    } else {
160712120Sar4jc@virginia.edu                        NPC = NPC;
160811725Sar4jc@virginia.edu                    }
160912120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
161012120Sar4jc@virginia.edu                0x5: bge({{
161112120Sar4jc@virginia.edu                    if (Rs1_sd >= Rs2_sd) {
161212120Sar4jc@virginia.edu                        NPC = PC + imm;
161311725Sar4jc@virginia.edu                    } else {
161412120Sar4jc@virginia.edu                        NPC = NPC;
161511725Sar4jc@virginia.edu                    }
161612120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
161712120Sar4jc@virginia.edu                0x6: bltu({{
161812120Sar4jc@virginia.edu                    if (Rs1 < Rs2) {
161912120Sar4jc@virginia.edu                        NPC = PC + imm;
162012120Sar4jc@virginia.edu                    } else {
162112120Sar4jc@virginia.edu                        NPC = NPC;
162212120Sar4jc@virginia.edu                    }
162312120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
162412120Sar4jc@virginia.edu                0x7: bgeu({{
162512120Sar4jc@virginia.edu                    if (Rs1 >= Rs2) {
162612120Sar4jc@virginia.edu                        NPC = PC + imm;
162712120Sar4jc@virginia.edu                    } else {
162812120Sar4jc@virginia.edu                        NPC = NPC;
162912120Sar4jc@virginia.edu                    }
163012120Sar4jc@virginia.edu                }}, IsDirectControl, IsCondControl);
163111725Sar4jc@virginia.edu            }
163212120Sar4jc@virginia.edu        }
163312120Sar4jc@virginia.edu
163412120Sar4jc@virginia.edu        0x19: decode FUNCT3 {
163512120Sar4jc@virginia.edu            0x0: Jump::jalr({{
163612120Sar4jc@virginia.edu                Rd = NPC;
163712120Sar4jc@virginia.edu                NPC = (imm + Rs1) & (~0x1);
163812120Sar4jc@virginia.edu            }}, IsIndirectControl, IsUncondControl, IsCall);
163912120Sar4jc@virginia.edu        }
164012120Sar4jc@virginia.edu
164112120Sar4jc@virginia.edu        0x1b: JOp::jal({{
164212120Sar4jc@virginia.edu            Rd = NPC;
164312120Sar4jc@virginia.edu            NPC = PC + imm;
164412120Sar4jc@virginia.edu        }}, IsDirectControl, IsUncondControl, IsCall);
164512120Sar4jc@virginia.edu
164612120Sar4jc@virginia.edu        0x1c: decode FUNCT3 {
164712120Sar4jc@virginia.edu            format SystemOp {
164812120Sar4jc@virginia.edu                0x0: decode FUNCT12 {
164912120Sar4jc@virginia.edu                    0x0: ecall({{
165012120Sar4jc@virginia.edu                        fault = make_shared<SyscallFault>();
165112120Sar4jc@virginia.edu                    }}, IsSerializeAfter, IsNonSpeculative, IsSyscall,
165212120Sar4jc@virginia.edu                        No_OpClass);
165312120Sar4jc@virginia.edu                    0x1: ebreak({{
165412120Sar4jc@virginia.edu                        fault = make_shared<BreakpointFault>();
165512120Sar4jc@virginia.edu                    }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
165612120Sar4jc@virginia.edu                    0x100: eret({{
165712120Sar4jc@virginia.edu                        fault = make_shared<UnimplementedFault>("eret");
165812120Sar4jc@virginia.edu                    }}, No_OpClass);
165912120Sar4jc@virginia.edu                }
166011725Sar4jc@virginia.edu            }
166112120Sar4jc@virginia.edu            format CSROp {
166212120Sar4jc@virginia.edu                0x1: csrrw({{
166312120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
166412120Sar4jc@virginia.edu                    xc->setMiscReg(csr, Rs1);
166512120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
166612120Sar4jc@virginia.edu                0x2: csrrs({{
166712120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
166812120Sar4jc@virginia.edu                    if (Rs1 != 0) {
166912120Sar4jc@virginia.edu                        xc->setMiscReg(csr, Rd | Rs1);
167012120Sar4jc@virginia.edu                    }
167112120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
167212120Sar4jc@virginia.edu                0x3: csrrc({{
167312120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
167412120Sar4jc@virginia.edu                    if (Rs1 != 0) {
167512120Sar4jc@virginia.edu                        xc->setMiscReg(csr, Rd & ~Rs1);
167612120Sar4jc@virginia.edu                    }
167712120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
167812120Sar4jc@virginia.edu                0x5: csrrwi({{
167912120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
168012120Sar4jc@virginia.edu                    xc->setMiscReg(csr, uimm);
168112120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
168212120Sar4jc@virginia.edu                0x6: csrrsi({{
168312120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
168412120Sar4jc@virginia.edu                    if (uimm != 0) {
168512120Sar4jc@virginia.edu                        xc->setMiscReg(csr, Rd | uimm);
168612120Sar4jc@virginia.edu                    }
168712120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
168812120Sar4jc@virginia.edu                0x7: csrrci({{
168912120Sar4jc@virginia.edu                    Rd = xc->readMiscReg(csr);
169012120Sar4jc@virginia.edu                    if (uimm != 0) {
169112120Sar4jc@virginia.edu                        xc->setMiscReg(csr, Rd & ~uimm);
169212120Sar4jc@virginia.edu                    }
169312120Sar4jc@virginia.edu                }}, IsNonSpeculative, No_OpClass);
169411725Sar4jc@virginia.edu            }
169511725Sar4jc@virginia.edu        }
169611725Sar4jc@virginia.edu    }
169712138Sgabeblack@google.com}
1698