• kmillikin@chromium.org's avatar
    Change the algorithm and generated code for parallel moves on IA32. · 437914da
    kmillikin@chromium.org authored
    Instead of spilling and then immediately restoring eax to resolve
    memory to memory moves, the gap move resolver now tracks registers
    that are known to be free and uses one if available.  If not it spills
    but restores lazily when the spilled value is needed or at the end of
    the algorithm.
    
    Instead of using esi for resolving cycles and assuming it is free to
    overwrite because it can be rematerialized, the gap move resolver now
    resolves cycles using swaps, possibly using a free register as above.
    
    The algorithm is also changed to be simpler: a recursive depth-first
    traversal of the move dependence graph.  It uses a list of moves to be
    performed (because it mutates the moves themselves), but does not use
    any auxiliary structure other than the control stack.  It does not
    build up a separate list of scheduled moves to be interpreted by the
    code generate, but emits code on the fly.
    
    Review URL: http://codereview.chromium.org/6263005
    
    git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6344 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
    437914da
lithium-allocator.cc 70.5 KB