- 98A9315BADAC1530D96E214873BE3EFCED853C4A1D922CA1D707D93E62993ADDFFE906A64525204C9FB83B38C9AC04A170711D8D10D33D3EE2699953DDED18B9
+ A819415BC60308FE0B550EEE13DA2D6D4819064E4D336E9766E65A63768AEF24AC7DB9F5AC238725587F4660C2992AE17ABC85EF5047D62BEB04BA2C12D1172A
ffa/libffa/fz_mul.adb
(113 . 7)(113 . 6)
1773 XY(XY'Last) := A0;
1774
1775 end FZ_Mul_Comba;
1776 pragma Inline_Always(FZ_Mul_Comba);
1777
1778
1779 -- Karatsuba's Multiplier. (CAUTION: UNBUFFERED)
(173 . 10)(172 . 10)
1781 begin
1782
1783 -- Recurse: LL := XL * YL
1784 FZ_Multiply(XLo, YLo, LL);
1785 FZ_Multiply_Unbuffered(XLo, YLo, LL);
1786
1787 -- Recurse: HH := XH * YH
1788 FZ_Multiply(XHi, YHi, HH);
1789 FZ_Multiply_Unbuffered(XHi, YHi, HH);
1790
1791 -- Dx := |XL - XH| , Cx := Borrow (i.e. 1 iff XL < XH)
1792 FZ_Sub_Abs(X => XLo, Y => XHi, Difference => Dx, Underflow => Cx);
(185 . 7)(184 . 7)
1794 FZ_Sub_Abs(X => YLo, Y => YHi, Difference => Dy, Underflow => Cy);
1795
1796 -- Recurse: DD := Dx * Dy
1797 FZ_Multiply(Dx, Dy, DD);
1798 FZ_Multiply_Unbuffered(Dx, Dy, DD);
1799
1800 -- Whether (XL - XH)(YL - YH) is positive, and so DD must be subtracted:
1801 DD_Sub := 1 - (Cx xor Cy);
(227 . 9)(226 . 9)
1803
1804
1805 -- Multiplier. (CAUTION: UNBUFFERED)
1806 procedure FZ_Multiply(X : in FZ;
1807 Y : in FZ;
1808 XY : out FZ) is
1809 procedure FZ_Multiply_Unbuffered(X : in FZ;
1810 Y : in FZ;
1811 XY : out FZ) is
1812
1813 -- The length of either multiplicand
1814 L : constant Word_Count := X'Length;
(248 . 27)(247 . 25)
1816
1817 end if;
1818
1819 end FZ_Multiply;
1820 pragma Inline_Always(FZ_Multiply);
1821 end FZ_Multiply_Unbuffered;
1822
1823
1824 -- Multiplier. Preserves the inputs.
1825 procedure FZ_Mult(X : in FZ;
1826 Y : in FZ;
1827 XY_Lo : out FZ;
1828 XY_Hi : out FZ) is
1829 procedure FZ_Multiply_Buffered(X : in FZ;
1830 Y : in FZ;
1831 XY_Lo : out FZ;
1832 XY_Hi : out FZ) is
1833
1834 -- Product buffer.
1835 P : FZ(1 .. 2 * X'Length);
1836
1837 begin
1838
1839 FZ_Multiply(X, Y, P);
1840 FZ_Multiply_Unbuffered(X, Y, P);
1841
1842 XY_Lo := P(P'First .. P'First + X'Length - 1);
1843 XY_Hi := P(P'First + X'Length .. P'Last);
1844
1845 end FZ_Mult;
1846 pragma Inline_Always(FZ_Mult);
1847 end FZ_Multiply_Buffered;
1848
1849 end FZ_Mul;