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