*/
static const arch_register_t *get_in_reg(const ir_node *node, int pos)
{
- ir_node *op;
- const arch_register_t *reg = NULL;
-
- assert(get_irn_arity(node) > pos && "Invalid IN position");
-
- /* The out register of the operator at position pos is the
- in register we need. */
- op = get_irn_n(node, pos);
-
- reg = arch_get_irn_register(op);
-
- assert(reg && "no in register found");
- return reg;
-}
-
-/**
- * Returns the register at out position pos.
- */
-static const arch_register_t *get_out_reg(const ir_node *node, int pos)
-{
- ir_node *proj;
- const arch_register_t *reg = NULL;
-
- /* 1st case: irn is not of mode_T, so it has only */
- /* one OUT register -> good */
- /* 2nd case: irn is of mode_T -> collect all Projs and ask the */
- /* Proj with the corresponding projnum for the register */
-
- if (get_irn_mode(node) != mode_T) {
- reg = arch_get_irn_register(node);
- } else if (is_amd64_irn(node)) {
- reg = arch_irn_get_register(node, pos);
- } else {
- const ir_edge_t *edge;
-
- foreach_out_edge(node, edge) {
- proj = get_edge_src_irn(edge);
- assert(is_Proj(proj) && "non-Proj from mode_T node");
- if (get_Proj_proj(proj) == pos) {
- reg = arch_get_irn_register(proj);
- break;
- }
- }
- }
-
- assert(reg && "no out register found");
- return reg;
+ ir_node *op = get_irn_n(node, pos);
+ return arch_get_irn_register(op);
}
/*************************************************************
void amd64_emit_dest_register(const ir_node *node, int pos)
{
- amd64_emit_register(get_out_reg(node, pos));
+ amd64_emit_register(arch_irn_get_register(node, pos));
}
/**
{
ir_mode *mode = get_irn_mode(irn);
- if (get_in_reg(irn, 0) == get_out_reg(irn, 0)) {
+ if (get_in_reg(irn, 0) == arch_irn_get_register(irn, 0)) {
/* omitted Copy */
return;
}
{
const arch_register_t *reg_s1 = get_in_reg(irn, 0);
const arch_register_t *reg_s2 = get_in_reg(irn, 1);
- const arch_register_t *reg_d1 = get_out_reg(irn, 0);
+ const arch_register_t *reg_d1 = arch_irn_get_register(irn, 0);
int second_op = 0;
*/
static const arch_register_t *get_in_reg(const ir_node *irn, int pos)
{
- ir_node *op;
- const arch_register_t *reg = NULL;
-
- assert(get_irn_arity(irn) > pos && "Invalid IN position");
-
- /* The out register of the operator at position pos is the
- in register we need. */
- op = get_irn_n(irn, pos);
-
- reg = arch_get_irn_register(op);
-
- assert(reg && "no in register found");
-
- /* in case of a joker register: just return a valid register */
- if (reg->type & arch_register_type_joker) {
- const arch_register_req_t *req = arch_get_register_req(irn, pos);
-
- if (arch_register_req_is(req, limited)) {
- /* in case of limited requirements: get the first allowed register */
- unsigned idx = rbitset_next(req->limited, 0, 1);
- reg = arch_register_for_index(req->cls, idx);
- } else {
- /* otherwise get first register in class */
- reg = arch_register_for_index(req->cls, 0);
- }
- }
- return reg;
-}
-
-
-/**
- * Returns the register at out position pos.
- */
-static const arch_register_t *get_out_reg(const ir_node *node, int pos)
-{
- ir_node *proj;
- const arch_register_t *reg = NULL;
-
- /* 1st case: irn is not of mode_T, so it has only */
- /* one OUT register -> good */
- /* 2nd case: irn is of mode_T -> collect all Projs and ask the */
- /* Proj with the corresponding projnum for the register */
-
- if (get_irn_mode(node) != mode_T) {
- reg = arch_get_irn_register(node);
- } else if (is_arm_irn(node)) {
- reg = arch_irn_get_register(node, pos);
- } else {
- const ir_edge_t *edge;
-
- foreach_out_edge(node, edge) {
- proj = get_edge_src_irn(edge);
- assert(is_Proj(proj) && "non-Proj from mode_T node");
- if (get_Proj_proj(proj) == pos) {
- reg = arch_get_irn_register(proj);
- break;
- }
- }
- }
-
- assert(reg && "no out register found");
- return reg;
+ ir_node *op = get_irn_n(irn, pos);
+ return arch_get_irn_register(op);
}
static void arm_emit_register(const arch_register_t *reg)
void arm_emit_dest_register(const ir_node *node, int pos)
{
- const arch_register_t *reg = get_out_reg(node, pos);
+ const arch_register_t *reg = arch_irn_get_register(node, pos);
arm_emit_register(reg);
}
{
ir_mode *mode = get_irn_mode(irn);
- if (get_in_reg(irn, 0) == get_out_reg(irn, 0)) {
+ if (get_in_reg(irn, 0) == arch_irn_get_register(irn, 0)) {
/* omitted Copy */
return;
}
*/
static const arch_register_t *get_in_reg(const ir_node *irn, int pos)
{
- ir_node *op;
- const arch_register_t *reg = NULL;
-
- assert(get_irn_arity(irn) > pos && "Invalid IN position");
-
- /* The out register of the operator at position pos is the
- in register we need. */
- op = get_irn_n(irn, pos);
-
- reg = arch_get_irn_register(op);
-
- assert(reg && "no in register found");
-
- if (reg == &ia32_registers[REG_GP_NOREG])
- panic("trying to emit noreg for %+F input %d", irn, pos);
-
- return reg;
-}
-
-/**
- * Returns the register at out position pos.
- */
-static const arch_register_t *get_out_reg(const ir_node *irn, int pos)
-{
- ir_node *proj;
- const arch_register_t *reg = NULL;
-
- /* 1st case: irn is not of mode_T, so it has only */
- /* one OUT register -> good */
- /* 2nd case: irn is of mode_T -> collect all Projs and ask the */
- /* Proj with the corresponding projnum for the register */
-
- if (get_irn_mode(irn) != mode_T) {
- assert(pos == 0);
- reg = arch_get_irn_register(irn);
- } else if (is_ia32_irn(irn)) {
- reg = arch_irn_get_register(irn, pos);
- } else {
- const ir_edge_t *edge;
-
- foreach_out_edge(irn, edge) {
- proj = get_edge_src_irn(edge);
- assert(is_Proj(proj) && "non-Proj from mode_T node");
- if (get_Proj_proj(proj) == pos) {
- reg = arch_get_irn_register(proj);
- break;
- }
- }
- }
-
- assert(reg && "no out register found");
- return reg;
+ ir_node *op = get_irn_n(irn, pos);
+ return arch_get_irn_register(op);
}
/**
void ia32_emit_dest_register(const ir_node *node, int pos)
{
- const arch_register_t *reg = get_out_reg(node, pos);
+ const arch_register_t *reg = arch_irn_get_register(node, pos);
emit_register(reg, NULL);
}
void ia32_emit_dest_register_size(const ir_node *node, int pos)
{
- const arch_register_t *reg = get_out_reg(node, pos);
+ const arch_register_t *reg = arch_irn_get_register(node, pos);
emit_register(reg, get_ia32_ls_mode(node));
}
void ia32_emit_8bit_dest_register(const ir_node *node, int pos)
{
- const arch_register_t *reg = get_out_reg(node, pos);
+ const arch_register_t *reg = arch_irn_get_register(node, pos);
emit_register(reg, mode_Bu);
}
case 'D':
if (*fmt < '0' || '9' <= *fmt)
goto unknown;
- reg = get_out_reg(node, *fmt++ - '0');
+ reg = arch_irn_get_register(node, *fmt++ - '0');
goto emit_R;
case 'I':
static void emit_ia32_IMul(const ir_node *node)
{
ir_node *left = get_irn_n(node, n_ia32_IMul_left);
- const arch_register_t *out_reg = get_out_reg(node, pn_ia32_IMul_res);
+ const arch_register_t *out_reg = arch_irn_get_register(node, pn_ia32_IMul_res);
/* do we need the 3-address form? */
if (is_ia32_NoReg_GP(left) ||
*/
static void emit_ia32_Setcc(const ir_node *node)
{
- const arch_register_t *dreg = get_out_reg(node, pn_ia32_Setcc_res);
+ const arch_register_t *dreg = arch_irn_get_register(node, pn_ia32_Setcc_res);
ia32_condition_code_t cc = get_ia32_condcode(node);
cc = determine_final_cc(node, n_ia32_Setcc_eflags, cc);
/* get register */
if (asm_reg->use_input == 0) {
- reg = get_out_reg(node, asm_reg->inout_pos);
+ reg = arch_irn_get_register(node, asm_reg->inout_pos);
} else {
ir_node *pred = get_irn_n(node, asm_reg->inout_pos);
{
const arch_register_t *in_lo = get_in_reg(node, 0);
const arch_register_t *in_hi = get_in_reg(node, 1);
- const arch_register_t *out_lo = get_out_reg(node, 0);
- const arch_register_t *out_hi = get_out_reg(node, 1);
+ const arch_register_t *out_lo = arch_irn_get_register(node, 0);
+ const arch_register_t *out_hi = arch_irn_get_register(node, 1);
if (out_lo == in_lo) {
if (out_hi != in_hi) {
static void bemit_unop_reg(const ir_node *node, unsigned char code, int input)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
bemit_unop(node, code, reg_gp_map[out->index], input);
}
static void bemit_copy(const ir_node *copy)
{
const arch_register_t *in = get_in_reg(copy, 0);
- const arch_register_t *out = get_out_reg(copy, 0);
+ const arch_register_t *out = arch_irn_get_register(copy, 0);
if (in == out)
return;
static void bemit_xor0(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
bemit8(0x31);
bemit_modrr(out, out);
}
static void bemit_mov_const(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
bemit8(0xB8 + reg_gp_map[out->index]);
bemit_immediate(node, false);
}
} \
} else { \
bemit8(ext << 3 | 1); \
- bemit_mod_am(reg_gp_map[get_out_reg(val, 0)->index], node); \
+ bemit_mod_am(reg_gp_map[arch_irn_get_register(val, 0)->index], node); \
} \
} \
\
bemit8(get_ia32_immediate_attr_const(val)->offset); \
} else { \
bemit8(ext << 3); \
- bemit_mod_am(reg_gp_map[get_out_reg(val, 0)->index], node); \
+ bemit_mod_am(reg_gp_map[arch_irn_get_register(val, 0)->index], node); \
} \
}
#define SHIFT(op, ext) \
static void bemit_##op(const ir_node *node) \
{ \
- const arch_register_t *out = get_out_reg(node, 0); \
+ const arch_register_t *out = arch_irn_get_register(node, 0); \
ir_node *count = get_irn_n(node, 1); \
if (is_ia32_Immediate(count)) { \
int offset = get_ia32_immediate_attr_const(count)->offset; \
static void bemit_shld(const ir_node *node)
{
const arch_register_t *in = get_in_reg(node, n_ia32_ShlD_val_low);
- const arch_register_t *out = get_out_reg(node, pn_ia32_ShlD_res);
+ const arch_register_t *out = arch_irn_get_register(node, pn_ia32_ShlD_res);
ir_node *count = get_irn_n(node, n_ia32_ShlD_count);
bemit8(0x0F);
if (is_ia32_Immediate(count)) {
static void bemit_shrd(const ir_node *node)
{
const arch_register_t *in = get_in_reg(node, n_ia32_ShrD_val_low);
- const arch_register_t *out = get_out_reg(node, pn_ia32_ShrD_res);
+ const arch_register_t *out = arch_irn_get_register(node, pn_ia32_ShrD_res);
ir_node *count = get_irn_n(node, n_ia32_ShrD_count);
bemit8(0x0F);
if (is_ia32_Immediate(count)) {
*/
static void bemit_setcc(const ir_node *node)
{
- const arch_register_t *dreg = get_out_reg(node, pn_ia32_Setcc_res);
+ const arch_register_t *dreg = arch_irn_get_register(node, pn_ia32_Setcc_res);
ia32_condition_code_t cc = get_ia32_condcode(node);
cc = determine_final_cc(node, n_ia32_Setcc_eflags, cc);
static void bemit_dec(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, pn_ia32_Dec_res);
+ const arch_register_t *out = arch_irn_get_register(node, pn_ia32_Dec_res);
bemit8(0x48 + reg_gp_map[out->index]);
}
static void bemit_inc(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, pn_ia32_Inc_res);
+ const arch_register_t *out = arch_irn_get_register(node, pn_ia32_Inc_res);
bemit8(0x40 + reg_gp_map[out->index]);
}
static void bemit_ldtls(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
bemit8(0x65); // gs:
if (out->index == REG_GP_EAX) {
*/
static void bemit_lea(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
bemit8(0x8D);
bemit_mod_am(reg_gp_map[out->index], node);
}
{
const arch_register_t *in_lo = get_in_reg(node, 0);
const arch_register_t *in_hi = get_in_reg(node, 1);
- const arch_register_t *out_lo = get_out_reg(node, 0);
- const arch_register_t *out_hi = get_out_reg(node, 1);
+ const arch_register_t *out_lo = arch_irn_get_register(node, 0);
+ const arch_register_t *out_hi = arch_irn_get_register(node, 1);
if (out_lo == in_lo) {
if (out_hi != in_hi) {
*/
static void bemit_load(const ir_node *node)
{
- const arch_register_t *out = get_out_reg(node, 0);
+ const arch_register_t *out = arch_irn_get_register(node, 0);
if (out->index == REG_GP_EAX) {
ir_node *base = get_irn_n(node, n_ia32_base);
*/
static void bemit_pop(const ir_node *node)
{
- const arch_register_t *reg = get_out_reg(node, pn_ia32_Pop_res);
+ const arch_register_t *reg = arch_irn_get_register(node, pn_ia32_Pop_res);
bemit8(0x58 + reg_gp_map[reg->index]);
}
bemit_sub(node);
/* mov %esp, %out */
bemit8(0x8B);
- out = get_out_reg(node, 1);
+ out = arch_irn_get_register(node, 1);
bemit8(MOD_REG | ENC_REG(reg_gp_map[out->index]) | ENC_RM(0x04));
}
size = get_signed_imm_size(offs);
bemit8(size == 1 ? 0x83 : 0x81);
- reg = get_out_reg(node, 0);
+ reg = arch_irn_get_register(node, 0);
bemit_modru(reg, ext);
if (size == 1) {
*/
static const arch_register_t *get_in_reg(const ir_node *node, int pos)
{
- ir_node *op;
- const arch_register_t *reg = NULL;
-
- assert(get_irn_arity(node) > pos && "Invalid IN position");
-
- /* The out register of the operator at position pos is the
- in register we need. */
- op = get_irn_n(node, pos);
-
- reg = arch_get_irn_register(op);
-
- assert(reg && "no in register found");
- return reg;
-}
-
-/**
- * Returns the register at out position pos.
- */
-static const arch_register_t *get_out_reg(const ir_node *node, int pos)
-{
- ir_node *proj;
- const arch_register_t *reg = NULL;
-
- /* 1st case: irn is not of mode_T, so it has only */
- /* one OUT register -> good */
- /* 2nd case: irn is of mode_T -> collect all Projs and ask the */
- /* Proj with the corresponding projnum for the register */
-
- if (get_irn_mode(node) != mode_T) {
- reg = arch_get_irn_register(node);
- } else if (is_sparc_irn(node)) {
- reg = arch_irn_get_register(node, pos);
- } else {
- const ir_edge_t *edge;
-
- foreach_out_edge(node, edge) {
- proj = get_edge_src_irn(edge);
- assert(is_Proj(proj) && "non-Proj from mode_T node");
- if (get_Proj_proj(proj) == pos) {
- reg = arch_get_irn_register(proj);
- break;
- }
- }
- }
-
- assert(reg && "no out register found");
- return reg;
+ ir_node *op = get_irn_n(node, pos);
+ return arch_get_irn_register(op);
}
void sparc_emit_immediate(const ir_node *node)
void sparc_emit_dest_register(const ir_node *node, int pos)
{
- const arch_register_t *reg = get_out_reg(node, pos);
+ const arch_register_t *reg = arch_irn_get_register(node, pos);
be_emit_char('%');
be_emit_string(arch_register_get_name(reg));
}
/* copies are nops if src_reg == dest_reg */
if (be_is_Copy(node) || be_is_CopyKeep(node)) {
const arch_register_t *src_reg = get_in_reg(node, 0);
- const arch_register_t *dest_reg = get_out_reg(node, 0);
+ const arch_register_t *dest_reg = arch_irn_get_register(node, 0);
if (src_reg == dest_reg)
return true;
{
ir_mode *mode = get_irn_mode(node);
const arch_register_t *src_reg = get_in_reg(node, 0);
- const arch_register_t *dst_reg = get_out_reg(node, 0);
+ const arch_register_t *dst_reg = arch_irn_get_register(node, 0);
if (src_reg == dst_reg)
return;