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 }