summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/pr21291.c
blob: b597509854b26f6994add789d4090b0afcf28354 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* The asm has 2 "r" in/out operands, 1 earlyclobber "r" output, 1 "r"
   input and 2 fixed "r" clobbers (eax and edx), so there are a total of
   6 registers that must not conflict.  Add to that the PIC register,
   the frame pointer, and the stack pointer, and we've run out of
   registers on 32-bit targets.  */
/* { dg-do compile } */
/* { dg-options "-O" } */

typedef unsigned long bngdigit;
typedef bngdigit *bng;
typedef unsigned int bngcarry;
typedef unsigned long bngsize;

bngdigit
bng_ia32_mult_sub_digit (bng a, bngsize alen, bng b, bngsize blen, bngdigit d)
{
  bngdigit out, tmp;
  bngcarry carry;
  bngdigit a11;

  alen -= blen;
  out = 0;
  asm (""
       : "+r" (a), "+r" (b), "+mr" (blen), "+mr" (out), "=&r" (tmp)
       : "mr" (d)
       : "eax", "edx");
  if (alen == 0)
    {
      a11 = out;
      goto t;
    }

  a11 = 1;
 t:
  return a11;
}