+void set_ia32_op_type(ir_node *node, ia32_op_type_t tp) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ attr->data.tp = tp;
+}
+
+/**
+ * Gets the immediate op type of an ia32 node.
+ */
+ia32_immop_type_t get_ia32_immop_type(const ir_node *node) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ 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
+ */
+ia32_am_type_t get_ia32_am_support(const ir_node *node) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ return attr->data.am_support;
+}
+
+/**
+ * Sets the supported addrmode of an ia32 node
+ */
+void set_ia32_am_support(ir_node *node, ia32_am_type_t am_tp) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ attr->data.am_support = am_tp;
+}
+
+/**
+ * Gets the addrmode flavour of an ia32 node
+ */
+ia32_am_flavour_t get_ia32_am_flavour(const ir_node *node) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ return attr->data.am_flavour;
+}
+
+/**
+ * Sets the addrmode flavour of an ia32 node
+ */
+void set_ia32_am_flavour(ir_node *node, ia32_am_flavour_t am_flavour) {
+ ia32_attr_t *attr = get_ia32_attr(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);
+ char *res = NULL;
+ int size;
+
+ if (! attr->am_offs) {
+ return NULL;
+ }
+
+ size = obstack_object_size(attr->am_offs);
+ if (size > 0) {
+ res = xmalloc(size + 2);
+ res[0] = attr->data.offs_sign ? '-' : '+';
+ memcpy(&res[1], obstack_base(attr->am_offs), size);
+ res[size + 1] = '\0';
+ }
+
+ return res;
+}
+
+/**
+ * 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);
+
+ if (! offset || strlen(offset) < 1)
+ return;
+
+ /* offset could already have an explicit sign */
+ /* -> supersede op if necessary */
+ if (offset[0] == '-' || offset[0] == '+') {
+ if (offset[0] == '-') {
+ op = (op == '-') ? '+' : '-';
+ }
+
+ /* skip explicit sign */
+ offset++;
+ }
+
+ if (! attr->am_offs) {
+ /* obstack is not initialized */
+ attr->am_offs = xcalloc(1, sizeof(*(attr->am_offs)));
+ obstack_init(attr->am_offs);
+
+ attr->data.offs_sign = (op == '-') ? 1 : 0;
+ }
+ else {
+ /* If obstack is initialized, connect the new offset with op */
+ obstack_printf(attr->am_offs, "%c", op);
+ }
+
+ obstack_printf(attr->am_offs, "%s", offset);
+}
+
+/**
+ * Add an offset for addrmode.
+ */
+void add_ia32_am_offs(ir_node *node, const char *offset) {
+ extend_ia32_am_offs(node, (char *)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.
+ */
+ident *get_ia32_am_sc(const ir_node *node) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ return attr->am_sc;