diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2014-10-23 21:55:31 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2014-10-23 21:55:31 +0000 |
commit | 5175bcf43aecf18daf380ecc2a11d1a067eb693e (patch) | |
tree | b769142a61cd20bd3be6f44b15f119397340dad4 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | ff4181adec1b3a708838b7e64ef6fdcd2e1a8612 (diff) | |
download | llvm-5175bcf43aecf18daf380ecc2a11d1a067eb693e.zip llvm-5175bcf43aecf18daf380ecc2a11d1a067eb693e.tar.gz llvm-5175bcf43aecf18daf380ecc2a11d1a067eb693e.tar.bz2 |
[X86] Improve mul w/ overflow codegen, to MUL8+SETO.
Currently, @llvm.smul.with.overflow.i8 expands to 9 instructions, where
3 are really needed.
This adds X86ISD::UMUL8/SMUL8 SD nodes, and custom lowers them to
MUL8/IMUL8 + SETO.
i8 is a special case because there is no two/three operand variants of
(I)MUL8, so the first operand and return value need to go in AL/AX.
Also, we can't write patterns for these instructions: TableGen refuses
patterns where output operands don't match SDNode results. In this case,
instructions where the output operand is an implicitly defined register.
A related special case (and FIXME) exists for MUL8 (X86InstrArith.td):
// FIXME: Used for 8-bit mul, ignore result upper 8 bits.
// This probably ought to be moved to a def : Pat<> if the
// syntax can be accepted.
[(set AL, (mul AL, GR8:$src)), (implicit EFLAGS)]
Ideally, these go away with UMUL8, but we still need to improve TableGen
support of implicit operands in patterns.
Before this change:
movsbl %sil, %eax
movsbl %dil, %ecx
imull %eax, %ecx
movb %cl, %al
sarb $7, %al
movzbl %al, %eax
movzbl %ch, %esi
cmpl %eax, %esi
setne %al
After:
movb %dil, %al
imulb %sil
seto %al
Also, remove a made-redundant testcase for PR19858, and enable more FastISel
ALU-overflow tests for SelectionDAG too.
Differential Revision: http://reviews.llvm.org/D5809
llvm-svn: 220516
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions