comparison 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
comparison
equal deleted inserted replaced
266:376df762ddf5 267:1788e3f29c28
132 dst = src; 132 dst = src;
133 src = tmp; 133 src = tmp;
134 } 134 }
135 if (size == SZ_Q || src >= R8 || dst >= R8 || (size == SZ_B && src >= RSP && src <= RDI)) { 135 if (size == SZ_Q || src >= R8 || dst >= R8 || (size == SZ_B && src >= RSP && src <= RDI)) {
136 *out = PRE_REX; 136 *out = PRE_REX;
137 if (src >= AH && src <= BH || dst >= AH && dst <= BH) {
138 fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode);
139 exit(1);
140 }
137 if (size == SZ_Q) { 141 if (size == SZ_Q) {
138 *out |= REX_QUAD; 142 *out |= REX_QUAD;
139 } 143 }
140 if (src >= R8) { 144 if (src >= R8) {
141 *out |= REX_REG_FIELD; 145 *out |= REX_REG_FIELD;
174 if (size == SZ_W) { 178 if (size == SZ_W) {
175 *(out++) = PRE_SIZE; 179 *(out++) = PRE_SIZE;
176 } 180 }
177 if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) { 181 if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) {
178 *out = PRE_REX; 182 *out = PRE_REX;
183 if (reg >= AH && reg <= BH) {
184 fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode);
185 exit(1);
186 }
179 if (size == SZ_Q) { 187 if (size == SZ_Q) {
180 *out |= REX_QUAD; 188 *out |= REX_QUAD;
181 } 189 }
182 if (reg >= R8) { 190 if (reg >= R8) {
183 *out |= REX_REG_FIELD; 191 *out |= REX_REG_FIELD;
219 if (size == SZ_W) { 227 if (size == SZ_W) {
220 *(out++) = PRE_SIZE; 228 *(out++) = PRE_SIZE;
221 } 229 }
222 if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) { 230 if (size == SZ_Q || reg >= R8 || base >= R8 || (size == SZ_B && reg >= RSP && reg <= RDI)) {
223 *out = PRE_REX; 231 *out = PRE_REX;
232 if (reg >= AH && reg <= BH) {
233 fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode);
234 exit(1);
235 }
224 if (size == SZ_Q) { 236 if (size == SZ_Q) {
225 *out |= REX_QUAD; 237 *out |= REX_QUAD;
226 } 238 }
227 if (reg >= R8) { 239 if (reg >= R8) {
228 *out |= REX_REG_FIELD; 240 *out |= REX_REG_FIELD;
256 if (size == SZ_W) { 268 if (size == SZ_W) {
257 *(out++) = PRE_SIZE; 269 *(out++) = PRE_SIZE;
258 } 270 }
259 if (size == SZ_Q || dst >= R8) { 271 if (size == SZ_Q || dst >= R8) {
260 *out = PRE_REX; 272 *out = PRE_REX;
273 if (dst >= AH && dst <= BH) {
274 fprintf(stderr, "attempt to use *H reg in an instruction requiring REX prefix. opcode = %X\n", opcode);
275 exit(1);
276 }
261 if (size == SZ_Q) { 277 if (size == SZ_Q) {
262 *out |= REX_QUAD; 278 *out |= REX_QUAD;
263 } 279 }
264 if (dst >= R8) { 280 if (dst >= R8) {
265 *out |= REX_RM_FIELD; 281 *out |= REX_RM_FIELD;