love5an: (Default)
Dmitry Ignatiev ([personal profile] love5an) wrote2010-12-10 10:59 pm

SBCL, x86, SSE

Я тут подумал - неплохо бы приделать к 32битному SBCL SSE.

Но, тут все не так просто.
Первая проблема - SSE на x86, в отличие от x86-64 - фича совсем не обязательно присутствующая.
Поэтому, придется определять доступность SSE в рантайме.
Вот так, например:
(eval-when (:compile-toplevel :execute)

(sb-c:defknown %simd-info () (unsigned-byte 32))

(sb-c:define-vop (%simd-info-vop)
  (:translate %simd-info)
  (:results (info :scs (sb-vm::unsigned-reg)))
  (:result-types sb-vm::unsigned-byte-32)
  (:policy :fast-safe)
  (:generator
    0
    (sb-c::inst sb-vm::mov sb-vm::eax-tn 1)
    (sb-c::inst sb-vm::cpuid)
    (sb-c::inst sb-vm::and sb-vm::ecx-tn #x10180201)
    (sb-c::inst sb-vm::and sb-vm::edx-tn #x06800000)
    (sb-c::inst sb-vm::or  sb-vm::edx-tn sb-vm::ecx-tn)
    (sb-c::inst sb-vm::mov info          sb-vm::edx-tn)))

) ;;eval-when

(defun simd-info ()
  "(values MMX SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX)"
  (let ((info (%simd-info)))
    (values (logbitp 23 info)
            (logbitp 25 info)
            (logbitp 26 info)
            (logbitp 0  info)
            (logbitp 9  info)
            (logbitp 19 info)
            (logbitp 20 info)
            (logbitp 28 info))))


Вторая проблема - непонятно, в какой именно момент определять доступность SSE.

При компиляции? А как тогда быть с переносимостью кода, в частности с переносимостью самого рантайма SBCL и его стандартной библиотеки?

При непосредственном использовании? Медленно.

Может быть, в момент запуска рантайма?

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting