diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-10-02 13:23:22 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-10-02 13:23:22 -0600 |
| commit | 63ec42cc245b2da9ab97cc4eef6bbd21e08cde07 (patch) | |
| tree | 1b9fd482a6e3cee3eb2245a9d331669cf5e44b8c /rtl/core/decode/data.sv | |
| parent | 97bc74277d0e9672a55552ed1cded66ecb7d317e (diff) | |
Split decoding of flexible second operand out of data instructions
Diffstat (limited to 'rtl/core/decode/data.sv')
| -rw-r--r-- | rtl/core/decode/data.sv | 69 |
1 files changed, 7 insertions, 62 deletions
diff --git a/rtl/core/decode/data.sv b/rtl/core/decode/data.sv index a649440..e2a44df 100644 --- a/rtl/core/decode/data.sv +++ b/rtl/core/decode/data.sv @@ -6,45 +6,25 @@ module core_decode_data input word insn, output data_decode decode, - output logic writeback, + output logic snd_is_imm, + snd_shift_by_reg_if_reg, + writeback, update_flags, - restore_spsr, - undefined + restore_spsr ); alu_op op; - reg_num rn, rd, r_snd, r_shift; - logic snd_shift_by_reg, snd_is_imm, shl, shr, ror, put_carry, sign_extend; - logic[7:0] imm; - logic[5:0] shift_imm; + reg_num rn, rd; assign decode.op = op; assign decode.rn = rn; assign decode.rd = rd; - assign decode.r_snd = r_snd; - assign decode.r_shift = r_shift; - assign decode.snd_shift_by_reg = snd_shift_by_reg; - assign decode.snd_is_imm = snd_is_imm; - assign decode.shl = shl; - assign decode.shr = shr; - assign decode.ror = ror; - assign decode.put_carry = put_carry; - assign decode.sign_extend = sign_extend; - assign decode.imm = imm; - assign decode.shift_imm = shift_imm; - assign rn = insn `FIELD_DATA_RN; assign rd = insn `FIELD_DATA_RD; assign op = insn `FIELD_DATA_OPCODE; - assign r_snd = insn `FIELD_DATA_RM; - assign r_shift = insn `FIELD_DATA_RS; - assign imm = insn `FIELD_DATA_IMM8; - assign snd_is_imm = insn `FIELD_DATA_IMM; - assign snd_shift_by_reg = ~snd_is_imm & insn `FIELD_DATA_REGSHIFT; - assign undefined = snd_shift_by_reg & insn `FIELD_DATA_ZEROIFREG; - logic[1:0] shift_op; - assign shift_op = insn `FIELD_DATA_SHIFT; + assign snd_is_imm = insn `FIELD_DATA_IMM; + assign snd_shift_by_reg_if_reg = insn `FIELD_DATA_REGSHIFT; always_comb begin unique case(op) @@ -60,41 +40,6 @@ module core_decode_data if(restore_spsr) update_flags = 0; - - ror = snd_is_imm; - shr = ~snd_is_imm; - put_carry = 0; - sign_extend = 1'bx; - - if(snd_is_imm) - shift_imm = {1'b0, insn `FIELD_DATA_ROR8, 1'b0}; - else begin - shift_imm = {1'b0, insn `FIELD_DATA_SHIFTIMM}; - - case(shift_op) - `SHIFT_LSL: shr = 0; - `SHIFT_LSR: sign_extend = 0; - `SHIFT_ASR: sign_extend = 1; - `SHIFT_ROR: ; - endcase - - if(~snd_shift_by_reg & (shift_imm == 0)) - case(shift_op) - `SHIFT_LSL: ; - - `SHIFT_LSR, `SHIFT_ASR: - shift_imm = 6'd32; - - `SHIFT_ROR: begin - // RRX - shift_imm = 6'd1; - put_carry = 1; - sign_extend = 0; - end - endcase - else if(shift_op == `SHIFT_ROR) - ror = 1; - end end endmodule |
