2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
8 package ppc_fx_insns is
9 function ppc_addi (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
10 function ppc_addis (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
11 function ppc_add (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
12 function ppc_subf (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
13 function ppc_neg (ra: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
15 function ppc_addic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
16 function ppc_adde (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector;
17 function ppc_subfic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
18 function ppc_subfc (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
19 function ppc_subfe (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector;
20 function ppc_addze (ra: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector;
22 function ppc_andi (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
23 function ppc_andis (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
24 function ppc_ori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
25 function ppc_oris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
26 function ppc_xori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
27 function ppc_xoris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
28 function ppc_and (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
29 function ppc_xor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
30 function ppc_nand (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
31 function ppc_or (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
32 function ppc_nor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
33 function ppc_andc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
34 function ppc_eqv (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
35 function ppc_orc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
37 function ppc_extsb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
38 function ppc_extsh (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
39 function ppc_extsw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
41 function ppc_cntlzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
42 function ppc_cnttzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
43 function ppc_cntlzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
44 function ppc_cnttzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
46 function ppc_popcntb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
47 function ppc_popcntw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
48 function ppc_popcntd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
50 function ppc_prtyd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
51 function ppc_prtyw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
53 function ppc_rlwinm (rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector;
54 function ppc_rlwnm (rs, rb: std_ulogic_vector(63 downto 0); mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector;
55 function ppc_rlwimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector;
56 function ppc_rldicl (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
57 function ppc_rldicr (rs: std_ulogic_vector(63 downto 0); sh, me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
58 function ppc_rldic (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
59 function ppc_rldcl (rs, rb: std_ulogic_vector(63 downto 0); mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
60 function ppc_rldcr (rs, rb: std_ulogic_vector(63 downto 0); me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
61 function ppc_rldimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
63 function ppc_slw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
64 function ppc_srw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
65 function ppc_srawi (rs : std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
66 function ppc_sraw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
67 function ppc_sld (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
68 function ppc_srd (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
69 function ppc_sradi (rs: std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector;
70 function ppc_srad (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
72 function ppc_mulld (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
73 function ppc_mulhd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
74 function ppc_mulhdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
75 function ppc_mulli (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
76 function ppc_mullw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
77 function ppc_mulhw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
78 function ppc_mulhwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
80 function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
81 function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
82 function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
83 function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
85 function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
87 function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
88 function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
89 function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
90 function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
92 function ppc_b (nia: std_ulogic_vector(63 downto 0); bd: std_ulogic_vector(23 downto 0)) return std_ulogic_vector;
93 function ppc_bc_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0); ctr: std_ulogic_vector(63 downto 0)) return integer;
94 function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer;
95 end package ppc_fx_insns;
97 package body ppc_fx_insns is
98 function ppc_addi (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
100 return std_ulogic_vector(signed(ra) + signed(si));
103 function ppc_addic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
105 return std_logic_vector(resize(unsigned(ra), 65) + unsigned(resize(signed(si), 64)));
108 function ppc_adde (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
110 return std_logic_vector(resize(unsigned(ra), 65) + resize(unsigned(rb), 65) + carry);
113 function ppc_subfic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
115 return std_logic_vector(unsigned(resize(signed(si), 64)) + resize(unsigned(not(ra)), 65) + 1);
118 function ppc_subfc (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
120 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + 1);
123 function ppc_subfe (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
125 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + carry);
128 function ppc_addze (ra: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
130 return std_logic_vector(resize(unsigned(ra), 65) + carry);
133 function ppc_addis (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
135 return std_ulogic_vector(signed(ra) + shift_left(resize(signed(si), 32), 16));
138 function ppc_add (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
140 return std_ulogic_vector(signed(ra) + signed(rb));
143 function ppc_subf (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
145 return std_ulogic_vector(signed(rb) - signed(ra));
148 function ppc_neg (ra: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
150 return std_ulogic_vector(-signed(ra));
153 function ppc_andi (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
155 return rs and std_ulogic_vector(resize(unsigned(ui), 64));
158 function ppc_andis (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
160 return rs and std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
163 function ppc_ori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
165 return rs or std_ulogic_vector(resize(unsigned(ui), 64));
168 function ppc_oris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
170 return rs or std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
173 function ppc_xori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
175 return rs xor std_ulogic_vector(resize(unsigned(ui), 64));
178 function ppc_xoris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
180 return rs xor std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
183 function ppc_and (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
188 function ppc_xor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
193 function ppc_nand (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
198 function ppc_or (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
203 function ppc_nor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
208 function ppc_andc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
210 return rs and not(rb);
213 function ppc_eqv (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
215 return not(rs xor rb);
218 function ppc_orc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
220 return rs or not(rb);
223 function ppc_extsb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
225 return std_ulogic_vector(resize(signed(rs(7 downto 0)), rs'length));
228 function ppc_extsh (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
230 return std_ulogic_vector(resize(signed(rs(15 downto 0)), rs'length));
233 function ppc_extsw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
235 return std_ulogic_vector(resize(signed(rs(31 downto 0)), rs'length));
238 function ppc_cntlzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
240 return std_ulogic_vector(to_unsigned(fls_32(rs(31 downto 0)), rs'length));
243 function ppc_cnttzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
245 return std_ulogic_vector(to_unsigned(ffs_32(rs(31 downto 0)), rs'length));
248 function ppc_cntlzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
250 return std_ulogic_vector(to_unsigned(fls_64(rs), rs'length));
253 function ppc_cnttzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
255 return std_ulogic_vector(to_unsigned(ffs_64(rs), rs'length));
258 function ppc_popcntb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
259 variable ret: std_ulogic_vector (rs'range);
260 variable hi: integer;
261 variable lo: integer;
263 ret := (others => '0');
268 ret(hi downto lo) := popcnt8(rs(hi downto lo));
274 function ppc_popcntw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
275 variable ret: std_ulogic_vector (rs'range);
276 variable hi: integer;
277 variable lo: integer;
279 ret := (others => '0');
284 ret(hi downto lo) := popcnt32(rs(hi downto lo));
290 function ppc_popcntd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
295 function ppc_prtyd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
296 variable tmp : std_ulogic;
297 variable ret : std_ulogic_vector(63 downto 0);
299 ret := (others => '0');
303 tmp := tmp xor rs(i*8);
310 function ppc_prtyw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
311 variable tmp : std_ulogic;
312 variable ret : std_ulogic_vector(63 downto 0);
314 ret := (others => '0');
318 tmp := tmp xor rs(i*8);
324 tmp := tmp xor rs(i*8);
331 function ppc_rlwinm (rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
332 variable hi, lo : integer;
333 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
335 hi := 31 - to_integer(unsigned(mb));
336 lo := 31 - to_integer(unsigned(me));
337 tmp1 := rs(31 downto 0) & rs(31 downto 0);
338 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
339 tmp2 := (others => '0');
342 tmp2(63 downto lo) := tmp1(63 downto lo);
343 tmp2(hi downto 0) := tmp1(hi downto 0);
345 tmp2(hi downto lo) := tmp1(hi downto lo);
350 function ppc_rlwnm (rs, rb: std_ulogic_vector(63 downto 0); mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
351 variable hi, lo : integer;
352 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
353 variable n : integer;
355 hi := 31 - to_integer(unsigned(mb));
356 lo := 31 - to_integer(unsigned(me));
357 n := to_integer(unsigned(rb(4 downto 0)));
358 tmp1 := rs(31 downto 0) & rs(31 downto 0);
359 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), n));
360 tmp2 := (others => '0');
363 tmp2(63 downto lo) := tmp1(63 downto lo);
364 tmp2(hi downto 0) := tmp1(hi downto 0);
366 tmp2(hi downto lo) := tmp1(hi downto lo);
371 function ppc_rlwimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
372 variable hi, lo : integer;
373 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
375 hi := 31 - to_integer(unsigned(mb));
376 lo := 31 - to_integer(unsigned(me));
377 tmp1 := rs(31 downto 0) & rs(31 downto 0);
378 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
382 tmp2(63 downto lo) := tmp1(63 downto lo);
383 tmp2(hi downto 0) := tmp1(hi downto 0);
385 tmp2(hi downto lo) := tmp1(hi downto lo);
390 function ppc_rldicl (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
391 variable hi : integer;
392 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
394 hi := 63-to_integer(unsigned(mb));
395 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
396 tmp2 := (others => '0');
397 tmp2(hi downto 0) := tmp1(hi downto 0);
401 function ppc_rldicr (rs: std_ulogic_vector(63 downto 0); sh, me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
402 variable lo : integer;
403 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
405 lo := 63-to_integer(unsigned(me));
406 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
407 tmp2 := (others => '0');
408 tmp2(63 downto lo) := tmp1(63 downto lo);
412 function ppc_rldic (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
413 variable hi, lo : integer;
414 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
416 hi := 63-to_integer(unsigned(mb));
417 lo := to_integer(unsigned(sh));
418 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
419 tmp2 := (others => '0');
422 tmp2(63 downto lo) := tmp1(63 downto lo);
423 tmp2(hi downto 0) := tmp1(hi downto 0);
425 tmp2(hi downto lo) := tmp1(hi downto lo);
430 function ppc_rldcl (rs, rb: std_ulogic_vector(63 downto 0); mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
431 variable hi : integer;
432 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
434 hi := 63-to_integer(unsigned(mb));
435 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
436 tmp2 := (others => '0');
437 tmp2(hi downto 0) := tmp1(hi downto 0);
441 function ppc_rldcr (rs, rb: std_ulogic_vector(63 downto 0); me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
442 variable lo : integer;
443 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
445 lo := 63-to_integer(unsigned(me));
446 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
447 tmp2 := (others => '0');
448 tmp2(63 downto lo) := tmp1(63 downto lo);
452 function ppc_rldimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
453 variable hi, lo : integer;
454 variable tmp1, tmp2 : std_ulogic_vector(rs'range);
456 hi := 63-to_integer(unsigned(mb));
457 lo := to_integer(unsigned(sh));
458 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), lo));
462 tmp2(63 downto lo) := tmp1(63 downto lo);
463 tmp2(hi downto 0) := tmp1(hi downto 0);
465 tmp2(hi downto lo) := tmp1(hi downto lo);
470 function ppc_slw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
471 variable n : integer;
472 variable tmp : unsigned(31 downto 0);
474 n := to_integer(unsigned(rb(5 downto 0)));
475 tmp := shift_left(unsigned(rs(31 downto 0)), n);
477 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
480 function ppc_srw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
481 variable n : integer;
482 variable tmp : unsigned(31 downto 0);
484 n := to_integer(unsigned(rb(5 downto 0)));
485 tmp := shift_right(unsigned(rs(31 downto 0)), n);
487 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
490 function ppc_srawi (rs : std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
491 variable n : integer;
492 variable tmp : signed(31 downto 0);
493 variable carry: std_ulogic;
495 n := to_integer(unsigned(sh));
496 tmp := shift_right(signed(rs(31 downto 0)), n);
498 carry := or rs(n-1 downto 0) and rs(31);
500 return carry & std_ulogic_vector(resize(tmp, rs'length));
503 function ppc_sraw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
504 variable n : natural;
505 variable tmp : signed(31 downto 0);
506 variable carry: std_ulogic;
508 n := to_integer(unsigned(rb(5 downto 0)));
509 tmp := shift_right(signed(rs(31 downto 0)), n);
511 carry := or rs(n-1 downto 0) and rs(31);
513 return carry & std_ulogic_vector(resize(tmp, rs'length));
516 function ppc_sld (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
517 variable n : integer;
519 n := to_integer(unsigned(rb(6 downto 0)));
520 return std_ulogic_vector(shift_left(unsigned(rs), n));
523 function ppc_srd (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
524 variable n : integer;
526 n := to_integer(unsigned(rb(6 downto 0)));
527 return std_ulogic_vector(shift_right(unsigned(rs), n));
530 function ppc_sradi (rs: std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
531 variable n : integer;
532 variable carry: std_ulogic;
534 n := to_integer(unsigned(sh));
536 carry := or rs(n-1 downto 0) and rs(63);
538 return carry & std_ulogic_vector(shift_right(signed(rs), n));
541 function ppc_srad (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
542 variable n : integer;
543 variable carry: std_ulogic;
545 n := to_integer(unsigned(rb(6 downto 0)));
547 carry := or rs(n-1 downto 0) and rs(63);
549 return carry & std_ulogic_vector(shift_right(signed(rs), n));
552 -- Not sure how to better communicate the top 64 bits of the result is unused
553 function ppc_mulld (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
554 variable tmp: signed(127 downto 0);
556 tmp := signed(ra) * signed(rb);
557 return std_ulogic_vector(tmp(63 downto 0));
560 -- Not sure how to better communicate the top 64 bits of the result is unused
561 function ppc_mulhd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
562 variable tmp: signed(127 downto 0);
564 tmp := signed(ra) * signed(rb);
565 return std_ulogic_vector(tmp(127 downto 64));
568 -- Not sure how to better communicate the top 64 bits of the result is unused
569 function ppc_mulhdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
570 variable tmp: unsigned(127 downto 0);
572 tmp := unsigned(ra) * unsigned(rb);
573 return std_ulogic_vector(tmp(127 downto 64));
576 -- Not sure how to better communicate the top 16 bits of the result is unused
577 function ppc_mulli (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
578 variable tmp: signed(79 downto 0);
580 tmp := signed(ra) * signed(si);
581 return std_ulogic_vector(tmp(63 downto 0));
584 function ppc_mullw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
586 return std_ulogic_vector(signed(ra(31 downto 0)) * signed(rb(31 downto 0)));
589 function ppc_mulhw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
590 variable tmp: signed(63 downto 0);
592 tmp := signed(ra(31 downto 0)) * signed(rb(31 downto 0));
593 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
596 function ppc_mulhwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
597 variable tmp: unsigned(63 downto 0);
599 tmp := unsigned(ra(31 downto 0)) * unsigned(rb(31 downto 0));
600 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
603 function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
604 variable tmp: signed(ra'range);
608 tmp := resize(signed(ra(31 downto 0)), tmp'length);
611 return ppc_signed_compare(tmp, resize(signed(si), tmp'length));
614 function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
615 variable tmpa, tmpb: signed(ra'range);
620 tmpa := resize(signed(ra(31 downto 0)), ra'length);
621 tmpb := resize(signed(rb(31 downto 0)), ra'length);
624 return ppc_signed_compare(tmpa, tmpb);
627 function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
628 variable tmp: unsigned(ra'range);
632 tmp := resize(unsigned(ra(31 downto 0)), tmp'length);
635 return ppc_unsigned_compare(tmp, resize(unsigned(si), tmp'length));
638 function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
639 variable tmpa, tmpb: unsigned(ra'range);
641 tmpa := unsigned(ra);
642 tmpb := unsigned(rb);
644 tmpa := resize(unsigned(ra(31 downto 0)), ra'length);
645 tmpb := resize(unsigned(rb(31 downto 0)), ra'length);
648 return ppc_unsigned_compare(tmpa, tmpb);
651 function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
652 variable ret: std_ulogic_vector (rs'range);
653 variable hi: integer;
654 variable lo: integer;
659 ret(hi downto lo) := cmp_one_byte(rs(hi downto lo), rb(hi downto lo));
666 function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
667 variable tmp: signed(31 downto 0);
669 tmp := signed(ra(31 downto 0)) / signed(rb(31 downto 0));
671 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
674 function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
675 variable tmp: unsigned(63 downto 0) := (others => '0');
677 if unsigned(rb) /= 0 then
678 tmp := unsigned(ra) / unsigned(rb);
681 return std_ulogic_vector(tmp);
684 function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
685 variable tmp: signed(63 downto 0) := (others => '0');
687 if signed(rb) /= 0 then
688 tmp := signed(ra) / signed(rb);
691 return std_ulogic_vector(tmp);
694 function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
695 variable tmp: unsigned(31 downto 0) := (others => '0');
697 if unsigned(rb(31 downto 0)) /= 0 then
698 tmp := unsigned(ra(31 downto 0)) / unsigned(rb(31 downto 0));
701 return std_ulogic_vector(resize(tmp, ra'length));
704 function ppc_b (nia: std_ulogic_vector(63 downto 0); bd: std_ulogic_vector(23 downto 0)) return std_ulogic_vector is
706 return std_ulogic_vector(signed(nia) + signed(bd & "00"));
709 function ppc_bc_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0); ctr: std_ulogic_vector(63 downto 0)) return integer is
710 variable crfield: integer;
711 variable crbit_match: std_ulogic;
712 variable ctr_not_zero: std_ulogic;
713 variable ctr_ok: std_ulogic;
714 variable cond_ok: std_ulogic;
715 variable ret: integer;
717 crfield := to_integer(unsigned(bi));
719 crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
720 -- We check this before it is decremented
721 ctr_not_zero := '1' when ctr /= x"0000000000000001" else '0';
722 ctr_ok := bo(4-2) or (ctr_not_zero xor bo(4-3));
723 cond_ok := bo(4-0) or crbit_match;
724 if ctr_ok = '1' and cond_ok = '1' then
732 function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer is
733 variable crfield: integer;
734 variable crbit_match: std_ulogic;
735 variable cond_ok: std_ulogic;
736 variable ret: integer;
738 crfield := to_integer(unsigned(bi));
740 crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
741 cond_ok := bo(4-0) or crbit_match;
742 if cond_ok = '1' then
749 end package body ppc_fx_insns;