X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fsparc_cconv.h;h=6202ee2bb70c83f2c2bbd0ab605709ddd1f835db;hb=67926613438d531ad6e3c403cb89d902248dce5d;hp=bbe33f3632d7b1d72b103a7c222a0c242b6c2d79;hpb=1a3b7d363474ab544c13093a2f0b578718d37c7a;p=libfirm diff --git a/ir/be/sparc/sparc_cconv.h b/ir/be/sparc/sparc_cconv.h index bbe33f363..6202ee2bb 100644 --- a/ir/be/sparc/sparc_cconv.h +++ b/ir/be/sparc/sparc_cconv.h @@ -21,116 +21,47 @@ * @file * @brief support functions for calling conventions * @author Matthias Braun - * @version $Id$ */ #ifndef FIRM_BE_SPARC_SPARC_CCONV_H #define FIRM_BE_SPARC_SPARC_CCONV_H #include "firm_types.h" -#include "../be_types.h" +#include "bearch_sparc_t.h" +#include "be_types.h" +#include "benode.h" #include "gen_sparc_regalloc_if.h" -static const arch_register_t *const caller_saves[] = { - &sparc_registers[REG_G1], - &sparc_registers[REG_G2], - &sparc_registers[REG_G3], - &sparc_registers[REG_G4], - &sparc_registers[REG_O0], - &sparc_registers[REG_O1], - &sparc_registers[REG_O2], - &sparc_registers[REG_O3], - &sparc_registers[REG_O4], - &sparc_registers[REG_O5], - - &sparc_registers[REG_F0], - &sparc_registers[REG_F1], - &sparc_registers[REG_F2], - &sparc_registers[REG_F3], - &sparc_registers[REG_F4], - &sparc_registers[REG_F5], - &sparc_registers[REG_F6], - &sparc_registers[REG_F7], - &sparc_registers[REG_F8], - &sparc_registers[REG_F9], - &sparc_registers[REG_F10], - &sparc_registers[REG_F11], - &sparc_registers[REG_F12], - &sparc_registers[REG_F13], - &sparc_registers[REG_F14], - &sparc_registers[REG_F15], - &sparc_registers[REG_F16], - &sparc_registers[REG_F17], - &sparc_registers[REG_F18], - &sparc_registers[REG_F19], - &sparc_registers[REG_F20], - &sparc_registers[REG_F21], - &sparc_registers[REG_F22], - &sparc_registers[REG_F23], - &sparc_registers[REG_F24], - &sparc_registers[REG_F25], - &sparc_registers[REG_F26], - &sparc_registers[REG_F27], - &sparc_registers[REG_F28], - &sparc_registers[REG_F29], - &sparc_registers[REG_F30], - &sparc_registers[REG_F31], -}; - -static const arch_register_t *const omit_fp_callee_saves[] = { - &sparc_registers[REG_L0], - &sparc_registers[REG_L1], - &sparc_registers[REG_L2], - &sparc_registers[REG_L3], - &sparc_registers[REG_L4], - &sparc_registers[REG_L5], - &sparc_registers[REG_L6], - &sparc_registers[REG_L7], - &sparc_registers[REG_I0], - &sparc_registers[REG_I1], - &sparc_registers[REG_I2], - &sparc_registers[REG_I3], - &sparc_registers[REG_I4], - &sparc_registers[REG_I5], -}; - -static const arch_register_t* const param_regs[] = { - &sparc_registers[REG_I0], - &sparc_registers[REG_I1], - &sparc_registers[REG_I2], - &sparc_registers[REG_I3], - &sparc_registers[REG_I4], - &sparc_registers[REG_I5], -}; - -static const arch_register_t* const float_result_regs[] = { - &sparc_registers[REG_F0], - &sparc_registers[REG_F1], - &sparc_registers[REG_F2], - &sparc_registers[REG_F3], -}; - /** information about a single parameter or result */ typedef struct reg_or_stackslot_t { - const arch_register_t *reg0; /**< if != NULL, the first register used for - this parameter. */ - const arch_register_t *reg1; /**< if != NULL, the second register used. */ + const arch_register_req_t *req0; /**< if != NULL, register requirements + for this parameter (or the first + part of it). */ + const arch_register_req_t *req1; /**< if != NULL, register requirements + for the 2nd part of the parameter */ + const arch_register_t *reg0; + const arch_register_t *reg1; + size_t reg_offset; ir_type *type; /**< indicates that an entity of the specific type is needed */ - int offset; /**< if transmitted via stack, the offset for + unsigned offset; /**< if transmitted via stack, the offset for this parameter. */ ir_entity *entity; /**< entity in frame type */ } reg_or_stackslot_t; /** The calling convention info for one call site. */ -typedef struct calling_convention_t +struct calling_convention_t { bool omit_fp; /**< do not use frame pointer (and no save/restore) */ reg_or_stackslot_t *parameters; /**< parameter info. */ - int param_stack_size; /**< stack size for parameters */ + unsigned param_stack_size; /**< stack size for parameters */ + unsigned n_param_regs; /**< number of values passed in a + register */ reg_or_stackslot_t *results; /**< result info. */ -} calling_convention_t; + unsigned n_reg_results; + unsigned *caller_saves; /**< bitset of caller save registers */ +}; /** * Determine how function parameters and return values are passed. @@ -148,4 +79,6 @@ calling_convention_t *sparc_decide_calling_convention(ir_type *function_type, */ void sparc_free_calling_convention(calling_convention_t *cconv); +void sparc_cconv_init(void); + #endif