mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
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:
parent
97928d136a
commit
7d5652dcd5
@ -386,6 +386,8 @@ SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
|
|||||||
|
|
||||||
/// Special Muls
|
/// Special Muls
|
||||||
case ISD::MUL:
|
case ISD::MUL:
|
||||||
|
if (Subtarget.isMips32())
|
||||||
|
break;
|
||||||
case ISD::MULHS:
|
case ISD::MULHS:
|
||||||
case ISD::MULHU: {
|
case ISD::MULHU: {
|
||||||
SDValue MulOp1 = Node->getOperand(0);
|
SDValue MulOp1 = Node->getOperand(0);
|
||||||
|
@ -62,6 +62,7 @@ def HasSEInReg : Predicate<"Subtarget.hasSEInReg()">;
|
|||||||
def HasBitCount : Predicate<"Subtarget.hasBitCount()">;
|
def HasBitCount : Predicate<"Subtarget.hasBitCount()">;
|
||||||
def HasSwap : Predicate<"Subtarget.hasSwap()">;
|
def HasSwap : Predicate<"Subtarget.hasSwap()">;
|
||||||
def HasCondMov : Predicate<"Subtarget.hasCondMov()">;
|
def HasCondMov : Predicate<"Subtarget.hasCondMov()">;
|
||||||
|
def IsMips32 : Predicate<"Subtarget.isMips32()">;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Mips Operand, Complex Patterns and Transformations Definitions.
|
// 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
|
// MUL is a assembly macro in the current used ISAs. In recent ISA's
|
||||||
// it is a real instruction.
|
// 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
|
// Arbitrary patterns that map to one or more instructions
|
||||||
|
@ -31,7 +31,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
enum MipsArchEnum {
|
enum MipsArchEnum {
|
||||||
Mips1, Mips2, Mips3, Mips4, Mips32, Mips32r2, Mips64, Mips64r2
|
Mips1, Mips2, Mips3, Mips4, Mips32, Mips32r2
|
||||||
};
|
};
|
||||||
|
|
||||||
// Mips architecture version
|
// Mips architecture version
|
||||||
@ -100,7 +100,7 @@ public:
|
|||||||
const std::string &CPU);
|
const std::string &CPU);
|
||||||
|
|
||||||
bool isMips1() const { return MipsArchVersion == Mips1; }
|
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 isMips32r2() const { return MipsArchVersion == Mips32r2; }
|
||||||
|
|
||||||
bool isLittle() const { return IsLittle; }
|
bool isLittle() const { return IsLittle; }
|
||||||
|
15
test/CodeGen/Mips/2010-11-09-Mul.ll
Normal file
15
test/CodeGen/Mips/2010-11-09-Mul.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user