home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 7662 / gttool_src_bin.7z / gttool / src / util.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2014-02-06  |  2.3 KB  |  89 lines

  1. #include "util.h"
  2.  
  3. uint128_t mul64(const uint64_t a, const uint64_t b)
  4. {
  5.     const uint64_t ah = hi32(a), bh = hi32(b);
  6.     const uint64_t al = lo32(a), bl = lo32(b);
  7.     const uint64_t ahbl = ah * bl;
  8.     const uint64_t albh = al * bh;
  9.     const uint64_t albl = al * bl;
  10.     const uint64_t ahbh = ah * bh;
  11.     const uint64_t mid = hi32(albl) + lo32(ahbl) + lo32(albh);
  12.     
  13.     uint128_t result;
  14.     result.hi = ahbh + hi32(ahbl) + hi32(albh) + hi32(mid);
  15.     result.lo = lo32(albl) + (mid << 32);
  16.  
  17.     return result;
  18. }
  19.  
  20. uint32_t bitmask32(const int begin, const int end)
  21. {
  22.     const uint32_t ones = uint32_t(-1);
  23.     const uint32_t mask_begin = ones >> begin;
  24.     const uint32_t mask_end = ones << (31 - end);
  25.     const uint32_t mask = begin <= end ? (mask_begin & mask_end) : (mask_begin | mask_end);
  26.     return mask;
  27. }
  28.  
  29. uint64_t bitmask64(const int begin, const int end)
  30. {
  31.     const uint64_t ones = uint64_t(-1);
  32.     const uint64_t mask_begin = ones >> begin;
  33.     const uint64_t mask_end = ones << (63 - end);
  34.     const uint64_t mask = begin <= end ? (mask_begin & mask_end) : (mask_begin | mask_end);
  35.     return mask;
  36. }
  37.  
  38. uint32_t rotl(const uint32_t x, int n)
  39. {
  40.     const uint32_t result = (x << n) | (x >> (32 - n));
  41.     return result;
  42. }
  43.  
  44. uint32_t rotr(const uint32_t x, int n)
  45. {
  46.     const uint32_t result = (x >> n) | (x << (32 - n));
  47.     return result;
  48. }
  49.  
  50. uint32_t rlwinm_bitmask(const uint32_t rs, const uint32_t sh, const uint32_t bm)
  51. {
  52.     const uint32_t ra = rotl(rs, sh) & bm;
  53.     return ra;
  54. }
  55.  
  56. uint32_t rlwinm(const uint32_t rs, const uint32_t sh, const int mb, const int me)
  57. {
  58.     const uint32_t mask = bitmask32(mb, me);
  59.     const uint32_t ra = rlwinm_bitmask(rs, sh, mask);
  60.     return ra;
  61. }
  62.  
  63. uint32_t rlwimi(const uint32_t ra, const uint32_t rs, const uint32_t sh, const int mb, const int me)
  64. {
  65.     const uint32_t mask = bitmask32(mb, me);
  66.     const uint32_t nra = (ra & ~mask) | rotl(rs, sh) & mask;
  67.     return nra;
  68. }
  69.  
  70. uint32_t clrlslwi(const uint32_t rs, const int b, const int n)
  71. {
  72.     assert(n <= b && b <= 31);
  73.     const uint32_t ra = rlwinm(rs, n, b - n, 31 - n);
  74.     return ra;
  75. }
  76.  
  77. uint32_t slw(const uint32_t ra, const uint32_t rs, const int rb)
  78. {
  79.     const int n  = rb & 0x1F;
  80.     const uint64_t mask = (rb & 32) == 0 ? bitmask64(32, 63 - n) : 0;
  81.     const uint32_t nra = rotl(rs, n) & mask;
  82.     return nra;
  83. }
  84.  
  85. int32_t srawi(const int32_t rs, const int b)
  86. {
  87.     const int32_t ra = int32_t(rs) >> b;
  88.     return ra;
  89. }