Sven Schüle wrote:Could you show one exact example of how you use that operator& in your code?
My suspicion is that your problem may be related to the way how you have defined your operator(s).
Sven
Ok, I've now looked at all the suggestions, and tried this every which way, and still no dice. I've created a new project from scratch with only the essential code and a small test, and looked at the compiler options repeatedly. I just can't believe that this doesn't work.
Here's the code for the classes:
Code: Select all
#include <emmintrin.h>
typedef unsigned char byte;
union xmm
{
byte AsBytes[16];
__m128i As128i;
};
class xmm128i
{
private:
__m128i m_data;
public:
__forceinline xmm128i() { }
__forceinline xmm128i( __m128i *source )
{ m_data = _mm_load_si128( source ); }
__forceinline xmm128i( __m128i source ): m_data(source) { }
__forceinline xmm128i( xmm const &source )
{ _mm_load_si128( &source.As128i ); }
__forceinline ~xmm128i() { }
__forceinline operator __m128i()
{ return m_data; }
// logical operations
__forceinline friend xmm128i operator &( xmm128i const &left, xmm128i const &right )
{ return xmm128i( _mm_and_si128( left.m_data, right.m_data ) ); }
};
Here's the code for a simple test function:
Code: Select all
xmm128i TEST()
{
xmm data1;
xmm data2;
// initialize our data objects with random data ...
data1.AsBytes[0] = 4; data1.AsBytes[1] = 4; data1.AsBytes[2] = 4; data1.AsBytes[3] = 4;
data1.AsBytes[4] = 4; data1.AsBytes[5] = 4; data1.AsBytes[6] = 4; data1.AsBytes[7] = 4;
data1.AsBytes[8] = 4; data1.AsBytes[9] = 4; data1.AsBytes[10] = 4; data1.AsBytes[11] = 4;
data1.AsBytes[12] = 4; data1.AsBytes[13] = 4; data1.AsBytes[14] = 4; data1.AsBytes[15] = 4;
data2.AsBytes[0] = 0; data2.AsBytes[1] = 4; data2.AsBytes[2] = 0; data2.AsBytes[3] = 4;
data2.AsBytes[4] = 0; data2.AsBytes[5] = 4; data2.AsBytes[6] = 0; data2.AsBytes[7] = 4;
data2.AsBytes[8] = 7; data2.AsBytes[9] = 0; data2.AsBytes[10] = 7; data2.AsBytes[11] = 0;
data2.AsBytes[12] = 7; data2.AsBytes[13] = 0; data2.AsBytes[14] = 7; data2.AsBytes[15] = 0;
xmm128i A( data1 );
xmm128i B( data2 );
// use our operater & ...
xmm128i A_and_B = A & B;
return A_and_B;
}
And here's the assembly output for TEST function:
Code: Select all
?TEST@@YA?AVxmm128i@@XZ PROC ; TEST, COMDAT
; ___$ReturnUdt$ = esi
; 4 : {
push ebp
mov ebp, esp
and esp, -16 ; fffffff0H
sub esp, 32 ; 00000020H
mov eax, DWORD PTR ___security_cookie
xor eax, esp
mov DWORD PTR __$ArrayPad$[esp+32], eax
; 5 : xmm data1;
; 6 : xmm data2;
; 7 :
; 8 : // initialize our data objects with random data ...
; 9 : data1.AsBytes[0] = 4; data1.AsBytes[1] = 4; data1.AsBytes[2] = 4; data1.AsBytes[3] = 4;
; 10 : data1.AsBytes[4] = 4; data1.AsBytes[5] = 4; data1.AsBytes[6] = 4; data1.AsBytes[7] = 4;
; 11 : data1.AsBytes[8] = 4; data1.AsBytes[9] = 4; data1.AsBytes[10] = 4; data1.AsBytes[11] = 4;
; 12 : data1.AsBytes[12] = 4; data1.AsBytes[13] = 4; data1.AsBytes[14] = 4; data1.AsBytes[15] = 4;
; 13 :
; 14 : data2.AsBytes[0] = 0; data2.AsBytes[1] = 4; data2.AsBytes[2] = 0; data2.AsBytes[3] = 4;
; 15 : data2.AsBytes[4] = 0; data2.AsBytes[5] = 4; data2.AsBytes[6] = 0; data2.AsBytes[7] = 4;
; 16 : data2.AsBytes[8] = 7; data2.AsBytes[9] = 0; data2.AsBytes[10] = 7; data2.AsBytes[11] = 0;
; 17 : data2.AsBytes[12] = 7; data2.AsBytes[13] = 0; data2.AsBytes[14] = 7; data2.AsBytes[15] = 0;
; 18 :
; 19 : xmm128i A( data1 );
; 20 : xmm128i B( data2 );
; 21 :
; 22 : // use our operater & ...
; 23 : xmm128i A_and_B = A & B;
push esi
lea edx, DWORD PTR _B$[esp+36]
lea ecx, DWORD PTR _A$[esp+36]
call ??I@YA?AVxmm128i@@ABV0@0@Z ; operator&
; 24 :
; 25 : return A_and_B;
; 26 : }
mov ecx, DWORD PTR __$ArrayPad$[esp+36]
add esp, 4
xor ecx, esp
mov eax, esi
call @__security_check_cookie@4
mov esp, ebp
pop ebp
ret 0
?TEST@@YA?AVxmm128i@@XZ ENDP ; TEST
END
If anyone wants to PM me their email address, I'll be happy to send visual studio project...