2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
7 use work.decode_types.all;
14 stall_in : in std_ulogic;
15 flush_in : in std_ulogic;
17 f_in : in Fetch2ToDecode1Type;
18 d_out : out Decode1ToDecode2Type
22 architecture behaviour of decode1 is
23 signal r, rin : Decode1ToDecode2Type;
25 type decode_rom_array_t is array(ppc_insn_t) of decode_rom_t;
27 -- Note: reformat with column -t -o ' '
28 constant decode_rom_array : decode_rom_array_t := (
29 -- unit internal in1 in2 in3 out const const const CR CR cry cry ldst BR sgn upd rsrv mul mul rc lk sgl
30 -- op 1 2 3 in out in out len ext 32 sgn pipe
31 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'),
32 PPC_ADD => (ALU, OP_ADD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
33 PPC_ADDC => (ALU, OP_ADDC, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
34 PPC_ADDE => (ALU, OP_ADDC, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '1', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
36 PPC_ADDI => (ALU, OP_ADD, RA_OR_ZERO, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
37 PPC_ADDIC => (ALU, OP_ADDC, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
38 PPC_ADDIC_RC => (ALU, OP_ADDC, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', ONE, '0', '1'),
39 PPC_ADDIS => (ALU, OP_ADD, RA_OR_ZERO, CONST_SI_HI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
42 PPC_ADDZE => (ALU, OP_ADDC, RA, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '1', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
43 PPC_AND => (ALU, OP_AND, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
44 PPC_ANDC => (ALU, OP_ANDC, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
45 PPC_ANDI_RC => (ALU, OP_AND, RS, CONST_UI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', ONE, '0', '1'),
46 PPC_ANDIS_RC => (ALU, OP_AND, RS, CONST_UI_HI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', ONE, '0', '1'),
47 PPC_ATTN => (ALU, OP_ILLEGAL, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
48 PPC_B => (ALU, OP_B, NONE, CONST_LI, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
50 PPC_BC => (ALU, OP_BC, NONE, CONST_BD, NONE, NONE, BO, BI, NONE, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
52 PPC_BCCTR => (ALU, OP_BCCTR, NONE, NONE, NONE, NONE, BO, BI, BH, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
54 PPC_BCLR => (ALU, OP_BCLR, NONE, NONE, NONE, NONE, BO, BI, BH, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
57 PPC_CMP => (ALU, OP_CMP, RA, RB, NONE, NONE, BF, L, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
58 PPC_CMPB => (ALU, OP_CMPB, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
60 PPC_CMPI => (ALU, OP_CMP, RA, CONST_SI, NONE, NONE, BF, L, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
61 PPC_CMPL => (ALU, OP_CMPL, RA, RB, NONE, NONE, BF, L, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
62 PPC_CMPLI => (ALU, OP_CMPL, RA, CONST_UI, NONE, NONE, BF, L, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
64 PPC_CNTLZD => (ALU, OP_CNTLZD, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
65 PPC_CNTLZW => (ALU, OP_CNTLZW, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
66 PPC_CNTTZD => (ALU, OP_CNTTZD, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
67 PPC_CNTTZW => (ALU, OP_CNTTZW, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
77 PPC_DCBF => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
78 PPC_DCBST => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
79 PPC_DCBT => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
80 PPC_DCBTST => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
82 PPC_DIVD => (ALU, OP_DIVD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
85 PPC_DIVDU => (ALU, OP_DIVDU, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
86 PPC_DIVW => (ALU, OP_DIVW, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
89 PPC_DIVWU => (ALU, OP_DIVWU, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
90 PPC_EQV => (ALU, OP_EQV, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
91 PPC_EXTSB => (ALU, OP_EXTSB, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
92 PPC_EXTSH => (ALU, OP_EXTSH, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
93 PPC_EXTSW => (ALU, OP_EXTSW, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
96 PPC_ICBT => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
97 PPC_ISEL => (ALU, OP_ISEL, RA_OR_ZERO, RB, NONE, RT, BC, NONE, NONE, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
98 PPC_ISYNC => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
99 PPC_LBARX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
100 --CONST_LI matches CONST_SI, so reuse it
101 PPC_LBZ => (LDST, OP_LOAD, RA_OR_ZERO, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
102 PPC_LBZU => (LDST, OP_LOAD, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
103 PPC_LBZUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
104 PPC_LBZX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
105 PPC_LD => (LDST, OP_LOAD, RA_OR_ZERO, CONST_DS, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
106 PPC_LDARX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
107 PPC_LDBRX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
108 PPC_LDU => (LDST, OP_LOAD, RA, CONST_DS, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
109 PPC_LDUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
110 PPC_LDX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
111 PPC_LHA => (LDST, OP_LOAD, RA_OR_ZERO, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '1', '0', '0', '0', '0', NONE, '0', '1'),
112 PPC_LHARX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
113 PPC_LHAU => (LDST, OP_LOAD, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '1', '1', '0', '0', '0', NONE, '0', '1'),
114 PPC_LHAUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '1', '1', '0', '0', '0', NONE, '0', '1'),
115 PPC_LHAX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '1', '0', '0', '0', '0', NONE, '0', '1'),
116 PPC_LHBRX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
117 PPC_LHZ => (LDST, OP_LOAD, RA_OR_ZERO, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
118 PPC_LHZU => (LDST, OP_LOAD, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
119 PPC_LHZUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
120 PPC_LHZX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
121 PPC_LWA => (LDST, OP_LOAD, RA_OR_ZERO, CONST_DS, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '1', '0', '0', '0', '0', NONE, '0', '1'),
122 PPC_LWARX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
123 PPC_LWAUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '1', '1', '0', '0', '0', NONE, '0', '1'),
124 PPC_LWAX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '1', '0', '0', '0', '0', NONE, '0', '1'),
125 PPC_LWBRX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
126 PPC_LWZ => (LDST, OP_LOAD, RA_OR_ZERO, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
127 PPC_LWZU => (LDST, OP_LOAD, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
128 PPC_LWZUX => (LDST, OP_LOAD, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
129 PPC_LWZX => (LDST, OP_LOAD, RA_OR_ZERO, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
136 PPC_MFCR => (ALU, OP_MFCR, NONE, NONE, NONE, RT, NONE, NONE, NONE, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
137 PPC_MFOCRF => (ALU, OP_MFOCRF, NONE, NONE, NONE, RT, FXM, NONE, NONE, '1', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
138 PPC_MFCTR => (ALU, OP_MFCTR, NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
139 PPC_MFLR => (ALU, OP_MFLR, NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
140 PPC_MFTB => (ALU, OP_MFTB, NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
141 PPC_MTCTR => (ALU, OP_MTCTR, RS, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
142 PPC_MTLR => (ALU, OP_MTLR, RS, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
148 PPC_MTCRF => (ALU, OP_MTCRF, RS, NONE, NONE, NONE, FXM, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
149 PPC_MTOCRF => (ALU, OP_MTOCRF, RS, NONE, NONE, NONE, FXM, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
151 PPC_MULHD => (MUL, OP_MUL_H64, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '1', RC, '0', '1'),
152 PPC_MULHDU => (MUL, OP_MUL_H64, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
153 PPC_MULHW => (MUL, OP_MUL_H32, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '1', '1', RC, '0', '1'),
154 PPC_MULHWU => (MUL, OP_MUL_H32, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '1', '0', RC, '0', '1'),
155 PPC_MULLD => (MUL, OP_MUL_L64, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '1', RC, '0', '1'),
156 PPC_MULLI => (MUL, OP_MUL_L64, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '0', '1', NONE, '0', '1'),
157 PPC_MULLW => (MUL, OP_MUL_L64, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '1', '0', '0', NONE, '0', '0', '0', '0', '1', '1', RC, '0', '1'),
158 PPC_NAND => (ALU, OP_NAND, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
159 PPC_NEG => (ALU, OP_NEG, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
160 PPC_NOR => (ALU, OP_NOR, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
161 PPC_OR => (ALU, OP_OR, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
162 PPC_ORC => (ALU, OP_ORC, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
163 PPC_ORI => (ALU, OP_OR, RS, CONST_UI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
164 PPC_ORIS => (ALU, OP_OR, RS, CONST_UI_HI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
165 PPC_POPCNTB => (ALU, OP_POPCNTB, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
166 PPC_POPCNTD => (ALU, OP_POPCNTD, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
167 PPC_POPCNTW => (ALU, OP_POPCNTW, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
168 PPC_PRTYD => (ALU, OP_PRTYD, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
169 PPC_PRTYW => (ALU, OP_PRTYW, RS, NONE, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
170 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'),
171 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'),
172 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'),
173 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'),
174 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'),
175 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'),
176 PPC_RLWIMI => (ALU, OP_RLWIMI, RA, RS, NONE, RA, SH32, MB32, ME32, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
177 PPC_RLWINM => (ALU, OP_RLWINM, RS, NONE, NONE, RA, SH32, MB32, ME32, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
178 PPC_RLWNM => (ALU, OP_RLWNM, RS, RB, NONE, RA, NONE, MB32, ME32, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
180 PPC_SLD => (ALU, OP_SLD, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
181 PPC_SLW => (ALU, OP_SLW, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
182 PPC_SRAD => (ALU, OP_SRAD, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
183 PPC_SRADI => (ALU, OP_SRADI, RS, NONE, NONE, RA, SH, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
184 PPC_SRAW => (ALU, OP_SRAW, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
185 PPC_SRAWI => (ALU, OP_SRAWI, RS, NONE, NONE, RA, SH, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
186 PPC_SRD => (ALU, OP_SRD, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
187 PPC_SRW => (ALU, OP_SRW, RS, RB, RS, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
188 PPC_STB => (LDST, OP_STORE, RA_OR_ZERO, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
189 PPC_STBCX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '1', '0', '0', RC, '0', '1'),
190 PPC_STBU => (LDST, OP_STORE, RA, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '1', '0', '0', '0', RC, '0', '1'),
191 PPC_STBUX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '1', '0', '0', '0', RC, '0', '1'),
192 PPC_STBX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is1B, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
193 PPC_STD => (LDST, OP_STORE, RA_OR_ZERO, CONST_DS, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
194 PPC_STDBRX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
195 PPC_STDCX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
196 PPC_STDU => (LDST, OP_STORE, RA, CONST_DS, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
197 PPC_STDUX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
198 PPC_STDX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is8B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
199 PPC_STH => (LDST, OP_STORE, RA, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
200 PPC_STHBRX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
201 PPC_STHCX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
202 PPC_STHU => (LDST, OP_STORE, RA, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
203 PPC_STHUX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
204 PPC_STHX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is2B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
205 PPC_STW => (LDST, OP_STORE, RA_OR_ZERO, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
206 PPC_STWBRX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '1', '0', '0', '0', '0', '0', NONE, '0', '1'),
207 PPC_STWCX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '1', '0', '0', NONE, '0', '1'),
208 PPC_STWU => (LDST, OP_STORE, RA, CONST_SI, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
209 PPC_STWUX => (LDST, OP_STORE, RA, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'),
210 PPC_STWX => (LDST, OP_STORE, RA_OR_ZERO, RB, RS, NONE, NONE, NONE, NONE, '0', '0', '0', '0', is4B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
211 PPC_SUBF => (ALU, OP_SUBF, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
212 PPC_SUBFC => (ALU, OP_SUBFC, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
213 PPC_SUBFE => (ALU, OP_SUBFC, RA, RB, NONE, RT, NONE, NONE, NONE, '0', '0', '1', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
214 PPC_SUBFIC => (ALU, OP_SUBFC, RA, CONST_SI, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '1', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
216 PPC_SUBFZE => (ALU, OP_SUBFC, RA, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '1', '1', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
217 PPC_SYNC => (ALU, OP_NOP, NONE, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
219 PPC_TDI => (ALU, OP_TDI, RA, CONST_SI, NONE, NONE, TOO, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
222 PPC_XOR => (ALU, OP_XOR, RS, RB, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', RC, '0', '1'),
223 PPC_XORI => (ALU, OP_XOR, RS, CONST_UI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
224 PPC_XORIS => (ALU, OP_XOR, RS, CONST_UI_HI, NONE, RA, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
225 PPC_SIM_READ => (ALU, OP_SIM_READ, NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
226 PPC_SIM_POLL => (ALU, OP_SIM_POLL, NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
227 PPC_SIM_WRITE => (ALU, OP_SIM_WRITE, RS, NONE, NONE, NONE, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
228 PPC_SIM_CONFIG => (ALU, OP_SIM_CONFIG,NONE, NONE, NONE, RT, NONE, NONE, NONE, '0', '0', '0', '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
230 others => decode_rom_init
234 decode1_0: process(clk)
236 if rising_edge(clk) then
237 -- Output state remains unchanged on stall, unless we are flushing
238 if rst = '1' or flush_in = '1' or stall_in = '0' then
244 decode1_1: process(all)
245 variable v : Decode1ToDecode2Type;
246 variable ppc_insn: ppc_insn_t;
250 v.valid := f_in.valid;
252 ppc_insn := PPC_ILLEGAL;
258 report "Decode insn " & to_hstring(f_in.insn) & " at " & to_hstring(f_in.nia);
260 if std_match(f_in.insn, "011111---------------0100001010-") then
263 elsif std_match(f_in.insn, "011111---------------0000001010-") then
265 ppc_insn := PPC_ADDC;
266 elsif std_match(f_in.insn, "011111---------------0010001010-") then
268 ppc_insn := PPC_ADDE;
269 elsif std_match(f_in.insn, "011111---------------0010101010-") then
271 ppc_insn := PPC_ADDEX;
272 elsif std_match(f_in.insn, "001110--------------------------") then
274 ppc_insn := PPC_ADDI;
275 elsif std_match(f_in.insn, "001100--------------------------") then
277 ppc_insn := PPC_ADDIC;
278 elsif std_match(f_in.insn, "001101--------------------------") then
280 ppc_insn := PPC_ADDIC_RC;
281 elsif std_match(f_in.insn, "001111--------------------------") then
283 ppc_insn := PPC_ADDIS;
284 elsif std_match(f_in.insn, "011111---------------0011101010-") then
286 ppc_insn := PPC_ADDME;
287 elsif std_match(f_in.insn, "010011--------------------00010-") then
288 report "PPC_addpcis";
289 ppc_insn := PPC_ADDPCIS;
290 elsif std_match(f_in.insn, "011111---------------0011001010-") then
292 ppc_insn := PPC_ADDZE;
293 elsif std_match(f_in.insn, "011111---------------0000011100-") then
296 elsif std_match(f_in.insn, "011111---------------0000111100-") then
298 ppc_insn := PPC_ANDC;
299 elsif std_match(f_in.insn, "011100--------------------------") then
301 ppc_insn := PPC_ANDI_RC;
302 elsif std_match(f_in.insn, "011101--------------------------") then
304 ppc_insn := PPC_ANDIS_RC;
305 elsif std_match(f_in.insn, "000000---------------0100000000-") then
307 ppc_insn := PPC_ATTN;
308 elsif std_match(f_in.insn, "010010------------------------0-") then
311 elsif std_match(f_in.insn, "010010------------------------1-") then
314 elsif std_match(f_in.insn, "010000------------------------0-") then
317 elsif std_match(f_in.insn, "010000------------------------10") then
320 elsif std_match(f_in.insn, "010011---------------1000010000-") then
322 ppc_insn := PPC_BCCTR;
323 elsif std_match(f_in.insn, "010000------------------------11") then
325 ppc_insn := PPC_BCLA;
326 elsif std_match(f_in.insn, "010011---------------0000010000-") then
328 ppc_insn := PPC_BCLR;
329 elsif std_match(f_in.insn, "010011---------------1000110000-") then
331 ppc_insn := PPC_BCTAR;
332 elsif std_match(f_in.insn, "011111---------------0011111100-") then
334 ppc_insn := PPC_BPERM;
335 elsif std_match(f_in.insn, "011111---------------0000000000-") then
338 elsif std_match(f_in.insn, "011111---------------0111111100-") then
340 ppc_insn := PPC_CMPB;
341 elsif std_match(f_in.insn, "011111---------------0011100000-") then
343 ppc_insn := PPC_CMPEQB;
344 elsif std_match(f_in.insn, "001011--------------------------") then
346 ppc_insn := PPC_CMPI;
347 elsif std_match(f_in.insn, "011111---------------0000100000-") then
349 ppc_insn := PPC_CMPL;
350 elsif std_match(f_in.insn, "001010--------------------------") then
352 ppc_insn := PPC_CMPLI;
353 elsif std_match(f_in.insn, "011111---------------0011000000-") then
355 ppc_insn := PPC_CMPRB;
356 elsif std_match(f_in.insn, "011111---------------0000111010-") then
358 ppc_insn := PPC_CNTLZD;
359 elsif std_match(f_in.insn, "011111---------------0000011010-") then
361 ppc_insn := PPC_CNTLZW;
362 elsif std_match(f_in.insn, "011111---------------1000111010-") then
364 ppc_insn := PPC_CNTTZD;
365 elsif std_match(f_in.insn, "011111---------------1000011010-") then
367 ppc_insn := PPC_CNTTZW;
368 elsif std_match(f_in.insn, "010011---------------0100000001-") then
370 ppc_insn := PPC_CRAND;
371 elsif std_match(f_in.insn, "010011---------------0010000001-") then
373 ppc_insn := PPC_CRANDC;
374 elsif std_match(f_in.insn, "010011---------------0100100001-") then
376 ppc_insn := PPC_CREQV;
377 elsif std_match(f_in.insn, "010011---------------0011100001-") then
379 ppc_insn := PPC_CRNAND;
380 elsif std_match(f_in.insn, "010011---------------0000100001-") then
382 ppc_insn := PPC_CRNOR;
383 elsif std_match(f_in.insn, "010011---------------0111000001-") then
385 ppc_insn := PPC_CROR;
386 elsif std_match(f_in.insn, "010011---------------0110100001-") then
388 ppc_insn := PPC_CRORC;
389 elsif std_match(f_in.insn, "010011---------------0011000001-") then
391 ppc_insn := PPC_CRXOR;
392 elsif std_match(f_in.insn, "011111---------------1011110011-") then
394 ppc_insn := PPC_DARN;
395 elsif std_match(f_in.insn, "011111---------------0001010110-") then
397 ppc_insn := PPC_DCBF;
398 elsif std_match(f_in.insn, "011111---------------0000110110-") then
400 ppc_insn := PPC_DCBST;
401 elsif std_match(f_in.insn, "011111---------------0100010110-") then
403 ppc_insn := PPC_DCBT;
404 elsif std_match(f_in.insn, "011111---------------0011110110-") then
406 ppc_insn := PPC_DCBTST;
407 elsif std_match(f_in.insn, "011111---------------1111110110-") then
409 ppc_insn := PPC_DCBZ;
410 elsif std_match(f_in.insn, "011111---------------0111101001-") then
412 ppc_insn := PPC_DIVD;
413 elsif std_match(f_in.insn, "011111---------------0110101001-") then
415 ppc_insn := PPC_DIVDE;
416 elsif std_match(f_in.insn, "011111---------------0110001001-") then
418 ppc_insn := PPC_DIVDEU;
419 elsif std_match(f_in.insn, "011111---------------0111001001-") then
421 ppc_insn := PPC_DIVDU;
422 elsif std_match(f_in.insn, "011111---------------0111101011-") then
424 ppc_insn := PPC_DIVW;
425 elsif std_match(f_in.insn, "011111---------------0110101011-") then
427 ppc_insn := PPC_DIVWE;
428 elsif std_match(f_in.insn, "011111---------------0110001011-") then
430 ppc_insn := PPC_DIVWEU;
431 elsif std_match(f_in.insn, "011111---------------0111001011-") then
433 ppc_insn := PPC_DIVWU;
434 elsif std_match(f_in.insn, "011111---------------0100011100-") then
437 elsif std_match(f_in.insn, "011111---------------1110111010-") then
439 ppc_insn := PPC_EXTSB;
440 elsif std_match(f_in.insn, "011111---------------1110011010-") then
442 ppc_insn := PPC_EXTSH;
443 elsif std_match(f_in.insn, "011111---------------1111011010-") then
445 ppc_insn := PPC_EXTSW;
446 elsif std_match(f_in.insn, "011111---------------110111101--") then
447 report "PPC_extswsli";
448 ppc_insn := PPC_EXTSWSLI;
449 elsif std_match(f_in.insn, "011111---------------1111010110-") then
451 ppc_insn := PPC_ICBI;
452 elsif std_match(f_in.insn, "011111---------------0000010110-") then
454 ppc_insn := PPC_ICBT;
455 elsif std_match(f_in.insn, "011111--------------------01111-") then
457 ppc_insn := PPC_ISEL;
458 elsif std_match(f_in.insn, "010011---------------0010010110-") then
460 ppc_insn := PPC_ISYNC;
461 elsif std_match(f_in.insn, "011111---------------0000110100-") then
463 ppc_insn := PPC_LBARX;
464 elsif std_match(f_in.insn, "100010--------------------------") then
467 elsif std_match(f_in.insn, "100011--------------------------") then
469 ppc_insn := PPC_LBZU;
470 elsif std_match(f_in.insn, "011111---------------0001110111-") then
472 ppc_insn := PPC_LBZUX;
473 elsif std_match(f_in.insn, "011111---------------0001010111-") then
475 ppc_insn := PPC_LBZX;
476 elsif std_match(f_in.insn, "111010------------------------00") then
479 elsif std_match(f_in.insn, "011111---------------0001010100-") then
481 ppc_insn := PPC_LDARX;
482 elsif std_match(f_in.insn, "011111---------------1000010100-") then
484 ppc_insn := PPC_LDBRX;
485 elsif std_match(f_in.insn, "111010------------------------01") then
488 elsif std_match(f_in.insn, "011111---------------0000110101-") then
490 ppc_insn := PPC_LDUX;
491 elsif std_match(f_in.insn, "011111---------------0000010101-") then
494 elsif std_match(f_in.insn, "101010--------------------------") then
497 elsif std_match(f_in.insn, "011111---------------0001110100-") then
499 ppc_insn := PPC_LHARX;
500 elsif std_match(f_in.insn, "101011--------------------------") then
502 ppc_insn := PPC_LHAU;
503 elsif std_match(f_in.insn, "011111---------------0101110111-") then
505 ppc_insn := PPC_LHAUX;
506 elsif std_match(f_in.insn, "011111---------------0101010111-") then
508 ppc_insn := PPC_LHAX;
509 elsif std_match(f_in.insn, "011111---------------1100010110-") then
511 ppc_insn := PPC_LHBRX;
512 elsif std_match(f_in.insn, "101000--------------------------") then
515 elsif std_match(f_in.insn, "101001--------------------------") then
517 ppc_insn := PPC_LHZU;
518 elsif std_match(f_in.insn, "011111---------------0100110111-") then
520 ppc_insn := PPC_LHZUX;
521 elsif std_match(f_in.insn, "011111---------------0100010111-") then
523 ppc_insn := PPC_LHZX;
524 elsif std_match(f_in.insn, "111010------------------------10") then
527 elsif std_match(f_in.insn, "011111---------------0000010100-") then
529 ppc_insn := PPC_LWARX;
530 elsif std_match(f_in.insn, "011111---------------0101110101-") then
532 ppc_insn := PPC_LWAUX;
533 elsif std_match(f_in.insn, "011111---------------0101010101-") then
535 ppc_insn := PPC_LWAX;
536 elsif std_match(f_in.insn, "011111---------------1000010110-") then
538 ppc_insn := PPC_LWBRX;
539 elsif std_match(f_in.insn, "100000--------------------------") then
542 elsif std_match(f_in.insn, "100001--------------------------") then
544 ppc_insn := PPC_LWZU;
545 elsif std_match(f_in.insn, "011111---------------0000110111-") then
547 ppc_insn := PPC_LWZUX;
548 elsif std_match(f_in.insn, "011111---------------0000010111-") then
550 ppc_insn := PPC_LWZX;
551 elsif std_match(f_in.insn, "000100--------------------110000") then
553 ppc_insn := PPC_MADDHD;
554 elsif std_match(f_in.insn, "000100--------------------110001") then
555 report "PPC_maddhdu";
556 ppc_insn := PPC_MADDHDU;
557 elsif std_match(f_in.insn, "000100--------------------110011") then
559 ppc_insn := PPC_MADDLD;
560 elsif std_match(f_in.insn, "010011---------------0000000000-") then
562 ppc_insn := PPC_MCRF;
563 elsif std_match(f_in.insn, "011111---------------1000000000-") then
565 ppc_insn := PPC_MCRXR;
566 elsif std_match(f_in.insn, "011111---------------1001000000-") then
568 ppc_insn := PPC_MCRXRX;
569 elsif std_match(f_in.insn, "011111-----0---------0000010011-") then
571 ppc_insn := PPC_MFCR;
572 elsif std_match(f_in.insn, "011111-----1---------0000010011-") then
574 ppc_insn := PPC_MFOCRF;
575 -- Specific MF/MT SPR encodings first
576 elsif std_match(f_in.insn, "011111-----01001000000101010011-") then
578 ppc_insn := PPC_MFCTR;
579 elsif std_match(f_in.insn, "011111-----01000000000101010011-") then
581 ppc_insn := PPC_MFLR;
582 elsif std_match(f_in.insn, "011111-----01100010000101010011-") then
584 ppc_insn := PPC_MFTB;
585 elsif std_match(f_in.insn, "011111-----01001000000111010011-") then
587 ppc_insn := PPC_MTCTR;
588 elsif std_match(f_in.insn, "011111-----01000000000111010011-") then
590 ppc_insn := PPC_MTLR;
591 elsif std_match(f_in.insn, "011111---------------0101010011-") then
593 ppc_insn := PPC_MFSPR;
594 elsif std_match(f_in.insn, "011111---------------1100001001-") then
596 ppc_insn := PPC_MODSD;
597 elsif std_match(f_in.insn, "011111---------------1100001011-") then
599 ppc_insn := PPC_MODSW;
600 elsif std_match(f_in.insn, "011111---------------0100001001-") then
602 ppc_insn := PPC_MODUD;
603 elsif std_match(f_in.insn, "011111---------------0100001011-") then
605 ppc_insn := PPC_MODUW;
606 elsif std_match(f_in.insn, "011111-----0---------0010010000-") then
608 ppc_insn := PPC_MTCRF;
609 elsif std_match(f_in.insn, "011111-----1---------0010010000-") then
611 ppc_insn := PPC_MTOCRF;
612 elsif std_match(f_in.insn, "011111---------------0111010011-") then
614 ppc_insn := PPC_MTSPR;
615 elsif std_match(f_in.insn, "011111----------------001001001-") then
617 ppc_insn := PPC_MULHD;
618 elsif std_match(f_in.insn, "011111----------------000001001-") then
620 ppc_insn := PPC_MULHDU;
621 elsif std_match(f_in.insn, "011111----------------001001011-") then
623 ppc_insn := PPC_MULHW;
624 elsif std_match(f_in.insn, "011111----------------000001011-") then
626 ppc_insn := PPC_MULHWU;
627 elsif std_match(f_in.insn, "011111---------------0011101001-") then
629 ppc_insn := PPC_MULLD;
630 elsif std_match(f_in.insn, "000111--------------------------") then
632 ppc_insn := PPC_MULLI;
633 elsif std_match(f_in.insn, "011111---------------0011101011-") then
635 ppc_insn := PPC_MULLW;
636 elsif std_match(f_in.insn, "011111---------------0111011100-") then
638 ppc_insn := PPC_NAND;
639 elsif std_match(f_in.insn, "011111---------------0001101000-") then
642 elsif std_match(f_in.insn, "011111---------------0001111100-") then
645 elsif std_match(f_in.insn, "011111---------------0110111100-") then
648 elsif std_match(f_in.insn, "011111---------------0110011100-") then
651 elsif std_match(f_in.insn, "011000--------------------------") then
654 elsif std_match(f_in.insn, "011001--------------------------") then
656 ppc_insn := PPC_ORIS;
657 elsif std_match(f_in.insn, "011111---------------0001111010-") then
658 report "PPC_popcntb";
659 ppc_insn := PPC_POPCNTB;
660 elsif std_match(f_in.insn, "011111---------------0111111010-") then
661 report "PPC_popcntd";
662 ppc_insn := PPC_POPCNTD;
663 elsif std_match(f_in.insn, "011111---------------0101111010-") then
664 report "PPC_popcntw";
665 ppc_insn := PPC_POPCNTW;
666 elsif std_match(f_in.insn, "011111---------------0010111010-") then
668 ppc_insn := PPC_PRTYD;
669 elsif std_match(f_in.insn, "011111---------------0010011010-") then
671 ppc_insn := PPC_PRTYW;
672 elsif std_match(f_in.insn, "011110---------------------1000-") then
674 ppc_insn := PPC_RLDCL;
675 elsif std_match(f_in.insn, "011110---------------------1001-") then
677 ppc_insn := PPC_RLDCR;
678 elsif std_match(f_in.insn, "011110---------------------010--") then
680 ppc_insn := PPC_RLDIC;
681 elsif std_match(f_in.insn, "011110---------------------000--") then
683 ppc_insn := PPC_RLDICL;
684 elsif std_match(f_in.insn, "011110---------------------001--") then
686 ppc_insn := PPC_RLDICR;
687 elsif std_match(f_in.insn, "011110---------------------011--") then
689 ppc_insn := PPC_RLDIMI;
690 elsif std_match(f_in.insn, "010100--------------------------") then
692 ppc_insn := PPC_RLWIMI;
693 elsif std_match(f_in.insn, "010101--------------------------") then
695 ppc_insn := PPC_RLWINM;
696 elsif std_match(f_in.insn, "010111--------------------------") then
698 ppc_insn := PPC_RLWNM;
699 elsif std_match(f_in.insn, "011111---------------0010000000-") then
701 ppc_insn := PPC_SETB;
702 elsif std_match(f_in.insn, "011111---------------0000011011-") then
705 elsif std_match(f_in.insn, "011111---------------0000011000-") then
708 elsif std_match(f_in.insn, "011111---------------1100011010-") then
710 ppc_insn := PPC_SRAD;
711 elsif std_match(f_in.insn, "011111---------------110011101--") then
713 ppc_insn := PPC_SRADI;
714 elsif std_match(f_in.insn, "011111---------------1100011000-") then
716 ppc_insn := PPC_SRAW;
717 elsif std_match(f_in.insn, "011111---------------1100111000-") then
719 ppc_insn := PPC_SRAWI;
720 elsif std_match(f_in.insn, "011111---------------1000011011-") then
723 elsif std_match(f_in.insn, "011111---------------1000011000-") then
726 elsif std_match(f_in.insn, "100110--------------------------") then
729 elsif std_match(f_in.insn, "011111---------------1010110110-") then
731 ppc_insn := PPC_STBCX;
732 elsif std_match(f_in.insn, "100111--------------------------") then
734 ppc_insn := PPC_STBU;
735 elsif std_match(f_in.insn, "011111---------------0011110111-") then
737 ppc_insn := PPC_STBUX;
738 elsif std_match(f_in.insn, "011111---------------0011010111-") then
740 ppc_insn := PPC_STBX;
741 elsif std_match(f_in.insn, "111110------------------------00") then
744 elsif std_match(f_in.insn, "011111---------------1010010100-") then
746 ppc_insn := PPC_STDBRX;
747 elsif std_match(f_in.insn, "011111---------------0011010110-") then
749 ppc_insn := PPC_STDCX;
750 elsif std_match(f_in.insn, "111110------------------------01") then
752 ppc_insn := PPC_STDU;
753 elsif std_match(f_in.insn, "011111---------------0010110101-") then
755 ppc_insn := PPC_STDUX;
756 elsif std_match(f_in.insn, "011111---------------0010010101-") then
758 ppc_insn := PPC_STDX;
759 elsif std_match(f_in.insn, "101100--------------------------") then
762 elsif std_match(f_in.insn, "011111---------------1110010110-") then
764 ppc_insn := PPC_STHBRX;
765 elsif std_match(f_in.insn, "011111---------------1011010110-") then
767 ppc_insn := PPC_STHCX;
768 elsif std_match(f_in.insn, "101101--------------------------") then
770 ppc_insn := PPC_STHU;
771 elsif std_match(f_in.insn, "011111---------------0110110111-") then
773 ppc_insn := PPC_STHUX;
774 elsif std_match(f_in.insn, "011111---------------0110010111-") then
776 ppc_insn := PPC_STHX;
777 elsif std_match(f_in.insn, "100100--------------------------") then
780 elsif std_match(f_in.insn, "011111---------------1010010110-") then
782 ppc_insn := PPC_STWBRX;
783 elsif std_match(f_in.insn, "011111---------------0010010110-") then
785 ppc_insn := PPC_STWCX;
786 elsif std_match(f_in.insn, "100101--------------------------") then
788 ppc_insn := PPC_STWU;
789 elsif std_match(f_in.insn, "011111---------------0010110111-") then
791 ppc_insn := PPC_STWUX;
792 elsif std_match(f_in.insn, "011111---------------0010010111-") then
794 ppc_insn := PPC_STWX;
795 elsif std_match(f_in.insn, "011111---------------0000101000-") then
797 ppc_insn := PPC_SUBF;
798 elsif std_match(f_in.insn, "011111---------------0000001000-") then
800 ppc_insn := PPC_SUBFC;
801 elsif std_match(f_in.insn, "011111---------------0010001000-") then
803 ppc_insn := PPC_SUBFE;
804 elsif std_match(f_in.insn, "001000--------------------------") then
806 ppc_insn := PPC_SUBFIC;
807 elsif std_match(f_in.insn, "011111---------------0011101000-") then
809 ppc_insn := PPC_SUBFME;
810 elsif std_match(f_in.insn, "011111---------------0011001000-") then
812 ppc_insn := PPC_SUBFZE;
813 elsif std_match(f_in.insn, "011111---------------1001010110-") then
815 ppc_insn := PPC_SYNC;
816 elsif std_match(f_in.insn, "011111---------------0001000100-") then
819 elsif std_match(f_in.insn, "000010--------------------------") then
822 elsif std_match(f_in.insn, "011111---------------0000000100-") then
825 elsif std_match(f_in.insn, "000011--------------------------") then
828 elsif std_match(f_in.insn, "011111---------------0100111100-") then
831 elsif std_match(f_in.insn, "011010--------------------------") then
833 ppc_insn := PPC_XORI;
834 elsif std_match(f_in.insn, "011011--------------------------") then
836 ppc_insn := PPC_XORIS;
837 elsif std_match(f_in.insn, "000001---------------0000000000-") then
838 report "PPC_SIM_READ";
839 ppc_insn := PPC_SIM_READ;
840 elsif std_match(f_in.insn, "000001---------------0000000001-") then
841 report "PPC_SIM_POLL";
842 ppc_insn := PPC_SIM_POLL;
843 elsif std_match(f_in.insn, "000001---------------0000000010-") then
844 report "PPC_SIM_WRITE";
845 ppc_insn := PPC_SIM_WRITE;
846 elsif std_match(f_in.insn, "000001---------------0000000011-") then
847 report "PPC_SIM_CONFIG";
848 ppc_insn := PPC_SIM_CONFIG;
850 report "PPC_illegal";
851 ppc_insn := PPC_ILLEGAL;
854 v.decode := decode_rom_array(ppc_insn);
857 if flush_in = '1' then
862 v := Decode1ToDecode2Init;
871 end architecture behaviour;