From 3242ff3354890da733159163afcd3b0c910d454c Mon Sep 17 00:00:00 2001 From: cdkersey Date: Mon, 6 Jul 2015 22:20:05 -0600 Subject: [PATCH] %ra, %sp, %fp are now valid register identifiers. --- src/include/asm-tokens.h | 4 ++-- src/include/obj.h | 5 +++-- src/obj.cpp | 14 ++++++++++++++ src/scanner.lex | 4 ++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/include/asm-tokens.h b/src/include/asm-tokens.h index 5f014817..2550d44b 100644 --- a/src/include/asm-tokens.h +++ b/src/include/asm-tokens.h @@ -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 }; }; diff --git a/src/include/obj.h b/src/include/obj.h index ea5732d0..5cb9741c 100644 --- a/src/include/obj.h +++ b/src/include/obj.h @@ -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 { diff --git a/src/obj.cpp b/src/obj.cpp index a30ffb6b..435ec1eb 100644 --- a/src/obj.cpp +++ b/src/obj.cpp @@ -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; diff --git a/src/scanner.lex b/src/scanner.lex index b76205e1..ad00c25b 100644 --- a/src/scanner.lex +++ b/src/scanner.lex @@ -91,6 +91,10 @@ to return ASM_T_PREG; } %r{num}{space}[,;]? { yylval.u = read_number(YYText()); return ASM_T_REG; } +%ra { return ASM_T_REG_RA; } +%sp { return ASM_T_REG_FP; } +%fp { return ASM_T_REG_SP; } + #{num}{space}[,;]? { yylval.u = read_number(YYText()); return ASM_T_LIT; } {sym} { yylval.s = std::string(YYText()); return ASM_T_SYM; }