Lines Matching refs:value

37 #include "value.h"
47 yasm_value_initialize(/*@out@*/ yasm_value *value,
50 value->abs = e;
51 value->rel = NULL;
52 value->wrt = NULL;
53 value->seg_of = 0;
54 value->rshift = 0;
55 value->curpos_rel = 0;
56 value->ip_rel = 0;
57 value->jump_target = 0;
58 value->section_rel = 0;
59 value->no_warn = 0;
60 value->sign = 0;
61 value->size = size;
65 yasm_value_init_sym(/*@out@*/ yasm_value *value, /*@null@*/ yasm_symrec *sym,
68 value->abs = NULL;
69 value->rel = sym;
70 value->wrt = NULL;
71 value->seg_of = 0;
72 value->rshift = 0;
73 value->curpos_rel = 0;
74 value->ip_rel = 0;
75 value->jump_target = 0;
76 value->section_rel = 0;
77 value->no_warn = 0;
78 value->sign = 0;
79 value->size = size;
83 yasm_value_init_copy(yasm_value *value, const yasm_value *orig)
85 value->abs = orig->abs ? yasm_expr_copy(orig->abs) : NULL;
86 value->rel = orig->rel;
87 value->wrt = orig->wrt;
88 value->seg_of = orig->seg_of;
89 value->rshift = orig->rshift;
90 value->curpos_rel = orig->curpos_rel;
91 value->ip_rel = orig->ip_rel;
92 value->jump_target = orig->jump_target;
93 value->section_rel = orig->section_rel;
94 value->no_warn = orig->no_warn;
95 value->sign = orig->sign;
96 value->size = orig->size;
100 yasm_value_delete(yasm_value *value)
102 if (value->abs)
103 yasm_expr_destroy(value->abs);
104 value->abs = NULL;
105 value->rel = NULL;
109 yasm_value_set_curpos_rel(yasm_value *value, yasm_bytecode *bc,
112 value->curpos_rel = 1;
113 value->ip_rel = ip_rel;
115 * have a relative portion of the value. If one doesn't exist, point
118 if (!value->rel) {
120 value->rel = yasm_symtab_abs_sym(object->symtab);
125 value_finalize_scan(yasm_value *value, yasm_expr *e,
185 if (value_finalize_scan(value, sube, expr_precbc,
200 if (value_finalize_scan(value, sube, expr_precbc,
207 if (value_finalize_scan(value, sube, expr_precbc,
237 if (value_finalize_scan(value, sube, expr_precbc,
272 if (j == e->numterms && !value->curpos_rel
283 /* Mark value as curpos-relative */
284 if (value->rel || ssym_not_ok)
286 value->rel = e->terms[j].data.sym;
287 value->curpos_rel = 1;
322 if (value->rel || ssym_not_ok)
324 value->rel = e->terms[i].data.sym;
343 if (value->rel || ssym_not_ok)
350 if ((shamt + value->rshift) > YASM_VALUE_RSHIFT_MAX)
353 /* Update value */
354 value->rshift += shamt;
355 value->rel = e->terms[0].data.sym;
371 if (value->seg_of)
373 value->seg_of = 1;
375 if (value->rel || ssym_not_ok)
377 value->rel = e->terms[0].data.sym;
394 if (value->wrt)
396 value->wrt = e->terms[1].data.sym;
410 if (value->rel || ssym_not_ok)
412 value->rel = e->terms[0].data.sym;
419 return value_finalize_scan(value, e->terms[0].data.expn,
434 return value_finalize_scan(value,
448 yasm_value_finalize_expr(yasm_value *value, yasm_expr *e,
452 yasm_value_initialize(value, NULL, size);
455 yasm_value_initialize(value, e, size);
456 return yasm_value_finalize(value, precbc);
460 yasm_value_finalize(yasm_value *value, yasm_bytecode *precbc)
462 if (!value->abs)
465 value->abs = yasm_expr__level_tree(value->abs, 1, 1, 0, 0, NULL, NULL);
472 * of the value size. This allows forced avoidance of overflow warnings.
474 if (value->abs->op == YASM_EXPR_AND) {
477 /* Calculate 1<<size - 1 value */
479 yasm_intnum *mask_tmp = yasm_intnum_create_uint(value->size);
486 for (term=value->abs->numterms-1; term>=0; term--) {
487 if (value->abs->terms[term].type == YASM_EXPR_INT &&
488 yasm_intnum_compare(value->abs->terms[term].data.intn,
491 yasm_intnum_destroy(value->abs->terms[term].data.intn);
494 if (term != value->abs->numterms-1) /* if it wasn't last.. */
495 memmove(&value->abs->terms[term],
496 &value->abs->terms[term+1],
497 (value->abs->numterms-1-term)*
501 value->abs->numterms--;
504 value->no_warn = 1;
507 if (value->abs->numterms == 1)
508 value->abs->op = YASM_EXPR_IDENT;
513 if (value->abs->op == YASM_EXPR_IDENT) {
514 switch (value->abs->terms[0].type) {
516 if (yasm_intnum_is_zero(value->abs->terms[0].data.intn)) {
517 yasm_expr_destroy(value->abs);
518 value->abs = NULL;
525 value->rel = value->abs->terms[0].data.sym;
526 yasm_expr_destroy(value->abs);
527 value->abs = NULL;
531 while (value->abs->op == YASM_EXPR_IDENT
532 && value->abs->terms[0].type == YASM_EXPR_EXPR) {
533 yasm_expr *sube = value->abs->terms[0].data.expn;
534 yasm_xfree(value->abs);
535 value->abs = sube;
543 if (value_finalize_scan(value, value->abs, precbc, 0))
546 value->abs = yasm_expr__level_tree(value->abs, 1, 1, 0, 0, NULL, NULL);
549 if (value->abs->op == YASM_EXPR_IDENT
550 && value->abs->terms[0].type == YASM_EXPR_INT
551 && yasm_intnum_is_zero(value->abs->terms[0].data.intn)) {
552 yasm_expr_destroy(value->abs);
553 value->abs = NULL;
559 yasm_value_get_intnum(yasm_value *value, yasm_bytecode *bc, int calc_bc_dist)
565 if (value->abs) {
569 intn = yasm_expr_get_intnum(&value->abs, calc_bc_dist);
574 if (value->rel) {
582 return NULL; /* Can't calculate relative value */
584 sym_local = yasm_symrec_get_label(value->rel, &rel_prevbc);
585 if (value->wrt || value->seg_of || value->section_rel || !sym_local)
589 if (!value->curpos_rel)
592 /* Calculate value relative to current assembly position */
602 if (value->rshift > 0) {
604 yasm_intnum_create_uint((unsigned long)value->rshift);
622 yasm_value_output_basic(yasm_value *value, /*@out@*/ unsigned char *buf,
630 unsigned int valsize = value->size;
632 if (value->no_warn)
635 if (value->abs) {
637 if (!value->rel && value->abs->op == YASM_EXPR_IDENT
638 && value->abs->terms[0].type == YASM_EXPR_FLOAT) {
639 if (yasm_arch_floatnum_tobytes(arch, value->abs->terms[0].data.flt,
647 if (yasm_expr__contains(value->abs, YASM_EXPR_FLOAT)) {
654 intn = yasm_expr_get_intnum(&value->abs, 1);
661 yasm_expr *seg = yasm_expr_extract_deep_segoff(&value->abs);
664 intn = yasm_expr_get_intnum(&value->abs, 1);
677 warn = value->sign ? -1 : 1;
679 if (value->rel) {
686 sym_local = yasm_symrec_get_label(value->rel, &rel_prevbc);
687 if (value->wrt || value->seg_of || value->section_rel || !sym_local)
691 if (!value->curpos_rel)
694 /* Calculate value relative to current assembly position */
704 if (value->rshift > 0) {
706 yasm_intnum_create_uint((unsigned long)value->rshift);
721 if (value->seg_of || value->rshift || value->curpos_rel || value->ip_rel
722 || value->section_rel)
742 yasm_value_print(const yasm_value *value, FILE *f, int indent_level)
744 fprintf(f, "%*s%u-bit, %ssigned", indent_level, "", value->size,
745 value->sign ? "" : "un");
747 yasm_expr_print(value->abs, f);
749 if (value->rel) {
751 value->seg_of ? "SEG " : "",
752 yasm_symrec_get_name(value->rel));
753 if (value->wrt)
755 yasm_symrec_get_name(value->wrt));
756 if (value->rshift > 0)
758 value->rshift);
759 if (value->curpos_rel)
762 if (value->ip_rel)
764 if (value->jump_target)
766 if (value->section_rel)
768 if (value->no_warn)