#include "usf/usf.h"
#include "new_dynarec/new_dynarec.h"
#include "usf/usf_internal.h"
void shuffle_fpr_data(usf_state_t * state, int oldStatus, int newStatus)
{
#if defined(M64P_BIG_ENDIAN)
const int isBigEndian = 1;
#else
const int isBigEndian = 0;
#endif
if ((newStatus & 0x04000000) != (oldStatus & 0x04000000))
{
int i;
int temp_fgr_32[32];
if (newStatus & 0x04000000)
{ for (i = 0; i < 32; i++)
{
temp_fgr_32[i] = *((int *) &state->reg_cop1_fgr_64[i>>1] + ((i & 1) ^ isBigEndian));
}
for (i = 0; i < 32; i++)
{
int high32 = *((int *) &state->reg_cop1_fgr_64[(i>>1)+16] + (i & 1));
*((int *) &state->reg_cop1_fgr_64[i] + isBigEndian) = temp_fgr_32[i];
*((int *) &state->reg_cop1_fgr_64[i] + (isBigEndian^1)) = high32;
}
}
else
{ for (i = 0; i < 32; i++)
{
temp_fgr_32[i] = *((int *) &state->reg_cop1_fgr_64[i] + (isBigEndian^1));
}
for (i = 0; i < 16; i++)
{
unsigned int least32 = *((unsigned int *) &state->reg_cop1_fgr_64[i*2] + isBigEndian);
unsigned int most32 = *((unsigned int *) &state->reg_cop1_fgr_64[i*2+1] + isBigEndian);
state->reg_cop1_fgr_64[i] = ((unsigned long long) most32 << 32) | (unsigned long long) least32;
}
for (i = 0; i < 32; i++)
{
*((int *) &state->reg_cop1_fgr_64[(i>>1)+16] + (i & 1)) = temp_fgr_32[i];
}
}
}
}
void set_fpr_pointers(usf_state_t * state, int newStatus)
{
int i;
#if defined(M64P_BIG_ENDIAN)
const int isBigEndian = 1;
#else
const int isBigEndian = 0;
#endif
if (newStatus & 0x04000000)
{
for (i = 0; i < 32; i++)
{
state->reg_cop1_double[i] = (double*) &state->reg_cop1_fgr_64[i];
state->reg_cop1_simple[i] = ((float*) &state->reg_cop1_fgr_64[i]) + isBigEndian;
}
}
else
{
for (i = 0; i < 32; i++)
{
state->reg_cop1_double[i] = (double*) &state->reg_cop1_fgr_64[i>>1];
state->reg_cop1_simple[i] = ((float*) &state->reg_cop1_fgr_64[i>>1]) + ((i & 1) ^ isBigEndian);
}
}
}