Implement multiple with overflow by 2 with an add instruction.

llvm-svn: 63090
This commit is contained in:
Evan Cheng 2009-01-27 03:30:42 +00:00
parent 80a6c8a024
commit a05436f739
2 changed files with 31 additions and 0 deletions
lib/Target/X86
test/CodeGen/X86

View File

@ -3612,6 +3612,17 @@ def : Pat<(parallel (X86smul_ovf (load addr:$src1), i32immSExt8:$src2),
(implicit EFLAGS)),
(IMUL32rmi8 addr:$src1, i32immSExt8:$src2)>;
// Optimize multiple with overflow by 2.
let AddedComplexity = 2 in {
def : Pat<(parallel (X86smul_ovf GR16:$src1, 2),
(implicit EFLAGS)),
(ADD16rr GR16:$src1, GR16:$src1)>;
def : Pat<(parallel (X86smul_ovf GR32:$src1, 2),
(implicit EFLAGS)),
(ADD32rr GR32:$src1, GR32:$src1)>;
}
//===----------------------------------------------------------------------===//
// Floating Point Stack Support
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,20 @@
; RUN: llvm-as < %s | llc -march=x86 | grep mul | count 1
; RUN: llvm-as < %s | llc -march=x86 | grep add | count 3
define i32 @t1(i32 %a, i32 %b) nounwind readnone {
entry:
%tmp0 = add i32 %b, %a
%tmp1 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %tmp0, i32 2)
%tmp2 = extractvalue { i32, i1 } %tmp1, 0
ret i32 %tmp2
}
define i32 @t2(i32 %a, i32 %b) nounwind readnone {
entry:
%tmp0 = add i32 %b, %a
%tmp1 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %tmp0, i32 4)
%tmp2 = extractvalue { i32, i1 } %tmp1, 0
ret i32 %tmp2
}
declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) nounwind