@@ -26,7 +26,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2626#include " common/IGCConstantFolder.h"
2727#include < cfenv>
2828#include " Probe/Assertion.h"
29- #include " Types.hpp"
3029
3130namespace IGC
3231{
@@ -185,128 +184,6 @@ llvm::Constant* IGCConstantFolder::CreateCanonicalize(llvm::Constant* C0, bool f
185184 return llvm::ConstantFP::get (C0->getContext (), APF);
186185}
187186
188- llvm::Constant* IGCConstantFolder::CreateFirstBitLo (llvm::Constant* C0) const
189- {
190- if (llvm::isa<llvm::UndefValue>(C0) || C0->getType ()->getIntegerBitWidth () > 32 )
191- {
192- return nullptr ;
193- }
194- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
195- uint32_t result = CI0->getValue ().countTrailingZeros ();
196- return llvm::ConstantInt::get (C0->getType (), result);
197- }
198-
199- llvm::Constant* IGCConstantFolder::CreateFirstBitHi (llvm::Constant* C0) const
200- {
201- if (llvm::isa<llvm::UndefValue>(C0) || C0->getType ()->getIntegerBitWidth () > 32 )
202- {
203- return nullptr ;
204- }
205- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
206- uint32_t result = CI0->getValue ().getActiveBits ();
207- return llvm::ConstantInt::get (C0->getType (), result);
208- }
209-
210- llvm::Constant* IGCConstantFolder::CreateFirstBitShi (llvm::Constant* C0) const
211- {
212- return CreateFirstBitHi (C0);
213- }
214-
215- llvm::Constant* IGCConstantFolder::CreateBfrev (llvm::Constant* C0) const
216- {
217- if (llvm::isa<llvm::UndefValue>(C0) || C0->getType ()->getIntegerBitWidth () != 32 )
218- {
219- return nullptr ;
220- }
221- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
222- llvm::APInt result = CI0->getValue ();
223- result.flipAllBits ();
224- return llvm::ConstantInt::get (C0->getContext (), result);
225- }
226-
227- llvm::Constant* IGCConstantFolder::CreateUbfe (llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const
228- {
229- if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) || C2->getType ()->getIntegerBitWidth () != 32 )
230- {
231- return nullptr ;
232- }
233- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
234- llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
235- llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
236- uint32_t width = int_cast<uint32_t >(CI0->getZExtValue ()) & 0x1F ;
237- uint32_t offset = int_cast<uint32_t >(CI1->getZExtValue ()) & 0x1F ;
238- uint32_t bitwidth = CI2->getType ()->getBitWidth ();
239- if (CI0->isZero ())
240- {
241- return llvm::ConstantInt::get (C0->getType (), 0 );
242- }
243- else if ((width + offset) < bitwidth)
244- {
245- llvm::APInt result = CI2->getValue ();
246- result = result.shl (bitwidth - (width + offset));
247- result = result.lshr (bitwidth - width);
248- return llvm::ConstantInt::get (C0->getContext (), result);
249- }
250- else
251- {
252- llvm::APInt result = CI2->getValue ();
253- result = result.lshr (bitwidth - offset);
254- return llvm::ConstantInt::get (C0->getContext (), result);
255- }
256- }
257-
258- llvm::Constant* IGCConstantFolder::CreateIbfe (llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const
259- {
260- if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) || C2->getType ()->getIntegerBitWidth () != 32 )
261- {
262- return nullptr ;
263- }
264- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
265- llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
266- llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
267- uint32_t width = int_cast<uint32_t >(CI0->getZExtValue ()) & 0x1F ;
268- uint32_t offset = int_cast<uint32_t >(CI1->getZExtValue ()) & 0x1F ;
269- uint32_t bitwidth = CI2->getType ()->getBitWidth ();
270- if (CI0->isZero ())
271- {
272- return llvm::ConstantInt::get (C0->getType (), 0 );
273- }
274- else if ((width + offset) < bitwidth)
275- {
276- llvm::APInt result = CI2->getValue ();
277- result = result.shl (bitwidth - (width + offset));
278- result = result.ashr (bitwidth - width);
279- return llvm::ConstantInt::get (C0->getContext (), result);
280- }
281- else
282- {
283- llvm::APInt result = CI2->getValue ();
284- result = result.ashr (bitwidth - offset);
285- return llvm::ConstantInt::get (C0->getContext (), result);
286- }
287- }
288-
289- llvm::Constant* IGCConstantFolder::CreateBfi (llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2, llvm::Constant* C3) const
290- {
291- if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) ||
292- llvm::isa<llvm::UndefValue>(C3) || C2->getType ()->getIntegerBitWidth () != 32 || C3->getType ()->getIntegerBitWidth () != 32 )
293- {
294- return nullptr ;
295- }
296- llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
297- llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
298- llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number the bits are taken from.
299- llvm::ConstantInt* CI3 = llvm::cast<llvm::ConstantInt>(C3); // the number with bits to be replaced.
300- uint32_t width = int_cast<uint32_t >(CI0->getZExtValue ());
301- uint32_t offset = int_cast<uint32_t >(CI1->getZExtValue ());
302- uint32_t bitwidth = CI2->getType ()->getBitWidth ();
303- llvm::APInt bitmask = llvm::APInt::getBitsSet (bitwidth, offset, offset + width);
304- llvm::APInt result = CI2->getValue ();
305- result = result.shl (offset);
306- result = (result & bitmask) | (CI3->getValue () & !bitmask);
307- return llvm::ConstantInt::get (C0->getContext (), result);
308- }
309-
310187llvm::Constant* IGCConstantFolder::CreateGradient (llvm::Constant* C0) const
311188{
312189 IGC_ASSERT (nullptr != C0);
0 commit comments