diff --git a/compressed_decoder.sv b/compressed_decoder.sv index 1909aea0..6e20316c 100644 --- a/compressed_decoder.sv +++ b/compressed_decoder.sv @@ -69,19 +69,26 @@ module compressed_decoder 3'b011: begin unique case ({instr_i[12:10], instr_i[6:5]}) - 5'b00000: begin - // c.xor -> xor rd', rd', rs2' - instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b100, 2'b01, instr_i[9:7], `OPCODE_OP}; - end + // c.xor -> xor rd', rd', rs2' + 5'b00000: instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b100, 2'b01, instr_i[9:7], `OPCODE_OP}; + // c.sltr + // c.sltur -> sltu rd', rs1', rd' + 5'b01111: instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b011, 2'b01, instr_i[4:2], `OPCODE_OP}; default: illegal_instr_o = 1'b1; endcase end 3'b101: begin unique case (instr_i[6:5]) + // c.add3 -> add rd', rs1', rs2' + 2'b00: instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b000, 2'b01, instr_i[12:10], `OPCODE_OP}; + + // c.sub3 + + // c.or3 -> or rd'1, rs1', rs2' + 2'b10: instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b110, 2'b01, instr_i[12:10], `OPCODE_OP}; // c.and3 -> and rd', rs1', rs2' 2'b11: instr_o = {7'b0, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b111, 2'b01, instr_i[12:10], `OPCODE_OP}; - default: illegal_instr_o = 1'b1; endcase end @@ -102,11 +109,19 @@ module compressed_decoder unique case (instr_i[15:13]) 3'b000: begin // c.slli -> slli rd, rd, shamt - instr_o = {6'b0, instr_i[12], instr_i[6:2], instr_i[11:7], 3'b001, instr_i[11:7], `OPCODE_OPIMM}; + instr_o = {7'b0, instr_i[6:2], instr_i[11:7], 3'b001, instr_i[11:7], `OPCODE_OPIMM}; if (instr_i[11:7] == 5'b0) illegal_instr_o = 1'b1; if (instr_i[12] == 1'b1 || instr_i[6:2] == 5'b0) illegal_instr_o = 1'b1; end + 3'b001: begin + // c.srli -> srli rd, rd, shamt + instr_o = {7'b0, instr_i[6:2], instr_i[11:7], 3'b101, instr_i[11:7], `OPCODE_OPIMM}; + if (instr_i[12] == 1'b1) illegal_instr_o = 1'b1; + if (instr_i[6:2] == 5'b0) illegal_instr_o = 1'b1; + if (instr_i[11:7] == 5'b0) illegal_instr_o = 1'b1; + end + 3'b010: begin // c.swsp -> sw rs2, imm(x2) instr_o = {4'b0, instr_i[8:7], instr_i[12], instr_i[6:2], 5'h02, 3'b010, instr_i[11:9], 2'b00, `OPCODE_STORE}; @@ -114,6 +129,10 @@ module compressed_decoder 3'b100: begin unique case (instr_i[6:5]) + // c.addin -> addi rd', rs1', imm + 2'b00: instr_o = {{8 {instr_i[12]}}, instr_i[12:10], 2'b01, instr_i[9:7], 3'b000, 2'b01, instr_i[4:2], `OPCODE_OPIMM}; + // c.xorin -> xori rd', rs1', imm + 2'b01: instr_o = {{8 {instr_i[12]}}, instr_i[12:10], 2'b01, instr_i[9:7], 3'b100, 2'b01, instr_i[4:2], `OPCODE_OPIMM}; // c.orin -> ori rd', rs1', imm 2'b10: instr_o = {{8 {instr_i[12]}}, instr_i[12:10], 2'b01, instr_i[9:7], 3'b110, 2'b01, instr_i[4:2], `OPCODE_OPIMM}; // c.andin -> andi rd', rs1', imm