ref: b5f7a5850b5c849d56113b8aba84641c47ad7304
parent: 5f6c72e00d6053baf98563bb53afeb770e648e9d
author: Ori Bernstein <[email protected]>
date: Fri Jun 8 11:24:26 EDT 2012
Add pseudo-reg type.
--- a/8/asm.h
+++ b/8/asm.h
@@ -3,32 +3,34 @@
typedef enum {
#define Insn(val, fmt, attr) val,
#include "insns.def"
-#undef Insn
+#undef Insn
} AsmOp;
typedef enum {
#define Reg(r, name, mode) r,
#include "regs.def"
-#undef Reg
+#undef Reg
Nreg
} Reg;
typedef enum {
Locnone,
- Loclbl,
- Locreg,
- Locmem,
- Locmeml, /* label offset */
+ Loclbl, /* label */
+ Locreg, /* register */
+ Locpseu, /* pseudo-reg */
+ Locmem, /* reg offset mem */
+ Locmeml, /* label offset mem */
Loclit,
} LocType;
typedef enum {
ModeNone,
- ModeB,
- ModeS,
- ModeL,
- ModeQ,
- Nmode
+ ModeB, /* byte */
+ ModeS, /* short */
+ ModeL, /* long */
+ ModeF, /* float32 */
+ ModeD, /* float64 */
+ Nmode,
} Mode;
typedef struct Insn Insn;
@@ -49,6 +51,7 @@
union {
char *lbl;
Reg reg;
+ long pseudo;
long lit;
/* disp(base + index) */
struct {
--- a/8/isel.c
+++ b/8/isel.c
@@ -20,6 +20,13 @@
#undef Insn
};
+char modenames[] = {
+ [ModeB] = 'b',
+ [ModeS] = 's',
+ [ModeL] = 'l',
+ [ModeF] = 'f',
+ [ModeD] = 'd'
+};
/* forward decls */
Loc selexpr(Isel *s, Node *n);
@@ -570,6 +577,12 @@
case Locreg:
fprintf(fd, "%s", regnames[l->reg]);
break;
+ case Locpseu:
+ if (debug)
+ fprintf(fd, "%c%lu", modenames[l->mode], l->pseudo);
+ else
+ die("Trying to print pseudoreg %lu", l->pseudo);
+ break;
case Locmem:
case Locmeml:
if (l->type == Locmem) {
@@ -599,13 +612,7 @@
void modeprint(FILE *fd, Loc *l)
{
- char mode[] = {
- [ModeB] = 'b',
- [ModeS] = 's',
- [ModeL] = 'l',
- [ModeQ] = 'q'
- };
- fputc(mode[l->mode], fd);
+ fputc(modenames[l->mode], fd);
}
void iprintf(FILE *fd, Insn *insn)