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 — 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: alongside sth there's stb down at the byte level and stw up at the full word. Sign never enters into it — a store only truncates its operand to the right width and copies it across. When you need a signed value back, that work falls to the load later on, never the store.
Your task
Write func_801c1a8c to produce a single sth.