summaryrefslogtreecommitdiff
path: root/rtl/core/decode/ldst
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rtl/core/decode/ldst/addr.sv14
-rw-r--r--rtl/core/decode/ldst/misc.sv13
-rw-r--r--rtl/core/decode/ldst/multiple.sv10
-rw-r--r--rtl/core/decode/ldst/single.sv4
4 files changed, 31 insertions, 10 deletions
diff --git a/rtl/core/decode/ldst/addr.sv b/rtl/core/decode/ldst/addr.sv
new file mode 100644
index 0000000..4a61231
--- /dev/null
+++ b/rtl/core/decode/ldst/addr.sv
@@ -0,0 +1,14 @@
+`include "core/uarch.sv"
+
+module core_decode_ldst_addr
+(
+ input ldst_decode ldst,
+
+ output data_decode alu
+);
+
+ assign alu.op = ldst.increment ? `ALU_ADD : `ALU_SUB;
+ assign alu.rn = ldst.rn;
+ assign alu.rd = ldst.rd;
+
+endmodule
diff --git a/rtl/core/decode/ldst/misc.sv b/rtl/core/decode/ldst/misc.sv
index de2428f..f2fe258 100644
--- a/rtl/core/decode/ldst/misc.sv
+++ b/rtl/core/decode/ldst/misc.sv
@@ -5,7 +5,10 @@ module core_decode_ldst_misc
(
input word insn,
- output ldst_decode decode
+ output ldst_decode decode,
+ output logic off_is_reg,
+ output logic[7:0] off_imm,
+ output reg_num off_reg
);
logic p, w;
@@ -17,10 +20,14 @@ module core_decode_ldst_misc
assign decode.increment = insn `FIELD_LDST_MISC_U;
assign decode.writeback = !p || w;
assign decode.sign_extend = insn `FIELD_LDST_MISC_S;
- assign decode.pre_indexed = p && w;
+ assign decode.pre_indexed = p;
assign decode.unprivileged = 0;
assign decode.user_regs = 0;
- assign decode.reg_list = 16'b0;
+ assign decode.regs = 16'b0;
+
+ assign off_imm = {insn `FIELD_LDST_MISC_IMM_HI, insn `FIELD_LDST_MISC_IMM_LO};
+ assign off_reg = insn `FIELD_LDST_MISC_RM;
+ assign off_is_reg = insn `FIELD_LDST_MISC_REG;
assign p = insn `FIELD_LDST_MISC_P;
assign w = insn `FIELD_LDST_MISC_W;
diff --git a/rtl/core/decode/ldst/multiple.sv b/rtl/core/decode/ldst/multiple.sv
index 24e8e5b..d286a67 100644
--- a/rtl/core/decode/ldst/multiple.sv
+++ b/rtl/core/decode/ldst/multiple.sv
@@ -10,7 +10,7 @@ module core_decode_ldst_multiple
);
logic s, l;
- logic[15:0] reg_list;
+ reg_list regs;
assign decode.rn = insn `FIELD_LDST_MULT_RN;
assign decode.size = LDST_WORD;
@@ -20,13 +20,13 @@ module core_decode_ldst_multiple
assign decode.sign_extend = 0;
assign decode.pre_indexed = insn `FIELD_LDST_MULT_P;
assign decode.unprivileged = 0;
- assign decode.user_regs = s && (!l || !reg_list[`R15]);
- assign decode.reg_list = reg_list;
+ assign decode.user_regs = s && !(l && regs[`R15]);
+ assign decode.regs = regs;
assign s = insn `FIELD_LDST_MULT_S;
assign l = insn `FIELD_LDST_LD;
- assign reg_list = insn `FIELD_LDST_MULT_LIST;
- assign restore_spsr = s && l && reg_list[`R15];
+ assign regs = insn `FIELD_LDST_MULT_LIST;
+ assign restore_spsr = s && l && regs[`R15];
endmodule
diff --git a/rtl/core/decode/ldst/single.sv b/rtl/core/decode/ldst/single.sv
index 5bcb638..0665178 100644
--- a/rtl/core/decode/ldst/single.sv
+++ b/rtl/core/decode/ldst/single.sv
@@ -18,10 +18,10 @@ module core_decode_ldst_single
assign decode.increment = insn `FIELD_LDST_SINGLE_U;
assign decode.writeback = !p || w;
assign decode.sign_extend = 0;
- assign decode.pre_indexed = p && w;
+ assign decode.pre_indexed = p;
assign decode.unprivileged = !p && w;
assign decode.user_regs = 0;
- assign decode.reg_list = 16'b0;
+ assign decode.regs = 16'b0;
assign p = insn `FIELD_LDST_SINGLE_P;
assign w = insn `FIELD_LDST_SINGLE_W;