#include "HalfConverter.h"
#include <arm_neon.h>
#include "memctrl.h"

bool HalfConverter::bInitialised = false;  //005CB43C
uint HalfConverter::exponenttable[64];
uint HalfConverter::offsettable[64];
uint HalfConverter::mantissatable[2048];
ushort HalfConverter::basetable[512];
sint8 HalfConverter::shifttable[512];

union FoatUInt {
  uint u32;
  float f32;
};

//做过了单元测试，相同参数传入， 结果是一样的。
static void GenerateExponentTableAndoffsetTable(uint* mantissatableoffset, uint offset) {
  while (offset != 0x38800000) {
    *mantissatableoffset = offset;
    ++mantissatableoffset;
    offset += 0x2000;
  }

  HalfConverter::exponenttable[0] = 0;
  for (int i = 1; i < 31; i++) {
    HalfConverter::exponenttable[i] = (uint)(i << 23);
  }
  HalfConverter::exponenttable[31] = 0x47800000;
  HalfConverter::exponenttable[32] = 0x80000000;
  for (int i = 33; i < 63; i++) {
    HalfConverter::exponenttable[i] = (uint)(0x80000000 + ((i - 32) << 23));
  }
  HalfConverter::exponenttable[63] = 0xc7800000;

  HalfConverter::offsettable[0] = 0;
  for (int i = 1; i < 32; i++) {
    HalfConverter::offsettable[i] = 1024;
  }
  HalfConverter::offsettable[32] = 0;
  for (int i = 32; i < 64; i++) {
    HalfConverter::offsettable[i] = 1024;
  }
}
//-------------------------------------------------------------------------------------------------
//0018E2A4 ^_- 做过了单元测试，计算出来的全局变量结果是一样的。这个函数只有在配置好的机器上才会被调用到，有硬件配置要求。
void HalfConverter::Init() {
  //locret_18E40C
}
//-------------------------------------------------------------------------------------------------
//0018E42C ^_^
ushort HalfConverter::F2H(float a) {
  return 0;
}

//-------------------------------------------------------------------------------------------------
//0018E6E4 ^_^
uint HalfConverter::convertmantissa(uint a) {
  return 0;
}
//-------------------------------------------------------------------------------------------------
//001AE240 ^_^
float HalfConverter::H2F(ushort half) {
  return 0;
}
//-------------------------------------------------------------------------------------------------
//001AE27C ^_- 做过了单元测试，相同参数传入， 结果是一样的。(对比的代码是网上找的开源算法代码) 而且似乎这个函数没有被实际调用过。这个算法是公开的，网上很多代码可以参考， 所以不花太多时间对齐汇编代码
uint HalfConverter::CreateRGB9E5(float f0, float f1, float f2, bool b3) {
  return 0;
}
//-------------------------------------------------------------------------------------------------
//00225574 ^_- 做过了单元测试，相同参数传入， 结果是一样的。(对比的代码是网上找的开源算法代码)  而且似乎这个函数没有被实际调用过。这个算法是公开的，网上很多代码可以参考， 所以不花太多时间对齐汇编代码
float HalfConverter::RGB9E5toFloat(uint a0, float& f1, float& f2, float& f3, bool b4) {
  return 0;
}
//-------------------------------------------------------------------------------------------------