1 // PR target/80799 2 // { dg-do compile { target i?86-*-* x86_64-*-* } } 3 // { dg-require-effective-target c++11 } 4 // { dg-options "-O2 -msse2" } 5 6 #include <xmmintrin.h> 7 #include <emmintrin.h> 8 9 class alignas(16) GSVector4i 10 { 11 public: 12 __m128i m; 13 GSVector4i(__m128i m)14 explicit GSVector4i(__m128i m) 15 { 16 this->m = m; 17 } 18 storel(void * p,const GSVector4i & v)19 static void storel(void* p, const GSVector4i& v) 20 { 21 _mm_storel_epi64((__m128i*)p, v.m); 22 } 23 loadl(const void * p)24 static GSVector4i loadl(const void* p) 25 { 26 return GSVector4i(_mm_loadl_epi64((__m128i*)p)); 27 } 28 eq(const GSVector4i & v)29 bool eq(const GSVector4i& v) const 30 { 31 return _mm_movemask_epi8(_mm_cmpeq_epi32(m, v.m)) == 0xffff; 32 } 33 }; 34 35 36 union GIFRegTRXPOS 37 { 38 unsigned long long u64; 39 void operator = (const GSVector4i& v) {GSVector4i::storel(this, v);} 40 bool operator != (const union GIFRegTRXPOS& r) const {return !((GSVector4i)r).eq(*this);} GSVector4i()41 operator GSVector4i() const {return GSVector4i::loadl(this);} 42 }; 43 44 extern void dummy_call(); 45 extern GIFRegTRXPOS TRXPOS; 46 GIFRegHandlerTRXPOS(const GIFRegTRXPOS & p)47void GIFRegHandlerTRXPOS(const GIFRegTRXPOS& p) 48 { 49 if(p != TRXPOS) 50 { 51 dummy_call(); 52 } 53 54 TRXPOS = (GSVector4i)p; 55 } 56 57 // { dg-final { scan-assembler-not "%mm" } } 58