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