Mercurial > repos > blastem
diff gen_x86.c @ 71:f80fa1776507
Implement more instructions and address modes
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 21 Dec 2012 01:00:52 -0800 |
parents | 918468c623e9 |
children | 6d231dbe75ab |
line wrap: on
line diff
--- a/gen_x86.c Thu Dec 20 09:17:31 2012 -0800 +++ b/gen_x86.c Fri Dec 21 01:00:52 2012 -0800 @@ -827,6 +827,42 @@ return out; } +uint8_t * mov_irind(uint8_t * out, int32_t val, uint8_t dst, uint8_t size) +{ + if (size == SZ_W) { + *(out++) = PRE_SIZE; + } + if (size == SZ_Q || dst >= R8 || (size == SZ_B && dst >= RSP && dst <= RDI)) { + *out = PRE_REX; + if (size == SZ_Q) { + *out |= REX_QUAD; + } + if (dst >= R8) { + *out |= REX_RM_FIELD; + dst -= (R8 - X86_R8); + } + out++; + } + if (dst >= AH && dst <= BH) { + dst -= (AH-X86_AH); + } + *(out++) = OP_MOV_IEA | (size == SZ_B ? 0 : BIT_SIZE); + *(out++) = MODE_REG_INDIRECT | dst; + + *(out++) = val; + if (size != SZ_B) { + val >>= 8; + *(out++) = val; + if (size != SZ_W) { + val >>= 8; + *(out++) = val; + val >>= 8; + *(out++) = val; + } + } + return out; +} + uint8_t * pushf(uint8_t * out) { *(out++) = OP_PUSHF;