Recently, the CC386 Backend has been rewritten. There were a number of problems with the original backend related to register allocation of complex instructions. Basically, the backend as written could not cope with a variety of real-world situations and there was no patch that would work reliably based on the design.
The original design was to allocate registers on an as-needed basis, pushing the results of previous operations on the stack if the expression is complicated enough that the register needed to be reallocated. The problem with this is there was no lookahead, to be able to predict in advance what register might be used down the road. Often registers would conflict with each other in ways that could not be resolved after the fact.
The new design is to choose a destination register prior to generating code for an expression, and reuse that destination register whenever it can during the processing of that expression, especially in generating code for subexpressions. The list of destination registers is kept on a stack so they can be reused intelligently.