blob: b9225799c76e6478c0cddab3d7553e47216f9a7b [file] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// HLMatrixLowerHelper.h //
// Copyright (C) Microsoft Corporation. All rights reserved. //
// This file is distributed under the University of Illinois Open Source //
// License. See LICENSE.TXT for details. //
// //
// This file provides helper functions to lower high level matrix. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "llvm/IR/IRBuilder.h"
namespace llvm {
class Type;
class Value;
template<typename T>
class ArrayRef;
}
namespace hlsl {
namespace HLMatrixLower {
// TODO: use type annotation.
bool IsMatrixType(llvm::Type *Ty);
// Translate matrix type to vector type.
llvm::Type *LowerMatrixType(llvm::Type *Ty);
// TODO: use type annotation.
llvm::Type *GetMatrixInfo(llvm::Type *Ty, unsigned &col, unsigned &row);
// TODO: use type annotation.
bool IsMatrixArrayPointer(llvm::Type *Ty);
// Translate matrix array pointer type to vector array pointer type.
llvm::Type *LowerMatrixArrayPointer(llvm::Type *Ty);
llvm::Value *BuildVector(llvm::Type *EltTy, unsigned size,
llvm::ArrayRef<llvm::Value *> elts,
llvm::IRBuilder<> &Builder);
// For case like mat[i][j].
// IdxList is [i][0], [i][1], [i][2],[i][3].
// Idx is j.
// return [i][j] not mat[i][j] because resource ptr and temp ptr need different
// code gen.
llvm::Value *
LowerGEPOnMatIndexListToIndex(llvm::GetElementPtrInst *GEP,
llvm::ArrayRef<llvm::Value *> IdxList);
unsigned GetColMajorIdx(unsigned r, unsigned c, unsigned row);
unsigned GetRowMajorIdx(unsigned r, unsigned c, unsigned col);
} // namespace HLMatrixLower
} // namespace hlsl