X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fsparc_emitter.c;h=9340fc72b446110514911c765666b0cc3fd25b69;hb=0929d78922b3e96f37ede5aeace5d2e413d15c63;hp=2061029dc7dd0bc64ac027d3a0f27f7ecaa19d86;hpb=8ef2480ec4b8e4ab5af6819773b552e2c1371abc;p=libfirm diff --git a/ir/be/sparc/sparc_emitter.c b/ir/be/sparc/sparc_emitter.c index 2061029dc..9340fc72b 100644 --- a/ir/be/sparc/sparc_emitter.c +++ b/ir/be/sparc/sparc_emitter.c @@ -20,6 +20,7 @@ /** * @file * @brief emit assembler for a backend graph + * @author Hannes Rapp, Matthias Braun * @version $Id$ */ #include "config.h" @@ -332,7 +333,7 @@ void sparc_emit_fp_mode_suffix(const ir_node *node) static ir_node *get_jump_target(const ir_node *jump) { - return get_irn_link(jump); + return (ir_node*)get_irn_link(jump); } /** @@ -352,7 +353,7 @@ static int get_sparc_Call_dest_addr_pos(const ir_node *node) static bool ba_is_fallthrough(const ir_node *node) { ir_node *block = get_nodes_block(node); - ir_node *next_block = get_irn_link(block); + ir_node *next_block = (ir_node*)get_irn_link(block); return get_irn_link(node) == next_block; } @@ -372,8 +373,7 @@ static bool is_no_instruction(const ir_node *node) if (is_sparc_Ba(node) && ba_is_fallthrough(node)) return true; - return be_is_Keep(node) || be_is_Barrier(node) || be_is_Start(node) - || is_Phi(node); + return be_is_Keep(node) || be_is_Start(node) || is_Phi(node); } static bool has_delay_slot(const ir_node *node) @@ -451,9 +451,6 @@ static const ir_node *pick_delay_slot_for(const ir_node *node) while (sched_has_prev(schedpoint)) { schedpoint = sched_prev(schedpoint); - if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE) - break; - if (has_delay_slot(schedpoint)) break; @@ -461,6 +458,9 @@ static const ir_node *pick_delay_slot_for(const ir_node *node) if (is_no_instruction(schedpoint)) continue; + if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE) + break; + if (emits_multiple_instructions(schedpoint)) continue; @@ -720,67 +720,65 @@ static void emit_sparc_FrameAddr(const ir_node *node) be_emit_finish_line_gas(node); } -static const char *get_icc_unsigned(pn_Cmp pnc) +static const char *get_icc_unsigned(ir_relation relation) { - switch (pnc) { - case pn_Cmp_False: return "bn"; - case pn_Cmp_Eq: return "be"; - case pn_Cmp_Lt: return "blu"; - case pn_Cmp_Le: return "bleu"; - case pn_Cmp_Gt: return "bgu"; - case pn_Cmp_Ge: return "bgeu"; - case pn_Cmp_Lg: return "bne"; - case pn_Cmp_Leg: return "ba"; - default: panic("Cmp has unsupported pnc"); + switch (relation & (ir_relation_less_equal_greater)) { + case ir_relation_false: return "bn"; + case ir_relation_equal: return "be"; + case ir_relation_less: return "blu"; + case ir_relation_less_equal: return "bleu"; + case ir_relation_greater: return "bgu"; + case ir_relation_greater_equal: return "bgeu"; + case ir_relation_less_greater: return "bne"; + case ir_relation_less_equal_greater: return "ba"; + default: panic("Cmp has unsupported relation"); } } -static const char *get_icc_signed(pn_Cmp pnc) +static const char *get_icc_signed(ir_relation relation) { - switch (pnc) { - case pn_Cmp_False: return "bn"; - case pn_Cmp_Eq: return "be"; - case pn_Cmp_Lt: return "bl"; - case pn_Cmp_Le: return "ble"; - case pn_Cmp_Gt: return "bg"; - case pn_Cmp_Ge: return "bge"; - case pn_Cmp_Lg: return "bne"; - case pn_Cmp_Leg: return "ba"; - default: panic("Cmp has unsupported pnc"); + switch (relation & (ir_relation_less_equal_greater)) { + case ir_relation_false: return "bn"; + case ir_relation_equal: return "be"; + case ir_relation_less: return "bl"; + case ir_relation_less_equal: return "ble"; + case ir_relation_greater: return "bg"; + case ir_relation_greater_equal: return "bge"; + case ir_relation_less_greater: return "bne"; + case ir_relation_less_equal_greater: return "ba"; + default: panic("Cmp has unsupported relation"); } } -static const char *get_fcc(pn_Cmp pnc) +static const char *get_fcc(ir_relation relation) { - switch (pnc) { - case pn_Cmp_False: return "fbn"; - case pn_Cmp_Eq: return "fbe"; - case pn_Cmp_Lt: return "fbl"; - case pn_Cmp_Le: return "fble"; - case pn_Cmp_Gt: return "fbg"; - case pn_Cmp_Ge: return "fbge"; - case pn_Cmp_Lg: return "fblg"; - case pn_Cmp_Leg: return "fbo"; - case pn_Cmp_Uo: return "fbu"; - case pn_Cmp_Ue: return "fbue"; - case pn_Cmp_Ul: return "fbul"; - case pn_Cmp_Ule: return "fbule"; - case pn_Cmp_Ug: return "fbug"; - case pn_Cmp_Uge: return "fbuge"; - case pn_Cmp_Ne: return "fbne"; - case pn_Cmp_True: return "fba"; - case pn_Cmp_max: - break; + switch (relation) { + case ir_relation_false: return "fbn"; + case ir_relation_equal: return "fbe"; + case ir_relation_less: return "fbl"; + case ir_relation_less_equal: return "fble"; + case ir_relation_greater: return "fbg"; + case ir_relation_greater_equal: return "fbge"; + case ir_relation_less_greater: return "fblg"; + case ir_relation_less_equal_greater: return "fbo"; + case ir_relation_unordered: return "fbu"; + case ir_relation_unordered_equal: return "fbue"; + case ir_relation_unordered_less: return "fbul"; + case ir_relation_unordered_less_equal: return "fbule"; + case ir_relation_unordered_greater: return "fbug"; + case ir_relation_unordered_greater_equal: return "fbuge"; + case ir_relation_unordered_less_greater: return "fbne"; + case ir_relation_true: return "fba"; } - panic("invalid pnc"); + panic("invalid relation"); } -typedef const char* (*get_cc_func)(pn_Cmp pnc); +typedef const char* (*get_cc_func)(ir_relation relation); static void emit_sparc_branch(const ir_node *node, get_cc_func get_cc) { const sparc_jmp_cond_attr_t *attr = get_sparc_jmp_cond_attr_const(node); - pn_Cmp pnc = attr->pnc; + ir_relation relation = attr->relation; const ir_node *proj_true = NULL; const ir_node *proj_false = NULL; const ir_edge_t *edge; @@ -801,7 +799,7 @@ static void emit_sparc_branch(const ir_node *node, get_cc_func get_cc) block = get_nodes_block(node); /* we have a block schedule */ - next_block = get_irn_link(block); + next_block = (ir_node*)get_irn_link(block); if (get_irn_link(proj_true) == next_block) { /* exchange both proj's so the second one can be omitted */ @@ -809,16 +807,12 @@ static void emit_sparc_branch(const ir_node *node, get_cc_func get_cc) proj_true = proj_false; proj_false = t; - if (is_sparc_fbfcc(node)) { - pnc = get_negated_pnc(pnc, mode_F); - } else { - pnc = get_negated_pnc(pnc, mode_Iu); - } + relation = get_negated_relation(relation); } /* emit the true proj */ be_emit_cstring("\t"); - be_emit_string(get_cc(pnc)); + be_emit_string(get_cc(relation)); be_emit_char(' '); sparc_emit_cfop_target(proj_true); be_emit_finish_line_gas(proj_true); @@ -951,7 +945,7 @@ static void emit_fmov(const ir_node *node, const arch_register_t *src_reg, static const arch_register_t *get_next_fp_reg(const arch_register_t *reg) { - unsigned index = reg->index; + unsigned index = reg->global_index; assert(reg == &sparc_registers[index]); index++; assert(index - REG_F0 < N_sparc_fp_REGS); @@ -1029,7 +1023,6 @@ static void sparc_register_emitters(void) set_emitter(op_sparc_UDiv, emit_sparc_UDiv); /* no need to emit anything for the following nodes */ - set_emitter(op_be_Barrier, emit_nothing); set_emitter(op_be_Keep, emit_nothing); set_emitter(op_be_Start, emit_nothing); set_emitter(op_Phi, emit_nothing); @@ -1139,8 +1132,8 @@ void sparc_emit_routine(ir_graph *irg) { ir_entity *entity = get_irg_entity(irg); ir_node **block_schedule; - int i; - int n; + size_t i; + size_t n; be_gas_elf_type_char = '#'; be_gas_object_file_format = OBJECT_FILE_FORMAT_ELF_SPARC;