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_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;
93 function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer;
94 end package ppc_fx_insns;
96 package body ppc_fx_insns is
97 function ppc_addi (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
99 return std_ulogic_vector(signed(ra) + signed(si));
102 function ppc_addic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
104 return std_logic_vector(resize(unsigned(ra), 65) + unsigned(resize(signed(si), 64)));
107 function ppc_adde (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
109 return std_logic_vector(resize(unsigned(ra), 65) + resize(unsigned(rb), 65) + carry);
112 function ppc_subfic (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
114 return std_logic_vector(unsigned(resize(signed(si), 64)) + resize(unsigned(not(ra)), 65) + 1);
117 function ppc_subfc (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
119 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + 1);
122 function ppc_subfe (ra, rb: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
124 return std_logic_vector(resize(unsigned(rb), 65) + resize(unsigned(not(ra)), 65) + carry);
127 function ppc_addze (ra: std_ulogic_vector(63 downto 0); carry: std_ulogic) return std_ulogic_vector is
129 return std_logic_vector(resize(unsigned(ra), 65) + carry);
132 function ppc_addis (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
134 return std_ulogic_vector(signed(ra) + shift_left(resize(signed(si), 32), 16));
137 function ppc_add (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
139 return std_ulogic_vector(signed(ra) + signed(rb));
142 function ppc_subf (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
144 return std_ulogic_vector(signed(rb) - signed(ra));
147 function ppc_neg (ra: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
149 return std_ulogic_vector(-signed(ra));
152 function ppc_andi (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
154 return rs and std_ulogic_vector(resize(unsigned(ui), 64));
157 function ppc_andis (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
159 return rs and std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
162 function ppc_ori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
164 return rs or std_ulogic_vector(resize(unsigned(ui), 64));
167 function ppc_oris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
169 return rs or std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
172 function ppc_xori (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
174 return rs xor std_ulogic_vector(resize(unsigned(ui), 64));
177 function ppc_xoris (rs: std_ulogic_vector(63 downto 0); ui: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
179 return rs xor std_ulogic_vector(shift_left(resize(unsigned(ui), 64), 16));
182 function ppc_and (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
187 function ppc_xor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
192 function ppc_nand (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
197 function ppc_or (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
202 function ppc_nor (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
207 function ppc_andc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
209 return rs and not(rb);
212 function ppc_eqv (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
214 return not(rs xor rb);
217 function ppc_orc (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
219 return rs or not(rb);
222 function ppc_extsb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
224 return std_ulogic_vector(resize(signed(rs(7 downto 0)), rs'length));
227 function ppc_extsh (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
229 return std_ulogic_vector(resize(signed(rs(15 downto 0)), rs'length));
232 function ppc_extsw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
234 return std_ulogic_vector(resize(signed(rs(31 downto 0)), rs'length));
237 function ppc_cntlzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
239 return std_ulogic_vector(to_unsigned(fls_32(rs(31 downto 0)), rs'length));
242 function ppc_cnttzw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
244 return std_ulogic_vector(to_unsigned(ffs_32(rs(31 downto 0)), rs'length));
247 function ppc_cntlzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
249 return std_ulogic_vector(to_unsigned(fls_64(rs), rs'length));
252 function ppc_cnttzd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
254 return std_ulogic_vector(to_unsigned(ffs_64(rs), rs'length));
257 function ppc_popcntb (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
258 variable ret: std_ulogic_vector (rs'range);
259 variable hi: integer;
260 variable lo: integer;
262 ret := (others => '0');
267 ret(hi downto lo) := popcnt8(rs(hi downto lo));
273 function ppc_popcntw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
274 variable ret: std_ulogic_vector (rs'range);
275 variable hi: integer;
276 variable lo: integer;
278 ret := (others => '0');
283 ret(hi downto lo) := popcnt32(rs(hi downto lo));
289 function ppc_popcntd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
294 function ppc_prtyd (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
295 variable tmp : std_ulogic;
296 variable ret : std_ulogic_vector(63 downto 0);
298 ret := (others => '0');
302 tmp := tmp xor rs(i*8);
309 function ppc_prtyw (rs: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
310 variable tmp : std_ulogic;
311 variable ret : std_ulogic_vector(63 downto 0);
313 ret := (others => '0');
317 tmp := tmp xor rs(i*8);
323 tmp := tmp xor rs(i*8);
330 function ppc_rlwinm (rs: std_ulogic_vector(63 downto 0); sh, mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
331 variable hi, lo : integer;
332 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
334 hi := 31 - to_integer(unsigned(mb));
335 lo := 31 - to_integer(unsigned(me));
336 tmp1 := rs(31 downto 0) & rs(31 downto 0);
337 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
338 tmp2 := (others => '0');
341 for i in 0 to 63 loop
342 if i <= hi or i >= lo then
347 for i in 0 to 63 loop
348 if i >= lo and i <= hi then
356 function ppc_rlwnm (rs, rb: std_ulogic_vector(63 downto 0); mb, me: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
357 variable hi, lo : integer;
358 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
359 variable n : integer;
361 hi := 31 - to_integer(unsigned(mb));
362 lo := 31 - to_integer(unsigned(me));
363 n := to_integer(unsigned(rb(4 downto 0)));
364 tmp1 := rs(31 downto 0) & rs(31 downto 0);
365 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), n));
366 tmp2 := (others => '0');
369 for i in 0 to 63 loop
370 if i <= hi or i >= lo then
375 for i in 0 to 63 loop
376 if i >= lo and i <= hi then
384 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
385 variable hi, lo : integer;
386 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
388 hi := 31 - to_integer(unsigned(mb));
389 lo := 31 - to_integer(unsigned(me));
390 tmp1 := rs(31 downto 0) & rs(31 downto 0);
391 tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1), to_integer(unsigned(sh))));
395 for i in 0 to 63 loop
396 if i <= hi or i >= lo then
401 for i in 0 to 63 loop
402 if i >= lo and i <= hi then
410 function ppc_rldicl (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
411 variable hi : integer;
412 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
414 hi := 63-to_integer(unsigned(mb));
415 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
416 tmp2 := (others => '0');
417 for i in 0 to 63 loop
425 function ppc_rldicr (rs: std_ulogic_vector(63 downto 0); sh, me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
426 variable lo : integer;
427 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
429 lo := 63-to_integer(unsigned(me));
430 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
431 tmp2 := (others => '0');
432 for i in 0 to 63 loop
440 function ppc_rldic (rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
441 variable hi, lo : integer;
442 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
444 hi := 63-to_integer(unsigned(mb));
445 lo := to_integer(unsigned(sh));
446 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(sh))));
447 tmp2 := (others => '0');
450 for i in 0 to 63 loop
451 if i <= hi or i >= lo then
456 for i in 0 to 63 loop
457 if i >= lo and i <= hi then
465 function ppc_rldcl (rs, rb: std_ulogic_vector(63 downto 0); mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
466 variable hi : integer;
467 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
469 hi := 63-to_integer(unsigned(mb));
470 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
471 tmp2 := (others => '0');
472 for i in 0 to 63 loop
480 function ppc_rldcr (rs, rb: std_ulogic_vector(63 downto 0); me: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
481 variable lo : integer;
482 variable tmp1, tmp2 : std_ulogic_vector(63 downto 0);
484 lo := 63-to_integer(unsigned(me));
485 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), to_integer(unsigned(rb(5 downto 0)))));
486 tmp2 := (others => '0');
487 for i in 0 to 63 loop
495 function ppc_rldimi (ra, rs: std_ulogic_vector(63 downto 0); sh, mb: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
496 variable hi, lo : integer;
497 variable tmp1, tmp2 : std_ulogic_vector(rs'range);
499 hi := 63-to_integer(unsigned(mb));
500 lo := to_integer(unsigned(sh));
501 tmp1 := std_ulogic_vector(rotate_left(unsigned(rs), lo));
505 for i in 0 to 63 loop
506 if i <= hi or i >= lo then
511 for i in 0 to 63 loop
512 if i >= lo and i <= hi then
520 function ppc_slw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
521 variable n : integer;
522 variable tmp : unsigned(31 downto 0);
524 n := to_integer(unsigned(rb(5 downto 0)));
525 tmp := shift_left(unsigned(rs(31 downto 0)), n);
527 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
530 function ppc_srw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
531 variable n : integer;
532 variable tmp : unsigned(31 downto 0);
534 n := to_integer(unsigned(rb(5 downto 0)));
535 tmp := shift_right(unsigned(rs(31 downto 0)), n);
537 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
540 function ppc_srawi (rs : std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
541 variable n : integer;
542 variable tmp : signed(31 downto 0);
543 variable mask : std_ulogic_vector(63 downto 0);
544 variable carry: std_ulogic;
546 n := to_integer(unsigned(sh));
547 tmp := shift_right(signed(rs(31 downto 0)), n);
549 mask := (others => '0');
550 for i in 0 to 63 loop
555 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(31);
557 return carry & std_ulogic_vector(resize(tmp, rs'length));
560 function ppc_sraw (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
561 variable n : natural;
562 variable tmp : signed(31 downto 0);
563 variable mask : std_ulogic_vector(63 downto 0);
564 variable carry: std_ulogic;
566 n := to_integer(unsigned(rb(5 downto 0)));
567 tmp := shift_right(signed(rs(31 downto 0)), n);
569 mask := (others => '0');
570 for i in 0 to 63 loop
575 carry := or (rs and mask) and rs(31);
576 return carry & std_ulogic_vector(resize(tmp, rs'length));
579 function ppc_sld (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
580 variable n : integer;
582 n := to_integer(unsigned(rb(6 downto 0)));
583 return std_ulogic_vector(shift_left(unsigned(rs), n));
586 function ppc_srd (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
587 variable n : integer;
589 n := to_integer(unsigned(rb(6 downto 0)));
590 return std_ulogic_vector(shift_right(unsigned(rs), n));
593 function ppc_sradi (rs: std_ulogic_vector(63 downto 0); sh: std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
594 variable n : integer;
595 variable carry: std_ulogic;
596 variable mask : std_ulogic_vector(63 downto 0);
598 n := to_integer(unsigned(sh));
600 mask := (others => '0');
601 for i in 0 to 63 loop
606 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
608 return carry & std_ulogic_vector(shift_right(signed(rs), n));
611 function ppc_srad (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
612 variable n : integer;
613 variable carry: std_ulogic;
614 variable mask : std_ulogic_vector(63 downto 0);
616 n := to_integer(unsigned(rb(6 downto 0)));
618 mask := (others => '0');
619 for i in 0 to 63 loop
624 carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
626 return carry & std_ulogic_vector(shift_right(signed(rs), n));
629 -- Not sure how to better communicate the top 64 bits of the result is unused
630 function ppc_mulld (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
631 variable tmp: signed(127 downto 0);
633 tmp := signed(ra) * signed(rb);
634 return std_ulogic_vector(tmp(63 downto 0));
637 -- Not sure how to better communicate the top 64 bits of the result is unused
638 function ppc_mulhd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
639 variable tmp: signed(127 downto 0);
641 tmp := signed(ra) * signed(rb);
642 return std_ulogic_vector(tmp(127 downto 64));
645 -- Not sure how to better communicate the top 64 bits of the result is unused
646 function ppc_mulhdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
647 variable tmp: unsigned(127 downto 0);
649 tmp := unsigned(ra) * unsigned(rb);
650 return std_ulogic_vector(tmp(127 downto 64));
653 -- Not sure how to better communicate the top 16 bits of the result is unused
654 function ppc_mulli (ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
655 variable tmp: signed(79 downto 0);
657 tmp := signed(ra) * signed(si);
658 return std_ulogic_vector(tmp(63 downto 0));
661 function ppc_mullw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
663 return std_ulogic_vector(signed(ra(31 downto 0)) * signed(rb(31 downto 0)));
666 function ppc_mulhw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
667 variable tmp: signed(63 downto 0);
669 tmp := signed(ra(31 downto 0)) * signed(rb(31 downto 0));
670 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
673 function ppc_mulhwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
674 variable tmp: unsigned(63 downto 0);
676 tmp := unsigned(ra(31 downto 0)) * unsigned(rb(31 downto 0));
677 return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
680 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
681 variable tmp: signed(ra'range);
685 tmp := resize(signed(ra(31 downto 0)), tmp'length);
688 return ppc_signed_compare(tmp, resize(signed(si), tmp'length));
691 function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
692 variable tmpa, tmpb: signed(ra'range);
697 tmpa := resize(signed(ra(31 downto 0)), ra'length);
698 tmpb := resize(signed(rb(31 downto 0)), ra'length);
701 return ppc_signed_compare(tmpa, tmpb);
704 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
705 variable tmp: unsigned(ra'range);
709 tmp := resize(unsigned(ra(31 downto 0)), tmp'length);
712 return ppc_unsigned_compare(tmp, resize(unsigned(si), tmp'length));
715 function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
716 variable tmpa, tmpb: unsigned(ra'range);
718 tmpa := unsigned(ra);
719 tmpb := unsigned(rb);
721 tmpa := resize(unsigned(ra(31 downto 0)), ra'length);
722 tmpb := resize(unsigned(rb(31 downto 0)), ra'length);
725 return ppc_unsigned_compare(tmpa, tmpb);
728 function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
729 variable ret: std_ulogic_vector (rs'range);
730 variable hi: integer;
731 variable lo: integer;
736 ret(hi downto lo) := cmp_one_byte(rs(hi downto lo), rb(hi downto lo));
743 function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
744 variable tmp: signed(31 downto 0);
746 tmp := signed(ra(31 downto 0)) / signed(rb(31 downto 0));
748 return (63 downto 32 => '0') & std_ulogic_vector(tmp);
751 function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
752 variable tmp: unsigned(63 downto 0) := (others => '0');
754 if unsigned(rb) /= 0 then
755 tmp := unsigned(ra) / unsigned(rb);
758 return std_ulogic_vector(tmp);
761 function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
762 variable tmp: signed(63 downto 0) := (others => '0');
764 if signed(rb) /= 0 then
765 tmp := signed(ra) / signed(rb);
768 return std_ulogic_vector(tmp);
771 function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
772 variable tmp: unsigned(31 downto 0) := (others => '0');
774 if unsigned(rb(31 downto 0)) /= 0 then
775 tmp := unsigned(ra(31 downto 0)) / unsigned(rb(31 downto 0));
778 return std_ulogic_vector(resize(tmp, ra'length));
781 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
782 variable crfield: integer;
783 variable crbit_match: std_ulogic;
784 variable ctr_not_zero: std_ulogic;
785 variable ctr_ok: std_ulogic;
786 variable cond_ok: std_ulogic;
787 variable ret: integer;
789 crfield := to_integer(unsigned(bi));
791 crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
792 -- We check this before it is decremented
793 ctr_not_zero := '1' when ctr /= x"0000000000000001" else '0';
794 ctr_ok := bo(4-2) or (ctr_not_zero xor bo(4-3));
795 cond_ok := bo(4-0) or crbit_match;
796 if ctr_ok = '1' and cond_ok = '1' then
804 function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer is
805 variable crfield: integer;
806 variable crbit_match: std_ulogic;
807 variable cond_ok: std_ulogic;
808 variable ret: integer;
810 crfield := to_integer(unsigned(bi));
812 crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
813 cond_ok := bo(4-0) or crbit_match;
814 if cond_ok = '1' then
821 end package body ppc_fx_insns;