(24 . 11)(24 . 37)
417    
418    pragma Pure;
419    
420    -- Comba's multiplier.
421    -- Karatsuba Threshhold - at or below this many words, we use Comba mult.
422    Karatsuba_Thresh : constant Indices := 8;
423    
424    -- Multiply. (CAUTION: UNBUFFERED)
425    procedure FZ_Multiply(X     : in  FZ;
426                          Y     : in  FZ;
427                          XY    : out FZ);
428    pragma Precondition(X'Length = Y'Length and
429                          XY'Length = (X'Length + Y'Length));
430    
431    -- Comba's multiplier. (CAUTION: UNBUFFERED)
432    procedure FZ_Mul_Comba(X     : in  FZ;
433                           Y     : in  FZ;
434                           XY_Lo : out FZ;
435                           XY_Hi : out FZ);
436                           XY    : out FZ);
437    pragma Precondition(X'Length = Y'Length and
438                          XY'Length = (X'Length + Y'Length));
439    
440    -- Karatsuba's Multiplier. (CAUTION: UNBUFFERED)
441    procedure Mul_Karatsuba(X  : in  FZ;
442                            Y  : in  FZ;
443                            XY : out FZ);
444    pragma Precondition(X'Length = Y'Length and
445                          XY'Length = (X'Length + Y'Length) and
446                          X'Length mod 2 = 0);
447    -- CAUTION: Inlining prohibited for Mul_Karatsuba !
448    
449    -- Multiplier. Preserves the inputs.
450    procedure FZ_Mult(X     : in  FZ;
451                      Y     : in  FZ;
452                      XY_Lo : out FZ;
453                      XY_Hi : out FZ);
454    pragma Precondition(X'Length = Y'Length and
455                          XY_Lo'Length = XY_Hi'Length and
456                          XY_Lo'Length = ((X'Length + Y'Length) / 2));