@@ -18661,31 +18661,28 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1866118661 if (FP_RM != ERoundingMode::ROUND_TO_ANY)
1866218662 SetRoundingMode_FP(FP_RM);
1866318663
18664- // BF_CVT vISA instruction doesn't support immediate source
18665- if (id == GenISAIntrinsic::GenISA_ftobf ||
18666- id == GenISAIntrinsic::GenISA_bftof) {
18667- if (src->IsImmediate()) {
18668- CVariable* tempMov = m_currShader->GetNewVariable(
18669- 1, src->GetType(), EALIGN_GRF, true, src->getName());
18670- m_encoder->Copy(tempMov, src);
18671- m_encoder->Push();
18672- src = tempMov;
18673- }
18664+ // vISA instruction doesn't support immediate source of type BF
18665+ if (id == GenISAIntrinsic::GenISA_bftof && src->IsImmediate())
18666+ {
18667+ uint32_t imm32 = ((uint32_t)src->GetImmediateValue()) & 0xFFFF;
18668+ imm32 = imm32 << 16; // make it as float immediate
18669+ CVariable* fSrc = m_currShader->ImmToVariable((uint64_t)imm32, ISA_TYPE_F);
18670+ m_encoder->Copy(dst, fSrc);
18671+ m_encoder->Push();
18672+ return;
1867418673 }
1867518674
1867618675 if (id == GenISAIntrinsic::GenISA_ftobf ||
1867718676 id == GenISAIntrinsic::GenISA_bftof)
1867818677 {
18679- /// Use UW as we are not exposing BF for now.
18680- /// vISA will convert it to BF.
1868118678 CVariable* tDst = nullptr, * tSrc = nullptr;
1868218679 if (id == GenISAIntrinsic::GenISA_ftobf) {
18683- tDst = m_currShader->GetNewAlias(dst, ISA_TYPE_UW , 0, 0);
18680+ tDst = m_currShader->GetNewAlias(dst, ISA_TYPE_BF , 0, 0);
1868418681 tSrc = src;
1868518682 }
1868618683 else if (id == GenISAIntrinsic::GenISA_bftof) {
1868718684 tDst = dst;
18688- tSrc = m_currShader->GetNewAlias(src, ISA_TYPE_UW , 0, 0);
18685+ tSrc = m_currShader->GetNewAlias(src, ISA_TYPE_BF , 0, 0);
1868918686 }
1869018687 else {
1869118688 IGC_ASSERT_EXIT_MESSAGE(0, "Something wrong in cvt!");
@@ -18710,7 +18707,7 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1871018707 uint32_t stride = (esize >= 8 ? 8 : esize);
1871118708 m_encoder->SetSrcRegion(0, stride, stride, 1);
1871218709 }
18713- m_encoder->bf_cvt (tDst, tSrc);
18710+ m_encoder->Cast (tDst, tSrc);
1871418711 m_encoder->Push();
1871518712 }
1871618713 }
@@ -18721,7 +18718,7 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1872118718 {
1872218719 m_encoder->SetDstSubReg(dstOff);
1872318720 m_encoder->SetSrcSubReg(0, srcOff);
18724- m_encoder->bf_cvt (tDst, tSrc);
18721+ m_encoder->Cast (tDst, tSrc);
1872518722 m_encoder->Push();
1872618723
1872718724 dstOff += (isDstUniform ? 1 : nsimdsize);
@@ -18734,7 +18731,7 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1873418731 CVariable* srcs[2];
1873518732 srcs[0] = src;
1873618733 srcs[1] = GetSymbol(GII->getOperand(1));
18737- CVariable* tDst = m_currShader->GetNewAlias(dst, ISA_TYPE_HF , 0, 0);
18734+ CVariable* tDst = m_currShader->GetNewAlias(dst, ISA_TYPE_BF , 0, 0);
1873818735 SmallVector<uint32_t, 16> insts;
1873918736 getAllExecsize(insts, nelts);
1874018737 for (int e = 0; e < 2; ++e)
@@ -18759,7 +18756,7 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1875918756 uint32_t stride = (esize >= 8 ? 8 : esize);
1876018757 m_encoder->SetSrcRegion(0, stride, stride, 1);
1876118758 }
18762- m_encoder->bf_cvt (tDst, tSrc);
18759+ m_encoder->Cast (tDst, tSrc);
1876318760 m_encoder->Push();
1876418761 }
1876518762 }
@@ -18771,7 +18768,7 @@ void EmitPass::emitfcvt(llvm::GenIntrinsicInst* GII)
1877118768 m_encoder->SetDstSubReg(2 * dstOff + e);
1877218769 m_encoder->SetDstRegion(2);
1877318770 m_encoder->SetSrcSubReg(0, srcOff);
18774- m_encoder->bf_cvt (tDst, tSrc);
18771+ m_encoder->Cast (tDst, tSrc);
1877518772 m_encoder->Push();
1877618773
1877718774 dstOff += (isDstUniform ? 1 : nsimdsize);
0 commit comments