/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _IVEC_H_INCLUDED
#define _IVEC_H_INCLUDED
#ifndef RC_INVOKED

#if !defined __cplusplus
#error This file is only supported in C++ compilations!
#endif

#include <intrin.h>
#include <assert.h>
#include <dvec.h>
#include <crtdefs.h>

#pragma pack(push,_CRT_PACKING)

#if defined(_ENABLE_VEC_DEBUG)
#include <iostream>
#endif

#pragma pack(pop)

#ifdef __SSE__

#define _MM_QW (*((__int64*)&vec))

#pragma pack(push,16)

class M64
{
protected:
    __m64 vec;
public:
    M64() {}
    M64(__m64 mm) { vec = mm; }
    M64(__int64 mm) { _MM_QW = mm; }
    M64(int i) { vec = _m_from_int(i); }

    operator __m64() const { return vec; }

    M64& operator&=(const M64 &a) { return *this = (M64) _m_pand(vec,a); }
    M64& operator|=(const M64 &a) { return *this = (M64) _m_por(vec,a); }
    M64& operator^=(const M64 &a) { return *this = (M64) _m_pxor(vec,a); }
};

#pragma pack(pop)

#endif /* ifdef __SSE__ */

#endif
#endif