* @author Christian Wuerdig
* $Id$
*/
-
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
#ifdef HAVE_MALLOC_H
#include "irvrfy_t.h"
#include "irprintf.h"
#include "iredges.h"
+#include "error.h"
+#include "raw_bitset.h"
#include "../bearch.h"
#include "gen_ia32_regalloc_if.h"
#include "gen_ia32_machine.h"
+/**
+ * Returns the ident of an entity
+ * @param ent The entity
+ * @return The ident of the entity
+ */
+ident *ia32_get_ent_ident(ir_entity *ent) {
+ ir_type *owner = get_entity_owner(ent);
+ ident *id = get_entity_ld_ident(ent);
+
+ if (owner == get_tls_type()) {
+ if (get_entity_visibility(ent) == visibility_external_allocated)
+ id = mangle(id, new_id_from_chars("@INDNTPOFF", 10));
+ else
+ id = mangle(id, new_id_from_chars("@NTPOFF", 7));
+ }
+ return id;
+}
+
/**
* Returns the ident of a SymConst.
* @param symc The SymConst
* @return The ident of the SymConst
*/
static ident *get_sc_ident(ir_node *symc) {
- ir_entity *ent;
- ir_type *owner;
- ident *id;
-
switch (get_SymConst_kind(symc)) {
case symconst_addr_name:
return get_SymConst_name(symc);
case symconst_addr_ent:
- ent = get_SymConst_entity(symc);
- owner = get_entity_owner(ent);
- id = get_entity_ld_ident(ent);
- if (owner == get_tls_type()) {
- if (get_entity_visibility(ent) == visibility_external_allocated)
- id = mangle(id, new_id_from_chars("@INDNTPOFF", 10));
- else
- id = mangle(id, new_id_from_chars("@NTPOFF", 7));
- }
- return id;
+ return ia32_get_ent_ident(get_SymConst_entity(symc));
default:
assert(0 && "Unsupported SymConst");
* |_|
***********************************************************************************/
-/**
- * Returns a string containing the names of all registers within the limited bitset
- */
-static char *get_limited_regs(const arch_register_req_t *req, char *buf, int max) {
- bitset_t *bs = bitset_alloca(req->cls->n_regs);
- char *p = buf;
- int size = 0;
- int i, cnt;
-
- req->limited(NULL, bs);
-
- for (i = 0; i < req->cls->n_regs; i++) {
- if (bitset_is_set(bs, i)) {
- cnt = snprintf(p, max - size, " %s", req->cls->regs[i].name);
- if (cnt < 0) {
- fprintf(stderr, "dumper problem, exiting\n");
- exit(1);
- }
-
- p += cnt;
- size += cnt;
-
- if (size >= max)
- break;
- }
- }
-
- return buf;
-}
-
/**
* Dumps the register requirements for either in or out.
*/
-static void dump_reg_req(FILE *F, ir_node *n, const ia32_register_req_t **reqs, int inout) {
+static void dump_reg_req(FILE *F, ir_node *n, const arch_register_req_t **reqs,
+ int inout) {
char *dir = inout ? "out" : "in";
int max = inout ? get_ia32_n_res(n) : get_irn_arity(n);
- char *buf = alloca(1024);
+ char buf[1024];
int i;
- memset(buf, 0, 1024);
+ memset(buf, 0, sizeof(buf));
if (reqs) {
for (i = 0; i < max; i++) {
fprintf(F, "%sreq #%d =", dir, i);
- if (reqs[i]->req.type == arch_register_req_type_none) {
+ if (reqs[i]->type == arch_register_req_type_none) {
fprintf(F, " n/a");
}
- if (reqs[i]->req.type & arch_register_req_type_normal) {
- fprintf(F, " %s", reqs[i]->req.cls->name);
+ if (reqs[i]->type & arch_register_req_type_normal) {
+ fprintf(F, " %s", reqs[i]->cls->name);
}
- if (reqs[i]->req.type & arch_register_req_type_limited) {
- fprintf(F, " %s", get_limited_regs(&reqs[i]->req, buf, 1024));
+ if (reqs[i]->type & arch_register_req_type_limited) {
+ fprintf(F, " %s",
+ arch_register_req_format(buf, sizeof(buf), reqs[i], n));
}
- if (reqs[i]->req.type & arch_register_req_type_should_be_same) {
- ir_fprintf(F, " same as %+F", get_irn_n(n, reqs[i]->same_pos));
+ if (reqs[i]->type & arch_register_req_type_should_be_same) {
+ ir_fprintf(F, " same as %+F", get_irn_n(n, reqs[i]->other_same));
}
- if (reqs[i]->req.type & arch_register_req_type_should_be_different) {
- ir_fprintf(F, " different from %+F", get_irn_n(n, reqs[i]->different_pos));
+ if (reqs[i]->type & arch_register_req_type_should_be_different) {
+ ir_fprintf(F, " different from %+F", get_irn_n(n, reqs[i]->other_different));
}
fprintf(F, "\n");
ir_mode *mode = NULL;
int bad = 0;
int i, n_res, am_flav, flags;
- const ia32_register_req_t **reqs;
+ const arch_register_req_t **reqs;
const arch_register_t **slots;
switch (reason) {
break;
case dump_node_nodeattr_txt:
- if (is_ia32_ImmConst(n) || is_ia32_ImmSymConst(n) || is_ia32_Cnst(n)) {
- char *pref = is_ia32_ImmSymConst(n) || (get_ia32_op_type(n) == ia32_SymConst) ? "SymC " : "";
- const char *cnst = get_ia32_cnst(n);
-
- fprintf(F, "[%s%s]", pref, cnst ? cnst : "NONE");
+ if (is_ia32_ImmConst(n) || is_ia32_ImmSymConst(n)) {
+ if(is_ia32_ImmSymConst(n)) {
+ ident *id = get_ia32_Immop_symconst(n);
+ fprintf(F, "[SymC %s]", get_id_str(id));
+ } else {
+ char buf[128];
+ tarval *tv = get_ia32_Immop_tarval(n);
+
+ tarval_snprintf(buf, sizeof(buf), tv);
+ fprintf(F, "[%s]", buf);
+ }
}
if (! is_ia32_Lea(n)) {
case ia32_Normal:
fprintf(F, "Normal");
break;
- case ia32_Const:
- fprintf(F, "Const");
- break;
- case ia32_SymConst:
- fprintf(F, "SymConst");
- break;
case ia32_AddrModeD:
fprintf(F, "AM Dest (Load+Store)");
break;
fprintf(F, " (%d)\n", am_flav);
/* dump AM offset */
- fprintf(F, "AM offset = ");
- if (get_ia32_am_offs(n)) {
- fprintf(F, "%s", get_ia32_am_offs(n));
- }
- else {
- fprintf(F, "n/a");
+ if(get_ia32_am_offs_int(n) != 0) {
+ fprintf(F, "AM offset = %d\n", get_ia32_am_offs_int(n));
}
- fprintf(F, "\n");
/* dump AM symconst */
if(get_ia32_am_sc(n) != NULL) {
fprintf(F, "AM scale = %d\n", get_ia32_am_scale(n));
/* dump pn code */
- fprintf(F, "pn_code = %ld (%s)\n", get_ia32_pncode(n), get_pnc_string(get_ia32_pncode(n)));
+ if(get_ia32_pncode(n) & ia32_pn_Cmp_Unsigned) {
+ fprintf(F, "pn_code = %d (%s, unsigned)\n", get_ia32_pncode(n),
+ get_pnc_string(get_ia32_pncode(n) & ~ia32_pn_Cmp_Unsigned));
+ } else {
+ fprintf(F, "pn_code = %d (%s)\n", get_ia32_pncode(n),
+ get_pnc_string(get_ia32_pncode(n)));
+ }
/* dump n_res */
fprintf(F, "n_res = %d\n", get_ia32_n_res(n));
/* got lea */
fprintf(F, "got loea = %d\n", is_ia32_got_lea(n));
- /* got reload */
- fprintf(F, "got reload = %d\n", is_ia32_got_reload(n));
+ /* need stackent */
+ fprintf(F, "need stackent = %d\n", is_ia32_need_stackent(n));
/* dump latency */
fprintf(F, "latency = %d\n", get_ia32_latency(n));
}
fprintf(F, "\n");
- fprintf(F, "res_mode = ");
- if (get_ia32_res_mode(n)) {
- ir_fprintf(F, "%+F", get_ia32_res_mode(n));
- }
- else {
- fprintf(F, "n/a");
- }
- fprintf(F, "\n");
-
#ifndef NDEBUG
/* dump original ir node name */
fprintf(F, "orig node = ");
* |___/
***************************************************************************************************/
-/**
- * Returns an ident for the given tarval tv.
- */
-static ident *get_ident_for_tv(tarval *tv) {
- char buf[1024];
- int len = tarval_snprintf(buf, sizeof(buf), tv);
- assert(len);
- return new_id_from_str(buf);
-}
-
/**
* Wraps get_irn_generic_attr() as it takes no const ir_node, so we need to do a cast.
* Firm was made by people hating const :-(
return attr->data.imm_tp;
}
-/**
- * Sets the immediate op type of an ia32 node.
- */
-void set_ia32_immop_type(ir_node *node, ia32_immop_type_t tp) {
- ia32_attr_t *attr = get_ia32_attr(node);
- attr->data.imm_tp = tp;
-}
-
/**
* Gets the supported addrmode of an ia32 node
*/
attr->data.am_flavour = am_flavour;
}
-/**
- * Joins all offsets to one string with adds.
- */
-char *get_ia32_am_offs(const ir_node *node) {
- ia32_attr_t *attr = get_ia32_attr(node);
- static char res[64];
-
- snprintf(res, sizeof(res), "%+d", attr->am_offs);
-
- return res;
-}
-
/**
* Gets the addressmode offset as int.
*/
attr->am_offs = offset;
}
-/**
- * Add an offset for addrmode.
- */
-static void extend_ia32_am_offs(ir_node *node, char *offset, char op) {
- ia32_attr_t *attr = get_ia32_attr(node);
- int res, o;
-
- if (offset == NULL || offset[0] == '\0')
- return;
-
- if (offset[0] == '-')
- res = sscanf(offset, "%d", &o);
- else
- res = sscanf(offset, "%u", &o);
- assert(res == 1);
-
- if (op == '-')
- attr->am_offs -= o;
- else if (op == '+')
- attr->am_offs += o;
- else
- assert(0);
-}
-
-/**
- * Add an offset for addrmode.
- */
-void add_ia32_am_offs(ir_node *node, const char *offset) {
- extend_ia32_am_offs(node, (char *)offset, '+');
-}
-
void add_ia32_am_offs_int(ir_node *node, int offset) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->am_offs += offset;
}
-/**
- * Sub an offset for addrmode.
- */
-void sub_ia32_am_offs(ir_node *node, const char *offset) {
- extend_ia32_am_offs(node, (char *)offset, '-');
-}
-
/**
* Returns the symconst ident associated to addrmode.
*/
*/
tarval *get_ia32_Immop_tarval(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
+ assert(attr->data.imm_tp == ia32_ImmConst);
return attr->cnst_val.tv;
}
*/
void set_ia32_Immop_tarval(ir_node *node, tarval *tv) {
ia32_attr_t *attr = get_ia32_attr(node);
+ attr->data.imm_tp = ia32_ImmConst;
attr->cnst_val.tv = tv;
- attr->cnst = get_ident_for_tv(tv);
-}
-
-/**
- * Gets the string representation of the internal const (tv or symconst)
- */
-const char *get_ia32_cnst(const ir_node *node) {
- ia32_attr_t *attr = get_ia32_attr(node);
- if (! attr->cnst)
- return NULL;
- return get_id_str(attr->cnst);
}
-/**
- * Sets the string representation of the internal const.
- */
-void set_ia32_cnst(ir_node *node, const char *cnst) {
- ia32_attr_t *attr = get_ia32_attr(node);
- attr->cnst = new_id_from_str(cnst);
-}
-
-/**
- * Gets the ident representation of the internal const (tv or symconst)
- */
-ident *get_ia32_id_cnst(const ir_node *node) {
+void set_ia32_Immop_symconst(ir_node *node, ident *ident) {
ia32_attr_t *attr = get_ia32_attr(node);
- return attr->cnst;
+ attr->data.imm_tp = ia32_ImmSymConst;
+ attr->cnst_val.sc = ident;
}
-/**
- * Sets the ident representation of the internal const.
- */
-void set_ia32_id_cnst(ir_node *node, ident *cnst) {
+ident *get_ia32_Immop_symconst(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
- attr->cnst = cnst;
+ assert(attr->data.imm_tp == ia32_ImmSymConst);
+ return attr->cnst_val.sc;
}
/**
return attr->data.got_lea;
}
-/**
- * Sets node got_reload.
- */
-void set_ia32_got_reload(ir_node *node) {
+void set_ia32_need_stackent(ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
- attr->data.got_reload = 1;
+ attr->data.need_stackent = 1;
}
-/**
- * Clears node got_reload.
- */
-void clear_ia32_got_reload(ir_node *node) {
+void clear_ia32_need_stackent(ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
- attr->data.got_reload = 0;
+ attr->data.need_stackent = 0;
}
-/**
- * Checks if node got reload.
- */
-int is_ia32_got_reload(const ir_node *node) {
+int is_ia32_need_stackent(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
- return attr->data.got_reload;
+ return attr->data.need_stackent;
}
/**
attr->ls_mode = mode;
}
-/**
- * Gets the mode of the result.
- */
-ir_mode *get_ia32_res_mode(const ir_node *node) {
- ia32_attr_t *attr = get_ia32_attr(node);
- return attr->res_mode;
-}
-
-/**
- * Sets the mode of the result.
- */
-void set_ia32_res_mode(ir_node *node, ir_mode *mode) {
- ia32_attr_t *attr = get_ia32_attr(node);
- attr->res_mode = mode;
-}
-
/**
* Gets the frame entity assigned to this node.
*/
void set_ia32_frame_ent(ir_node *node, ir_entity *ent) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->frame_ent = ent;
- set_ia32_use_frame(node);
+ if(ent != NULL)
+ set_ia32_use_frame(node);
+ else
+ clear_ia32_use_frame(node);
}
/**
* Returns the argument register requirements of an ia32 node.
*/
-const ia32_register_req_t **get_ia32_in_req_all(const ir_node *node) {
+const arch_register_req_t **get_ia32_in_req_all(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
return attr->in_req;
}
/**
* Sets the argument register requirements of an ia32 node.
*/
-void set_ia32_in_req_all(ir_node *node, const ia32_register_req_t **reqs) {
+void set_ia32_in_req_all(ir_node *node, const arch_register_req_t **reqs) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->in_req = reqs;
}
/**
* Returns the result register requirements of an ia32 node.
*/
-const ia32_register_req_t **get_ia32_out_req_all(const ir_node *node) {
+const arch_register_req_t **get_ia32_out_req_all(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
return attr->out_req;
}
/**
* Sets the result register requirements of an ia32 node.
*/
-void set_ia32_out_req_all(ir_node *node, const ia32_register_req_t **reqs) {
+void set_ia32_out_req_all(ir_node *node, const arch_register_req_t **reqs) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->out_req = reqs;
}
/**
* Returns the argument register requirement at position pos of an ia32 node.
*/
-const ia32_register_req_t *get_ia32_in_req(const ir_node *node, int pos) {
+const arch_register_req_t *get_ia32_in_req(const ir_node *node, int pos) {
ia32_attr_t *attr = get_ia32_attr(node);
- return attr->in_req != NULL ? attr->in_req[pos] : NULL;
+ if(attr->in_req == NULL)
+ return arch_no_register_req;
+
+ return attr->in_req[pos];
}
/**
* Returns the result register requirement at position pos of an ia32 node.
*/
-const ia32_register_req_t *get_ia32_out_req(const ir_node *node, int pos) {
+const arch_register_req_t *get_ia32_out_req(const ir_node *node, int pos) {
ia32_attr_t *attr = get_ia32_attr(node);
- return attr->out_req != NULL ? attr->out_req[pos] : NULL;
+ if(attr->out_req == NULL)
+ return arch_no_register_req;
+
+ return attr->out_req[pos];
}
/**
* Sets the OUT register requirements at position pos.
*/
-void set_ia32_req_out(ir_node *node, const ia32_register_req_t *req, int pos) {
+void set_ia32_req_out(ir_node *node, const arch_register_req_t *req, int pos) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->out_req[pos] = req;
}
/**
* Sets the IN register requirements at position pos.
*/
-void set_ia32_req_in(ir_node *node, const ia32_register_req_t *req, int pos) {
+void set_ia32_req_in(ir_node *node, const arch_register_req_t *req, int pos) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->in_req[pos] = req;
}
/**
* Returns the projnum code.
*/
-long get_ia32_pncode(const ir_node *node) {
+pn_Cmp get_ia32_pncode(const ir_node *node) {
ia32_attr_t *attr = get_ia32_attr(node);
return attr->pn_code;
}
/**
* Sets the projnum code
*/
-void set_ia32_pncode(ir_node *node, long code) {
+void set_ia32_pncode(ir_node *node, pn_Cmp code) {
ia32_attr_t *attr = get_ia32_attr(node);
attr->pn_code = code;
}
* |_|
******************************************************************************************************/
-/**
- * Gets the type of an ia32_Const.
- */
-unsigned get_ia32_Const_type(const ir_node *node) {
- ia32_attr_t *attr = get_ia32_attr(node);
-
- assert(is_ia32_Cnst(node) && "Need ia32_Const to get type");
-
- return attr->data.tp;
-}
-
-/**
- * Sets the type of an ia32_Const.
- */
-void set_ia32_Const_type(ir_node *node, int type) {
- ia32_attr_t *attr = get_ia32_attr(node);
-
- assert(is_ia32_Cnst(node) && "Need ia32_Const to set type");
- assert((type == ia32_Const || type == ia32_SymConst) && "Unsupported ia32_Const type");
-
- attr->data.tp = type;
-}
-
/**
* Copy the attributes from an ia32_Const to an Immop (Add_i, Sub_i, ...) node
*/
-void set_ia32_Immop_attr(ir_node *node, ir_node *cnst) {
- ia32_attr_t *na = get_ia32_attr(node);
- ia32_attr_t *ca = get_ia32_attr(cnst);
-
- switch(get_ia32_Const_type(cnst)) {
- case ia32_Const:
- na->cnst_val.tv = ca->cnst_val.tv;
- na->cnst = ca->cnst;
- set_ia32_immop_type(node, ia32_ImmConst);
- break;
- case ia32_SymConst:
- na->cnst_val.sc = ca->cnst_val.sc;
- na->cnst = na->cnst_val.sc;
- set_ia32_immop_type(node, ia32_ImmSymConst);
- break;
- default:
- assert(0 && "Need ia32_Const to set Immop attr");
- }
-}
-
-/**
- * Copy the attributes from Immop to an Immop
- */
-void copy_ia32_Immop_attr(ir_node *dst, ir_node *src) {
- ia32_attr_t *da = get_ia32_attr(dst);
- ia32_attr_t *sa = get_ia32_attr(src);
-
- switch(get_ia32_immop_type(src)) {
- case ia32_ImmConst:
- da->cnst_val.tv = sa->cnst_val.tv;
- da->cnst = sa->cnst;
- set_ia32_immop_type(dst, ia32_ImmConst);
- break;
- case ia32_ImmSymConst:
- da->cnst_val.sc = sa->cnst_val.sc;
- da->cnst = sa->cnst;
- set_ia32_immop_type(dst, ia32_ImmSymConst);
- break;
- default:
- assert(0 && "Need Immop to copy Immop attr");
+void copy_ia32_Immop_attr(ir_node *node, ir_node *from) {
+ ia32_immop_type_t immop_type = get_ia32_immop_type(from);
+
+ if(immop_type == ia32_ImmConst) {
+ set_ia32_Immop_tarval(node, get_ia32_Immop_tarval(from));
+ } else if(immop_type == ia32_ImmSymConst) {
+ set_ia32_Immop_symconst(node, get_ia32_Immop_symconst(from));
+ } else {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ assert(immop_type == ia32_ImmNone);
+ attr->data.imm_tp = ia32_ImmNone;
}
}
* Copy the attributes from a Firm Const/SymConst to an ia32_Const
*/
void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst) {
- ia32_attr_t *attr = get_ia32_attr(ia32_cnst);
- ir_mode *mode;
-
assert(is_ia32_Cnst(ia32_cnst) && "Need ia32_Const to set Const attr");
switch (get_irn_opcode(cnst)) {
case iro_Const:
- attr->data.tp = ia32_Const;
- attr->cnst_val.tv = get_Const_tarval(cnst);
- mode = get_tarval_mode(attr->cnst_val.tv);
- if (mode_is_reference(mode) &&
- get_mode_null(mode) == attr->cnst_val.tv) {
- attr->cnst_val.tv = get_mode_null(mode_Iu);
- }
- attr->cnst = get_ident_for_tv(attr->cnst_val.tv);
+ set_ia32_Const_tarval(ia32_cnst, get_Const_tarval(cnst));
break;
case iro_SymConst:
- attr->data.tp = ia32_SymConst;
- attr->cnst_val.sc = get_sc_ident(cnst);
- attr->cnst = attr->cnst_val.sc;
+ set_ia32_Immop_symconst(ia32_cnst, get_sc_ident(cnst));
break;
case iro_Unknown:
assert(0 && "Unknown Const NYI");
}
}
+void set_ia32_Const_tarval(ir_node *ia32_cnst, tarval *tv) {
+ if(mode_is_reference(get_tarval_mode(tv))) {
+ if(tarval_is_null(tv)) {
+ tv = get_tarval_null(mode_Iu);
+ } else {
+ panic("Can't convert reference tarval to mode_Iu at %+F", ia32_cnst);
+ }
+ } else {
+ tv = tarval_convert_to(tv, mode_Iu);
+ }
+
+ assert(tv != get_tarval_bad() && tv != get_tarval_undefined()
+ && tv != NULL);
+ set_ia32_Immop_tarval(ia32_cnst, tv);
+}
+
+
/**
* Sets the AddrMode(S|D) attribute
*/
/**
* Initializes the nodes attributes.
*/
-void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs,
- const ia32_register_req_t **out_reqs, const be_execution_unit_t ***execution_units,
- int n_res, unsigned latency)
+void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags,
+ const arch_register_req_t **in_reqs,
+ const arch_register_req_t **out_reqs,
+ const be_execution_unit_t ***execution_units,
+ int n_res, unsigned latency)
{
ia32_attr_t *attr = get_ia32_attr(node);
return NULL;
}
-ir_mode *get_ia32_Conv_src_mode(const ir_node *node)
-{
- if(get_ia32_op_type(node) == ia32_AddrModeS) {
- return get_ia32_ls_mode(node);
- }
-
- return get_irn_mode(get_irn_n(node, 2));
-}
-
-ir_mode *get_ia32_Conv_tgt_mode(const ir_node *node)
-{
- return get_irn_mode(node);
-}
-
/***************************************************************************************
* _ _ _
* | | | | | |
*
***************************************************************************************/
-/* default compare operation to compare immediate ops */
-int ia32_compare_immop_attr(ia32_attr_t *a, ia32_attr_t *b) {
- int equ = 0;
-
- if (a->data.tp != b->data.tp)
+/* default compare operation to compare attributes */
+int ia32_compare_attr(ia32_attr_t *a, ia32_attr_t *b) {
+ if (a->data.tp != b->data.tp
+ || a->data.imm_tp != b->data.imm_tp)
return 1;
- if (a->cnst != b->cnst)
+ if (a->data.imm_tp == ia32_ImmConst
+ && a->cnst_val.tv != b->cnst_val.tv)
return 1;
- if (a->data.use_frame != b->data.use_frame)
+ if (a->data.imm_tp == ia32_ImmSymConst
+ && a->cnst_val.sc != b->cnst_val.sc)
return 1;
- if (a->data.use_frame && a->frame_ent != b->frame_ent)
+ if (a->data.am_flavour != b->data.am_flavour
+ || a->data.am_scale != b->data.am_scale
+ || a->data.offs_sign != b->data.offs_sign
+ || a->data.am_sc_sign != b->data.am_sc_sign
+ || a->am_offs != b->am_offs
+ || a->am_sc != b->am_sc
+ || a->ls_mode != b->ls_mode)
return 1;
- if (a->data.am_flavour != b->data.am_flavour
- || a->data.am_scale != b->data.am_scale
- || a->data.offs_sign != b->data.offs_sign
- || a->data.am_sc_sign != b->data.am_sc_sign
- || a->am_offs != b->am_offs
- || a->am_sc != b->am_sc)
+ if (a->data.use_frame != b->data.use_frame
+ || a->data.use_frame != b->data.use_frame
+ || a->frame_ent != b->frame_ent)
return 1;
if(a->pn_code != b->pn_code)
return 1;
- return !equ;
+ if (a->data.tp != b->data.tp
+ || a->data.op_flav != b->data.op_flav)
+ return 1;
+
+ return 0;
}
/* copies the ia32 attributes */
memcpy(attr_new, attr_old, get_op_attr_size(get_irn_op(old_node)));
/* copy out flags */
- DUP_ARR_D(int, get_irg_obstack(get_irn_irg(new_node)), attr_old->out_flags);
+ attr_new->out_flags =
+ DUP_ARR_D(int, get_irg_obstack(get_irn_irg(new_node)), attr_old->out_flags);
}
/**