return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
#define expr_new_ident(r) \
expr_new ((ExprItem *)NULL, EXPR_IDENT, (r))
+int expr_contains_float(const expr *);
+
int expr_simplify(expr *);
void expr_print(expr *);
return sym->name;
}
+const expr *
+symrec_get_equ(const symrec *sym)
+{
+ if (sym->type == SYM_EQU)
+ return sym->value.expn;
+ return (const expr *)NULL;
+}
+
void
symrec_print(const symrec *sym)
{
const char *symrec_get_name(const symrec *sym);
+const expr *symrec_get_equ(const symrec *sym);
+
int symrec_foreach(int (*func) (symrec *sym));
void symrec_print(const symrec *sym);
return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
%type <bc> line lineexp exp instr instrbase
%type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
%type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
%type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
%type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
%type <ea> rm8 rm16 rm32 rm64 rm128
%type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
%type <sym> explabel
%type <str_val> label_id
%type <tgt_val> target
;
lineexp: exp
- | TIMES expr_no_fltstr exp { $$ = $3; SetBCMultiple($$, $2); }
+ | TIMES expr exp { $$ = $3; SetBCMultiple($$, $2); }
| label { $$ = (bytecode *)NULL; }
| label exp { $$ = $2; }
- | label TIMES expr_no_fltstr exp { $$ = $4; SetBCMultiple($$, $3); }
+ | label TIMES expr exp { $$ = $4; SetBCMultiple($$, $3); }
| label_id EQU expr {
symrec_define_equ($1, $3);
$$ = (bytecode *)NULL;
exp: instr
| DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
- | RESERVE_SPACE expr_no_fltstr { $$ = bytecode_new_reserve($2, $1); }
+ | RESERVE_SPACE expr { $$ = bytecode_new_reserve($2, $1); }
;
datavals: dataval {
;
/* memory addresses */
-memexp: expr { $$ = effaddr_new_expr($1); }
+memexpr: expr
;
-memaddr: memexp { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
| REG_CS ':' memaddr { $$ = $3; SetEASegment($$, 0x2E); }
| REG_SS ':' memaddr { $$ = $3; SetEASegment($$, 0x36); }
| REG_DS ':' memaddr { $$ = $3; SetEASegment($$, 0x3E); }
;
/* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
| SHORT target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
| NEAR target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
;
/* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| FLTNUM { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| explabel { $$ = expr_new_ident(ExprSym($1)); }
/*| expr '||' expr { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
| expr '|' expr { $$ = expr_new_tree($1, EXPR_OR, $3); }
%type <bc> line lineexp exp instr instrbase
%type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
%type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
%type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
%type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
%type <ea> rm8 rm16 rm32 rm64 rm128
%type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
%type <sym> explabel
%type <str_val> label_id
%type <tgt_val> target
;
lineexp: exp
- | TIMES expr_no_fltstr exp { $$ = $3; SetBCMultiple($$, $2); }
+ | TIMES expr exp { $$ = $3; SetBCMultiple($$, $2); }
| label { $$ = (bytecode *)NULL; }
| label exp { $$ = $2; }
- | label TIMES expr_no_fltstr exp { $$ = $4; SetBCMultiple($$, $3); }
+ | label TIMES expr exp { $$ = $4; SetBCMultiple($$, $3); }
| label_id EQU expr {
symrec_define_equ($1, $3);
$$ = (bytecode *)NULL;
exp: instr
| DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
- | RESERVE_SPACE expr_no_fltstr { $$ = bytecode_new_reserve($2, $1); }
+ | RESERVE_SPACE expr { $$ = bytecode_new_reserve($2, $1); }
;
datavals: dataval {
;
/* memory addresses */
-memexp: expr { $$ = effaddr_new_expr($1); }
+memexpr: expr
;
-memaddr: memexp { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
| REG_CS ':' memaddr { $$ = $3; SetEASegment($$, 0x2E); }
| REG_SS ':' memaddr { $$ = $3; SetEASegment($$, 0x36); }
| REG_DS ':' memaddr { $$ = $3; SetEASegment($$, 0x3E); }
;
/* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
| SHORT target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
| NEAR target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
;
/* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| FLTNUM { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| explabel { $$ = expr_new_ident(ExprSym($1)); }
/*| expr '||' expr { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
| expr '|' expr { $$ = expr_new_tree($1, EXPR_OR, $3); }
return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
return e;
}
+int
+expr_contains_float(const expr *e)
+{
+ if (!e)
+ return 0;
+
+ switch (e->left.type) {
+ case EXPR_SYM:
+ if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+ return 1;
+ break;
+ case EXPR_EXPR:
+ if (expr_contains_float(e->left.data.expn))
+ return 1;
+ break;
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+
+ switch (e->right.type) {
+ case EXPR_SYM:
+ return expr_contains_float(symrec_get_equ(e->right.data.sym));
+ case EXPR_EXPR:
+ return expr_contains_float(e->right.data.expn);
+ case EXPR_FLOAT:
+ return 1;
+ case EXPR_INT:
+ case EXPR_NONE:
+ break;
+ }
+ return 0;
+}
+
/* get rid of unnecessary branches if possible. report. */
int
expr_simplify(expr *e)
#define expr_new_ident(r) \
expr_new ((ExprItem *)NULL, EXPR_IDENT, (r))
+int expr_contains_float(const expr *);
+
int expr_simplify(expr *);
void expr_print(expr *);
%type <bc> line lineexp exp instr instrbase
%type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
%type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
%type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
%type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
%type <ea> rm8 rm16 rm32 rm64 rm128
%type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
%type <sym> explabel
%type <str_val> label_id
%type <tgt_val> target
;
lineexp: exp
- | TIMES expr_no_fltstr exp { $$ = $3; SetBCMultiple($$, $2); }
+ | TIMES expr exp { $$ = $3; SetBCMultiple($$, $2); }
| label { $$ = (bytecode *)NULL; }
| label exp { $$ = $2; }
- | label TIMES expr_no_fltstr exp { $$ = $4; SetBCMultiple($$, $3); }
+ | label TIMES expr exp { $$ = $4; SetBCMultiple($$, $3); }
| label_id EQU expr {
symrec_define_equ($1, $3);
$$ = (bytecode *)NULL;
exp: instr
| DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
- | RESERVE_SPACE expr_no_fltstr { $$ = bytecode_new_reserve($2, $1); }
+ | RESERVE_SPACE expr { $$ = bytecode_new_reserve($2, $1); }
;
datavals: dataval {
;
/* memory addresses */
-memexp: expr { $$ = effaddr_new_expr($1); }
+memexpr: expr
;
-memaddr: memexp { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
| REG_CS ':' memaddr { $$ = $3; SetEASegment($$, 0x2E); }
| REG_SS ':' memaddr { $$ = $3; SetEASegment($$, 0x36); }
| REG_DS ':' memaddr { $$ = $3; SetEASegment($$, 0x3E); }
;
/* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
| SHORT target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
| NEAR target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
;
/* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| FLTNUM { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| explabel { $$ = expr_new_ident(ExprSym($1)); }
/*| expr '||' expr { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
| expr '|' expr { $$ = expr_new_tree($1, EXPR_OR, $3); }
%type <bc> line lineexp exp instr instrbase
%type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
%type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
%type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
%type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
%type <ea> rm8 rm16 rm32 rm64 rm128
%type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
%type <sym> explabel
%type <str_val> label_id
%type <tgt_val> target
;
lineexp: exp
- | TIMES expr_no_fltstr exp { $$ = $3; SetBCMultiple($$, $2); }
+ | TIMES expr exp { $$ = $3; SetBCMultiple($$, $2); }
| label { $$ = (bytecode *)NULL; }
| label exp { $$ = $2; }
- | label TIMES expr_no_fltstr exp { $$ = $4; SetBCMultiple($$, $3); }
+ | label TIMES expr exp { $$ = $4; SetBCMultiple($$, $3); }
| label_id EQU expr {
symrec_define_equ($1, $3);
$$ = (bytecode *)NULL;
exp: instr
| DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
- | RESERVE_SPACE expr_no_fltstr { $$ = bytecode_new_reserve($2, $1); }
+ | RESERVE_SPACE expr { $$ = bytecode_new_reserve($2, $1); }
;
datavals: dataval {
;
/* memory addresses */
-memexp: expr { $$ = effaddr_new_expr($1); }
+memexpr: expr
;
-memaddr: memexp { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
| REG_CS ':' memaddr { $$ = $3; SetEASegment($$, 0x2E); }
| REG_SS ':' memaddr { $$ = $3; SetEASegment($$, 0x36); }
| REG_DS ':' memaddr { $$ = $3; SetEASegment($$, 0x3E); }
;
/* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
| SHORT target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
| NEAR target { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
;
/* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| FLTNUM { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM { $$ = expr_new_ident(ExprInt($1)); }
| explabel { $$ = expr_new_ident(ExprSym($1)); }
/*| expr '||' expr { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
| expr '|' expr { $$ = expr_new_tree($1, EXPR_OR, $3); }
return sym->name;
}
+const expr *
+symrec_get_equ(const symrec *sym)
+{
+ if (sym->type == SYM_EQU)
+ return sym->value.expn;
+ return (const expr *)NULL;
+}
+
void
symrec_print(const symrec *sym)
{
const char *symrec_get_name(const symrec *sym);
+const expr *symrec_get_equ(const symrec *sym);
+
int symrec_foreach(int (*func) (symrec *sym));
void symrec_print(const symrec *sym);