NASM 2.10rc6
[nasm.git] / assemble.c
bloba9f6eb027a8a5ec6a62716dd87d1974938090394
1 /* ----------------------------------------------------------------------- *
3 * Copyright 1996-2010 The NASM Authors - All Rights Reserved
4 * See the file AUTHORS included with the NASM distribution for
5 * the specific copyright holders.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following
9 * conditions are met:
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ----------------------------------------------------------------------- */
35 * assemble.c code generation for the Netwide Assembler
37 * the actual codes (C syntax, i.e. octal):
38 * \0 - terminates the code. (Unless it's a literal of course.)
39 * \1..\4 - that many literal bytes follow in the code stream
40 * \5 - add 4 to the primary operand number (b, low octdigit)
41 * \6 - add 4 to the secondary operand number (a, middle octdigit)
42 * \7 - add 4 to both the primary and the secondary operand number
43 * \10..\13 - a literal byte follows in the code stream, to be added
44 * to the register value of operand 0..3
45 * \14..\17 - a signed byte immediate operand, from operand 0..3
46 * \20..\23 - a byte immediate operand, from operand 0..3
47 * \24..\27 - an unsigned byte immediate operand, from operand 0..3
48 * \30..\33 - a word immediate operand, from operand 0..3
49 * \34..\37 - select between \3[0-3] and \4[0-3] depending on 16/32 bit
50 * assembly mode or the operand-size override on the operand
51 * \40..\43 - a long immediate operand, from operand 0..3
52 * \44..\47 - select between \3[0-3], \4[0-3] and \5[4-7]
53 * depending on the address size of the instruction.
54 * \50..\53 - a byte relative operand, from operand 0..3
55 * \54..\57 - a qword immediate operand, from operand 0..3
56 * \60..\63 - a word relative operand, from operand 0..3
57 * \64..\67 - select between \6[0-3] and \7[0-3] depending on 16/32 bit
58 * assembly mode or the operand-size override on the operand
59 * \70..\73 - a long relative operand, from operand 0..3
60 * \74..\77 - a word constant, from the _segment_ part of operand 0..3
61 * \1ab - a ModRM, calculated on EA in operand a, with the spare
62 * field the register value of operand b.
63 * \140..\143 - an immediate word or signed byte for operand 0..3
64 * \144..\147 - or 2 (s-field) into opcode byte if operand 0..3
65 * is a signed byte rather than a word. Opcode byte follows.
66 * \150..\153 - an immediate dword or signed byte for operand 0..3
67 * \154..\157 - or 2 (s-field) into opcode byte if operand 0..3
68 * is a signed byte rather than a dword. Opcode byte follows.
69 * \160..\163 - this instruction uses DREX rather than REX, with the
70 * OC0 field set to 0, and the dest field taken from
71 * operand 0..3.
72 * \164..\167 - this instruction uses DREX rather than REX, with the
73 * OC0 field set to 1, and the dest field taken from
74 * operand 0..3.
75 * \171 - placement of DREX suffix in the absence of an EA
76 * \172\ab - the register number from operand a in bits 7..4, with
77 * the 4-bit immediate from operand b in bits 3..0.
78 * \173\xab - the register number from operand a in bits 7..4, with
79 * the value b in bits 3..0.
80 * \174\a - the register number from operand a in bits 7..4, and
81 * an arbitrary value in bits 3..0 (assembled as zero.)
82 * \2ab - a ModRM, calculated on EA in operand a, with the spare
83 * field equal to digit b.
84 * \250..\253 - same as \150..\153, except warn if the 64-bit operand
85 * is not equal to the truncated and sign-extended 32-bit
86 * operand; used for 32-bit immediates in 64-bit mode.
87 * \254..\257 - a signed 32-bit operand to be extended to 64 bits.
88 * \260..\263 - this instruction uses VEX/XOP rather than REX, with the
89 * V field taken from operand 0..3.
90 * \270 - this instruction uses VEX/XOP rather than REX, with the
91 * V field set to 1111b.
93 * VEX/XOP prefixes are followed by the sequence:
94 * \tmm\wlp where mm is the M field; and wlp is:
95 * 00 wwl lpp
96 * [l0] ll = 0 for L = 0 (.128, .lz)
97 * [l1] ll = 1 for L = 1 (.256)
98 * [lig] ll = 2 for L don't care (always assembled as 0)
100 * [w0] ww = 0 for W = 0
101 * [w1 ] ww = 1 for W = 1
102 * [wig] ww = 2 for W don't care (always assembled as 0)
103 * [ww] ww = 3 for W used as REX.W
105 * t = 0 for VEX (C4/C5), t = 1 for XOP (8F).
107 * \274..\277 - a signed byte immediate operand, from operand 0..3,
108 * which is to be extended to the operand size.
109 * \310 - indicates fixed 16-bit address size, i.e. optional 0x67.
110 * \311 - indicates fixed 32-bit address size, i.e. optional 0x67.
111 * \312 - (disassembler only) invalid with non-default address size.
112 * \313 - indicates fixed 64-bit address size, 0x67 invalid.
113 * \314 - (disassembler only) invalid with REX.B
114 * \315 - (disassembler only) invalid with REX.X
115 * \316 - (disassembler only) invalid with REX.R
116 * \317 - (disassembler only) invalid with REX.W
117 * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66.
118 * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66.
119 * \322 - indicates that this instruction is only valid when the
120 * operand size is the default (instruction to disassembler,
121 * generates no code in the assembler)
122 * \323 - indicates fixed 64-bit operand size, REX on extensions only.
123 * \324 - indicates 64-bit operand size requiring REX prefix.
124 * \325 - instruction which always uses spl/bpl/sil/dil
125 * \330 - a literal byte follows in the code stream, to be added
126 * to the condition code value of the instruction.
127 * \331 - instruction not valid with REP prefix. Hint for
128 * disassembler only; for SSE instructions.
129 * \332 - REP prefix (0xF2 byte) used as opcode extension.
130 * \333 - REP prefix (0xF3 byte) used as opcode extension.
131 * \334 - LOCK prefix used as REX.R (used in non-64-bit mode)
132 * \335 - disassemble a rep (0xF3 byte) prefix as repe not rep.
133 * \336 - force a REP(E) prefix (0xF2) even if not specified.
134 * \337 - force a REPNE prefix (0xF3) even if not specified.
135 * \336-\337 are still listed as prefixes in the disassembler.
136 * \340 - reserve <operand 0> bytes of uninitialized storage.
137 * Operand 0 had better be a segmentless constant.
138 * \341 - this instruction needs a WAIT "prefix"
139 * \344,\345 - the PUSH/POP (respectively) codes for CS, DS, ES, SS
140 * (POP is never used for CS) depending on operand 0
141 * \346,\347 - the second byte of PUSH/POP codes for FS, GS, depending
142 * on operand 0
143 * \360 - no SSE prefix (== \364\331)
144 * \361 - 66 SSE prefix (== \366\331)
145 * \362 - F2 SSE prefix (== \364\332)
146 * \363 - F3 SSE prefix (== \364\333)
147 * \364 - operand-size prefix (0x66) not permitted
148 * \365 - address-size prefix (0x67) not permitted
149 * \366 - operand-size prefix (0x66) used as opcode extension
150 * \367 - address-size prefix (0x67) used as opcode extension
151 * \370,\371,\372 - match only if operand 0 meets byte jump criteria.
152 * 370 is used for Jcc, 371 is used for JMP.
153 * \373 - assemble 0x03 if bits==16, 0x05 if bits==32;
154 * used for conditional jump over longer jump
157 #include "compiler.h"
159 #include <stdio.h>
160 #include <string.h>
161 #include <inttypes.h>
163 #include "nasm.h"
164 #include "nasmlib.h"
165 #include "assemble.h"
166 #include "insns.h"
167 #include "tables.h"
169 enum match_result {
171 * Matching errors. These should be sorted so that more specific
172 * errors come later in the sequence.
174 MERR_INVALOP,
175 MERR_OPSIZEMISSING,
176 MERR_OPSIZEMISMATCH,
177 MERR_BADCPU,
178 MERR_BADMODE,
180 * Matching success; the conditional ones first
182 MOK_JUMP, /* Matching OK but needs jmp_match() */
183 MOK_GOOD /* Matching unconditionally OK */
186 typedef struct {
187 int sib_present; /* is a SIB byte necessary? */
188 int bytes; /* # of bytes of offset needed */
189 int size; /* lazy - this is sib+bytes+1 */
190 uint8_t modrm, sib, rex, rip; /* the bytes themselves */
191 } ea;
193 static uint32_t cpu; /* cpu level received from nasm.c */
194 static efunc errfunc;
195 static struct ofmt *outfmt;
196 static ListGen *list;
198 static int64_t calcsize(int32_t, int64_t, int, insn *, const uint8_t *);
199 static void gencode(int32_t segment, int64_t offset, int bits,
200 insn * ins, const struct itemplate *temp,
201 int64_t insn_end);
202 static enum match_result find_match(const struct itemplate **tempp,
203 insn *instruction,
204 int32_t segment, int64_t offset, int bits);
205 static enum match_result matches(const struct itemplate *, insn *, int bits);
206 static opflags_t regflag(const operand *);
207 static int32_t regval(const operand *);
208 static int rexflags(int, opflags_t, int);
209 static int op_rexflags(const operand *, int);
210 static ea *process_ea(operand *, ea *, int, int, int, opflags_t);
211 static void add_asp(insn *, int);
213 static int has_prefix(insn * ins, enum prefix_pos pos, enum prefixes prefix)
215 return ins->prefixes[pos] == prefix;
218 static void assert_no_prefix(insn * ins, enum prefix_pos pos)
220 if (ins->prefixes[pos])
221 errfunc(ERR_NONFATAL, "invalid %s prefix",
222 prefix_name(ins->prefixes[pos]));
225 static const char *size_name(int size)
227 switch (size) {
228 case 1:
229 return "byte";
230 case 2:
231 return "word";
232 case 4:
233 return "dword";
234 case 8:
235 return "qword";
236 case 10:
237 return "tword";
238 case 16:
239 return "oword";
240 case 32:
241 return "yword";
242 default:
243 return "???";
247 static void warn_overflow(int pass, int size)
249 errfunc(ERR_WARNING | pass | ERR_WARN_NOV,
250 "%s data exceeds bounds", size_name(size));
253 static void warn_overflow_const(int64_t data, int size)
255 if (overflow_general(data, size))
256 warn_overflow(ERR_PASS1, size);
259 static void warn_overflow_opd(const struct operand *o, int size)
261 if (o->wrt == NO_SEG && o->segment == NO_SEG) {
262 if (overflow_general(o->offset, size))
263 warn_overflow(ERR_PASS2, size);
268 * This routine wrappers the real output format's output routine,
269 * in order to pass a copy of the data off to the listing file
270 * generator at the same time.
272 static void out(int64_t offset, int32_t segto, const void *data,
273 enum out_type type, uint64_t size,
274 int32_t segment, int32_t wrt)
276 static int32_t lineno = 0; /* static!!! */
277 static char *lnfname = NULL;
278 uint8_t p[8];
280 if (type == OUT_ADDRESS && segment == NO_SEG && wrt == NO_SEG) {
282 * This is a non-relocated address, and we're going to
283 * convert it into RAWDATA format.
285 uint8_t *q = p;
287 if (size > 8) {
288 errfunc(ERR_PANIC, "OUT_ADDRESS with size > 8");
289 return;
292 WRITEADDR(q, *(int64_t *)data, size);
293 data = p;
294 type = OUT_RAWDATA;
297 list->output(offset, data, type, size);
300 * this call to src_get determines when we call the
301 * debug-format-specific "linenum" function
302 * it updates lineno and lnfname to the current values
303 * returning 0 if "same as last time", -2 if lnfname
304 * changed, and the amount by which lineno changed,
305 * if it did. thus, these variables must be static
308 if (src_get(&lineno, &lnfname))
309 outfmt->current_dfmt->linenum(lnfname, lineno, segto);
311 outfmt->output(segto, data, type, size, segment, wrt);
314 static bool jmp_match(int32_t segment, int64_t offset, int bits,
315 insn * ins, const uint8_t *code)
317 int64_t isize;
318 uint8_t c = code[0];
320 if ((c != 0370 && c != 0371) || (ins->oprs[0].type & STRICT))
321 return false;
322 if (!optimizing)
323 return false;
324 if (optimizing < 0 && c == 0371)
325 return false;
327 isize = calcsize(segment, offset, bits, ins, code);
329 if (ins->oprs[0].opflags & OPFLAG_UNKNOWN)
330 /* Be optimistic in pass 1 */
331 return true;
333 if (ins->oprs[0].segment != segment)
334 return false;
336 isize = ins->oprs[0].offset - offset - isize; /* isize is delta */
337 return (isize >= -128 && isize <= 127); /* is it byte size? */
340 int64_t assemble(int32_t segment, int64_t offset, int bits, uint32_t cp,
341 insn * instruction, struct ofmt *output, efunc error,
342 ListGen * listgen)
344 const struct itemplate *temp;
345 int j;
346 enum match_result m;
347 int64_t insn_end;
348 int32_t itimes;
349 int64_t start = offset;
350 int64_t wsize; /* size for DB etc. */
352 errfunc = error; /* to pass to other functions */
353 cpu = cp;
354 outfmt = output; /* likewise */
355 list = listgen; /* and again */
357 wsize = idata_bytes(instruction->opcode);
358 if (wsize == -1)
359 return 0;
361 if (wsize) {
362 extop *e;
363 int32_t t = instruction->times;
364 if (t < 0)
365 errfunc(ERR_PANIC,
366 "instruction->times < 0 (%ld) in assemble()", t);
368 while (t--) { /* repeat TIMES times */
369 list_for_each(e, instruction->eops) {
370 if (e->type == EOT_DB_NUMBER) {
371 if (wsize > 8) {
372 errfunc(ERR_NONFATAL,
373 "integer supplied to a DT, DO or DY"
374 " instruction");
375 } else {
376 out(offset, segment, &e->offset,
377 OUT_ADDRESS, wsize, e->segment, e->wrt);
378 offset += wsize;
380 } else if (e->type == EOT_DB_STRING ||
381 e->type == EOT_DB_STRING_FREE) {
382 int align;
384 out(offset, segment, e->stringval,
385 OUT_RAWDATA, e->stringlen, NO_SEG, NO_SEG);
386 align = e->stringlen % wsize;
388 if (align) {
389 align = wsize - align;
390 out(offset, segment, zero_buffer,
391 OUT_RAWDATA, align, NO_SEG, NO_SEG);
393 offset += e->stringlen + align;
396 if (t > 0 && t == instruction->times - 1) {
398 * Dummy call to list->output to give the offset to the
399 * listing module.
401 list->output(offset, NULL, OUT_RAWDATA, 0);
402 list->uplevel(LIST_TIMES);
405 if (instruction->times > 1)
406 list->downlevel(LIST_TIMES);
407 return offset - start;
410 if (instruction->opcode == I_INCBIN) {
411 const char *fname = instruction->eops->stringval;
412 FILE *fp;
414 fp = fopen(fname, "rb");
415 if (!fp) {
416 error(ERR_NONFATAL, "`incbin': unable to open file `%s'",
417 fname);
418 } else if (fseek(fp, 0L, SEEK_END) < 0) {
419 error(ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
420 fname);
421 } else {
422 static char buf[4096];
423 size_t t = instruction->times;
424 size_t base = 0;
425 size_t len;
427 len = ftell(fp);
428 if (instruction->eops->next) {
429 base = instruction->eops->next->offset;
430 len -= base;
431 if (instruction->eops->next->next &&
432 len > (size_t)instruction->eops->next->next->offset)
433 len = (size_t)instruction->eops->next->next->offset;
436 * Dummy call to list->output to give the offset to the
437 * listing module.
439 list->output(offset, NULL, OUT_RAWDATA, 0);
440 list->uplevel(LIST_INCBIN);
441 while (t--) {
442 size_t l;
444 fseek(fp, base, SEEK_SET);
445 l = len;
446 while (l > 0) {
447 int32_t m;
448 m = fread(buf, 1, l > sizeof(buf) ? sizeof(buf) : l, fp);
449 if (!m) {
451 * This shouldn't happen unless the file
452 * actually changes while we are reading
453 * it.
455 error(ERR_NONFATAL,
456 "`incbin': unexpected EOF while"
457 " reading file `%s'", fname);
458 t = 0; /* Try to exit cleanly */
459 break;
461 out(offset, segment, buf, OUT_RAWDATA, m,
462 NO_SEG, NO_SEG);
463 l -= m;
466 list->downlevel(LIST_INCBIN);
467 if (instruction->times > 1) {
469 * Dummy call to list->output to give the offset to the
470 * listing module.
472 list->output(offset, NULL, OUT_RAWDATA, 0);
473 list->uplevel(LIST_TIMES);
474 list->downlevel(LIST_TIMES);
476 fclose(fp);
477 return instruction->times * len;
479 return 0; /* if we're here, there's an error */
482 /* Check to see if we need an address-size prefix */
483 add_asp(instruction, bits);
485 m = find_match(&temp, instruction, segment, offset, bits);
487 if (m == MOK_GOOD) {
488 /* Matches! */
489 int64_t insn_size = calcsize(segment, offset, bits,
490 instruction, temp->code);
491 itimes = instruction->times;
492 if (insn_size < 0) /* shouldn't be, on pass two */
493 error(ERR_PANIC, "errors made it through from pass one");
494 else
495 while (itimes--) {
496 for (j = 0; j < MAXPREFIX; j++) {
497 uint8_t c = 0;
498 switch (instruction->prefixes[j]) {
499 case P_WAIT:
500 c = 0x9B;
501 break;
502 case P_LOCK:
503 c = 0xF0;
504 break;
505 case P_REPNE:
506 case P_REPNZ:
507 c = 0xF2;
508 break;
509 case P_REPE:
510 case P_REPZ:
511 case P_REP:
512 c = 0xF3;
513 break;
514 case R_CS:
515 if (bits == 64) {
516 error(ERR_WARNING | ERR_PASS2,
517 "cs segment base generated, but will be ignored in 64-bit mode");
519 c = 0x2E;
520 break;
521 case R_DS:
522 if (bits == 64) {
523 error(ERR_WARNING | ERR_PASS2,
524 "ds segment base generated, but will be ignored in 64-bit mode");
526 c = 0x3E;
527 break;
528 case R_ES:
529 if (bits == 64) {
530 error(ERR_WARNING | ERR_PASS2,
531 "es segment base generated, but will be ignored in 64-bit mode");
533 c = 0x26;
534 break;
535 case R_FS:
536 c = 0x64;
537 break;
538 case R_GS:
539 c = 0x65;
540 break;
541 case R_SS:
542 if (bits == 64) {
543 error(ERR_WARNING | ERR_PASS2,
544 "ss segment base generated, but will be ignored in 64-bit mode");
546 c = 0x36;
547 break;
548 case R_SEGR6:
549 case R_SEGR7:
550 error(ERR_NONFATAL,
551 "segr6 and segr7 cannot be used as prefixes");
552 break;
553 case P_A16:
554 if (bits == 64) {
555 error(ERR_NONFATAL,
556 "16-bit addressing is not supported "
557 "in 64-bit mode");
558 } else if (bits != 16)
559 c = 0x67;
560 break;
561 case P_A32:
562 if (bits != 32)
563 c = 0x67;
564 break;
565 case P_A64:
566 if (bits != 64) {
567 error(ERR_NONFATAL,
568 "64-bit addressing is only supported "
569 "in 64-bit mode");
571 break;
572 case P_ASP:
573 c = 0x67;
574 break;
575 case P_O16:
576 if (bits != 16)
577 c = 0x66;
578 break;
579 case P_O32:
580 if (bits == 16)
581 c = 0x66;
582 break;
583 case P_O64:
584 /* REX.W */
585 break;
586 case P_OSP:
587 c = 0x66;
588 break;
589 case P_none:
590 break;
591 default:
592 error(ERR_PANIC, "invalid instruction prefix");
594 if (c != 0) {
595 out(offset, segment, &c, OUT_RAWDATA, 1,
596 NO_SEG, NO_SEG);
597 offset++;
600 insn_end = offset + insn_size;
601 gencode(segment, offset, bits, instruction,
602 temp, insn_end);
603 offset += insn_size;
604 if (itimes > 0 && itimes == instruction->times - 1) {
606 * Dummy call to list->output to give the offset to the
607 * listing module.
609 list->output(offset, NULL, OUT_RAWDATA, 0);
610 list->uplevel(LIST_TIMES);
613 if (instruction->times > 1)
614 list->downlevel(LIST_TIMES);
615 return offset - start;
616 } else {
617 /* No match */
618 switch (m) {
619 case MERR_OPSIZEMISSING:
620 error(ERR_NONFATAL, "operation size not specified");
621 break;
622 case MERR_OPSIZEMISMATCH:
623 error(ERR_NONFATAL, "mismatch in operand sizes");
624 break;
625 case MERR_BADCPU:
626 error(ERR_NONFATAL, "no instruction for this cpu level");
627 break;
628 case MERR_BADMODE:
629 error(ERR_NONFATAL, "instruction not supported in %d-bit mode",
630 bits);
631 break;
632 default:
633 error(ERR_NONFATAL,
634 "invalid combination of opcode and operands");
635 break;
638 return 0;
641 int64_t insn_size(int32_t segment, int64_t offset, int bits, uint32_t cp,
642 insn * instruction, efunc error)
644 const struct itemplate *temp;
645 enum match_result m;
647 errfunc = error; /* to pass to other functions */
648 cpu = cp;
650 if (instruction->opcode == I_none)
651 return 0;
653 if (instruction->opcode == I_DB || instruction->opcode == I_DW ||
654 instruction->opcode == I_DD || instruction->opcode == I_DQ ||
655 instruction->opcode == I_DT || instruction->opcode == I_DO ||
656 instruction->opcode == I_DY) {
657 extop *e;
658 int32_t isize, osize, wsize;
660 isize = 0;
661 wsize = idata_bytes(instruction->opcode);
663 list_for_each(e, instruction->eops) {
664 int32_t align;
666 osize = 0;
667 if (e->type == EOT_DB_NUMBER) {
668 osize = 1;
669 warn_overflow_const(e->offset, wsize);
670 } else if (e->type == EOT_DB_STRING ||
671 e->type == EOT_DB_STRING_FREE)
672 osize = e->stringlen;
674 align = (-osize) % wsize;
675 if (align < 0)
676 align += wsize;
677 isize += osize + align;
679 return isize * instruction->times;
682 if (instruction->opcode == I_INCBIN) {
683 const char *fname = instruction->eops->stringval;
684 FILE *fp;
685 int64_t val = 0;
686 size_t len;
688 fp = fopen(fname, "rb");
689 if (!fp)
690 error(ERR_NONFATAL, "`incbin': unable to open file `%s'",
691 fname);
692 else if (fseek(fp, 0L, SEEK_END) < 0)
693 error(ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
694 fname);
695 else {
696 len = ftell(fp);
697 if (instruction->eops->next) {
698 len -= instruction->eops->next->offset;
699 if (instruction->eops->next->next &&
700 len > (size_t)instruction->eops->next->next->offset) {
701 len = (size_t)instruction->eops->next->next->offset;
704 val = instruction->times * len;
706 if (fp)
707 fclose(fp);
708 return val;
711 /* Check to see if we need an address-size prefix */
712 add_asp(instruction, bits);
714 m = find_match(&temp, instruction, segment, offset, bits);
715 if (m == MOK_GOOD) {
716 /* we've matched an instruction. */
717 int64_t isize;
718 const uint8_t *codes = temp->code;
719 int j;
721 isize = calcsize(segment, offset, bits, instruction, codes);
722 if (isize < 0)
723 return -1;
724 for (j = 0; j < MAXPREFIX; j++) {
725 switch (instruction->prefixes[j]) {
726 case P_A16:
727 if (bits != 16)
728 isize++;
729 break;
730 case P_A32:
731 if (bits != 32)
732 isize++;
733 break;
734 case P_O16:
735 if (bits != 16)
736 isize++;
737 break;
738 case P_O32:
739 if (bits == 16)
740 isize++;
741 break;
742 case P_A64:
743 case P_O64:
744 case P_none:
745 break;
746 default:
747 isize++;
748 break;
751 return isize * instruction->times;
752 } else {
753 return -1; /* didn't match any instruction */
757 static bool possible_sbyte(operand *o)
759 return o->wrt == NO_SEG && o->segment == NO_SEG &&
760 !(o->opflags & OPFLAG_UNKNOWN) &&
761 optimizing >= 0 && !(o->type & STRICT);
764 /* check that opn[op] is a signed byte of size 16 or 32 */
765 static bool is_sbyte16(operand *o)
767 int16_t v;
769 if (!possible_sbyte(o))
770 return false;
772 v = o->offset;
773 return v >= -128 && v <= 127;
776 static bool is_sbyte32(operand *o)
778 int32_t v;
780 if (!possible_sbyte(o))
781 return false;
783 v = o->offset;
784 return v >= -128 && v <= 127;
787 /* Common construct */
788 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
790 static int64_t calcsize(int32_t segment, int64_t offset, int bits,
791 insn * ins, const uint8_t *codes)
793 int64_t length = 0;
794 uint8_t c;
795 int rex_mask = ~0;
796 int op1, op2;
797 struct operand *opx;
798 uint8_t opex = 0;
800 ins->rex = 0; /* Ensure REX is reset */
802 if (ins->prefixes[PPS_OSIZE] == P_O64)
803 ins->rex |= REX_W;
805 (void)segment; /* Don't warn that this parameter is unused */
806 (void)offset; /* Don't warn that this parameter is unused */
808 while (*codes) {
809 c = *codes++;
810 op1 = (c & 3) + ((opex & 1) << 2);
811 op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
812 opx = &ins->oprs[op1];
813 opex = 0; /* For the next iteration */
815 switch (c) {
816 case 01:
817 case 02:
818 case 03:
819 case 04:
820 codes += c, length += c;
821 break;
823 case 05:
824 case 06:
825 case 07:
826 opex = c;
827 break;
829 case4(010):
830 ins->rex |=
831 op_rexflags(opx, REX_B|REX_H|REX_P|REX_W);
832 codes++, length++;
833 break;
835 case4(014):
836 case4(020):
837 case4(024):
838 length++;
839 break;
841 case4(030):
842 length += 2;
843 break;
845 case4(034):
846 if (opx->type & (BITS16 | BITS32 | BITS64))
847 length += (opx->type & BITS16) ? 2 : 4;
848 else
849 length += (bits == 16) ? 2 : 4;
850 break;
852 case4(040):
853 length += 4;
854 break;
856 case4(044):
857 length += ins->addr_size >> 3;
858 break;
860 case4(050):
861 length++;
862 break;
864 case4(054):
865 length += 8; /* MOV reg64/imm */
866 break;
868 case4(060):
869 length += 2;
870 break;
872 case4(064):
873 if (opx->type & (BITS16 | BITS32 | BITS64))
874 length += (opx->type & BITS16) ? 2 : 4;
875 else
876 length += (bits == 16) ? 2 : 4;
877 break;
879 case4(070):
880 length += 4;
881 break;
883 case4(074):
884 length += 2;
885 break;
887 case4(0140):
888 length += is_sbyte16(opx) ? 1 : 2;
889 break;
891 case4(0144):
892 codes++;
893 length++;
894 break;
896 case4(0150):
897 length += is_sbyte32(opx) ? 1 : 4;
898 break;
900 case4(0154):
901 codes++;
902 length++;
903 break;
905 case4(0160):
906 length++;
907 ins->rex |= REX_D;
908 ins->drexdst = regval(opx);
909 break;
911 case4(0164):
912 length++;
913 ins->rex |= REX_D|REX_OC;
914 ins->drexdst = regval(opx);
915 break;
917 case 0171:
918 break;
920 case 0172:
921 case 0173:
922 case 0174:
923 codes++;
924 length++;
925 break;
927 case4(0250):
928 length += is_sbyte32(opx) ? 1 : 4;
929 break;
931 case4(0254):
932 length += 4;
933 break;
935 case4(0260):
936 ins->rex |= REX_V;
937 ins->drexdst = regval(opx);
938 ins->vex_cm = *codes++;
939 ins->vex_wlp = *codes++;
940 break;
942 case 0270:
943 ins->rex |= REX_V;
944 ins->drexdst = 0;
945 ins->vex_cm = *codes++;
946 ins->vex_wlp = *codes++;
947 break;
949 case4(0274):
950 length++;
951 break;
953 case4(0300):
954 break;
956 case 0310:
957 if (bits == 64)
958 return -1;
959 length += (bits != 16) && !has_prefix(ins, PPS_ASIZE, P_A16);
960 break;
962 case 0311:
963 length += (bits != 32) && !has_prefix(ins, PPS_ASIZE, P_A32);
964 break;
966 case 0312:
967 break;
969 case 0313:
970 if (bits != 64 || has_prefix(ins, PPS_ASIZE, P_A16) ||
971 has_prefix(ins, PPS_ASIZE, P_A32))
972 return -1;
973 break;
975 case4(0314):
976 break;
978 case 0320:
980 enum prefixes pfx = ins->prefixes[PPS_OSIZE];
981 if (pfx == P_O16)
982 break;
983 if (pfx != P_none)
984 errfunc(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
985 else
986 ins->prefixes[PPS_OSIZE] = P_O16;
987 break;
990 case 0321:
992 enum prefixes pfx = ins->prefixes[PPS_OSIZE];
993 if (pfx == P_O32)
994 break;
995 if (pfx != P_none)
996 errfunc(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
997 else
998 ins->prefixes[PPS_OSIZE] = P_O32;
999 break;
1002 case 0322:
1003 break;
1005 case 0323:
1006 rex_mask &= ~REX_W;
1007 break;
1009 case 0324:
1010 ins->rex |= REX_W;
1011 break;
1013 case 0325:
1014 ins->rex |= REX_NH;
1015 break;
1017 case 0330:
1018 codes++, length++;
1019 break;
1021 case 0331:
1022 break;
1024 case 0332:
1025 case 0333:
1026 length++;
1027 break;
1029 case 0334:
1030 ins->rex |= REX_L;
1031 break;
1033 case 0335:
1034 break;
1036 case 0336:
1037 if (!ins->prefixes[PPS_LREP])
1038 ins->prefixes[PPS_LREP] = P_REP;
1039 break;
1041 case 0337:
1042 if (!ins->prefixes[PPS_LREP])
1043 ins->prefixes[PPS_LREP] = P_REPNE;
1044 break;
1046 case 0340:
1047 if (ins->oprs[0].segment != NO_SEG)
1048 errfunc(ERR_NONFATAL, "attempt to reserve non-constant"
1049 " quantity of BSS space");
1050 else
1051 length += ins->oprs[0].offset;
1052 break;
1054 case 0341:
1055 if (!ins->prefixes[PPS_WAIT])
1056 ins->prefixes[PPS_WAIT] = P_WAIT;
1057 break;
1059 case4(0344):
1060 length++;
1061 break;
1063 case 0360:
1064 break;
1066 case 0361:
1067 case 0362:
1068 case 0363:
1069 length++;
1070 break;
1072 case 0364:
1073 case 0365:
1074 break;
1076 case 0366:
1077 case 0367:
1078 length++;
1079 break;
1081 case 0370:
1082 case 0371:
1083 case 0372:
1084 break;
1086 case 0373:
1087 length++;
1088 break;
1090 case4(0100):
1091 case4(0110):
1092 case4(0120):
1093 case4(0130):
1094 case4(0200):
1095 case4(0204):
1096 case4(0210):
1097 case4(0214):
1098 case4(0220):
1099 case4(0224):
1100 case4(0230):
1101 case4(0234):
1103 ea ea_data;
1104 int rfield;
1105 opflags_t rflags;
1106 struct operand *opy = &ins->oprs[op2];
1108 ea_data.rex = 0; /* Ensure ea.REX is initially 0 */
1110 if (c <= 0177) {
1111 /* pick rfield from operand b (opx) */
1112 rflags = regflag(opx);
1113 rfield = nasm_regvals[opx->basereg];
1114 } else {
1115 rflags = 0;
1116 rfield = c & 7;
1118 if (!process_ea(opy, &ea_data, bits,
1119 ins->addr_size, rfield, rflags)) {
1120 errfunc(ERR_NONFATAL, "invalid effective address");
1121 return -1;
1122 } else {
1123 ins->rex |= ea_data.rex;
1124 length += ea_data.size;
1127 break;
1129 default:
1130 errfunc(ERR_PANIC, "internal instruction table corrupt"
1131 ": instruction code \\%o (0x%02X) given", c, c);
1132 break;
1136 ins->rex &= rex_mask;
1138 if (ins->rex & REX_NH) {
1139 if (ins->rex & REX_H) {
1140 errfunc(ERR_NONFATAL, "instruction cannot use high registers");
1141 return -1;
1143 ins->rex &= ~REX_P; /* Don't force REX prefix due to high reg */
1146 if (ins->rex & REX_V) {
1147 int bad32 = REX_R|REX_W|REX_X|REX_B;
1149 if (ins->rex & REX_H) {
1150 errfunc(ERR_NONFATAL, "cannot use high register in vex instruction");
1151 return -1;
1153 switch (ins->vex_wlp & 060) {
1154 case 000:
1155 case 040:
1156 ins->rex &= ~REX_W;
1157 break;
1158 case 020:
1159 ins->rex |= REX_W;
1160 bad32 &= ~REX_W;
1161 break;
1162 case 060:
1163 /* Follow REX_W */
1164 break;
1167 if (bits != 64 && ((ins->rex & bad32) || ins->drexdst > 7)) {
1168 errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
1169 return -1;
1171 if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B)))
1172 length += 3;
1173 else
1174 length += 2;
1175 } else if (ins->rex & REX_D) {
1176 if (ins->rex & REX_H) {
1177 errfunc(ERR_NONFATAL, "cannot use high register in drex instruction");
1178 return -1;
1180 if (bits != 64 && ((ins->rex & (REX_R|REX_W|REX_X|REX_B)) ||
1181 ins->drexdst > 7)) {
1182 errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
1183 return -1;
1185 length++;
1186 } else if (ins->rex & REX_REAL) {
1187 if (ins->rex & REX_H) {
1188 errfunc(ERR_NONFATAL, "cannot use high register in rex instruction");
1189 return -1;
1190 } else if (bits == 64) {
1191 length++;
1192 } else if ((ins->rex & REX_L) &&
1193 !(ins->rex & (REX_P|REX_W|REX_X|REX_B)) &&
1194 cpu >= IF_X86_64) {
1195 /* LOCK-as-REX.R */
1196 assert_no_prefix(ins, PPS_LREP);
1197 length++;
1198 } else {
1199 errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
1200 return -1;
1204 return length;
1207 #define EMIT_REX() \
1208 if (!(ins->rex & (REX_D|REX_V)) && (ins->rex & REX_REAL) && (bits == 64)) { \
1209 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1210 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1211 ins->rex = 0; \
1212 offset += 1; \
1215 static void gencode(int32_t segment, int64_t offset, int bits,
1216 insn * ins, const struct itemplate *temp,
1217 int64_t insn_end)
1219 static char condval[] = { /* conditional opcodes */
1220 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1221 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1222 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1224 uint8_t c;
1225 uint8_t bytes[4];
1226 int64_t size;
1227 int64_t data;
1228 int op1, op2;
1229 struct operand *opx;
1230 const uint8_t *codes = temp->code;
1231 uint8_t opex = 0;
1233 while (*codes) {
1234 c = *codes++;
1235 op1 = (c & 3) + ((opex & 1) << 2);
1236 op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
1237 opx = &ins->oprs[op1];
1238 opex = 0; /* For the next iteration */
1240 switch (c) {
1241 case 01:
1242 case 02:
1243 case 03:
1244 case 04:
1245 EMIT_REX();
1246 out(offset, segment, codes, OUT_RAWDATA, c, NO_SEG, NO_SEG);
1247 codes += c;
1248 offset += c;
1249 break;
1251 case 05:
1252 case 06:
1253 case 07:
1254 opex = c;
1255 break;
1257 case4(010):
1258 EMIT_REX();
1259 bytes[0] = *codes++ + (regval(opx) & 7);
1260 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1261 offset += 1;
1262 break;
1264 case4(014):
1266 * The test for BITS8 and SBYTE here is intended to avoid
1267 * warning on optimizer actions due to SBYTE, while still
1268 * warn on explicit BYTE directives. Also warn, obviously,
1269 * if the optimizer isn't enabled.
1271 if (((opx->type & BITS8) ||
1272 !(opx->type & temp->opd[op1] & BYTENESS)) &&
1273 (opx->offset < -128 || opx->offset > 127)) {
1274 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1275 "signed byte value exceeds bounds");
1277 if (opx->segment != NO_SEG) {
1278 data = opx->offset;
1279 out(offset, segment, &data, OUT_ADDRESS, 1,
1280 opx->segment, opx->wrt);
1281 } else {
1282 bytes[0] = opx->offset;
1283 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1284 NO_SEG);
1286 offset += 1;
1287 break;
1289 case4(020):
1290 if (opx->offset < -256 || opx->offset > 255) {
1291 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1292 "byte value exceeds bounds");
1294 if (opx->segment != NO_SEG) {
1295 data = opx->offset;
1296 out(offset, segment, &data, OUT_ADDRESS, 1,
1297 opx->segment, opx->wrt);
1298 } else {
1299 bytes[0] = opx->offset;
1300 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1301 NO_SEG);
1303 offset += 1;
1304 break;
1306 case4(024):
1307 if (opx->offset < 0 || opx->offset > 255)
1308 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1309 "unsigned byte value exceeds bounds");
1310 if (opx->segment != NO_SEG) {
1311 data = opx->offset;
1312 out(offset, segment, &data, OUT_ADDRESS, 1,
1313 opx->segment, opx->wrt);
1314 } else {
1315 bytes[0] = opx->offset;
1316 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1317 NO_SEG);
1319 offset += 1;
1320 break;
1322 case4(030):
1323 warn_overflow_opd(opx, 2);
1324 data = opx->offset;
1325 out(offset, segment, &data, OUT_ADDRESS, 2,
1326 opx->segment, opx->wrt);
1327 offset += 2;
1328 break;
1330 case4(034):
1331 if (opx->type & (BITS16 | BITS32))
1332 size = (opx->type & BITS16) ? 2 : 4;
1333 else
1334 size = (bits == 16) ? 2 : 4;
1335 warn_overflow_opd(opx, size);
1336 data = opx->offset;
1337 out(offset, segment, &data, OUT_ADDRESS, size,
1338 opx->segment, opx->wrt);
1339 offset += size;
1340 break;
1342 case4(040):
1343 warn_overflow_opd(opx, 4);
1344 data = opx->offset;
1345 out(offset, segment, &data, OUT_ADDRESS, 4,
1346 opx->segment, opx->wrt);
1347 offset += 4;
1348 break;
1350 case4(044):
1351 data = opx->offset;
1352 size = ins->addr_size >> 3;
1353 warn_overflow_opd(opx, size);
1354 out(offset, segment, &data, OUT_ADDRESS, size,
1355 opx->segment, opx->wrt);
1356 offset += size;
1357 break;
1359 case4(050):
1360 if (opx->segment != segment) {
1361 data = opx->offset;
1362 out(offset, segment, &data,
1363 OUT_REL1ADR, insn_end - offset,
1364 opx->segment, opx->wrt);
1365 } else {
1366 data = opx->offset - insn_end;
1367 if (data > 127 || data < -128)
1368 errfunc(ERR_NONFATAL, "short jump is out of range");
1369 out(offset, segment, &data,
1370 OUT_ADDRESS, 1, NO_SEG, NO_SEG);
1372 offset += 1;
1373 break;
1375 case4(054):
1376 data = (int64_t)opx->offset;
1377 out(offset, segment, &data, OUT_ADDRESS, 8,
1378 opx->segment, opx->wrt);
1379 offset += 8;
1380 break;
1382 case4(060):
1383 if (opx->segment != segment) {
1384 data = opx->offset;
1385 out(offset, segment, &data,
1386 OUT_REL2ADR, insn_end - offset,
1387 opx->segment, opx->wrt);
1388 } else {
1389 data = opx->offset - insn_end;
1390 out(offset, segment, &data,
1391 OUT_ADDRESS, 2, NO_SEG, NO_SEG);
1393 offset += 2;
1394 break;
1396 case4(064):
1397 if (opx->type & (BITS16 | BITS32 | BITS64))
1398 size = (opx->type & BITS16) ? 2 : 4;
1399 else
1400 size = (bits == 16) ? 2 : 4;
1401 if (opx->segment != segment) {
1402 data = opx->offset;
1403 out(offset, segment, &data,
1404 size == 2 ? OUT_REL2ADR : OUT_REL4ADR,
1405 insn_end - offset, opx->segment, opx->wrt);
1406 } else {
1407 data = opx->offset - insn_end;
1408 out(offset, segment, &data,
1409 OUT_ADDRESS, size, NO_SEG, NO_SEG);
1411 offset += size;
1412 break;
1414 case4(070):
1415 if (opx->segment != segment) {
1416 data = opx->offset;
1417 out(offset, segment, &data,
1418 OUT_REL4ADR, insn_end - offset,
1419 opx->segment, opx->wrt);
1420 } else {
1421 data = opx->offset - insn_end;
1422 out(offset, segment, &data,
1423 OUT_ADDRESS, 4, NO_SEG, NO_SEG);
1425 offset += 4;
1426 break;
1428 case4(074):
1429 if (opx->segment == NO_SEG)
1430 errfunc(ERR_NONFATAL, "value referenced by FAR is not"
1431 " relocatable");
1432 data = 0;
1433 out(offset, segment, &data, OUT_ADDRESS, 2,
1434 outfmt->segbase(1 + opx->segment),
1435 opx->wrt);
1436 offset += 2;
1437 break;
1439 case4(0140):
1440 data = opx->offset;
1441 warn_overflow_opd(opx, 2);
1442 if (is_sbyte16(opx)) {
1443 bytes[0] = data;
1444 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1445 NO_SEG);
1446 offset++;
1447 } else {
1448 out(offset, segment, &data, OUT_ADDRESS, 2,
1449 opx->segment, opx->wrt);
1450 offset += 2;
1452 break;
1454 case4(0144):
1455 EMIT_REX();
1456 bytes[0] = *codes++;
1457 if (is_sbyte16(opx))
1458 bytes[0] |= 2; /* s-bit */
1459 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1460 offset++;
1461 break;
1463 case4(0150):
1464 data = opx->offset;
1465 warn_overflow_opd(opx, 4);
1466 if (is_sbyte32(opx)) {
1467 bytes[0] = data;
1468 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1469 NO_SEG);
1470 offset++;
1471 } else {
1472 out(offset, segment, &data, OUT_ADDRESS, 4,
1473 opx->segment, opx->wrt);
1474 offset += 4;
1476 break;
1478 case4(0154):
1479 EMIT_REX();
1480 bytes[0] = *codes++;
1481 if (is_sbyte32(opx))
1482 bytes[0] |= 2; /* s-bit */
1483 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1484 offset++;
1485 break;
1487 case4(0160):
1488 case4(0164):
1489 break;
1491 case 0171:
1492 bytes[0] =
1493 (ins->drexdst << 4) |
1494 (ins->rex & REX_OC ? 0x08 : 0) |
1495 (ins->rex & (REX_R|REX_X|REX_B));
1496 ins->rex = 0;
1497 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1498 offset++;
1499 break;
1501 case 0172:
1502 c = *codes++;
1503 opx = &ins->oprs[c >> 3];
1504 bytes[0] = nasm_regvals[opx->basereg] << 4;
1505 opx = &ins->oprs[c & 7];
1506 if (opx->segment != NO_SEG || opx->wrt != NO_SEG) {
1507 errfunc(ERR_NONFATAL,
1508 "non-absolute expression not permitted as argument %d",
1509 c & 7);
1510 } else {
1511 if (opx->offset & ~15) {
1512 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1513 "four-bit argument exceeds bounds");
1515 bytes[0] |= opx->offset & 15;
1517 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1518 offset++;
1519 break;
1521 case 0173:
1522 c = *codes++;
1523 opx = &ins->oprs[c >> 4];
1524 bytes[0] = nasm_regvals[opx->basereg] << 4;
1525 bytes[0] |= c & 15;
1526 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1527 offset++;
1528 break;
1530 case 0174:
1531 c = *codes++;
1532 opx = &ins->oprs[c];
1533 bytes[0] = nasm_regvals[opx->basereg] << 4;
1534 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1535 offset++;
1536 break;
1538 case4(0250):
1539 data = opx->offset;
1540 if (opx->wrt == NO_SEG && opx->segment == NO_SEG &&
1541 (int32_t)data != (int64_t)data) {
1542 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1543 "signed dword immediate exceeds bounds");
1545 if (is_sbyte32(opx)) {
1546 bytes[0] = data;
1547 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1548 NO_SEG);
1549 offset++;
1550 } else {
1551 out(offset, segment, &data, OUT_ADDRESS, 4,
1552 opx->segment, opx->wrt);
1553 offset += 4;
1555 break;
1557 case4(0254):
1558 data = opx->offset;
1559 if (opx->wrt == NO_SEG && opx->segment == NO_SEG &&
1560 (int32_t)data != (int64_t)data) {
1561 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1562 "signed dword immediate exceeds bounds");
1564 out(offset, segment, &data, OUT_ADDRESS, 4,
1565 opx->segment, opx->wrt);
1566 offset += 4;
1567 break;
1569 case4(0260):
1570 case 0270:
1571 codes += 2;
1572 if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B))) {
1573 bytes[0] = (ins->vex_cm >> 6) ? 0x8f : 0xc4;
1574 bytes[1] = (ins->vex_cm & 31) | ((~ins->rex & 7) << 5);
1575 bytes[2] = ((ins->rex & REX_W) << (7-3)) |
1576 ((~ins->drexdst & 15)<< 3) | (ins->vex_wlp & 07);
1577 out(offset, segment, &bytes, OUT_RAWDATA, 3, NO_SEG, NO_SEG);
1578 offset += 3;
1579 } else {
1580 bytes[0] = 0xc5;
1581 bytes[1] = ((~ins->rex & REX_R) << (7-2)) |
1582 ((~ins->drexdst & 15) << 3) | (ins->vex_wlp & 07);
1583 out(offset, segment, &bytes, OUT_RAWDATA, 2, NO_SEG, NO_SEG);
1584 offset += 2;
1586 break;
1588 case4(0274):
1590 uint64_t uv, um;
1591 int s;
1593 if (ins->rex & REX_W)
1594 s = 64;
1595 else if (ins->prefixes[PPS_OSIZE] == P_O16)
1596 s = 16;
1597 else if (ins->prefixes[PPS_OSIZE] == P_O32)
1598 s = 32;
1599 else
1600 s = bits;
1602 um = (uint64_t)2 << (s-1);
1603 uv = opx->offset;
1605 if (uv > 127 && uv < (uint64_t)-128 &&
1606 (uv < um-128 || uv > um-1)) {
1607 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1608 "signed byte value exceeds bounds");
1610 if (opx->segment != NO_SEG) {
1611 data = uv;
1612 out(offset, segment, &data, OUT_ADDRESS, 1,
1613 opx->segment, opx->wrt);
1614 } else {
1615 bytes[0] = uv;
1616 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1617 NO_SEG);
1619 offset += 1;
1620 break;
1623 case4(0300):
1624 break;
1626 case 0310:
1627 if (bits == 32 && !has_prefix(ins, PPS_ASIZE, P_A16)) {
1628 *bytes = 0x67;
1629 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1630 offset += 1;
1631 } else
1632 offset += 0;
1633 break;
1635 case 0311:
1636 if (bits != 32 && !has_prefix(ins, PPS_ASIZE, P_A32)) {
1637 *bytes = 0x67;
1638 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1639 offset += 1;
1640 } else
1641 offset += 0;
1642 break;
1644 case 0312:
1645 break;
1647 case 0313:
1648 ins->rex = 0;
1649 break;
1651 case4(0314):
1652 break;
1654 case 0320:
1655 case 0321:
1656 break;
1658 case 0322:
1659 case 0323:
1660 break;
1662 case 0324:
1663 ins->rex |= REX_W;
1664 break;
1666 case 0325:
1667 break;
1669 case 0330:
1670 *bytes = *codes++ ^ condval[ins->condition];
1671 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1672 offset += 1;
1673 break;
1675 case 0331:
1676 break;
1678 case 0332:
1679 case 0333:
1680 *bytes = c - 0332 + 0xF2;
1681 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1682 offset += 1;
1683 break;
1685 case 0334:
1686 if (ins->rex & REX_R) {
1687 *bytes = 0xF0;
1688 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1689 offset += 1;
1691 ins->rex &= ~(REX_L|REX_R);
1692 break;
1694 case 0335:
1695 break;
1697 case 0336:
1698 case 0337:
1699 break;
1701 case 0340:
1702 if (ins->oprs[0].segment != NO_SEG)
1703 errfunc(ERR_PANIC, "non-constant BSS size in pass two");
1704 else {
1705 int64_t size = ins->oprs[0].offset;
1706 if (size > 0)
1707 out(offset, segment, NULL,
1708 OUT_RESERVE, size, NO_SEG, NO_SEG);
1709 offset += size;
1711 break;
1713 case 0341:
1714 break;
1716 case 0344:
1717 case 0345:
1718 bytes[0] = c & 1;
1719 switch (ins->oprs[0].basereg) {
1720 case R_CS:
1721 bytes[0] += 0x0E;
1722 break;
1723 case R_DS:
1724 bytes[0] += 0x1E;
1725 break;
1726 case R_ES:
1727 bytes[0] += 0x06;
1728 break;
1729 case R_SS:
1730 bytes[0] += 0x16;
1731 break;
1732 default:
1733 errfunc(ERR_PANIC,
1734 "bizarre 8086 segment register received");
1736 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1737 offset++;
1738 break;
1740 case 0346:
1741 case 0347:
1742 bytes[0] = c & 1;
1743 switch (ins->oprs[0].basereg) {
1744 case R_FS:
1745 bytes[0] += 0xA0;
1746 break;
1747 case R_GS:
1748 bytes[0] += 0xA8;
1749 break;
1750 default:
1751 errfunc(ERR_PANIC,
1752 "bizarre 386 segment register received");
1754 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1755 offset++;
1756 break;
1758 case 0360:
1759 break;
1761 case 0361:
1762 bytes[0] = 0x66;
1763 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1764 offset += 1;
1765 break;
1767 case 0362:
1768 case 0363:
1769 bytes[0] = c - 0362 + 0xf2;
1770 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1771 offset += 1;
1772 break;
1774 case 0364:
1775 case 0365:
1776 break;
1778 case 0366:
1779 case 0367:
1780 *bytes = c - 0366 + 0x66;
1781 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1782 offset += 1;
1783 break;
1785 case 0370:
1786 case 0371:
1787 case 0372:
1788 break;
1790 case 0373:
1791 *bytes = bits == 16 ? 3 : 5;
1792 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1793 offset += 1;
1794 break;
1796 case4(0100):
1797 case4(0110):
1798 case4(0120):
1799 case4(0130):
1800 case4(0200):
1801 case4(0204):
1802 case4(0210):
1803 case4(0214):
1804 case4(0220):
1805 case4(0224):
1806 case4(0230):
1807 case4(0234):
1809 ea ea_data;
1810 int rfield;
1811 opflags_t rflags;
1812 uint8_t *p;
1813 int32_t s;
1814 enum out_type type;
1815 struct operand *opy = &ins->oprs[op2];
1817 if (c <= 0177) {
1818 /* pick rfield from operand b (opx) */
1819 rflags = regflag(opx);
1820 rfield = nasm_regvals[opx->basereg];
1821 } else {
1822 /* rfield is constant */
1823 rflags = 0;
1824 rfield = c & 7;
1827 if (!process_ea(opy, &ea_data, bits, ins->addr_size,
1828 rfield, rflags)) {
1829 errfunc(ERR_NONFATAL, "invalid effective address");
1833 p = bytes;
1834 *p++ = ea_data.modrm;
1835 if (ea_data.sib_present)
1836 *p++ = ea_data.sib;
1838 /* DREX suffixes come between the SIB and the displacement */
1839 if (ins->rex & REX_D) {
1840 *p++ = (ins->drexdst << 4) |
1841 (ins->rex & REX_OC ? 0x08 : 0) |
1842 (ins->rex & (REX_R|REX_X|REX_B));
1843 ins->rex = 0;
1846 s = p - bytes;
1847 out(offset, segment, bytes, OUT_RAWDATA, s, NO_SEG, NO_SEG);
1850 * Make sure the address gets the right offset in case
1851 * the line breaks in the .lst file (BR 1197827)
1853 offset += s;
1854 s = 0;
1856 switch (ea_data.bytes) {
1857 case 0:
1858 break;
1859 case 1:
1860 case 2:
1861 case 4:
1862 case 8:
1863 data = opy->offset;
1864 s += ea_data.bytes;
1865 if (ea_data.rip) {
1866 if (opy->segment == segment) {
1867 data -= insn_end;
1868 if (overflow_signed(data, ea_data.bytes))
1869 warn_overflow(ERR_PASS2, ea_data.bytes);
1870 out(offset, segment, &data, OUT_ADDRESS,
1871 ea_data.bytes, NO_SEG, NO_SEG);
1872 } else {
1873 /* overflow check in output/linker? */
1874 out(offset, segment, &data, OUT_REL4ADR,
1875 insn_end - offset, opy->segment, opy->wrt);
1877 } else {
1878 if (overflow_general(opy->offset, ins->addr_size >> 3) ||
1879 signed_bits(opy->offset, ins->addr_size) !=
1880 signed_bits(opy->offset, ea_data.bytes * 8))
1881 warn_overflow(ERR_PASS2, ea_data.bytes);
1883 type = OUT_ADDRESS;
1884 out(offset, segment, &data, OUT_ADDRESS,
1885 ea_data.bytes, opy->segment, opy->wrt);
1887 break;
1888 default:
1889 /* Impossible! */
1890 errfunc(ERR_PANIC,
1891 "Invalid amount of bytes (%d) for offset?!",
1892 ea_data.bytes);
1893 break;
1895 offset += s;
1897 break;
1899 default:
1900 errfunc(ERR_PANIC, "internal instruction table corrupt"
1901 ": instruction code \\%o (0x%02X) given", c, c);
1902 break;
1907 static opflags_t regflag(const operand * o)
1909 if (!is_register(o->basereg))
1910 errfunc(ERR_PANIC, "invalid operand passed to regflag()");
1911 return nasm_reg_flags[o->basereg];
1914 static int32_t regval(const operand * o)
1916 if (!is_register(o->basereg))
1917 errfunc(ERR_PANIC, "invalid operand passed to regval()");
1918 return nasm_regvals[o->basereg];
1921 static int op_rexflags(const operand * o, int mask)
1923 opflags_t flags;
1924 int val;
1926 if (!is_register(o->basereg))
1927 errfunc(ERR_PANIC, "invalid operand passed to op_rexflags()");
1929 flags = nasm_reg_flags[o->basereg];
1930 val = nasm_regvals[o->basereg];
1932 return rexflags(val, flags, mask);
1935 static int rexflags(int val, opflags_t flags, int mask)
1937 int rex = 0;
1939 if (val >= 8)
1940 rex |= REX_B|REX_X|REX_R;
1941 if (flags & BITS64)
1942 rex |= REX_W;
1943 if (!(REG_HIGH & ~flags)) /* AH, CH, DH, BH */
1944 rex |= REX_H;
1945 else if (!(REG8 & ~flags) && val >= 4) /* SPL, BPL, SIL, DIL */
1946 rex |= REX_P;
1948 return rex & mask;
1951 static enum match_result find_match(const struct itemplate **tempp,
1952 insn *instruction,
1953 int32_t segment, int64_t offset, int bits)
1955 const struct itemplate *temp;
1956 enum match_result m, merr;
1957 opflags_t xsizeflags[MAX_OPERANDS];
1958 bool opsizemissing = false;
1959 int i;
1961 for (i = 0; i < instruction->operands; i++)
1962 xsizeflags[i] = instruction->oprs[i].type & SIZE_MASK;
1964 merr = MERR_INVALOP;
1966 for (temp = nasm_instructions[instruction->opcode];
1967 temp->opcode != I_none; temp++) {
1968 m = matches(temp, instruction, bits);
1969 if (m == MOK_JUMP) {
1970 if (jmp_match(segment, offset, bits, instruction, temp->code))
1971 m = MOK_GOOD;
1972 else
1973 m = MERR_INVALOP;
1974 } else if (m == MERR_OPSIZEMISSING &&
1975 (temp->flags & IF_SMASK) != IF_SX) {
1977 * Missing operand size and a candidate for fuzzy matching...
1979 for (i = 0; i < temp->operands; i++) {
1980 if ((temp->opd[i] & SAME_AS) == 0)
1981 xsizeflags[i] |= temp->opd[i] & SIZE_MASK;
1983 opsizemissing = true;
1985 if (m > merr)
1986 merr = m;
1987 if (merr == MOK_GOOD)
1988 goto done;
1991 /* No match, but see if we can get a fuzzy operand size match... */
1992 if (!opsizemissing)
1993 goto done;
1995 for (i = 0; i < instruction->operands; i++) {
1997 * We ignore extrinsic operand sizes on registers, so we should
1998 * never try to fuzzy-match on them. This also resolves the case
1999 * when we have e.g. "xmmrm128" in two different positions.
2001 if (is_class(REGISTER, instruction->oprs[i].type))
2002 continue;
2004 /* This tests if xsizeflags[i] has more than one bit set */
2005 if ((xsizeflags[i] & (xsizeflags[i]-1)))
2006 goto done; /* No luck */
2008 instruction->oprs[i].type |= xsizeflags[i]; /* Set the size */
2011 /* Try matching again... */
2012 for (temp = nasm_instructions[instruction->opcode];
2013 temp->opcode != I_none; temp++) {
2014 m = matches(temp, instruction, bits);
2015 if (m == MOK_JUMP) {
2016 if (jmp_match(segment, offset, bits, instruction, temp->code))
2017 m = MOK_GOOD;
2018 else
2019 m = MERR_INVALOP;
2021 if (m > merr)
2022 merr = m;
2023 if (merr == MOK_GOOD)
2024 goto done;
2027 done:
2028 *tempp = temp;
2029 return merr;
2032 static enum match_result matches(const struct itemplate *itemp,
2033 insn *instruction, int bits)
2035 int i, size[MAX_OPERANDS], asize, oprs;
2036 bool opsizemissing = false;
2039 * Check the opcode
2041 if (itemp->opcode != instruction->opcode)
2042 return MERR_INVALOP;
2045 * Count the operands
2047 if (itemp->operands != instruction->operands)
2048 return MERR_INVALOP;
2051 * Is it legal?
2053 if (!(optimizing > 0) && (itemp->flags & IF_OPT))
2054 return MERR_INVALOP;
2057 * Check that no spurious colons or TOs are present
2059 for (i = 0; i < itemp->operands; i++)
2060 if (instruction->oprs[i].type & ~itemp->opd[i] & (COLON | TO))
2061 return MERR_INVALOP;
2064 * Process size flags
2066 switch (itemp->flags & IF_SMASK) {
2067 case IF_SB:
2068 asize = BITS8;
2069 break;
2070 case IF_SW:
2071 asize = BITS16;
2072 break;
2073 case IF_SD:
2074 asize = BITS32;
2075 break;
2076 case IF_SQ:
2077 asize = BITS64;
2078 break;
2079 case IF_SO:
2080 asize = BITS128;
2081 break;
2082 case IF_SY:
2083 asize = BITS256;
2084 break;
2085 case IF_SZ:
2086 switch (bits) {
2087 case 16:
2088 asize = BITS16;
2089 break;
2090 case 32:
2091 asize = BITS32;
2092 break;
2093 case 64:
2094 asize = BITS64;
2095 break;
2096 default:
2097 asize = 0;
2098 break;
2100 break;
2101 default:
2102 asize = 0;
2103 break;
2106 if (itemp->flags & IF_ARMASK) {
2107 /* S- flags only apply to a specific operand */
2108 i = ((itemp->flags & IF_ARMASK) >> IF_ARSHFT) - 1;
2109 memset(size, 0, sizeof size);
2110 size[i] = asize;
2111 } else {
2112 /* S- flags apply to all operands */
2113 for (i = 0; i < MAX_OPERANDS; i++)
2114 size[i] = asize;
2118 * Check that the operand flags all match up,
2119 * it's a bit tricky so lets be verbose:
2121 * 1) Find out the size of operand. If instruction
2122 * doesn't have one specified -- we're trying to
2123 * guess it either from template (IF_S* flag) or
2124 * from code bits.
2126 * 2) If template operand (i) has SAME_AS flag [used for registers only]
2127 * (ie the same operand as was specified somewhere in template, and
2128 * this referred operand index is being achieved via ~SAME_AS)
2129 * we are to be sure that both registers (in template and instruction)
2130 * do exactly match.
2132 * 3) If template operand do not match the instruction OR
2133 * template has an operand size specified AND this size differ
2134 * from which instruction has (perhaps we got it from code bits)
2135 * we are:
2136 * a) Check that only size of instruction and operand is differ
2137 * other characteristics do match
2138 * b) Perhaps it's a register specified in instruction so
2139 * for such a case we just mark that operand as "size
2140 * missing" and this will turn on fuzzy operand size
2141 * logic facility (handled by a caller)
2143 for (i = 0; i < itemp->operands; i++) {
2144 opflags_t type = instruction->oprs[i].type;
2145 if (!(type & SIZE_MASK))
2146 type |= size[i];
2148 if (itemp->opd[i] & SAME_AS) {
2149 int j = itemp->opd[i] & ~SAME_AS;
2150 if (type != instruction->oprs[j].type ||
2151 instruction->oprs[i].basereg != instruction->oprs[j].basereg)
2152 return MERR_INVALOP;
2153 } else if (itemp->opd[i] & ~type ||
2154 ((itemp->opd[i] & SIZE_MASK) &&
2155 ((itemp->opd[i] ^ type) & SIZE_MASK))) {
2156 if ((itemp->opd[i] & ~type & ~SIZE_MASK) || (type & SIZE_MASK)) {
2157 return MERR_INVALOP;
2158 } else if (!is_class(REGISTER, type)) {
2160 * Note: we don't honor extrinsic operand sizes for registers,
2161 * so "missing operand size" for a register should be
2162 * considered a wildcard match rather than an error.
2164 opsizemissing = true;
2169 if (opsizemissing)
2170 return MERR_OPSIZEMISSING;
2173 * Check operand sizes
2175 if (itemp->flags & (IF_SM | IF_SM2)) {
2176 oprs = (itemp->flags & IF_SM2 ? 2 : itemp->operands);
2177 for (i = 0; i < oprs; i++) {
2178 asize = itemp->opd[i] & SIZE_MASK;
2179 if (asize) {
2180 for (i = 0; i < oprs; i++)
2181 size[i] = asize;
2182 break;
2185 } else {
2186 oprs = itemp->operands;
2189 for (i = 0; i < itemp->operands; i++) {
2190 if (!(itemp->opd[i] & SIZE_MASK) &&
2191 (instruction->oprs[i].type & SIZE_MASK & ~size[i]))
2192 return MERR_OPSIZEMISMATCH;
2196 * Check template is okay at the set cpu level
2198 if (((itemp->flags & IF_PLEVEL) > cpu))
2199 return MERR_BADCPU;
2202 * Verify the appropriate long mode flag.
2204 if ((itemp->flags & (bits == 64 ? IF_NOLONG : IF_LONG)))
2205 return MERR_BADMODE;
2208 * Check if special handling needed for Jumps
2210 if ((itemp->code[0] & 0374) == 0370)
2211 return MOK_JUMP;
2213 return MOK_GOOD;
2216 static ea *process_ea(operand * input, ea * output, int bits,
2217 int addrbits, int rfield, opflags_t rflags)
2219 bool forw_ref = !!(input->opflags & OPFLAG_UNKNOWN);
2221 output->rip = false;
2223 /* REX flags for the rfield operand */
2224 output->rex |= rexflags(rfield, rflags, REX_R | REX_P | REX_W | REX_H);
2226 if (is_class(REGISTER, input->type)) { /* register direct */
2227 int i;
2228 opflags_t f;
2230 if (!is_register(input->basereg))
2231 return NULL;
2232 f = regflag(input);
2233 i = nasm_regvals[input->basereg];
2235 if (REG_EA & ~f)
2236 return NULL; /* Invalid EA register */
2238 output->rex |= op_rexflags(input, REX_B | REX_P | REX_W | REX_H);
2240 output->sib_present = false; /* no SIB necessary */
2241 output->bytes = 0; /* no offset necessary either */
2242 output->modrm = 0xC0 | ((rfield & 7) << 3) | (i & 7);
2243 } else { /* it's a memory reference */
2244 if (input->basereg == -1 &&
2245 (input->indexreg == -1 || input->scale == 0)) {
2246 /* it's a pure offset */
2248 if (bits == 64 && ((input->type & IP_REL) == IP_REL) &&
2249 input->segment == NO_SEG) {
2250 nasm_error(ERR_WARNING | ERR_PASS1, "absolute address can not be RIP-relative");
2251 input->type &= ~IP_REL;
2252 input->type |= MEMORY;
2255 if (input->eaflags & EAF_BYTEOFFS ||
2256 (input->eaflags & EAF_WORDOFFS &&
2257 input->disp_size != (addrbits != 16 ? 32 : 16))) {
2258 nasm_error(ERR_WARNING | ERR_PASS1, "displacement size ignored on absolute address");
2261 if (bits == 64 && (~input->type & IP_REL)) {
2262 int scale, index, base;
2263 output->sib_present = true;
2264 scale = 0;
2265 index = 4;
2266 base = 5;
2267 output->sib = (scale << 6) | (index << 3) | base;
2268 output->bytes = 4;
2269 output->modrm = 4 | ((rfield & 7) << 3);
2270 output->rip = false;
2271 } else {
2272 output->sib_present = false;
2273 output->bytes = (addrbits != 16 ? 4 : 2);
2274 output->modrm = (addrbits != 16 ? 5 : 6) | ((rfield & 7) << 3);
2275 output->rip = bits == 64;
2277 } else { /* it's an indirection */
2278 int i = input->indexreg, b = input->basereg, s = input->scale;
2279 int32_t seg = input->segment;
2280 int hb = input->hintbase, ht = input->hinttype;
2281 int t, it, bt; /* register numbers */
2282 opflags_t x, ix, bx; /* register flags */
2284 if (s == 0)
2285 i = -1; /* make this easy, at least */
2287 if (is_register(i)) {
2288 it = nasm_regvals[i];
2289 ix = nasm_reg_flags[i];
2290 } else {
2291 it = -1;
2292 ix = 0;
2295 if (is_register(b)) {
2296 bt = nasm_regvals[b];
2297 bx = nasm_reg_flags[b];
2298 } else {
2299 bt = -1;
2300 bx = 0;
2303 /* check for a 32/64-bit memory reference... */
2304 if ((ix|bx) & (BITS32|BITS64)) {
2306 * it must be a 32/64-bit memory reference. Firstly we have
2307 * to check that all registers involved are type E/Rxx.
2309 int32_t sok = BITS32 | BITS64, o = input->offset;
2311 if (it != -1) {
2312 if (!(REG64 & ~ix) || !(REG32 & ~ix))
2313 sok &= ix;
2314 else
2315 return NULL;
2318 if (bt != -1) {
2319 if (REG_GPR & ~bx)
2320 return NULL; /* Invalid register */
2321 if (~sok & bx & SIZE_MASK)
2322 return NULL; /* Invalid size */
2323 sok &= bx;
2327 * While we're here, ensure the user didn't specify
2328 * WORD or QWORD
2330 if (input->disp_size == 16 || input->disp_size == 64)
2331 return NULL;
2333 if (addrbits == 16 ||
2334 (addrbits == 32 && !(sok & BITS32)) ||
2335 (addrbits == 64 && !(sok & BITS64)))
2336 return NULL;
2338 /* now reorganize base/index */
2339 if (s == 1 && bt != it && bt != -1 && it != -1 &&
2340 ((hb == b && ht == EAH_NOTBASE) ||
2341 (hb == i && ht == EAH_MAKEBASE))) {
2342 /* swap if hints say so */
2343 t = bt, bt = it, it = t;
2344 x = bx, bx = ix, ix = x;
2346 if (bt == it) /* convert EAX+2*EAX to 3*EAX */
2347 bt = -1, bx = 0, s++;
2348 if (bt == -1 && s == 1 && !(hb == it && ht == EAH_NOTBASE)) {
2349 /* make single reg base, unless hint */
2350 bt = it, bx = ix, it = -1, ix = 0;
2352 if (((s == 2 && it != REG_NUM_ESP && !(input->eaflags & EAF_TIMESTWO)) ||
2353 s == 3 || s == 5 || s == 9) && bt == -1)
2354 bt = it, bx = ix, s--; /* convert 3*EAX to EAX+2*EAX */
2355 if (it == -1 && (bt & 7) != REG_NUM_ESP &&
2356 (input->eaflags & EAF_TIMESTWO))
2357 it = bt, ix = bx, bt = -1, bx = 0, s = 1;
2358 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2359 if (s == 1 && it == REG_NUM_ESP) {
2360 /* swap ESP into base if scale is 1 */
2361 t = it, it = bt, bt = t;
2362 x = ix, ix = bx, bx = x;
2364 if (it == REG_NUM_ESP ||
2365 (s != 1 && s != 2 && s != 4 && s != 8 && it != -1))
2366 return NULL; /* wrong, for various reasons */
2368 output->rex |= rexflags(it, ix, REX_X);
2369 output->rex |= rexflags(bt, bx, REX_B);
2371 if (it == -1 && (bt & 7) != REG_NUM_ESP) {
2372 /* no SIB needed */
2373 int mod, rm;
2375 if (bt == -1) {
2376 rm = 5;
2377 mod = 0;
2378 } else {
2379 rm = (bt & 7);
2380 if (rm != REG_NUM_EBP && o == 0 &&
2381 seg == NO_SEG && !forw_ref &&
2382 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2383 mod = 0;
2384 else if (input->eaflags & EAF_BYTEOFFS ||
2385 (o >= -128 && o <= 127 &&
2386 seg == NO_SEG && !forw_ref &&
2387 !(input->eaflags & EAF_WORDOFFS)))
2388 mod = 1;
2389 else
2390 mod = 2;
2393 output->sib_present = false;
2394 output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
2395 output->modrm = (mod << 6) | ((rfield & 7) << 3) | rm;
2396 } else {
2397 /* we need a SIB */
2398 int mod, scale, index, base;
2400 if (it == -1)
2401 index = 4, s = 1;
2402 else
2403 index = (it & 7);
2405 switch (s) {
2406 case 1:
2407 scale = 0;
2408 break;
2409 case 2:
2410 scale = 1;
2411 break;
2412 case 4:
2413 scale = 2;
2414 break;
2415 case 8:
2416 scale = 3;
2417 break;
2418 default: /* then what the smeg is it? */
2419 return NULL; /* panic */
2422 if (bt == -1) {
2423 base = 5;
2424 mod = 0;
2425 } else {
2426 base = (bt & 7);
2427 if (base != REG_NUM_EBP && o == 0 &&
2428 seg == NO_SEG && !forw_ref &&
2429 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2430 mod = 0;
2431 else if (input->eaflags & EAF_BYTEOFFS ||
2432 (o >= -128 && o <= 127 &&
2433 seg == NO_SEG && !forw_ref &&
2434 !(input->eaflags & EAF_WORDOFFS)))
2435 mod = 1;
2436 else
2437 mod = 2;
2440 output->sib_present = true;
2441 output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
2442 output->modrm = (mod << 6) | ((rfield & 7) << 3) | 4;
2443 output->sib = (scale << 6) | (index << 3) | base;
2445 } else { /* it's 16-bit */
2446 int mod, rm;
2447 int16_t o = input->offset;
2449 /* check for 64-bit long mode */
2450 if (addrbits == 64)
2451 return NULL;
2453 /* check all registers are BX, BP, SI or DI */
2454 if ((b != -1 && b != R_BP && b != R_BX && b != R_SI && b != R_DI) ||
2455 (i != -1 && i != R_BP && i != R_BX && i != R_SI && i != R_DI))
2456 return NULL;
2458 /* ensure the user didn't specify DWORD/QWORD */
2459 if (input->disp_size == 32 || input->disp_size == 64)
2460 return NULL;
2462 if (s != 1 && i != -1)
2463 return NULL; /* no can do, in 16-bit EA */
2464 if (b == -1 && i != -1) {
2465 int tmp = b;
2466 b = i;
2467 i = tmp;
2468 } /* swap */
2469 if ((b == R_SI || b == R_DI) && i != -1) {
2470 int tmp = b;
2471 b = i;
2472 i = tmp;
2474 /* have BX/BP as base, SI/DI index */
2475 if (b == i)
2476 return NULL; /* shouldn't ever happen, in theory */
2477 if (i != -1 && b != -1 &&
2478 (i == R_BP || i == R_BX || b == R_SI || b == R_DI))
2479 return NULL; /* invalid combinations */
2480 if (b == -1) /* pure offset: handled above */
2481 return NULL; /* so if it gets to here, panic! */
2483 rm = -1;
2484 if (i != -1)
2485 switch (i * 256 + b) {
2486 case R_SI * 256 + R_BX:
2487 rm = 0;
2488 break;
2489 case R_DI * 256 + R_BX:
2490 rm = 1;
2491 break;
2492 case R_SI * 256 + R_BP:
2493 rm = 2;
2494 break;
2495 case R_DI * 256 + R_BP:
2496 rm = 3;
2497 break;
2498 } else
2499 switch (b) {
2500 case R_SI:
2501 rm = 4;
2502 break;
2503 case R_DI:
2504 rm = 5;
2505 break;
2506 case R_BP:
2507 rm = 6;
2508 break;
2509 case R_BX:
2510 rm = 7;
2511 break;
2513 if (rm == -1) /* can't happen, in theory */
2514 return NULL; /* so panic if it does */
2516 if (o == 0 && seg == NO_SEG && !forw_ref && rm != 6 &&
2517 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2518 mod = 0;
2519 else if (input->eaflags & EAF_BYTEOFFS ||
2520 (o >= -128 && o <= 127 && seg == NO_SEG &&
2521 !forw_ref && !(input->eaflags & EAF_WORDOFFS)))
2522 mod = 1;
2523 else
2524 mod = 2;
2526 output->sib_present = false; /* no SIB - it's 16-bit */
2527 output->bytes = mod; /* bytes of offset needed */
2528 output->modrm = (mod << 6) | ((rfield & 7) << 3) | rm;
2533 output->size = 1 + output->sib_present + output->bytes;
2534 return output;
2537 static void add_asp(insn *ins, int addrbits)
2539 int j, valid;
2540 int defdisp;
2542 valid = (addrbits == 64) ? 64|32 : 32|16;
2544 switch (ins->prefixes[PPS_ASIZE]) {
2545 case P_A16:
2546 valid &= 16;
2547 break;
2548 case P_A32:
2549 valid &= 32;
2550 break;
2551 case P_A64:
2552 valid &= 64;
2553 break;
2554 case P_ASP:
2555 valid &= (addrbits == 32) ? 16 : 32;
2556 break;
2557 default:
2558 break;
2561 for (j = 0; j < ins->operands; j++) {
2562 if (is_class(MEMORY, ins->oprs[j].type)) {
2563 opflags_t i, b;
2565 /* Verify as Register */
2566 if (!is_register(ins->oprs[j].indexreg))
2567 i = 0;
2568 else
2569 i = nasm_reg_flags[ins->oprs[j].indexreg];
2571 /* Verify as Register */
2572 if (!is_register(ins->oprs[j].basereg))
2573 b = 0;
2574 else
2575 b = nasm_reg_flags[ins->oprs[j].basereg];
2577 if (ins->oprs[j].scale == 0)
2578 i = 0;
2580 if (!i && !b) {
2581 int ds = ins->oprs[j].disp_size;
2582 if ((addrbits != 64 && ds > 8) ||
2583 (addrbits == 64 && ds == 16))
2584 valid &= ds;
2585 } else {
2586 if (!(REG16 & ~b))
2587 valid &= 16;
2588 if (!(REG32 & ~b))
2589 valid &= 32;
2590 if (!(REG64 & ~b))
2591 valid &= 64;
2593 if (!(REG16 & ~i))
2594 valid &= 16;
2595 if (!(REG32 & ~i))
2596 valid &= 32;
2597 if (!(REG64 & ~i))
2598 valid &= 64;
2603 if (valid & addrbits) {
2604 ins->addr_size = addrbits;
2605 } else if (valid & ((addrbits == 32) ? 16 : 32)) {
2606 /* Add an address size prefix */
2607 enum prefixes pref = (addrbits == 32) ? P_A16 : P_A32;
2608 ins->prefixes[PPS_ASIZE] = pref;
2609 ins->addr_size = (addrbits == 32) ? 16 : 32;
2610 } else {
2611 /* Impossible... */
2612 errfunc(ERR_NONFATAL, "impossible combination of address sizes");
2613 ins->addr_size = addrbits; /* Error recovery */
2616 defdisp = ins->addr_size == 16 ? 16 : 32;
2618 for (j = 0; j < ins->operands; j++) {
2619 if (!(MEM_OFFS & ~ins->oprs[j].type) &&
2620 (ins->oprs[j].disp_size ? ins->oprs[j].disp_size : defdisp) != ins->addr_size) {
2622 * mem_offs sizes must match the address size; if not,
2623 * strip the MEM_OFFS bit and match only EA instructions
2625 ins->oprs[j].type &= ~(MEM_OFFS & ~MEMORY);