1 |
22 |
mcwaccent |
--
|
2 |
|
|
-- jtbl.vhd
|
3 |
|
|
--
|
4 |
|
|
-- jump table for java bc to jvm address
|
5 |
|
|
--
|
6 |
|
|
-- DONT edit this file!
|
7 |
|
|
-- generated by Jopa.java
|
8 |
|
|
--
|
9 |
|
|
|
10 |
|
|
library ieee;
|
11 |
|
|
use ieee.std_logic_1164.all;
|
12 |
|
|
use ieee.std_logic_arith.all;
|
13 |
|
|
use ieee.std_logic_unsigned.all;
|
14 |
|
|
|
15 |
|
|
entity jtbl is
|
16 |
|
|
port (
|
17 |
|
|
bcode : in std_logic_vector(7 downto 0);
|
18 |
|
|
int_pend : in std_logic;
|
19 |
|
|
exc_pend : in std_logic;
|
20 |
|
|
q : out std_logic_vector(10 downto 0)
|
21 |
|
|
);
|
22 |
|
|
end jtbl;
|
23 |
|
|
|
24 |
|
|
--
|
25 |
|
|
-- unregistered rdbcode
|
26 |
|
|
-- unregistered dout
|
27 |
|
|
--
|
28 |
|
|
architecture rtl of jtbl is
|
29 |
|
|
|
30 |
|
|
signal addr : std_logic_vector(10 downto 0);
|
31 |
|
|
|
32 |
|
|
begin
|
33 |
|
|
|
34 |
|
|
process(bcode) begin
|
35 |
|
|
|
36 |
|
|
case bcode is
|
37 |
|
|
|
38 |
|
|
when "00000000" => addr <= "00001111010"; -- 007a nop
|
39 |
|
|
when "00000010" => addr <= "00001111011"; -- 007b iconst_m1
|
40 |
|
|
when "00000001" => addr <= "00001111100"; -- 007c aconst_null
|
41 |
|
|
when "00000011" => addr <= "00001111100"; -- 007c iconst_0
|
42 |
|
|
when "00000100" => addr <= "00001111101"; -- 007d iconst_1
|
43 |
|
|
when "00000101" => addr <= "00001111110"; -- 007e iconst_2
|
44 |
|
|
when "00000110" => addr <= "00001111111"; -- 007f iconst_3
|
45 |
|
|
when "00000111" => addr <= "00010000000"; -- 0080 iconst_4
|
46 |
|
|
when "00001000" => addr <= "00010000001"; -- 0081 iconst_5
|
47 |
|
|
when "00010000" => addr <= "00010000010"; -- 0082 bipush
|
48 |
|
|
when "00010001" => addr <= "00010000100"; -- 0084 sipush
|
49 |
|
|
when "00010010" => addr <= "00010000111"; -- 0087 ldc
|
50 |
|
|
when "00010011" => addr <= "00010001110"; -- 008e ldc_w
|
51 |
|
|
when "00011001" => addr <= "00010010110"; -- 0096 aload
|
52 |
|
|
when "00010111" => addr <= "00010010110"; -- 0096 fload
|
53 |
|
|
when "00010101" => addr <= "00010010110"; -- 0096 iload
|
54 |
|
|
when "00101010" => addr <= "00010011000"; -- 0098 aload_0
|
55 |
|
|
when "00100010" => addr <= "00010011000"; -- 0098 fload_0
|
56 |
|
|
when "00011010" => addr <= "00010011000"; -- 0098 iload_0
|
57 |
|
|
when "00101011" => addr <= "00010011001"; -- 0099 aload_1
|
58 |
|
|
when "00100011" => addr <= "00010011001"; -- 0099 fload_1
|
59 |
|
|
when "00011011" => addr <= "00010011001"; -- 0099 iload_1
|
60 |
|
|
when "00101100" => addr <= "00010011010"; -- 009a aload_2
|
61 |
|
|
when "00100100" => addr <= "00010011010"; -- 009a fload_2
|
62 |
|
|
when "00011100" => addr <= "00010011010"; -- 009a iload_2
|
63 |
|
|
when "00101101" => addr <= "00010011011"; -- 009b aload_3
|
64 |
|
|
when "00100101" => addr <= "00010011011"; -- 009b fload_3
|
65 |
|
|
when "00011101" => addr <= "00010011011"; -- 009b iload_3
|
66 |
|
|
when "00111010" => addr <= "00010011100"; -- 009c astore
|
67 |
|
|
when "00111000" => addr <= "00010011100"; -- 009c fstore
|
68 |
|
|
when "00110110" => addr <= "00010011100"; -- 009c istore
|
69 |
|
|
when "01001011" => addr <= "00010011110"; -- 009e astore_0
|
70 |
|
|
when "01000011" => addr <= "00010011110"; -- 009e fstore_0
|
71 |
|
|
when "00111011" => addr <= "00010011110"; -- 009e istore_0
|
72 |
|
|
when "01001100" => addr <= "00010011111"; -- 009f astore_1
|
73 |
|
|
when "01000100" => addr <= "00010011111"; -- 009f fstore_1
|
74 |
|
|
when "00111100" => addr <= "00010011111"; -- 009f istore_1
|
75 |
|
|
when "01001101" => addr <= "00010100000"; -- 00a0 astore_2
|
76 |
|
|
when "01000101" => addr <= "00010100000"; -- 00a0 fstore_2
|
77 |
|
|
when "00111101" => addr <= "00010100000"; -- 00a0 istore_2
|
78 |
|
|
when "01001110" => addr <= "00010100001"; -- 00a1 astore_3
|
79 |
|
|
when "01000110" => addr <= "00010100001"; -- 00a1 fstore_3
|
80 |
|
|
when "00111110" => addr <= "00010100001"; -- 00a1 istore_3
|
81 |
|
|
when "01010111" => addr <= "00010100010"; -- 00a2 pop
|
82 |
|
|
when "01011000" => addr <= "00010100011"; -- 00a3 pop2
|
83 |
|
|
when "01011001" => addr <= "00010100101"; -- 00a5 dup
|
84 |
|
|
when "01011010" => addr <= "00010100110"; -- 00a6 dup_x1
|
85 |
|
|
when "01011011" => addr <= "00010101011"; -- 00ab dup_x2
|
86 |
|
|
when "01011100" => addr <= "00010110010"; -- 00b2 dup2
|
87 |
|
|
when "01011101" => addr <= "00010111000"; -- 00b8 dup2_x1
|
88 |
|
|
when "01011110" => addr <= "00011000000"; -- 00c0 dup2_x2
|
89 |
|
|
when "01011111" => addr <= "00011001010"; -- 00ca swap
|
90 |
|
|
when "01100000" => addr <= "00011001110"; -- 00ce iadd
|
91 |
|
|
when "01100100" => addr <= "00011001111"; -- 00cf isub
|
92 |
|
|
when "01110100" => addr <= "00011010000"; -- 00d0 ineg
|
93 |
|
|
when "01111110" => addr <= "00011010100"; -- 00d4 iand
|
94 |
|
|
when "10000000" => addr <= "00011010101"; -- 00d5 ior
|
95 |
|
|
when "10000010" => addr <= "00011010110"; -- 00d6 ixor
|
96 |
|
|
when "01111000" => addr <= "00011010111"; -- 00d7 ishl
|
97 |
|
|
when "01111010" => addr <= "00011011000"; -- 00d8 ishr
|
98 |
|
|
when "01111100" => addr <= "00011011001"; -- 00d9 iushr
|
99 |
|
|
when "01101000" => addr <= "00011011010"; -- 00da imul
|
100 |
|
|
when "10000100" => addr <= "00011100110"; -- 00e6 iinc
|
101 |
|
|
when "10010010" => addr <= "00011101110"; -- 00ee i2c
|
102 |
|
|
when "11000110" => addr <= "00011110000"; -- 00f0 ifnull
|
103 |
|
|
when "11000111" => addr <= "00011110000"; -- 00f0 ifnonnull
|
104 |
|
|
when "10011001" => addr <= "00011110000"; -- 00f0 ifeq
|
105 |
|
|
when "10011010" => addr <= "00011110000"; -- 00f0 ifne
|
106 |
|
|
when "10011011" => addr <= "00011110000"; -- 00f0 iflt
|
107 |
|
|
when "10011100" => addr <= "00011110000"; -- 00f0 ifge
|
108 |
|
|
when "10011101" => addr <= "00011110000"; -- 00f0 ifgt
|
109 |
|
|
when "10011110" => addr <= "00011110000"; -- 00f0 ifle
|
110 |
|
|
when "10100101" => addr <= "00011110100"; -- 00f4 if_acmpeq
|
111 |
|
|
when "10100110" => addr <= "00011110100"; -- 00f4 if_acmpne
|
112 |
|
|
when "10011111" => addr <= "00011110100"; -- 00f4 if_icmpeq
|
113 |
|
|
when "10100000" => addr <= "00011110100"; -- 00f4 if_icmpne
|
114 |
|
|
when "10100001" => addr <= "00011110100"; -- 00f4 if_icmplt
|
115 |
|
|
when "10100010" => addr <= "00011110100"; -- 00f4 if_icmpge
|
116 |
|
|
when "10100011" => addr <= "00011110100"; -- 00f4 if_icmpgt
|
117 |
|
|
when "10100100" => addr <= "00011110100"; -- 00f4 if_icmple
|
118 |
|
|
when "10100111" => addr <= "00011111000"; -- 00f8 goto
|
119 |
|
|
when "11100000" => addr <= "00011111100"; -- 00fc getstatic_ref
|
120 |
|
|
when "10110010" => addr <= "00011111100"; -- 00fc getstatic
|
121 |
|
|
when "10110011" => addr <= "00100000011"; -- 0103 putstatic
|
122 |
|
|
when "11100010" => addr <= "00100001011"; -- 010b getfield_ref
|
123 |
|
|
when "10110100" => addr <= "00100001011"; -- 010b getfield
|
124 |
|
|
when "11101001" => addr <= "00100001110"; -- 010e jopsys_getfield
|
125 |
|
|
when "10110101" => addr <= "00100010011"; -- 0113 putfield
|
126 |
|
|
when "11101010" => addr <= "00100010111"; -- 0117 jopsys_putfield
|
127 |
|
|
when "10111100" => addr <= "00100011100"; -- 011c newarray
|
128 |
|
|
when "10111110" => addr <= "00100110011"; -- 0133 arraylength
|
129 |
|
|
when "01010100" => addr <= "00100111001"; -- 0139 bastore
|
130 |
|
|
when "01010101" => addr <= "00100111001"; -- 0139 castore
|
131 |
|
|
when "01010001" => addr <= "00100111001"; -- 0139 fastore
|
132 |
|
|
when "01001111" => addr <= "00100111001"; -- 0139 iastore
|
133 |
|
|
when "01010110" => addr <= "00100111001"; -- 0139 sastore
|
134 |
|
|
when "00110010" => addr <= "00100111111"; -- 013f aaload
|
135 |
|
|
when "00110011" => addr <= "00100111111"; -- 013f baload
|
136 |
|
|
when "00110100" => addr <= "00100111111"; -- 013f caload
|
137 |
|
|
when "00110000" => addr <= "00100111111"; -- 013f faload
|
138 |
|
|
when "00101110" => addr <= "00100111111"; -- 013f iaload
|
139 |
|
|
when "00110101" => addr <= "00100111111"; -- 013f saload
|
140 |
|
|
when "11000010" => addr <= "00101000100"; -- 0144 monitorenter
|
141 |
|
|
when "11000011" => addr <= "00101010110"; -- 0156 monitorexit
|
142 |
|
|
when "10110111" => addr <= "00101101010"; -- 016a invokespecial
|
143 |
|
|
when "10111000" => addr <= "00101101010"; -- 016a invokestatic
|
144 |
|
|
when "11011110" => addr <= "00101110010"; -- 0172 jopsys_invoke
|
145 |
|
|
when "10111001" => addr <= "00101110110"; -- 0176 invokeinterface
|
146 |
|
|
when "11101100" => addr <= "00110101000"; -- 01a8 invokesuper
|
147 |
|
|
when "10110110" => addr <= "00111010111"; -- 01d7 invokevirtual
|
148 |
|
|
when "10110000" => addr <= "01000111001"; -- 0239 areturn
|
149 |
|
|
when "10101110" => addr <= "01000111001"; -- 0239 freturn
|
150 |
|
|
when "10101100" => addr <= "01000111001"; -- 0239 ireturn
|
151 |
|
|
when "10101111" => addr <= "01001010000"; -- 0250 dreturn
|
152 |
|
|
when "10101101" => addr <= "01001010000"; -- 0250 lreturn
|
153 |
|
|
when "10110001" => addr <= "01001101001"; -- 0269 return
|
154 |
|
|
when "00010100" => addr <= "01010010010"; -- 0292 ldc2_w
|
155 |
|
|
when "00001001" => addr <= "01010100011"; -- 02a3 lconst_0
|
156 |
|
|
when "00001010" => addr <= "01010100101"; -- 02a5 lconst_1
|
157 |
|
|
when "10001000" => addr <= "01010100111"; -- 02a7 l2i
|
158 |
|
|
when "00100110" => addr <= "01010101010"; -- 02aa dload_0
|
159 |
|
|
when "00011110" => addr <= "01010101010"; -- 02aa lload_0
|
160 |
|
|
when "00100111" => addr <= "01010101100"; -- 02ac dload_1
|
161 |
|
|
when "00011111" => addr <= "01010101100"; -- 02ac lload_1
|
162 |
|
|
when "00101000" => addr <= "01010101110"; -- 02ae dload_2
|
163 |
|
|
when "00100000" => addr <= "01010101110"; -- 02ae lload_2
|
164 |
|
|
when "00101001" => addr <= "01010110000"; -- 02b0 dload_3
|
165 |
|
|
when "00100001" => addr <= "01010110000"; -- 02b0 lload_3
|
166 |
|
|
when "00011000" => addr <= "01010111011"; -- 02bb dload
|
167 |
|
|
when "00010110" => addr <= "01010111011"; -- 02bb lload
|
168 |
|
|
when "01000111" => addr <= "01011000110"; -- 02c6 dstore_0
|
169 |
|
|
when "00111111" => addr <= "01011000110"; -- 02c6 lstore_0
|
170 |
|
|
when "01001000" => addr <= "01011001000"; -- 02c8 dstore_1
|
171 |
|
|
when "01000000" => addr <= "01011001000"; -- 02c8 lstore_1
|
172 |
|
|
when "01001001" => addr <= "01011001010"; -- 02ca dstore_2
|
173 |
|
|
when "01000001" => addr <= "01011001010"; -- 02ca lstore_2
|
174 |
|
|
when "01001010" => addr <= "01011001100"; -- 02cc dstore_3
|
175 |
|
|
when "01000010" => addr <= "01011001100"; -- 02cc lstore_3
|
176 |
|
|
when "00111001" => addr <= "01011010111"; -- 02d7 dstore
|
177 |
|
|
when "00110111" => addr <= "01011010111"; -- 02d7 lstore
|
178 |
|
|
when "11100100" => addr <= "01011100010"; -- 02e2 getstatic_long
|
179 |
|
|
when "11100101" => addr <= "01011110010"; -- 02f2 putstatic_long
|
180 |
|
|
when "11100110" => addr <= "01100000011"; -- 0303 getfield_long
|
181 |
|
|
when "11100111" => addr <= "01100011101"; -- 031d putfield_long
|
182 |
|
|
when "01010000" => addr <= "01100111010"; -- 033a lastore
|
183 |
|
|
when "00101111" => addr <= "01101101010"; -- 036a laload
|
184 |
|
|
when "10111011" => addr <= "01110111110"; -- 03be new
|
185 |
|
|
when "10111101" => addr <= "01110111110"; -- 03be anewarray
|
186 |
|
|
when "11000000" => addr <= "01110111110"; -- 03be checkcast
|
187 |
|
|
when "11000001" => addr <= "01110111110"; -- 03be instanceof
|
188 |
|
|
when "11100011" => addr <= "01111011011"; -- 03db putfield_ref
|
189 |
|
|
when "11100001" => addr <= "01111011011"; -- 03db putstatic_ref
|
190 |
|
|
when "11010001" => addr <= "01111110011"; -- 03f3 jopsys_rd
|
191 |
|
|
when "11010011" => addr <= "01111110011"; -- 03f3 jopsys_rdmem
|
192 |
|
|
when "11010010" => addr <= "01111110111"; -- 03f7 jopsys_wr
|
193 |
|
|
when "11010100" => addr <= "01111110111"; -- 03f7 jopsys_wrmem
|
194 |
|
|
when "11010101" => addr <= "01111111100"; -- 03fc jopsys_rdint
|
195 |
|
|
when "11010110" => addr <= "01111111111"; -- 03ff jopsys_wrint
|
196 |
|
|
when "11010111" => addr <= "10000000010"; -- 0402 jopsys_getsp
|
197 |
|
|
when "11011000" => addr <= "10000000101"; -- 0405 jopsys_setsp
|
198 |
|
|
when "11011001" => addr <= "10000001001"; -- 0409 jopsys_getvp
|
199 |
|
|
when "11011010" => addr <= "10000001010"; -- 040a jopsys_setvp
|
200 |
|
|
when "11011011" => addr <= "10000001100"; -- 040c jopsys_int2ext
|
201 |
|
|
when "11011100" => addr <= "10000100111"; -- 0427 jopsys_ext2int
|
202 |
|
|
when "11101000" => addr <= "10001000011"; -- 0443 jopsys_memcpy
|
203 |
|
|
when "11011101" => addr <= "10001001000"; -- 0448 jopsys_nop
|
204 |
|
|
|
205 |
|
|
when others => addr <= "01110101011"; -- 03ab sys_noim
|
206 |
|
|
end case;
|
207 |
|
|
end process;
|
208 |
|
|
|
209 |
|
|
process(int_pend, exc_pend, addr) begin
|
210 |
|
|
|
211 |
|
|
q <= addr;
|
212 |
|
|
if exc_pend='1' then
|
213 |
|
|
q <= "01110011111"; -- 039f sys_exc
|
214 |
|
|
elsif int_pend='1' then
|
215 |
|
|
q <= "01110010101"; -- 0395 sys_int
|
216 |
|
|
end if;
|
217 |
|
|
end process;
|
218 |
|
|
|
219 |
|
|
end rtl;
|