sparc: fix wrong incsp in omit-fp mode
[libfirm] / ir / be / sparc / sparc_cconv.h
index 775dd70..ea6247c 100644 (file)
 #include "../be_types.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 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. */
+       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;
@@ -108,8 +47,12 @@ typedef struct reg_or_stackslot_t
 /** The calling convention info for one call site. */
 typedef 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;
 
@@ -122,7 +65,7 @@ typedef struct calling_convention_t
  * @param caller         true for convention for the caller, false for callee
  */
 calling_convention_t *sparc_decide_calling_convention(ir_type *function_type,
-                                                      bool caller);
+                                                      ir_graph *irg);
 
 /**
  * free memory used by a calling_convention_t