logical: Only do output inversion for OP_AND, OP_OR and OP_XOR
authorPaul Mackerras <paulus@ozlabs.org>
Fri, 19 Jun 2020 07:13:06 +0000 (17:13 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 29 Jun 2020 23:07:41 +0000 (09:07 +1000)
It's not needed for the other ops (popcnt, parity, etc.) and the
logical unit shows up as a critical path from time to time.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
logical.vhdl

index 5e6abfad19f750b3d5aa01556de3651da00a26e3..0f53544f509dd4e35e186efde8549e3ddc3d4307 100644 (file)
@@ -87,12 +87,19 @@ begin
         end if;
 
         case op is
-            when OP_AND =>
-                tmp := rs and rb_adj;
-            when OP_OR =>
-                tmp := rs or rb_adj;
-           when OP_XOR =>
-                tmp := rs xor rb_adj;
+            when OP_AND | OP_OR | OP_XOR =>
+                case op is
+                    when OP_AND =>
+                        tmp := rs and rb_adj;
+                    when OP_OR =>
+                        tmp := rs or rb_adj;
+                    when others =>
+                        tmp := rs xor rb_adj;
+                end case;
+                if invert_out = '1' then
+                    tmp := not tmp;
+                end if;
+
             when OP_POPCNT =>
                 tmp := popcnt;
             when OP_PRTY =>
@@ -115,9 +122,6 @@ begin
                tmp(7 downto 0) := rs(7 downto 0);
         end case;
 
-        if invert_out = '1' then
-            tmp := not tmp;
-        end if;
         result <= tmp;
 
     end process;