Advertisement
zhangsongcui

int64 with MMX

Aug 13th, 2012
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. struct int64 {
  2.     int64(): val(_mm_setzero_si64()) {}
  3.     int64(__m64 v): val(v) {}
  4.     int64(int v): val(_mm_cvtsi32_si64(v)) {}
  5.  
  6.     operator __m64() { return val; }
  7.     operator int() { return _mm_cvtsi64_si32(val); }
  8.  
  9.     friend int64 operator +(int64 a, int64 b) {
  10.         return _mm_add_si64(a, b);
  11.     }
  12.     int64& operator +=(int64 rhs) {
  13.         return *this = *this + rhs;
  14.     }
  15.    
  16.     friend int64 operator -(int64 a, int64 b) {
  17.         return _mm_sub_si64(a, b);
  18.     }
  19.     int64& operator -=(int64 rhs) {
  20.         return *this = *this - rhs;
  21.     }
  22.  
  23.     friend bool operator ==(int64 a, int64 b) {
  24.         return _mm_movemask_pi8(_mm_cmpeq_pi32(a, b)) == ~0;
  25.     }
  26.  
  27.     friend bool operator !=(int64 a, int64 b) {
  28.         return !(a == b);
  29.     }
  30.  
  31.     friend bool operator >(int64 a, int64 b) {
  32.         if (a.hi > b.hi) {
  33.             return true;
  34.         } else {
  35.             if (a.hi == b.hi) {
  36.                 return a.lo > b.lo;
  37.             }
  38.         }
  39.         return false;
  40.     }
  41.  
  42.     friend int64 operator *(int64 a, int64 b) {
  43.         int64 res = int64::mul32(a, b);
  44.         int t = a.hi * b.lo + a.lo * b.hi;
  45.         return res + _mm_set_pi32(t, 0);
  46.     }
  47.     int64& operator *=(int64 rhs) {
  48.         return *this = *this * rhs;
  49.     }
  50.    
  51.     static int64 mul32(int a, int b) {
  52.         return _mm_mul_su32(int64(a), int64(b));
  53.     }
  54.  
  55.     union {
  56.         struct {
  57.             int hi, lo;
  58.         };
  59.         __m64 val;
  60.     };
  61. };
  62.  
  63. int main() {
  64.     using namespace std;
  65.     int64 a = 23456234, b = 623462345;
  66.     int64 c = int64::mul32(a, b);
  67.     cout << (_mm_empty(), c.val.m64_i64) << endl;
  68.     cout << (c==c);
  69.     cout << (_mm_empty(), c.val.m64_i64);
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement