The SW and LW instructions are defined as:
sw $t, offset($s) : 1010 11ss ssst tttt iiii iiii iiii iiii lw $t, offset($s) : 1000 11ss ssst tttt iiii iiii iiii iiii
SW performs the operation MEM[$s + offset] = $t, but in the data-path it looks like they have performed the operation MEM[Data($s)+ offset] = $t , because instead of taking the value $s as an input into the ALU it took in the data stored in $s.
LW performs the operation $t = MEM[$s + offset], but looking at the datapath it looks like it is performing $t = MEM[Data($s) + offset].
Another thing I don't understand is why we use sign extend instead of just moving the sign to the 32nd bit and filling the rest of the data with zeros.If you have defined an offset is
0x8fff : 1000 1111 1111 1111
it will be sign extended to 0xffff8fff : 1111 1111 1111 1111 1000 1111 1111 1111 , which is a completely different number from the offset, the number we really need is 0x80008ffff.