1*4ba319b5SDimitry Andric //===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//
2*4ba319b5SDimitry Andric //
3*4ba319b5SDimitry Andric // The LLVM Compiler Infrastructure
4*4ba319b5SDimitry Andric //
5*4ba319b5SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*4ba319b5SDimitry Andric // License. See LICENSE.TXT for details.
7*4ba319b5SDimitry Andric //
8*4ba319b5SDimitry Andric //===----------------------------------------------------------------------===//
9*4ba319b5SDimitry Andric //
10*4ba319b5SDimitry Andric // A library of mutation factories to use for LegalityMutation.
11*4ba319b5SDimitry Andric //
12*4ba319b5SDimitry Andric //===----------------------------------------------------------------------===//
13*4ba319b5SDimitry Andric
14*4ba319b5SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
15*4ba319b5SDimitry Andric
16*4ba319b5SDimitry Andric using namespace llvm;
17*4ba319b5SDimitry Andric
changeTo(unsigned TypeIdx,LLT Ty)18*4ba319b5SDimitry Andric LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, LLT Ty) {
19*4ba319b5SDimitry Andric return
20*4ba319b5SDimitry Andric [=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); };
21*4ba319b5SDimitry Andric }
22*4ba319b5SDimitry Andric
changeTo(unsigned TypeIdx,unsigned FromTypeIdx)23*4ba319b5SDimitry Andric LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx,
24*4ba319b5SDimitry Andric unsigned FromTypeIdx) {
25*4ba319b5SDimitry Andric return [=](const LegalityQuery &Query) {
26*4ba319b5SDimitry Andric return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]);
27*4ba319b5SDimitry Andric };
28*4ba319b5SDimitry Andric }
29*4ba319b5SDimitry Andric
widenScalarToNextPow2(unsigned TypeIdx,unsigned Min)30*4ba319b5SDimitry Andric LegalizeMutation LegalizeMutations::widenScalarToNextPow2(unsigned TypeIdx,
31*4ba319b5SDimitry Andric unsigned Min) {
32*4ba319b5SDimitry Andric return [=](const LegalityQuery &Query) {
33*4ba319b5SDimitry Andric unsigned NewSizeInBits =
34*4ba319b5SDimitry Andric 1 << Log2_32_Ceil(Query.Types[TypeIdx].getSizeInBits());
35*4ba319b5SDimitry Andric if (NewSizeInBits < Min)
36*4ba319b5SDimitry Andric NewSizeInBits = Min;
37*4ba319b5SDimitry Andric return std::make_pair(TypeIdx, LLT::scalar(NewSizeInBits));
38*4ba319b5SDimitry Andric };
39*4ba319b5SDimitry Andric }
40*4ba319b5SDimitry Andric
moreElementsToNextPow2(unsigned TypeIdx,unsigned Min)41*4ba319b5SDimitry Andric LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,
42*4ba319b5SDimitry Andric unsigned Min) {
43*4ba319b5SDimitry Andric return [=](const LegalityQuery &Query) {
44*4ba319b5SDimitry Andric const LLT &VecTy = Query.Types[TypeIdx];
45*4ba319b5SDimitry Andric unsigned NewNumElements = 1 << Log2_32_Ceil(VecTy.getNumElements());
46*4ba319b5SDimitry Andric if (NewNumElements < Min)
47*4ba319b5SDimitry Andric NewNumElements = Min;
48*4ba319b5SDimitry Andric return std::make_pair(
49*4ba319b5SDimitry Andric TypeIdx, LLT::vector(NewNumElements, VecTy.getScalarSizeInBits()));
50*4ba319b5SDimitry Andric };
51*4ba319b5SDimitry Andric }
52