2011-12-16 29 views
17

Tôi muốn thêm bốn thành phần của thanh ghi SSE để lấy một phao đơn. Đây là cách tôi làm ngay bây giờ:thêm các thành phần của thanh ghi SSE

float a[4]; 
_mm_storeu_ps(a, foo128); 
float x = a[0] + a[1] + a[2] + a[3]; 

Có hướng dẫn SSE nào trực tiếp đạt được điều này không?

+0

Tôi nghi ngờ nó tồn tại, nhưng nếu có, lệnh sẽ có khả năng đặt kết quả trong vùng 32 bit của thanh ghi đầu ra 128 bit, không phải trong bản đăng ký 32 bit. –

Trả lời

10

Bạn có thể có thể sử dụng các hướng dẫn SSE3 HADDPS, hoặc biên dịch nó nội tại _mm_hadd_ps,

Ví dụ, xem http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

Nếu bạn có hai thanh ghi v1 và v2:

v = _mm_hadd_ps(v1, v2); 
v = _mm_hadd_ps(v, v); 

Bây giờ, v [0] chứa tổng các thành phần của v1 và v [1] chứa tổng các thành phần của v2.

3

Vâng, tôi không biết về bất kỳ chức năng như vậy, nhưng nó có thể được thực hiện bằng cách sử dụng _mm_hadd_ps() hai lần.

4

Nếu bạn muốn mã của bạn hoạt động trên các CPU trước SSE3 (không hỗ trợ _mm_hadd_ps), bạn có thể sử dụng mã sau đây. Nó sử dụng nhiều hướng dẫn hơn, nhưng giải mã ít vi lệnh hơn trên hầu hết các CPU.

__m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128); 
float x; 
_mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));