2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
5 Desc: Unsigned 32 bit multiplication function.
10 /*****************************************************************************
13 #include <proto/utility.h>
15 AROS_LH2(ULONG
, UMult32
,
18 AROS_LHA(ULONG
, arg1
, D0
),
19 AROS_LHA(ULONG
, arg2
, D1
),
22 struct UtilityBase
*, UtilityBase
, 24, Utility
)
25 Performs an unsigned 32-bit multiplication of arg1 * arg2 and
26 returns a 32 bit value.
29 arg1, arg2 - 32 bit unsigned longs
35 This can perform the multiplication either using the machines
36 native instructions (if they exist), or in software using a
37 simple algorithm (three multiplications, two shifts and
40 The utility.library math functions are unlike all other utility
41 functions in that they don't require the library base to be
42 loaded in register A6, and they also save the values of the
43 address registers A0/A1.
45 This function is mainly to support assembly programers, and is
46 probably of limited use to higher-level language programmers.
52 LONG c = UMult32(a,b);
58 SMult32(), UMult64(), SMult64()
61 May be handled by code in config/$(KERNEL), may not be...
63 It is for m68k-native...
65 To emulate this operation we are performing the operation:
67 (2^16 * a + b) * (2^16 * c + d)
68 = 2^32 * ab + 2^16 * ad + 2^16 * bc + bd
69 = 2^32 * ab + 2^16 ( ad + bc ) + bd
71 Now since the result is a 32-bit number, the 2^32 term will have
72 no effect. (Since 2^32 > max (32-bit number).
75 product = 2^16( ad + bc ) + bd
78 29-10-95 digulla automatically created from
79 utility_lib.fd and clib/utility_protos.h
80 18-08-96 iaint Implemented as described above.
82 *****************************************************************************/
86 /* If we have native support for 32 * 32 -> 32, use that. */
91 /* This is the equivalent to the emulating code,
92 see also config/m68k-native/sumult32.s
96 a1
= (arg1
>> 16) & 0xffff;
98 b1
= (arg2
>> 16) & 0xffff;
101 return (((a0
* b1
) + (a1
* b0
)) << 16) + (b0
* a0
);