+ ir_entity *entity = get_irg_entity(irg);
+ ir_type *mtp = get_entity_type(entity);
+ if (get_method_variadicity(mtp) != variadicity_variadic)
+ return false;
+
+ if (cconv->n_param_regs >= SPARC_N_PARAM_REGS)
+ return false;
+
+ {
+ size_t n_params = get_method_n_params(mtp);
+ type_dbg_info *dbgi = get_type_dbg_info(mtp);
+ size_t n_ress = get_method_n_ress(mtp);
+ size_t new_n_params
+ = n_params + (SPARC_N_PARAM_REGS - cconv->n_param_regs);
+ ir_type *new_mtp = new_d_type_method(new_n_params, n_ress, dbgi);
+ ir_mode *gp_reg_mode = sparc_reg_classes[CLASS_sparc_gp].mode;
+ ir_type *gp_reg_type = get_type_for_mode(gp_reg_mode);
+ ir_type *frame_type = get_irg_frame_type(irg);
+ size_t i;
+
+ for (i = 0; i < n_ress; ++i) {
+ ir_type *type = get_method_res_type(mtp, i);
+ set_method_res_type(new_mtp, i, type);
+ }
+ for (i = 0; i < n_params; ++i) {
+ ir_type *type = get_method_param_type(mtp, i);
+ set_method_param_type(new_mtp, i, type);
+ }
+ for ( ; i < new_n_params; ++i) {
+ set_method_param_type(new_mtp, i, gp_reg_type);
+ new_parameter_entity(frame_type, i, gp_reg_type);
+ }
+
+ set_method_variadicity(new_mtp, get_method_variadicity(mtp));
+ set_method_calling_convention(new_mtp, get_method_calling_convention(mtp));
+ set_method_additional_properties(new_mtp, get_method_additional_properties(mtp));
+ set_lowered_type(mtp, new_mtp);
+
+ set_entity_type(entity, new_mtp);
+ }
+ return true;
+}
+
+static ir_type *compute_arg_type(ir_graph *irg, calling_convention_t *cconv,
+ ir_type *between_type)
+{
+ ir_entity *va_start_entity = NULL;
+ const ir_entity *entity = get_irg_entity(irg);
+ const ir_type *mtp = get_entity_type(entity);
+ size_t n_params = get_method_n_params(mtp);
+ ir_entity **param_map = ALLOCANZ(ir_entity*, n_params);