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);
81 so: std_ulogic) return std_ulogic_vector;
82 function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
83 so: std_ulogic) return std_ulogic_vector;
84 function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
85 so: std_ulogic) return std_ulogic_vector;
86 function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
87 so: std_ulogic) return std_ulogic_vector;
89 function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
91 function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
92 function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
93 function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
94 function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
96 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 std_ulogic;
97 end package ppc_fx_insns;
99 package body ppc_fx_insns is
100 function ppc_addi (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
102 return std_ulogic_vector(signed(ra) + signed(si));
105 function ppc_addic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
107 return std_logic_vector(resize(unsigned(ra), 65) + unsigned(resize(signed(si), 64)));
110 function ppc_adde (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
112 return std_logic_vector(resize(unsigned(ra), 65) + resize(unsigned(rb), 65) + carry);
115 function ppc_subfic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
117 return std_logic_vector(unsigned(resize(signed(si), 64)) + resize(unsigned(not(ra)), 65) + 1);
120 function ppc_subfc (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
122 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + 1);
125 function ppc_subfe (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
127 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + carry);
130 function ppc_addze (ra: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
132 return std_logic_vector(resize(unsigned(ra), 65) + carry);
135 function ppc_addis (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
137 return std_ulogic_vector(signed(ra) + shift_left(resize(signed(si), 32), 16));
140 function ppc_add (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
142 return std_ulogic_vector(signed(ra) + signed(rb));
145 function ppc_subf (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
147 return std_ulogic_vector(signed(rb) - signed(ra));
150 function ppc_neg (ra: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
152 return std_ulogic_vector(-signed(ra));
155 function ppc_andi (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
157 return rs and std_ulogic_vector(resize(unsigned(ui), 64));
160 function ppc_andis (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
162 return rs and std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
165 function ppc_ori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
167 return rs or std_ulogic_vector(resize(unsigned(ui), 64));
170 function ppc_oris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
172 return rs or std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
175 function ppc_xori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
177 return rs xor std_ulogic_vector(resize(unsigned(ui), 64));
180 function ppc_xoris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
182 return rs xor std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
185 function ppc_and (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
190 function ppc_xor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
195 function ppc_nand (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
200 function ppc_or (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
205 function ppc_nor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
210 function ppc_andc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
212 return rs and not(rb);
215 function ppc_eqv (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
217 return not(rs xor rb);
220 function ppc_orc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
222 return rs or not(rb);
225 function ppc_extsb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
227 return std_ulogic_vector(resize(signed(rs(7 downto 0)), rs'length));
230 function ppc_extsh (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
232 return std_ulogic_vector(resize(signed(rs(15 downto 0)), rs'length));
235 function ppc_extsw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
237 return std_ulogic_vector(resize(signed(rs(31 downto 0)), rs'length));
240 function ppc_cntlzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
242 return std_ulogic_vector(to_unsigned(fls_32(rs(31 downto 0)), rs'length));
245 function ppc_cnttzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
247 return std_ulogic_vector(to_unsigned(ffs_32(rs(31 downto 0)), rs'length));
250 function ppc_cntlzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
252 return std_ulogic_vector(to_unsigned(fls_64(rs), rs'length));
255 function ppc_cnttzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
257 return std_ulogic_vector(to_unsigned(ffs_64(rs), rs'length));
260 function ppc_popcntb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
261 variable ret: std_ulogic_vector (rs'range);
262 variable hi: integer;
263 variable lo: integer;
265 ret := (others => '0');
270 ret(hi downto lo) := popcnt8(rs(hi downto lo));
276 function ppc_popcntw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
277 variable ret: std_ulogic_vector (rs'range);
278 variable hi: integer;
279 variable lo: integer;
281 ret := (others => '0');
286 ret(hi downto lo) := popcnt32(rs(hi downto lo));
292 function ppc_popcntd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
297 function ppc_prtyd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
298 variable tmp : std_ulogic;
299 variable ret : std_ulogic_vector(63 downto 0);
301 ret := (others => '0');
305 tmp := tmp xor rs(i*8);
312 function ppc_prtyw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
313 variable tmp : std_ulogic;
314 variable ret : std_ulogic_vector(63 downto 0);
316 ret := (others => '0');
320 tmp := tmp xor rs(i*8);
326 tmp := tmp xor rs(i*8);
333 function ppc_rlwinm (rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
334 variable hi, lo : integer;
335 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
337 hi := 31 - to_integer(unsigned(mb));
338 lo := 31 - to_integer(unsigned(me));
339 tmp1 := rs(31 downto 0) & rs(31 downto 0);
340 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
341 tmp2 := (others => '0');
344 for i in 0 to 63 loop
345 if i <= hi or i >= lo then
350 for i in 0 to 63 loop
351 if i >= lo and i <= hi then
359 function ppc_rlwnm (rs, rb: std_ulogic_vector(63 downto 0); mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
360 variable hi, lo : integer;
361 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
362 variable n : integer;
364 hi := 31 - to_integer(unsigned(mb));
365 lo := 31 - to_integer(unsigned(me));
366 n := to_integer(unsigned(rb(4 downto 0)));
367 tmp1 := rs(31 downto 0) & rs(31 downto 0);
368 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), n));
369 tmp2 := (others => '0');
372 for i in 0 to 63 loop
373 if i <= hi or i >= lo then
378 for i in 0 to 63 loop
379 if i >= lo and i <= hi then
387 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
388 variable hi, lo : integer;
389 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
391 hi := 31 - to_integer(unsigned(mb));
392 lo := 31 - to_integer(unsigned(me));
393 tmp1 := rs(31 downto 0) & rs(31 downto 0);
394 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
398 for i in 0 to 63 loop
399 if i <= hi or i >= lo then
404 for i in 0 to 63 loop
405 if i >= lo and i <= hi then
413 function ppc_rldicl (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
414 variable hi : integer;
415 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
417 hi := 63-to_integer(unsigned(mb));
418 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
419 tmp2 := (others => '0');
420 for i in 0 to 63 loop
428 function ppc_rldicr (rs: std_ulogic_vector(63 downto 0); sh, me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
429 variable lo : integer;
430 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
432 lo := 63-to_integer(unsigned(me));
433 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
434 tmp2 := (others => '0');
435 for i in 0 to 63 loop
443 function ppc_rldic (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
444 variable hi, lo : integer;
445 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
447 hi := 63-to_integer(unsigned(mb));
448 lo := to_integer(unsigned(sh));
449 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
450 tmp2 := (others => '0');
453 for i in 0 to 63 loop
454 if i <= hi or i >= lo then
459 for i in 0 to 63 loop
460 if i >= lo and i <= hi then
468 function ppc_rldcl (rs, rb: std_ulogic_vector(63 downto 0); mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
469 variable hi : integer;
470 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
472 hi := 63-to_integer(unsigned(mb));
473 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
474 tmp2 := (others => '0');
475 for i in 0 to 63 loop
483 function ppc_rldcr (rs, rb: std_ulogic_vector(63 downto 0); me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
484 variable lo : integer;
485 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
487 lo := 63-to_integer(unsigned(me));
488 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
489 tmp2 := (others => '0');
490 for i in 0 to 63 loop
498 function ppc_rldimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
499 variable hi, lo : integer;
500 variable tmp1, tmp2 : std_ulogic_vector(rs'range);
502 hi := 63-to_integer(unsigned(mb));
503 lo := to_integer(unsigned(sh));
504 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), lo));
508 for i in 0 to 63 loop
509 if i <= hi or i >= lo then
514 for i in 0 to 63 loop
515 if i >= lo and i <= hi then
523 function ppc_slw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
524 variable n : integer;
525 variable tmp : unsigned(31 downto 0);
527 n := to_integer(unsigned(rb(5 downto 0)));
528 tmp := shift_left(unsigned(rs(31 downto 0)), n);
530 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
533 function ppc_srw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
534 variable n : integer;
535 variable tmp : unsigned(31 downto 0);
537 n := to_integer(unsigned(rb(5 downto 0)));
538 tmp := shift_right(unsigned(rs(31 downto 0)), n);
540 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
543 function ppc_srawi (rs : std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
544 variable n : integer;
545 variable tmp : signed(31 downto 0);
546 variable mask : std_ulogic_vector(63 downto 0);
547 variable carry: std_ulogic;
549 n := to_integer(unsigned(sh));
550 tmp := shift_right(signed(rs(31 downto 0)), n);
552 mask := (others => '0');
553 for i in 0 to 63 loop
558 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(31);
560 return carry & std_ulogic_vector(resize(tmp, rs'length));
563 function ppc_sraw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
564 variable n : natural;
565 variable tmp : signed(31 downto 0);
566 variable mask : std_ulogic_vector(63 downto 0);
567 variable carry: std_ulogic;
569 n := to_integer(unsigned(rb(5 downto 0)));
570 tmp := shift_right(signed(rs(31 downto 0)), n);
572 mask := (others => '0');
573 for i in 0 to 63 loop
578 carry := or (rs and mask) and rs(31);
579 return carry & std_ulogic_vector(resize(tmp, rs'length));
582 function ppc_sld (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
583 variable n : integer;
585 n := to_integer(unsigned(rb(6 downto 0)));
586 return std_ulogic_vector(shift_left(unsigned(rs), n));
589 function ppc_srd (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
590 variable n : integer;
592 n := to_integer(unsigned(rb(6 downto 0)));
593 return std_ulogic_vector(shift_right(unsigned(rs), n));
596 function ppc_sradi (rs: std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
597 variable n : integer;
598 variable carry: std_ulogic;
599 variable mask : std_ulogic_vector(63 downto 0);
601 n := to_integer(unsigned(sh));
603 mask := (others => '0');
604 for i in 0 to 63 loop
609 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
611 return carry & std_ulogic_vector(shift_right(signed(rs), n));
614 function ppc_srad (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
615 variable n : integer;
616 variable carry: std_ulogic;
617 variable mask : std_ulogic_vector(63 downto 0);
619 n := to_integer(unsigned(rb(6 downto 0)));
621 mask := (others => '0');
622 for i in 0 to 63 loop
627 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
629 return carry & std_ulogic_vector(shift_right(signed(rs), n));
632 -- Not sure how to better communicate the top 64 bits of the result is unused
633 function ppc_mulld (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
634 variable tmp: signed(127 downto 0);
636 tmp := signed(ra) * signed(rb);
637 return std_ulogic_vector(tmp(63 downto 0));
640 -- Not sure how to better communicate the top 64 bits of the result is unused
641 function ppc_mulhd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
642 variable tmp: signed(127 downto 0);
644 tmp := signed(ra) * signed(rb);
645 return std_ulogic_vector(tmp(127 downto 64));
648 -- Not sure how to better communicate the top 64 bits of the result is unused
649 function ppc_mulhdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
650 variable tmp: unsigned(127 downto 0);
652 tmp := unsigned(ra) * unsigned(rb);
653 return std_ulogic_vector(tmp(127 downto 64));
656 -- Not sure how to better communicate the top 16 bits of the result is unused
657 function ppc_mulli (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
658 variable tmp: signed(79 downto 0);
660 tmp := signed(ra) * signed(si);
661 return std_ulogic_vector(tmp(63 downto 0));
664 function ppc_mullw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
666 return std_ulogic_vector(signed(ra(31 downto 0)) * signed(rb(31 downto 0)));
669 function ppc_mulhw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
670 variable tmp: signed(63 downto 0);
672 tmp := signed(ra(31 downto 0)) * signed(rb(31 downto 0));
673 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
676 function ppc_mulhwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
677 variable tmp: unsigned(63 downto 0);
679 tmp := unsigned(ra(31 downto 0)) * unsigned(rb(31 downto 0));
680 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
683 function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
684 so: std_ulogic) return std_ulogic_vector is
685 variable tmp: signed(ra'range);
689 tmp := resize(signed(ra(31 downto 0)), tmp'length);
692 return ppc_signed_compare(tmp, resize(signed(si), tmp'length), so);
695 function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
696 so: std_ulogic) return std_ulogic_vector is
697 variable tmpa, tmpb: signed(ra'range);
702 tmpa := resize(signed(ra(31 downto 0)), ra'length);
703 tmpb := resize(signed(rb(31 downto 0)), ra'length);
706 return ppc_signed_compare(tmpa, tmpb, so);
709 function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
710 so: std_ulogic) return std_ulogic_vector is
711 variable tmp: unsigned(ra'range);
715 tmp := resize(unsigned(ra(31 downto 0)), tmp'length);
718 return ppc_unsigned_compare(tmp, resize(unsigned(si), tmp'length), so);
721 function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
722 so: std_ulogic) return std_ulogic_vector is
723 variable tmpa, tmpb: unsigned(ra'range);
725 tmpa := unsigned(ra);
726 tmpb := unsigned(rb);
728 tmpa := resize(unsigned(ra(31 downto 0)), ra'length);
729 tmpb := resize(unsigned(rb(31 downto 0)), ra'length);
732 return ppc_unsigned_compare(tmpa, tmpb, so);
735 function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
736 variable ret: std_ulogic_vector (rs'range);
737 variable hi: integer;
738 variable lo: integer;
743 ret(hi downto lo) := cmp_one_byte(rs(hi downto lo), rb(hi downto lo));
750 function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
751 variable tmp: signed(31 downto 0);
753 tmp := signed(ra(31 downto 0)) / signed(rb(31 downto 0));
755 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
758 function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
759 variable tmp: unsigned(63 downto 0) := (others => '0');
761 if unsigned(rb) /= 0 then
762 tmp := unsigned(ra) / unsigned(rb);
765 return std_ulogic_vector(tmp);
768 function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
769 variable tmp: signed(63 downto 0) := (others => '0');
771 if signed(rb) /= 0 then
772 tmp := signed(ra) / signed(rb);
775 return std_ulogic_vector(tmp);
778 function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
779 variable tmp: unsigned(31 downto 0) := (others => '0');
781 if unsigned(rb(31 downto 0)) /= 0 then
782 tmp := unsigned(ra(31 downto 0)) / unsigned(rb(31 downto 0));
785 return std_ulogic_vector(resize(tmp, ra'length));
788 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 std_ulogic is
789 variable crfield: integer;
790 variable crbit_match: std_ulogic;
791 variable ctr_not_zero: std_ulogic;
792 variable ctr_ok: std_ulogic;
793 variable cond_ok: std_ulogic;
795 crfield := to_integer(unsigned(bi));
797 crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
798 -- We check this before it is decremented
799 ctr_not_zero := '1' when ctr /= x"0000000000000001" else '0';
800 ctr_ok := bo(4-2) or (ctr_not_zero xor bo(4-3));
801 cond_ok := bo(4-0) or crbit_match;
802 return ctr_ok and cond_ok;
805 end package body ppc_fx_insns;