X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fbearch_sparc_t.h;h=650ec68cf43f64b2da0238156626877078ff0b04;hb=2ba0d75357dc87479522d0db5b6e4ba6de5c9585;hp=aae05e84a8399222b7459afa2946648d3d025067;hpb=65a52a96e8ab7ed601d7f98c516d37c46b674b4a;p=libfirm diff --git a/ir/be/sparc/bearch_sparc_t.h b/ir/be/sparc/bearch_sparc_t.h index aae05e84a..650ec68cf 100644 --- a/ir/be/sparc/bearch_sparc_t.h +++ b/ir/be/sparc/bearch_sparc_t.h @@ -20,40 +20,24 @@ /** * @file * @brief declarations for SPARC backend -- private header + * @author Hannes Rapp, Matthias Braun * @version $Id$ */ -#ifndef FIRM_BE_SPARC_BEARCH_TEMPLATE_T_H -#define FIRM_BE_SPARC_BEARCH_TEMPLATE_T_H +#ifndef FIRM_BE_SPARC_BEARCH_SPARC_T_H +#define FIRM_BE_SPARC_BEARCH_SPARC_T_H -#include "debug.h" +#include #include "sparc_nodes_attr.h" #include "be.h" -#include "../beemitter.h" -#include "set.h" - -// sparc ABI requires a min stacksize to -// save registers in case of a trap etc. -// by now we assume only non-leaf procedures: 92 + 4 (padding) -#define SPARC_MIN_STACKSIZE 112 typedef struct sparc_transform_env_t sparc_transform_env_t; -typedef struct _sparc_isa_t sparc_isa_t; - -typedef struct _sparc_code_gen_t { - const arch_code_generator_if_t *impl; /**< implementation */ - ir_graph *irg; /**< current irg */ - set *reg_set; /**< set to memorize registers for FIRM nodes (e.g. phi) */ - sparc_isa_t *isa; /**< the isa instance */ - char dump; /**< set to 1 if graphs should be dumped */ -} sparc_code_gen_t; - +typedef struct sparc_isa_t sparc_isa_t; -struct _sparc_isa_t { - arch_env_t arch_env; /**< must be derived from arch_env_t */ - sparc_code_gen_t *cg; /**< current code generator */ +struct sparc_isa_t { + arch_env_t base; /**< must be derived from arch_env_t */ + pmap *constants; }; - /** * this is a struct to minimize the number of parameters * for transformation walker @@ -66,6 +50,30 @@ struct sparc_transform_env_t { ir_mode *mode; /**< The mode of the irn */ }; -void sparc_finish_irg(sparc_code_gen_t *cg); +/** + * SPARC ABI requires some space which is always available at the top of + * the stack. It contains: + * 16*4 bytes space for spilling the register window + * 1*4 byte holding a pointer to space for aggregate returns (the space is + * always reserved, regardless whether we have an aggregate return + * or not) + * 6*4 bytes Space for spilling parameters 0-5. For the cases when someone + * takes the address of a parameter. I guess this is also there so + * the implementation of va_args gets easier -> We can simply store + * param 0-5 in this spaces and then handle va_next by simply + * incrementing the stack pointer + */ +#define SPARC_MIN_STACKSIZE 92 +#define SPARC_IMMEDIATE_MIN -4096 +#define SPARC_IMMEDIATE_MAX 4095 + +static inline bool sparc_is_value_imm_encodeable(int32_t value) +{ + return SPARC_IMMEDIATE_MIN <= value && value <= SPARC_IMMEDIATE_MAX; +} + +void sparc_finish(ir_graph *irg); + +void sparc_introduce_prolog_epilog(ir_graph *irg); #endif