Mercurial > hg > qcc
changeset 243:23150418768a
[project @ 2003-04-14 22:22:54 by bellard]
added 'A' asm constraint
author | bellard |
---|---|
date | Mon, 14 Apr 2003 22:22:54 +0000 |
parents | 244b2df32b67 |
children | 825ded62893f |
files | i386-asm.c |
diffstat | 1 files changed, 30 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/i386-asm.c Mon Apr 14 22:22:34 2003 +0000 +++ b/i386-asm.c Mon Apr 14 22:22:54 2003 +0000 @@ -710,19 +710,22 @@ break; str++; switch(c) { + case 'A': + pr = 0; + break; case 'a': case 'b': case 'c': case 'd': case 'S': case 'D': - pr = 0; - break; - case 'q': pr = 1; break; + case 'q': + pr = 2; + break; case 'r': - pr = 2; + pr = 3; break; case 'N': case 'M': @@ -730,7 +733,7 @@ case 'i': case 'm': case 'g': - pr = 3; + pr = 4; break; default: error("unknown constraint '%c'", c); @@ -817,6 +820,15 @@ try_next: c = *str++; switch(c) { + case 'A': + /* allocate both eax and edx */ + if (regs_allocated[TREG_EAX] || regs_allocated[TREG_EDX]) + goto try_next; + op->is_llong = 1; + op->reg = TREG_EAX; + regs_allocated[TREG_EAX] = 1; + regs_allocated[TREG_EDX] = 1; + break; case 'a': reg = TREG_EAX; goto alloc_reg; @@ -854,6 +866,7 @@ goto try_next; reg_found: /* now we can reload in the register */ + op->is_llong = 0; op->reg = reg; regs_allocated[reg] = 1; break; @@ -1027,6 +1040,12 @@ op = &operands[i]; if (op->reg >= 0) { load(op->reg, op->vt); + if (op->is_llong) { + SValue sv; + sv = *op->vt; + sv.c.ul += 4; + load(TREG_EDX, &sv); + } } } /* generate load code for output memory references */ @@ -1045,6 +1064,12 @@ op = &operands[i]; if (op->reg >= 0 && ((op->vt->r & VT_VALMASK) != VT_LLOCAL)) { store(op->reg, op->vt); + if (op->is_llong) { + SValue sv; + sv = *op->vt; + sv.c.ul += 4; + store(TREG_EDX, &sv); + } } } /* generate reg restore code */