4 * Copyright (C) 2006-2010 Michael Buesch <m@bues.ch>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
26 extern void yyerror(const char *);
27 extern int yyparse(void);
28 extern int yylex(void);
30 static struct operand * store_oper_sanity(struct operand *oper);
31 static void assembler_assertion_failed(void);
33 /* The current .section */
35 /* Pointer to the current initvals section data structure. */
36 extern struct initvals_sect *cur_initvals_sect;
40 %token SECTION_TEXT SECTION_IVALS
42 %token ASM_ARCH ASM_START ASM_ASSERT SPR GPR OFFR LR COMMA SEMICOLON BRACK_OPEN BRACK_CLOSE PAREN_OPEN PAREN_CLOSE HEXNUM DECNUM ARCH_NEWWORLD ARCH_OLDWORLD LABEL IDENT LABELREF
44 %token EQUAL NOT_EQUAL LOGICAL_OR LOGICAL_AND PLUS MINUS MULTIPLY DIVIDE BITW_OR BITW_AND BITW_XOR BITW_NOT LEFTSHIFT RIGHTSHIFT
46 %token OP_MUL OP_ADD OP_ADDSC OP_ADDC OP_ADDSCC OP_SUB OP_SUBSC OP_SUBC OP_SUBSCC OP_SRA OP_OR OP_AND OP_XOR OP_SR OP_SRX OP_SL OP_RL OP_RR OP_NAND OP_ORX OP_MOV OP_JMP OP_JAND OP_JNAND OP_JS OP_JNS OP_JE OP_JNE OP_JLS OP_JGES OP_JGS OP_JLES OP_JL OP_JGE OP_JG OP_JLE OP_JZX OP_JNZX OP_JEXT OP_JNEXT OP_JDN OP_JDPZ OP_JDP OP_JDNZ OP_CALL OP_CALLS OP_RET OP_RETS OP_TKIPH OP_TKIPHS OP_TKIPL OP_TKIPLS OP_NAP RAW_CODE
48 %token IVAL_MMIO16 IVAL_MMIO32 IVAL_PHY IVAL_RADIO IVAL_SHM16 IVAL_SHM32 IVAL_TRAM
54 line : line_terminator {
57 | line statement line_terminator {
58 struct statement *s = $2;
60 if (section != SECTION_TEXT)
61 yyerror("Microcode text instruction in non .text section");
62 memcpy(&s->info, &cur_lineinfo, sizeof(struct lineinfo));
63 list_add_tail(&s->list, &infile.sl);
66 | line section_switch line_terminator {
68 | line ivals_write line_terminator {
69 struct initval_op *io = $2;
70 if (section != SECTION_IVALS)
71 yyerror("InitVals write in non .initvals section");
72 memcpy(&io->info, &cur_lineinfo, sizeof(struct lineinfo));
73 INIT_LIST_HEAD(&io->list);
74 list_add_tail(&io->list, &cur_initvals_sect->ops);
78 /* Allow terminating lines with the ";" char */
79 line_terminator : /* Nothing */
80 | SEMICOLON line_terminator
83 section_switch : SECTION_TEXT {
84 section = SECTION_TEXT;
86 | SECTION_IVALS PAREN_OPEN identifier PAREN_CLOSE {
87 const char *sectname = $3;
88 struct initvals_sect *s;
89 cur_initvals_sect = NULL;
90 /* Search if there already is a section by that name. */
91 list_for_each_entry(s, &infile.ivals, list) {
92 if (strcmp(sectname, s->name) == 0)
93 cur_initvals_sect = s;
95 if (!cur_initvals_sect) {
96 /* Not found, create a new one. */
97 s = xmalloc(sizeof(struct initvals_sect));
99 INIT_LIST_HEAD(&s->ops);
100 INIT_LIST_HEAD(&s->list);
101 list_add_tail(&s->list, &infile.ivals);
102 cur_initvals_sect = s;
104 section = SECTION_IVALS;
108 ivals_write : IVAL_MMIO16 imm_value COMMA imm_value {
109 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
110 iop->type = IVAL_W_MMIO16;
111 iop->args[0] = (unsigned int)(unsigned long)$2;
112 iop->args[1] = (unsigned int)(unsigned long)$4;
115 | IVAL_MMIO32 imm_value COMMA imm_value {
116 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
117 iop->type = IVAL_W_MMIO32;
118 iop->args[0] = (unsigned int)(unsigned long)$2;
119 iop->args[1] = (unsigned int)(unsigned long)$4;
122 | IVAL_PHY imm_value COMMA imm_value {
123 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
124 iop->type = IVAL_W_PHY;
125 iop->args[0] = (unsigned int)(unsigned long)$2;
126 iop->args[1] = (unsigned int)(unsigned long)$4;
129 | IVAL_RADIO imm_value COMMA imm_value {
130 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
131 iop->type = IVAL_W_RADIO;
132 iop->args[0] = (unsigned int)(unsigned long)$2;
133 iop->args[1] = (unsigned int)(unsigned long)$4;
136 | IVAL_SHM16 imm_value COMMA imm_value COMMA imm_value {
137 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
138 iop->type = IVAL_W_SHM16;
139 iop->args[0] = (unsigned int)(unsigned long)$2;
140 iop->args[1] = (unsigned int)(unsigned long)$4;
141 iop->args[2] = (unsigned int)(unsigned long)$6;
144 | IVAL_SHM32 imm_value COMMA imm_value COMMA imm_value {
145 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
146 iop->type = IVAL_W_SHM32;
147 iop->args[0] = (unsigned int)(unsigned long)$2;
148 iop->args[1] = (unsigned int)(unsigned long)$4;
149 iop->args[2] = (unsigned int)(unsigned long)$6;
152 | IVAL_TRAM imm_value COMMA imm_value {
153 struct initval_op *iop = xmalloc(sizeof(struct initval_op));
154 iop->type = IVAL_W_TRAM;
155 iop->args[0] = (unsigned int)(unsigned long)$2;
156 iop->args[1] = (unsigned int)(unsigned long)$4;
162 struct asmdir *ad = $1;
164 struct statement *s = xmalloc(sizeof(struct statement));
165 INIT_LIST_HEAD(&s->list);
166 s->type = STMT_ASMDIR;
173 struct statement *s = xmalloc(sizeof(struct statement));
174 INIT_LIST_HEAD(&s->list);
175 s->type = STMT_LABEL;
180 struct statement *s = xmalloc(sizeof(struct statement));
181 INIT_LIST_HEAD(&s->list);
187 struct statement *s = xmalloc(sizeof(struct statement));
188 INIT_LIST_HEAD(&s->list);
194 struct statement *s = xmalloc(sizeof(struct statement));
195 INIT_LIST_HEAD(&s->list);
201 struct statement *s = xmalloc(sizeof(struct statement));
202 INIT_LIST_HEAD(&s->list);
208 struct statement *s = xmalloc(sizeof(struct statement));
209 INIT_LIST_HEAD(&s->list);
215 struct statement *s = xmalloc(sizeof(struct statement));
216 INIT_LIST_HEAD(&s->list);
222 struct statement *s = xmalloc(sizeof(struct statement));
223 INIT_LIST_HEAD(&s->list);
229 struct statement *s = xmalloc(sizeof(struct statement));
230 INIT_LIST_HEAD(&s->list);
236 struct statement *s = xmalloc(sizeof(struct statement));
237 INIT_LIST_HEAD(&s->list);
243 struct statement *s = xmalloc(sizeof(struct statement));
244 INIT_LIST_HEAD(&s->list);
250 struct statement *s = xmalloc(sizeof(struct statement));
251 INIT_LIST_HEAD(&s->list);
257 struct statement *s = xmalloc(sizeof(struct statement));
258 INIT_LIST_HEAD(&s->list);
264 struct statement *s = xmalloc(sizeof(struct statement));
265 INIT_LIST_HEAD(&s->list);
271 struct statement *s = xmalloc(sizeof(struct statement));
272 INIT_LIST_HEAD(&s->list);
278 struct statement *s = xmalloc(sizeof(struct statement));
279 INIT_LIST_HEAD(&s->list);
285 struct statement *s = xmalloc(sizeof(struct statement));
286 INIT_LIST_HEAD(&s->list);
292 struct statement *s = xmalloc(sizeof(struct statement));
293 INIT_LIST_HEAD(&s->list);
299 struct statement *s = xmalloc(sizeof(struct statement));
300 INIT_LIST_HEAD(&s->list);
306 struct statement *s = xmalloc(sizeof(struct statement));
307 INIT_LIST_HEAD(&s->list);
313 struct statement *s = xmalloc(sizeof(struct statement));
314 INIT_LIST_HEAD(&s->list);
320 struct statement *s = xmalloc(sizeof(struct statement));
321 INIT_LIST_HEAD(&s->list);
327 struct statement *s = xmalloc(sizeof(struct statement));
328 INIT_LIST_HEAD(&s->list);
334 struct statement *s = xmalloc(sizeof(struct statement));
335 INIT_LIST_HEAD(&s->list);
341 struct statement *s = xmalloc(sizeof(struct statement));
342 INIT_LIST_HEAD(&s->list);
348 struct statement *s = xmalloc(sizeof(struct statement));
349 INIT_LIST_HEAD(&s->list);
355 struct statement *s = xmalloc(sizeof(struct statement));
356 INIT_LIST_HEAD(&s->list);
362 struct statement *s = xmalloc(sizeof(struct statement));
363 INIT_LIST_HEAD(&s->list);
369 struct statement *s = xmalloc(sizeof(struct statement));
370 INIT_LIST_HEAD(&s->list);
376 struct statement *s = xmalloc(sizeof(struct statement));
377 INIT_LIST_HEAD(&s->list);
383 struct statement *s = xmalloc(sizeof(struct statement));
384 INIT_LIST_HEAD(&s->list);
390 struct statement *s = xmalloc(sizeof(struct statement));
391 INIT_LIST_HEAD(&s->list);
397 struct statement *s = xmalloc(sizeof(struct statement));
398 INIT_LIST_HEAD(&s->list);
404 struct statement *s = xmalloc(sizeof(struct statement));
405 INIT_LIST_HEAD(&s->list);
411 struct statement *s = xmalloc(sizeof(struct statement));
412 INIT_LIST_HEAD(&s->list);
418 struct statement *s = xmalloc(sizeof(struct statement));
419 INIT_LIST_HEAD(&s->list);
425 struct statement *s = xmalloc(sizeof(struct statement));
426 INIT_LIST_HEAD(&s->list);
432 struct statement *s = xmalloc(sizeof(struct statement));
433 INIT_LIST_HEAD(&s->list);
439 struct statement *s = xmalloc(sizeof(struct statement));
440 INIT_LIST_HEAD(&s->list);
446 struct statement *s = xmalloc(sizeof(struct statement));
447 INIT_LIST_HEAD(&s->list);
453 struct statement *s = xmalloc(sizeof(struct statement));
454 INIT_LIST_HEAD(&s->list);
460 struct statement *s = xmalloc(sizeof(struct statement));
461 INIT_LIST_HEAD(&s->list);
467 struct statement *s = xmalloc(sizeof(struct statement));
468 INIT_LIST_HEAD(&s->list);
474 struct statement *s = xmalloc(sizeof(struct statement));
475 INIT_LIST_HEAD(&s->list);
481 struct statement *s = xmalloc(sizeof(struct statement));
482 INIT_LIST_HEAD(&s->list);
488 struct statement *s = xmalloc(sizeof(struct statement));
489 INIT_LIST_HEAD(&s->list);
495 struct statement *s = xmalloc(sizeof(struct statement));
496 INIT_LIST_HEAD(&s->list);
502 struct statement *s = xmalloc(sizeof(struct statement));
503 INIT_LIST_HEAD(&s->list);
509 struct statement *s = xmalloc(sizeof(struct statement));
510 INIT_LIST_HEAD(&s->list);
516 struct statement *s = xmalloc(sizeof(struct statement));
517 INIT_LIST_HEAD(&s->list);
523 struct statement *s = xmalloc(sizeof(struct statement));
524 INIT_LIST_HEAD(&s->list);
530 struct statement *s = xmalloc(sizeof(struct statement));
531 INIT_LIST_HEAD(&s->list);
537 struct statement *s = xmalloc(sizeof(struct statement));
538 INIT_LIST_HEAD(&s->list);
544 struct statement *s = xmalloc(sizeof(struct statement));
545 INIT_LIST_HEAD(&s->list);
551 struct statement *s = xmalloc(sizeof(struct statement));
552 INIT_LIST_HEAD(&s->list);
560 asmdir : ASM_ARCH hexnum_decnum {
561 struct asmdir *ad = xmalloc(sizeof(struct asmdir));
562 ad->type = ADIR_ARCH;
563 ad->u.arch = (unsigned int)(unsigned long)$2;
566 | ASM_START identifier {
567 struct asmdir *ad = xmalloc(sizeof(struct asmdir));
568 struct label *label = xmalloc(sizeof(struct label));
570 label->direction = LABELREF_ABSOLUTE;
571 ad->type = ADIR_START;
580 asm_assert : ASM_ASSERT assertion {
581 unsigned int ok = (unsigned int)(unsigned long)$2;
583 assembler_assertion_failed();
588 assertion : PAREN_OPEN assert_expr PAREN_CLOSE {
591 | PAREN_OPEN assertion LOGICAL_OR assertion PAREN_CLOSE {
592 unsigned int a = (unsigned int)(unsigned long)$2;
593 unsigned int b = (unsigned int)(unsigned long)$4;
594 unsigned int result = (a || b);
595 $$ = (void *)(unsigned long)result;
597 | PAREN_OPEN assertion LOGICAL_AND assertion PAREN_CLOSE {
598 unsigned int a = (unsigned int)(unsigned long)$2;
599 unsigned int b = (unsigned int)(unsigned long)$4;
600 unsigned int result = (a && b);
601 $$ = (void *)(unsigned long)result;
605 assert_expr : imm_value EQUAL imm_value {
606 unsigned int a = (unsigned int)(unsigned long)$1;
607 unsigned int b = (unsigned int)(unsigned long)$3;
608 unsigned int result = (a == b);
609 $$ = (void *)(unsigned long)result;
611 | imm_value NOT_EQUAL imm_value {
612 unsigned int a = (unsigned int)(unsigned long)$1;
613 unsigned int b = (unsigned int)(unsigned long)$3;
614 unsigned int result = (a != b);
615 $$ = (void *)(unsigned long)result;
620 struct label *label = xmalloc(sizeof(struct label));
623 l[strlen(l) - 1] = '\0';
630 insn_mul : OP_MUL operlist_3 {
631 struct instruction *insn = xmalloc(sizeof(struct instruction));
639 insn_add : OP_ADD operlist_3 {
640 struct instruction *insn = xmalloc(sizeof(struct instruction));
648 insn_addsc : OP_ADDSC operlist_3 {
649 struct instruction *insn = xmalloc(sizeof(struct instruction));
657 insn_addc : OP_ADDC operlist_3 {
658 struct instruction *insn = xmalloc(sizeof(struct instruction));
666 insn_addscc : OP_ADDSCC operlist_3 {
667 struct instruction *insn = xmalloc(sizeof(struct instruction));
668 insn->op = OP_ADDSCC;
675 insn_sub : OP_SUB operlist_3 {
676 struct instruction *insn = xmalloc(sizeof(struct instruction));
684 insn_subsc : OP_SUBSC operlist_3 {
685 struct instruction *insn = xmalloc(sizeof(struct instruction));
693 insn_subc : OP_SUBC operlist_3 {
694 struct instruction *insn = xmalloc(sizeof(struct instruction));
702 insn_subscc : OP_SUBSCC operlist_3 {
703 struct instruction *insn = xmalloc(sizeof(struct instruction));
704 insn->op = OP_SUBSCC;
710 insn_sra : OP_SRA operlist_3 {
711 struct instruction *insn = xmalloc(sizeof(struct instruction));
718 insn_or : OP_OR operlist_3 {
719 struct instruction *insn = xmalloc(sizeof(struct instruction));
726 insn_and : OP_AND operlist_3 {
727 struct instruction *insn = xmalloc(sizeof(struct instruction));
734 insn_xor : OP_XOR operlist_3 {
735 struct instruction *insn = xmalloc(sizeof(struct instruction));
742 insn_sr : OP_SR operlist_3 {
743 struct instruction *insn = xmalloc(sizeof(struct instruction));
750 insn_srx : OP_SRX extended_operlist {
751 struct instruction *insn = xmalloc(sizeof(struct instruction));
758 insn_sl : OP_SL operlist_3 {
759 struct instruction *insn = xmalloc(sizeof(struct instruction));
766 insn_rl : OP_RL operlist_3 {
767 struct instruction *insn = xmalloc(sizeof(struct instruction));
774 insn_rr : OP_RR operlist_3 {
775 struct instruction *insn = xmalloc(sizeof(struct instruction));
782 insn_nand : OP_NAND operlist_3 {
783 struct instruction *insn = xmalloc(sizeof(struct instruction));
790 insn_orx : OP_ORX extended_operlist {
791 struct instruction *insn = xmalloc(sizeof(struct instruction));
798 insn_mov : OP_MOV operlist_2 {
799 struct instruction *insn = xmalloc(sizeof(struct instruction));
806 insn_jmp : OP_JMP labelref {
807 struct instruction *insn = xmalloc(sizeof(struct instruction));
808 struct operlist *ol = xmalloc(sizeof(struct operlist));
816 insn_jand : OP_JAND operlist_3 {
817 struct instruction *insn = xmalloc(sizeof(struct instruction));
824 insn_jnand : OP_JNAND operlist_3 {
825 struct instruction *insn = xmalloc(sizeof(struct instruction));
832 insn_js : OP_JS operlist_3 {
833 struct instruction *insn = xmalloc(sizeof(struct instruction));
840 insn_jns : OP_JNS operlist_3 {
841 struct instruction *insn = xmalloc(sizeof(struct instruction));
848 insn_je : OP_JE operlist_3 {
849 struct instruction *insn = xmalloc(sizeof(struct instruction));
856 insn_jne : OP_JNE operlist_3 {
857 struct instruction *insn = xmalloc(sizeof(struct instruction));
864 insn_jls : OP_JLS operlist_3 {
865 struct instruction *insn = xmalloc(sizeof(struct instruction));
872 insn_jges : OP_JGES operlist_3 {
873 struct instruction *insn = xmalloc(sizeof(struct instruction));
880 insn_jgs : OP_JGS operlist_3 {
881 struct instruction *insn = xmalloc(sizeof(struct instruction));
888 insn_jles : OP_JLES operlist_3 {
889 struct instruction *insn = xmalloc(sizeof(struct instruction));
896 insn_jl : OP_JL operlist_3 {
897 struct instruction *insn = xmalloc(sizeof(struct instruction));
904 insn_jge : OP_JGE operlist_3 {
905 struct instruction *insn = xmalloc(sizeof(struct instruction));
912 insn_jg : OP_JG operlist_3 {
913 struct instruction *insn = xmalloc(sizeof(struct instruction));
920 insn_jle : OP_JLE operlist_3 {
921 struct instruction *insn = xmalloc(sizeof(struct instruction));
928 insn_jzx : OP_JZX extended_operlist {
929 struct instruction *insn = xmalloc(sizeof(struct instruction));
936 insn_jnzx : OP_JNZX extended_operlist {
937 struct instruction *insn = xmalloc(sizeof(struct instruction));
944 insn_jdn : OP_JDN operlist_3 {
945 struct instruction *insn = xmalloc(sizeof(struct instruction));
952 insn_jdpz : OP_JDPZ operlist_3 {
953 struct instruction *insn = xmalloc(sizeof(struct instruction));
960 insn_jdp : OP_JDP operlist_3 {
961 struct instruction *insn = xmalloc(sizeof(struct instruction));
968 insn_jdnz : OP_JDNZ operlist_3 {
969 struct instruction *insn = xmalloc(sizeof(struct instruction));
976 insn_jext : OP_JEXT external_jump_operands {
977 struct instruction *insn = xmalloc(sizeof(struct instruction));
984 insn_jnext : OP_JNEXT external_jump_operands {
985 struct instruction *insn = xmalloc(sizeof(struct instruction));
997 insn_call : OP_CALL linkreg COMMA labelref {
998 struct instruction *insn = xmalloc(sizeof(struct instruction));
999 struct operlist *ol = xmalloc(sizeof(struct operlist));
1000 struct operand *oper_lr = xmalloc(sizeof(struct operand));
1001 struct operand *oper_zero = xmalloc(sizeof(struct operand));
1002 oper_zero->type = OPER_RAW;
1003 oper_zero->u.raw = 0;
1004 oper_lr->type = OPER_RAW;
1005 oper_lr->u.raw = (unsigned long)$2;
1006 ol->oper[0] = oper_lr;
1007 ol->oper[1] = oper_zero;
1010 insn->operands = ol;
1015 insn_calls : OP_CALLS labelref {
1016 struct instruction *insn = xmalloc(sizeof(struct instruction));
1017 struct operlist *ol = xmalloc(sizeof(struct operlist));
1018 struct operand *oper_r0 = xmalloc(sizeof(struct operand));
1019 struct registr *r0 = xmalloc(sizeof(struct registr));
1022 oper_r0->type = OPER_REG;
1023 oper_r0->u.reg = r0;
1024 ol->oper[0] = oper_r0;
1025 ol->oper[1] = oper_r0;
1027 insn->op = OP_CALLS;
1028 insn->operands = ol;
1033 insn_ret : OP_RET linkreg COMMA linkreg {
1034 struct instruction *insn = xmalloc(sizeof(struct instruction));
1035 struct operlist *ol = xmalloc(sizeof(struct operlist));
1036 struct operand *oper_lr0 = xmalloc(sizeof(struct operand));
1037 struct operand *oper_lr1 = xmalloc(sizeof(struct operand));
1038 struct operand *oper_zero = xmalloc(sizeof(struct operand));
1039 oper_zero->type = OPER_RAW;
1040 oper_zero->u.raw = 0;
1041 oper_lr0->type = OPER_RAW;
1042 oper_lr0->u.raw = (unsigned long)$2;
1043 oper_lr1->type = OPER_RAW;
1044 oper_lr1->u.raw = (unsigned long)$4;
1045 ol->oper[0] = oper_lr0;
1046 ol->oper[1] = oper_zero;
1047 ol->oper[2] = oper_lr1;
1049 insn->operands = ol;
1054 insn_rets : OP_RETS {
1055 struct instruction *insn = xmalloc(sizeof(struct instruction));
1056 struct operlist *ol = xmalloc(sizeof(struct operlist));
1057 struct operand *oper_r0 = xmalloc(sizeof(struct operand));
1058 struct operand *oper_zero = xmalloc(sizeof(struct operand));
1059 struct registr *r0 = xmalloc(sizeof(struct registr));
1060 oper_zero->type = OPER_RAW;
1061 oper_zero->u.raw = 0;
1064 oper_r0->type = OPER_REG;
1065 oper_r0->u.reg = r0;
1066 ol->oper[0] = oper_r0;
1067 ol->oper[1] = oper_r0;
1068 ol->oper[2] = oper_zero;
1070 insn->operands = ol;
1075 insn_tkiph : OP_TKIPH operlist_2 {
1076 struct instruction *insn = xmalloc(sizeof(struct instruction));
1077 struct operlist *ol = $2;
1078 struct operand *flags = xmalloc(sizeof(struct operand));
1079 struct immediate *imm = xmalloc(sizeof(struct immediate));
1081 flags->type = OPER_IMM;
1083 ol->oper[2] = ol->oper[1];
1084 ol->oper[1] = flags;
1085 insn->op = OP_TKIPH;
1086 insn->operands = ol;
1091 insn_tkiphs : OP_TKIPHS operlist_2 {
1092 struct instruction *insn = xmalloc(sizeof(struct instruction));
1093 struct operlist *ol = $2;
1094 struct operand *flags = xmalloc(sizeof(struct operand));
1095 struct immediate *imm = xmalloc(sizeof(struct immediate));
1096 imm->imm = 0x1 | 0x2;
1097 flags->type = OPER_IMM;
1099 ol->oper[2] = ol->oper[1];
1100 ol->oper[1] = flags;
1101 insn->op = OP_TKIPH;
1102 insn->operands = ol;
1107 insn_tkipl : OP_TKIPL operlist_2 {
1108 struct instruction *insn = xmalloc(sizeof(struct instruction));
1109 struct operlist *ol = $2;
1110 struct operand *flags = xmalloc(sizeof(struct operand));
1111 struct immediate *imm = xmalloc(sizeof(struct immediate));
1113 flags->type = OPER_IMM;
1115 ol->oper[2] = ol->oper[1];
1116 ol->oper[1] = flags;
1117 insn->op = OP_TKIPH;
1118 insn->operands = ol;
1123 insn_tkipls : OP_TKIPLS operlist_2 {
1124 struct instruction *insn = xmalloc(sizeof(struct instruction));
1125 struct operlist *ol = $2;
1126 struct operand *flags = xmalloc(sizeof(struct operand));
1127 struct immediate *imm = xmalloc(sizeof(struct immediate));
1128 imm->imm = 0x0 | 0x2;
1129 flags->type = OPER_IMM;
1131 ol->oper[2] = ol->oper[1];
1132 ol->oper[1] = flags;
1133 insn->op = OP_TKIPH;
1134 insn->operands = ol;
1140 struct instruction *insn = xmalloc(sizeof(struct instruction));
1141 struct operlist *ol = xmalloc(sizeof(struct operlist));
1142 struct operand *regop = xmalloc(sizeof(struct operand));
1143 struct operand *zeroop = xmalloc(sizeof(struct operand));
1144 struct registr *r0 = xmalloc(sizeof(struct registr));
1147 regop->type = OPER_REG;
1149 zeroop->type = OPER_RAW;
1150 zeroop->u.raw = 0x000;
1151 ol->oper[0] = regop;
1152 ol->oper[1] = regop;
1153 ol->oper[2] = zeroop;
1155 insn->operands = ol;
1160 insn_raw : raw_code operlist_3 {
1161 struct instruction *insn = xmalloc(sizeof(struct instruction));
1162 insn->op = RAW_CODE;
1163 insn->operands = $2;
1164 insn->opcode = (unsigned long)$1;
1169 raw_code : RAW_CODE {
1170 yytext++; /* skip @ */
1171 $$ = (void *)(unsigned long)strtoul(yytext, NULL, 16);
1175 extended_operlist : imm_value COMMA imm_value COMMA operand COMMA operand COMMA operand {
1176 struct operlist *ol = xmalloc(sizeof(struct operlist));
1177 struct operand *mask_oper = xmalloc(sizeof(struct operand));
1178 struct operand *shift_oper = xmalloc(sizeof(struct operand));
1179 mask_oper->type = OPER_RAW;
1180 mask_oper->u.raw = (unsigned long)$1;
1181 shift_oper->type = OPER_RAW;
1182 shift_oper->u.raw = (unsigned long)$3;
1183 ol->oper[0] = mask_oper;
1184 ol->oper[1] = shift_oper;
1187 ol->oper[4] = store_oper_sanity($9);
1192 external_jump_operands : imm COMMA labelref {
1193 struct operlist *ol = xmalloc(sizeof(struct operlist));
1194 struct operand *cond = xmalloc(sizeof(struct operand));
1195 cond->type = OPER_IMM;
1203 operlist_2 : operand COMMA operand {
1204 struct operlist *ol = xmalloc(sizeof(struct operlist));
1206 ol->oper[1] = store_oper_sanity($3);
1211 operlist_3 : operand COMMA operand COMMA operand {
1212 struct operlist *ol = xmalloc(sizeof(struct operlist));
1215 ol->oper[2] = store_oper_sanity($5);
1221 struct operand *oper = xmalloc(sizeof(struct operand));
1222 oper->type = OPER_REG;
1227 struct operand *oper = xmalloc(sizeof(struct operand));
1228 oper->type = OPER_MEM;
1233 struct operand *oper = xmalloc(sizeof(struct operand));
1234 oper->type = OPER_RAW;
1235 oper->u.raw = (unsigned long)$1;
1239 struct operand *oper = xmalloc(sizeof(struct operand));
1240 oper->type = OPER_IMM;
1250 struct registr *reg = xmalloc(sizeof(struct registr));
1252 reg->nr = (unsigned long)$2;
1256 struct registr *reg = xmalloc(sizeof(struct registr));
1258 yytext += 3; /* skip "spr" */
1259 reg->nr = strtoul(yytext, NULL, 16);
1263 struct registr *reg = xmalloc(sizeof(struct registr));
1265 reg->nr = (unsigned long)$2;
1270 mem : BRACK_OPEN imm BRACK_CLOSE {
1271 struct memory *mem = xmalloc(sizeof(struct memory));
1272 struct immediate *offset_imm = $2;
1273 mem->type = MEM_DIRECT;
1274 mem->offset = offset_imm->imm;
1278 | BRACK_OPEN imm COMMA OFFR regnr BRACK_CLOSE {
1279 struct memory *mem = xmalloc(sizeof(struct memory));
1280 struct immediate *offset_imm = $2;
1281 mem->type = MEM_INDIRECT;
1282 mem->offset = offset_imm->imm;
1284 mem->offr_nr = (unsigned long)$5;
1290 struct immediate *imm = xmalloc(sizeof(struct immediate));
1291 imm->imm = (unsigned long)$1;
1296 imm_value : hexnum_decnum {
1304 complex_imm : PAREN_OPEN complex_imm_arg complex_imm_oper complex_imm_arg PAREN_CLOSE {
1305 unsigned long a = (unsigned long)$2;
1306 unsigned long b = (unsigned long)$4;
1307 unsigned long operation = (unsigned long)$3;
1308 unsigned long res = 31337;
1309 switch (operation) {
1338 yyerror("Internal parser BUG. complex_imm oper unknown");
1342 | PAREN_OPEN complex_imm PAREN_CLOSE {
1345 | PAREN_OPEN asm_assert PAREN_CLOSE {
1346 /* Inline assertion. Always return zero */
1347 $$ = (void *)(unsigned long)(unsigned int)0;
1349 | PAREN_OPEN BITW_NOT complex_imm PAREN_CLOSE {
1350 unsigned long n = (unsigned long)$3;
1354 | PAREN_OPEN complex_imm_const PAREN_CLOSE {
1359 complex_imm_oper : PLUS {
1360 $$ = (void *)(unsigned long)PLUS;
1363 $$ = (void *)(unsigned long)MINUS;
1366 $$ = (void *)(unsigned long)MULTIPLY;
1369 $$ = (void *)(unsigned long)DIVIDE;
1372 $$ = (void *)(unsigned long)BITW_OR;
1375 $$ = (void *)(unsigned long)BITW_AND;
1378 $$ = (void *)(unsigned long)BITW_XOR;
1381 $$ = (void *)(unsigned long)LEFTSHIFT;
1384 $$ = (void *)(unsigned long)RIGHTSHIFT;
1388 complex_imm_arg : complex_imm_const {
1396 complex_imm_const : hexnum_decnum {
1399 | BITW_NOT hexnum_decnum {
1400 unsigned long n = (unsigned long)$2;
1407 while (yytext[0] != 'x') {
1408 if (yytext[0] == '\0')
1409 yyerror("Internal HEXNUM parser error");
1413 $$ = (void *)(unsigned long)strtoul(yytext, NULL, 16);
1418 $$ = (void *)(unsigned long)strtol(yytext, NULL, 10);
1422 hexnum_decnum : hexnum {
1430 labelref : identifier {
1431 struct operand *oper = xmalloc(sizeof(struct operand));
1432 struct label *label = xmalloc(sizeof(struct label));
1434 label->direction = LABELREF_ABSOLUTE;
1435 oper->type = OPER_LABEL;
1436 oper->u.label = label;
1439 | identifier MINUS {
1440 struct operand *oper = xmalloc(sizeof(struct operand));
1441 struct label *label = xmalloc(sizeof(struct label));
1443 label->direction = LABELREF_RELATIVE_BACK;
1444 oper->type = OPER_LABEL;
1445 oper->u.label = label;
1449 struct operand *oper = xmalloc(sizeof(struct operand));
1450 struct label *label = xmalloc(sizeof(struct label));
1452 label->direction = LABELREF_RELATIVE_FORWARD;
1453 oper->type = OPER_LABEL;
1454 oper->u.label = label;
1460 $$ = (void *)(unsigned long)strtoul(yytext, NULL, 10);
1464 identifier : IDENT {
1465 $$ = xstrdup(yytext);
1471 int section = SECTION_TEXT; /* default to .text section */
1472 struct initvals_sect *cur_initvals_sect;
1474 void yyerror(const char *str)
1479 "Parser ERROR (file \"%s\", line %u, col %u):\n",
1481 cur_lineinfo.lineno,
1482 cur_lineinfo.column);
1483 fprintf(stderr, "%s\n", cur_lineinfo.linecopy);
1484 for (i = 0; i < cur_lineinfo.column - 1; i++)
1485 fprintf(stderr, " ");
1486 fprintf(stderr, "^\n");
1487 fprintf(stderr, "%s\n", str);
1491 static struct operand * store_oper_sanity(struct operand *oper)
1493 if (oper->type == OPER_IMM &&
1494 oper->u.imm->imm != 0) {
1495 yyerror("Only 0x000 Immediate is allowed for "
1501 static void assembler_assertion_failed(void)
1503 yyerror("Assembler %assert failed");