mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Add definitions of floating point multiply add/sub and negative multiply
add/sub instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151415 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -59,6 +59,15 @@ def NotFP64bit : Predicate<"!Subtarget.isFP64bit()">;
|
||||
def IsSingleFloat : Predicate<"Subtarget.isSingleFloat()">;
|
||||
def IsNotSingleFloat : Predicate<"!Subtarget.isSingleFloat()">;
|
||||
|
||||
// FP immediate patterns.
|
||||
def fpimm0 : PatLeaf<(fpimm), [{
|
||||
return N->isExactlyValue(+0.0);
|
||||
}]>;
|
||||
|
||||
def fpimm0neg : PatLeaf<(fpimm), [{
|
||||
return N->isExactlyValue(-0.0);
|
||||
}]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Instruction Class Templates
|
||||
//
|
||||
@@ -122,6 +131,19 @@ multiclass FFR2P_M<bits<6> funct, string opstr, SDNode OpNode, bit isComm = 0> {
|
||||
}
|
||||
}
|
||||
|
||||
// FP madd/msub/nmadd/nmsub instruction classes.
|
||||
class FMADDSUB<bits<3> funct, bits<3> fmt, string opstr, string fmtstr,
|
||||
SDNode OpNode, RegisterClass RC> :
|
||||
FFMADDSUB<funct, fmt, (outs RC:$fd), (ins RC:$fr, RC:$fs, RC:$ft),
|
||||
!strconcat(opstr, ".", fmtstr, "\t$fd, $fr, $fs, $ft"),
|
||||
[(set RC:$fd, (OpNode (fmul RC:$fs, RC:$ft), RC:$fr))]>;
|
||||
|
||||
class FNMADDSUB<bits<3> funct, bits<3> fmt, string opstr, string fmtstr,
|
||||
SDNode OpNode, RegisterClass RC> :
|
||||
FFMADDSUB<funct, fmt, (outs RC:$fd), (ins RC:$fr, RC:$fs, RC:$ft),
|
||||
!strconcat(opstr, ".", fmtstr, "\t$fd, $fr, $fs, $ft"),
|
||||
[(set RC:$fd, (fsub fpimm0, (OpNode (fmul RC:$fs, RC:$ft), RC:$fr)))]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Floating Point Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -224,6 +246,36 @@ defm FDIV : FFR2P_M<0x03, "div", fdiv>;
|
||||
defm FMUL : FFR2P_M<0x02, "mul", fmul, 1>;
|
||||
defm FSUB : FFR2P_M<0x01, "sub", fsub>;
|
||||
|
||||
let Predicates = [HasMips32r2] in {
|
||||
def MADD_S : FMADDSUB<0x4, 0, "madd", "s", fadd, FGR32>;
|
||||
def MSUB_S : FMADDSUB<0x5, 0, "msub", "s", fsub, FGR32>;
|
||||
}
|
||||
|
||||
let Predicates = [HasMips32r2, NoNaNsFPMath] in {
|
||||
def NMADD_S : FNMADDSUB<0x6, 0, "nmadd", "s", fadd, FGR32>;
|
||||
def NMSUB_S : FNMADDSUB<0x7, 0, "nmsub", "s", fsub, FGR32>;
|
||||
}
|
||||
|
||||
let Predicates = [HasMips32r2, NotFP64bit] in {
|
||||
def MADD_D32 : FMADDSUB<0x4, 1, "madd", "d", fadd, AFGR64>;
|
||||
def MSUB_D32 : FMADDSUB<0x5, 1, "msub", "d", fsub, AFGR64>;
|
||||
}
|
||||
|
||||
let Predicates = [HasMips32r2, NotFP64bit, NoNaNsFPMath] in {
|
||||
def NMADD_D32 : FNMADDSUB<0x6, 1, "nmadd", "d", fadd, AFGR64>;
|
||||
def NMSUB_D32 : FNMADDSUB<0x7, 1, "nmsub", "d", fsub, AFGR64>;
|
||||
}
|
||||
|
||||
let Predicates = [HasMips32r2, IsFP64bit] in {
|
||||
def MADD_D64 : FMADDSUB<0x4, 1, "madd", "d", fadd, FGR64>;
|
||||
def MSUB_D64 : FMADDSUB<0x5, 1, "msub", "d", fsub, FGR64>;
|
||||
}
|
||||
|
||||
let Predicates = [HasMips32r2, IsFP64bit, NoNaNsFPMath] in {
|
||||
def NMADD_D64 : FNMADDSUB<0x6, 1, "nmadd", "d", fadd, FGR64>;
|
||||
def NMSUB_D64 : FNMADDSUB<0x7, 1, "nmsub", "d", fsub, FGR64>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Floating Point Branch Codes
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -305,14 +357,6 @@ def ExtractElementF64 :
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Floating Point Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
def fpimm0 : PatLeaf<(fpimm), [{
|
||||
return N->isExactlyValue(+0.0);
|
||||
}]>;
|
||||
|
||||
def fpimm0neg : PatLeaf<(fpimm), [{
|
||||
return N->isExactlyValue(-0.0);
|
||||
}]>;
|
||||
|
||||
def : Pat<(f32 fpimm0), (MTC1 ZERO)>;
|
||||
def : Pat<(f32 fpimm0neg), (FNEG_S (MTC1 ZERO))>;
|
||||
|
||||
|
@@ -290,3 +290,21 @@ class FFR2P<bits<6> funct, bits<5> fmt, string opstr,
|
||||
FFR<0x11, funct, fmt, (outs RC:$fd), (ins RC:$fs, RC:$ft),
|
||||
!strconcat(opstr, ".", fmtstr, "\t$fd, $fs, $ft"),
|
||||
[(set RC:$fd, (OpNode RC:$fs, RC:$ft))]>;
|
||||
|
||||
// Floating point madd/msub/nmadd/nmsub.
|
||||
class FFMADDSUB<bits<3> funct, bits<3> fmt, dag outs, dag ins, string asmstr,
|
||||
list<dag> pattern>
|
||||
: MipsInst<outs, ins, asmstr, pattern, NoItinerary, FrmOther> {
|
||||
bits<5> fd;
|
||||
bits<5> fr;
|
||||
bits<5> fs;
|
||||
bits<5> ft;
|
||||
|
||||
let Opcode = 0x13;
|
||||
let Inst{25-21} = fr;
|
||||
let Inst{20-16} = ft;
|
||||
let Inst{15-11} = fs;
|
||||
let Inst{10-6} = fd;
|
||||
let Inst{5-3} = funct;
|
||||
let Inst{2-0} = fmt;
|
||||
}
|
||||
|
@@ -134,6 +134,7 @@ def IsN64 : Predicate<"Subtarget.isABI_N64()">;
|
||||
def NotN64 : Predicate<"!Subtarget.isABI_N64()">;
|
||||
def RelocStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">;
|
||||
def RelocPIC : Predicate<"TM.getRelocationModel() == Reloc::PIC_">;
|
||||
def NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Mips Operand, Complex Patterns and Transformations Definitions.
|
||||
|
Reference in New Issue
Block a user