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;
 		}