| /* 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; |
| } |