#define CLS_DATAB 0
static int dump_node_Imm(ir_node *n, FILE *F, dump_reason_t reason) {
- ir_mode *mode;
- int bad = 0;
- char buf[1024];
- tarval *tv;
+ ir_mode *mode;
+ int bad = 0;
+ char buf[1024];
+ tarval *tv;
+ imm_attr_t *attr;
switch (reason) {
case dump_node_opcode_txt:
fprintf(F, "%s", buf);
}
else {
- fprintf(F, "imm_SymConst");
+ fprintf(F, "immSymC");
}
break;
break;
case dump_node_nodeattr_txt:
- break;
-
- case dump_node_info_txt: {
- const char *name = NULL;
- ir_node *old_sym = NULL;
- imm_attr_t *attr = (imm_attr_t *)get_irn_generic_attr(n);
+ attr = (imm_attr_t *)get_irn_generic_attr(n);
if (is_Imm(n) && attr->tp == imm_SymConst) {
- old_sym = attr->data.symconst;
+ const char *name = NULL;
+ ir_node *old_sym = attr->data.symconst;
switch (get_SymConst_kind(old_sym)) {
case symconst_addr_name:
default:
assert(!"Unsupported SymConst");
}
+
+ fprintf(F, "&%s ", name);
}
- if (name)
- fprintf(F, "imm_SymConst = %s", name);
+
+ break;
+
+ case dump_node_info_txt:
break;
- }
}
return bad;
rflct_signature_set_arg(sig, 1, 1, "Store", RFLCT_MC(Mem), 0, 0);
rflct_signature_set_arg(sig, 1, 2, "Arg", RFLCT_MC(Datab), 0, 0);
- rflct_new_opcode(push_opc, "Push", false);
+ rflct_new_opcode(push_opc, "Push", 0);
rflct_opcode_add_signature(push_opc, sig);
}
sig = rflct_signature_allocate(1, 1);
rflct_signature_set_arg(sig, 0, 0, "Imm", RFLCT_MC(Data), 0, 0);
rflct_signature_set_arg(sig, 1, 0, "Block", RFLCT_MC(BB), 0, 0);
- rflct_new_opcode(imm_opc, "Imm", false);
+ rflct_new_opcode(imm_opc, "Imm", 0);
rflct_opcode_add_signature(imm_opc, sig);
}
}
* Returns the tarval from an Imm node or NULL in case of a SymConst
*/
tarval *get_Imm_tv(ir_node *irn) {
+ imm_attr_t *attr;
+
assert(is_Imm(irn) && "Cannot get tv from non-Imm");
- imm_attr_t *attr = (imm_attr_t *)get_irn_generic_attr(irn);
+ attr = (imm_attr_t *)get_irn_generic_attr(irn);
if (attr->tp == imm_Const) {
return attr->data.tv;
}
return NULL;
}
+/**
+ * Returns the SymConst from an Imm node or NULL in case of a Const
+ */
+ir_node *get_Imm_sc(ir_node *irn) {
+ imm_attr_t *attr;
+
+ assert(is_Imm(irn) && "Cannot get SymConst from non-Imm");
+ attr = (imm_attr_t *)get_irn_generic_attr(irn);
+ if (attr->tp == imm_SymConst) {
+ return attr->data.symconst;
+ }
+ else
+ return NULL;
+}
+
+
static void prepare_walker(ir_node *irn, void *data)
{
opcode opc = get_irn_opcode(irn);
char buf[128];
ir_node *nc;
ir_node *push;
- int i, n;
+ int i, n = get_Call_n_params(irn);
type *nt;
+ unsigned cc = get_method_calling_convention(get_Call_type(irn));
- store = new_Push(irg, bl, store, get_Call_param(irn, 0));
+ if (cc & cc_last_on_top) {
+ store = new_Push(irg, bl, store, get_Call_param(irn, 0));
- for(i = 1, n = get_Call_n_params(irn); i < n; ++i) {
- store = new_Push(irg, bl, store, get_Call_param(irn, i));
- }
+ for (i = 1; i < n; ++i)
+ store = new_Push(irg, bl, store, get_Call_param(irn, i));
+ }
+ else {
+ store = new_Push(irg, bl, store, get_Call_param(irn, n - 1));
+
+ for (i = n - 2; i >= 0; --i)
+ store = new_Push(irg, bl, store, get_Call_param(irn, i));
+ }
snprintf(buf, sizeof(buf), "push_%s", get_type_name(ct));
}
const arch_isa_if_t firm_isa = {
- firm_init,
- firm_get_n_reg_class,
- firm_get_reg_class,
- firm_prepare_graph
+ firm_init,
+ firm_get_n_reg_class,
+ firm_get_reg_class,
+ firm_prepare_graph,
+ &firm_irn_handler
};