BugFix: mode_b lowering might create new control flow (if ir_create_cond_set() is...
[libfirm] / ir / be / sparc / sparc_cconv.h
index c8a31d0..bbe33f3 100644 (file)
 #include "gen_sparc_regalloc_if.h"
 
 static const arch_register_t *const caller_saves[] = {
-       &sparc_gp_regs[REG_G1],
-       &sparc_gp_regs[REG_G2],
-       &sparc_gp_regs[REG_G3],
-       &sparc_gp_regs[REG_G4],
-       &sparc_gp_regs[REG_O0],
-       &sparc_gp_regs[REG_O1],
-       &sparc_gp_regs[REG_O2],
-       &sparc_gp_regs[REG_O3],
-       &sparc_gp_regs[REG_O4],
-       &sparc_gp_regs[REG_O5],
+       &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_fp_regs[REG_F0],
-       &sparc_fp_regs[REG_F1],
-       &sparc_fp_regs[REG_F2],
-       &sparc_fp_regs[REG_F3],
-       &sparc_fp_regs[REG_F4],
-       &sparc_fp_regs[REG_F5],
-       &sparc_fp_regs[REG_F6],
-       &sparc_fp_regs[REG_F7],
-       &sparc_fp_regs[REG_F8],
-       &sparc_fp_regs[REG_F9],
-       &sparc_fp_regs[REG_F10],
-       &sparc_fp_regs[REG_F11],
-       &sparc_fp_regs[REG_F12],
-       &sparc_fp_regs[REG_F13],
-       &sparc_fp_regs[REG_F14],
-       &sparc_fp_regs[REG_F15],
-       &sparc_fp_regs[REG_F16],
-       &sparc_fp_regs[REG_F17],
-       &sparc_fp_regs[REG_F18],
-       &sparc_fp_regs[REG_F19],
-       &sparc_fp_regs[REG_F20],
-       &sparc_fp_regs[REG_F21],
-       &sparc_fp_regs[REG_F22],
-       &sparc_fp_regs[REG_F23],
-       &sparc_fp_regs[REG_F24],
-       &sparc_fp_regs[REG_F25],
-       &sparc_fp_regs[REG_F26],
-       &sparc_fp_regs[REG_F27],
-       &sparc_fp_regs[REG_F28],
-       &sparc_fp_regs[REG_F29],
-       &sparc_fp_regs[REG_F30],
-       &sparc_fp_regs[REG_F31],
+       &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_gp_regs[REG_I0],
-       &sparc_gp_regs[REG_I1],
-       &sparc_gp_regs[REG_I2],
-       &sparc_gp_regs[REG_I3],
-       &sparc_gp_regs[REG_I4],
-       &sparc_gp_regs[REG_I5],
+       &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_fp_regs[REG_F0],
-       &sparc_fp_regs[REG_F1],
-       &sparc_fp_regs[REG_F2],
-       &sparc_fp_regs[REG_F3],
+       &sparc_registers[REG_F0],
+       &sparc_registers[REG_F1],
+       &sparc_registers[REG_F2],
+       &sparc_registers[REG_F3],
 };
 
 /** information about a single parameter or result */
@@ -108,19 +125,23 @@ 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 */
        reg_or_stackslot_t *results;          /**< result info. */
 } calling_convention_t;
 
 /**
- * determine how function parameters and return values are passed.
+ * Determine how function parameters and return values are passed.
  * Decides what goes to register or to stack and what stack offsets/
  * datatypes are used.
- * @param caller   true for convention for the caller, false for callee
+ *
+ * @param function_type  the type of the caller/callee function
+ * @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