Beispiel #1
0
int
main (int argc, char **argv)
{
  int reps = 100000;

  tests_start ();
  mp_trace_base = -16;

  if (argc == 2)
     reps = atoi (argv[1]);

  check_modulo ();
  check_sqrt (reps);

  tests_end ();
  exit (0);
}
Beispiel #2
0
void
proto_callback (uint8_t cmd, uint8_t size, uint8_t *args)
{
    uint8_t ap, bp, as, bs;
    uint16_t i;
    int32_t al, bl, rl[4];
    uint32_t patl[] = { 0xa66a6aa6, 0x5a5affff, 0xffcdffcd, 0xffffffff };
#define patn (sizeof (patl) / sizeof (patl[0]))
#define c(cmd, size) (cmd << 8 | size)
    switch (c (cmd, size))
    {
    case c ('z', 0):
        utils_reset ();
        break;
    case c ('m', 0):
        for (ap = 0; ap < patn; ap++)
            for (bp = 0; bp < patn; bp++)
                for (as = 0; as < 32; as++)
                    for (bs = 0; bs < 32; bs++)
                    {
                        al = patl[ap] >> as;
                        bl = patl[bp] >> bs;
                        proto_send2d ('a', al, bl);
                        rl[0] = fixed_mul_f824 (al, bl);
                        check_mul (al, bl, rl[0]);
                        rl[1] = fixed_mul_f824 (-al, bl);
                        check_mul (-al, bl, rl[1]);
                        rl[2] = fixed_mul_f824 (al, -bl);
                        check_mul (al, -bl, rl[2]);
                        rl[3] = fixed_mul_f824 (-al, -bl);
                        check_mul (-al, -bl, rl[3]);
                        proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
                    }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            bl = random_u32 ();
            proto_send2d ('a', al, bl);
            rl[0] = fixed_mul_f824 (al, bl);
            check_mul (al, bl, rl[0]);
            rl[1] = fixed_mul_f824 (-al, bl);
            check_mul (-al, bl, rl[1]);
            rl[2] = fixed_mul_f824 (al, -bl);
            check_mul (al, -bl, rl[2]);
            rl[3] = fixed_mul_f824 (-al, -bl);
            check_mul (-al, -bl, rl[3]);
            proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
        }
        break;
    case c ('d', 0):
        for (ap = 0; ap < patn; ap++)
            for (bp = 0; bp < patn; bp++)
                for (as = 0; as < 32; as++)
                    for (bs = 0; bs < 31; bs++)
                    {
                        al = patl[ap] >> as;
                        bl = patl[bp] >> bs;
                        proto_send2d ('a', al, bl);
                        rl[0] = fixed_div_f824 (al, bl);
                        check_div (al, bl, rl[0]);
                        rl[1] = fixed_div_f824 (-al, bl);
                        check_div (-al, bl, rl[1]);
                        rl[2] = fixed_div_f824 (al, -bl);
                        check_div (al, -bl, rl[2]);
                        rl[3] = fixed_div_f824 (-al, -bl);
                        check_div (-al, -bl, rl[3]);
                        proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
                    }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            bl = random_u32 ();
            if (bl != 0)
            {
                proto_send2d ('a', al, bl);
                rl[0] = fixed_div_f824 (al, bl);
                check_div (al, bl, rl[0]);
                rl[1] = fixed_div_f824 (-al, bl);
                check_div (-al, bl, rl[1]);
                rl[2] = fixed_div_f824 (al, -bl);
                check_div (al, -bl, rl[2]);
                rl[3] = fixed_div_f824 (-al, -bl);
                check_div (-al, -bl, rl[3]);
                proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
            }
        }
        break;
    case c ('c', 0):
        for (al = 0; al < (1L << 24); al += 257)
        {
            proto_send1d ('a', al);
            rl[0] = fixed_cos_f824 (al);
            rl[1] = fixed_sin_f824 (al);
            check_cos (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 () & 0xffffff;
            proto_send1d ('a', al);
            rl[0] = fixed_cos_f824 (al);
            rl[1] = fixed_sin_f824 (al);
            check_cos (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        break;
    case c ('s', 0):
        for (ap = 0; ap < patn; ap++)
            for (as = 0; as < 32; as++)
            {
                al = patl[ap] >> as;
                proto_send1d ('a', al);
                rl[0] = fixed_sqrt_uf248 (al);
                rl[1] = fixed_sqrt_ui32 (al);
                check_sqrt (al, rl[0], rl[1]);
                proto_send2d ('r', rl[0], rl[1]);
            }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            proto_send1d ('a', al);
            rl[0] = fixed_sqrt_uf248 (al);
            rl[1] = fixed_sqrt_ui32 (al);
            check_sqrt (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        break;
    default:
        proto_send0 ('?');
        return;
    }
    /* When no error acknoledge. */
    proto_send (cmd, size, args);
#undef c
}