diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-11-10 06:04:33 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-11-10 06:04:33 +0000 |
| commit | a1b6667c6ae491153e4fc5b1cb7d87bccdeba34b (patch) | |
| tree | 83d6da37a06b89ffe48d1d9233fc3a957c55db5d /llvm/lib | |
| parent | dc12535e00839905ec3357713bca3dcdc596f15c (diff) | |
| download | bcm5719-llvm-a1b6667c6ae491153e4fc5b1cb7d87bccdeba34b.tar.gz bcm5719-llvm-a1b6667c6ae491153e4fc5b1cb7d87bccdeba34b.zip | |
[X86] Use a MOVSX instruction instead of a MOVZX instruction in isel for an any_extend of the remainder from an 8-bit sdivrem.
The sdivrem will emit its own MOVSX to move %ah to the low byte of a register. By using a MOVSX for an any_extend this allows a post-isel peephole to merge them.
llvm-svn: 346581
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrCompiler.td | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td index 71b43a38dc2..bc08147506c 100644 --- a/llvm/lib/Target/X86/X86InstrCompiler.td +++ b/llvm/lib/Target/X86/X86InstrCompiler.td @@ -1320,6 +1320,15 @@ def : Pat<(i64 (anyext GR16:$src)), def : Pat<(i64 (anyext GR32:$src)), (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR32:$src, sub_32bit)>; +// If this is an anyext of the remainder of an 8-bit sdivrem, use a MOVSX +// instead of a MOVZX. The sdivrem lowering will emit emit a MOVSX to move +// %ah to the lower byte of a register. By using a MOVSX here we allow a +// post-isel peephole to merge the two MOVSX instructions into one. +def anyext_sdiv : PatFrag<(ops node:$lhs), (anyext node:$lhs),[{ + return (N->getOperand(0).getOpcode() == ISD::SDIVREM && + N->getOperand(0).getResNo() == 1); +}]>; +def : Pat<(i32 (anyext_sdiv GR8:$src)), (MOVSX32rr8 GR8:$src)>; // Any instruction that defines a 32-bit result leaves the high half of the // register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may |

