Add Tercel PHY reset synchronization
[microwatt.git] / ppc_fx_insns.vhdl
index 407881f805c0ad2038152bd18ae3031ccad3bbd9..c34a8849db743c09545a4ceb968e45a9cbb6f524 100644 (file)
@@ -77,20 +77,25 @@ package ppc_fx_insns is
        function ppc_mulhw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
        function ppc_mulhwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
 
-       function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
-       function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
-       function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0)) return std_ulogic_vector;
-       function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
+       function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
+                           so: std_ulogic) return std_ulogic_vector;
+       function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
+                           so: std_ulogic) return std_ulogic_vector;
+       function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
+                           so: std_ulogic) return std_ulogic_vector;
+       function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
+                           so: std_ulogic) return std_ulogic_vector;
 
        function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
+        function ppc_cmpeqb (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
+        function ppc_cmprb (ra, rb: std_ulogic_vector(63 downto 0); l: std_ulogic) return std_ulogic_vector;
 
        function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
        function ppc_divdu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
        function ppc_divd (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
        function ppc_divwu (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector;
 
-       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;
-       function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer;
+       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;
 end package ppc_fx_insns;
 
 package body ppc_fx_insns is
@@ -677,7 +682,8 @@ package body ppc_fx_insns is
                return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
        end;
 
-       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
+       function ppc_cmpi (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
+                           so: std_ulogic) return std_ulogic_vector is
                variable tmp: signed(ra'range);
        begin
                tmp := signed(ra);
@@ -685,10 +691,11 @@ package body ppc_fx_insns is
                        tmp := resize(signed(ra(31 downto 0)), tmp'length);
                end if;
 
-               return ppc_signed_compare(tmp, resize(signed(si), tmp'length));
+               return ppc_signed_compare(tmp, resize(signed(si), tmp'length), so);
        end;
 
-       function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
+       function ppc_cmp (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
+                          so: std_ulogic) return std_ulogic_vector is
                variable tmpa, tmpb: signed(ra'range);
        begin
                tmpa := signed(ra);
@@ -698,10 +705,11 @@ package body ppc_fx_insns is
                        tmpb := resize(signed(rb(31 downto 0)), ra'length);
                end if;
 
-               return ppc_signed_compare(tmpa, tmpb);
+               return ppc_signed_compare(tmpa, tmpb, so);
        end;
 
-       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
+       function ppc_cmpli (l: std_ulogic; ra: std_ulogic_vector(63 downto 0); si: std_ulogic_vector(15 downto 0);
+                            so: std_ulogic) return std_ulogic_vector is
                variable tmp: unsigned(ra'range);
        begin
                tmp := unsigned(ra);
@@ -709,10 +717,11 @@ package body ppc_fx_insns is
                        tmp := resize(unsigned(ra(31 downto 0)), tmp'length);
                end if;
 
-               return ppc_unsigned_compare(tmp, resize(unsigned(si), tmp'length));
+               return ppc_unsigned_compare(tmp, resize(unsigned(si), tmp'length), so);
        end;
 
-       function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
+       function ppc_cmpl (l: std_ulogic; ra, rb: std_ulogic_vector(63 downto 0);
+                           so: std_ulogic) return std_ulogic_vector is
                variable tmpa, tmpb: unsigned(ra'range);
        begin
                tmpa := unsigned(ra);
@@ -722,7 +731,7 @@ package body ppc_fx_insns is
                        tmpb := resize(unsigned(rb(31 downto 0)), ra'length);
                end if;
 
-               return ppc_unsigned_compare(tmpa, tmpb);
+               return ppc_unsigned_compare(tmpa, tmpb, so);
        end;
 
        function ppc_cmpb (rs, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
@@ -739,6 +748,34 @@ package body ppc_fx_insns is
                return ret;
        end;
 
+        function ppc_cmpeqb (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
+            variable match: std_ulogic;
+            variable j: integer;
+        begin
+            match := '0';
+            for i in 0 to 7 loop
+                j := i * 8;
+                if ra(7 downto 0) = rb(j + 7 downto j) then
+                    match := '1';
+                end if;
+            end loop;
+            return '0' & match & "00";
+        end;
+
+        function ppc_cmprb (ra, rb: std_ulogic_vector(63 downto 0); l: std_ulogic) return std_ulogic_vector is
+            variable match: std_ulogic;
+            variable v: unsigned(7 downto 0);
+        begin
+            match := '0';
+            v := unsigned(ra(7 downto 0));
+            if v >= unsigned(rb(7 downto 0)) and v <= unsigned(rb(15 downto 8)) then
+                match := '1';
+            elsif l = '1' and v >= unsigned(rb(23 downto 16)) and v <= unsigned(rb(31 downto 24)) then
+                match := '1';
+            end if;
+            return '0' & match & "00";
+        end;
+
        -- Not synthesizable
        function ppc_divw (ra, rb: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
                variable tmp: signed(31 downto 0);
@@ -778,13 +815,12 @@ package body ppc_fx_insns is
                return std_ulogic_vector(resize(tmp, ra'length));
        end;
 
-       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
+       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
                variable crfield: integer;
                variable crbit_match: std_ulogic;
                variable ctr_not_zero: std_ulogic;
                variable ctr_ok: std_ulogic;
                variable cond_ok: std_ulogic;
-               variable ret: integer;
        begin
                crfield := to_integer(unsigned(bi));
                -- BE bit numbering
@@ -793,29 +829,7 @@ package body ppc_fx_insns is
                ctr_not_zero := '1' when ctr /= x"0000000000000001" else '0';
                ctr_ok := bo(4-2) or (ctr_not_zero xor bo(4-3));
                cond_ok := bo(4-0) or crbit_match;
-               if ctr_ok = '1' and cond_ok = '1' then
-                       ret := 1;
-               else
-                       ret := 0;
-               end if;
-               return ret;
+                return ctr_ok and cond_ok;
        end;
 
-       function ppc_bcctr_taken(bo, bi: std_ulogic_vector(4 downto 0); cr: std_ulogic_vector(31 downto 0)) return integer is
-               variable crfield: integer;
-               variable crbit_match: std_ulogic;
-               variable cond_ok: std_ulogic;
-               variable ret: integer;
-       begin
-               crfield := to_integer(unsigned(bi));
-               -- BE bit numbering
-               crbit_match := '1' when cr(31-crfield) = bo(4-1) else '0';
-               cond_ok := bo(4-0) or crbit_match;
-               if cond_ok = '1' then
-                       ret := 1;
-               else
-                       ret := 0;
-               end if;
-               return ret;
-       end;
 end package body ppc_fx_insns;