The assembler tries to reuse the destination register for memory operations whenever
it can but it's not possible to do so if the destination register is not a GPR.
Example:
ldc1 $f0, sym
should expand to:
lui $at, %hi(sym) ldc1 $f0, %lo(sym)($at)
It's entirely wrong to expand to:
lui $f0, %hi(sym) ldc1 $f0, %lo(sym)($f0)
Does %hi/%lo take an immediate?
If not, then '((offset >> 16) & 0xffff)' or 'offset_hi16' might be better