@ -43,7 +43,7 @@ architecture behaviour of decode1 is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						28 =>       (ALU,    OP_AND,       NONE,       CONST_UI,    RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '0'), -- andi.
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						29 =>       (ALU,    OP_AND,       NONE,       CONST_UI_HI, RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '0'), -- andis.
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						18 =>       (ALU,    OP_B,         NONE,       CONST_LI,    NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- b
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						16 =>       (ALU,    OP_BC,        NONE,       CONST_BD,    NONE, NONE, '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- bc
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						16 =>       (ALU,    OP_BC,        SPR,        CONST_BD,    NONE, SPR , '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- bc
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						11 =>       (ALU,    OP_CMP,       RA,         CONST_SI,    NONE, NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- cmpi
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						10 =>       (ALU,    OP_CMPL,      RA,         CONST_UI,    NONE, NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- cmpli
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						34 =>       (LDST,   OP_LOAD,      RA_OR_ZERO, CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '0', is1B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- lbz
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -106,7 +106,7 @@ architecture behaviour of decode1 is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						-- addpcis not implemented yet
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#001#    =>       (ALU,    OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'),
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                -- bclr, bcctr, bctar
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#100#    =>       (ALU,    OP_BCREG,     NONE,       NONE,        NONE, NONE, '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#100#    =>       (ALU,    OP_BCREG,     SPR,        SPR,         NONE, SPR,  '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'),
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                -- isync
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#111#    =>       (ALU,    OP_ISYNC,     NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						others   => illegal_inst
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -237,13 +237,13 @@ architecture behaviour of decode1 is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						-- 2#1000000000# mcrxr
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						-- 2#1001000000# mcrxrx
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0000010011#  =>       (ALU,    OP_MFCR,      NONE,       NONE,        NONE, RT,   '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mfcr/mfocrf
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0101010011#  =>       (ALU,    OP_MFSPR,     NONE,       NONE,        NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- mfspr
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0101010011#  =>       (ALU,    OP_MFSPR,     SPR,        NONE,        NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mfspr
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0100001001#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modud
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0100001011#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- moduw
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#1100001001#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modsd
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#1100001011#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modsw
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0010010000#  =>       (ALU,    OP_MTCRF,     NONE,       NONE,        RS,   NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mtcrf/mtocrf
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0111010011#  =>       (ALU,    OP_MTSPR,     NONE,       NONE,        RS,   NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- mtspr
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0111010011#  =>       (ALU,    OP_MTSPR,     NONE,       NONE,        RS,   SPR,  '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mtspr
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0001001001#  =>       (MUL,    OP_MUL_H64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '1', RC,   '0', '1'), -- mulhd
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0000001001#  =>       (MUL,    OP_MUL_H64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- mulhdu
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						2#0001001011#  =>       (MUL,    OP_MUL_H32,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '1', RC,   '0', '1'), -- mulhw
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -355,6 +355,8 @@ begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						v.nia  := f_in.nia;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						v.insn := f_in.insn;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						v.stop_mark := f_in.stop_mark;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						v.ispr1 := (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						v.ispr2 := (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if f_in.valid = '1' then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							report "Decode insn " & to_hstring(f_in.insn) & " at " & to_hstring(f_in.nia);
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -398,6 +400,33 @@ begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                        v.decode := major_decode_rom_array(to_integer(majorop));
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						-- Set ISPR1/ISPR2 when needed
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if v.decode.insn_type = OP_BC or v.decode.insn_type = OP_BCREG then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    -- Branch uses CTR as condition when BO(2) is 0. This is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    -- also used to indicate that CTR is modified (they go
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    -- together).
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    --
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    if f_in.insn(23) = '0' then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							v.ispr1 := fast_spr_num(SPR_CTR);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    -- Branch source register is an SPR
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    if v.decode.insn_type = OP_BCREG then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							-- TODO: Add TAR
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if f_in.insn(10) = '0' then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							    v.ispr2 := fast_spr_num(SPR_LR);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							else
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							    v.ispr2 := fast_spr_num(SPR_CTR);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						elsif v.decode.insn_type = OP_MFSPR or v.decode.insn_type = OP_MTSPR then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    v.ispr1 := fast_spr_num(decode_spr_num(f_in.insn));
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    -- Make slow SPRs single issue
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    if is_fast_spr(v.ispr1) = '0' then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							v.decode.sgl_pipe := '1';
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						    end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						end if;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if flush_in = '1' then
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							v.valid := '0';
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						end if;