decoder.isa revision 12850
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) 4612849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("zero instruction", 4712849Sar4jc@virginia.edu machInst); 4812120Sar4jc@virginia.edu Rp2 = sp + imm; 4912428Sar4jc@virginia.edu }}, uint64_t); 5012120Sar4jc@virginia.edu format CompressedLoad { 5112120Sar4jc@virginia.edu 0x1: c_fld({{ 5212322Sar4jc@virginia.edu offset = CIMM3 << 3 | CIMM2 << 6; 5312120Sar4jc@virginia.edu }}, {{ 5412120Sar4jc@virginia.edu Fp2_bits = Mem; 5512120Sar4jc@virginia.edu }}, {{ 5612322Sar4jc@virginia.edu EA = Rp1 + offset; 5711723Sar4jc@virginia.edu }}); 5812120Sar4jc@virginia.edu 0x2: c_lw({{ 5912322Sar4jc@virginia.edu offset = CIMM2<1:1> << 2 | 6012322Sar4jc@virginia.edu CIMM3 << 3 | 6112322Sar4jc@virginia.edu CIMM2<0:0> << 6; 6212120Sar4jc@virginia.edu }}, {{ 6312120Sar4jc@virginia.edu Rp2_sd = Mem_sw; 6412120Sar4jc@virginia.edu }}, {{ 6512322Sar4jc@virginia.edu EA = Rp1 + offset; 6611723Sar4jc@virginia.edu }}); 6712120Sar4jc@virginia.edu 0x3: c_ld({{ 6812322Sar4jc@virginia.edu offset = CIMM3 << 3 | CIMM2 << 6; 6912120Sar4jc@virginia.edu }}, {{ 7012120Sar4jc@virginia.edu Rp2_sd = Mem_sd; 7112120Sar4jc@virginia.edu }}, {{ 7212322Sar4jc@virginia.edu EA = Rp1 + offset; 7311723Sar4jc@virginia.edu }}); 7412120Sar4jc@virginia.edu } 7512120Sar4jc@virginia.edu format CompressedStore { 7612120Sar4jc@virginia.edu 0x5: c_fsd({{ 7712322Sar4jc@virginia.edu offset = CIMM3 << 3 | CIMM2 << 6; 7812120Sar4jc@virginia.edu }}, {{ 7912120Sar4jc@virginia.edu Mem = Fp2_bits; 8012120Sar4jc@virginia.edu }}, {{ 8112322Sar4jc@virginia.edu EA = Rp1 + offset; 8211723Sar4jc@virginia.edu }}); 8312120Sar4jc@virginia.edu 0x6: c_sw({{ 8412322Sar4jc@virginia.edu offset = CIMM2<1:1> << 2 | 8512322Sar4jc@virginia.edu CIMM3 << 3 | 8612322Sar4jc@virginia.edu CIMM2<0:0> << 6; 8712120Sar4jc@virginia.edu }}, {{ 8812120Sar4jc@virginia.edu Mem_uw = Rp2_uw; 8912120Sar4jc@virginia.edu }}, ea_code={{ 9012322Sar4jc@virginia.edu EA = Rp1 + offset; 9111723Sar4jc@virginia.edu }}); 9212120Sar4jc@virginia.edu 0x7: c_sd({{ 9312322Sar4jc@virginia.edu offset = CIMM3 << 3 | CIMM2 << 6; 9412120Sar4jc@virginia.edu }}, {{ 9512120Sar4jc@virginia.edu Mem_ud = Rp2_ud; 9612120Sar4jc@virginia.edu }}, {{ 9712322Sar4jc@virginia.edu EA = Rp1 + offset; 9811723Sar4jc@virginia.edu }}); 9911723Sar4jc@virginia.edu } 10011723Sar4jc@virginia.edu } 10112120Sar4jc@virginia.edu 0x1: decode COPCODE { 10212120Sar4jc@virginia.edu format CIOp { 10312120Sar4jc@virginia.edu 0x0: c_addi({{ 10412120Sar4jc@virginia.edu imm = CIMM5; 10512120Sar4jc@virginia.edu if (CIMM1 > 0) 10612120Sar4jc@virginia.edu imm |= ~((uint64_t)0x1F); 10712120Sar4jc@virginia.edu }}, {{ 10812136Sar4jc@virginia.edu if ((RC1 == 0) != (imm == 0)) { 10912136Sar4jc@virginia.edu if (RC1 == 0) { 11012849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 11112849Sar4jc@virginia.edu machInst); 11212136Sar4jc@virginia.edu } else // imm == 0 11312849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 11412849Sar4jc@virginia.edu machInst); 11512136Sar4jc@virginia.edu } 11612120Sar4jc@virginia.edu Rc1_sd = Rc1_sd + imm; 11712120Sar4jc@virginia.edu }}); 11812120Sar4jc@virginia.edu 0x1: c_addiw({{ 11912120Sar4jc@virginia.edu imm = CIMM5; 12012120Sar4jc@virginia.edu if (CIMM1 > 0) 12112120Sar4jc@virginia.edu imm |= ~((uint64_t)0x1F); 12212120Sar4jc@virginia.edu }}, {{ 12312596Sqtt2@cornell.edu if (RC1 == 0) { 12412849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 12512849Sar4jc@virginia.edu machInst); 12612596Sqtt2@cornell.edu } 12712120Sar4jc@virginia.edu Rc1_sd = (int32_t)Rc1_sd + imm; 12812120Sar4jc@virginia.edu }}); 12912120Sar4jc@virginia.edu 0x2: c_li({{ 13012120Sar4jc@virginia.edu imm = CIMM5; 13112120Sar4jc@virginia.edu if (CIMM1 > 0) 13212120Sar4jc@virginia.edu imm |= ~((uint64_t)0x1F); 13312120Sar4jc@virginia.edu }}, {{ 13412596Sqtt2@cornell.edu if (RC1 == 0) { 13512849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 13612849Sar4jc@virginia.edu machInst); 13712596Sqtt2@cornell.edu } 13812120Sar4jc@virginia.edu Rc1_sd = imm; 13912120Sar4jc@virginia.edu }}); 14012120Sar4jc@virginia.edu 0x3: decode RC1 { 14112120Sar4jc@virginia.edu 0x2: c_addi16sp({{ 14212120Sar4jc@virginia.edu imm = CIMM5<4:4> << 4 | 14312120Sar4jc@virginia.edu CIMM5<0:0> << 5 | 14412120Sar4jc@virginia.edu CIMM5<3:3> << 6 | 14512120Sar4jc@virginia.edu CIMM5<2:1> << 7; 14612120Sar4jc@virginia.edu if (CIMM1 > 0) 14712120Sar4jc@virginia.edu imm |= ~((int64_t)0x1FF); 14812120Sar4jc@virginia.edu }}, {{ 14912596Sqtt2@cornell.edu if (imm == 0) { 15012849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 15112849Sar4jc@virginia.edu machInst); 15212596Sqtt2@cornell.edu } 15312120Sar4jc@virginia.edu sp_sd = sp_sd + imm; 15412120Sar4jc@virginia.edu }}); 15512120Sar4jc@virginia.edu default: c_lui({{ 15612120Sar4jc@virginia.edu imm = CIMM5 << 12; 15712120Sar4jc@virginia.edu if (CIMM1 > 0) 15812120Sar4jc@virginia.edu imm |= ~((uint64_t)0x1FFFF); 15912120Sar4jc@virginia.edu }}, {{ 16012596Sqtt2@cornell.edu if (RC1 == 0 || RC1 == 2) { 16112849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 16212849Sar4jc@virginia.edu machInst); 16312596Sqtt2@cornell.edu } 16412596Sqtt2@cornell.edu if (imm == 0) { 16512849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 16612849Sar4jc@virginia.edu machInst); 16712596Sqtt2@cornell.edu } 16812120Sar4jc@virginia.edu Rc1_sd = imm; 16912120Sar4jc@virginia.edu }}); 17012120Sar4jc@virginia.edu } 17112120Sar4jc@virginia.edu } 17212120Sar4jc@virginia.edu 0x4: decode CFUNCT2HIGH { 17312428Sar4jc@virginia.edu format CIOp { 17412120Sar4jc@virginia.edu 0x0: c_srli({{ 17512120Sar4jc@virginia.edu imm = CIMM5 | (CIMM1 << 5); 17612120Sar4jc@virginia.edu }}, {{ 17712596Sqtt2@cornell.edu if (imm == 0) { 17812849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 17912849Sar4jc@virginia.edu machInst); 18012596Sqtt2@cornell.edu } 18112120Sar4jc@virginia.edu Rp1 = Rp1 >> imm; 18212428Sar4jc@virginia.edu }}, uint64_t); 18312120Sar4jc@virginia.edu 0x1: c_srai({{ 18412120Sar4jc@virginia.edu imm = CIMM5 | (CIMM1 << 5); 18512120Sar4jc@virginia.edu }}, {{ 18612596Sqtt2@cornell.edu if (imm == 0) { 18712849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 18812849Sar4jc@virginia.edu machInst); 18912596Sqtt2@cornell.edu } 19012120Sar4jc@virginia.edu Rp1_sd = Rp1_sd >> imm; 19112428Sar4jc@virginia.edu }}, uint64_t); 19212120Sar4jc@virginia.edu 0x2: c_andi({{ 19312120Sar4jc@virginia.edu imm = CIMM5; 19412120Sar4jc@virginia.edu if (CIMM1 > 0) 19512120Sar4jc@virginia.edu imm |= ~((uint64_t)0x1F); 19612120Sar4jc@virginia.edu }}, {{ 19712120Sar4jc@virginia.edu Rp1 = Rp1 & imm; 19812428Sar4jc@virginia.edu }}, uint64_t); 19912120Sar4jc@virginia.edu } 20012120Sar4jc@virginia.edu format ROp { 20112120Sar4jc@virginia.edu 0x3: decode CFUNCT1 { 20212120Sar4jc@virginia.edu 0x0: decode CFUNCT2LOW { 20312120Sar4jc@virginia.edu 0x0: c_sub({{ 20412120Sar4jc@virginia.edu Rp1 = Rp1 - Rp2; 20512120Sar4jc@virginia.edu }}); 20612120Sar4jc@virginia.edu 0x1: c_xor({{ 20712120Sar4jc@virginia.edu Rp1 = Rp1 ^ Rp2; 20812120Sar4jc@virginia.edu }}); 20912120Sar4jc@virginia.edu 0x2: c_or({{ 21012120Sar4jc@virginia.edu Rp1 = Rp1 | Rp2; 21112120Sar4jc@virginia.edu }}); 21212120Sar4jc@virginia.edu 0x3: c_and({{ 21312120Sar4jc@virginia.edu Rp1 = Rp1 & Rp2; 21412120Sar4jc@virginia.edu }}); 21512120Sar4jc@virginia.edu } 21612120Sar4jc@virginia.edu 0x1: decode CFUNCT2LOW { 21712120Sar4jc@virginia.edu 0x0: c_subw({{ 21812120Sar4jc@virginia.edu Rp1_sd = (int32_t)Rp1_sd - Rp2_sw; 21912120Sar4jc@virginia.edu }}); 22012120Sar4jc@virginia.edu 0x1: c_addw({{ 22112120Sar4jc@virginia.edu Rp1_sd = (int32_t)Rp1_sd + Rp2_sw; 22212120Sar4jc@virginia.edu }}); 22312120Sar4jc@virginia.edu } 22412120Sar4jc@virginia.edu } 22512120Sar4jc@virginia.edu } 22612120Sar4jc@virginia.edu } 22712120Sar4jc@virginia.edu 0x5: JOp::c_j({{ 22812120Sar4jc@virginia.edu int64_t offset = CJUMPIMM<3:1> << 1 | 22912322Sar4jc@virginia.edu CJUMPIMM<9:9> << 4 | 23012322Sar4jc@virginia.edu CJUMPIMM<0:0> << 5 | 23112322Sar4jc@virginia.edu CJUMPIMM<5:5> << 6 | 23212322Sar4jc@virginia.edu CJUMPIMM<4:4> << 7 | 23312322Sar4jc@virginia.edu CJUMPIMM<8:7> << 8 | 23412322Sar4jc@virginia.edu CJUMPIMM<6:6> << 10; 23512120Sar4jc@virginia.edu if (CJUMPIMM<10:10> > 0) 23612120Sar4jc@virginia.edu offset |= ~((int64_t)0x7FF); 23712120Sar4jc@virginia.edu NPC = PC + offset; 23812120Sar4jc@virginia.edu }}, IsIndirectControl, IsUncondControl, IsCall); 23912535Sar4jc@virginia.edu format CBOp { 24012120Sar4jc@virginia.edu 0x6: c_beqz({{ 24112120Sar4jc@virginia.edu if (Rp1 == 0) 24212535Sar4jc@virginia.edu NPC = PC + imm; 24312120Sar4jc@virginia.edu else 24412120Sar4jc@virginia.edu NPC = NPC; 24512120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 24612120Sar4jc@virginia.edu 0x7: c_bnez({{ 24712120Sar4jc@virginia.edu if (Rp1 != 0) 24812535Sar4jc@virginia.edu NPC = PC + imm; 24912120Sar4jc@virginia.edu else 25012120Sar4jc@virginia.edu NPC = NPC; 25112120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 25212120Sar4jc@virginia.edu } 25312120Sar4jc@virginia.edu } 25412120Sar4jc@virginia.edu 0x2: decode COPCODE { 25512428Sar4jc@virginia.edu 0x0: CIOp::c_slli({{ 25612120Sar4jc@virginia.edu imm = CIMM5 | (CIMM1 << 5); 25712120Sar4jc@virginia.edu }}, {{ 25812596Sqtt2@cornell.edu if (imm == 0) { 25912849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("immediate = 0", 26012849Sar4jc@virginia.edu machInst); 26112596Sqtt2@cornell.edu } 26212596Sqtt2@cornell.edu if (RC1 == 0) { 26312849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 26412849Sar4jc@virginia.edu machInst); 26512596Sqtt2@cornell.edu } 26612120Sar4jc@virginia.edu Rc1 = Rc1 << imm; 26712428Sar4jc@virginia.edu }}, uint64_t); 26812120Sar4jc@virginia.edu format CompressedLoad { 26912120Sar4jc@virginia.edu 0x1: c_fldsp({{ 27012322Sar4jc@virginia.edu offset = CIMM5<4:3> << 3 | 27112322Sar4jc@virginia.edu CIMM1 << 5 | 27212322Sar4jc@virginia.edu CIMM5<2:0> << 6; 27312120Sar4jc@virginia.edu }}, {{ 27412120Sar4jc@virginia.edu Fc1_bits = Mem; 27512120Sar4jc@virginia.edu }}, {{ 27612322Sar4jc@virginia.edu EA = sp + offset; 27711725Sar4jc@virginia.edu }}); 27812120Sar4jc@virginia.edu 0x2: c_lwsp({{ 27912322Sar4jc@virginia.edu offset = CIMM5<4:2> << 2 | 28012322Sar4jc@virginia.edu CIMM1 << 5 | 28112322Sar4jc@virginia.edu CIMM5<1:0> << 6; 28212120Sar4jc@virginia.edu }}, {{ 28312596Sqtt2@cornell.edu if (RC1 == 0) { 28412849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 28512849Sar4jc@virginia.edu machInst); 28612596Sqtt2@cornell.edu } 28712120Sar4jc@virginia.edu Rc1_sd = Mem_sw; 28812120Sar4jc@virginia.edu }}, {{ 28912322Sar4jc@virginia.edu EA = sp + offset; 29012120Sar4jc@virginia.edu }}); 29112120Sar4jc@virginia.edu 0x3: c_ldsp({{ 29212322Sar4jc@virginia.edu offset = CIMM5<4:3> << 3 | 29312322Sar4jc@virginia.edu CIMM1 << 5 | 29412322Sar4jc@virginia.edu CIMM5<2:0> << 6; 29512120Sar4jc@virginia.edu }}, {{ 29612596Sqtt2@cornell.edu if (RC1 == 0) { 29712849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 29812849Sar4jc@virginia.edu machInst); 29912596Sqtt2@cornell.edu } 30012120Sar4jc@virginia.edu Rc1_sd = Mem_sd; 30112120Sar4jc@virginia.edu }}, {{ 30212322Sar4jc@virginia.edu EA = sp + offset; 30312120Sar4jc@virginia.edu }}); 30412120Sar4jc@virginia.edu } 30512120Sar4jc@virginia.edu 0x4: decode CFUNCT1 { 30612120Sar4jc@virginia.edu 0x0: decode RC2 { 30712120Sar4jc@virginia.edu 0x0: Jump::c_jr({{ 30812596Sqtt2@cornell.edu if (RC1 == 0) { 30912849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 31012849Sar4jc@virginia.edu machInst); 31112596Sqtt2@cornell.edu } 31212120Sar4jc@virginia.edu NPC = Rc1; 31312120Sar4jc@virginia.edu }}, IsIndirectControl, IsUncondControl, IsCall); 31412120Sar4jc@virginia.edu default: CROp::c_mv({{ 31512596Sqtt2@cornell.edu if (RC1 == 0) { 31612849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x0", 31712849Sar4jc@virginia.edu machInst); 31812596Sqtt2@cornell.edu } 31912120Sar4jc@virginia.edu Rc1 = Rc2; 32012120Sar4jc@virginia.edu }}); 32112120Sar4jc@virginia.edu } 32212120Sar4jc@virginia.edu 0x1: decode RC1 { 32312120Sar4jc@virginia.edu 0x0: SystemOp::c_ebreak({{ 32412596Sqtt2@cornell.edu if (RC2 != 0) { 32512849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x1", 32612849Sar4jc@virginia.edu machInst); 32712596Sqtt2@cornell.edu } 32812849Sar4jc@virginia.edu fault = make_shared<BreakpointFault>(xc->pcState()); 32912120Sar4jc@virginia.edu }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); 33012120Sar4jc@virginia.edu default: decode RC2 { 33112120Sar4jc@virginia.edu 0x0: Jump::c_jalr({{ 33212596Sqtt2@cornell.edu if (RC1 == 0) { 33312596Sqtt2@cornell.edu fault = make_shared<IllegalInstFault> 33412849Sar4jc@virginia.edu ("source reg x0", 33512849Sar4jc@virginia.edu machInst); 33612596Sqtt2@cornell.edu } 33712120Sar4jc@virginia.edu ra = NPC; 33812120Sar4jc@virginia.edu NPC = Rc1; 33912120Sar4jc@virginia.edu }}, IsIndirectControl, IsUncondControl, IsCall); 34012120Sar4jc@virginia.edu default: ROp::c_add({{ 34112120Sar4jc@virginia.edu Rc1_sd = Rc1_sd + Rc2_sd; 34212120Sar4jc@virginia.edu }}); 34312120Sar4jc@virginia.edu } 34412120Sar4jc@virginia.edu } 34512120Sar4jc@virginia.edu } 34612120Sar4jc@virginia.edu format CompressedStore { 34712120Sar4jc@virginia.edu 0x5: c_fsdsp({{ 34812322Sar4jc@virginia.edu offset = CIMM6<5:3> << 3 | 34912322Sar4jc@virginia.edu CIMM6<2:0> << 6; 35012120Sar4jc@virginia.edu }}, {{ 35112120Sar4jc@virginia.edu Mem_ud = Fc2_bits; 35212120Sar4jc@virginia.edu }}, {{ 35312322Sar4jc@virginia.edu EA = sp + offset; 35412120Sar4jc@virginia.edu }}); 35512120Sar4jc@virginia.edu 0x6: c_swsp({{ 35612322Sar4jc@virginia.edu offset = CIMM6<5:2> << 2 | 35712322Sar4jc@virginia.edu CIMM6<1:0> << 6; 35812120Sar4jc@virginia.edu }}, {{ 35912120Sar4jc@virginia.edu Mem_uw = Rc2_uw; 36012120Sar4jc@virginia.edu }}, {{ 36112322Sar4jc@virginia.edu EA = sp + offset; 36212120Sar4jc@virginia.edu }}); 36312120Sar4jc@virginia.edu 0x7: c_sdsp({{ 36412322Sar4jc@virginia.edu offset = CIMM6<5:3> << 3 | 36512322Sar4jc@virginia.edu CIMM6<2:0> << 6; 36612120Sar4jc@virginia.edu }}, {{ 36712120Sar4jc@virginia.edu Mem = Rc2; 36812120Sar4jc@virginia.edu }}, {{ 36912322Sar4jc@virginia.edu EA = sp + offset; 37011725Sar4jc@virginia.edu }}); 37111725Sar4jc@virginia.edu } 37211725Sar4jc@virginia.edu } 37312120Sar4jc@virginia.edu 0x3: decode OPCODE { 37412120Sar4jc@virginia.edu 0x00: decode FUNCT3 { 37512120Sar4jc@virginia.edu format Load { 37612120Sar4jc@virginia.edu 0x0: lb({{ 37712120Sar4jc@virginia.edu Rd_sd = Mem_sb; 37811723Sar4jc@virginia.edu }}); 37912120Sar4jc@virginia.edu 0x1: lh({{ 38012120Sar4jc@virginia.edu Rd_sd = Mem_sh; 38111723Sar4jc@virginia.edu }}); 38212120Sar4jc@virginia.edu 0x2: lw({{ 38312120Sar4jc@virginia.edu Rd_sd = Mem_sw; 38411723Sar4jc@virginia.edu }}); 38512120Sar4jc@virginia.edu 0x3: ld({{ 38612120Sar4jc@virginia.edu Rd_sd = Mem_sd; 38712120Sar4jc@virginia.edu }}); 38812120Sar4jc@virginia.edu 0x4: lbu({{ 38912120Sar4jc@virginia.edu Rd = Mem_ub; 39012120Sar4jc@virginia.edu }}); 39112120Sar4jc@virginia.edu 0x5: lhu({{ 39212120Sar4jc@virginia.edu Rd = Mem_uh; 39312120Sar4jc@virginia.edu }}); 39412120Sar4jc@virginia.edu 0x6: lwu({{ 39512120Sar4jc@virginia.edu Rd = Mem_uw; 39611723Sar4jc@virginia.edu }}); 39711723Sar4jc@virginia.edu } 39811723Sar4jc@virginia.edu } 39911723Sar4jc@virginia.edu 40012120Sar4jc@virginia.edu 0x01: decode FUNCT3 { 40112120Sar4jc@virginia.edu format Load { 40212120Sar4jc@virginia.edu 0x2: flw({{ 40312120Sar4jc@virginia.edu Fd_bits = (uint64_t)Mem_uw; 40412445Sar4jc@virginia.edu }}, inst_flags=FloatMemReadOp); 40512120Sar4jc@virginia.edu 0x3: fld({{ 40612120Sar4jc@virginia.edu Fd_bits = Mem; 40712445Sar4jc@virginia.edu }}, inst_flags=FloatMemReadOp); 40811726Sar4jc@virginia.edu } 40911726Sar4jc@virginia.edu } 41012120Sar4jc@virginia.edu 41112120Sar4jc@virginia.edu 0x03: decode FUNCT3 { 41212120Sar4jc@virginia.edu format IOp { 41312120Sar4jc@virginia.edu 0x0: fence({{ 41412428Sar4jc@virginia.edu }}, uint64_t, IsNonSpeculative, IsMemBarrier, No_OpClass); 41512120Sar4jc@virginia.edu 0x1: fence_i({{ 41612428Sar4jc@virginia.edu }}, uint64_t, IsNonSpeculative, IsSerializeAfter, No_OpClass); 41711726Sar4jc@virginia.edu } 41811726Sar4jc@virginia.edu } 41912120Sar4jc@virginia.edu 42012120Sar4jc@virginia.edu 0x04: decode FUNCT3 { 42112120Sar4jc@virginia.edu format IOp { 42212120Sar4jc@virginia.edu 0x0: addi({{ 42312120Sar4jc@virginia.edu Rd_sd = Rs1_sd + imm; 42411723Sar4jc@virginia.edu }}); 42512120Sar4jc@virginia.edu 0x1: slli({{ 42612120Sar4jc@virginia.edu Rd = Rs1 << SHAMT6; 42712120Sar4jc@virginia.edu }}); 42812120Sar4jc@virginia.edu 0x2: slti({{ 42912120Sar4jc@virginia.edu Rd = (Rs1_sd < imm) ? 1 : 0; 43012120Sar4jc@virginia.edu }}); 43112120Sar4jc@virginia.edu 0x3: sltiu({{ 43212428Sar4jc@virginia.edu Rd = (Rs1 < imm) ? 1 : 0; 43312428Sar4jc@virginia.edu }}, uint64_t); 43412120Sar4jc@virginia.edu 0x4: xori({{ 43512428Sar4jc@virginia.edu Rd = Rs1 ^ imm; 43612428Sar4jc@virginia.edu }}, uint64_t); 43712120Sar4jc@virginia.edu 0x5: decode SRTYPE { 43812120Sar4jc@virginia.edu 0x0: srli({{ 43912120Sar4jc@virginia.edu Rd = Rs1 >> SHAMT6; 44012120Sar4jc@virginia.edu }}); 44112120Sar4jc@virginia.edu 0x1: srai({{ 44212120Sar4jc@virginia.edu Rd_sd = Rs1_sd >> SHAMT6; 44312120Sar4jc@virginia.edu }}); 44412120Sar4jc@virginia.edu } 44512120Sar4jc@virginia.edu 0x6: ori({{ 44612428Sar4jc@virginia.edu Rd = Rs1 | imm; 44712428Sar4jc@virginia.edu }}, uint64_t); 44812120Sar4jc@virginia.edu 0x7: andi({{ 44912428Sar4jc@virginia.edu Rd = Rs1 & imm; 45012428Sar4jc@virginia.edu }}, uint64_t); 45111723Sar4jc@virginia.edu } 45212120Sar4jc@virginia.edu } 45312120Sar4jc@virginia.edu 45412120Sar4jc@virginia.edu 0x05: UOp::auipc({{ 45512120Sar4jc@virginia.edu Rd = PC + imm; 45612120Sar4jc@virginia.edu }}); 45712120Sar4jc@virginia.edu 45812120Sar4jc@virginia.edu 0x06: decode FUNCT3 { 45912120Sar4jc@virginia.edu format IOp { 46012120Sar4jc@virginia.edu 0x0: addiw({{ 46112428Sar4jc@virginia.edu Rd_sd = Rs1_sw + imm; 46212428Sar4jc@virginia.edu }}, int32_t); 46312120Sar4jc@virginia.edu 0x1: slliw({{ 46412120Sar4jc@virginia.edu Rd_sd = Rs1_sw << SHAMT5; 46512120Sar4jc@virginia.edu }}); 46612120Sar4jc@virginia.edu 0x5: decode SRTYPE { 46712120Sar4jc@virginia.edu 0x0: srliw({{ 46812807Saustinharris@utexas.edu Rd_sd = (int32_t)(Rs1_uw >> SHAMT5); 46912120Sar4jc@virginia.edu }}); 47012120Sar4jc@virginia.edu 0x1: sraiw({{ 47112120Sar4jc@virginia.edu Rd_sd = Rs1_sw >> SHAMT5; 47212120Sar4jc@virginia.edu }}); 47312120Sar4jc@virginia.edu } 47412120Sar4jc@virginia.edu } 47512120Sar4jc@virginia.edu } 47611724Sar4jc@virginia.edu 47712120Sar4jc@virginia.edu 0x08: decode FUNCT3 { 47812120Sar4jc@virginia.edu format Store { 47912120Sar4jc@virginia.edu 0x0: sb({{ 48012120Sar4jc@virginia.edu Mem_ub = Rs2_ub; 48112120Sar4jc@virginia.edu }}); 48212120Sar4jc@virginia.edu 0x1: sh({{ 48312120Sar4jc@virginia.edu Mem_uh = Rs2_uh; 48412120Sar4jc@virginia.edu }}); 48512120Sar4jc@virginia.edu 0x2: sw({{ 48612120Sar4jc@virginia.edu Mem_uw = Rs2_uw; 48712120Sar4jc@virginia.edu }}); 48812120Sar4jc@virginia.edu 0x3: sd({{ 48912120Sar4jc@virginia.edu Mem_ud = Rs2_ud; 49012120Sar4jc@virginia.edu }}); 49112120Sar4jc@virginia.edu } 49212120Sar4jc@virginia.edu } 49311724Sar4jc@virginia.edu 49412120Sar4jc@virginia.edu 0x09: decode FUNCT3 { 49512120Sar4jc@virginia.edu format Store { 49612120Sar4jc@virginia.edu 0x2: fsw({{ 49712120Sar4jc@virginia.edu Mem_uw = (uint32_t)Fs2_bits; 49812445Sar4jc@virginia.edu }}, inst_flags=FloatMemWriteOp); 49912120Sar4jc@virginia.edu 0x3: fsd({{ 50012120Sar4jc@virginia.edu Mem_ud = Fs2_bits; 50112445Sar4jc@virginia.edu }}, inst_flags=FloatMemWriteOp); 50212120Sar4jc@virginia.edu } 50312120Sar4jc@virginia.edu } 50411724Sar4jc@virginia.edu 50512120Sar4jc@virginia.edu 0x0b: decode FUNCT3 { 50612120Sar4jc@virginia.edu 0x2: decode AMOFUNCT { 50712120Sar4jc@virginia.edu 0x2: LoadReserved::lr_w({{ 50812120Sar4jc@virginia.edu Rd_sd = Mem_sw; 50912120Sar4jc@virginia.edu }}, mem_flags=LLSC); 51012120Sar4jc@virginia.edu 0x3: StoreCond::sc_w({{ 51112120Sar4jc@virginia.edu Mem_uw = Rs2_uw; 51212120Sar4jc@virginia.edu }}, {{ 51312120Sar4jc@virginia.edu Rd = result; 51412120Sar4jc@virginia.edu }}, inst_flags=IsStoreConditional, mem_flags=LLSC); 51512120Sar4jc@virginia.edu format AtomicMemOp { 51612120Sar4jc@virginia.edu 0x0: amoadd_w({{Rt_sd = Mem_sw;}}, {{ 51712120Sar4jc@virginia.edu Mem_sw = Rs2_sw + Rt_sd; 51812120Sar4jc@virginia.edu Rd_sd = Rt_sd; 51912120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 52012120Sar4jc@virginia.edu 0x1: amoswap_w({{Rt_sd = Mem_sw;}}, {{ 52112120Sar4jc@virginia.edu Mem_sw = Rs2_uw; 52212120Sar4jc@virginia.edu Rd_sd = Rt_sd; 52312120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 52412120Sar4jc@virginia.edu 0x4: amoxor_w({{Rt_sd = Mem_sw;}}, {{ 52512120Sar4jc@virginia.edu Mem_sw = Rs2_uw^Rt_sd; 52612120Sar4jc@virginia.edu Rd_sd = Rt_sd; 52712120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 52812120Sar4jc@virginia.edu 0x8: amoor_w({{Rt_sd = Mem_sw;}}, {{ 52912120Sar4jc@virginia.edu Mem_sw = Rs2_uw | Rt_sd; 53012120Sar4jc@virginia.edu Rd_sd = Rt_sd; 53112120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 53212120Sar4jc@virginia.edu 0xc: amoand_w({{Rt_sd = Mem_sw;}}, {{ 53312120Sar4jc@virginia.edu Mem_sw = Rs2_uw&Rt_sd; 53412120Sar4jc@virginia.edu Rd_sd = Rt_sd; 53512120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 53612120Sar4jc@virginia.edu 0x10: amomin_w({{Rt_sd = Mem_sw;}}, {{ 53712120Sar4jc@virginia.edu Mem_sw = min<int32_t>(Rs2_sw, Rt_sd); 53812120Sar4jc@virginia.edu Rd_sd = Rt_sd; 53912120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 54012120Sar4jc@virginia.edu 0x14: amomax_w({{Rt_sd = Mem_sw;}}, {{ 54112120Sar4jc@virginia.edu Mem_sw = max<int32_t>(Rs2_sw, Rt_sd); 54212120Sar4jc@virginia.edu Rd_sd = Rt_sd; 54312120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 54412120Sar4jc@virginia.edu 0x18: amominu_w({{Rt_sd = Mem_sw;}}, {{ 54512120Sar4jc@virginia.edu Mem_sw = min<uint32_t>(Rs2_uw, Rt_sd); 54612120Sar4jc@virginia.edu Rd_sd = Rt_sd; 54712120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 54812120Sar4jc@virginia.edu 0x1c: amomaxu_w({{Rt_sd = Mem_sw;}}, {{ 54912120Sar4jc@virginia.edu Mem_sw = max<uint32_t>(Rs2_uw, Rt_sd); 55012120Sar4jc@virginia.edu Rd_sd = Rt_sd; 55112120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 55212120Sar4jc@virginia.edu } 55311723Sar4jc@virginia.edu } 55412120Sar4jc@virginia.edu 0x3: decode AMOFUNCT { 55512120Sar4jc@virginia.edu 0x2: LoadReserved::lr_d({{ 55612120Sar4jc@virginia.edu Rd_sd = Mem_sd; 55712120Sar4jc@virginia.edu }}, mem_flags=LLSC); 55812120Sar4jc@virginia.edu 0x3: StoreCond::sc_d({{ 55912120Sar4jc@virginia.edu Mem = Rs2; 56012120Sar4jc@virginia.edu }}, {{ 56112120Sar4jc@virginia.edu Rd = result; 56212120Sar4jc@virginia.edu }}, mem_flags=LLSC, inst_flags=IsStoreConditional); 56312120Sar4jc@virginia.edu format AtomicMemOp { 56412120Sar4jc@virginia.edu 0x0: amoadd_d({{Rt_sd = Mem_sd;}}, {{ 56512120Sar4jc@virginia.edu Mem_sd = Rs2_sd + Rt_sd; 56612120Sar4jc@virginia.edu Rd_sd = Rt_sd; 56712120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 56812120Sar4jc@virginia.edu 0x1: amoswap_d({{Rt = Mem;}}, {{ 56912120Sar4jc@virginia.edu Mem = Rs2; 57012120Sar4jc@virginia.edu Rd = Rt; 57112120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 57212120Sar4jc@virginia.edu 0x4: amoxor_d({{Rt = Mem;}}, {{ 57312120Sar4jc@virginia.edu Mem = Rs2^Rt; 57412120Sar4jc@virginia.edu Rd = Rt; 57512120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 57612120Sar4jc@virginia.edu 0x8: amoor_d({{Rt = Mem;}}, {{ 57712120Sar4jc@virginia.edu Mem = Rs2 | Rt; 57812120Sar4jc@virginia.edu Rd = Rt; 57912120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 58012120Sar4jc@virginia.edu 0xc: amoand_d({{Rt = Mem;}}, {{ 58112120Sar4jc@virginia.edu Mem = Rs2&Rt; 58212120Sar4jc@virginia.edu Rd = Rt; 58312120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 58412120Sar4jc@virginia.edu 0x10: amomin_d({{Rt_sd = Mem_sd;}}, {{ 58512120Sar4jc@virginia.edu Mem_sd = min(Rs2_sd, Rt_sd); 58612120Sar4jc@virginia.edu Rd_sd = Rt_sd; 58712120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 58812120Sar4jc@virginia.edu 0x14: amomax_d({{Rt_sd = Mem_sd;}}, {{ 58912120Sar4jc@virginia.edu Mem_sd = max(Rs2_sd, Rt_sd); 59012120Sar4jc@virginia.edu Rd_sd = Rt_sd; 59112120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 59212120Sar4jc@virginia.edu 0x18: amominu_d({{Rt = Mem;}}, {{ 59312120Sar4jc@virginia.edu Mem = min(Rs2, Rt); 59412120Sar4jc@virginia.edu Rd = Rt; 59512120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 59612120Sar4jc@virginia.edu 0x1c: amomaxu_d({{Rt = Mem;}}, {{ 59712120Sar4jc@virginia.edu Mem = max(Rs2, Rt); 59812120Sar4jc@virginia.edu Rd = Rt; 59912120Sar4jc@virginia.edu }}, {{EA = Rs1;}}); 60012120Sar4jc@virginia.edu } 60112120Sar4jc@virginia.edu } 60212120Sar4jc@virginia.edu } 60312120Sar4jc@virginia.edu 0x0c: decode FUNCT3 { 60412120Sar4jc@virginia.edu format ROp { 60512120Sar4jc@virginia.edu 0x0: decode FUNCT7 { 60612120Sar4jc@virginia.edu 0x0: add({{ 60712120Sar4jc@virginia.edu Rd = Rs1_sd + Rs2_sd; 60812120Sar4jc@virginia.edu }}); 60912120Sar4jc@virginia.edu 0x1: mul({{ 61012120Sar4jc@virginia.edu Rd = Rs1_sd*Rs2_sd; 61112120Sar4jc@virginia.edu }}, IntMultOp); 61212120Sar4jc@virginia.edu 0x20: sub({{ 61312120Sar4jc@virginia.edu Rd = Rs1_sd - Rs2_sd; 61412120Sar4jc@virginia.edu }}); 61512120Sar4jc@virginia.edu } 61612120Sar4jc@virginia.edu 0x1: decode FUNCT7 { 61712120Sar4jc@virginia.edu 0x0: sll({{ 61812120Sar4jc@virginia.edu Rd = Rs1 << Rs2<5:0>; 61912120Sar4jc@virginia.edu }}); 62012120Sar4jc@virginia.edu 0x1: mulh({{ 62112120Sar4jc@virginia.edu bool negate = (Rs1_sd < 0) != (Rs2_sd < 0); 62212120Sar4jc@virginia.edu 62312120Sar4jc@virginia.edu uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd); 62412120Sar4jc@virginia.edu uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32; 62512120Sar4jc@virginia.edu uint64_t Rs2_lo = (uint32_t)abs(Rs2_sd); 62612120Sar4jc@virginia.edu uint64_t Rs2_hi = (uint64_t)abs(Rs2_sd) >> 32; 62712120Sar4jc@virginia.edu 62812120Sar4jc@virginia.edu uint64_t hi = Rs1_hi*Rs2_hi; 62912120Sar4jc@virginia.edu uint64_t mid1 = Rs1_hi*Rs2_lo; 63012120Sar4jc@virginia.edu uint64_t mid2 = Rs1_lo*Rs2_hi; 63112120Sar4jc@virginia.edu uint64_t lo = Rs2_lo*Rs1_lo; 63212120Sar4jc@virginia.edu uint64_t carry = ((uint64_t)(uint32_t)mid1 63312120Sar4jc@virginia.edu + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32; 63412120Sar4jc@virginia.edu 63512120Sar4jc@virginia.edu uint64_t res = hi + 63612120Sar4jc@virginia.edu (mid1 >> 32) + 63712120Sar4jc@virginia.edu (mid2 >> 32) + 63812120Sar4jc@virginia.edu carry; 63912120Sar4jc@virginia.edu Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0) 64012120Sar4jc@virginia.edu : res; 64112120Sar4jc@virginia.edu }}, IntMultOp); 64212120Sar4jc@virginia.edu } 64312120Sar4jc@virginia.edu 0x2: decode FUNCT7 { 64412120Sar4jc@virginia.edu 0x0: slt({{ 64512120Sar4jc@virginia.edu Rd = (Rs1_sd < Rs2_sd) ? 1 : 0; 64612120Sar4jc@virginia.edu }}); 64712120Sar4jc@virginia.edu 0x1: mulhsu({{ 64812120Sar4jc@virginia.edu bool negate = Rs1_sd < 0; 64912120Sar4jc@virginia.edu uint64_t Rs1_lo = (uint32_t)abs(Rs1_sd); 65012120Sar4jc@virginia.edu uint64_t Rs1_hi = (uint64_t)abs(Rs1_sd) >> 32; 65112120Sar4jc@virginia.edu uint64_t Rs2_lo = (uint32_t)Rs2; 65212120Sar4jc@virginia.edu uint64_t Rs2_hi = Rs2 >> 32; 65312120Sar4jc@virginia.edu 65412120Sar4jc@virginia.edu uint64_t hi = Rs1_hi*Rs2_hi; 65512120Sar4jc@virginia.edu uint64_t mid1 = Rs1_hi*Rs2_lo; 65612120Sar4jc@virginia.edu uint64_t mid2 = Rs1_lo*Rs2_hi; 65712120Sar4jc@virginia.edu uint64_t lo = Rs1_lo*Rs2_lo; 65812120Sar4jc@virginia.edu uint64_t carry = ((uint64_t)(uint32_t)mid1 65912120Sar4jc@virginia.edu + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32; 66012120Sar4jc@virginia.edu 66112120Sar4jc@virginia.edu uint64_t res = hi + 66212120Sar4jc@virginia.edu (mid1 >> 32) + 66312120Sar4jc@virginia.edu (mid2 >> 32) + 66412120Sar4jc@virginia.edu carry; 66512120Sar4jc@virginia.edu Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res; 66612120Sar4jc@virginia.edu }}, IntMultOp); 66712120Sar4jc@virginia.edu } 66812120Sar4jc@virginia.edu 0x3: decode FUNCT7 { 66912120Sar4jc@virginia.edu 0x0: sltu({{ 67012120Sar4jc@virginia.edu Rd = (Rs1 < Rs2) ? 1 : 0; 67112120Sar4jc@virginia.edu }}); 67212120Sar4jc@virginia.edu 0x1: mulhu({{ 67312120Sar4jc@virginia.edu uint64_t Rs1_lo = (uint32_t)Rs1; 67412120Sar4jc@virginia.edu uint64_t Rs1_hi = Rs1 >> 32; 67512120Sar4jc@virginia.edu uint64_t Rs2_lo = (uint32_t)Rs2; 67612120Sar4jc@virginia.edu uint64_t Rs2_hi = Rs2 >> 32; 67712120Sar4jc@virginia.edu 67812120Sar4jc@virginia.edu uint64_t hi = Rs1_hi*Rs2_hi; 67912120Sar4jc@virginia.edu uint64_t mid1 = Rs1_hi*Rs2_lo; 68012120Sar4jc@virginia.edu uint64_t mid2 = Rs1_lo*Rs2_hi; 68112120Sar4jc@virginia.edu uint64_t lo = Rs1_lo*Rs2_lo; 68212120Sar4jc@virginia.edu uint64_t carry = ((uint64_t)(uint32_t)mid1 68312120Sar4jc@virginia.edu + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32; 68412120Sar4jc@virginia.edu 68512120Sar4jc@virginia.edu Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry; 68612120Sar4jc@virginia.edu }}, IntMultOp); 68712120Sar4jc@virginia.edu } 68812120Sar4jc@virginia.edu 0x4: decode FUNCT7 { 68912120Sar4jc@virginia.edu 0x0: xor({{ 69012120Sar4jc@virginia.edu Rd = Rs1 ^ Rs2; 69112120Sar4jc@virginia.edu }}); 69212120Sar4jc@virginia.edu 0x1: div({{ 69312120Sar4jc@virginia.edu if (Rs2_sd == 0) { 69412120Sar4jc@virginia.edu Rd_sd = -1; 69512120Sar4jc@virginia.edu } else if (Rs1_sd == numeric_limits<int64_t>::min() 69612120Sar4jc@virginia.edu && Rs2_sd == -1) { 69712120Sar4jc@virginia.edu Rd_sd = numeric_limits<int64_t>::min(); 69812120Sar4jc@virginia.edu } else { 69912120Sar4jc@virginia.edu Rd_sd = Rs1_sd/Rs2_sd; 70012120Sar4jc@virginia.edu } 70112120Sar4jc@virginia.edu }}, IntDivOp); 70212120Sar4jc@virginia.edu } 70312120Sar4jc@virginia.edu 0x5: decode FUNCT7 { 70412120Sar4jc@virginia.edu 0x0: srl({{ 70512120Sar4jc@virginia.edu Rd = Rs1 >> Rs2<5:0>; 70612120Sar4jc@virginia.edu }}); 70712120Sar4jc@virginia.edu 0x1: divu({{ 70812120Sar4jc@virginia.edu if (Rs2 == 0) { 70912120Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 71012120Sar4jc@virginia.edu } else { 71112120Sar4jc@virginia.edu Rd = Rs1/Rs2; 71212120Sar4jc@virginia.edu } 71312120Sar4jc@virginia.edu }}, IntDivOp); 71412120Sar4jc@virginia.edu 0x20: sra({{ 71512120Sar4jc@virginia.edu Rd_sd = Rs1_sd >> Rs2<5:0>; 71612120Sar4jc@virginia.edu }}); 71712120Sar4jc@virginia.edu } 71812120Sar4jc@virginia.edu 0x6: decode FUNCT7 { 71912120Sar4jc@virginia.edu 0x0: or({{ 72012120Sar4jc@virginia.edu Rd = Rs1 | Rs2; 72112120Sar4jc@virginia.edu }}); 72212120Sar4jc@virginia.edu 0x1: rem({{ 72312120Sar4jc@virginia.edu if (Rs2_sd == 0) { 72412120Sar4jc@virginia.edu Rd = Rs1_sd; 72512120Sar4jc@virginia.edu } else if (Rs1_sd == numeric_limits<int64_t>::min() 72612120Sar4jc@virginia.edu && Rs2_sd == -1) { 72712120Sar4jc@virginia.edu Rd = 0; 72812120Sar4jc@virginia.edu } else { 72912120Sar4jc@virginia.edu Rd = Rs1_sd%Rs2_sd; 73012120Sar4jc@virginia.edu } 73112120Sar4jc@virginia.edu }}, IntDivOp); 73212120Sar4jc@virginia.edu } 73312120Sar4jc@virginia.edu 0x7: decode FUNCT7 { 73412120Sar4jc@virginia.edu 0x0: and({{ 73512120Sar4jc@virginia.edu Rd = Rs1 & Rs2; 73612120Sar4jc@virginia.edu }}); 73712120Sar4jc@virginia.edu 0x1: remu({{ 73812120Sar4jc@virginia.edu if (Rs2 == 0) { 73912120Sar4jc@virginia.edu Rd = Rs1; 74012120Sar4jc@virginia.edu } else { 74112120Sar4jc@virginia.edu Rd = Rs1%Rs2; 74212120Sar4jc@virginia.edu } 74312120Sar4jc@virginia.edu }}, IntDivOp); 74412120Sar4jc@virginia.edu } 74512120Sar4jc@virginia.edu } 74612120Sar4jc@virginia.edu } 74712120Sar4jc@virginia.edu 74812120Sar4jc@virginia.edu 0x0d: UOp::lui({{ 74912120Sar4jc@virginia.edu Rd = (uint64_t)imm; 75012120Sar4jc@virginia.edu }}); 75112120Sar4jc@virginia.edu 75212120Sar4jc@virginia.edu 0x0e: decode FUNCT3 { 75312120Sar4jc@virginia.edu format ROp { 75412120Sar4jc@virginia.edu 0x0: decode FUNCT7 { 75512120Sar4jc@virginia.edu 0x0: addw({{ 75612120Sar4jc@virginia.edu Rd_sd = Rs1_sw + Rs2_sw; 75712120Sar4jc@virginia.edu }}); 75812120Sar4jc@virginia.edu 0x1: mulw({{ 75912120Sar4jc@virginia.edu Rd_sd = (int32_t)(Rs1_sw*Rs2_sw); 76012120Sar4jc@virginia.edu }}, IntMultOp); 76112120Sar4jc@virginia.edu 0x20: subw({{ 76212120Sar4jc@virginia.edu Rd_sd = Rs1_sw - Rs2_sw; 76312120Sar4jc@virginia.edu }}); 76412120Sar4jc@virginia.edu } 76512120Sar4jc@virginia.edu 0x1: sllw({{ 76612120Sar4jc@virginia.edu Rd_sd = Rs1_sw << Rs2<4:0>; 76711723Sar4jc@virginia.edu }}); 76812120Sar4jc@virginia.edu 0x4: divw({{ 76912120Sar4jc@virginia.edu if (Rs2_sw == 0) { 77011724Sar4jc@virginia.edu Rd_sd = -1; 77112120Sar4jc@virginia.edu } else if (Rs1_sw == numeric_limits<int32_t>::min() 77212120Sar4jc@virginia.edu && Rs2_sw == -1) { 77312120Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::min(); 77411724Sar4jc@virginia.edu } else { 77512120Sar4jc@virginia.edu Rd_sd = Rs1_sw/Rs2_sw; 77611724Sar4jc@virginia.edu } 77711724Sar4jc@virginia.edu }}, IntDivOp); 77812120Sar4jc@virginia.edu 0x5: decode FUNCT7 { 77912120Sar4jc@virginia.edu 0x0: srlw({{ 78012807Saustinharris@utexas.edu Rd_sd = (int32_t)(Rs1_uw >> Rs2<4:0>); 78112120Sar4jc@virginia.edu }}); 78212120Sar4jc@virginia.edu 0x1: divuw({{ 78312120Sar4jc@virginia.edu if (Rs2_uw == 0) { 78412120Sar4jc@virginia.edu Rd_sd = numeric_limits<IntReg>::max(); 78512120Sar4jc@virginia.edu } else { 78612120Sar4jc@virginia.edu Rd_sd = (int32_t)(Rs1_uw/Rs2_uw); 78712120Sar4jc@virginia.edu } 78812120Sar4jc@virginia.edu }}, IntDivOp); 78912120Sar4jc@virginia.edu 0x20: sraw({{ 79012120Sar4jc@virginia.edu Rd_sd = Rs1_sw >> Rs2<4:0>; 79112120Sar4jc@virginia.edu }}); 79212120Sar4jc@virginia.edu } 79312120Sar4jc@virginia.edu 0x6: remw({{ 79412120Sar4jc@virginia.edu if (Rs2_sw == 0) { 79512120Sar4jc@virginia.edu Rd_sd = Rs1_sw; 79612120Sar4jc@virginia.edu } else if (Rs1_sw == numeric_limits<int32_t>::min() 79712120Sar4jc@virginia.edu && Rs2_sw == -1) { 79812120Sar4jc@virginia.edu Rd_sd = 0; 79911724Sar4jc@virginia.edu } else { 80012120Sar4jc@virginia.edu Rd_sd = Rs1_sw%Rs2_sw; 80111724Sar4jc@virginia.edu } 80211724Sar4jc@virginia.edu }}, IntDivOp); 80312120Sar4jc@virginia.edu 0x7: remuw({{ 80412120Sar4jc@virginia.edu if (Rs2_uw == 0) { 80512120Sar4jc@virginia.edu Rd_sd = (int32_t)Rs1_uw; 80611724Sar4jc@virginia.edu } else { 80712120Sar4jc@virginia.edu Rd_sd = (int32_t)(Rs1_uw%Rs2_uw); 80811724Sar4jc@virginia.edu } 80911724Sar4jc@virginia.edu }}, IntDivOp); 81011723Sar4jc@virginia.edu } 81111723Sar4jc@virginia.edu } 81211723Sar4jc@virginia.edu 81312120Sar4jc@virginia.edu format FPROp { 81412120Sar4jc@virginia.edu 0x10: decode FUNCT2 { 81512120Sar4jc@virginia.edu 0x0: fmadd_s({{ 81612120Sar4jc@virginia.edu uint32_t temp; 81712120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 81812120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 81912120Sar4jc@virginia.edu float fs3 = reinterpret_cast<float&>(temp = Fs3_bits); 82012120Sar4jc@virginia.edu float fd; 82111723Sar4jc@virginia.edu 82212138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2) || 82312138Sgabeblack@google.com std::isnan(fs3)) { 82412120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2) 82512120Sar4jc@virginia.edu || issignalingnan(fs3)) { 82612120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 82712120Sar4jc@virginia.edu } 82812120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 82912138Sgabeblack@google.com } else if (std::isinf(fs1) || std::isinf(fs2) || 83012138Sgabeblack@google.com std::isinf(fs3)) { 83112120Sar4jc@virginia.edu if (signbit(fs1) == signbit(fs2) 83212138Sgabeblack@google.com && !std::isinf(fs3)) { 83312120Sar4jc@virginia.edu fd = numeric_limits<float>::infinity(); 83412120Sar4jc@virginia.edu } else if (signbit(fs1) != signbit(fs2) 83512138Sgabeblack@google.com && !std::isinf(fs3)) { 83612120Sar4jc@virginia.edu fd = -numeric_limits<float>::infinity(); 83712120Sar4jc@virginia.edu } else { // Fs3_sf is infinity 83812120Sar4jc@virginia.edu fd = fs3; 83912120Sar4jc@virginia.edu } 84012120Sar4jc@virginia.edu } else { 84112120Sar4jc@virginia.edu fd = fs1*fs2 + fs3; 84212120Sar4jc@virginia.edu } 84312120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 84412445Sar4jc@virginia.edu }}, FloatMultAccOp); 84512120Sar4jc@virginia.edu 0x1: fmadd_d({{ 84612138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2) || 84712138Sgabeblack@google.com std::isnan(Fs3)) { 84812120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2) 84912120Sar4jc@virginia.edu || issignalingnan(Fs3)) { 85012120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 85112120Sar4jc@virginia.edu } 85212120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 85312138Sgabeblack@google.com } else if (std::isinf(Fs1) || std::isinf(Fs2) || 85412138Sgabeblack@google.com std::isinf(Fs3)) { 85512120Sar4jc@virginia.edu if (signbit(Fs1) == signbit(Fs2) 85612138Sgabeblack@google.com && !std::isinf(Fs3)) { 85712120Sar4jc@virginia.edu Fd = numeric_limits<double>::infinity(); 85812120Sar4jc@virginia.edu } else if (signbit(Fs1) != signbit(Fs2) 85912138Sgabeblack@google.com && !std::isinf(Fs3)) { 86012120Sar4jc@virginia.edu Fd = -numeric_limits<double>::infinity(); 86112120Sar4jc@virginia.edu } else { 86212120Sar4jc@virginia.edu Fd = Fs3; 86312120Sar4jc@virginia.edu } 86412120Sar4jc@virginia.edu } else { 86512120Sar4jc@virginia.edu Fd = Fs1*Fs2 + Fs3; 86612120Sar4jc@virginia.edu } 86712445Sar4jc@virginia.edu }}, FloatMultAccOp); 86811723Sar4jc@virginia.edu } 86912120Sar4jc@virginia.edu 0x11: decode FUNCT2 { 87012120Sar4jc@virginia.edu 0x0: fmsub_s({{ 87112120Sar4jc@virginia.edu uint32_t temp; 87212120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 87312120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 87412120Sar4jc@virginia.edu float fs3 = reinterpret_cast<float&>(temp = Fs3_bits); 87512120Sar4jc@virginia.edu float fd; 87612120Sar4jc@virginia.edu 87712138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2) || 87812138Sgabeblack@google.com std::isnan(fs3)) { 87912120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2) 88012120Sar4jc@virginia.edu || issignalingnan(fs3)) { 88112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 88212120Sar4jc@virginia.edu } 88312120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 88412138Sgabeblack@google.com } else if (std::isinf(fs1) || std::isinf(fs2) || 88512138Sgabeblack@google.com std::isinf(fs3)) { 88612120Sar4jc@virginia.edu if (signbit(fs1) == signbit(fs2) 88712138Sgabeblack@google.com && !std::isinf(fs3)) { 88812120Sar4jc@virginia.edu fd = numeric_limits<float>::infinity(); 88912120Sar4jc@virginia.edu } else if (signbit(fs1) != signbit(fs2) 89012138Sgabeblack@google.com && !std::isinf(fs3)) { 89112120Sar4jc@virginia.edu fd = -numeric_limits<float>::infinity(); 89212120Sar4jc@virginia.edu } else { // Fs3_sf is infinity 89312120Sar4jc@virginia.edu fd = -fs3; 89412120Sar4jc@virginia.edu } 89511724Sar4jc@virginia.edu } else { 89612120Sar4jc@virginia.edu fd = fs1*fs2 - fs3; 89711724Sar4jc@virginia.edu } 89812120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 89912445Sar4jc@virginia.edu }}, FloatMultAccOp); 90012120Sar4jc@virginia.edu 0x1: fmsub_d({{ 90112138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2) || 90212138Sgabeblack@google.com std::isnan(Fs3)) { 90312120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2) 90412120Sar4jc@virginia.edu || issignalingnan(Fs3)) { 90512120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 90612120Sar4jc@virginia.edu } 90712120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 90812138Sgabeblack@google.com } else if (std::isinf(Fs1) || std::isinf(Fs2) || 90912138Sgabeblack@google.com std::isinf(Fs3)) { 91012120Sar4jc@virginia.edu if (signbit(Fs1) == signbit(Fs2) 91112138Sgabeblack@google.com && !std::isinf(Fs3)) { 91212120Sar4jc@virginia.edu Fd = numeric_limits<double>::infinity(); 91312120Sar4jc@virginia.edu } else if (signbit(Fs1) != signbit(Fs2) 91412138Sgabeblack@google.com && !std::isinf(Fs3)) { 91512120Sar4jc@virginia.edu Fd = -numeric_limits<double>::infinity(); 91612120Sar4jc@virginia.edu } else { 91712120Sar4jc@virginia.edu Fd = -Fs3; 91812120Sar4jc@virginia.edu } 91912120Sar4jc@virginia.edu } else { 92012120Sar4jc@virginia.edu Fd = Fs1*Fs2 - Fs3; 92112120Sar4jc@virginia.edu } 92212445Sar4jc@virginia.edu }}, FloatMultAccOp); 92311723Sar4jc@virginia.edu } 92412120Sar4jc@virginia.edu 0x12: decode FUNCT2 { 92512120Sar4jc@virginia.edu 0x0: fnmsub_s({{ 92612120Sar4jc@virginia.edu uint32_t temp; 92712120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 92812120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 92912120Sar4jc@virginia.edu float fs3 = reinterpret_cast<float&>(temp = Fs3_bits); 93012120Sar4jc@virginia.edu float fd; 93111723Sar4jc@virginia.edu 93212138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2) || 93312138Sgabeblack@google.com std::isnan(fs3)) { 93412120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2) 93512120Sar4jc@virginia.edu || issignalingnan(fs3)) { 93612120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 93712120Sar4jc@virginia.edu } 93812120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 93912138Sgabeblack@google.com } else if (std::isinf(fs1) || std::isinf(fs2) || 94012138Sgabeblack@google.com std::isinf(fs3)) { 94112120Sar4jc@virginia.edu if (signbit(fs1) == signbit(fs2) 94212138Sgabeblack@google.com && !std::isinf(fs3)) { 94312120Sar4jc@virginia.edu fd = -numeric_limits<float>::infinity(); 94412120Sar4jc@virginia.edu } else if (signbit(fs1) != signbit(fs2) 94512138Sgabeblack@google.com && !std::isinf(fs3)) { 94612120Sar4jc@virginia.edu fd = numeric_limits<float>::infinity(); 94712120Sar4jc@virginia.edu } else { // Fs3_sf is infinity 94812120Sar4jc@virginia.edu fd = fs3; 94912120Sar4jc@virginia.edu } 95012120Sar4jc@virginia.edu } else { 95112120Sar4jc@virginia.edu fd = -(fs1*fs2 - fs3); 95212120Sar4jc@virginia.edu } 95312120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 95412445Sar4jc@virginia.edu }}, FloatMultAccOp); 95512120Sar4jc@virginia.edu 0x1: fnmsub_d({{ 95612138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2) || 95712138Sgabeblack@google.com std::isnan(Fs3)) { 95812120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2) 95912120Sar4jc@virginia.edu || issignalingnan(Fs3)) { 96012120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 96112120Sar4jc@virginia.edu } 96212120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 96312138Sgabeblack@google.com } else if (std::isinf(Fs1) || std::isinf(Fs2) 96412138Sgabeblack@google.com || std::isinf(Fs3)) { 96512120Sar4jc@virginia.edu if (signbit(Fs1) == signbit(Fs2) 96612138Sgabeblack@google.com && !std::isinf(Fs3)) { 96712120Sar4jc@virginia.edu Fd = -numeric_limits<double>::infinity(); 96812120Sar4jc@virginia.edu } else if (signbit(Fs1) != signbit(Fs2) 96912138Sgabeblack@google.com && !std::isinf(Fs3)) { 97012120Sar4jc@virginia.edu Fd = numeric_limits<double>::infinity(); 97112120Sar4jc@virginia.edu } else { 97212120Sar4jc@virginia.edu Fd = Fs3; 97312120Sar4jc@virginia.edu } 97412120Sar4jc@virginia.edu } else { 97512120Sar4jc@virginia.edu Fd = -(Fs1*Fs2 - Fs3); 97612120Sar4jc@virginia.edu } 97712445Sar4jc@virginia.edu }}, FloatMultAccOp); 97812120Sar4jc@virginia.edu } 97912120Sar4jc@virginia.edu 0x13: decode FUNCT2 { 98012120Sar4jc@virginia.edu 0x0: fnmadd_s({{ 98112120Sar4jc@virginia.edu uint32_t temp; 98212120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 98312120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 98412120Sar4jc@virginia.edu float fs3 = reinterpret_cast<float&>(temp = Fs3_bits); 98512120Sar4jc@virginia.edu float fd; 98611725Sar4jc@virginia.edu 98712138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2) || 98812138Sgabeblack@google.com std::isnan(fs3)) { 98912120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2) 99012120Sar4jc@virginia.edu || issignalingnan(fs3)) { 99112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 99212120Sar4jc@virginia.edu } 99312120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 99412138Sgabeblack@google.com } else if (std::isinf(fs1) || std::isinf(fs2) || 99512138Sgabeblack@google.com std::isinf(fs3)) { 99612120Sar4jc@virginia.edu if (signbit(fs1) == signbit(fs2) 99712138Sgabeblack@google.com && !std::isinf(fs3)) { 99812120Sar4jc@virginia.edu fd = -numeric_limits<float>::infinity(); 99912120Sar4jc@virginia.edu } else if (signbit(fs1) != signbit(fs2) 100012138Sgabeblack@google.com && !std::isinf(fs3)) { 100112120Sar4jc@virginia.edu fd = numeric_limits<float>::infinity(); 100212120Sar4jc@virginia.edu } else { // Fs3_sf is infinity 100312120Sar4jc@virginia.edu fd = -fs3; 100412120Sar4jc@virginia.edu } 100512120Sar4jc@virginia.edu } else { 100612120Sar4jc@virginia.edu fd = -(fs1*fs2 + fs3); 100711725Sar4jc@virginia.edu } 100812120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 100912445Sar4jc@virginia.edu }}, FloatMultAccOp); 101012120Sar4jc@virginia.edu 0x1: fnmadd_d({{ 101112138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2) || 101212138Sgabeblack@google.com std::isnan(Fs3)) { 101312120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2) 101412120Sar4jc@virginia.edu || issignalingnan(Fs3)) { 101512120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 101612120Sar4jc@virginia.edu } 101712120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 101812138Sgabeblack@google.com } else if (std::isinf(Fs1) || std::isinf(Fs2) || 101912138Sgabeblack@google.com std::isinf(Fs3)) { 102012120Sar4jc@virginia.edu if (signbit(Fs1) == signbit(Fs2) 102112138Sgabeblack@google.com && !std::isinf(Fs3)) { 102212120Sar4jc@virginia.edu Fd = -numeric_limits<double>::infinity(); 102312120Sar4jc@virginia.edu } else if (signbit(Fs1) != signbit(Fs2) 102412138Sgabeblack@google.com && !std::isinf(Fs3)) { 102512120Sar4jc@virginia.edu Fd = numeric_limits<double>::infinity(); 102612120Sar4jc@virginia.edu } else { 102712120Sar4jc@virginia.edu Fd = -Fs3; 102812120Sar4jc@virginia.edu } 102912120Sar4jc@virginia.edu } else { 103012120Sar4jc@virginia.edu Fd = -(Fs1*Fs2 + Fs3); 103111725Sar4jc@virginia.edu } 103212445Sar4jc@virginia.edu }}, FloatMultAccOp); 103312120Sar4jc@virginia.edu } 103412120Sar4jc@virginia.edu 0x14: decode FUNCT7 { 103512120Sar4jc@virginia.edu 0x0: fadd_s({{ 103611725Sar4jc@virginia.edu uint32_t temp; 103711725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 103811725Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 103911725Sar4jc@virginia.edu float fd; 104011725Sar4jc@virginia.edu 104112138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 104212120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2)) { 104312120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 104412120Sar4jc@virginia.edu } 104512120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 104611725Sar4jc@virginia.edu } else { 104712120Sar4jc@virginia.edu fd = fs1 + fs2; 104811725Sar4jc@virginia.edu } 104911725Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 105012120Sar4jc@virginia.edu }}, FloatAddOp); 105112120Sar4jc@virginia.edu 0x1: fadd_d({{ 105212138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 105312120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2)) { 105412120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 105512120Sar4jc@virginia.edu } 105612120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 105712120Sar4jc@virginia.edu } else { 105812120Sar4jc@virginia.edu Fd = Fs1 + Fs2; 105912120Sar4jc@virginia.edu } 106012120Sar4jc@virginia.edu }}, FloatAddOp); 106112120Sar4jc@virginia.edu 0x4: fsub_s({{ 106211725Sar4jc@virginia.edu uint32_t temp; 106311725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 106411725Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 106511725Sar4jc@virginia.edu float fd; 106611725Sar4jc@virginia.edu 106712138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 106812120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2)) { 106912120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 107012120Sar4jc@virginia.edu } 107112120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 107211725Sar4jc@virginia.edu } else { 107312120Sar4jc@virginia.edu fd = fs1 - fs2; 107411725Sar4jc@virginia.edu } 107511725Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 107612120Sar4jc@virginia.edu }}, FloatAddOp); 107712120Sar4jc@virginia.edu 0x5: fsub_d({{ 107812138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 107912120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2)) { 108012120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 108112120Sar4jc@virginia.edu } 108212120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 108312120Sar4jc@virginia.edu } else { 108412120Sar4jc@virginia.edu Fd = Fs1 - Fs2; 108512120Sar4jc@virginia.edu } 108612120Sar4jc@virginia.edu }}, FloatAddOp); 108712120Sar4jc@virginia.edu 0x8: fmul_s({{ 108811725Sar4jc@virginia.edu uint32_t temp; 108911725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 109011725Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 109111725Sar4jc@virginia.edu float fd; 109211725Sar4jc@virginia.edu 109312138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 109412120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2)) { 109512120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 109612120Sar4jc@virginia.edu } 109712120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 109811725Sar4jc@virginia.edu } else { 109912120Sar4jc@virginia.edu fd = fs1*fs2; 110011725Sar4jc@virginia.edu } 110111725Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 110212120Sar4jc@virginia.edu }}, FloatMultOp); 110312120Sar4jc@virginia.edu 0x9: fmul_d({{ 110412138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 110512120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2)) { 110612120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 110712120Sar4jc@virginia.edu } 110812120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 110911725Sar4jc@virginia.edu } else { 111012120Sar4jc@virginia.edu Fd = Fs1*Fs2; 111111725Sar4jc@virginia.edu } 111212120Sar4jc@virginia.edu }}, FloatMultOp); 111312120Sar4jc@virginia.edu 0xc: fdiv_s({{ 111411725Sar4jc@virginia.edu uint32_t temp; 111511725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 111611725Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 111711725Sar4jc@virginia.edu float fd; 111811725Sar4jc@virginia.edu 111912138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 112012120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2)) { 112112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 112212120Sar4jc@virginia.edu } 112312120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 112412120Sar4jc@virginia.edu } else { 112512120Sar4jc@virginia.edu fd = fs1/fs2; 112612120Sar4jc@virginia.edu } 112712120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 112812120Sar4jc@virginia.edu }}, FloatDivOp); 112912120Sar4jc@virginia.edu 0xd: fdiv_d({{ 113012138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 113112120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2)) { 113212120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 113312120Sar4jc@virginia.edu } 113412120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 113512120Sar4jc@virginia.edu } else { 113612120Sar4jc@virginia.edu Fd = Fs1/Fs2; 113712120Sar4jc@virginia.edu } 113812120Sar4jc@virginia.edu }}, FloatDivOp); 113912120Sar4jc@virginia.edu 0x10: decode ROUND_MODE { 114012120Sar4jc@virginia.edu 0x0: fsgnj_s({{ 114112120Sar4jc@virginia.edu uint32_t temp; 114212120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 114312120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 114412120Sar4jc@virginia.edu float fd; 114512120Sar4jc@virginia.edu 114612120Sar4jc@virginia.edu if (issignalingnan(fs1)) { 114712120Sar4jc@virginia.edu fd = numeric_limits<float>::signaling_NaN(); 114812120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 114912120Sar4jc@virginia.edu } else { 115012120Sar4jc@virginia.edu fd = copysign(fs1, fs2); 115112120Sar4jc@virginia.edu } 115212120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 115312445Sar4jc@virginia.edu }}, FloatMiscOp); 115412120Sar4jc@virginia.edu 0x1: fsgnjn_s({{ 115512120Sar4jc@virginia.edu uint32_t temp; 115612120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 115712120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 115812120Sar4jc@virginia.edu float fd; 115912120Sar4jc@virginia.edu 116012120Sar4jc@virginia.edu if (issignalingnan(fs1)) { 116112120Sar4jc@virginia.edu fd = numeric_limits<float>::signaling_NaN(); 116212120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 116312120Sar4jc@virginia.edu } else { 116412120Sar4jc@virginia.edu fd = copysign(fs1, -fs2); 116512120Sar4jc@virginia.edu } 116612120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 116712445Sar4jc@virginia.edu }}, FloatMiscOp); 116812120Sar4jc@virginia.edu 0x2: fsgnjx_s({{ 116912120Sar4jc@virginia.edu uint32_t temp; 117012120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 117112120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 117212120Sar4jc@virginia.edu float fd; 117312120Sar4jc@virginia.edu 117412120Sar4jc@virginia.edu if (issignalingnan(fs1)) { 117512120Sar4jc@virginia.edu fd = numeric_limits<float>::signaling_NaN(); 117612120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 117712120Sar4jc@virginia.edu } else { 117812120Sar4jc@virginia.edu fd = fs1*(signbit(fs2) ? -1.0 : 1.0); 117912120Sar4jc@virginia.edu } 118012120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 118112445Sar4jc@virginia.edu }}, FloatMiscOp); 118212120Sar4jc@virginia.edu } 118312120Sar4jc@virginia.edu 0x11: decode ROUND_MODE { 118412120Sar4jc@virginia.edu 0x0: fsgnj_d({{ 118512120Sar4jc@virginia.edu if (issignalingnan(Fs1)) { 118612120Sar4jc@virginia.edu Fd = numeric_limits<double>::signaling_NaN(); 118712120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 118812120Sar4jc@virginia.edu } else { 118912120Sar4jc@virginia.edu Fd = copysign(Fs1, Fs2); 119012120Sar4jc@virginia.edu } 119112445Sar4jc@virginia.edu }}, FloatMiscOp); 119212120Sar4jc@virginia.edu 0x1: fsgnjn_d({{ 119312120Sar4jc@virginia.edu if (issignalingnan(Fs1)) { 119412120Sar4jc@virginia.edu Fd = numeric_limits<double>::signaling_NaN(); 119512120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 119612120Sar4jc@virginia.edu } else { 119712120Sar4jc@virginia.edu Fd = copysign(Fs1, -Fs2); 119812120Sar4jc@virginia.edu } 119912445Sar4jc@virginia.edu }}, FloatMiscOp); 120012120Sar4jc@virginia.edu 0x2: fsgnjx_d({{ 120112120Sar4jc@virginia.edu if (issignalingnan(Fs1)) { 120212120Sar4jc@virginia.edu Fd = numeric_limits<double>::signaling_NaN(); 120312120Sar4jc@virginia.edu feclearexcept(FE_INVALID); 120412120Sar4jc@virginia.edu } else { 120512120Sar4jc@virginia.edu Fd = Fs1*(signbit(Fs2) ? -1.0 : 1.0); 120612120Sar4jc@virginia.edu } 120712445Sar4jc@virginia.edu }}, FloatMiscOp); 120812120Sar4jc@virginia.edu } 120912120Sar4jc@virginia.edu 0x14: decode ROUND_MODE { 121012120Sar4jc@virginia.edu 0x0: fmin_s({{ 121112120Sar4jc@virginia.edu uint32_t temp; 121212120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 121312120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 121412120Sar4jc@virginia.edu float fd; 121512120Sar4jc@virginia.edu 121612120Sar4jc@virginia.edu if (issignalingnan(fs2)) { 121712120Sar4jc@virginia.edu fd = fs1; 121812120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 121912120Sar4jc@virginia.edu } else if (issignalingnan(fs1)) { 122012120Sar4jc@virginia.edu fd = fs2; 122112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 122212120Sar4jc@virginia.edu } else { 122312120Sar4jc@virginia.edu fd = fmin(fs1, fs2); 122412120Sar4jc@virginia.edu } 122512120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 122612120Sar4jc@virginia.edu }}, FloatCmpOp); 122712120Sar4jc@virginia.edu 0x1: fmax_s({{ 122812120Sar4jc@virginia.edu uint32_t temp; 122912120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 123012120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 123112120Sar4jc@virginia.edu float fd; 123212120Sar4jc@virginia.edu 123312120Sar4jc@virginia.edu if (issignalingnan(fs2)) { 123412120Sar4jc@virginia.edu fd = fs1; 123512120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 123612120Sar4jc@virginia.edu } else if (issignalingnan(fs1)) { 123712120Sar4jc@virginia.edu fd = fs2; 123812120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 123912120Sar4jc@virginia.edu } else { 124012120Sar4jc@virginia.edu fd = fmax(fs1, fs2); 124112120Sar4jc@virginia.edu } 124212120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 124312120Sar4jc@virginia.edu }}, FloatCmpOp); 124412120Sar4jc@virginia.edu } 124512120Sar4jc@virginia.edu 0x15: decode ROUND_MODE { 124612120Sar4jc@virginia.edu 0x0: fmin_d({{ 124712120Sar4jc@virginia.edu if (issignalingnan(Fs2)) { 124812120Sar4jc@virginia.edu Fd = Fs1; 124912120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 125012120Sar4jc@virginia.edu } else if (issignalingnan(Fs1)) { 125112120Sar4jc@virginia.edu Fd = Fs2; 125212120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 125312120Sar4jc@virginia.edu } else { 125412120Sar4jc@virginia.edu Fd = fmin(Fs1, Fs2); 125512120Sar4jc@virginia.edu } 125612120Sar4jc@virginia.edu }}, FloatCmpOp); 125712120Sar4jc@virginia.edu 0x1: fmax_d({{ 125812120Sar4jc@virginia.edu if (issignalingnan(Fs2)) { 125912120Sar4jc@virginia.edu Fd = Fs1; 126012120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 126112120Sar4jc@virginia.edu } else if (issignalingnan(Fs1)) { 126212120Sar4jc@virginia.edu Fd = Fs2; 126312120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 126412120Sar4jc@virginia.edu } else { 126512120Sar4jc@virginia.edu Fd = fmax(Fs1, Fs2); 126612120Sar4jc@virginia.edu } 126712120Sar4jc@virginia.edu }}, FloatCmpOp); 126812120Sar4jc@virginia.edu } 126912120Sar4jc@virginia.edu 0x20: fcvt_s_d({{ 127012596Sqtt2@cornell.edu if (CONV_SGN != 1) { 127112849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("CONV_SGN != 1", 127212849Sar4jc@virginia.edu machInst); 127312596Sqtt2@cornell.edu } 127412120Sar4jc@virginia.edu float fd; 127512120Sar4jc@virginia.edu if (issignalingnan(Fs1)) { 127612120Sar4jc@virginia.edu fd = numeric_limits<float>::quiet_NaN(); 127711725Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 127811725Sar4jc@virginia.edu } else { 127912120Sar4jc@virginia.edu fd = (float)Fs1; 128011725Sar4jc@virginia.edu } 128111725Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 128212120Sar4jc@virginia.edu }}, FloatCvtOp); 128312120Sar4jc@virginia.edu 0x21: fcvt_d_s({{ 128412596Sqtt2@cornell.edu if (CONV_SGN != 0) { 128512849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("CONV_SGN != 0", 128612849Sar4jc@virginia.edu machInst); 128712596Sqtt2@cornell.edu } 128811725Sar4jc@virginia.edu uint32_t temp; 128911725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 129011725Sar4jc@virginia.edu 129112120Sar4jc@virginia.edu if (issignalingnan(fs1)) { 129212120Sar4jc@virginia.edu Fd = numeric_limits<double>::quiet_NaN(); 129311725Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 129411725Sar4jc@virginia.edu } else { 129512120Sar4jc@virginia.edu Fd = (double)fs1; 129611725Sar4jc@virginia.edu } 129711725Sar4jc@virginia.edu }}, FloatCvtOp); 129812120Sar4jc@virginia.edu 0x2c: fsqrt_s({{ 129912596Sqtt2@cornell.edu if (RS2 != 0) { 130012849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x1", 130112849Sar4jc@virginia.edu machInst); 130212596Sqtt2@cornell.edu } 130311725Sar4jc@virginia.edu uint32_t temp; 130411725Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 130512120Sar4jc@virginia.edu float fd; 130611725Sar4jc@virginia.edu 130712120Sar4jc@virginia.edu if (issignalingnan(Fs1_sf)) { 130811725Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 130912120Sar4jc@virginia.edu } 131012120Sar4jc@virginia.edu fd = sqrt(fs1); 131112120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(fd); 131212120Sar4jc@virginia.edu }}, FloatSqrtOp); 131312120Sar4jc@virginia.edu 0x2d: fsqrt_d({{ 131412596Sqtt2@cornell.edu if (RS2 != 0) { 131512849Sar4jc@virginia.edu fault = make_shared<IllegalInstFault>("source reg x1", 131612849Sar4jc@virginia.edu machInst); 131712596Sqtt2@cornell.edu } 131812120Sar4jc@virginia.edu Fd = sqrt(Fs1); 131912120Sar4jc@virginia.edu }}, FloatSqrtOp); 132012120Sar4jc@virginia.edu 0x50: decode ROUND_MODE { 132112120Sar4jc@virginia.edu 0x0: fle_s({{ 132212120Sar4jc@virginia.edu uint32_t temp; 132312120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 132412120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 132512120Sar4jc@virginia.edu 132612138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 132712120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 132812120Sar4jc@virginia.edu Rd = 0; 132912120Sar4jc@virginia.edu } else { 133012120Sar4jc@virginia.edu Rd = fs1 <= fs2 ? 1 : 0; 133111725Sar4jc@virginia.edu } 133212120Sar4jc@virginia.edu }}, FloatCmpOp); 133312120Sar4jc@virginia.edu 0x1: flt_s({{ 133412120Sar4jc@virginia.edu uint32_t temp; 133512120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 133612120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 133712120Sar4jc@virginia.edu 133812138Sgabeblack@google.com if (std::isnan(fs1) || std::isnan(fs2)) { 133912120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 134012120Sar4jc@virginia.edu Rd = 0; 134112120Sar4jc@virginia.edu } else { 134212120Sar4jc@virginia.edu Rd = fs1 < fs2 ? 1 : 0; 134312120Sar4jc@virginia.edu } 134412120Sar4jc@virginia.edu }}, FloatCmpOp); 134512120Sar4jc@virginia.edu 0x2: feq_s({{ 134612120Sar4jc@virginia.edu uint32_t temp; 134712120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 134812120Sar4jc@virginia.edu float fs2 = reinterpret_cast<float&>(temp = Fs2_bits); 134912120Sar4jc@virginia.edu 135012120Sar4jc@virginia.edu if (issignalingnan(fs1) || issignalingnan(fs2)) { 135112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 135212120Sar4jc@virginia.edu } 135312120Sar4jc@virginia.edu Rd = fs1 == fs2 ? 1 : 0; 135412120Sar4jc@virginia.edu }}, FloatCmpOp); 135512120Sar4jc@virginia.edu } 135612120Sar4jc@virginia.edu 0x51: decode ROUND_MODE { 135712120Sar4jc@virginia.edu 0x0: fle_d({{ 135812138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 135912120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 136012120Sar4jc@virginia.edu Rd = 0; 136112120Sar4jc@virginia.edu } else { 136212120Sar4jc@virginia.edu Rd = Fs1 <= Fs2 ? 1 : 0; 136312120Sar4jc@virginia.edu } 136412120Sar4jc@virginia.edu }}, FloatCmpOp); 136512120Sar4jc@virginia.edu 0x1: flt_d({{ 136612138Sgabeblack@google.com if (std::isnan(Fs1) || std::isnan(Fs2)) { 136712120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 136812120Sar4jc@virginia.edu Rd = 0; 136912120Sar4jc@virginia.edu } else { 137012120Sar4jc@virginia.edu Rd = Fs1 < Fs2 ? 1 : 0; 137112120Sar4jc@virginia.edu } 137212120Sar4jc@virginia.edu }}, FloatCmpOp); 137312120Sar4jc@virginia.edu 0x2: feq_d({{ 137412120Sar4jc@virginia.edu if (issignalingnan(Fs1) || issignalingnan(Fs2)) { 137512120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 137612120Sar4jc@virginia.edu } 137712120Sar4jc@virginia.edu Rd = Fs1 == Fs2 ? 1 : 0; 137812120Sar4jc@virginia.edu }}, FloatCmpOp); 137912120Sar4jc@virginia.edu } 138012120Sar4jc@virginia.edu 0x60: decode CONV_SGN { 138112120Sar4jc@virginia.edu 0x0: fcvt_w_s({{ 138212120Sar4jc@virginia.edu uint32_t temp; 138312120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 138412120Sar4jc@virginia.edu 138512138Sgabeblack@google.com if (std::isnan(fs1)) { 138612120Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::max(); 138712120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 138812444Sar4jc@virginia.edu } else if (fs1 >= numeric_limits<int32_t>::max()) { 138912444Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::max(); 139012444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 139112444Sar4jc@virginia.edu } else if (fs1 <= numeric_limits<int32_t>::min()) { 139212444Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::min(); 139312444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 139412120Sar4jc@virginia.edu } else { 139512120Sar4jc@virginia.edu Rd_sd = (int32_t)fs1; 139612120Sar4jc@virginia.edu } 139712120Sar4jc@virginia.edu }}, FloatCvtOp); 139812120Sar4jc@virginia.edu 0x1: fcvt_wu_s({{ 139912120Sar4jc@virginia.edu uint32_t temp; 140012120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 140112120Sar4jc@virginia.edu 140212444Sar4jc@virginia.edu if (std::isnan(fs1)) { 140312444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 140412444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 140512444Sar4jc@virginia.edu } else if (fs1 < 0.0) { 140612120Sar4jc@virginia.edu Rd = 0; 140712120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 140812444Sar4jc@virginia.edu } else if (fs1 > numeric_limits<uint32_t>::max()) { 140912444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 141012444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 141112120Sar4jc@virginia.edu } else { 141212120Sar4jc@virginia.edu Rd = (uint32_t)fs1; 141312120Sar4jc@virginia.edu } 141412120Sar4jc@virginia.edu }}, FloatCvtOp); 141512120Sar4jc@virginia.edu 0x2: fcvt_l_s({{ 141612120Sar4jc@virginia.edu uint32_t temp; 141712120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 141812120Sar4jc@virginia.edu 141912138Sgabeblack@google.com if (std::isnan(fs1)) { 142012120Sar4jc@virginia.edu Rd_sd = numeric_limits<int64_t>::max(); 142112120Sar4jc@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; 142812120Sar4jc@virginia.edu } else { 142912120Sar4jc@virginia.edu Rd_sd = (int64_t)fs1; 143012120Sar4jc@virginia.edu } 143112120Sar4jc@virginia.edu }}, FloatCvtOp); 143212120Sar4jc@virginia.edu 0x3: fcvt_lu_s({{ 143312120Sar4jc@virginia.edu uint32_t temp; 143412120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 143512120Sar4jc@virginia.edu 143612444Sar4jc@virginia.edu if (std::isnan(fs1)) { 143712444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 143812444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 143912444Sar4jc@virginia.edu } else if (fs1 < 0.0) { 144012120Sar4jc@virginia.edu Rd = 0; 144112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 144212444Sar4jc@virginia.edu } else if (fs1 > numeric_limits<uint64_t>::max()) { 144312444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 144412444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 144512120Sar4jc@virginia.edu } else { 144612120Sar4jc@virginia.edu Rd = (uint64_t)fs1; 144712120Sar4jc@virginia.edu } 144812120Sar4jc@virginia.edu }}, FloatCvtOp); 144912120Sar4jc@virginia.edu } 145012120Sar4jc@virginia.edu 0x61: decode CONV_SGN { 145112120Sar4jc@virginia.edu 0x0: fcvt_w_d({{ 145212444Sar4jc@virginia.edu if (std::isnan(Fs1)) { 145312444Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::max(); 145412444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 145512444Sar4jc@virginia.edu } else if (Fs1 > numeric_limits<int32_t>::max()) { 145612444Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::max(); 145712444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 145812444Sar4jc@virginia.edu } else if (Fs1 < numeric_limits<int32_t>::min()) { 145912444Sar4jc@virginia.edu Rd_sd = numeric_limits<int32_t>::min(); 146012444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 146112444Sar4jc@virginia.edu } else { 146212444Sar4jc@virginia.edu Rd_sd = (int32_t)Fs1; 146312120Sar4jc@virginia.edu } 146412120Sar4jc@virginia.edu }}, FloatCvtOp); 146512120Sar4jc@virginia.edu 0x1: fcvt_wu_d({{ 146612444Sar4jc@virginia.edu if (std::isnan(Fs1)) { 146712444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 146812444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 146912444Sar4jc@virginia.edu } else if (Fs1 < 0) { 147012120Sar4jc@virginia.edu Rd = 0; 147112120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 147212444Sar4jc@virginia.edu } else if (Fs1 > numeric_limits<uint32_t>::max()) { 147312444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 147412444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 147512120Sar4jc@virginia.edu } else { 147612120Sar4jc@virginia.edu Rd = (uint32_t)Fs1; 147712120Sar4jc@virginia.edu } 147812120Sar4jc@virginia.edu }}, FloatCvtOp); 147912120Sar4jc@virginia.edu 0x2: fcvt_l_d({{ 148012444Sar4jc@virginia.edu if (std::isnan(Fs1)) { 148112444Sar4jc@virginia.edu Rd_sd = numeric_limits<int64_t>::max(); 148212444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 148312444Sar4jc@virginia.edu } else if (Fs1 > numeric_limits<int64_t>::max()) { 148412444Sar4jc@virginia.edu Rd_sd = numeric_limits<int64_t>::max(); 148512444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 148612444Sar4jc@virginia.edu } else if (Fs1 < numeric_limits<int64_t>::min()) { 148712444Sar4jc@virginia.edu Rd_sd = numeric_limits<int64_t>::min(); 148812444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 148912444Sar4jc@virginia.edu } else { 149012444Sar4jc@virginia.edu Rd_sd = Fs1; 149112120Sar4jc@virginia.edu } 149212120Sar4jc@virginia.edu }}, FloatCvtOp); 149312120Sar4jc@virginia.edu 0x3: fcvt_lu_d({{ 149412444Sar4jc@virginia.edu if (std::isnan(Fs1)) { 149512444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 149612444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 149712444Sar4jc@virginia.edu } else if (Fs1 < 0) { 149812120Sar4jc@virginia.edu Rd = 0; 149912120Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 150012444Sar4jc@virginia.edu } else if (Fs1 > numeric_limits<uint64_t>::max()) { 150112444Sar4jc@virginia.edu Rd = numeric_limits<uint64_t>::max(); 150212444Sar4jc@virginia.edu FFLAGS |= FloatInvalid; 150312120Sar4jc@virginia.edu } else { 150412444Sar4jc@virginia.edu Rd = Fs1; 150512120Sar4jc@virginia.edu } 150612120Sar4jc@virginia.edu }}, FloatCvtOp); 150712120Sar4jc@virginia.edu } 150812120Sar4jc@virginia.edu 0x68: decode CONV_SGN { 150912120Sar4jc@virginia.edu 0x0: fcvt_s_w({{ 151012120Sar4jc@virginia.edu float temp = (float)Rs1_sw; 151112120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp); 151212120Sar4jc@virginia.edu }}, FloatCvtOp); 151312120Sar4jc@virginia.edu 0x1: fcvt_s_wu({{ 151412120Sar4jc@virginia.edu float temp = (float)Rs1_uw; 151512120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp); 151612120Sar4jc@virginia.edu }}, FloatCvtOp); 151712120Sar4jc@virginia.edu 0x2: fcvt_s_l({{ 151812120Sar4jc@virginia.edu float temp = (float)Rs1_sd; 151912120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp); 152012120Sar4jc@virginia.edu }}, FloatCvtOp); 152112120Sar4jc@virginia.edu 0x3: fcvt_s_lu({{ 152212120Sar4jc@virginia.edu float temp = (float)Rs1; 152312120Sar4jc@virginia.edu Fd_bits = (uint64_t)reinterpret_cast<uint32_t&>(temp); 152412120Sar4jc@virginia.edu }}, FloatCvtOp); 152512120Sar4jc@virginia.edu } 152612120Sar4jc@virginia.edu 0x69: decode CONV_SGN { 152712120Sar4jc@virginia.edu 0x0: fcvt_d_w({{ 152812120Sar4jc@virginia.edu Fd = (double)Rs1_sw; 152912120Sar4jc@virginia.edu }}, FloatCvtOp); 153012120Sar4jc@virginia.edu 0x1: fcvt_d_wu({{ 153112120Sar4jc@virginia.edu Fd = (double)Rs1_uw; 153212120Sar4jc@virginia.edu }}, FloatCvtOp); 153312120Sar4jc@virginia.edu 0x2: fcvt_d_l({{ 153412120Sar4jc@virginia.edu Fd = (double)Rs1_sd; 153512120Sar4jc@virginia.edu }}, FloatCvtOp); 153612120Sar4jc@virginia.edu 0x3: fcvt_d_lu({{ 153712120Sar4jc@virginia.edu Fd = (double)Rs1; 153812120Sar4jc@virginia.edu }}, FloatCvtOp); 153912120Sar4jc@virginia.edu } 154012120Sar4jc@virginia.edu 0x70: decode ROUND_MODE { 154112120Sar4jc@virginia.edu 0x0: fmv_x_s({{ 154212120Sar4jc@virginia.edu Rd = (uint32_t)Fs1_bits; 154312120Sar4jc@virginia.edu if ((Rd&0x80000000) != 0) { 154412120Sar4jc@virginia.edu Rd |= (0xFFFFFFFFULL << 32); 154512120Sar4jc@virginia.edu } 154612120Sar4jc@virginia.edu }}, FloatCvtOp); 154712120Sar4jc@virginia.edu 0x1: fclass_s({{ 154812120Sar4jc@virginia.edu uint32_t temp; 154912120Sar4jc@virginia.edu float fs1 = reinterpret_cast<float&>(temp = Fs1_bits); 155012120Sar4jc@virginia.edu switch (fpclassify(fs1)) { 155112445Sar4jc@virginia.edu case FP_INFINITE: 155212120Sar4jc@virginia.edu if (signbit(fs1)) { 155312120Sar4jc@virginia.edu Rd = 1 << 0; 155412120Sar4jc@virginia.edu } else { 155512120Sar4jc@virginia.edu Rd = 1 << 7; 155612120Sar4jc@virginia.edu } 155712120Sar4jc@virginia.edu break; 155812445Sar4jc@virginia.edu case FP_NAN: 155912120Sar4jc@virginia.edu if (issignalingnan(fs1)) { 156012120Sar4jc@virginia.edu Rd = 1 << 8; 156112120Sar4jc@virginia.edu } else { 156212120Sar4jc@virginia.edu Rd = 1 << 9; 156312120Sar4jc@virginia.edu } 156412120Sar4jc@virginia.edu break; 156512445Sar4jc@virginia.edu case FP_ZERO: 156612120Sar4jc@virginia.edu if (signbit(fs1)) { 156712120Sar4jc@virginia.edu Rd = 1 << 3; 156812120Sar4jc@virginia.edu } else { 156912120Sar4jc@virginia.edu Rd = 1 << 4; 157012120Sar4jc@virginia.edu } 157112120Sar4jc@virginia.edu break; 157212445Sar4jc@virginia.edu case FP_SUBNORMAL: 157312120Sar4jc@virginia.edu if (signbit(fs1)) { 157412120Sar4jc@virginia.edu Rd = 1 << 2; 157512120Sar4jc@virginia.edu } else { 157612120Sar4jc@virginia.edu Rd = 1 << 5; 157712120Sar4jc@virginia.edu } 157812120Sar4jc@virginia.edu break; 157912445Sar4jc@virginia.edu case FP_NORMAL: 158012120Sar4jc@virginia.edu if (signbit(fs1)) { 158112120Sar4jc@virginia.edu Rd = 1 << 1; 158212120Sar4jc@virginia.edu } else { 158312120Sar4jc@virginia.edu Rd = 1 << 6; 158412120Sar4jc@virginia.edu } 158512120Sar4jc@virginia.edu break; 158612445Sar4jc@virginia.edu default: 158712120Sar4jc@virginia.edu panic("Unknown classification for operand."); 158812120Sar4jc@virginia.edu break; 158912120Sar4jc@virginia.edu } 159012445Sar4jc@virginia.edu }}, FloatMiscOp); 159112120Sar4jc@virginia.edu } 159212120Sar4jc@virginia.edu 0x71: decode ROUND_MODE { 159312120Sar4jc@virginia.edu 0x0: fmv_x_d({{ 159412120Sar4jc@virginia.edu Rd = Fs1_bits; 159512120Sar4jc@virginia.edu }}, FloatCvtOp); 159612120Sar4jc@virginia.edu 0x1: fclass_d({{ 159712120Sar4jc@virginia.edu switch (fpclassify(Fs1)) { 159812445Sar4jc@virginia.edu case FP_INFINITE: 159912120Sar4jc@virginia.edu if (signbit(Fs1)) { 160012120Sar4jc@virginia.edu Rd = 1 << 0; 160112120Sar4jc@virginia.edu } else { 160212120Sar4jc@virginia.edu Rd = 1 << 7; 160312120Sar4jc@virginia.edu } 160412120Sar4jc@virginia.edu break; 160512445Sar4jc@virginia.edu case FP_NAN: 160612120Sar4jc@virginia.edu if (issignalingnan(Fs1)) { 160712120Sar4jc@virginia.edu Rd = 1 << 8; 160812120Sar4jc@virginia.edu } else { 160912120Sar4jc@virginia.edu Rd = 1 << 9; 161012120Sar4jc@virginia.edu } 161112120Sar4jc@virginia.edu break; 161212445Sar4jc@virginia.edu case FP_ZERO: 161312120Sar4jc@virginia.edu if (signbit(Fs1)) { 161412120Sar4jc@virginia.edu Rd = 1 << 3; 161512120Sar4jc@virginia.edu } else { 161612120Sar4jc@virginia.edu Rd = 1 << 4; 161712120Sar4jc@virginia.edu } 161812120Sar4jc@virginia.edu break; 161912445Sar4jc@virginia.edu case FP_SUBNORMAL: 162012120Sar4jc@virginia.edu if (signbit(Fs1)) { 162112120Sar4jc@virginia.edu Rd = 1 << 2; 162212120Sar4jc@virginia.edu } else { 162312120Sar4jc@virginia.edu Rd = 1 << 5; 162412120Sar4jc@virginia.edu } 162512120Sar4jc@virginia.edu break; 162612445Sar4jc@virginia.edu case FP_NORMAL: 162712120Sar4jc@virginia.edu if (signbit(Fs1)) { 162812120Sar4jc@virginia.edu Rd = 1 << 1; 162912120Sar4jc@virginia.edu } else { 163012120Sar4jc@virginia.edu Rd = 1 << 6; 163112120Sar4jc@virginia.edu } 163212120Sar4jc@virginia.edu break; 163312445Sar4jc@virginia.edu default: 163412120Sar4jc@virginia.edu panic("Unknown classification for operand."); 163512120Sar4jc@virginia.edu break; 163612120Sar4jc@virginia.edu } 163712445Sar4jc@virginia.edu }}, FloatMiscOp); 163812120Sar4jc@virginia.edu } 163912120Sar4jc@virginia.edu 0x78: fmv_s_x({{ 164012120Sar4jc@virginia.edu Fd_bits = (uint64_t)Rs1_uw; 164111725Sar4jc@virginia.edu }}, FloatCvtOp); 164212120Sar4jc@virginia.edu 0x79: fmv_d_x({{ 164312120Sar4jc@virginia.edu Fd_bits = Rs1; 164411725Sar4jc@virginia.edu }}, FloatCvtOp); 164511725Sar4jc@virginia.edu } 164612120Sar4jc@virginia.edu } 164712120Sar4jc@virginia.edu 164812120Sar4jc@virginia.edu 0x18: decode FUNCT3 { 164912120Sar4jc@virginia.edu format BOp { 165012120Sar4jc@virginia.edu 0x0: beq({{ 165112120Sar4jc@virginia.edu if (Rs1 == Rs2) { 165212120Sar4jc@virginia.edu NPC = PC + imm; 165312120Sar4jc@virginia.edu } else { 165412120Sar4jc@virginia.edu NPC = NPC; 165511725Sar4jc@virginia.edu } 165612120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 165712120Sar4jc@virginia.edu 0x1: bne({{ 165812120Sar4jc@virginia.edu if (Rs1 != Rs2) { 165912120Sar4jc@virginia.edu NPC = PC + imm; 166011725Sar4jc@virginia.edu } else { 166112120Sar4jc@virginia.edu NPC = NPC; 166211725Sar4jc@virginia.edu } 166312120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 166412120Sar4jc@virginia.edu 0x4: blt({{ 166512120Sar4jc@virginia.edu if (Rs1_sd < Rs2_sd) { 166612120Sar4jc@virginia.edu NPC = PC + imm; 166712120Sar4jc@virginia.edu } else { 166812120Sar4jc@virginia.edu NPC = NPC; 166911725Sar4jc@virginia.edu } 167012120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 167112120Sar4jc@virginia.edu 0x5: bge({{ 167212120Sar4jc@virginia.edu if (Rs1_sd >= Rs2_sd) { 167312120Sar4jc@virginia.edu NPC = PC + imm; 167411725Sar4jc@virginia.edu } else { 167512120Sar4jc@virginia.edu NPC = NPC; 167611725Sar4jc@virginia.edu } 167712120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 167812120Sar4jc@virginia.edu 0x6: bltu({{ 167912120Sar4jc@virginia.edu if (Rs1 < Rs2) { 168012120Sar4jc@virginia.edu NPC = PC + imm; 168112120Sar4jc@virginia.edu } else { 168212120Sar4jc@virginia.edu NPC = NPC; 168312120Sar4jc@virginia.edu } 168412120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 168512120Sar4jc@virginia.edu 0x7: bgeu({{ 168612120Sar4jc@virginia.edu if (Rs1 >= Rs2) { 168712120Sar4jc@virginia.edu NPC = PC + imm; 168812120Sar4jc@virginia.edu } else { 168912120Sar4jc@virginia.edu NPC = NPC; 169012120Sar4jc@virginia.edu } 169112120Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 169211725Sar4jc@virginia.edu } 169312120Sar4jc@virginia.edu } 169412120Sar4jc@virginia.edu 169512120Sar4jc@virginia.edu 0x19: decode FUNCT3 { 169612120Sar4jc@virginia.edu 0x0: Jump::jalr({{ 169712120Sar4jc@virginia.edu Rd = NPC; 169812120Sar4jc@virginia.edu NPC = (imm + Rs1) & (~0x1); 169912120Sar4jc@virginia.edu }}, IsIndirectControl, IsUncondControl, IsCall); 170012120Sar4jc@virginia.edu } 170112120Sar4jc@virginia.edu 170212120Sar4jc@virginia.edu 0x1b: JOp::jal({{ 170312120Sar4jc@virginia.edu Rd = NPC; 170412120Sar4jc@virginia.edu NPC = PC + imm; 170512120Sar4jc@virginia.edu }}, IsDirectControl, IsUncondControl, IsCall); 170612120Sar4jc@virginia.edu 170712120Sar4jc@virginia.edu 0x1c: decode FUNCT3 { 170812120Sar4jc@virginia.edu format SystemOp { 170912120Sar4jc@virginia.edu 0x0: decode FUNCT12 { 171012120Sar4jc@virginia.edu 0x0: ecall({{ 171112850Salec.roelke@gmail.com fault = make_shared<SyscallFault>( 171212850Salec.roelke@gmail.com (PrivilegeMode)xc->readMiscReg(MISCREG_PRV)); 171312120Sar4jc@virginia.edu }}, IsSerializeAfter, IsNonSpeculative, IsSyscall, 171412120Sar4jc@virginia.edu No_OpClass); 171512120Sar4jc@virginia.edu 0x1: ebreak({{ 171612849Sar4jc@virginia.edu fault = make_shared<BreakpointFault>(xc->pcState()); 171712120Sar4jc@virginia.edu }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); 171812850Salec.roelke@gmail.com 0x2: uret({{ 171912850Salec.roelke@gmail.com STATUS status = xc->readMiscReg(MISCREG_STATUS); 172012850Salec.roelke@gmail.com status.uie = status.upie; 172112850Salec.roelke@gmail.com status.upie = 1; 172212850Salec.roelke@gmail.com xc->setMiscReg(MISCREG_STATUS, status); 172312850Salec.roelke@gmail.com NPC = xc->readMiscReg(MISCREG_UEPC); 172412850Salec.roelke@gmail.com }}, IsReturn); 172512850Salec.roelke@gmail.com 0x102: sret({{ 172612850Salec.roelke@gmail.com if (xc->readMiscReg(MISCREG_PRV) == PRV_U) { 172712850Salec.roelke@gmail.com fault = make_shared<IllegalInstFault>( 172812850Salec.roelke@gmail.com "sret in user mode", machInst); 172912850Salec.roelke@gmail.com NPC = NPC; 173012850Salec.roelke@gmail.com } else { 173112850Salec.roelke@gmail.com STATUS status = xc->readMiscReg(MISCREG_STATUS); 173212850Salec.roelke@gmail.com xc->setMiscReg(MISCREG_PRV, status.spp); 173312850Salec.roelke@gmail.com status.sie = status.spie; 173412850Salec.roelke@gmail.com status.spie = 1; 173512850Salec.roelke@gmail.com status.spp = PRV_U; 173612850Salec.roelke@gmail.com xc->setMiscReg(MISCREG_STATUS, status); 173712850Salec.roelke@gmail.com NPC = xc->readMiscReg(MISCREG_SEPC); 173812850Salec.roelke@gmail.com } 173912850Salec.roelke@gmail.com }}, IsReturn); 174012850Salec.roelke@gmail.com 0x302: mret({{ 174112850Salec.roelke@gmail.com if (xc->readMiscReg(MISCREG_PRV) != PRV_M) { 174212850Salec.roelke@gmail.com fault = make_shared<IllegalInstFault>( 174312850Salec.roelke@gmail.com "mret at lower privilege", machInst); 174412850Salec.roelke@gmail.com NPC = NPC; 174512850Salec.roelke@gmail.com } else { 174612850Salec.roelke@gmail.com STATUS status = xc->readMiscReg(MISCREG_STATUS); 174712850Salec.roelke@gmail.com xc->setMiscReg(MISCREG_PRV, status.mpp); 174812850Salec.roelke@gmail.com status.mie = status.mpie; 174912850Salec.roelke@gmail.com status.mpie = 1; 175012850Salec.roelke@gmail.com status.mpp = PRV_U; 175112850Salec.roelke@gmail.com xc->setMiscReg(MISCREG_STATUS, status); 175212850Salec.roelke@gmail.com NPC = xc->readMiscReg(MISCREG_MEPC); 175312850Salec.roelke@gmail.com } 175412850Salec.roelke@gmail.com }}, IsReturn); 175512120Sar4jc@virginia.edu } 175611725Sar4jc@virginia.edu } 175712120Sar4jc@virginia.edu format CSROp { 175812120Sar4jc@virginia.edu 0x1: csrrw({{ 175912695Sar4jc@virginia.edu Rd = data; 176012695Sar4jc@virginia.edu data = Rs1; 176112120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 176212120Sar4jc@virginia.edu 0x2: csrrs({{ 176312695Sar4jc@virginia.edu Rd = data; 176412695Sar4jc@virginia.edu data |= Rs1; 176512120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 176612120Sar4jc@virginia.edu 0x3: csrrc({{ 176712695Sar4jc@virginia.edu Rd = data; 176812695Sar4jc@virginia.edu data &= ~Rs1; 176912120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 177012120Sar4jc@virginia.edu 0x5: csrrwi({{ 177112695Sar4jc@virginia.edu Rd = data; 177212695Sar4jc@virginia.edu data = uimm; 177312120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 177412120Sar4jc@virginia.edu 0x6: csrrsi({{ 177512695Sar4jc@virginia.edu Rd = data; 177612695Sar4jc@virginia.edu data |= uimm; 177712120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 177812120Sar4jc@virginia.edu 0x7: csrrci({{ 177912695Sar4jc@virginia.edu Rd = data; 178012695Sar4jc@virginia.edu data &= ~uimm; 178112120Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 178211725Sar4jc@virginia.edu } 178311725Sar4jc@virginia.edu } 178411725Sar4jc@virginia.edu } 178512138Sgabeblack@google.com} 1786