core: Implement the TAR register and the bctar instruction

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
pull/235/head
Paul Mackerras 4 years ago
parent 081684273e
commit 0fb8967290

@ -26,6 +26,7 @@ package common is
constant SPR_XER : spr_num_t := 1; constant SPR_XER : spr_num_t := 1;
constant SPR_LR : spr_num_t := 8; constant SPR_LR : spr_num_t := 8;
constant SPR_CTR : spr_num_t := 9; constant SPR_CTR : spr_num_t := 9;
constant SPR_TAR : spr_num_t := 815;
constant SPR_DSISR : spr_num_t := 18; constant SPR_DSISR : spr_num_t := 18;
constant SPR_DAR : spr_num_t := 19; constant SPR_DAR : spr_num_t := 19;
constant SPR_TB : spr_num_t := 268; constant SPR_TB : spr_num_t := 268;
@ -459,6 +460,8 @@ package body common is
n := 11; n := 11;
when SPR_XER => when SPR_XER =>
n := 12; n := 12;
when SPR_TAR =>
n := 13;
when others => when others =>
n := 0; n := 0;
return "000000"; return "000000";

@ -94,7 +94,7 @@ architecture behaviour of decode1 is
2#1100000010# => '1', 2#1100100010# => '1', 2#1101000010# => '1', 2#1101100010# => '1', 2#1110000010# => '1', 2#1110100010# => '1', 2#1111000010# => '1', 2#1111100010# => '1', 2#1100000010# => '1', 2#1100100010# => '1', 2#1101000010# => '1', 2#1101100010# => '1', 2#1110000010# => '1', 2#1110100010# => '1', 2#1111000010# => '1', 2#1111100010# => '1',
2#1000010000# => '1', -- bcctr 2#1000010000# => '1', -- bcctr
2#0000010000# => '1', -- bclr 2#0000010000# => '1', -- bclr
2#1000110000# => '0', -- bctar 2#1000110000# => '1', -- bctar
2#0100000001# => '1', -- crand 2#0100000001# => '1', -- crand
2#0010000001# => '1', -- crandc 2#0010000001# => '1', -- crandc
2#0100100001# => '1', -- creqv 2#0100100001# => '1', -- creqv
@ -467,11 +467,12 @@ begin
if f_in.insn(23) = '0' then if f_in.insn(23) = '0' then
v.ispr1 := fast_spr_num(SPR_CTR); v.ispr1 := fast_spr_num(SPR_CTR);
end if; end if;
-- TODO: Add TAR
if f_in.insn(10) = '0' then if f_in.insn(10) = '0' then
v.ispr2 := fast_spr_num(SPR_LR); v.ispr2 := fast_spr_num(SPR_LR);
else elsif f_in.insn(6) = '0' then
v.ispr2 := fast_spr_num(SPR_CTR); v.ispr2 := fast_spr_num(SPR_CTR);
else
v.ispr2 := fast_spr_num(SPR_TAR);
end if; end if;
else else
-- Could be OP_RFID -- Could be OP_RFID

Loading…
Cancel
Save