@ -269,16 +269,17 @@ begin
v.e.write_cr_data(hi downto lo) := newcrf;
v.e.write_cr_data(hi downto lo) := newcrf;
end loop;
end loop;
when OP_MFSPR =>
when OP_MFSPR =>
if std_match(e_in.insn(20 downto 11), "0100100000") then
case decode_spr_num(e_in.insn) is
when SPR_CTR =>
result := ctrl.ctr;
result := ctrl.ctr;
result_en := '1';
when SPR_LR =>
elsif std_match(e_in.insn(20 downto 11), "0100000000") then
result := ctrl.lr;
result := ctrl.lr;
result_en := '1';
when SPR_TB =>
elsif std_match(e_in.insn(20 downto 11), "0110001000") then
result := ctrl.tb;
result := ctrl.tb;
result_en := '1';
when others =>
end if;
result := (others => '0');
end case;
result_en := '1';
when OP_MFCR =>
when OP_MFCR =>
if e_in.insn(20) = '0' then
if e_in.insn(20) = '0' then
-- mfcr
-- mfcr
@ -308,11 +309,13 @@ begin
end if;
end if;
v.e.write_cr_data := e_in.read_data3(31 downto 0);
v.e.write_cr_data := e_in.read_data3(31 downto 0);
when OP_MTSPR =>
when OP_MTSPR =>
if std_match(e_in.insn(20 downto 11), "0100100000") then
case decode_spr_num(e_in.insn) is
when SPR_CTR =>
ctrl_tmp.ctr <= e_in.read_data3;
ctrl_tmp.ctr <= e_in.read_data3;
elsif std_match(e_in.insn(20 downto 11), "0100000000") then
when SPR_LR =>
ctrl_tmp.lr <= e_in.read_data3;
ctrl_tmp.lr <= e_in.read_data3;
end if;
when others =>
end case;
when OP_POPCNTB =>
when OP_POPCNTB =>
result := ppc_popcntb(e_in.read_data3);
result := ppc_popcntb(e_in.read_data3);
result_en := '1';
result_en := '1';