On Wed, Jul 22, 2015 at 03:51:03PM +1000, Michael Ellerman wrote:
How about:
/*
* This function patches either an li or a cmpldi instruction with
* a new immediate value. This relies on the fact that both li
* (which is actually ori) and cmpldi both take a 16-bit immediate
* value, and it is situated in the same location in the instruction,
* ie. bits 0-15.
* To patch the value we read the existing instruction, clear the
* immediate value, and or in our new value, then write the instruction
* back.
*/
As Gabriel says, li is addi. It takes a 16-bit sign-extended immediate,
while cmpldi takes a 16-bit zero-extended immediate. This function
doesn't deal with that difference, it probably should (I didn't check if
the callers take care; there should be an assertion somewhere).
Segher