X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=assembler%2Fparser.y;h=f0151211741a9073e532eb690fbf681dcb2f1d99;hb=5f3a128fbff51dd6fe6f7549d777cf3bdef62982;hp=c589195369c2ce536afecff77a8a460031238326;hpb=3f723ef8180329e5ca5f750e12a278191053af66;p=b43-tools.git diff --git a/assembler/parser.y b/assembler/parser.y index c589195..f015121 100644 --- a/assembler/parser.y +++ b/assembler/parser.y @@ -38,7 +38,7 @@ extern struct initvals_sect *cur_initvals_sect; %token SECTION_TEXT SECTION_IVALS -%token ASM_ARCH ASM_START SPR GPR OFFR LR COMMA BRACK_OPEN BRACK_CLOSE PAREN_OPEN PAREN_CLOSE HEXNUM DECNUM ARCH_NEWWORLD ARCH_OLDWORLD LABEL IDENT LABELREF +%token ASM_ARCH ASM_START SPR GPR OFFR LR COMMA SEMICOLON BRACK_OPEN BRACK_CLOSE PAREN_OPEN PAREN_CLOSE HEXNUM DECNUM ARCH_NEWWORLD ARCH_OLDWORLD LABEL IDENT LABELREF %token PLUS MINUS MULTIPLY DIVIDE BITW_OR BITW_AND BITW_XOR BITW_NOT LEFTSHIFT RIGHTSHIFT @@ -72,9 +72,9 @@ line : line_terminator { } ; -/* Allow terminating lines with the "|" char */ +/* Allow terminating lines with the ";" char */ line_terminator : /* Nothing */ - | BITW_OR line_terminator + | SEMICOLON line_terminator ; section_switch : SECTION_TEXT { @@ -102,35 +102,35 @@ section_switch : SECTION_TEXT { } ; -ivals_write : IVAL_MMIO16 hexnum_decnum COMMA hexnum_decnum { +ivals_write : IVAL_MMIO16 imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_MMIO16; iop->args[0] = (unsigned int)(unsigned long)$2; iop->args[1] = (unsigned int)(unsigned long)$4; $$ = iop; } - | IVAL_MMIO32 hexnum_decnum COMMA hexnum_decnum { + | IVAL_MMIO32 imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_MMIO32; iop->args[0] = (unsigned int)(unsigned long)$2; iop->args[1] = (unsigned int)(unsigned long)$4; $$ = iop; } - | IVAL_PHY hexnum_decnum COMMA hexnum_decnum { + | IVAL_PHY imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_PHY; iop->args[0] = (unsigned int)(unsigned long)$2; iop->args[1] = (unsigned int)(unsigned long)$4; $$ = iop; } - | IVAL_RADIO hexnum_decnum COMMA hexnum_decnum { + | IVAL_RADIO imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_RADIO; iop->args[0] = (unsigned int)(unsigned long)$2; iop->args[1] = (unsigned int)(unsigned long)$4; $$ = iop; } - | IVAL_SHM16 hexnum_decnum COMMA hexnum_decnum COMMA hexnum_decnum { + | IVAL_SHM16 imm_value COMMA imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_SHM16; iop->args[0] = (unsigned int)(unsigned long)$2; @@ -138,7 +138,7 @@ ivals_write : IVAL_MMIO16 hexnum_decnum COMMA hexnum_decnum { iop->args[2] = (unsigned int)(unsigned long)$6; $$ = iop; } - | IVAL_SHM32 hexnum_decnum COMMA hexnum_decnum COMMA hexnum_decnum { + | IVAL_SHM32 imm_value COMMA imm_value COMMA imm_value { struct initval_op *iop = xmalloc(sizeof(struct initval_op)); iop->type = IVAL_W_SHM32; iop->args[0] = (unsigned int)(unsigned long)$2; @@ -987,7 +987,7 @@ raw_code : RAW_CODE { } ; -extended_operlist : decnum COMMA decnum COMMA operand COMMA operand COMMA operand { +extended_operlist : imm_value COMMA imm_value COMMA operand COMMA operand COMMA operand { struct operlist *ol = xmalloc(sizeof(struct operlist)); struct operand *mask_oper = xmalloc(sizeof(struct operand)); struct operand *shift_oper = xmalloc(sizeof(struct operand)); @@ -1004,15 +1004,13 @@ extended_operlist : decnum COMMA decnum COMMA operand COMMA operand COMMA operan } ; -external_jump_operands : imm COMMA operand COMMA operand COMMA labelref { +external_jump_operands : imm COMMA labelref { struct operlist *ol = xmalloc(sizeof(struct operlist)); struct operand *cond = xmalloc(sizeof(struct operand)); cond->type = OPER_IMM; cond->u.imm = $1; ol->oper[0] = cond; ol->oper[1] = $3; - ol->oper[2] = $5; - ol->oper[3] = $7; $$ = ol; } ; @@ -1103,15 +1101,18 @@ mem : BRACK_OPEN imm BRACK_CLOSE { } ; -imm : hexnum_decnum { +imm : imm_value { struct immediate *imm = xmalloc(sizeof(struct immediate)); imm->imm = (unsigned long)$1; $$ = imm; } + ; + +imm_value : hexnum_decnum { + $$ = $1; + } | complex_imm { - struct immediate *imm = xmalloc(sizeof(struct immediate)); - imm->imm = (unsigned long)$1; - $$ = imm; + $$ = $1; } ;