ref: 3e6f824c6113b7c4defaa01cf25cd94d1b050f69
parent: 36ce95316220f7b7bf4bcb205533b919a65ef750
author: Ori Bernstein <[email protected]>
date: Fri May 4 19:08:03 EDT 2012
Add in pseudo-regs.
--- a/8/asm.h
+++ b/8/asm.h
@@ -15,6 +15,7 @@
typedef enum {
Loclbl,
+ Locpseudo,
Locreg,
Locmem,
Locmeml, /* label offset */
@@ -38,6 +39,7 @@
char *lbl;
Reg reg;
long lit;
+ long pseudo;
/* disp(base + index) */
struct {
/* only one of lbldisp and constdisp may be used */
--- a/8/isel.c
+++ b/8/isel.c
@@ -55,6 +55,16 @@
return l;
}
+Loc *locpseudo(Loc *l, Mode mode)
+{
+ static long nextpseudo;
+
+ l->type = Locpseudo;
+ l->mode = mode;
+ l->pseudo = nextpseudo++;
+ return l;
+}
+
Loc *locmem(Loc *l, long disp, Reg base, Reg idx, Mode mode)
{
l->type = Locmem;
@@ -260,6 +270,9 @@
case Locreg:
fprintf(fd, "%s", regnames[l->reg]);
break;
+ case Locpseudo:
+ fprintf(fd, "%%P%ld", l->pseudo);
+ break;
case Locmem:
case Locmeml:
if (l->type == Locmem) {
@@ -275,7 +288,6 @@
fprintf(fd, ",%s", regnames[l->mem.idx]);
if (l->mem.base)
fprintf(fd, ")");
- break;
break;
case Loclit:
break;