[X86] 8bit divrem: Improve codegen for AH register extraction.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Mon, 3 Nov 2014 20:26:35 +0000 (20:26 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Mon, 3 Nov 2014 20:26:35 +0000 (20:26 +0000)
commit40453da779d8e511e69ace5e07a35af6a27848b7
treeb8dcad591cdfea77cd90f933cd35ac869ddcade8
parentf16d6b1ff19de131345d745c8c60d08b7dae055a
[X86] 8bit divrem: Improve codegen for AH register extraction.

For 8-bit divrems where the remainder is used, we used to generate:
    divb  %sil
    shrw  $8, %ax
    movzbl  %al, %eax

That was to avoid an H-reg access, which is problematic mainly because
it isn't possible in REX-prefixed instructions.

This patch optimizes that to:
    divb  %sil
    movzbl  %ah, %eax

To do that, we explicitly extend AH, and extract the L-subreg in the
resulting register.  The extension is done using the NOREX variants of
MOVZX.  To support signed operations, MOVSX_NOREX is also added.
Further, this introduces a new SDNode type, [us]divrem_ext_hreg, which is
then lowered to a sequence containing a single zext (rather than 2).

Differential Revision: http://reviews.llvm.org/D6064

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221176 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86ISelDAGToDAG.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h
lib/Target/X86/X86InstrExtension.td
test/CodeGen/X86/divrem8_ext.ll [new file with mode: 0644]