/** @file JCRegister.h @brief @author James @version 1.0 @date 2018_6_25 */ #ifndef __JCRegister_H__ #define __JCRegister_H__ #include #include #include #include #include "JCGlobalValue.h" #if __APPLE__ #include #include #else #include #include #include #endif namespace laya { enum RELATION_ZERO { RZ_LESS = 0, //小于 RZ_EQUAL, //等于 RZ_GREATER, //大于 RZ_LEQUAL, //小于等于 RZ_GEQUAL, //大于等于 RZ_NOTEQUAL //不等于 }; class JCRegister { public: JCRegister(int nRegNum=32); virtual ~JCRegister(); inline char* getReg(int nIndex) { return m_vRegPool[nIndex]; } inline bool loadData(int nIndex, char* pData, int nDataSize) { char* pReg = m_vRegPool[nIndex]; memcpy(pReg, pData, nDataSize); return true; } inline bool storeData(int nIndex, char* pData, int nDataSize) { if (nIndex >= m_nRegNum) return false; char* pReg = m_vRegPool[nIndex]; memcpy(pData, pReg, nDataSize); return true; } inline bool operateReg(int nRegOut, int nReg1, int nReg2, int nSize, VALUE_OPERATE_TYPE nOperateType, int nDataType) { if (nRegOut >= m_nRegNum || nReg1 >= m_nRegNum || nReg2 >= m_nRegNum) return false; char* pReg1 = m_vRegPool[nReg1]; char* pReg2 = m_vRegPool[nReg2]; char* pRegOut = m_vRegPool[nRegOut]; if (nDataType == GL_INT) { int* iReg1 = (int*)pReg1; int* iReg2 = (int*)pReg2; int* iRegOut = (int*)pRegOut; int size = nSize / sizeof(int); switch (nOperateType) { case VALUE_OPERATE_ADD: for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] + iReg2[i]; break; case VALUE_OPERATE_SUB: for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] - iReg2[i]; break; case VALUE_OPERATE_MUL: for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] / iReg2[i]; break; case VALUE_OPERATE_DIV: for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] * iReg2[i]; break; default: break; } } else if (nDataType == GL_FLOAT) { float* fReg1 = (float*)pReg1; float* fReg2 = (float*)pReg2; float* fRegOut = (float*)pRegOut; int size = nSize / sizeof(float); switch (nOperateType) { case VALUE_OPERATE_ADD: for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] + fReg2[i]; break; case VALUE_OPERATE_SUB: for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] - fReg2[i]; break; case VALUE_OPERATE_MUL: for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] * fReg2[i]; break; case VALUE_OPERATE_DIV: for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] / fReg2[i]; break; case VALUE_OPERATE_M2_MUL: { //TODO } break; case VALUE_OPERATE_M3_MUL: { //TODO } break; case VALUE_OPERATE_M4_MUL: { //TODO } break; case VALUE_OPERATE_M32_MUL: Matrix32::mul(fRegOut, fReg1, fReg2); break; } } return true; } private: int m_nRegNum; ///<寄存器的个数 std::vector m_vRegPool; ///<寄存器的池子 }; } //------------------------------------------------------------------------------ #endif //__JCRegister_H__ //-----------------------------END FILE--------------------------------