-const ia32_register_req_t *ia32_get_RegParam_req(int n, ir_node **params, long nr, unsigned cc) {
- const ia32_register_req_t **current_gpreg_param_req;
- const ia32_register_req_t **current_fpreg_param_req;
- const ia32_register_req_t *param_req = NULL;
- int n_gpregparam = 0;
- int n_fpregparam = 0;
- int i, done = 0;
- int cur_gp_idx = 0;
- int cur_fp_idx = 0;
- int biggest_n = ia32_get_n_regparam_class(n, params, &n_gpregparam, &n_fpregparam);
-
- /* Check if parameter #nr is in range for passing in register */
- if (nr <= biggest_n) {
- current_gpreg_param_req = gpreg_param_req_std;
- current_fpreg_param_req = fpreg_param_req_std;
-
- if (cc & cc_this_call) {
- current_gpreg_param_req = gpreg_param_req_this;
- current_fpreg_param_req = fpreg_param_req_this;
- }
-
- /* loop over all parameters and determine whether its a int or float register parameter */
- for (i = 0; i < nr && !done && (cc & cc_reg_param); i++) {
- if (mode_is_int(get_irn_mode(params[i])) && cur_gp_idx < maxnum_gpreg_args) {
- /* param can be passed in general purpose register and we have some registers left */
- cur_gp_idx++;
- }
- else if (mode_is_float(get_irn_mode(params[i])) && cur_fp_idx < maxnum_fpreg_args) {
- /* param can be passed in floating point register and we have some registers left */
- assert(current_gpreg_param_req[cur_fp_idx] && "'this' pointer cannot be passed as float");
- cur_fp_idx++;
- }
- }
-
- /* now: i == nr, that's the parameter requirement we want */
- if (mode_is_int(get_irn_mode(params[i])) && cur_gp_idx < maxnum_gpreg_args) {
- /* parameter #nr can be passed in general purpose register */
- param_req = current_gpreg_param_req[i];
- }
- else if (mode_is_float(get_irn_mode(params[i])) && cur_fp_idx < maxnum_fpreg_args) {
- /* parameter #nr can be passed in floating point register */
- param_req = current_fpreg_param_req[i];
+const arch_register_t *ia32_get_RegParam_reg(ia32_code_gen_t *cg, unsigned cc,
+ unsigned nr, ir_mode *mode)
+{
+ if(mode_is_float(mode)) {
+ if(!USE_SSE2(cg))
+ return NULL;
+ assert(nr < maxnum_sse_args);
+ if(cc & cc_this_call) {
+ return fpreg_sse_param_reg_this[nr];