| /* { dg-do compile } */ |
| /* { dg-options "-O" } */ |
| |
| typedef unsigned long int mp_limb_t; |
| |
| typedef struct |
| { |
| int _mp_alloc; |
| int _mp_size; |
| mp_limb_t *_mp_d; |
| } __mpz_struct; |
| |
| typedef __mpz_struct mpz_t[1]; |
| typedef mp_limb_t * mp_ptr; |
| typedef const mp_limb_t * mp_srcptr; |
| typedef long int mp_size_t; |
| |
| extern mp_limb_t __gmpn_addmul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); |
| |
| void |
| __gmpn_redc_2 (mp_ptr rp, mp_ptr up, mp_srcptr mp, mp_size_t n, mp_srcptr mip) |
| { |
| mp_limb_t q[2]; |
| mp_size_t j; |
| mp_limb_t upn; |
| |
| for (j = n - 2; j >= 0; j -= 2) |
| { |
| mp_limb_t _ph, _pl; |
| __asm__ ("xma.hu %0 = %3, %5, f0\n\t" |
| "xma.l %1 = %3, %5, f0\n\t" |
| ";;\n\t" |
| "xma.l %0 = %3, %4, %0\n\t" |
| ";;\n\t" |
| "xma.l %0 = %2, %5, %0" |
| : "=&f" (q[1]), "=&f" (q[0]) |
| : "f" (mip[1]), "f" (mip[0]), "f" (up[1]), "f" (up[0])); |
| upn = up[n]; |
| up[1] = __gmpn_addmul_2 (up, mp, n, q); |
| up[0] = up[n]; |
| up[n] = upn; |
| up += 2; |
| } |
| } |