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

Đang mở Phù hợp với người mới
#434 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 4 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
84/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
cpp
Lĩnh vực
backend

Hướng nghiên cứu

Trong các dòng 110–115 của mmi_translator.cpp, ba trường hợp dịch halfword truyền giá trị sa thô cho SSE. Đọc các trường hợp đó và so sánh hành vi của chúng với bằng chứng EE được trích dẫn trong issue, bắt đầu từ ps2autotests/tests/cpu/ee_simd/logic.expected. Với các trường hợp này, hãy che lượng dịch để chỉ giữ bốn bit thấp nhất, sau đó xác minh các kernel tái hiện cho sa 16 và 31 khớp với hành vi của EE.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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.

Ngôn ngữ chính
C++
Star
3.3k
Fork
149
Merge trung bình
8 giờ 46 phút
Pull request đã merge (30 ngày)
1

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của ran-j/PS2Recomp

Tất cả issue của ran-j/PS2Recomp

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.