aboutsummaryrefslogtreecommitdiff
path: root/x86_64-w64-mingw32/include/ivec.h
blob: 7e09ca57eba3b9d31009c9d44c8c2471945610c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
 * 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