X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fsparc_emitter.c;h=d55c6daa910880b89fece2217559b9fcfc6e89c9;hb=6f068af98daa4725d60e5d23a8f98ec2841cfa44;hp=d35ed7ec1d72c3252ed8975918454cf90ec543a2;hpb=ea6e9be0bea5ad0079ab09d5e494cf7b5c889552;p=libfirm diff --git a/ir/be/sparc/sparc_emitter.c b/ir/be/sparc/sparc_emitter.c index d35ed7ec1..d55c6daa9 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" @@ -117,11 +118,6 @@ static const arch_register_t *get_out_reg(const ir_node *node, int pos) return reg; } -static bool is_valid_immediate(int32_t value) -{ - return -4096 <= value && value < 4096; -} - void sparc_emit_immediate(const ir_node *node) { const sparc_attr_t *attr = get_sparc_attr_const(node); @@ -129,7 +125,7 @@ void sparc_emit_immediate(const ir_node *node) if (entity == NULL) { int32_t value = attr->immediate_value; - assert(is_valid_immediate(value)); + assert(sparc_is_value_imm_encodeable(value)); be_emit_irprintf("%d", value); } else { be_emit_cstring("%lo("); @@ -189,13 +185,6 @@ void sparc_emit_reg_or_imm(const ir_node *node, int pos) } } -static bool is_stack_pointer_relative(const ir_node *node) -{ - const arch_register_t *sp = &sparc_registers[REG_SP]; - return (is_sparc_St(node) && get_in_reg(node, n_sparc_St_ptr) == sp) - || (is_sparc_Ld(node) && get_in_reg(node, n_sparc_Ld_ptr) == sp); -} - /** * emit SP offset */ @@ -211,12 +200,8 @@ void sparc_emit_offset(const ir_node *node, int offset_node_pos) sparc_emit_source_register(node, offset_node_pos); } else if (attr->is_frame_entity) { int32_t offset = attr->base.immediate_value; - /* bad hack: the real stack stuff is behind the always-there spill - * space for the register window and stack */ - if (is_stack_pointer_relative(node)) - offset += SPARC_MIN_STACKSIZE; if (offset != 0) { - assert(is_valid_immediate(offset)); + assert(sparc_is_value_imm_encodeable(offset)); be_emit_irprintf("%+ld", offset); } } else if (attr->base.immediate_value != 0 @@ -481,21 +466,21 @@ static const ir_node *pick_delay_slot_for(const ir_node *node) */ static void emit_be_IncSP(const ir_node *irn) { - int offs = -be_get_IncSP_offset(irn); + int offset = be_get_IncSP_offset(irn); - if (offs == 0) + if (offset == 0) return; /* SPARC stack grows downwards */ - if (offs < 0) { + if (offset < 0) { be_emit_cstring("\tsub "); - offs = -offs; + offset = -offset; } else { be_emit_cstring("\tadd "); } sparc_emit_source_register(irn, 0); - be_emit_irprintf(", %d", offs); + be_emit_irprintf(", %d", -offset); be_emit_cstring(", "); sparc_emit_dest_register(irn, 0); be_emit_finish_line_gas(irn); @@ -699,19 +684,21 @@ static void emit_be_Return(const ir_node *node) static void emit_sparc_FrameAddr(const ir_node *node) { - const sparc_attr_t *attr = get_sparc_attr_const(node); + const sparc_attr_t *attr = get_sparc_attr_const(node); + int32_t offset = attr->immediate_value; - // no need to fix offset as we are adressing via the framepointer - if (attr->immediate_value >= 0) { + if (offset < 0) { be_emit_cstring("\tadd "); sparc_emit_source_register(node, 0); be_emit_cstring(", "); - be_emit_irprintf("%ld", attr->immediate_value); + assert(sparc_is_value_imm_encodeable(offset)); + be_emit_irprintf("%ld", offset); } else { be_emit_cstring("\tsub "); sparc_emit_source_register(node, 0); be_emit_cstring(", "); - be_emit_irprintf("%ld", -attr->immediate_value); + assert(sparc_is_value_imm_encodeable(-offset)); + be_emit_irprintf("%ld", -offset); } be_emit_cstring(", "); @@ -944,7 +931,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);