sth is the 16-bit store
Writing a halfword goes through sth (store halfword), which lays down the low 16 bits of a register and nothing above them:
sth r4, 6(r3) # table[3] = val
blr
The example above writes index 3 of a u16 array, which lands six bytes in, with the pointer in r3 and the value in r4.
Every store has a twin among the loads at the same width, so alongside sth you get stb down at the byte level and stw up at the full word. Sign never enters into it, since a store only truncates its operand to the right width and copies it across. When you do need a signed value back, that work falls to the load later on, never the store.
Your task
Write store_u16, taking a u16* and a u16, to produce a single sth.