Skip to content
  • Evan Cheng's avatar
    Fixing truncate. Previously we were emitting truncate from r16 to r8 as · 9733bde7
    Evan Cheng authored
    movw. That is we promote the destination operand to r16. So
            %CH = TRUNC_R16_R8 %BP
    is emitted as
            movw %bp, %cx.
    
    This is incorrect. If %cl is live, it would be clobbered.
    Ideally we want to do the opposite, that is emitted it as
            movb ??, %ch
    But this is not possible since %bp does not have a r8 sub-register.
    
    We are now defining a new register class R16_ which is a subclass of R16
    containing only those 16-bit registers that have r8 sub-registers (i.e.
    AX - DX). We isel the truncate to two instructions, a MOV16to16_ to copy the
    value to the R16_ class, followed by a TRUNC_R16_R8.
    
    Due to bug 770, the register colaescer is not going to coalesce between R16 and
    R16_. That will be fixed later so we can eliminate the MOV16to16_. Right now, it
    can only be eliminated if we are lucky that source and destination registers are
    the same.
    
    llvm-svn: 28164
    9733bde7
Loading