Doesn't look like anyone was gonna respond (no biggie in this case) however I did experience some problems with it, eventually went with this:
Code:
int alu_mov( alu_t *alu, uintptr_t num, uintptr_t val, size_t size )
{
int ret = 0, tmp = -1;
void *ptr;
alu_reg_t *REG;
if ( num >= ALU_REG_ID_LIMIT )
{
if ( val >= ALU_REG_ID_LIMIT )
{
errno = 0;
(void)memmove( (void*)num, (void*)val, size );
ret = errno;
return ret;
}
ret = alu_check2( alu, ALU_REG_ID_NEED, val );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
ret = alu_get_reg( alu, &tmp );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
ptr = (void*)num;
REG = (alu->regv + tmp);
alu__or( alu, tmp, val );
(void)memset( ptr, 0, size );
if ( size > alu->buff.perN )
size = alu->buff.perN;
(void)memmove( ptr, REG->part, size );
(void)alu_rem_reg( alu, tmp );
return 0;
}
if ( val >= ALU_REG_ID_LIMIT )
{
ret = alu_check1( alu, num );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
ret = alu_get_reg( alu, &tmp );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
ptr = (void*)val;
REG = (alu->regv + tmp);
if ( size > alu->buff.perN )
size = alu->buff.perN;
(void)memmove( REG->part, ptr, size );
(void)alu_xor( alu, num, num );
(void)alu__or( alu, num, tmp );
(void)alu_rem_reg( alu, tmp );
return 0;
}
alu_xor( alu, num, num );
alu__or( alu, num, val );
return ret;
}