type major_rom_array_t is array(0 to 63) of decode_rom_t;
type minor_valid_array_t is array(0 to 1023) of std_ulogic;
type op_19_subop_array_t is array(0 to 7) of decode_rom_t;
+ type op_30_subop_array_t is array(0 to 7) of decode_rom_t;
type minor_rom_array_2_t is array(0 to 3) of decode_rom_t;
type decode_rom_array_t is array(ppc_insn_t) of decode_rom_t;
others => illegal_inst
);
- constant decode_op_30_array : decode_rom_array_t := (
- -- unit internal in1 in2 in3 out const const const CR CR cry cry ldst BR sgn upd rsrv mul mul rc lk sgl
- -- op 1 2 3 in out in out len ext 32 sgn pipe
- PPC_ILLEGAL => (ALU, OP_ILLEGAL, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDCL => (ALU, OP_RLDCL, RS, RB, NONE, RA, NONE, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDCR => (ALU, OP_RLDCR, RS, RB, NONE, RA, NONE, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDIC => (ALU, OP_RLDIC, RS, NONE, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDICL => (ALU, OP_RLDICL, RS, NONE, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDICR => (ALU, OP_RLDICR, RS, NONE, NONE, RA, SH, ME, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- PPC_RLDIMI => (ALU, OP_RLDIMI, RA, RS, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
- others => decode_rom_init
+ constant decode_op_30_array : op_30_subop_array_t := (
+ -- unit internal in1 in2 in3 out const const const CR CR cry cry ldst BR sgn upd rsrv mul mul rc lk sgl
+ -- op 1 2 3 in out in out len ext 32 sgn pipe
+ 2#010# => (ALU, OP_RLDIC, RS, NONE, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
+ 2#000# => (ALU, OP_RLDICL, RS, NONE, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
+ 2#001# => (ALU, OP_RLDICR, RS, NONE, NONE, RA, SH, ME, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
+ 2#011# => (ALU, OP_RLDIMI, RA, RS, NONE, RA, SH, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
+ -- rldcl, rldcr
+ 2#100# => (ALU, OP_RLDCX, RS, RB, NONE, RA, NONE, MB, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
+ others => illegal_inst
);
-- Note: reformat with column -t -o ' '
variable ppc_insn: ppc_insn_t;
variable majorop : major_opcode_t;
variable op_19_bits: std_ulogic_vector(2 downto 0);
+ variable op_30_bits: std_ulogic_vector(2 downto 0);
begin
v := r;
end if;
elsif majorop = "011110" then
- if std_match(f_in.insn, "---------------------------1000-") then
- report "PPC_rldcl";
- ppc_insn := PPC_RLDCL;
- elsif std_match(f_in.insn, "---------------------------1001-") then
- report "PPC_rldcr";
- ppc_insn := PPC_RLDCR;
- elsif std_match(f_in.insn, "---------------------------010--") then
- report "PPC_rldic";
- ppc_insn := PPC_RLDIC;
- elsif std_match(f_in.insn, "---------------------------000--") then
- report "PPC_rldicl";
- ppc_insn := PPC_RLDICL;
- elsif std_match(f_in.insn, "---------------------------001--") then
- report "PPC_rldicr";
- ppc_insn := PPC_RLDICR;
- elsif std_match(f_in.insn, "---------------------------011--") then
- report "PPC_rldimi";
- ppc_insn := PPC_RLDIMI;
- else
- report "PPC_illegal";
- ppc_insn := PPC_ILLEGAL;
- end if;
- v.decode := decode_op_30_array(ppc_insn);
+ v.decode := decode_op_30_array(to_integer(unsigned(f_in.insn(4 downto 2))));
elsif majorop = "111010" then
v.decode := decode_op_58_array(to_integer(unsigned(f_in.insn(1 downto 0))));