summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parser.y34
1 files changed, 20 insertions, 14 deletions
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> inst
%type <arg> imm
+%type <arg> pcoff
%type <args> a_reg2
%type <args> a_reg3
%type <args> a_regp
%type <args> a_regp_reg
%type <args> a_reg_regp
%type <args> a_reg_imm
+%type <args> a_pcoff
%type <lval> 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) {