@@ -104,6 +104,7 @@ void CShader::InitEncoder(SIMDMode simdSize, bool canAbortOnSpill, ShaderDispatc
104104 m_SavedFP = nullptr ;
105105 m_ARGV = nullptr ;
106106 m_RETV = nullptr ;
107+ m_GlobalStateBufPtr = nullptr ;
107108
108109 // SIMD32 is a SIMD16 shader with 2 instance of each instruction
109110 m_SIMDSize = (simdSize == SIMDMode::SIMD8 ? SIMDMode::SIMD8 : SIMDMode::SIMD16);
@@ -242,6 +243,10 @@ void CShader::InitializeStackVariables()
242243 // create frame-pointer register
243244 m_FP = GetNewVariable (1 , ISA_TYPE_UQ, EALIGN_QWORD, true , 1 , " FP" );
244245 encoder.GetVISAPredefinedVar (m_FP, PREDEFINED_FE_FP);
246+ // create side buffer ptr
247+ m_GlobalStateBufPtr = GetNewVariable (1 , GetContext ()->getRegisterPointerSizeInBits (ADDRESS_SPACE_GLOBAL) ? ISA_TYPE_UQ : ISA_TYPE_UD,
248+ EALIGN_QWORD, true , 1 , " SideBufferPtr" );
249+ encoder.GetVISAPredefinedVar (m_GlobalStateBufPtr, PREDEFINED_GLOBALBUFFERPTR);
245250}
246251
247252// / save FP of previous frame when entering a stack-call function
@@ -800,6 +805,36 @@ CVariable* CShader::GetRETV()
800805 return m_RETV;
801806}
802807
808+ CVariable* CShader::GetGlobalStateBufferPtr ()
809+ {
810+ return m_GlobalStateBufPtr;
811+ }
812+
813+ CVariable* CShader::GetGlobalStateBufferInput ()
814+ {
815+ // Return CVariable* corresponding to kernel argument
816+ ImplicitArgs implicitArgs (*entry, m_pMdUtils);
817+ unsigned numPushArgs = m_ModuleMetadata->pushInfo .pushAnalysisWIInfos .size ();
818+ unsigned numImplicitArgs = implicitArgs.size ();
819+ unsigned numFuncArgs = entry->arg_size () - numImplicitArgs - numPushArgs;
820+
821+ Argument* kerArg = nullptr ;
822+ llvm::Function::arg_iterator arg = entry->arg_begin ();
823+ for (unsigned i = 0 ; i < numFuncArgs; ++i, ++arg);
824+ for (unsigned i = 0 ; i < numImplicitArgs; ++i, ++arg) {
825+ ImplicitArg implicitArg = implicitArgs[i];
826+ if (implicitArg.getArgType () == ImplicitArg::ArgType::GLOBAL_STATE_BUFFER_PTR)
827+ {
828+ kerArg = (&*arg);
829+ break ;
830+ }
831+ }
832+ if (!kerArg)
833+ return nullptr ;
834+ IGC_ASSERT (kerArg);
835+ return GetSymbol (kerArg);
836+ }
837+
803838CEncoder& CShader::GetEncoder ()
804839{
805840 return encoder;
@@ -2064,9 +2099,11 @@ void CShader::BeginFunction(llvm::Function* F)
20642099 bool useStackCall = m_FGA && m_FGA->useStackCall (F);
20652100 if (useStackCall)
20662101 {
2067- m_R0 = nullptr ;
20682102 globalSymbolMapping.clear ();
20692103 encoder.BeginStackFunction (F);
2104+ // create pre-defined r0
2105+ m_R0 = GetNewVariable (getGRFSize () / SIZE_DWORD, ISA_TYPE_D, EALIGN_GRF, false , 1 , " R0" );
2106+ encoder.GetVISAPredefinedVar (m_R0, PREDEFINED_R0);
20702107 }
20712108 else
20722109 {
0 commit comments