+ const arch_register_req_t **irn_req;
+ long node_pos = pos == -1 ? 0 : pos;
+ ir_mode *mode = get_irn_mode(irn);
+ firm_dbg_module_t *mod = firm_dbg_register(DEBUG_MODULE);
+
+ if (mode == mode_T || mode == mode_M) {
+ DBG((mod, LEVEL_1, "ignoring mode_T, mode_M node %+F\n", irn));
+ return NULL;
+ }
+
+ DBG((mod, LEVEL_1, "get requirements at pos %d for %+F ... ", pos, irn));
+
+ if (is_Proj(irn)) {
+ if (pos == -1)
+ node_pos = translate_proj_pos(irn);
+ else
+ node_pos = pos;
+
+ irn = my_skip_proj(irn);
+
+ DBG((mod, LEVEL_1, "skipping Proj, going to %+F at pos %d ... ", irn, node_pos));
+ }
+
+ if (is_ia32_irn(irn)) {
+ if (pos >= 0) {
+ irn_req = get_ia32_in_req(irn);
+ }
+ else {
+ irn_req = get_ia32_out_req(irn);
+ pos = node_pos;
+ }
+
+ DBG((mod, LEVEL_1, "returning reqs for %+F at pos %d\n", irn, pos));
+
+ memcpy(req, irn_req[pos], sizeof(*req));
+ return req;
+ }
+ else {
+ /* treat Phi like Const with default requirements */
+ if (is_Phi(irn)) {
+ DBG((mod, LEVEL_1, "returning standard reqs for %+F\n", irn));
+ if (mode_is_float(mode))
+ memcpy(req, &ia32_default_req_ia32_floating_point, sizeof(*req));
+ else if (mode_is_int(mode) || mode_is_reference(mode))
+ memcpy(req, &ia32_default_req_ia32_general_purpose, sizeof(*req));
+ else if (mode == mode_T || mode == mode_M) {
+ DBG((mod, LEVEL_1, "ignoring Phi node %+F\n", irn));
+ return NULL;
+ }
+ else
+ assert(0 && "unsupported Phi-Mode");
+ }
+ else if (get_irn_op(irn) == op_Start) {
+ DBG((mod, LEVEL_1, "returning reqs none for ProjX -> Start (%+F )\n", irn));
+ switch (node_pos) {
+ case pn_Start_X_initial_exec:
+ case pn_Start_P_value_arg_base:
+ case pn_Start_P_globals:
+ case pn_Start_P_frame_base:
+ memcpy(req, &ia32_default_req_none, sizeof(*req));
+ break;
+ case pn_Start_T_args:
+ assert(0 && "ProjT(pn_Start_T_args) should not be asked");
+ }
+ }
+ else if (get_irn_op(irn) == op_Return && pos >= 0) {
+ DBG((mod, LEVEL_1, "returning reqs EAX for %+F\n", irn));
+ memcpy(req, &ia32_default_req_ia32_general_purpose_eax, sizeof(*req));
+ }
+ else {
+ DBG((mod, LEVEL_1, "returning standard reqs for %+F (not ia32)\n", irn));
+ memcpy(req, &ia32_dummy_register_req, sizeof(*req));
+ }
+ }
+
+ return req;
+}