7 changed files with 70 additions and 15 deletions
@ -1,4 +1,7 @@ |
|||
require_extension('C'); |
|||
require_rv64; |
|||
require(insn.rvc_rd() != 0); |
|||
WRITE_RD(sext32(RVC_RS1 + insn.rvc_imm())); |
|||
if (xlen == 32) { |
|||
WRITE_RD(RVC_RS1 & insn.rvc_imm()); // c.andi
|
|||
} else { |
|||
require(insn.rvc_rd() != 0); |
|||
WRITE_RD(sext32(RVC_RS1 + insn.rvc_imm())); |
|||
} |
|||
|
|||
@ -1,4 +1,8 @@ |
|||
require_extension('C'); |
|||
require_rv64; |
|||
require(insn.rvc_rd() != 0); |
|||
WRITE_RD(MMU.load_int64(RVC_SP + insn.rvc_ldsp_imm())); |
|||
if (xlen == 32) { |
|||
if (sreg_t(RVC_RS1S) >= 0) // c.bgez
|
|||
set_pc(pc + insn.rvc_b_imm()); |
|||
} else { |
|||
require(insn.rvc_rd() != 0); |
|||
WRITE_RD(MMU.load_int64(RVC_SP + insn.rvc_ldsp_imm())); |
|||
} |
|||
|
|||
@ -1,3 +1,38 @@ |
|||
require_extension('C'); |
|||
require_rv64; |
|||
MMU.store_uint64(RVC_RS1S + insn.rvc_ld_imm(), RVC_RS2S); |
|||
if (xlen == 32) { |
|||
int32_t res; |
|||
switch ((insn.bits() >> 10) & 7) { |
|||
case 0: |
|||
switch ((insn.bits() >> 5) & 3) { |
|||
case 0: res = RVC_RS1S ^ RVC_RS2S; // c.xor
|
|||
case 1: res = int32_t(RVC_RS1S) >> (RVC_RS2S & 0x1f); // c.sra
|
|||
default: require(0); |
|||
} |
|||
WRITE_RVC_RS1S(res); |
|||
break; |
|||
|
|||
case 1: |
|||
switch ((insn.bits() >> 5) & 3) { |
|||
case 0: res = RVC_RS1S << (RVC_RS2S & 0x1f); // c.sll
|
|||
case 1: res = uint32_t(RVC_RS1S) >> (RVC_RS2S & 0x1f); // c.srl
|
|||
case 2: res = int32_t(RVC_RS1S) < int32_t(RVC_RS2S); // c.slt
|
|||
case 3: res = uint32_t(RVC_RS1S) < uint32_t(RVC_RS2S); // c.sltu
|
|||
} |
|||
WRITE_RVC_RS1S(res); |
|||
break; |
|||
|
|||
case 3: |
|||
switch ((insn.bits() >> 5) & 3) { |
|||
case 0: res = RVC_RS1S << (RVC_RS2S & 0x1f); // c.sllr
|
|||
case 1: res = uint32_t(RVC_RS1S) >> (RVC_RS2S & 0x1f); // c.srlr
|
|||
case 2: res = int32_t(RVC_RS1S) < int32_t(RVC_RS2S); // c.sltr
|
|||
case 3: res = uint32_t(RVC_RS1S) < uint32_t(RVC_RS2S); // c.sltur
|
|||
} |
|||
WRITE_RVC_RS2S(res); |
|||
break; |
|||
|
|||
default: require(0); |
|||
} |
|||
} else { |
|||
MMU.store_uint64(RVC_RS1S + insn.rvc_ld_imm(), RVC_RS2S); |
|||
} |
|||
|
|||
@ -1,3 +1,7 @@ |
|||
require_extension('C'); |
|||
require_rv64; |
|||
MMU.store_uint64(RVC_SP + insn.rvc_sdsp_imm(), RVC_RS2); |
|||
if (xlen == 32) { |
|||
if (sreg_t(RVC_RS1S) < 0) // c.bltz
|
|||
set_pc(pc + insn.rvc_b_imm()); |
|||
} else { |
|||
MMU.store_uint64(RVC_SP + insn.rvc_sdsp_imm(), RVC_RS2); |
|||
} |
|||
|
|||
@ -1,5 +1,13 @@ |
|||
require_extension('C'); |
|||
require_rv64; |
|||
require(insn.rvc_rd() != 0); |
|||
require(insn.rvc_imm() < 32); |
|||
WRITE_RD(sext32(RVC_RS1 << insn.rvc_imm())); |
|||
if (xlen == 32) { |
|||
switch ((insn.bits() >> 5) & 3) { |
|||
case 0: WRITE_RVC_RS2S(sext_xlen(RVC_RS1S + insn.rvc_simm3())); // c.addin
|
|||
case 1: WRITE_RVC_RS2S(sext_xlen(RVC_RS1S ^ insn.rvc_simm3())); // c.xorin
|
|||
case 2: WRITE_RVC_RS2S(sext_xlen(RVC_RS1S | insn.rvc_simm3())); // c.orin
|
|||
case 3: WRITE_RVC_RS2S(sext_xlen(RVC_RS1S & insn.rvc_simm3())); // c.andin
|
|||
} |
|||
} else { |
|||
require(insn.rvc_rd() != 0); |
|||
require(insn.rvc_imm() < 32); |
|||
WRITE_RD(sext32(RVC_RS1 << insn.rvc_imm())); |
|||
} |
|||
|
|||
Loading…
Reference in new issue