Jaki jest najlepszy/najszybszy sposób załadowania 64-bitowej wartości całkowitej w rejestrze SSE2 xmm
w trybie 32-bitowym?Najlepszy sposób na załadowanie 64-bitowej liczby całkowitej do rejestru podwójnej precyzji SSE2?
W trybie 64-bitowym można używać cvtsi2sd
, ale w trybie 32-bitowym obsługuje tylko 32-bitowe liczby całkowite.
tej pory nie znalazłem znacznie poza:
- użytku
fild
,fstp
stos następniemovsd
doxmm
rejestr - obciążenie część wysoki 32-bitowy, należy pomnożyć przez 2^32, dodaj niski 32-bitowy
pierwsze rozwiązanie jest powolny, drugie rozwiązanie może wprowadzić utraty precyzji (edit: i jest powolny i tak, ponieważ niska 3 2-bitowe muszą zostać przekonwertowane jako unsigned ...)
Lepsze podejście?
Pomnożenie 32 górnych bitów przez 2 ** 32 w zmiennoprzecinkowej nie spowoduje ich obcięcia/zaokrąglenia. Dopiero gdy dodasz do nich 32 bity, suma zostanie zaokrąglona/obcięta i tak właśnie otrzymasz pierwszą metodę. O ile czegoś mi nie brakuje, te dwie metody są równoważne (z wyjątkiem wydajności). –
FWIW gcc wydaje się korzystać z pierwszego podejścia (fild, fst, movsd). –
Druga opcja jest rzeczywiście powolna, przez pomyłkę użyłem cvtsi2sd dla niskiego 32-bitowego, ale to było niepoprawne, musi zostać przekonwertowane jako unsigned, dla którego nie ma instrukcji CPU, więc jest wolne ... –