%ra, %sp, %fp are now valid register identifiers.

This commit is contained in:
cdkersey 2015-07-06 22:20:05 -06:00
parent 60f2e494e3
commit 3242ff3354
4 changed files with 23 additions and 4 deletions

View file

@ -5,7 +5,7 @@ namespace HarpTools {
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_END, ASM_T_LABEL, ASM_T_PRED, ASM_T_INST,
ASM_T_PREG, ASM_T_REG, ASM_T_LIT, ASM_T_SYM,
ASM_T_PEXP
ASM_T_PREG, ASM_T_REG, ASM_T_REG_RA, ASM_T_REG_SP,
ASM_T_REG_FP, ASM_T_LIT, ASM_T_SYM, ASM_T_PEXP
};
};

View file

@ -169,10 +169,11 @@ namespace Harp {
class AsmReader : public ObjReader {
public:
AsmReader(ArchDef arch) : wordSize(arch.getWordSize()) {}
AsmReader(ArchDef arch) :
wordSize(arch.getWordSize()), nRegs(arch.getNRegs()) {}
virtual Obj *read(std::istream &input);
private:
Size wordSize;
Size wordSize, nRegs;
};
class HOFReader : public ObjReader {

View file

@ -363,7 +363,21 @@ Obj *AsmReader::read(std::istream &input) {
default: asmReaderError(yyline, "Unexpected predicate register");
}
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:
continue_reg:
switch (state) {
case ST_INST1: curInst->setDestReg(yylval.u);
state = ST_INST2;

View file

@ -91,6 +91,10 @@ to
return ASM_T_PREG; }
<INSTARGS>%r{num}{space}[,;]? { yylval.u = read_number(YYText());
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());
return ASM_T_LIT; }
<INSTARGS>{sym} { yylval.s = std::string(YYText()); return ASM_T_SYM; }