Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct int64 {
- int64(): val(_mm_setzero_si64()) {}
- int64(__m64 v): val(v) {}
- int64(int v): val(_mm_cvtsi32_si64(v)) {}
- operator __m64() { return val; }
- operator int() { return _mm_cvtsi64_si32(val); }
- friend int64 operator +(int64 a, int64 b) {
- return _mm_add_si64(a, b);
- }
- int64& operator +=(int64 rhs) {
- return *this = *this + rhs;
- }
- friend int64 operator -(int64 a, int64 b) {
- return _mm_sub_si64(a, b);
- }
- int64& operator -=(int64 rhs) {
- return *this = *this - rhs;
- }
- friend bool operator ==(int64 a, int64 b) {
- return _mm_movemask_pi8(_mm_cmpeq_pi32(a, b)) == ~0;
- }
- friend bool operator !=(int64 a, int64 b) {
- return !(a == b);
- }
- friend bool operator >(int64 a, int64 b) {
- if (a.hi > b.hi) {
- return true;
- } else {
- if (a.hi == b.hi) {
- return a.lo > b.lo;
- }
- }
- return false;
- }
- friend int64 operator *(int64 a, int64 b) {
- int64 res = int64::mul32(a, b);
- int t = a.hi * b.lo + a.lo * b.hi;
- return res + _mm_set_pi32(t, 0);
- }
- int64& operator *=(int64 rhs) {
- return *this = *this * rhs;
- }
- static int64 mul32(int a, int b) {
- return _mm_mul_su32(int64(a), int64(b));
- }
- union {
- struct {
- int hi, lo;
- };
- __m64 val;
- };
- };
- int main() {
- using namespace std;
- int64 a = 23456234, b = 623462345;
- int64 c = int64::mul32(a, b);
- cout << (_mm_empty(), c.val.m64_i64) << endl;
- cout << (c==c);
- cout << (_mm_empty(), c.val.m64_i64);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement