Mercurial > repos > blastem
diff gen_x86.c @ 267:1788e3f29c28
Don't mix *H regs with the REX prefix
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 02 May 2013 00:10:24 -0700 |
parents | 2586d49ddd46 |
children | 467bfa17004a |
line wrap: on
line diff
--- a/gen_x86.c Wed May 01 23:12:29 2013 -0700 +++ b/gen_x86.c Thu May 02 00:10:24 2013 -0700 @@ -134,6 +134,10 @@ } if (size == SZ_Q || src >= R8 || dst >= R8 || (size == SZ_B && src >= RSP && src <= RDI)) { *out = PRE_REX; + if (src >= AH && src <= BH || dst >= AH && dst <= BH) { + fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode); + exit(1); + } if (size == SZ_Q) { *out |= REX_QUAD; } @@ -176,6 +180,10 @@ } if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) { *out = PRE_REX; + if (reg >= AH && reg <= BH) { + fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode); + exit(1); + } if (size == SZ_Q) { *out |= REX_QUAD; } @@ -221,6 +229,10 @@ } if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) { *out = PRE_REX; + if (reg >= AH && reg <= BH) { + fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode); + exit(1); + } if (size == SZ_Q) { *out |= REX_QUAD; } @@ -258,6 +270,10 @@ } if (size == SZ_Q || dst >= R8) { *out = PRE_REX; + if (dst >= AH && dst <= BH) { + fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode); + exit(1); + } if (size == SZ_Q) { *out |= REX_QUAD; }