Emulating a hardware signed multiplier
Børge Strand-Bergesen
borge.strand at gmail.com
Sun Oct 25 00:32:52 CEST 2009
Thanks Torbjörn,
On my platform, sizeof(signed long long) is 8 (=64 bits), which should
hold my assignments but not the 128-bit result. What comes as a bit of
a surprise then is that the compiler says "warning: integer constant
is too large for "long" type" about the "ax = 0x..." and "bx = 0x..."
lines.
Is this what I should expect, or should the signed long long hold
128-bit numbers and not complain about my 64-bit assignments? Or
perhaps it is GCC 3.4.4 which is the issue.
Here's my latest test code that produces the warnings:
signed long long ax, bx, resultx;
printf("%d\n", sizeof(signed long long));
ax = 0x747262FA8DE38F37;
bx = 0x4728AD47CE37F092;
resultx = ax * bx;
printf("%#32lllx\n", resultx);
// Prints " 0x4b85d44d48dc3d5e"
Borge
On Sat, Oct 24, 2009 at 23:27, Torbjorn Granlund <tg at gmplib.org> wrote:
> Børge Strand-Bergesen <borge.strand at gmail.com> writes:
>
> I'm using GMP to write a C program that emulates a signed multiplier
> that I have implement in an FPGA. The hardware multiplier uses various
> hardware optimization, so I need to be confident in it before I put it
> to its actual use. (MAC for digital cross-over filter.) I intend to
> have GMP generate random input, send it on a UART to the hardware
> multiplier, receive its result and compare that to the one GMP
> calculated. If no flaws are found during a couple nights of this, the
> hardware multiplier is quite likely holding up. My setup is Cygwin on
> XP with GCC 3.4.4 and GMP 4.2.4-1 from a very recent Cygwin
> repository.
>
> Since you have GCC, I'd use its builtin "signed long long" type,
> which works exactly like your hardware.
>
> GMP internally uses sign-magnitude, which might make things more
> complicated.
>
> You might want to generate random numbers with GMP, though, since its
> random number generators, such as mpz_rrandomb, is quote good for test
> vector generations.
>
> There is no direct way of assigning a signed long long type from a GMP
> mpz_t variable. You might use two calls to mpz_get_ui with some
> shifting.
>
> --
> Torbjörn
>
More information about the gmp-discuss
mailing list