forked from OSchip/llvm-project
parent
3e45c70288
commit
cf10372119
|
@ -1372,6 +1372,13 @@ public:
|
|||
return buildInstr(TargetOpcode::G_FMA, {Dst}, {Src0, Src1, Src2});
|
||||
}
|
||||
|
||||
/// Build and insert \p Res = G_FMAD \p Op0, \p Op1, \p Op2
|
||||
MachineInstrBuilder buildFMAD(const DstOp &Dst, const SrcOp &Src0,
|
||||
const SrcOp &Src1, const SrcOp &Src2,
|
||||
Optional<unsigned> Flags = None) {
|
||||
return buildInstr(TargetOpcode::G_FMAD, {Dst}, {Src0, Src1, Src2}, Flags);
|
||||
}
|
||||
|
||||
/// Build and insert \p Res = G_FNEG \p Op0
|
||||
MachineInstrBuilder buildFNeg(const DstOp &Dst, const SrcOp &Src0) {
|
||||
return buildInstr(TargetOpcode::G_FNEG, {Dst}, {Src0});
|
||||
|
|
|
@ -439,6 +439,9 @@ HANDLE_TARGET_OPCODE(G_FMUL)
|
|||
/// Generic FMA multiplication. Behaves like llvm fma intrinsic
|
||||
HANDLE_TARGET_OPCODE(G_FMA)
|
||||
|
||||
/// Generic FP multiply and add. Behaves as separate fmul and fadd.
|
||||
HANDLE_TARGET_OPCODE(G_FMAD)
|
||||
|
||||
/// Generic FP division.
|
||||
HANDLE_TARGET_OPCODE(G_FDIV)
|
||||
|
||||
|
|
|
@ -624,6 +624,15 @@ def G_FMA : GenericInstruction {
|
|||
let isCommutable = 0;
|
||||
}
|
||||
|
||||
/// Generic FP multiply and add. Perform a * b + c, while getting the
|
||||
/// same result as the separately rounded operations, unlike G_FMA.
|
||||
def G_FMAD : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
|
||||
let hasSideEffects = 0;
|
||||
let isCommutable = 0;
|
||||
}
|
||||
|
||||
// Generic FP division.
|
||||
def G_FDIV : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
|
|
|
@ -77,6 +77,7 @@ def : GINodeEquiv<G_UITOFP, uint_to_fp>;
|
|||
def : GINodeEquiv<G_FADD, fadd>;
|
||||
def : GINodeEquiv<G_FSUB, fsub>;
|
||||
def : GINodeEquiv<G_FMA, fma>;
|
||||
def : GINodeEquiv<G_FMAD, fmad>;
|
||||
def : GINodeEquiv<G_FMUL, fmul>;
|
||||
def : GINodeEquiv<G_FDIV, fdiv>;
|
||||
def : GINodeEquiv<G_FREM, frem>;
|
||||
|
|
|
@ -1753,6 +1753,7 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
|
|||
case TargetOpcode::G_FMUL:
|
||||
case TargetOpcode::G_FSUB:
|
||||
case TargetOpcode::G_FMA:
|
||||
case TargetOpcode::G_FMAD:
|
||||
case TargetOpcode::G_FNEG:
|
||||
case TargetOpcode::G_FABS:
|
||||
case TargetOpcode::G_FCANONICALIZE:
|
||||
|
@ -2828,6 +2829,7 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
|
|||
case G_FDIV:
|
||||
case G_FREM:
|
||||
case G_FMA:
|
||||
case G_FMAD:
|
||||
case G_FPOW:
|
||||
case G_FEXP:
|
||||
case G_FEXP2:
|
||||
|
|
|
@ -312,6 +312,9 @@
|
|||
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
|
||||
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
|
||||
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
|
||||
# DEBUG-NEXT: G_FMAD (opcode 116): 1 type index, 0 imm indices
|
||||
# DEBUG-NEXT:.. type index coverage check SKIPPED: no rules defined
|
||||
# DEBUG-NEXT:.. imm index coverage check SKIPPED: no rules defined
|
||||
# DEBUG-NEXT: G_FDIV (opcode {{[0-9]+}}): 1 type index, 0 imm indices
|
||||
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
|
||||
|
|
|
@ -130,6 +130,8 @@ TEST_F(GISelMITest, TestBuildFPInsts) {
|
|||
B.buildFAdd(S64, Copies[0], Copies[1]);
|
||||
B.buildFSub(S64, Copies[0], Copies[1]);
|
||||
B.buildFMA(S64, Copies[0], Copies[1], Copies[2]);
|
||||
B.buildFMAD(S64, Copies[0], Copies[1], Copies[2]);
|
||||
B.buildFMAD(S64, Copies[0], Copies[1], Copies[2], MachineInstr::FmNoNans);
|
||||
B.buildFNeg(S64, Copies[0]);
|
||||
B.buildFAbs(S64, Copies[0]);
|
||||
B.buildFCopysign(S64, Copies[0], Copies[1]);
|
||||
|
@ -141,6 +143,8 @@ TEST_F(GISelMITest, TestBuildFPInsts) {
|
|||
; CHECK: [[FADD:%[0-9]+]]:_(s64) = G_FADD [[COPY0]]:_, [[COPY1]]:_
|
||||
; CHECK: [[FSUB:%[0-9]+]]:_(s64) = G_FSUB [[COPY0]]:_, [[COPY1]]:_
|
||||
; CHECK: [[FMA:%[0-9]+]]:_(s64) = G_FMA [[COPY0]]:_, [[COPY1]]:_, [[COPY2]]:_
|
||||
; CHECK: [[FMAD0:%[0-9]+]]:_(s64) = G_FMAD [[COPY0]]:_, [[COPY1]]:_, [[COPY2]]:_
|
||||
; CHECK: [[FMAD1:%[0-9]+]]:_(s64) = nnan G_FMAD [[COPY0]]:_, [[COPY1]]:_, [[COPY2]]:_
|
||||
; CHECK: [[FNEG:%[0-9]+]]:_(s64) = G_FNEG [[COPY0]]:_
|
||||
; CHECK: [[FABS:%[0-9]+]]:_(s64) = G_FABS [[COPY0]]:_
|
||||
; CHECK: [[FCOPYSIGN:%[0-9]+]]:_(s64) = G_FCOPYSIGN [[COPY0]]:_, [[COPY1]]:_
|
||||
|
|
Loading…
Reference in New Issue