Commit 4658dc6d authored by Michael Beck's avatar Michael Beck
Browse files

Fixed some ugly "const" code

split arm attributes
fixed "SymConst get combined" Bug, HelloWorld runs now ;-)

[r14396]
parent 516e2c09
......@@ -176,13 +176,9 @@ void arm_emit_offset(arm_emit_env_t *env, const ir_node *node) {
* Emit the instruction suffix depending on the mode.
*/
void arm_emit_mode(arm_emit_env_t *env, const ir_node *node) {
arm_attr_t *attr;
ir_mode *mode;
int bits;
attr = get_arm_attr(node);
mode = attr->op_mode ? attr->op_mode : get_irn_mode(node);
bits = get_mode_size_bits(mode);
const arm_attr_t *attr = get_arm_attr_const(node);
ir_mode *mode = attr->op_mode ? attr->op_mode : get_irn_mode(node);
int bits = get_mode_size_bits(mode);
if (bits == 32)
be_emit_char(env->emit, 's');
......@@ -197,7 +193,7 @@ void arm_emit_mode(arm_emit_env_t *env, const ir_node *node) {
* Returns non-zero if a mode has a Immediate attribute.
*/
int is_immediate_node(const ir_node *irn) {
arm_attr_t *attr = get_arm_attr(irn);
const arm_attr_t *attr = get_arm_attr_const(irn);
return ARM_GET_SHF_MOD(attr) == ARM_SHF_IMM;
}
......@@ -276,7 +272,7 @@ static void emit_arm_CondJmp(arm_emit_env_t *env, const ir_node *irn) {
ir_node *op1 = get_irn_n(irn, 0);
ir_mode *opmode = get_irn_mode(op1);
const char *suffix;
int proj_num = get_arm_proj_num(irn);
int proj_num = get_arm_CondJmp_proj_num(irn);
foreach_out_edge(irn, edge) {
ir_node *proj = get_edge_src_irn(edge);
......@@ -482,7 +478,7 @@ static void emit_arm_SwitchJmp(arm_emit_env_t *env, const ir_node *irn) {
ir_node *default_block = NULL;
block_nr = get_irn_node_nr(irn);
n_projs = get_arm_n_projs(irn);
n_projs = get_arm_SwitchJmp_n_projs(irn);
projs = xcalloc(n_projs , sizeof(ir_node*));
......@@ -490,7 +486,7 @@ static void emit_arm_SwitchJmp(arm_emit_env_t *env, const ir_node *irn) {
proj = get_edge_src_irn(edge);
assert(is_Proj(proj) && "Only proj allowed at SwitchJmp");
if (get_Proj_proj(proj) == get_arm_default_proj_num(irn))
if (get_Proj_proj(proj) == get_arm_SwitchJmp_default_proj_num(irn))
default_block = get_irn_link(proj);
projs[get_Proj_proj(proj)] = proj;
......@@ -541,7 +537,7 @@ static void emit_arm_SwitchJmp(arm_emit_env_t *env, const ir_node *irn) {
if ( proj ) {
block = get_irn_link(proj);
} else {
block = get_irn_link(projs[get_arm_default_proj_num(irn)]);
block = get_irn_link(projs[get_arm_SwitchJmp_default_proj_num(irn)]);
}
be_emit_cstring(env->emit, "\t.word\t");
arm_emit_block_label(env, block);
......
......@@ -226,8 +226,8 @@ static int arm_dump_node(ir_node *n, FILE *F, dump_reason_t reason) {
}
}
}
if (get_arm_proj_num(n) >= 0) {
fprintf(F, "proj_num = (%d)\n", get_arm_proj_num(n));
if (is_arm_CondJmp(n) && get_arm_CondJmp_proj_num(n) >= 0) {
fprintf(F, "proj_num = (%d)\n", get_arm_CondJmp_proj_num(n));
}
/* TODO: dump all additional attributes */
......@@ -251,20 +251,57 @@ static int arm_dump_node(ir_node *n, FILE *F, dump_reason_t reason) {
* |___/
***************************************************************************************************/
/* Returns the attributes of a generic Arm node. */
arm_attr_t *get_arm_attr(ir_node *node) {
assert(is_arm_irn(node) && "need arm node to get attributes");
return get_irn_generic_attr(node);
}
const arm_attr_t *get_arm_attr_const(const ir_node *node) {
assert(is_arm_irn(node) && "need arm node to get attributes");
return get_irn_generic_attr_const(node);
}
/**
* 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 :-(
* Returns the attributes of an ARM SymConst node.
*/
arm_attr_t *get_arm_attr(const ir_node *node) {
assert(is_arm_irn(node) && "need arm node to get attributes");
return (arm_attr_t *)get_irn_generic_attr((ir_node *)node);
arm_SymConst_attr_t *get_arm_SymConst_attr(ir_node *node) {
assert(is_arm_SymConst(node));
return get_irn_generic_attr(node);
}
const arm_SymConst_attr_t *get_arm_SymConst_attr_const(const ir_node *node) {
assert(is_arm_SymConst(node));
return get_irn_generic_attr_const(node);
}
/* Returns the attributes of a CondJmp node. */
arm_CondJmp_attr_t *get_arm_CondJmp_attr(ir_node *node) {
assert(is_arm_CondJmp(node));
return get_irn_generic_attr(node);
}
const arm_CondJmp_attr_t *get_arm_CondJmp_attr_const(const ir_node *node) {
assert(is_arm_CondJmp(node));
return get_irn_generic_attr_const(node);
}
/* Returns the attributes of a SwitchJmp node. */
arm_SwitchJmp_attr_t *get_arm_SwitchJmp_attr(ir_node *node) {
assert(is_arm_SwitchJmp(node));
return get_irn_generic_attr(node);
}
const arm_SwitchJmp_attr_t *get_arm_SwitchJmp_attr_const(const ir_node *node) {
assert(is_arm_SwitchJmp(node));
return get_irn_generic_attr_const(node);
}
/**
* Returns the argument register requirements of a arm node.
*/
const arch_register_req_t **get_arm_in_req_all(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->in_req;
}
......@@ -272,7 +309,7 @@ const arch_register_req_t **get_arm_in_req_all(const ir_node *node) {
* Returns the result register requirements of an arm node.
*/
const arch_register_req_t **get_arm_out_req_all(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->out_req;
}
......@@ -280,7 +317,7 @@ const arch_register_req_t **get_arm_out_req_all(const ir_node *node) {
* Returns the argument register requirement at position pos of an arm node.
*/
const arch_register_req_t *get_arm_in_req(const ir_node *node, int pos) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->in_req[pos];
}
......@@ -288,7 +325,7 @@ const arch_register_req_t *get_arm_in_req(const ir_node *node, int pos) {
* Returns the result register requirement at position pos of an arm node.
*/
const arch_register_req_t *get_arm_out_req(const ir_node *node, int pos) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->out_req[pos];
}
......@@ -320,14 +357,14 @@ void set_arm_req_in(ir_node *node, const arch_register_req_t *req, int pos) {
* Returns the register flag of an arm node.
*/
arch_irn_flags_t get_arm_flags(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->flags;
}
/**
* Sets the register flag of an arm node.
*/
void set_arm_flags(const ir_node *node, arch_irn_flags_t flags) {
void set_arm_flags(ir_node *node, arch_irn_flags_t flags) {
arm_attr_t *attr = get_arm_attr(node);
attr->flags = flags;
}
......@@ -336,7 +373,7 @@ void set_arm_flags(const ir_node *node, arch_irn_flags_t flags) {
* Returns the result register slots of an arm node.
*/
const arch_register_t **get_arm_slots(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->slots;
}
......@@ -344,7 +381,7 @@ const arch_register_t **get_arm_slots(const ir_node *node) {
* Returns the name of the OUT register at position pos.
*/
const char *get_arm_out_reg_name(const ir_node *node, int pos) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
assert(is_arm_irn(node) && "Not an arm node.");
assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
......@@ -357,7 +394,7 @@ const char *get_arm_out_reg_name(const ir_node *node, int pos) {
* Returns the index of the OUT register at position pos within its register class.
*/
int get_arm_out_regnr(const ir_node *node, int pos) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
assert(is_arm_irn(node) && "Not an arm node.");
assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
......@@ -370,7 +407,7 @@ int get_arm_out_regnr(const ir_node *node, int pos) {
* Returns the OUT register at position pos.
*/
const arch_register_t *get_arm_out_reg(const ir_node *node, int pos) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
assert(is_arm_irn(node) && "Not an arm node.");
assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
......@@ -383,14 +420,14 @@ const arch_register_t *get_arm_out_reg(const ir_node *node, int pos) {
* Returns the number of results.
*/
int get_arm_n_res(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return ARR_LEN(attr->slots);
}
/**
* Returns the tarvalue
*/
tarval *get_arm_value(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return attr->value;
}
......@@ -405,24 +442,24 @@ void set_arm_value(ir_node *node, tarval *tv) {
/**
* Returns the proj num
*/
int get_arm_proj_num(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
int get_arm_CondJmp_proj_num(const ir_node *node) {
const arm_CondJmp_attr_t *attr = get_arm_CondJmp_attr_const(node);
return attr->proj_num;
}
/**
* Sets the proj num
*/
void set_arm_proj_num(ir_node *node, int proj_num) {
arm_attr_t *attr = get_arm_attr(node);
attr->proj_num = proj_num;
void set_arm_CondJmp_proj_num(ir_node *node, int proj_num) {
arm_CondJmp_attr_t *attr = get_arm_CondJmp_attr(node);
attr->proj_num = proj_num;
}
/**
* Returns the SymConst label
*/
ident *get_arm_symconst_id(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_SymConst_attr_t *attr = get_arm_SymConst_attr_const(node);
return attr->symconst_id;
}
......@@ -430,40 +467,39 @@ ident *get_arm_symconst_id(const ir_node *node) {
* Sets the SymConst label
*/
void set_arm_symconst_id(ir_node *node, ident *symconst_id) {
arm_attr_t *attr = get_arm_attr(node);
arm_SymConst_attr_t *attr = get_arm_SymConst_attr(node);
attr->symconst_id = symconst_id;
}
/**
* Returns the number of projs.
* Returns the number of projs of a SwitchJmp.
*/
int get_arm_n_projs(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
int get_arm_SwitchJmp_n_projs(const ir_node *node) {
const arm_SwitchJmp_attr_t *attr = get_arm_SwitchJmp_attr_const(node);
return attr->n_projs;
}
/**
* Sets the number of projs.
*/
void set_arm_n_projs(ir_node *node, int n_projs) {
arm_attr_t *attr = get_arm_attr(node);
void set_arm_SwitchJmp_n_projs(ir_node *node, int n_projs) {
arm_SwitchJmp_attr_t *attr = get_arm_SwitchJmp_attr(node);
attr->n_projs = n_projs;
}
/**
* Returns the default_proj_num.
*/
long get_arm_default_proj_num(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
long get_arm_SwitchJmp_default_proj_num(const ir_node *node) {
const arm_SwitchJmp_attr_t *attr = get_arm_SwitchJmp_attr_const(node);
return attr->default_proj_num;
}
/**
* Sets the default_proj_num.
*/
void set_arm_default_proj_num(ir_node *node, long default_proj_num) {
arm_attr_t *attr = get_arm_attr(node);
void set_arm_SwitchJmp_default_proj_num(ir_node *node, long default_proj_num) {
arm_SwitchJmp_attr_t *attr = get_arm_SwitchJmp_attr(node);
attr->default_proj_num = default_proj_num;
}
......@@ -471,7 +507,7 @@ void set_arm_default_proj_num(ir_node *node, long default_proj_num) {
* Gets the shift modifier attribute.
*/
arm_shift_modifier get_arm_shift_modifier(const ir_node *node) {
arm_attr_t *attr = get_arm_attr(node);
const arm_attr_t *attr = get_arm_attr_const(node);
return ARM_GET_SHF_MOD(attr);
}
......@@ -488,20 +524,11 @@ void init_arm_attributes(ir_node *node, int flags, const arch_register_req_t **
attr->flags = flags;
attr->instr_fl = (ARM_COND_AL << 3) | ARM_SHF_NONE;
attr->value = NULL;
attr->proj_num = -42;
attr->symconst_id = NULL;
attr->n_projs = 0;
attr->default_proj_num = 0;
attr->slots = NEW_ARR_D(const arch_register_t*, obst, n_res);
memset((arch_register_t **)attr->slots, 0, n_res * sizeof(attr->slots[0]));
}
static int arm_comp_condJmp(arm_attr_t *attr_a, arm_attr_t *attr_b) {
return 1;
}
/***************************************************************************************
* _ _ _
* | | | | | |
......@@ -619,5 +646,29 @@ void arm_set_optimizers(void) {
*/
}
static int cmp_attr_arm_SymConst(ir_node *a, ir_node *b) {
const arm_SymConst_attr_t *attr_a = get_irn_generic_attr_const(a);
const arm_SymConst_attr_t *attr_b = get_irn_generic_attr_const(b);
return attr_a->symconst_id != attr_b->symconst_id;
}
static int cmp_attr_arm(ir_node *a, ir_node *b) {
arm_attr_t *attr_a = get_irn_generic_attr(a);
arm_attr_t *attr_b = get_irn_generic_attr(b);
return (attr_a->instr_fl != attr_b->instr_fl) || (attr_a->value != attr_b->value);
}
static int cmp_attr_arm_CondJmp(ir_node *a, ir_node *b) {
/* never identical */
return 1;
}
static int cmp_attr_arm_SwitchJmp(ir_node *a, ir_node *b) {
/* never identical */
return 1;
}
/* Include the generated constructor functions */
#include "gen_arm_new_nodes.c.inl"
......@@ -41,9 +41,28 @@
***************************************************************************************************/
/**
* Returns the attributes of an arm node.
* Returns the attributes of a generic Arm node.
*/
arm_attr_t *get_arm_attr(const ir_node *node);
arm_attr_t *get_arm_attr(ir_node *node);
const arm_attr_t *get_arm_attr_const(const ir_node *node);
/**
* Returns the attributes of an ARM SymConst node.
*/
arm_SymConst_attr_t *get_arm_SymConst_attr(ir_node *node);
const arm_SymConst_attr_t *get_arm_SymConst_attr_const(const ir_node *node);
/**
* Returns the attributes of an ARM CondJmp node.
*/
arm_CondJmp_attr_t *get_arm_CondJmp_attr(ir_node *node);
const arm_CondJmp_attr_t *get_arm_CondJmp_attr_const(const ir_node *node);
/**
* Returns the attributes of an ARM SwitchJmp node.
*/
arm_SwitchJmp_attr_t *get_arm_SwitchJmp_attr(ir_node *node);
const arm_SwitchJmp_attr_t *get_arm_SwitchJmp_attr_const(const ir_node *node);
/**
* Returns the argument register requirements of an arm node.
......@@ -88,7 +107,7 @@ arch_irn_flags_t get_arm_flags(const ir_node *node);
/**
* Sets the register flag of an arm node.
*/
void set_arm_flags(const ir_node *node, arch_irn_flags_t flags);
void set_arm_flags(ir_node *node, arch_irn_flags_t flags);
/**
* Returns the result register slots of an arm node.
......@@ -134,12 +153,12 @@ void set_arm_value(ir_node *node, tarval *tv);
/**
* Returns the proj num
*/
int get_arm_proj_num(const ir_node *node);
int get_arm_CondJmp_proj_num(const ir_node *node);
/**
* Sets the proj num
*/
void set_arm_proj_num(ir_node *node, int proj_num);
void set_arm_CondJmp_proj_num(ir_node *node, int proj_num);
ident *get_arm_symconst_id(const ir_node *node);
void set_arm_symconst_id(ir_node *node, ident *symconst_id);
......@@ -148,24 +167,24 @@ ir_node *new_r_arm_StoreStackMInc(ir_graph *irg, ir_node *block, ir_node *mem, i
int n_regs, ir_node **regs, ir_mode *mode);
/**
* Returns the number of projs.
* Returns the number of projs of a SwitchJmp.
*/
int get_arm_n_projs(const ir_node *node);
int get_arm_SwitchJmp_n_projs(const ir_node *node);
/**
* Sets the number of projs.
* Sets the number of projs of a SwitchJmp.
*/
void set_arm_n_projs(ir_node *node, int n_projs);
void set_arm_SwitchJmp_n_projs(ir_node *node, int n_projs);
/**
* Returns the default_proj_num.
*/
long get_arm_default_proj_num(const ir_node *node);
long get_arm_SwitchJmp_default_proj_num(const ir_node *node);
/**
* Sets the default_proj_num.
*/
void set_arm_default_proj_num(ir_node *node, long default_proj_num);
void set_arm_SwitchJmp_default_proj_num(ir_node *node, long default_proj_num);
/**
* Gets the shift modifier attribute.
......
......@@ -80,23 +80,39 @@ typedef enum _arm_condition {
/** Set the condition code to flags */
#define ARM_SET_COND(attr, code) ((attr)->instr_fl = (((attr)->instr_fl & ~(15 << 3)) | ((code) << 3)))
/** Generic ARM node attributes. */
typedef struct _arm_attr_t {
arch_irn_flags_t flags; /**< indicating if spillable, rematerializeable ... etc. */
const arch_register_req_t **in_req; /**< register requirements for arguments */
const arch_register_req_t **out_req; /**< register requirements for results */
ir_mode *op_mode; /**< operation mode */
ir_mode *op_mode; /**< operation mode if different from node's mode */
unsigned instr_fl; /**< condition code, shift modifier */
tarval *value; /**< immediate */
ident *symconst_id; /**< for SymConsts: its ident */
int proj_num;
int n_projs;
long default_proj_num;
const arch_register_t **slots; /**< register slots for assigned registers */
} arm_attr_t;
/** Attributes for a SymConst */
typedef struct _arm_SymConst_attr_t {
arm_attr_t attr;
ident *symconst_id; /**< for SymConsts: its ident */
} arm_SymConst_attr_t;
/** Attributes for a CondJmp */
typedef struct _arm_CondJmp_attr_t {
arm_attr_t attr;
int proj_num;
} arm_CondJmp_attr_t;
/** Attributes for a SwitchJmp */
typedef struct _arm_SwitchJmp_attr_t {
arm_attr_t attr;
int n_projs;
long default_proj_num;
} arm_SwitchJmp_attr_t;
/**
* Returns the shift modifier string.
*/
......
This diff is collapsed.
......@@ -840,8 +840,7 @@ static ir_node *gen_Cond(ir_node *irn, arm_code_gen_t *cg) {
ir_node *cmp_node = get_Proj_pred(proj_node);
ir_node *op1 = get_Cmp_left(cmp_node);
ir_node *op2 = get_Cmp_right(cmp_node);
result = new_rd_arm_CondJmp(dbg, irg, block, op1, op2, mode_T);
set_arm_proj_num(result, get_Proj_proj(proj_node));
result = new_rd_arm_CondJmp(dbg, irg, block, op1, op2, get_Proj_proj(proj_node));
} else {
//SwitchJmp
ir_node *op = get_irn_n(irn, 0);
......@@ -889,9 +888,8 @@ static ir_node *gen_Cond(ir_node *irn, arm_code_gen_t *cg) {
const_node = new_rd_Const(dbg, irg, block, mode_Iu, new_tarval_from_long(translation, mode_Iu));
const_graph = gen_Const(const_node, cg);
sub = new_rd_arm_Sub(dbg, irg, block, op, const_graph, get_irn_mode(op), ARM_SHF_NONE, NULL);
result = new_rd_arm_SwitchJmp(dbg, irg, block, sub, mode_T);
set_arm_n_projs(result, n_projs);
set_arm_default_proj_num(result, get_Cond_defaultProj(irn)-translation);
result = new_rd_arm_SwitchJmp(dbg, irg, block, sub,
n_projs, get_Cond_defaultProj(irn)-translation);
}
return result;
}
......@@ -901,7 +899,7 @@ static ir_node *gen_Cond(ir_node *irn, arm_code_gen_t *cg) {
* @param symc the SymConst
* @return name of the SymConst
*/
ident *get_sc_ident(ir_node *symc) {
static ident *get_sc_ident(ir_node *symc) {
ir_entity *ent;
switch (get_SymConst_kind(symc)) {
......@@ -920,6 +918,9 @@ ident *get_sc_ident(ir_node *symc) {
return NULL;
}
/**
* Transforms a SymConst node.
*/
static ir_node *gen_SymConst(ir_node *irn, arm_code_gen_t *cg) {
ir_node *block = get_nodes_block(irn);
ir_mode *mode = get_irn_mode(irn);
......@@ -1200,30 +1201,6 @@ void arm_move_consts(ir_node *node, void *env) {
}
/************************************************************************/
/* move symbolic constants out of startblock */
/************************************************************************/
void arm_move_symconsts(ir_node *node, void *env) {
int i;
if (is_Block(node))
return;
for (i = 0; i < get_irn_arity(node); i++) {
ir_node *pred = get_irn_n(node,i);
ir_opcode pred_code = get_irn_opcode(pred);
if (pred_code == iro_SymConst) {
ident *id = get_sc_ident(pred);
ir_node *symconst_node;
symconst_node = new_rd_arm_SymConst(get_irn_dbg_info(pred),
current_ir_graph, get_nodes_block(node), get_irn_mode(pred), id);
set_irn_n(node, i, symconst_node);
}
}
}
/**
* the BAD transformer.
*/
......
......@@ -27,7 +27,6 @@
#define FIRM_BE_ARM_ARM_TRANSFORM_H
void arm_move_consts(ir_node *node, void *env);
void arm_move_symconsts(ir_node *node, void *env);
void arm_register_transformers(void);
void arm_transform_node(ir_node *node, void *env);
......
......@@ -322,7 +322,6 @@ static void arm_emit_and_done(void *self) {
arm_code_gen_t *cg = self;
ir_graph *irg = cg->irg;
dump_ir_block_graph_sched(irg, "-arm-finished");
arm_gen_routine(cg, irg);
cur_reg_set = NULL;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment