Mercurial > repos > blastem
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; |