diff options
author | Mike Pavone <pavone@retrodev.com> | 2012-12-21 01:00:52 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2012-12-21 01:00:52 -0800 |
commit | 4c3f48668d1416c816afe164e6aeb194eef3eed0 (patch) | |
tree | 3cf3c95beb755185741cf8d36c94cec234b08ffd /gen_x86.c | |
parent | fff86744755e8d884737aae0c736c15b932e2356 (diff) |
Implement more instructions and address modes
Diffstat (limited to 'gen_x86.c')
-rw-r--r-- | gen_x86.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -827,6 +827,42 @@ uint8_t * mov_irdisp8(uint8_t * out, int32_t val, uint8_t dst, int8_t disp, uint 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; |