Take at look at AVR target which is very similar.
Here onluy "d" constrained register accept constants (they are call used
registers too)
The AVR move pattern (*reloadinqi) has multiple constrain options "d"
against "i" being relevant. So check you have all the combinations
defined. You omitted "i" constraint but I dont know if that is relevant.
When "costing " is done, it walks thru constraints. You don't seem to
have many constrain combinations (since costs are lower than I typically
see for AVR). It will score on both EVEN and EIGHT and likely pick EVEN
because its bigger class. So I think that is perhaps reason. I think
order of classes maybe need to be changed or something else to prevent
problem with overlap (LOWER_EVEN? UPPER_EVEN)
But I could be completely wrong!
Andy