%ra, %sp, %fp are now valid register identifiers.
This commit is contained in:
@@ -5,7 +5,7 @@ namespace HarpTools {
|
|||||||
ASM_T_DIR_GLOBAL, ASM_T_DIR_ARG_NUM, ASM_T_DIR_ARG_STRING,
|
ASM_T_DIR_GLOBAL, ASM_T_DIR_ARG_NUM, ASM_T_DIR_ARG_STRING,
|
||||||
ASM_T_DIR_ARG_SYM, ASM_T_DIR_ARG_R, ASM_T_DIR_ARG_W, ASM_T_DIR_ARG_X,
|
ASM_T_DIR_ARG_SYM, ASM_T_DIR_ARG_R, ASM_T_DIR_ARG_W, ASM_T_DIR_ARG_X,
|
||||||
ASM_T_DIR_END, ASM_T_LABEL, ASM_T_PRED, ASM_T_INST,
|
ASM_T_DIR_END, ASM_T_LABEL, ASM_T_PRED, ASM_T_INST,
|
||||||
ASM_T_PREG, ASM_T_REG, ASM_T_LIT, ASM_T_SYM,
|
ASM_T_PREG, ASM_T_REG, ASM_T_REG_RA, ASM_T_REG_SP,
|
||||||
ASM_T_PEXP
|
ASM_T_REG_FP, ASM_T_LIT, ASM_T_SYM, ASM_T_PEXP
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -169,10 +169,11 @@ namespace Harp {
|
|||||||
|
|
||||||
class AsmReader : public ObjReader {
|
class AsmReader : public ObjReader {
|
||||||
public:
|
public:
|
||||||
AsmReader(ArchDef arch) : wordSize(arch.getWordSize()) {}
|
AsmReader(ArchDef arch) :
|
||||||
|
wordSize(arch.getWordSize()), nRegs(arch.getNRegs()) {}
|
||||||
virtual Obj *read(std::istream &input);
|
virtual Obj *read(std::istream &input);
|
||||||
private:
|
private:
|
||||||
Size wordSize;
|
Size wordSize, nRegs;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HOFReader : public ObjReader {
|
class HOFReader : public ObjReader {
|
||||||
|
|||||||
14
src/obj.cpp
14
src/obj.cpp
@@ -363,7 +363,21 @@ Obj *AsmReader::read(std::istream &input) {
|
|||||||
default: asmReaderError(yyline, "Unexpected predicate register");
|
default: asmReaderError(yyline, "Unexpected predicate register");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ASM_T_REG_RA:
|
||||||
|
yylval.u = nRegs - 1;
|
||||||
|
goto continue_reg;
|
||||||
|
|
||||||
|
case ASM_T_REG_FP:
|
||||||
|
yylval.u = nRegs - 3;
|
||||||
|
goto continue_reg;
|
||||||
|
|
||||||
|
case ASM_T_REG_SP:
|
||||||
|
yylval.u = nRegs - 2;
|
||||||
|
goto continue_reg;
|
||||||
|
|
||||||
case ASM_T_REG:
|
case ASM_T_REG:
|
||||||
|
continue_reg:
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case ST_INST1: curInst->setDestReg(yylval.u);
|
case ST_INST1: curInst->setDestReg(yylval.u);
|
||||||
state = ST_INST2;
|
state = ST_INST2;
|
||||||
|
|||||||
@@ -91,6 +91,10 @@ to
|
|||||||
return ASM_T_PREG; }
|
return ASM_T_PREG; }
|
||||||
<INSTARGS>%r{num}{space}[,;]? { yylval.u = read_number(YYText());
|
<INSTARGS>%r{num}{space}[,;]? { yylval.u = read_number(YYText());
|
||||||
return ASM_T_REG; }
|
return ASM_T_REG; }
|
||||||
|
<INSTARGS>%ra { return ASM_T_REG_RA; }
|
||||||
|
<INSTARGS>%sp { return ASM_T_REG_FP; }
|
||||||
|
<INSTARGS>%fp { return ASM_T_REG_SP; }
|
||||||
|
|
||||||
<INSTARGS>#{num}{space}[,;]? { yylval.u = read_number(YYText());
|
<INSTARGS>#{num}{space}[,;]? { yylval.u = read_number(YYText());
|
||||||
return ASM_T_LIT; }
|
return ASM_T_LIT; }
|
||||||
<INSTARGS>{sym} { yylval.s = std::string(YYText()); return ASM_T_SYM; }
|
<INSTARGS>{sym} { yylval.s = std::string(YYText()); return ASM_T_SYM; }
|
||||||
|
|||||||
Reference in New Issue
Block a user