Lines Matching refs:mn
79 mpn_matrix22_mul_itch (mp_size_t rn, mp_size_t mn)
82 || BELOW_THRESHOLD (mn, MATRIX22_STRASSEN_THRESHOLD))
83 return 3*rn + 2*mn;
85 return 3*(rn + mn) + 5;
126 * Resulting elements are of size up to rn + mn + 1.
128 * Temporary storage: 3 rn + 3 mn + 5. */
131 mp_srcptr m0, mp_srcptr m1, mp_srcptr m2, mp_srcptr m3, mp_size_t mn,
137 t0 = tp; tp += mn + 1;
138 u0 = tp; tp += rn + mn + 1;
139 u1 = tp; /* rn + mn + 2 */
141 MUL (u0, r1, rn, m2, mn); /* u5 = s5 * t6 */
169 MUL (u1, r0, rn, m0, mn); /* u0 = s0 * t0 */
170 r0[rn+mn] = mpn_add_n (r0, u0, u1, rn + mn);
171 ASSERT (r0[rn+mn] < 2); /* u0 + u5 */
173 t0s = abs_sub_n (t0, m3, m2, mn);
175 MUL (u1, r3, rn, t0, mn); /* u2 = s2 * t2 */
176 u1[rn+mn] = 0;
179 t0s = abs_sub_n (t0, m1, t0, mn);
180 t0[mn] = 0;
184 t0[mn] = mpn_add_n (t0, t0, m1, mn);
187 /* FIXME: Could be simplified if we had space for rn + mn + 2 limbs
189 words t0[mn] and r1[rn] are non-zero with a pretty small
191 unconditional rn x (mn+1) followed by an if (UNLIKELY (r1[rn]))
193 if (t0[mn] != 0)
195 MUL (r3, r1, rn, t0, mn + 1); /* u3 = s3 * t3 */
198 mpn_add_n (r3 + rn, r3 + rn, t0, mn + 1);
202 MUL (r3, r1, rn + 1, t0, mn);
205 ASSERT (r3[rn+mn] < 4);
207 u0[rn+mn] = 0;
210 r3s = abs_sub_n (r3, u0, r3, rn + mn + 1);
214 ASSERT_NOCARRY (mpn_add_n (r3, r3, u0, rn + mn + 1));
220 t0[mn] = mpn_add_n (t0, t0, m0, mn);
222 else if (t0[mn] != 0)
224 t0[mn] -= mpn_sub_n (t0, t0, m0, mn);
228 t0s = abs_sub_n (t0, t0, m0, mn);
230 MUL (u0, r2, rn, t0, mn + 1); /* u6 = s6 * t4 */
231 ASSERT (u0[rn+mn] < 2);
241 t0s = add_signed_n (r2, r3, r3s, u0, t0s, rn + mn);
243 ASSERT (r2[rn+mn-1] < 4);
244 r3s = add_signed_n (r3, r3, r3s, u1, u1s, rn + mn);
246 ASSERT (r3[rn+mn-1] < 3);
247 MUL (u0, s0, rn, m1, mn); /* u4 = s4 * t5 */
248 ASSERT (u0[rn+mn-1] < 2);
249 t0[mn] = mpn_add_n (t0, m3, m1, mn);
250 MUL (u1, r1, rn, t0, mn + 1); /* u1 = s1 * t1 */
251 mn += rn;
252 ASSERT (u1[mn-1] < 4);
253 ASSERT (u1[mn] == 0);
254 ASSERT_NOCARRY (add_signed_n (r1, r3, r3s, u0, s0s, mn));
256 ASSERT (r1[mn-1] < 2);
259 ASSERT_NOCARRY (mpn_add_n (r3, u1, r3, mn));
263 ASSERT_NOCARRY (mpn_sub_n (r3, u1, r3, mn));
266 ASSERT (r3[mn-1] < 2);
269 ASSERT_NOCARRY (mpn_add_n (r2, u1, r2, mn));
273 ASSERT_NOCARRY (mpn_sub_n (r2, u1, r2, mn));
276 ASSERT (r2[mn-1] < 2);
281 mp_srcptr m0, mp_srcptr m1, mp_srcptr m2, mp_srcptr m3, mp_size_t mn,
285 || BELOW_THRESHOLD (mn, MATRIX22_STRASSEN_THRESHOLD))
290 /* Temporary storage: 3 rn + 2 mn */
292 p1 = p0 + rn + mn;
298 if (rn >= mn)
300 mpn_mul (p0, r0, rn, m0, mn);
301 mpn_mul (p1, r1, rn, m3, mn);
302 mpn_mul (r0, r1, rn, m2, mn);
303 mpn_mul (r1, tp, rn, m1, mn);
307 mpn_mul (p0, m0, mn, r0, rn);
308 mpn_mul (p1, m3, mn, r1, rn);
309 mpn_mul (r0, m2, mn, r1, rn);
310 mpn_mul (r1, m1, mn, tp, rn);
312 r0[rn+mn] = mpn_add_n (r0, r0, p0, rn + mn);
313 r1[rn+mn] = mpn_add_n (r1, r1, p1, rn + mn);
320 m0, m1, m2, m3, mn, tp);