b43-asm: Allow complex immediates in M and S operands.
[b43-tools.git] / assembler / parser.y
index f00b2da4dec31266d2e64b6e6599514525ace4e8..f0151211741a9073e532eb690fbf681dcb2f1d99 100644 (file)
@@ -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,10 @@ 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 {
                        section = SECTION_TEXT;
@@ -101,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;
@@ -137,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;
@@ -986,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));
@@ -1003,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;
                  }
                ;
@@ -1083,35 +1082,37 @@ reg             : GPR regnr {
                  }
                ;
 
-mem            : BRACK_OPEN hexnum_decnum BRACK_CLOSE {
+mem            : BRACK_OPEN imm BRACK_CLOSE {
                        struct memory *mem = xmalloc(sizeof(struct memory));
+                       struct immediate *offset_imm = $2;
                        mem->type = MEM_DIRECT;
-                       mem->offset = (unsigned long)$2;
+                       mem->offset = offset_imm->imm;
+                       free(offset_imm);
                        $$ = mem;
                  }
-               | BRACK_OPEN hexnum_decnum COMMA OFFR regnr BRACK_CLOSE {
+               | BRACK_OPEN imm COMMA OFFR regnr BRACK_CLOSE {
                        struct memory *mem = xmalloc(sizeof(struct memory));
+                       struct immediate *offset_imm = $2;
                        mem->type = MEM_INDIRECT;
-                       mem->offset = (unsigned long)$2;
+                       mem->offset = offset_imm->imm;
+                       free(offset_imm);
                        mem->offr_nr = (unsigned long)$5;
                        $$ = mem;
                  }
                ;
 
-imm            : hexnum {
+imm            : imm_value {
                        struct immediate *imm = xmalloc(sizeof(struct immediate));
                        imm->imm = (unsigned long)$1;
                        $$ = imm;
                  }
-               | decnum {
-                       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;
                  }
                ;