@@ -8930,6 +8930,13 @@ void EmitPass::emitPtrToInt(llvm::PtrToIntInst* P2I)
89308930
89318931void EmitPass::emitAddrSpaceToGenericCast(llvm::AddrSpaceCastInst* addrSpaceCast, CVariable* srcV, unsigned tag)
89328932{
8933+ CVariable* pFlag = m_currShader->GetNewVariable(
8934+ numLanes(m_currShader->m_SIMDSize),
8935+ ISA_TYPE_BOOL, EALIGN_BYTE,
8936+ CName(srcV->getName(), "NotNull"));
8937+ m_encoder->Cmp(EPREDICATE_NE, pFlag, srcV, m_currShader->ImmToVariable(0, ISA_TYPE_UD));
8938+ m_encoder->Push();
8939+
89338940 if (m_pCtx->m_hasEmu64BitInsts && m_currShader->m_Platform->hasNoFullI64Support())
89348941 {
89358942 if (m_currShader->GetContext()->getRegisterPointerSizeInBits(addrSpaceCast->getSrcAddressSpace()) == 32)
@@ -8943,7 +8950,7 @@ void EmitPass::emitAddrSpaceToGenericCast(llvm::AddrSpaceCastInst* addrSpaceCast
89438950 // High:
89448951 m_encoder->SetDstSubReg(1);
89458952 m_encoder->SetDstRegion(2);
8946- m_encoder->Copy( dstAlias, m_currShader->ImmToVariable(tag << 29, ISA_TYPE_UD));
8953+ m_encoder->Select(pFlag, dstAlias, m_currShader->ImmToVariable(tag << 29, ISA_TYPE_UD), m_currShader->ImmToVariable(0 , ISA_TYPE_UD));
89478954 m_encoder->Push();
89488955 }
89498956 else
@@ -8972,6 +8979,7 @@ void EmitPass::emitAddrSpaceToGenericCast(llvm::AddrSpaceCastInst* addrSpaceCast
89728979 m_encoder->Push();
89738980
89748981 // Add tag to high part
8982+ m_encoder->SetPredicate(pFlag);
89758983 m_encoder->Or(srcHigh, srcHigh, m_currShader->ImmToVariable(tag << 29, ISA_TYPE_UD));
89768984 m_encoder->Push();
89778985
@@ -8990,12 +8998,11 @@ void EmitPass::emitAddrSpaceToGenericCast(llvm::AddrSpaceCastInst* addrSpaceCast
89908998 }
89918999 else
89929000 {
8993- CVariable* pTempVar = m_currShader->GetNewVariable(
8994- numLanes(m_currShader->m_SIMDSize),
8995- ISA_TYPE_UQ, m_currShader->getGRFAlignment(),
8996- m_destination->IsUniform(), CName::NONE);
8997- m_encoder->Or(pTempVar, srcV, m_currShader->ImmToVariable(static_cast<uint64_t>(tag) << 61, ISA_TYPE_UQ));
8998- m_encoder->Cast(m_destination, pTempVar);
9001+ m_encoder->Cast(m_destination, srcV);
9002+ m_encoder->Push();
9003+
9004+ m_encoder->SetPredicate(pFlag);
9005+ m_encoder->Or(m_destination, srcV, m_currShader->ImmToVariable(static_cast<uint64_t>(tag) << 61, ISA_TYPE_UQ));
89999006 m_encoder->Push();
90009007 }
90019008}
0 commit comments