/// 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_narrow_128_ToLargest(const LegalizerInfo::SizeAndActionsVec &v) { assert(v.size() >= 1); assert(v[0].first > 2); LegalizerInfo::SizeAndActionsVec result = {{1, LegalizerInfo::WidenScalar}, {2, LegalizerInfo::Unsupported}}; addAndInterleaveWithUnsupported(result, v); auto Largest = result.back().first; assert(Largest + 1 < 128); result.push_back({Largest + 1, LegalizerInfo::Unsupported}); result.push_back({128, LegalizerInfo::NarrowScalar}); result.push_back({129, LegalizerInfo::Unsupported}); return result; }
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_32(const LegalizerInfo::SizeAndActionsVec &v) { assert(v.size() >= 1); assert(v[0].first > 33); LegalizerInfo::SizeAndActionsVec result = { {1, LegalizerInfo::WidenScalar}, {2, LegalizerInfo::Unsupported}, {8, LegalizerInfo::WidenScalar}, {9, LegalizerInfo::Unsupported}, {16, LegalizerInfo::WidenScalar}, {17, LegalizerInfo::Unsupported}, {32, LegalizerInfo::WidenScalar}, {33, LegalizerInfo::Unsupported}}; addAndInterleaveWithUnsupported(result, v); auto Largest = result.back().first; result.push_back({Largest + 1, LegalizerInfo::Unsupported}); return result; }