arch_register_req_type_t type; /**< The type of the constraint. */
const arch_register_class_t *cls; /**< The register class this constraint
belongs to. */
- const unsigned *limited; /**< allowed register bitset */
- unsigned other_same; /**< Bitmask of ins which should use the
- same register (should_be_same). */
- unsigned other_different; /**< Bitmask of ins which shall use a
- different register
- (must_be_different) */
- unsigned char width; /**< specifies how many sequential
- registers are required */
+ const unsigned *limited; /**< allowed register bitset
+ (in case of wide-values this is
+ only about the first register) */
+ unsigned other_same; /**< Bitmask of ins which should use the
+ same register (should_be_same). */
+ unsigned other_different; /**< Bitmask of ins which shall use a
+ different register
+ (must_be_different) */
+ unsigned char width; /**< specifies how many sequential
+ registers are required */
};
static inline bool reg_reqs_equal(const arch_register_req_t *req1,
&& (!has_alignment_cstr || ((col % req->width) == 0)))
continue;
- // If it is possible to have only a part of a large variable that
- // cannot be used, we should invalidate the whole piece.
- // Since we do not think this can happen, we did implemented the
- // support for that.
- assert((!has_alignment_cstr
- || rbitset_is_set(colors, col)
- || !rbitset_is_set(colors, col - (col % req->width)))
- && "Register constraints that invalidate just a part of "
- "a large variable is not yet supported");
make_color_var_name(buf, sizeof(buf), irn, col);
cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_equal, 0.0);
var_idx = lpp_add_var(ienv->lp, buf, lpp_binary, 0.0);