When the high bits must be filled with the sign
Reading a signed narrow value into a 32-bit register can't just zero the top bits — a negative s8 like -1 (0xFF) must become 0xFFFFFFFF. PowerPC has a dedicated lha (load halfword algebraic) that sign-extends a halfword as it loads:
lha r3, 0(r3) # halfword, sign-extended into r3
blr
Bytes are the odd one out: there is no "load byte algebraic". A signed byte that needs widening loads with lbz and is then fixed up with a separate extsb (extend sign byte). You'll see that pair when an s8 is widened to an int:
lbz r3, 0(r3)
extsb r3, r3 # sign-extend the byte to 32 bits
blr
Your task
Write load_s16, taking an s16* and returning the pointed-to value widened to int. Because the result is used as a 32-bit int, the load must sign-extend.