2012-06-22 21 views
4

事情是這樣的最大成員:如何找到一個__m128(F32vec4)

_declspec(align(16)) float dens[4]; 

//Here the code comes. F32vec4 S_START, Pos, _Vector 

*((__m128*)dens) = (S_START - Pos) *_Vector; 

float steps = max(max(dens[3], dens[2]), max(dens[1], dens[0])); 

我怎麼這樣直接使用SSE?

回答

9

有沒有簡單的方法來做到這一點。 SSE並不特別適用於水平操作。所以,你必須洗牌......

這裏有一個辦法:

__m128 a = _mm_set_ps(10,9,7,8); 

__m128 b = _mm_shuffle_ps(a,a,78); // {a,b,c,d} -> {c,d,a,b} 
a = _mm_max_ps(a,b); 

b = _mm_shuffle_ps(a,a,177);  // {a,b,c,d} -> {b,a,d,c} 
a = _mm_max_ss(a,b); 

float out; 
_mm_store_ss(&out,a); 

我注意到,最後店是不是真的應該是一個商店。這只是一個駭客來獲取值到float數據類型。

實際上不需要指令,因爲float類型將被存儲在相同的SSE寄存器中。 (只是前3個值被忽略。)