Enable mips32 mul instruction. Patch by Akira Hatanaka <ahatanaka@mips.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118864 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bruno Cardoso Lopes 2010-11-12 00:38:32 +00:00
parent 97928d136a
commit 7d5652dcd5
4 changed files with 21 additions and 3 deletions

View File

@ -386,6 +386,8 @@ SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
/// Special Muls
case ISD::MUL:
if (Subtarget.isMips32())
break;
case ISD::MULHS:
case ISD::MULHU: {
SDValue MulOp1 = Node->getOperand(0);

View File

@ -62,6 +62,7 @@ def HasSEInReg : Predicate<"Subtarget.hasSEInReg()">;
def HasBitCount : Predicate<"Subtarget.hasBitCount()">;
def HasSwap : Predicate<"Subtarget.hasSwap()">;
def HasCondMov : Predicate<"Subtarget.hasCondMov()">;
def IsMips32 : Predicate<"Subtarget.isMips32()">;
//===----------------------------------------------------------------------===//
// Mips Operand, Complex Patterns and Transformations Definitions.
@ -487,7 +488,7 @@ def LEA_ADDiu : EffectiveAddress<"addiu\t$dst, ${addr:stackloc}">;
// MUL is a assembly macro in the current used ISAs. In recent ISA's
// it is a real instruction.
//def MUL : ArithR<0x1c, 0x02, "mul", mul, IIImul>;
def MUL : ArithR<0x1c, 0x02, "mul", mul, IIImul>, Requires<[IsMips32]>;
//===----------------------------------------------------------------------===//
// Arbitrary patterns that map to one or more instructions

View File

@ -31,7 +31,7 @@ public:
protected:
enum MipsArchEnum {
Mips1, Mips2, Mips3, Mips4, Mips32, Mips32r2, Mips64, Mips64r2
Mips1, Mips2, Mips3, Mips4, Mips32, Mips32r2
};
// Mips architecture version
@ -100,7 +100,7 @@ public:
const std::string &CPU);
bool isMips1() const { return MipsArchVersion == Mips1; }
bool isMips32() const { return MipsArchVersion == Mips32; }
bool isMips32() const { return MipsArchVersion >= Mips32; }
bool isMips32r2() const { return MipsArchVersion == Mips32r2; }
bool isLittle() const { return IsLittle; }

View File

@ -0,0 +1,15 @@
; RUN: llc -march=mips -mcpu=4ke < %s | FileCheck %s
; CHECK: mul $2, $5, $4
define i32 @mul1(i32 %a, i32 %b) nounwind readnone {
entry:
%mul = mul i32 %b, %a
ret i32 %mul
}
; CHECK: mul $2, $5, $4
define i32 @mul2(i32 %a, i32 %b) nounwind readnone {
entry:
%mul = mul nsw i32 %b, %a
ret i32 %mul
}