PSLLH/PSRLH/PSRAH: shift amounts 16-31 should use sa[3:0] (SSE gives 0 / sign fill)

Abierto Apto para principiantes
#434 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 4 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
84/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp
Área
backend

Línea de trabajo

En las líneas 110–115 de mmi_translator.cpp, los tres casos de desplazamiento de halfword pasan el valor sin procesar de sa a SSE. Lee esos casos y compara su comportamiento con las pruebas de EE citadas en el issue, empezando por ps2autotests/tests/cpu/ee_simd/logic.expected. Enmascara la cantidad de desplazamiento con sus cuatro bits inferiores en esos casos y luego verifica que los kernels de reproducción para sa 16 y 31 coincidan con el comportamiento de EE.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Hi! The halfword shift-immediate MMI ops pass the full 5-bit sa field to SSE. On the EE only the low 4 bits count for halfwords, so with sa 16-31 the results differ.

Where: mmi_translator.cpp lines 110-115 (at e5636981) emit _mm_slli_epi16 / _mm_srli_epi16 / _mm_srai_epi16 with the raw sa. SSE returns 0 (or a sign fill for srai) for any count above 15.

What the EE does:

op sa EE PS2Recomp
psllh / psrlh 16 value unchanged (shift by 0) 0 in every lane
psrah 16 value unchanged sign fill
psllh / psrlh 31 shift by 15 0 in every lane
psrah 31 shift by 15 sign fill (same result, by coincidence)

Evidence for the EE rule:

  1. Real PS2 output in ps2autotests tests/cpu/ee_simd/logic.expected: psllh -1, 16 comes back unchanged and psllh -1, 31 gives 8000 in every halfword. All 144 shift-immediate lines there fit sa[3:0] for the halfword forms.
  2. PCSX2 MMI.cpp _PSLLH: << (_Sa_ & 0xf).
  3. DobieStation emotion_mmi.cpp: shift = (instruction >> 6) & 0xF.

Repro: a one-instruction kernel (lq, psllh t0, a3, 16, sq) built with ps2dev EE gcc, run through PS2Recomp e5636981: every lane comes back 0, where the EE leaves the value unchanged. With sa 15 everything matches. Masking the count to sa & 15 in the three halfword cases fixes all of our sa 16/31 kernels (the word forms PSLLW/PSRLW/PSRAW are fine as they are; there all 5 bits count).

To be fair about impact: a C compiler shouldn't emit a halfword shift of 16 or more, so this most likely only matters for hand-written asm with an unusual count. Happy to open a small PR with the & 15 if that's useful.

AI tools helped with the testing and this write-up. I've reviewed it.

Lenguaje dominante
C++
Estrellas
3.3k
Forks
149
Merge medio
8 h 46 min
PR fusionados (30 d)
1

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de ran-j/PS2Recomp

Todos los issues de ran-j/PS2Recomp

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.