- /* in case of unknown: just return a register */
- if (REGS_ARE_EQUAL(reg, &ia32_gp_regs[REG_GP_UKNWN]))
- reg = &ia32_gp_regs[REG_EAX];
- else if (REGS_ARE_EQUAL(reg, &ia32_xmm_regs[REG_XMM_UKNWN]))
- reg = &ia32_xmm_regs[REG_XMM0];
- else if (REGS_ARE_EQUAL(reg, &ia32_vfp_regs[REG_VFP_UKNWN]))
- reg = &ia32_vfp_regs[REG_VF0];
+ /* in case of a joker register: just return a valid register */
+ if (arch_register_type_is(reg, joker)) {
+ arch_register_req_t req;
+ const arch_register_req_t *p_req;
+
+ /* ask for the requirements */
+ p_req = arch_get_register_req(arch_env, &req, irn, pos);
+
+ if (arch_register_req_is(p_req, limited)) {
+ /* in case of limited requirements: get the first allowed register */
+
+ bitset_t *bs = bitset_alloca(arch_register_class_n_regs(p_req->cls));
+ int idx;
+
+ p_req->limited(p_req->limited_env, bs);
+ idx = bitset_next_set(bs, 0);
+ reg = arch_register_for_index(p_req->cls, idx);
+ }
+ else {
+ /* otherwise get first register in class */
+ reg = arch_register_for_index(p_req->cls, 0);
+ }
+ }