[GlobalISel] Add Saturated Truncate Instructions (#147526)
Introduces saturated truncate instructions to Global ISel: G_TRUNC_SSAT_S, G_TRUNC_SSAT_U, G_TRUNC_USAT_U. These were previously introduced to SDAG to reduce redundant code. The patch only initially introduces the instruction, a later patch will follow to add combines and legalization for each instruction.
This commit is contained in:
parent
cd9236d788
commit
4c27279ec4
@ -148,6 +148,33 @@ G_EXTRACT for scalar types, but acts elementwise on vectors.
|
||||
|
||||
%1:_(s16) = G_TRUNC %0:_(s32)
|
||||
|
||||
G_TRUNC_SSAT_S
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Truncate a signed input to a signed result with saturation.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
%1:_(s16) = G_TRUNC_SSAT_S %0:_(s32)
|
||||
|
||||
G_TRUNC_SSAT_U
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Truncate a signed input to an unsigned result with saturation.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
%1:_(s16) = G_TRUNC_SSAT_U %0:_(s32)
|
||||
|
||||
G_TRUNC_USAT_U
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Truncate a unsigned input to an unsigned result with saturation.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
%1:_(s16) = G_TRUNC_USAT_U %0:_(s32)
|
||||
|
||||
Type Conversions
|
||||
----------------
|
||||
|
||||
|
@ -763,7 +763,7 @@ public:
|
||||
|
||||
/// Build and insert \p Res = G_SEXT \p Op, \p Res = G_TRUNC \p Op, or
|
||||
/// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
|
||||
/// ///
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
@ -773,7 +773,7 @@ public:
|
||||
|
||||
/// Build and insert \p Res = G_ZEXT \p Op, \p Res = G_TRUNC \p Op, or
|
||||
/// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
|
||||
/// ///
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
@ -783,7 +783,7 @@ public:
|
||||
|
||||
// Build and insert \p Res = G_ANYEXT \p Op, \p Res = G_TRUNC \p Op, or
|
||||
/// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
|
||||
/// ///
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
@ -794,7 +794,7 @@ public:
|
||||
/// Build and insert \p Res = \p ExtOpc, \p Res = G_TRUNC \p
|
||||
/// Op, or \p Res = COPY \p Op depending on the differing sizes of \p Res and
|
||||
/// \p Op.
|
||||
/// ///
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
@ -809,6 +809,48 @@ public:
|
||||
MachineInstrBuilder buildZExtInReg(const DstOp &Res, const SrcOp &Op,
|
||||
int64_t ImmOp);
|
||||
|
||||
/// Build and insert \p Res = \p G_TRUNC_SSAT_S \p Op
|
||||
///
|
||||
/// G_TRUNC_SSAT_S truncates the signed input, \p Op, to a signed result with
|
||||
/// saturation.
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
///
|
||||
/// \return The newly created instruction.
|
||||
MachineInstrBuilder buildTruncSSatS(const DstOp &Res, const SrcOp &Op) {
|
||||
return buildInstr(TargetOpcode::G_TRUNC_SSAT_S, {Res}, {Op});
|
||||
}
|
||||
|
||||
/// Build and insert \p Res = \p G_TRUNC_SSAT_U \p Op
|
||||
///
|
||||
/// G_TRUNC_SSAT_U truncates the signed input, \p Op, to an unsigned result
|
||||
/// with saturation.
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
///
|
||||
/// \return The newly created instruction.
|
||||
MachineInstrBuilder buildTruncSSatU(const DstOp &Res, const SrcOp &Op) {
|
||||
return buildInstr(TargetOpcode::G_TRUNC_SSAT_U, {Res}, {Op});
|
||||
}
|
||||
|
||||
/// Build and insert \p Res = \p G_TRUNC_USAT_U \p Op
|
||||
///
|
||||
/// G_TRUNC_USAT_U truncates the unsigned input, \p Op, to an unsigned result
|
||||
/// with saturation.
|
||||
///
|
||||
/// \pre setBasicBlock or setMI must have been called.
|
||||
/// \pre \p Res must be a generic virtual register with scalar or vector type.
|
||||
/// \pre \p Op must be a generic virtual register with scalar or vector type.
|
||||
///
|
||||
/// \return The newly created instruction.
|
||||
MachineInstrBuilder buildTruncUSatU(const DstOp &Res, const SrcOp &Op) {
|
||||
return buildInstr(TargetOpcode::G_TRUNC_USAT_U, {Res}, {Op});
|
||||
}
|
||||
|
||||
/// Build and insert an appropriate cast between two registers of equal size.
|
||||
MachineInstrBuilder buildCast(const DstOp &Dst, const SrcOp &Src);
|
||||
|
||||
|
@ -475,6 +475,15 @@ HANDLE_TARGET_OPCODE(G_ANYEXT)
|
||||
/// elements of the vector.
|
||||
HANDLE_TARGET_OPCODE(G_TRUNC)
|
||||
|
||||
/// Generic instruction to truncate a signed operand to a signed result with saturation.
|
||||
HANDLE_TARGET_OPCODE(G_TRUNC_SSAT_S)
|
||||
|
||||
/// Generic instruction to truncate a signed operand to an unsigned result with saturation.
|
||||
HANDLE_TARGET_OPCODE(G_TRUNC_SSAT_U)
|
||||
|
||||
/// Generic instruction to truncate a unsigned operand to an unsigned result with saturation.
|
||||
HANDLE_TARGET_OPCODE(G_TRUNC_USAT_U)
|
||||
|
||||
/// Generic integer constant.
|
||||
HANDLE_TARGET_OPCODE(G_CONSTANT)
|
||||
|
||||
|
@ -86,6 +86,27 @@ def G_TRUNC : GenericInstruction {
|
||||
let hasSideEffects = false;
|
||||
}
|
||||
|
||||
// Truncate the signed operand to a signed result with saturation.
|
||||
def G_TRUNC_SSAT_S : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins type1:$src);
|
||||
let hasSideEffects = false;
|
||||
}
|
||||
|
||||
// Truncate the signed operand to an unsigned result with saturation.
|
||||
def G_TRUNC_SSAT_U : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins type1:$src);
|
||||
let hasSideEffects = false;
|
||||
}
|
||||
|
||||
// Truncate the unsigned operand to an unsigned result with saturation.
|
||||
def G_TRUNC_USAT_U : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins type1:$src);
|
||||
let hasSideEffects = false;
|
||||
}
|
||||
|
||||
def G_IMPLICIT_DEF : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins);
|
||||
|
@ -1424,6 +1424,9 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
|
||||
case TargetOpcode::G_ZEXT:
|
||||
case TargetOpcode::G_ANYEXT:
|
||||
case TargetOpcode::G_TRUNC:
|
||||
case TargetOpcode::G_TRUNC_SSAT_S:
|
||||
case TargetOpcode::G_TRUNC_SSAT_U:
|
||||
case TargetOpcode::G_TRUNC_USAT_U:
|
||||
case TargetOpcode::G_FPEXT:
|
||||
case TargetOpcode::G_FPTRUNC: {
|
||||
// Number of operands and presense of types is already checked (and
|
||||
@ -1450,6 +1453,9 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
|
||||
report("Generic extend has destination type no larger than source", MI);
|
||||
break;
|
||||
case TargetOpcode::G_TRUNC:
|
||||
case TargetOpcode::G_TRUNC_SSAT_S:
|
||||
case TargetOpcode::G_TRUNC_SSAT_U:
|
||||
case TargetOpcode::G_TRUNC_USAT_U:
|
||||
case TargetOpcode::G_FPTRUNC:
|
||||
if (DstSize >= SrcSize)
|
||||
report("Generic truncate has destination type no smaller than source",
|
||||
|
@ -319,6 +319,15 @@
|
||||
# DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
|
||||
# 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_TRUNC_SSAT_S (opcode {{[0-9]+}}): 2 type indices, 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_TRUNC_SSAT_U (opcode {{[0-9]+}}): 2 type indices, 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_TRUNC_USAT_U (opcode {{[0-9]+}}): 2 type indices, 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_CONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
|
||||
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
|
||||
|
@ -315,6 +315,15 @@
|
||||
# DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices, 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_TRUNC_SSAT_S (opcode {{[0-9]+}}): 2 type indices, 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_TRUNC_SSAT_U (opcode {{[0-9]+}}): 2 type indices, 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_TRUNC_USAT_U (opcode {{[0-9]+}}): 2 type indices, 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_CONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
|
||||
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
|
||||
|
@ -12,7 +12,7 @@
|
||||
# CHECK-NEXT:0 Data Size:0 []
|
||||
# CHECK-NEXT: Symbol @0 _start
|
||||
# CHECK-NEXT:0 Org Offset:3 Value:0
|
||||
# CHECK-NEXT:3 Relaxable Size:2 <MCInst #1996 <MCOperand Expr:.Ltmp0>>
|
||||
# CHECK-NEXT:3 Relaxable Size:2 <MCInst #1999 <MCOperand Expr:.Ltmp0>>
|
||||
# CHECK-NEXT: Fixup @1 Value:.Ltmp0 Kind:4001
|
||||
# CHECK-NEXT:5 Data Size:16 [48,8b,04,25,00,00,00,00,48,8b,04,25,00,00,00,00]
|
||||
# CHECK-NEXT: Fixup @4 Value:f0@<variant 11> Kind:4017
|
||||
|
@ -96,71 +96,71 @@ def MyCombiner: GICombiner<"GenMyCombiner", [
|
||||
|
||||
// CHECK: const uint8_t *GenMyCombiner::getMatchTable() const {
|
||||
// CHECK-NEXT: constexpr static uint8_t MatchTable0[] = {
|
||||
// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(99), GIMT_Encode2(207), /*)*//*default:*//*Label 5*/ GIMT_Encode4(508),
|
||||
// CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(442), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 170 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(460), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 178 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(472), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 402 */ /*TargetOpcode::G_FNEG*//*Label 3*/ GIMT_Encode4(484), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 438 */ /*TargetOpcode::G_FABS*//*Label 4*/ GIMT_Encode4(496),
|
||||
// CHECK-NEXT: /* 442 */ // Label 0: @442
|
||||
// CHECK-NEXT: /* 442 */ GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(459), // Rule ID 2 //
|
||||
// CHECK-NEXT: /* 447 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule2Enabled),
|
||||
// CHECK-NEXT: /* 450 */ // MIs[0] x
|
||||
// CHECK-NEXT: /* 450 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 450 */ // MIs[0] y
|
||||
// CHECK-NEXT: /* 450 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 450 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0),
|
||||
// CHECK-NEXT: /* 454 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1),
|
||||
// CHECK-NEXT: /* 458 */ // Combiner Rule #2: TwoMatchNoApply
|
||||
// CHECK-NEXT: /* 458 */ GIR_EraseRootFromParent_Done,
|
||||
// CHECK-NEXT: /* 459 */ // Label 6: @459
|
||||
// CHECK-NEXT: /* 459 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 460 */ // Label 1: @460
|
||||
// CHECK-NEXT: /* 460 */ GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(471), // Rule ID 3 //
|
||||
// CHECK-NEXT: /* 465 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule3Enabled),
|
||||
// CHECK-NEXT: /* 468 */ // MIs[0] a
|
||||
// CHECK-NEXT: /* 468 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 468 */ // MIs[0] y
|
||||
// CHECK-NEXT: /* 468 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 468 */ // Combiner Rule #3: NoMatchTwoApply
|
||||
// CHECK-NEXT: /* 468 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner2),
|
||||
// CHECK-NEXT: /* 471 */ // Label 7: @471
|
||||
// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(99), GIMT_Encode2(210), /*)*//*default:*//*Label 5*/ GIMT_Encode4(520),
|
||||
// CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(454), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 182 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(472), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 190 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(484), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 414 */ /*TargetOpcode::G_FNEG*//*Label 3*/ GIMT_Encode4(496), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),
|
||||
// CHECK-NEXT: /* 450 */ /*TargetOpcode::G_FABS*//*Label 4*/ GIMT_Encode4(508),
|
||||
// CHECK-NEXT: /* 454 */ // Label 0: @454
|
||||
// CHECK-NEXT: /* 454 */ GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(471), // Rule ID 2 //
|
||||
// CHECK-NEXT: /* 459 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule2Enabled),
|
||||
// CHECK-NEXT: /* 462 */ // MIs[0] x
|
||||
// CHECK-NEXT: /* 462 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 462 */ // MIs[0] y
|
||||
// CHECK-NEXT: /* 462 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 462 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0),
|
||||
// CHECK-NEXT: /* 466 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1),
|
||||
// CHECK-NEXT: /* 470 */ // Combiner Rule #2: TwoMatchNoApply
|
||||
// CHECK-NEXT: /* 470 */ GIR_EraseRootFromParent_Done,
|
||||
// CHECK-NEXT: /* 471 */ // Label 6: @471
|
||||
// CHECK-NEXT: /* 471 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 472 */ // Label 2: @472
|
||||
// CHECK-NEXT: /* 472 */ GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(483), // Rule ID 4 //
|
||||
// CHECK-NEXT: /* 477 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule4Enabled),
|
||||
// CHECK-NEXT: /* 472 */ // Label 1: @472
|
||||
// CHECK-NEXT: /* 472 */ GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(483), // Rule ID 3 //
|
||||
// CHECK-NEXT: /* 477 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule3Enabled),
|
||||
// CHECK-NEXT: /* 480 */ // MIs[0] a
|
||||
// CHECK-NEXT: /* 480 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 480 */ // MIs[0] y
|
||||
// CHECK-NEXT: /* 480 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 480 */ // Combiner Rule #4: CombineCXXOrder
|
||||
// CHECK-NEXT: /* 480 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner3),
|
||||
// CHECK-NEXT: /* 483 */ // Label 8: @483
|
||||
// CHECK-NEXT: /* 480 */ // Combiner Rule #3: NoMatchTwoApply
|
||||
// CHECK-NEXT: /* 480 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner2),
|
||||
// CHECK-NEXT: /* 483 */ // Label 7: @483
|
||||
// CHECK-NEXT: /* 483 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 484 */ // Label 3: @484
|
||||
// CHECK-NEXT: /* 484 */ GIM_Try, /*On fail goto*//*Label 9*/ GIMT_Encode4(495), // Rule ID 1 //
|
||||
// CHECK-NEXT: /* 489 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule1Enabled),
|
||||
// CHECK-NEXT: /* 484 */ // Label 2: @484
|
||||
// CHECK-NEXT: /* 484 */ GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(495), // Rule ID 4 //
|
||||
// CHECK-NEXT: /* 489 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule4Enabled),
|
||||
// CHECK-NEXT: /* 492 */ // MIs[0] a
|
||||
// CHECK-NEXT: /* 492 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 492 */ // MIs[0] b
|
||||
// CHECK-NEXT: /* 492 */ // MIs[0] y
|
||||
// CHECK-NEXT: /* 492 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 492 */ // Combiner Rule #1: TwoMatchTwoApply
|
||||
// CHECK-NEXT: /* 492 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner1),
|
||||
// CHECK-NEXT: /* 495 */ // Label 9: @495
|
||||
// CHECK-NEXT: /* 492 */ // Combiner Rule #4: CombineCXXOrder
|
||||
// CHECK-NEXT: /* 492 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner3),
|
||||
// CHECK-NEXT: /* 495 */ // Label 8: @495
|
||||
// CHECK-NEXT: /* 495 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 496 */ // Label 4: @496
|
||||
// CHECK-NEXT: /* 496 */ GIM_Try, /*On fail goto*//*Label 10*/ GIMT_Encode4(507), // Rule ID 0 //
|
||||
// CHECK-NEXT: /* 501 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
|
||||
// CHECK-NEXT: /* 496 */ // Label 3: @496
|
||||
// CHECK-NEXT: /* 496 */ GIM_Try, /*On fail goto*//*Label 9*/ GIMT_Encode4(507), // Rule ID 1 //
|
||||
// CHECK-NEXT: /* 501 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule1Enabled),
|
||||
// CHECK-NEXT: /* 504 */ // MIs[0] a
|
||||
// CHECK-NEXT: /* 504 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 504 */ // MIs[0] b
|
||||
// CHECK-NEXT: /* 504 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 504 */ // Combiner Rule #0: OneMatchOneApply
|
||||
// CHECK-NEXT: /* 504 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
|
||||
// CHECK-NEXT: /* 507 */ // Label 10: @507
|
||||
// CHECK-NEXT: /* 504 */ // Combiner Rule #1: TwoMatchTwoApply
|
||||
// CHECK-NEXT: /* 504 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner1),
|
||||
// CHECK-NEXT: /* 507 */ // Label 9: @507
|
||||
// CHECK-NEXT: /* 507 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 508 */ // Label 5: @508
|
||||
// CHECK-NEXT: /* 508 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 509 */ }; // Size: 509 bytes
|
||||
// CHECK-NEXT: /* 508 */ // Label 4: @508
|
||||
// CHECK-NEXT: /* 508 */ GIM_Try, /*On fail goto*//*Label 10*/ GIMT_Encode4(519), // Rule ID 0 //
|
||||
// CHECK-NEXT: /* 513 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
|
||||
// CHECK-NEXT: /* 516 */ // MIs[0] a
|
||||
// CHECK-NEXT: /* 516 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 516 */ // MIs[0] b
|
||||
// CHECK-NEXT: /* 516 */ // No operand predicates
|
||||
// CHECK-NEXT: /* 516 */ // Combiner Rule #0: OneMatchOneApply
|
||||
// CHECK-NEXT: /* 516 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
|
||||
// CHECK-NEXT: /* 519 */ // Label 10: @519
|
||||
// CHECK-NEXT: /* 519 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 520 */ // Label 5: @520
|
||||
// CHECK-NEXT: /* 520 */ GIM_Reject,
|
||||
// CHECK-NEXT: /* 521 */ }; // Size: 521 bytes
|
||||
// CHECK-NEXT: return MatchTable0;
|
||||
// CHECK-NEXT: }
|
||||
|
@ -535,7 +535,7 @@ def : Pat<(frag GPR32:$src1, complex:$src2, complex:$src3),
|
||||
// R00O-NEXT: GIM_Reject,
|
||||
// R00O: // Label [[DEFAULT_NUM]]: @[[DEFAULT]]
|
||||
// R00O-NEXT: GIM_Reject,
|
||||
// R00O-NEXT: }; // Size: 1878 bytes
|
||||
// R00O-NEXT: }; // Size: 1890 bytes
|
||||
|
||||
def INSNBOB : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2, GPR32:$src3, GPR32:$src4),
|
||||
[(set GPR32:$dst,
|
||||
|
Loading…
x
Reference in New Issue
Block a user