/// FIXME: The following static functions are SizeChangeStrategy functions /// that are meant to temporarily mimic the behaviour of the old legalization /// based on doubling/halving non-legal types as closely as possible. This is /// not entirly possible as only legalizing the types that are exactly a power /// of 2 times the size of the legal types would require specifying all those /// sizes explicitly. /// In practice, not specifying those isn't a problem, and the below functions /// should disappear quickly as we add support for legalizing non-power-of-2 /// sized types further. static void addAndInterleaveWithUnsupported(LegalizerInfo::SizeAndActionsVec &result, const LegalizerInfo::SizeAndActionsVec &v) { for (unsigned i = 0; i < v.size(); ++i) { result.push_back(v[i]); if (i + 1 < v[i].first && i + 1 < v.size() && v[i + 1].first != v[i].first + 1) result.push_back({v[i].first + 1, LegalizerInfo::Unsupported}); } }
static LegalizerInfo::SizeAndActionsVec widen_1(const LegalizerInfo::SizeAndActionsVec &v) { assert(v.size() >= 1); assert(v[0].first > 1); LegalizerInfo::SizeAndActionsVec result = {{1, WidenScalar}, {2, Unsupported}}; addAndInterleaveWithUnsupported(result, v); auto Largest = result.back().first; result.push_back({Largest + 1, Unsupported}); return result; }
static LegalizerInfo::SizeAndActionsVec widen_1_8_16_narrowToLargest(const LegalizerInfo::SizeAndActionsVec &v) { assert(v.size() >= 1); assert(v[0].first > 17); LegalizerInfo::SizeAndActionsVec result = { {1, LegalizerInfo::WidenScalar}, {2, LegalizerInfo::Unsupported}, {8, LegalizerInfo::WidenScalar}, {9, LegalizerInfo::Unsupported}, {16, LegalizerInfo::WidenScalar}, {17, LegalizerInfo::Unsupported}}; addAndInterleaveWithUnsupported(result, v); auto Largest = result.back().first; result.push_back({Largest + 1, LegalizerInfo::NarrowScalar}); return result; }