1 /* { dg-do compile } */
2 /* { dg-options "-O" } */
3
4 typedef unsigned long int mp_limb_t;
5
6 typedef struct
7 {
8 int _mp_alloc;
9 int _mp_size;
10 mp_limb_t *_mp_d;
11 } __mpz_struct;
12
13 typedef __mpz_struct mpz_t[1];
14 typedef mp_limb_t * mp_ptr;
15 typedef const mp_limb_t * mp_srcptr;
16 typedef long int mp_size_t;
17
18 extern mp_limb_t __gmpn_addmul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
19
20 void
21 __gmpn_redc_2 (mp_ptr rp, mp_ptr up, mp_srcptr mp, mp_size_t n, mp_srcptr mip)
22 {
23 mp_limb_t q[2];
24 mp_size_t j;
25 mp_limb_t upn;
26
27 for (j = n - 2; j >= 0; j -= 2)
28 {
29 mp_limb_t _ph, _pl;
30 __asm__ ("xma.hu %0 = %3, %5, f0\n\t"
31 "xma.l %1 = %3, %5, f0\n\t"
32 ";;\n\t"
33 "xma.l %0 = %3, %4, %0\n\t"
34 ";;\n\t"
35 "xma.l %0 = %2, %5, %0"
36 : "=&f" (q[1]), "=&f" (q[0])
37 : "f" (mip[1]), "f" (mip[0]), "f" (up[1]), "f" (up[0]));
38 upn = up[n];
39 up[1] = __gmpn_addmul_2 (up, mp, n, q);
40 up[0] = up[n];
41 up[n] = upn;
42 up += 2;
43 }
44 }