shithub: mc

Download patch

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)