Las instrucciones SW y LW se definen como:
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 realiza la operación MEM [$ s + offset] = $ t, pero en la ruta de datos parece que ha realizado la operación MEM [Data ($ s) + offset] = $ t, porque en lugar de tomar el valor $ s como entrada en la ALU que tomó en los datos almacenados en $ s.
LW realiza la operación $ t = MEM [$ s + offset], pero al observar la ruta de datos parece que está ejecutando $ t = MEM [Datos ($ s) + offset].
Otra cosa que no entiendo es por qué usamos la extensión de signo en lugar de simplemente mover el signo al bit 32 y rellenar el resto de los datos con ceros. Si ha definido un desplazamiento es
0x8fff: 1000 1111 1111 1111
será un signo extendido a 0xffff8fff: 1111 1111 1111 1111 1000 1111 1111 1111, que es un número completamente diferente del desplazamiento, el número que realmente necesitamos es 0x80008ffff.