- 5CB9ECB938F842B7C34CA7EDF99FB92502986D7F660B223659C9B19C6008A24C3BE6DE8135DB37E29E7FF278A451B68C61F6B57D8E404372DCD3FD6D4320EA0A
+ BFAD12CBD645042EA8D0121994C38AF1A8945423CFD535AF80A2762D506BEF3D30ED8ECC7A6988ECA6788789A6D36C25E3FE505C49F478AFE227AB8D9D51821B
ffa/libffa/fz_mul.adb
(29 . 6)(29 . 32)
22 Y : in FZ;
23 XY_Lo : out FZ;
24 XY_Hi : out FZ) is
25
26 -- Words in each multiplicand
27 L : constant Word_Index := X'Length;
28
29 -- Length of Product, i.e. double the length of either multiplicand
30 LP : constant Word_Index := 2 * L;
31
32 -- Register holding Product; indexed from zero
33 XY : FZ(0 .. LP - 1);
34
35 procedure Asm_Comba(X : in FZ;
36 Y : in FZ;
37 XY : out FZ;
38 X_Size : in Word_Count);
39 pragma Import (C, Asm_Comba, "x86_64_comba");
40 begin
41 Asm_Comba(X, Y, XY, L);
42 XY_Lo := XY(0 .. L - 1);
43 XY_Hi := XY(L .. XY'Last);
44 end FZ_Mul_Comba;
45
46 -- Comba's multiplier.
47 procedure FZ_Mul_Comba_C(X : in FZ;
48 Y : in FZ;
49 XY_Lo : out FZ;
50 XY_Hi : out FZ) is
51
52 -- Words in each multiplicand
53 L : constant Word_Index := X'Length;
(119 . 7)(145 . 7)
55 XY_Lo := XY(0 .. L - 1);
56 XY_Hi := XY(L .. XY'Last);
57
58 end FZ_Mul_Comba;
59 end FZ_Mul_Comba_C;
60 pragma Inline_Always(FZ_Mul_Comba);
61
62 end FZ_Mul;