mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
GlobalISel: Add G_EXTRACT/G_INSERT offset to legalize info
Immediate legalize fields were added for G_SEXT_INREG. Simiarly, these are likely not legal except for certain offsets.
This commit is contained in:
parent
cc7d1cc227
commit
d3b193e26a
@ -459,6 +459,14 @@ class LegalizeRuleSet {
|
||||
immIdx(0); // Inform verifier imm idx 0 is handled.
|
||||
return actionIf(Action, typeInSet(typeIdx(0), Types));
|
||||
}
|
||||
|
||||
LegalizeRuleSet &actionForTypeWithAnyImm(
|
||||
LegalizeAction Action, std::initializer_list<std::pair<LLT, LLT>> Types) {
|
||||
using namespace LegalityPredicates;
|
||||
immIdx(0); // Inform verifier imm idx 0 is handled.
|
||||
return actionIf(Action, typePairInSet(typeIdx(0), typeIdx(1), Types));
|
||||
}
|
||||
|
||||
/// Use the given action when type indexes 0 and 1 are both in the given list.
|
||||
/// That is, the type pair is in the cartesian product of the list.
|
||||
/// Action should not be an action that requires mutation.
|
||||
@ -528,6 +536,13 @@ public:
|
||||
markAllIdxsAsCovered();
|
||||
return actionForTypeWithAnyImm(LegalizeAction::Legal, Types);
|
||||
}
|
||||
|
||||
LegalizeRuleSet &legalForTypeWithAnyImm(
|
||||
std::initializer_list<std::pair<LLT, LLT>> Types) {
|
||||
markAllIdxsAsCovered();
|
||||
return actionForTypeWithAnyImm(LegalizeAction::Legal, Types);
|
||||
}
|
||||
|
||||
/// The instruction is legal when type indexes 0 and 1 along with the memory
|
||||
/// size and minimum alignment is any type and size tuple in the given list.
|
||||
LegalizeRuleSet &legalForTypesWithMemDesc(
|
||||
|
@ -974,7 +974,7 @@ def G_FENCE : GenericInstruction {
|
||||
// register banks have been selected.
|
||||
def G_EXTRACT : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$res);
|
||||
let InOperandList = (ins type1:$src, unknown:$offset);
|
||||
let InOperandList = (ins type1:$src, untyped_imm_0:$offset);
|
||||
let hasSideEffects = 0;
|
||||
}
|
||||
|
||||
@ -993,7 +993,7 @@ def G_UNMERGE_VALUES : GenericInstruction {
|
||||
// Insert a smaller register into a larger one at the specified bit-index.
|
||||
def G_INSERT : GenericInstruction {
|
||||
let OutOperandList = (outs type0:$dst);
|
||||
let InOperandList = (ins type0:$src, type1:$op, unknown:$offset);
|
||||
let InOperandList = (ins type0:$src, type1:$op, untyped_imm_0:$offset);
|
||||
let hasSideEffects = 0;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,7 @@
|
||||
# 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_EXTRACT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
|
||||
# DEBUG-NEXT: G_EXTRACT (opcode {{[0-9]+}}): 2 type indices, 1 imm index
|
||||
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
|
||||
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
|
||||
#
|
||||
@ -84,7 +84,7 @@
|
||||
# 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_INSERT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
|
||||
# DEBUG-NEXT: G_INSERT (opcode {{[0-9]+}}): 2 type indices, 1 imm index
|
||||
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
|
||||
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
|
||||
#
|
||||
|
@ -2311,7 +2311,7 @@ TEST_F(AArch64GISelMITest, NarrowScalarExtract) {
|
||||
// Declare your legalization info
|
||||
DefineLegalizerInfo(A, {
|
||||
getActionDefinitionsBuilder(G_UNMERGE_VALUES).legalFor({{s32, s64}});
|
||||
getActionDefinitionsBuilder(G_EXTRACT).legalFor({{s16, s32}});
|
||||
getActionDefinitionsBuilder(G_EXTRACT).legalForTypeWithAnyImm({{s16, s32}});
|
||||
});
|
||||
|
||||
LLT S16{LLT::scalar(16)};
|
||||
|
Loading…
x
Reference in New Issue
Block a user