From ca8e5e46c4d3bcb402cb3439a9a1cdc42d6d45c7 Mon Sep 17 00:00:00 2001 From: Bobby Bingham Date: Sat, 14 Jan 2017 16:14:35 -0600 Subject: nqasm: Handle pc offset arguments --- parser.y | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'parser.y') diff --git a/parser.y b/parser.y index 2d34400..237b71d 100644 --- a/parser.y +++ b/parser.y @@ -81,12 +81,14 @@ void yyerror(const char *msg) %type inst %type imm +%type pcoff %type a_reg2 %type a_reg3 %type a_regp %type a_regp_reg %type a_reg_regp %type a_reg_imm +%type a_pcoff %type intlit %% @@ -126,20 +128,13 @@ inst: | T_LD_W a_reg_regp { $$ = INSTRUCTION_ARGS(LD_W, $2); } | T_LDI_BL a_reg_imm { $$ = INSTRUCTION_ARGS(LDI_BL, $2); } | T_LDI_BH a_reg_imm { $$ = INSTRUCTION_ARGS(LDI_BH, $2); } - | T_BEQ - { $$ = INSTRUCTION(BEQ); } - | T_BNE - { $$ = INSTRUCTION(BNE); } - | T_BGT - { $$ = INSTRUCTION(BGT); } - | T_BGE - { $$ = INSTRUCTION(BGE); } - | T_BLT - { $$ = INSTRUCTION(BLT); } - | T_BLE - { $$ = INSTRUCTION(BLE); } - | T_BRA - { $$ = INSTRUCTION(BRA); } + | T_BEQ a_pcoff { $$ = INSTRUCTION_ARGS(BEQ, $2); } + | T_BNE a_pcoff { $$ = INSTRUCTION_ARGS(BNE, $2); } + | T_BGT a_pcoff { $$ = INSTRUCTION_ARGS(BGT, $2); } + | T_BGE a_pcoff { $$ = INSTRUCTION_ARGS(BGE, $2); } + | T_BLT a_pcoff { $$ = INSTRUCTION_ARGS(BLT, $2); } + | T_BLE a_pcoff { $$ = INSTRUCTION_ARGS(BLE, $2); } + | T_BRA a_pcoff { $$ = INSTRUCTION_ARGS(BRA, $2); } | T_JMP a_regp { $$ = INSTRUCTION_ARGS(JMP, $2); } | T_ADDPC a_reg_imm { $$ = INSTRUCTION_ARGS(ADDPC, $2); } | T_NOP @@ -158,6 +153,17 @@ a_reg_regp: T_SPACE T_REG "," T_REGPTR { $$ = MKARGS($2, $4); } a_reg_imm: T_SPACE T_REG "," imm { $$ = MKARGS($2, $4); } +a_pcoff: + T_SPACE pcoff { $$ = MKARGS($2); } + +pcoff: intlit { + if (-0x80 > $1 || $1 > 0x7f) { + yyerror("pc offset operand out of range"); + YYERROR; + } else { + $$ = MKARGVALUE((uint8_t) $1); + } + } imm: intlit { if (-0x80 > $1 || $1 > 0xff) { -- cgit v1.2.3