Mercurial > repos > blastem
comparison 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 |
comparison
equal
deleted
inserted
replaced
70:cebd0b5ac7f0 | 71:f80fa1776507 |
---|---|
825 } | 825 } |
826 } | 826 } |
827 return out; | 827 return out; |
828 } | 828 } |
829 | 829 |
830 uint8_t * mov_irind(uint8_t * out, int32_t val, uint8_t dst, uint8_t size) | |
831 { | |
832 if (size == SZ_W) { | |
833 *(out++) = PRE_SIZE; | |
834 } | |
835 if (size == SZ_Q || dst >= R8 || (size == SZ_B && dst >= RSP && dst <= RDI)) { | |
836 *out = PRE_REX; | |
837 if (size == SZ_Q) { | |
838 *out |= REX_QUAD; | |
839 } | |
840 if (dst >= R8) { | |
841 *out |= REX_RM_FIELD; | |
842 dst -= (R8 - X86_R8); | |
843 } | |
844 out++; | |
845 } | |
846 if (dst >= AH && dst <= BH) { | |
847 dst -= (AH-X86_AH); | |
848 } | |
849 *(out++) = OP_MOV_IEA | (size == SZ_B ? 0 : BIT_SIZE); | |
850 *(out++) = MODE_REG_INDIRECT | dst; | |
851 | |
852 *(out++) = val; | |
853 if (size != SZ_B) { | |
854 val >>= 8; | |
855 *(out++) = val; | |
856 if (size != SZ_W) { | |
857 val >>= 8; | |
858 *(out++) = val; | |
859 val >>= 8; | |
860 *(out++) = val; | |
861 } | |
862 } | |
863 return out; | |
864 } | |
865 | |
830 uint8_t * pushf(uint8_t * out) | 866 uint8_t * pushf(uint8_t * out) |
831 { | 867 { |
832 *(out++) = OP_PUSHF; | 868 *(out++) = OP_PUSHF; |
833 return out; | 869 return out; |
834 } | 870 } |