Where does 0.5f come from?
There's no "load immediate float" instruction, so a literal like 0.5f can't be encoded inline. MWCC parks it as an anonymous pooled constant in small data and loads it with lfs, just like a named global — except the symbol is a compiler-generated label such as @5 rather than a name you wrote:
lfs f0, @5@sda21(r2) # load the pooled constant 0.5f
fmuls f1, f0, f1 # x * 0.5f
blr
R_PPC_EMB_SDA21 @5
That @5 relocation against an R_PPC_EMB_SDA21 entry is a literal pool load. Identical machinery to a global float read — the only tell that it's a literal and not a named global is the synthetic @N symbol. When you see an lfs of an @N symbol feeding straight into an arithmetic op, the original C had a float constant in the expression.
Your task
Write scaleHalf, taking an f32 x, to reproduce the lfs/fmuls sequence above. Pay close attention to literal suffixes — writing a plain double literal instead of an f32 one causes MWCC to promote x to double precision, multiply, then convert back, producing lfd/fmul/frsp instead of lfs/fmuls. Forgetting the suffix is one of the most common real-world causes of a float mismatch.