Subversion Repositories FuelGauge

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "ref.h"
  2.  
  3. q31_t ref__QADD8(q31_t x, q31_t y)
  4. {
  5.    q31_t sum;
  6.    q7_t r, s, t, u;
  7.  
  8.    r = (q7_t) x;
  9.    s = (q7_t) y;
  10.  
  11.    r = ref_sat_n((q31_t) (r + s), 8);
  12.    s = ref_sat_n(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8);
  13.    t = ref_sat_n(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8);
  14.    u = ref_sat_n(((q31_t) ((x >> 24) + (y >> 24))), 8);
  15.  
  16.    sum =
  17.       (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) |
  18.       (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF);
  19.  
  20.    return sum;
  21.  
  22. }
  23.  
  24. q31_t ref__QSUB8(q31_t x, q31_t y)
  25. {
  26.    q31_t sum;
  27.    q31_t r, s, t, u;
  28.  
  29.    r = (q7_t) x;
  30.    s = (q7_t) y;
  31.  
  32.    r = ref_sat_n((r - s), 8);
  33.    s = ref_sat_n(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8;
  34.    t = ref_sat_n(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16;
  35.    u = ref_sat_n(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24;
  36.  
  37.    sum = (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF);
  38.  
  39.    return sum;
  40. }
  41.  
  42. q31_t ref__QADD16(q31_t x, q31_t y)
  43. {
  44.    q31_t sum;
  45.    q31_t r, s;
  46.  
  47.    r = (q15_t) x;
  48.    s = (q15_t) y;
  49.  
  50.    r = ref_sat_q15(r + s);
  51.    s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) + (y >> 16)))) << 16;
  52.  
  53.    sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  54.  
  55.    return sum;
  56.  
  57. }
  58.  
  59. q31_t ref__SHADD16(q31_t x, q31_t y)
  60. {
  61.    q31_t sum;
  62.    q31_t r, s;
  63.  
  64.    r = (q15_t) x;
  65.    s = (q15_t) y;
  66.  
  67.    r = (r + s) >> 1;
  68.    s = ((q31_t) (((x >> 16) + (y >> 16)) >> 1) << 16);
  69.  
  70.    sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  71.  
  72.    return sum;
  73.  
  74. }
  75.  
  76. q31_t ref__QSUB16(q31_t x, q31_t y)
  77. {
  78.    q31_t sum;
  79.    q31_t r, s;
  80.  
  81.    r = (q15_t) x;
  82.    s = (q15_t) y;
  83.  
  84.    r = ref_sat_q15(r - s);
  85.    s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) - (y >> 16)))) << 16;
  86.  
  87.    sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  88.  
  89.    return sum;
  90. }
  91.  
  92. q31_t ref__SHSUB16(q31_t x, q31_t y)
  93. {
  94.    q31_t diff;
  95.    q31_t r, s;
  96.  
  97.    r = (q15_t) x;
  98.    s = (q15_t) y;
  99.  
  100.    r = ((r >> 1) - (s >> 1));
  101.    s = (((x >> 17) - (y >> 17)) << 16);
  102.  
  103.    diff = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  104.  
  105.    return diff;
  106. }
  107.  
  108. q31_t ref__QASX(q31_t x, q31_t y)
  109. {
  110.    q31_t sum = 0;
  111.         q31_t xL, xH, yL, yH;
  112.        
  113.    // extract bottom halfword and sign extend
  114.         xL = (q15_t)(x & 0xffff);
  115.    // extract bottom halfword and sign extend
  116.         yL = (q15_t)(y & 0xffff);
  117.    // extract top halfword and sign extend
  118.    xH = (q15_t)(x >> 16);
  119.    // extract top halfword and sign extend
  120.    yH = (q15_t)(y >> 16);
  121.    
  122.    sum = (((q31_t)ref_sat_q15(xH + yL )) << 16) |
  123.          (((q31_t)ref_sat_q15(xL - yH )) & 0xffff);
  124.  
  125.    return sum;
  126. }
  127.  
  128. q31_t ref__SHASX(q31_t x, q31_t y)
  129. {
  130.    q31_t sum;
  131.    q31_t r, s;
  132.  
  133.    r = (q15_t) x;
  134.    s = (q15_t) y;
  135.  
  136.     r = (r - (y >> 16)) / 2;
  137.     s = (((x >> 16) + s) << 15);
  138.  
  139.    sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  140.  
  141.    return sum;
  142. }
  143.  
  144. q31_t ref__QSAX(q31_t x, q31_t y)
  145. {
  146.    q31_t sum = 0;
  147.         q31_t xL, xH, yL, yH;
  148.        
  149.    // extract bottom halfword and sign extend
  150.         xL = (q15_t)(x & 0xffff);
  151.    // extract bottom halfword and sign extend
  152.         yL = (q15_t)(y & 0xffff);
  153.    // extract top halfword and sign extend
  154.    xH = (q15_t)(x >> 16);
  155.    // extract top halfword and sign extend
  156.    yH = (q15_t)(y >> 16);
  157.    
  158.    sum = (((q31_t)ref_sat_q15(xH - yL )) << 16) |
  159.          (((q31_t)ref_sat_q15(xL + yH )) & 0xffff);
  160.  
  161.    return sum;
  162. }
  163.  
  164. q31_t ref__SHSAX(q31_t x, q31_t y)
  165. {
  166.    q31_t sum;
  167.    q31_t r, s;
  168.  
  169.    r = (q15_t) x;
  170.    s = (q15_t) y;
  171.  
  172.     r = (r + (y >> 16)) / 2;
  173.     s = (((x >> 16) - s) << 15);
  174.  
  175.    sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
  176.  
  177.    return sum;
  178. }
  179.  
  180. q31_t ref__SMUSDX(q31_t x, q31_t y)
  181. {
  182.    return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - ((q15_t) (x >> 16) * (q15_t) y)));
  183. }
  184.  
  185. q31_t ref__SMUADX(q31_t x, q31_t y)
  186. {
  187.    return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + ((q15_t) (x >> 16) * (q15_t) y)));
  188. }
  189.  
  190. q31_t ref__QADD(q31_t x, q31_t y)
  191. {
  192.    return ref_sat_q31((q63_t) x + y);
  193. }
  194.  
  195. q31_t ref__QSUB(q31_t x, q31_t y)
  196. {
  197.    return ref_sat_q31((q63_t) x - y);
  198. }
  199.  
  200. q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum)
  201. {
  202.    return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y));
  203. }
  204.  
  205. q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum)
  206. {
  207.    return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16)));
  208. }
  209.  
  210. q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum)
  211. {
  212.    return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16)));
  213. }
  214.  
  215. q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum)
  216. {
  217.    return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y));
  218. }
  219.  
  220. q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum)
  221. {
  222.    return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16));
  223. }
  224.  
  225. q31_t ref__SMUAD(q31_t x, q31_t y)
  226. {
  227.    return (((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16)));
  228. }
  229.  
  230. q31_t ref__SMUSD(q31_t x, q31_t y)
  231. {
  232.    return (-((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16)));
  233. }
  234.  
  235. q31_t ref__SXTB16(q31_t x)
  236. {
  237.    return ((((x << 24) >> 24) & 0x0000FFFF) | (((x << 8) >> 8) & 0xFFFF0000));
  238. }
  239.