14 #define REFCALL refmpn_add_n
15 #define TESTCALL mpn_add_n
19 #define REFCALL refmpn_sub_n
20 #define TESTCALL mpn_sub_n
23 mp_limb_t refmpn_add_n ();
24 mp_limb_t refmpn_sub_n ();
32 mp_size_t alloc_size, max_size, size, i, cumul_size;
33 mp_ptr s1, s2, dx, dy;
34 int s1_align, s2_align, d_align;
44 max_size = atol (*argv);
48 alloc_size = max_size + 32;
49 s1 = malloc (alloc_size * BYTES_PER_MP_LIMB);
50 s2 = malloc (alloc_size * BYTES_PER_MP_LIMB);
51 dx = malloc (alloc_size * BYTES_PER_MP_LIMB);
52 dy = malloc (alloc_size * BYTES_PER_MP_LIMB);
55 for (pass = 0; pass < n_passes; pass++)
58 if (cumul_size >= 1000000)
60 cumul_size -= 1000000;
61 printf ("%d ", pass); fflush (stdout);
63 s1_align = random () % 32;
64 s2_align = random () % 32;
65 d_align = random () % 32;
67 size = random () % max_size + 1;
69 mpn_random2 (s1 + s1_align, size);
70 mpn_random2 (s2 + s2_align, size);
72 for (i = 0; i < alloc_size; i++)
73 dx[i] = dy[i] = i + 0x9876500;
75 cx = TESTCALL (dx + d_align, s1 + s1_align, s2 + s2_align, size);
76 cy = REFCALL (dy + d_align, s1 + s1_align, s2 + s2_align, size);
78 if (cx != cy || mpn_cmp (dx, dy, alloc_size) != 0)
82 printf ("%d passes OK\n", n_passes);
88 refmpn_add_n (mp_ptr res_ptr,
89 mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
91 refmpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
92 register mp_ptr res_ptr;
93 register mp_srcptr s1_ptr;
94 register mp_srcptr s2_ptr;
98 register mp_limb_t x, y, cy;
101 /* The loop counter and index J goes from -SIZE to -1. This way
102 the loop becomes faster. */
105 /* Offset the base pointers to compensate for the negative indices. */
115 y += cy; /* add previous carry to one addend */
116 cy = (y < cy); /* get out carry from that addition */
117 y = x + y; /* add other addend */
118 cy = (y < x) + cy; /* get out carry from that add, combine */
128 refmpn_sub_n (mp_ptr res_ptr,
129 mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
131 refmpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
132 register mp_ptr res_ptr;
133 register mp_srcptr s1_ptr;
134 register mp_srcptr s2_ptr;
138 register mp_limb_t x, y, cy;
139 register mp_size_t j;
141 /* The loop counter and index J goes from -SIZE to -1. This way
142 the loop becomes faster. */
145 /* Offset the base pointers to compensate for the negative indices. */
155 y += cy; /* add previous carry to subtrahend */
156 cy = (y < cy); /* get out carry from that addition */
157 y = x - y; /* main subtract */
158 cy = (y > x) + cy; /* get out carry from the subtract, combine */