I have done it but it brakes :(
here is the code where I implemented it:
/* added for W64F_STATICRSP */
static void win64_StoreRegHome( struct proc_info *info )
/*******************************************************/
{
int i = 0;
int cnt;
int grcount=0;
int sizestd =0;
int r;
uint_16 *regist;
info->stored_reg = 0;
if ( info->regslist ) {
for( regist = info->regslist,cnt = *regist++; cnt; cnt--, regist++,i++ ) {
if ( GetValueSp( *regist ) & OP_XMM ) continue;
else ++grcount;
}
for (i=0,r=0;i<4;i++){
if (info->home_used[i]==0) ++r;
}
if (r){
if (grcount==1) memset(info->home_used, 1, 4);
else if (grcount==2 && r >= 2){
for (i=0;i<4;i++){
if (info->home_used[i]==0) break;
}
for (++i;i<4;i++)
info->home_used[i]=1;
}
else if (grcount==3){
if ( r == 1) memset(info->home_used, 1, 4);
if ( r >= 3){
for (i=0;i<4;i++){
if (info->home_used[i]==0) break;
}
for (++i;i<4;i++){
if (info->home_used[i]==0) break;
}
for (++i;i<4;i++)
info->home_used[i]=1;
}
}
else if (grcount==4 && r == 4){
info->home_used[4]=1;
}
else if (grcount > 4){
r = grcount-r;
if (!(r & 1 )){
for (i=0;i<4;i++){
if (info->home_used[i]==0) break;
}
info->home_used[i]=1;
}
}
}
for( i=0,regist = info->regslist,cnt = *regist++; cnt; cnt--, regist++,i++ ) {
if ( GetValueSp( *regist ) & OP_XMM ) continue;
else {
sizestd += 8;
if (i < 4) {
if (info->home_used[i]==0){
AddLineQueueX( "mov [%r+%u], %r",T_RSP, NUMQUAL sizestd, *regist );
if ( ( 1 << GetRegNo( *regist ) ) & win64_nvgpr )
AddLineQueueX( "%r %r, %u", T_DOT_SAVEREG, *regist, NUMQUAL sizestd);
info->stored_reg++;
}
else {
cnt++;regist--;
}
}
}
}/* end for */
}
return;
}