Skip to content

Commit df78e04

Browse files
mmereckiigcbot
authored andcommitted
Fix powi emitter
Fixes the following issues in the `powi` emitter: - convert immediate src1 integer input to immediate flaot to save one mov - add missing destination modifier (.sat)
1 parent f1a3baa commit df78e04

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

IGC/Compiler/CISACodeGen/EmitVISAPass.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,9 +2424,23 @@ void EmitPass::EmitMinMax(bool isMin, bool isUnsigned, const SSource sources[2],
24242424
void EmitPass::Powi(const SSource sources[2], const DstModifier& modifier)
24252425
{
24262426
CVariable* src0 = GetSrcVariable(sources[0]);
2427-
CVariable* src1 = m_currShader->GetNewVariable(src0);
2428-
m_encoder->Cast(src1, GetSrcVariable(sources[1]));
2429-
EmitSimpleAlu(EOPCODE::llvm_pow, m_destination, src0, src1);
2427+
CVariable* src1Int = GetSrcVariable(sources[1]);
2428+
CVariable* src1Float = nullptr;
2429+
if (src1Int->IsImmediate())
2430+
{
2431+
int32_t immSrc1Int = int_cast<int32_t>(src1Int->GetImmediateValue());
2432+
float immSrc1Float = (float)(immSrc1Int);
2433+
uint32_t immSrc1 = 0;
2434+
std::memcpy(&immSrc1, &immSrc1Float, sizeof(immSrc1));
2435+
src1Float = m_currShader->ImmToVariable(immSrc1, ISA_TYPE_F);
2436+
}
2437+
else
2438+
{
2439+
src1Float = m_currShader->GetNewVariable(src0);
2440+
m_encoder->Cast(src1Float, src1Int);
2441+
}
2442+
m_encoder->SetDstModifier(modifier);
2443+
EmitSimpleAlu(EOPCODE::llvm_pow, m_destination, src0, src1Float);
24302444
}
24312445

24322446
void IGC::EmitPass::EmitUAdd(llvm::BinaryOperator* inst, const DstModifier& modifier)

0 commit comments

Comments
 (0)