arch_register_req_type_should_be_same = 1U << 2,
/** The register must be unequal from some other at the node. */
arch_register_req_type_must_be_different = 1U << 3,
+ /** The registernumber should be aligned (in case of multiregister values)*/
+ arch_register_req_type_must_be_aligned = 1U << 4,
/** ignore while allocating registers */
- arch_register_req_type_ignore = 1U << 4,
+ arch_register_req_type_ignore = 1U << 5,
/** the output produces a new value for the stack pointer
* (this is not really a constraint but a marker to guide the stackpointer
* rewiring logic) */
- arch_register_req_type_produces_sp = 1U << 5,
+ arch_register_req_type_produces_sp = 1U << 6,
} arch_register_req_type_t;
extern const arch_register_req_t *arch_no_register_req;
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 int reg_reqs_equal(const arch_register_req_t *req1,
heights_t *heights = NULL;
-static const arch_register_req_t no_register_req = {
- arch_register_req_type_none,
- NULL, /* regclass */
- NULL, /* limit bitset */
- 0, /* same pos */
- 0 /* different pos */
-};
-
static int check_immediate_constraint(long val, char immediate_constraint_type)
{
switch (immediate_constraint_type) {
/* pure memory ops */
if (constraint->cls == NULL) {
- return &no_register_req;
+ return arch_no_register_req;
}
if (constraint->allowed_registers != 0
NULL, /* regclass */
NULL, /* limit bitset */
0, /* same pos */
- 0 /* different pos */
+ 0, /* different pos */
+ 0 /* width */
};
EOF
& ${arch}_reg_classes[CLASS_${arch}_${class}],
NULL, /* limit bitset */
0, /* same pos */
- 0 /* different pos */
+ 0, /* different pos */
+ 1 /* width */
};
EOF
& ${arch}_reg_classes[CLASS_${arch}_${class}],
${limit_bitset},
${same_pos}, /* same pos */
- ${different_pos} /* different pos */
+ ${different_pos}, /* different pos */
+ 1 /* width */
};
EOF