# [mad-dev] Porting to PocketPC

**Rob Leslie
**
rob@mars.org

*Thu, 19 Jun 2003 16:57:47 -0700*

On Thursday, June 19, 2003, at 01:55 PM, Tyler Montbriand wrote:
>* Are the macro parameters for MAD_F_MLX, MAD_F_MLA, MAD_F_MLN, and
*>* mad_f_scale64 used ONLY as input parameters? 'cause if not, there's
*>* no way
*>* in heck to duplicate the full functionality of the macro in a function
*>* without operator overloading and hidden pointers; and MAD is a C
*>* project,
*>* not a C++ one.
*
MAD_F_MLX, MAD_F_MLA, and MAD_F_MLN all modify their first two
arguments. These arguments must be lvalues, so you could take their
addresses to pass to a function.
On the other hand, you really only need to define an implementation for
mad_f_mul; all the other macros have default implementations written in
terms of this one.
mad_fixed_t mad_f_mul(x, y)
x: (in) 32-bit fixed-point multiplicand
y: (in) 32-bit fixed-point multiplicand
returns: 32-bit fixed-point product (x*y shifted by MAD_F_SCALEBITS)
[Note that MAD_F_SCALEBITS may be redefined in synth.c, so if the
implementation for mad_f_mul calls a function, MAD_F_SCALEBITS may have
to be included as a function argument. You can avoid this by defining
mad_f_scale64 to nothing and always scaling by MAD_F_FRACBITS.]
If you want more accuracy, you should define MAD_F_MLX instead and let
the default implementations define everything in terms of this.
void MAD_F_MLX(hi, lo, x, y)
hi: (out) 32-bit high word of 64-bit x*y product
lo: (out) 32-bit low word of 64-bit x*y product
x: (in) 32-bit integer multiplicand
y: (in) 32-bit integer multiplicand
Defining implementations for any of the other macros is optional, if
you have an efficient or particularly effective alternative to the
default implementations.
--
Rob Leslie
rob@mars.org