HLE: Implement the basic mechanism for XACQUIRE/XRELEASE
[nasm.git] / assemble.c
blob06fba53b6243924fd923617df056405aeb067e1b
1 /* ----------------------------------------------------------------------- *
3 * Copyright 1996-2012 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 * \172\ab - the register number from operand a in bits 7..4, with
70 * the 4-bit immediate from operand b in bits 3..0.
71 * \173\xab - the register number from operand a in bits 7..4, with
72 * the value b in bits 3..0.
73 * \174..\177 - the register number from operand 0..3 in bits 7..4, and
74 * an arbitrary value in bits 3..0 (assembled as zero.)
75 * \2ab - a ModRM, calculated on EA in operand a, with the spare
76 * field equal to digit b.
77 * \250..\253 - same as \150..\153, except warn if the 64-bit operand
78 * is not equal to the truncated and sign-extended 32-bit
79 * operand; used for 32-bit immediates in 64-bit mode.
80 * \254..\257 - a signed 32-bit operand to be extended to 64 bits.
81 * \260..\263 - this instruction uses VEX/XOP rather than REX, with the
82 * V field taken from operand 0..3.
83 * \270 - this instruction uses VEX/XOP rather than REX, with the
84 * V field set to 1111b.
86 * VEX/XOP prefixes are followed by the sequence:
87 * \tmm\wlp where mm is the M field; and wlp is:
88 * 00 wwl lpp
89 * [l0] ll = 0 for L = 0 (.128, .lz)
90 * [l1] ll = 1 for L = 1 (.256)
91 * [lig] ll = 2 for L don't care (always assembled as 0)
93 * [w0] ww = 0 for W = 0
94 * [w1 ] ww = 1 for W = 1
95 * [wig] ww = 2 for W don't care (always assembled as 0)
96 * [ww] ww = 3 for W used as REX.W
98 * t = 0 for VEX (C4/C5), t = 1 for XOP (8F).
100 * \271 - instruction takes XRELEASE (F3) with or without lock
101 * \272 - instruction takes XACQUIRE/XRELEASE with or without lock
102 * \273 - instruction takes XACQUIRE/XRELEASE with lock only
103 * \274..\277 - a signed byte immediate operand, from operand 0..3,
104 * which is to be extended to the operand size.
105 * \310 - indicates fixed 16-bit address size, i.e. optional 0x67.
106 * \311 - indicates fixed 32-bit address size, i.e. optional 0x67.
107 * \312 - (disassembler only) invalid with non-default address size.
108 * \313 - indicates fixed 64-bit address size, 0x67 invalid.
109 * \314 - (disassembler only) invalid with REX.B
110 * \315 - (disassembler only) invalid with REX.X
111 * \316 - (disassembler only) invalid with REX.R
112 * \317 - (disassembler only) invalid with REX.W
113 * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66.
114 * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66.
115 * \322 - indicates that this instruction is only valid when the
116 * operand size is the default (instruction to disassembler,
117 * generates no code in the assembler)
118 * \323 - indicates fixed 64-bit operand size, REX on extensions only.
119 * \324 - indicates 64-bit operand size requiring REX prefix.
120 * \325 - instruction which always uses spl/bpl/sil/dil
121 * \330 - a literal byte follows in the code stream, to be added
122 * to the condition code value of the instruction.
123 * \331 - instruction not valid with REP prefix. Hint for
124 * disassembler only; for SSE instructions.
125 * \332 - REP prefix (0xF2 byte) used as opcode extension.
126 * \333 - REP prefix (0xF3 byte) used as opcode extension.
127 * \334 - LOCK prefix used as REX.R (used in non-64-bit mode)
128 * \335 - disassemble a rep (0xF3 byte) prefix as repe not rep.
129 * \336 - force a REP(E) prefix (0xF2) even if not specified.
130 * \337 - force a REPNE prefix (0xF3) even if not specified.
131 * \336-\337 are still listed as prefixes in the disassembler.
132 * \340 - reserve <operand 0> bytes of uninitialized storage.
133 * Operand 0 had better be a segmentless constant.
134 * \341 - this instruction needs a WAIT "prefix"
135 * \344,\345 - the PUSH/POP (respectively) codes for CS, DS, ES, SS
136 * (POP is never used for CS) depending on operand 0
137 * \346,\347 - the second byte of PUSH/POP codes for FS, GS, depending
138 * on operand 0
139 * \360 - no SSE prefix (== \364\331)
140 * \361 - 66 SSE prefix (== \366\331)
141 * \362 - F2 SSE prefix (== \364\332)
142 * \363 - F3 SSE prefix (== \364\333)
143 * \364 - operand-size prefix (0x66) not permitted
144 * \365 - address-size prefix (0x67) not permitted
145 * \366 - operand-size prefix (0x66) used as opcode extension
146 * \367 - address-size prefix (0x67) used as opcode extension
147 * \370,\371,\372 - match only if operand 0 meets byte jump criteria.
148 * 370 is used for Jcc, 371 is used for JMP.
149 * \373 - assemble 0x03 if bits==16, 0x05 if bits==32;
150 * used for conditional jump over longer jump
151 * \374 - this instruction takes an XMM VSIB memory EA
152 * \375 - this instruction takes an YMM VSIB memory EA
155 #include "compiler.h"
157 #include <stdio.h>
158 #include <string.h>
159 #include <inttypes.h>
161 #include "nasm.h"
162 #include "nasmlib.h"
163 #include "assemble.h"
164 #include "insns.h"
165 #include "tables.h"
167 enum match_result {
169 * Matching errors. These should be sorted so that more specific
170 * errors come later in the sequence.
172 MERR_INVALOP,
173 MERR_OPSIZEMISSING,
174 MERR_OPSIZEMISMATCH,
175 MERR_BADCPU,
176 MERR_BADMODE,
178 * Matching success; the conditional ones first
180 MOK_JUMP, /* Matching OK but needs jmp_match() */
181 MOK_GOOD /* Matching unconditionally OK */
184 typedef struct {
185 enum ea_type type; /* what kind of EA is this? */
186 int sib_present; /* is a SIB byte necessary? */
187 int bytes; /* # of bytes of offset needed */
188 int size; /* lazy - this is sib+bytes+1 */
189 uint8_t modrm, sib, rex, rip; /* the bytes themselves */
190 } ea;
192 #define GEN_SIB(scale, index, base) \
193 (((scale) << 6) | ((index) << 3) | ((base)))
195 #define GEN_MODRM(mod, reg, rm) \
196 (((mod) << 6) | (((reg) & 7) << 3) | ((rm) & 7))
198 static uint32_t cpu; /* cpu level received from nasm.c */
199 static efunc errfunc;
200 static struct ofmt *outfmt;
201 static ListGen *list;
203 static int64_t calcsize(int32_t, int64_t, int, insn *, const uint8_t *);
204 static void gencode(int32_t segment, int64_t offset, int bits,
205 insn * ins, const struct itemplate *temp,
206 int64_t insn_end);
207 static enum match_result find_match(const struct itemplate **tempp,
208 insn *instruction,
209 int32_t segment, int64_t offset, int bits);
210 static enum match_result matches(const struct itemplate *, insn *, int bits);
211 static opflags_t regflag(const operand *);
212 static int32_t regval(const operand *);
213 static int rexflags(int, opflags_t, int);
214 static int op_rexflags(const operand *, int);
215 static void add_asp(insn *, int);
217 static enum ea_type process_ea(operand *, ea *, int, int, int, opflags_t);
219 static int has_prefix(insn * ins, enum prefix_pos pos, int prefix)
221 return ins->prefixes[pos] == prefix;
224 static void assert_no_prefix(insn * ins, enum prefix_pos pos)
226 if (ins->prefixes[pos])
227 errfunc(ERR_NONFATAL, "invalid %s prefix",
228 prefix_name(ins->prefixes[pos]));
231 static const char *size_name(int size)
233 switch (size) {
234 case 1:
235 return "byte";
236 case 2:
237 return "word";
238 case 4:
239 return "dword";
240 case 8:
241 return "qword";
242 case 10:
243 return "tword";
244 case 16:
245 return "oword";
246 case 32:
247 return "yword";
248 default:
249 return "???";
253 static void warn_overflow(int pass, int size)
255 errfunc(ERR_WARNING | pass | ERR_WARN_NOV,
256 "%s data exceeds bounds", size_name(size));
259 static void warn_overflow_const(int64_t data, int size)
261 if (overflow_general(data, size))
262 warn_overflow(ERR_PASS1, size);
265 static void warn_overflow_opd(const struct operand *o, int size)
267 if (o->wrt == NO_SEG && o->segment == NO_SEG) {
268 if (overflow_general(o->offset, size))
269 warn_overflow(ERR_PASS2, size);
274 * This routine wrappers the real output format's output routine,
275 * in order to pass a copy of the data off to the listing file
276 * generator at the same time.
278 static void out(int64_t offset, int32_t segto, const void *data,
279 enum out_type type, uint64_t size,
280 int32_t segment, int32_t wrt)
282 static int32_t lineno = 0; /* static!!! */
283 static char *lnfname = NULL;
284 uint8_t p[8];
286 if (type == OUT_ADDRESS && segment == NO_SEG && wrt == NO_SEG) {
288 * This is a non-relocated address, and we're going to
289 * convert it into RAWDATA format.
291 uint8_t *q = p;
293 if (size > 8) {
294 errfunc(ERR_PANIC, "OUT_ADDRESS with size > 8");
295 return;
298 WRITEADDR(q, *(int64_t *)data, size);
299 data = p;
300 type = OUT_RAWDATA;
303 list->output(offset, data, type, size);
306 * this call to src_get determines when we call the
307 * debug-format-specific "linenum" function
308 * it updates lineno and lnfname to the current values
309 * returning 0 if "same as last time", -2 if lnfname
310 * changed, and the amount by which lineno changed,
311 * if it did. thus, these variables must be static
314 if (src_get(&lineno, &lnfname))
315 outfmt->current_dfmt->linenum(lnfname, lineno, segto);
317 outfmt->output(segto, data, type, size, segment, wrt);
320 static bool jmp_match(int32_t segment, int64_t offset, int bits,
321 insn * ins, const uint8_t *code)
323 int64_t isize;
324 uint8_t c = code[0];
326 if ((c != 0370 && c != 0371) || (ins->oprs[0].type & STRICT))
327 return false;
328 if (!optimizing)
329 return false;
330 if (optimizing < 0 && c == 0371)
331 return false;
333 isize = calcsize(segment, offset, bits, ins, code);
335 if (ins->oprs[0].opflags & OPFLAG_UNKNOWN)
336 /* Be optimistic in pass 1 */
337 return true;
339 if (ins->oprs[0].segment != segment)
340 return false;
342 isize = ins->oprs[0].offset - offset - isize; /* isize is delta */
343 return (isize >= -128 && isize <= 127); /* is it byte size? */
346 int64_t assemble(int32_t segment, int64_t offset, int bits, uint32_t cp,
347 insn * instruction, struct ofmt *output, efunc error,
348 ListGen * listgen)
350 const struct itemplate *temp;
351 int j;
352 enum match_result m;
353 int64_t insn_end;
354 int32_t itimes;
355 int64_t start = offset;
356 int64_t wsize; /* size for DB etc. */
358 errfunc = error; /* to pass to other functions */
359 cpu = cp;
360 outfmt = output; /* likewise */
361 list = listgen; /* and again */
363 wsize = idata_bytes(instruction->opcode);
364 if (wsize == -1)
365 return 0;
367 if (wsize) {
368 extop *e;
369 int32_t t = instruction->times;
370 if (t < 0)
371 errfunc(ERR_PANIC,
372 "instruction->times < 0 (%ld) in assemble()", t);
374 while (t--) { /* repeat TIMES times */
375 list_for_each(e, instruction->eops) {
376 if (e->type == EOT_DB_NUMBER) {
377 if (wsize > 8) {
378 errfunc(ERR_NONFATAL,
379 "integer supplied to a DT, DO or DY"
380 " instruction");
381 } else {
382 out(offset, segment, &e->offset,
383 OUT_ADDRESS, wsize, e->segment, e->wrt);
384 offset += wsize;
386 } else if (e->type == EOT_DB_STRING ||
387 e->type == EOT_DB_STRING_FREE) {
388 int align;
390 out(offset, segment, e->stringval,
391 OUT_RAWDATA, e->stringlen, NO_SEG, NO_SEG);
392 align = e->stringlen % wsize;
394 if (align) {
395 align = wsize - align;
396 out(offset, segment, zero_buffer,
397 OUT_RAWDATA, align, NO_SEG, NO_SEG);
399 offset += e->stringlen + align;
402 if (t > 0 && t == instruction->times - 1) {
404 * Dummy call to list->output to give the offset to the
405 * listing module.
407 list->output(offset, NULL, OUT_RAWDATA, 0);
408 list->uplevel(LIST_TIMES);
411 if (instruction->times > 1)
412 list->downlevel(LIST_TIMES);
413 return offset - start;
416 if (instruction->opcode == I_INCBIN) {
417 const char *fname = instruction->eops->stringval;
418 FILE *fp;
420 fp = fopen(fname, "rb");
421 if (!fp) {
422 error(ERR_NONFATAL, "`incbin': unable to open file `%s'",
423 fname);
424 } else if (fseek(fp, 0L, SEEK_END) < 0) {
425 error(ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
426 fname);
427 } else {
428 static char buf[4096];
429 size_t t = instruction->times;
430 size_t base = 0;
431 size_t len;
433 len = ftell(fp);
434 if (instruction->eops->next) {
435 base = instruction->eops->next->offset;
436 len -= base;
437 if (instruction->eops->next->next &&
438 len > (size_t)instruction->eops->next->next->offset)
439 len = (size_t)instruction->eops->next->next->offset;
442 * Dummy call to list->output to give the offset to the
443 * listing module.
445 list->output(offset, NULL, OUT_RAWDATA, 0);
446 list->uplevel(LIST_INCBIN);
447 while (t--) {
448 size_t l;
450 fseek(fp, base, SEEK_SET);
451 l = len;
452 while (l > 0) {
453 int32_t m;
454 m = fread(buf, 1, l > sizeof(buf) ? sizeof(buf) : l, fp);
455 if (!m) {
457 * This shouldn't happen unless the file
458 * actually changes while we are reading
459 * it.
461 error(ERR_NONFATAL,
462 "`incbin': unexpected EOF while"
463 " reading file `%s'", fname);
464 t = 0; /* Try to exit cleanly */
465 break;
467 out(offset, segment, buf, OUT_RAWDATA, m,
468 NO_SEG, NO_SEG);
469 l -= m;
472 list->downlevel(LIST_INCBIN);
473 if (instruction->times > 1) {
475 * Dummy call to list->output to give the offset to the
476 * listing module.
478 list->output(offset, NULL, OUT_RAWDATA, 0);
479 list->uplevel(LIST_TIMES);
480 list->downlevel(LIST_TIMES);
482 fclose(fp);
483 return instruction->times * len;
485 return 0; /* if we're here, there's an error */
488 /* Check to see if we need an address-size prefix */
489 add_asp(instruction, bits);
491 m = find_match(&temp, instruction, segment, offset, bits);
493 if (m == MOK_GOOD) {
494 /* Matches! */
495 int64_t insn_size = calcsize(segment, offset, bits,
496 instruction, temp->code);
497 itimes = instruction->times;
498 if (insn_size < 0) /* shouldn't be, on pass two */
499 error(ERR_PANIC, "errors made it through from pass one");
500 else
501 while (itimes--) {
502 for (j = 0; j < MAXPREFIX; j++) {
503 uint8_t c = 0;
504 switch (instruction->prefixes[j]) {
505 case P_WAIT:
506 c = 0x9B;
507 break;
508 case P_LOCK:
509 c = 0xF0;
510 break;
511 case P_REPNE:
512 case P_REPNZ:
513 case P_XACQUIRE:
514 c = 0xF2;
515 break;
516 case P_REPE:
517 case P_REPZ:
518 case P_REP:
519 case P_XRELEASE:
520 c = 0xF3;
521 break;
522 case R_CS:
523 if (bits == 64) {
524 error(ERR_WARNING | ERR_PASS2,
525 "cs segment base generated, but will be ignored in 64-bit mode");
527 c = 0x2E;
528 break;
529 case R_DS:
530 if (bits == 64) {
531 error(ERR_WARNING | ERR_PASS2,
532 "ds segment base generated, but will be ignored in 64-bit mode");
534 c = 0x3E;
535 break;
536 case R_ES:
537 if (bits == 64) {
538 error(ERR_WARNING | ERR_PASS2,
539 "es segment base generated, but will be ignored in 64-bit mode");
541 c = 0x26;
542 break;
543 case R_FS:
544 c = 0x64;
545 break;
546 case R_GS:
547 c = 0x65;
548 break;
549 case R_SS:
550 if (bits == 64) {
551 error(ERR_WARNING | ERR_PASS2,
552 "ss segment base generated, but will be ignored in 64-bit mode");
554 c = 0x36;
555 break;
556 case R_SEGR6:
557 case R_SEGR7:
558 error(ERR_NONFATAL,
559 "segr6 and segr7 cannot be used as prefixes");
560 break;
561 case P_A16:
562 if (bits == 64) {
563 error(ERR_NONFATAL,
564 "16-bit addressing is not supported "
565 "in 64-bit mode");
566 } else if (bits != 16)
567 c = 0x67;
568 break;
569 case P_A32:
570 if (bits != 32)
571 c = 0x67;
572 break;
573 case P_A64:
574 if (bits != 64) {
575 error(ERR_NONFATAL,
576 "64-bit addressing is only supported "
577 "in 64-bit mode");
579 break;
580 case P_ASP:
581 c = 0x67;
582 break;
583 case P_O16:
584 if (bits != 16)
585 c = 0x66;
586 break;
587 case P_O32:
588 if (bits == 16)
589 c = 0x66;
590 break;
591 case P_O64:
592 /* REX.W */
593 break;
594 case P_OSP:
595 c = 0x66;
596 break;
597 case P_none:
598 break;
599 default:
600 error(ERR_PANIC, "invalid instruction prefix");
602 if (c != 0) {
603 out(offset, segment, &c, OUT_RAWDATA, 1,
604 NO_SEG, NO_SEG);
605 offset++;
608 insn_end = offset + insn_size;
609 gencode(segment, offset, bits, instruction,
610 temp, insn_end);
611 offset += insn_size;
612 if (itimes > 0 && itimes == instruction->times - 1) {
614 * Dummy call to list->output to give the offset to the
615 * listing module.
617 list->output(offset, NULL, OUT_RAWDATA, 0);
618 list->uplevel(LIST_TIMES);
621 if (instruction->times > 1)
622 list->downlevel(LIST_TIMES);
623 return offset - start;
624 } else {
625 /* No match */
626 switch (m) {
627 case MERR_OPSIZEMISSING:
628 error(ERR_NONFATAL, "operation size not specified");
629 break;
630 case MERR_OPSIZEMISMATCH:
631 error(ERR_NONFATAL, "mismatch in operand sizes");
632 break;
633 case MERR_BADCPU:
634 error(ERR_NONFATAL, "no instruction for this cpu level");
635 break;
636 case MERR_BADMODE:
637 error(ERR_NONFATAL, "instruction not supported in %d-bit mode",
638 bits);
639 break;
640 default:
641 error(ERR_NONFATAL,
642 "invalid combination of opcode and operands");
643 break;
646 return 0;
649 int64_t insn_size(int32_t segment, int64_t offset, int bits, uint32_t cp,
650 insn * instruction, efunc error)
652 const struct itemplate *temp;
653 enum match_result m;
655 errfunc = error; /* to pass to other functions */
656 cpu = cp;
658 if (instruction->opcode == I_none)
659 return 0;
661 if (instruction->opcode == I_DB || instruction->opcode == I_DW ||
662 instruction->opcode == I_DD || instruction->opcode == I_DQ ||
663 instruction->opcode == I_DT || instruction->opcode == I_DO ||
664 instruction->opcode == I_DY) {
665 extop *e;
666 int32_t isize, osize, wsize;
668 isize = 0;
669 wsize = idata_bytes(instruction->opcode);
671 list_for_each(e, instruction->eops) {
672 int32_t align;
674 osize = 0;
675 if (e->type == EOT_DB_NUMBER) {
676 osize = 1;
677 warn_overflow_const(e->offset, wsize);
678 } else if (e->type == EOT_DB_STRING ||
679 e->type == EOT_DB_STRING_FREE)
680 osize = e->stringlen;
682 align = (-osize) % wsize;
683 if (align < 0)
684 align += wsize;
685 isize += osize + align;
687 return isize * instruction->times;
690 if (instruction->opcode == I_INCBIN) {
691 const char *fname = instruction->eops->stringval;
692 FILE *fp;
693 int64_t val = 0;
694 size_t len;
696 fp = fopen(fname, "rb");
697 if (!fp)
698 error(ERR_NONFATAL, "`incbin': unable to open file `%s'",
699 fname);
700 else if (fseek(fp, 0L, SEEK_END) < 0)
701 error(ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
702 fname);
703 else {
704 len = ftell(fp);
705 if (instruction->eops->next) {
706 len -= instruction->eops->next->offset;
707 if (instruction->eops->next->next &&
708 len > (size_t)instruction->eops->next->next->offset) {
709 len = (size_t)instruction->eops->next->next->offset;
712 val = instruction->times * len;
714 if (fp)
715 fclose(fp);
716 return val;
719 /* Check to see if we need an address-size prefix */
720 add_asp(instruction, bits);
722 m = find_match(&temp, instruction, segment, offset, bits);
723 if (m == MOK_GOOD) {
724 /* we've matched an instruction. */
725 int64_t isize;
726 const uint8_t *codes = temp->code;
727 int j;
729 isize = calcsize(segment, offset, bits, instruction, codes);
730 if (isize < 0)
731 return -1;
732 for (j = 0; j < MAXPREFIX; j++) {
733 switch (instruction->prefixes[j]) {
734 case P_A16:
735 if (bits != 16)
736 isize++;
737 break;
738 case P_A32:
739 if (bits != 32)
740 isize++;
741 break;
742 case P_O16:
743 if (bits != 16)
744 isize++;
745 break;
746 case P_O32:
747 if (bits == 16)
748 isize++;
749 break;
750 case P_A64:
751 case P_O64:
752 case P_none:
753 break;
754 default:
755 isize++;
756 break;
759 return isize * instruction->times;
760 } else {
761 return -1; /* didn't match any instruction */
765 static bool possible_sbyte(operand *o)
767 return o->wrt == NO_SEG && o->segment == NO_SEG &&
768 !(o->opflags & OPFLAG_UNKNOWN) &&
769 optimizing >= 0 && !(o->type & STRICT);
772 /* check that opn[op] is a signed byte of size 16 or 32 */
773 static bool is_sbyte16(operand *o)
775 int16_t v;
777 if (!possible_sbyte(o))
778 return false;
780 v = o->offset;
781 return v >= -128 && v <= 127;
784 static bool is_sbyte32(operand *o)
786 int32_t v;
788 if (!possible_sbyte(o))
789 return false;
791 v = o->offset;
792 return v >= -128 && v <= 127;
795 static void bad_hle_warn(const insn * ins, uint8_t hleok)
797 enum prefixes rep_pfx = ins->prefixes[PPS_REP];
798 enum whatwarn { w_none, w_lock, w_inval };
799 static const enum whatwarn warn[2][4] =
801 { w_inval, w_inval, w_none, w_lock }, /* XACQUIRE */
802 { w_inval, w_none, w_none, w_lock }, /* XRELEASE */
804 unsigned int n;
806 n = (unsigned int)rep_pfx - P_XACQUIRE;
807 if (n > 1)
808 return; /* Not XACQUIRE/XRELEASE */
810 switch (warn[n][hleok]) {
811 case w_none:
812 break;
814 case w_lock:
815 if (ins->prefixes[PPS_LOCK] != P_LOCK) {
816 errfunc(ERR_WARNING | ERR_PASS2,
817 "%s with this instruction requires lock",
818 prefix_name(rep_pfx));
820 break;
822 case w_inval:
823 errfunc(ERR_WARNING | ERR_PASS2,
824 "%s invalid with this instruction",
825 prefix_name(rep_pfx));
826 break;
830 /* Common construct */
831 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
833 static int64_t calcsize(int32_t segment, int64_t offset, int bits,
834 insn * ins, const uint8_t *codes)
836 int64_t length = 0;
837 uint8_t c;
838 int rex_mask = ~0;
839 int op1, op2;
840 struct operand *opx;
841 uint8_t opex = 0;
842 enum ea_type eat;
843 uint8_t hleok = 0;
845 ins->rex = 0; /* Ensure REX is reset */
846 eat = EA_SCALAR; /* Expect a scalar EA */
848 if (ins->prefixes[PPS_OSIZE] == P_O64)
849 ins->rex |= REX_W;
851 (void)segment; /* Don't warn that this parameter is unused */
852 (void)offset; /* Don't warn that this parameter is unused */
854 while (*codes) {
855 c = *codes++;
856 op1 = (c & 3) + ((opex & 1) << 2);
857 op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
858 opx = &ins->oprs[op1];
859 opex = 0; /* For the next iteration */
861 switch (c) {
862 case 01:
863 case 02:
864 case 03:
865 case 04:
866 codes += c, length += c;
867 break;
869 case 05:
870 case 06:
871 case 07:
872 opex = c;
873 break;
875 case4(010):
876 ins->rex |=
877 op_rexflags(opx, REX_B|REX_H|REX_P|REX_W);
878 codes++, length++;
879 break;
881 case4(014):
882 case4(020):
883 case4(024):
884 length++;
885 break;
887 case4(030):
888 length += 2;
889 break;
891 case4(034):
892 if (opx->type & (BITS16 | BITS32 | BITS64))
893 length += (opx->type & BITS16) ? 2 : 4;
894 else
895 length += (bits == 16) ? 2 : 4;
896 break;
898 case4(040):
899 length += 4;
900 break;
902 case4(044):
903 length += ins->addr_size >> 3;
904 break;
906 case4(050):
907 length++;
908 break;
910 case4(054):
911 length += 8; /* MOV reg64/imm */
912 break;
914 case4(060):
915 length += 2;
916 break;
918 case4(064):
919 if (opx->type & (BITS16 | BITS32 | BITS64))
920 length += (opx->type & BITS16) ? 2 : 4;
921 else
922 length += (bits == 16) ? 2 : 4;
923 break;
925 case4(070):
926 length += 4;
927 break;
929 case4(074):
930 length += 2;
931 break;
933 case4(0140):
934 length += is_sbyte16(opx) ? 1 : 2;
935 break;
937 case4(0144):
938 codes++;
939 length++;
940 break;
942 case4(0150):
943 length += is_sbyte32(opx) ? 1 : 4;
944 break;
946 case4(0154):
947 codes++;
948 length++;
949 break;
951 case 0172:
952 case 0173:
953 codes++;
954 length++;
955 break;
957 case4(0174):
958 length++;
959 break;
961 case4(0250):
962 length += is_sbyte32(opx) ? 1 : 4;
963 break;
965 case4(0254):
966 length += 4;
967 break;
969 case4(0260):
970 ins->rex |= REX_V;
971 ins->vexreg = regval(opx);
972 ins->vex_cm = *codes++;
973 ins->vex_wlp = *codes++;
974 break;
976 case 0270:
977 ins->rex |= REX_V;
978 ins->vexreg = 0;
979 ins->vex_cm = *codes++;
980 ins->vex_wlp = *codes++;
981 break;
983 case 0271:
984 case 0272:
985 case 0273:
986 hleok = c & 3;
987 break;
989 case4(0274):
990 length++;
991 break;
993 case4(0300):
994 break;
996 case 0310:
997 if (bits == 64)
998 return -1;
999 length += (bits != 16) && !has_prefix(ins, PPS_ASIZE, P_A16);
1000 break;
1002 case 0311:
1003 length += (bits != 32) && !has_prefix(ins, PPS_ASIZE, P_A32);
1004 break;
1006 case 0312:
1007 break;
1009 case 0313:
1010 if (bits != 64 || has_prefix(ins, PPS_ASIZE, P_A16) ||
1011 has_prefix(ins, PPS_ASIZE, P_A32))
1012 return -1;
1013 break;
1015 case4(0314):
1016 break;
1018 case 0320:
1020 enum prefixes pfx = ins->prefixes[PPS_OSIZE];
1021 if (pfx == P_O16)
1022 break;
1023 if (pfx != P_none)
1024 errfunc(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
1025 else
1026 ins->prefixes[PPS_OSIZE] = P_O16;
1027 break;
1030 case 0321:
1032 enum prefixes pfx = ins->prefixes[PPS_OSIZE];
1033 if (pfx == P_O32)
1034 break;
1035 if (pfx != P_none)
1036 errfunc(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
1037 else
1038 ins->prefixes[PPS_OSIZE] = P_O32;
1039 break;
1042 case 0322:
1043 break;
1045 case 0323:
1046 rex_mask &= ~REX_W;
1047 break;
1049 case 0324:
1050 ins->rex |= REX_W;
1051 break;
1053 case 0325:
1054 ins->rex |= REX_NH;
1055 break;
1057 case 0330:
1058 codes++, length++;
1059 break;
1061 case 0331:
1062 break;
1064 case 0332:
1065 case 0333:
1066 length++;
1067 break;
1069 case 0334:
1070 ins->rex |= REX_L;
1071 break;
1073 case 0335:
1074 break;
1076 case 0336:
1077 if (!ins->prefixes[PPS_REP])
1078 ins->prefixes[PPS_REP] = P_REP;
1079 break;
1081 case 0337:
1082 if (!ins->prefixes[PPS_REP])
1083 ins->prefixes[PPS_REP] = P_REPNE;
1084 break;
1086 case 0340:
1087 if (ins->oprs[0].segment != NO_SEG)
1088 errfunc(ERR_NONFATAL, "attempt to reserve non-constant"
1089 " quantity of BSS space");
1090 else
1091 length += ins->oprs[0].offset;
1092 break;
1094 case 0341:
1095 if (!ins->prefixes[PPS_WAIT])
1096 ins->prefixes[PPS_WAIT] = P_WAIT;
1097 break;
1099 case4(0344):
1100 length++;
1101 break;
1103 case 0360:
1104 break;
1106 case 0361:
1107 case 0362:
1108 case 0363:
1109 length++;
1110 break;
1112 case 0364:
1113 case 0365:
1114 break;
1116 case 0366:
1117 case 0367:
1118 length++;
1119 break;
1121 case 0370:
1122 case 0371:
1123 case 0372:
1124 break;
1126 case 0373:
1127 length++;
1128 break;
1130 case 0374:
1131 eat = EA_XMMVSIB;
1132 break;
1134 case 0375:
1135 eat = EA_YMMVSIB;
1136 break;
1138 case4(0100):
1139 case4(0110):
1140 case4(0120):
1141 case4(0130):
1142 case4(0200):
1143 case4(0204):
1144 case4(0210):
1145 case4(0214):
1146 case4(0220):
1147 case4(0224):
1148 case4(0230):
1149 case4(0234):
1151 ea ea_data;
1152 int rfield;
1153 opflags_t rflags;
1154 struct operand *opy = &ins->oprs[op2];
1156 ea_data.rex = 0; /* Ensure ea.REX is initially 0 */
1158 if (c <= 0177) {
1159 /* pick rfield from operand b (opx) */
1160 rflags = regflag(opx);
1161 rfield = nasm_regvals[opx->basereg];
1162 } else {
1163 rflags = 0;
1164 rfield = c & 7;
1166 if (process_ea(opy, &ea_data, bits,ins->addr_size,
1167 rfield, rflags) != eat) {
1168 errfunc(ERR_NONFATAL, "invalid effective address");
1169 return -1;
1170 } else {
1171 ins->rex |= ea_data.rex;
1172 length += ea_data.size;
1175 break;
1177 default:
1178 errfunc(ERR_PANIC, "internal instruction table corrupt"
1179 ": instruction code \\%o (0x%02X) given", c, c);
1180 break;
1184 ins->rex &= rex_mask;
1186 if (ins->rex & REX_NH) {
1187 if (ins->rex & REX_H) {
1188 errfunc(ERR_NONFATAL, "instruction cannot use high registers");
1189 return -1;
1191 ins->rex &= ~REX_P; /* Don't force REX prefix due to high reg */
1194 if (ins->rex & REX_V) {
1195 int bad32 = REX_R|REX_W|REX_X|REX_B;
1197 if (ins->rex & REX_H) {
1198 errfunc(ERR_NONFATAL, "cannot use high register in vex instruction");
1199 return -1;
1201 switch (ins->vex_wlp & 060) {
1202 case 000:
1203 case 040:
1204 ins->rex &= ~REX_W;
1205 break;
1206 case 020:
1207 ins->rex |= REX_W;
1208 bad32 &= ~REX_W;
1209 break;
1210 case 060:
1211 /* Follow REX_W */
1212 break;
1215 if (bits != 64 && ((ins->rex & bad32) || ins->vexreg > 7)) {
1216 errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
1217 return -1;
1219 if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B)))
1220 length += 3;
1221 else
1222 length += 2;
1223 } else if (ins->rex & REX_REAL) {
1224 if (ins->rex & REX_H) {
1225 errfunc(ERR_NONFATAL, "cannot use high register in rex instruction");
1226 return -1;
1227 } else if (bits == 64) {
1228 length++;
1229 } else if ((ins->rex & REX_L) &&
1230 !(ins->rex & (REX_P|REX_W|REX_X|REX_B)) &&
1231 cpu >= IF_X86_64) {
1232 /* LOCK-as-REX.R */
1233 assert_no_prefix(ins, PPS_LOCK);
1234 length++;
1235 } else {
1236 errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
1237 return -1;
1241 bad_hle_warn(ins, hleok);
1243 return length;
1246 #define EMIT_REX() \
1247 if (!(ins->rex & REX_V) && (ins->rex & REX_REAL) && (bits == 64)) { \
1248 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1249 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1250 ins->rex = 0; \
1251 offset += 1; \
1254 static void gencode(int32_t segment, int64_t offset, int bits,
1255 insn * ins, const struct itemplate *temp,
1256 int64_t insn_end)
1258 static const char condval[] = { /* conditional opcodes */
1259 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1260 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1261 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1263 uint8_t c;
1264 uint8_t bytes[4];
1265 int64_t size;
1266 int64_t data;
1267 int op1, op2;
1268 struct operand *opx;
1269 const uint8_t *codes = temp->code;
1270 uint8_t opex = 0;
1271 enum ea_type eat = EA_SCALAR;
1273 while (*codes) {
1274 c = *codes++;
1275 op1 = (c & 3) + ((opex & 1) << 2);
1276 op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
1277 opx = &ins->oprs[op1];
1278 opex = 0; /* For the next iteration */
1280 switch (c) {
1281 case 01:
1282 case 02:
1283 case 03:
1284 case 04:
1285 EMIT_REX();
1286 out(offset, segment, codes, OUT_RAWDATA, c, NO_SEG, NO_SEG);
1287 codes += c;
1288 offset += c;
1289 break;
1291 case 05:
1292 case 06:
1293 case 07:
1294 opex = c;
1295 break;
1297 case4(010):
1298 EMIT_REX();
1299 bytes[0] = *codes++ + (regval(opx) & 7);
1300 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1301 offset += 1;
1302 break;
1304 case4(014):
1306 * The test for BITS8 and SBYTE here is intended to avoid
1307 * warning on optimizer actions due to SBYTE, while still
1308 * warn on explicit BYTE directives. Also warn, obviously,
1309 * if the optimizer isn't enabled.
1311 if (((opx->type & BITS8) ||
1312 !(opx->type & temp->opd[op1] & BYTENESS)) &&
1313 (opx->offset < -128 || opx->offset > 127)) {
1314 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1315 "signed byte value exceeds bounds");
1317 if (opx->segment != NO_SEG) {
1318 data = opx->offset;
1319 out(offset, segment, &data, OUT_ADDRESS, 1,
1320 opx->segment, opx->wrt);
1321 } else {
1322 bytes[0] = opx->offset;
1323 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1324 NO_SEG);
1326 offset += 1;
1327 break;
1329 case4(020):
1330 if (opx->offset < -256 || opx->offset > 255) {
1331 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1332 "byte value exceeds bounds");
1334 if (opx->segment != NO_SEG) {
1335 data = opx->offset;
1336 out(offset, segment, &data, OUT_ADDRESS, 1,
1337 opx->segment, opx->wrt);
1338 } else {
1339 bytes[0] = opx->offset;
1340 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1341 NO_SEG);
1343 offset += 1;
1344 break;
1346 case4(024):
1347 if (opx->offset < 0 || opx->offset > 255)
1348 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1349 "unsigned byte value exceeds bounds");
1350 if (opx->segment != NO_SEG) {
1351 data = opx->offset;
1352 out(offset, segment, &data, OUT_ADDRESS, 1,
1353 opx->segment, opx->wrt);
1354 } else {
1355 bytes[0] = opx->offset;
1356 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1357 NO_SEG);
1359 offset += 1;
1360 break;
1362 case4(030):
1363 warn_overflow_opd(opx, 2);
1364 data = opx->offset;
1365 out(offset, segment, &data, OUT_ADDRESS, 2,
1366 opx->segment, opx->wrt);
1367 offset += 2;
1368 break;
1370 case4(034):
1371 if (opx->type & (BITS16 | BITS32))
1372 size = (opx->type & BITS16) ? 2 : 4;
1373 else
1374 size = (bits == 16) ? 2 : 4;
1375 warn_overflow_opd(opx, size);
1376 data = opx->offset;
1377 out(offset, segment, &data, OUT_ADDRESS, size,
1378 opx->segment, opx->wrt);
1379 offset += size;
1380 break;
1382 case4(040):
1383 warn_overflow_opd(opx, 4);
1384 data = opx->offset;
1385 out(offset, segment, &data, OUT_ADDRESS, 4,
1386 opx->segment, opx->wrt);
1387 offset += 4;
1388 break;
1390 case4(044):
1391 data = opx->offset;
1392 size = ins->addr_size >> 3;
1393 warn_overflow_opd(opx, size);
1394 out(offset, segment, &data, OUT_ADDRESS, size,
1395 opx->segment, opx->wrt);
1396 offset += size;
1397 break;
1399 case4(050):
1400 if (opx->segment != segment) {
1401 data = opx->offset;
1402 out(offset, segment, &data,
1403 OUT_REL1ADR, insn_end - offset,
1404 opx->segment, opx->wrt);
1405 } else {
1406 data = opx->offset - insn_end;
1407 if (data > 127 || data < -128)
1408 errfunc(ERR_NONFATAL, "short jump is out of range");
1409 out(offset, segment, &data,
1410 OUT_ADDRESS, 1, NO_SEG, NO_SEG);
1412 offset += 1;
1413 break;
1415 case4(054):
1416 data = (int64_t)opx->offset;
1417 out(offset, segment, &data, OUT_ADDRESS, 8,
1418 opx->segment, opx->wrt);
1419 offset += 8;
1420 break;
1422 case4(060):
1423 if (opx->segment != segment) {
1424 data = opx->offset;
1425 out(offset, segment, &data,
1426 OUT_REL2ADR, insn_end - offset,
1427 opx->segment, opx->wrt);
1428 } else {
1429 data = opx->offset - insn_end;
1430 out(offset, segment, &data,
1431 OUT_ADDRESS, 2, NO_SEG, NO_SEG);
1433 offset += 2;
1434 break;
1436 case4(064):
1437 if (opx->type & (BITS16 | BITS32 | BITS64))
1438 size = (opx->type & BITS16) ? 2 : 4;
1439 else
1440 size = (bits == 16) ? 2 : 4;
1441 if (opx->segment != segment) {
1442 data = opx->offset;
1443 out(offset, segment, &data,
1444 size == 2 ? OUT_REL2ADR : OUT_REL4ADR,
1445 insn_end - offset, opx->segment, opx->wrt);
1446 } else {
1447 data = opx->offset - insn_end;
1448 out(offset, segment, &data,
1449 OUT_ADDRESS, size, NO_SEG, NO_SEG);
1451 offset += size;
1452 break;
1454 case4(070):
1455 if (opx->segment != segment) {
1456 data = opx->offset;
1457 out(offset, segment, &data,
1458 OUT_REL4ADR, insn_end - offset,
1459 opx->segment, opx->wrt);
1460 } else {
1461 data = opx->offset - insn_end;
1462 out(offset, segment, &data,
1463 OUT_ADDRESS, 4, NO_SEG, NO_SEG);
1465 offset += 4;
1466 break;
1468 case4(074):
1469 if (opx->segment == NO_SEG)
1470 errfunc(ERR_NONFATAL, "value referenced by FAR is not"
1471 " relocatable");
1472 data = 0;
1473 out(offset, segment, &data, OUT_ADDRESS, 2,
1474 outfmt->segbase(1 + opx->segment),
1475 opx->wrt);
1476 offset += 2;
1477 break;
1479 case4(0140):
1480 data = opx->offset;
1481 warn_overflow_opd(opx, 2);
1482 if (is_sbyte16(opx)) {
1483 bytes[0] = data;
1484 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1485 NO_SEG);
1486 offset++;
1487 } else {
1488 out(offset, segment, &data, OUT_ADDRESS, 2,
1489 opx->segment, opx->wrt);
1490 offset += 2;
1492 break;
1494 case4(0144):
1495 EMIT_REX();
1496 bytes[0] = *codes++;
1497 if (is_sbyte16(opx))
1498 bytes[0] |= 2; /* s-bit */
1499 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1500 offset++;
1501 break;
1503 case4(0150):
1504 data = opx->offset;
1505 warn_overflow_opd(opx, 4);
1506 if (is_sbyte32(opx)) {
1507 bytes[0] = data;
1508 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1509 NO_SEG);
1510 offset++;
1511 } else {
1512 out(offset, segment, &data, OUT_ADDRESS, 4,
1513 opx->segment, opx->wrt);
1514 offset += 4;
1516 break;
1518 case4(0154):
1519 EMIT_REX();
1520 bytes[0] = *codes++;
1521 if (is_sbyte32(opx))
1522 bytes[0] |= 2; /* s-bit */
1523 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1524 offset++;
1525 break;
1527 case 0172:
1528 c = *codes++;
1529 opx = &ins->oprs[c >> 3];
1530 bytes[0] = nasm_regvals[opx->basereg] << 4;
1531 opx = &ins->oprs[c & 7];
1532 if (opx->segment != NO_SEG || opx->wrt != NO_SEG) {
1533 errfunc(ERR_NONFATAL,
1534 "non-absolute expression not permitted as argument %d",
1535 c & 7);
1536 } else {
1537 if (opx->offset & ~15) {
1538 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1539 "four-bit argument exceeds bounds");
1541 bytes[0] |= opx->offset & 15;
1543 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1544 offset++;
1545 break;
1547 case 0173:
1548 c = *codes++;
1549 opx = &ins->oprs[c >> 4];
1550 bytes[0] = nasm_regvals[opx->basereg] << 4;
1551 bytes[0] |= c & 15;
1552 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1553 offset++;
1554 break;
1556 case4(0174):
1557 bytes[0] = nasm_regvals[opx->basereg] << 4;
1558 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1559 offset++;
1560 break;
1562 case4(0250):
1563 data = opx->offset;
1564 if (opx->wrt == NO_SEG && opx->segment == NO_SEG &&
1565 (int32_t)data != (int64_t)data) {
1566 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1567 "signed dword immediate exceeds bounds");
1569 if (is_sbyte32(opx)) {
1570 bytes[0] = data;
1571 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1572 NO_SEG);
1573 offset++;
1574 } else {
1575 out(offset, segment, &data, OUT_ADDRESS, 4,
1576 opx->segment, opx->wrt);
1577 offset += 4;
1579 break;
1581 case4(0254):
1582 data = opx->offset;
1583 if (opx->wrt == NO_SEG && opx->segment == NO_SEG &&
1584 (int32_t)data != (int64_t)data) {
1585 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1586 "signed dword immediate exceeds bounds");
1588 out(offset, segment, &data, OUT_ADDRESS, 4,
1589 opx->segment, opx->wrt);
1590 offset += 4;
1591 break;
1593 case4(0260):
1594 case 0270:
1595 codes += 2;
1596 if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B))) {
1597 bytes[0] = (ins->vex_cm >> 6) ? 0x8f : 0xc4;
1598 bytes[1] = (ins->vex_cm & 31) | ((~ins->rex & 7) << 5);
1599 bytes[2] = ((ins->rex & REX_W) << (7-3)) |
1600 ((~ins->vexreg & 15)<< 3) | (ins->vex_wlp & 07);
1601 out(offset, segment, &bytes, OUT_RAWDATA, 3, NO_SEG, NO_SEG);
1602 offset += 3;
1603 } else {
1604 bytes[0] = 0xc5;
1605 bytes[1] = ((~ins->rex & REX_R) << (7-2)) |
1606 ((~ins->vexreg & 15) << 3) | (ins->vex_wlp & 07);
1607 out(offset, segment, &bytes, OUT_RAWDATA, 2, NO_SEG, NO_SEG);
1608 offset += 2;
1610 break;
1612 case4(0274):
1614 uint64_t uv, um;
1615 int s;
1617 if (ins->rex & REX_W)
1618 s = 64;
1619 else if (ins->prefixes[PPS_OSIZE] == P_O16)
1620 s = 16;
1621 else if (ins->prefixes[PPS_OSIZE] == P_O32)
1622 s = 32;
1623 else
1624 s = bits;
1626 um = (uint64_t)2 << (s-1);
1627 uv = opx->offset;
1629 if (uv > 127 && uv < (uint64_t)-128 &&
1630 (uv < um-128 || uv > um-1)) {
1631 errfunc(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
1632 "signed byte value exceeds bounds");
1634 if (opx->segment != NO_SEG) {
1635 data = uv;
1636 out(offset, segment, &data, OUT_ADDRESS, 1,
1637 opx->segment, opx->wrt);
1638 } else {
1639 bytes[0] = uv;
1640 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG,
1641 NO_SEG);
1643 offset += 1;
1644 break;
1647 case4(0300):
1648 break;
1650 case 0310:
1651 if (bits == 32 && !has_prefix(ins, PPS_ASIZE, P_A16)) {
1652 *bytes = 0x67;
1653 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1654 offset += 1;
1655 } else
1656 offset += 0;
1657 break;
1659 case 0311:
1660 if (bits != 32 && !has_prefix(ins, PPS_ASIZE, P_A32)) {
1661 *bytes = 0x67;
1662 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1663 offset += 1;
1664 } else
1665 offset += 0;
1666 break;
1668 case 0312:
1669 break;
1671 case 0313:
1672 ins->rex = 0;
1673 break;
1675 case4(0314):
1676 break;
1678 case 0320:
1679 case 0321:
1680 break;
1682 case 0322:
1683 case 0323:
1684 break;
1686 case 0324:
1687 ins->rex |= REX_W;
1688 break;
1690 case 0325:
1691 break;
1693 case 0330:
1694 *bytes = *codes++ ^ condval[ins->condition];
1695 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1696 offset += 1;
1697 break;
1699 case 0331:
1700 break;
1702 case 0332:
1703 case 0333:
1704 *bytes = c - 0332 + 0xF2;
1705 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1706 offset += 1;
1707 break;
1709 case 0334:
1710 if (ins->rex & REX_R) {
1711 *bytes = 0xF0;
1712 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1713 offset += 1;
1715 ins->rex &= ~(REX_L|REX_R);
1716 break;
1718 case 0335:
1719 break;
1721 case 0336:
1722 case 0337:
1723 break;
1725 case 0340:
1726 if (ins->oprs[0].segment != NO_SEG)
1727 errfunc(ERR_PANIC, "non-constant BSS size in pass two");
1728 else {
1729 int64_t size = ins->oprs[0].offset;
1730 if (size > 0)
1731 out(offset, segment, NULL,
1732 OUT_RESERVE, size, NO_SEG, NO_SEG);
1733 offset += size;
1735 break;
1737 case 0341:
1738 break;
1740 case 0344:
1741 case 0345:
1742 bytes[0] = c & 1;
1743 switch (ins->oprs[0].basereg) {
1744 case R_CS:
1745 bytes[0] += 0x0E;
1746 break;
1747 case R_DS:
1748 bytes[0] += 0x1E;
1749 break;
1750 case R_ES:
1751 bytes[0] += 0x06;
1752 break;
1753 case R_SS:
1754 bytes[0] += 0x16;
1755 break;
1756 default:
1757 errfunc(ERR_PANIC,
1758 "bizarre 8086 segment register received");
1760 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1761 offset++;
1762 break;
1764 case 0346:
1765 case 0347:
1766 bytes[0] = c & 1;
1767 switch (ins->oprs[0].basereg) {
1768 case R_FS:
1769 bytes[0] += 0xA0;
1770 break;
1771 case R_GS:
1772 bytes[0] += 0xA8;
1773 break;
1774 default:
1775 errfunc(ERR_PANIC,
1776 "bizarre 386 segment register received");
1778 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1779 offset++;
1780 break;
1782 case 0360:
1783 break;
1785 case 0361:
1786 bytes[0] = 0x66;
1787 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1788 offset += 1;
1789 break;
1791 case 0362:
1792 case 0363:
1793 bytes[0] = c - 0362 + 0xf2;
1794 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1795 offset += 1;
1796 break;
1798 case 0364:
1799 case 0365:
1800 break;
1802 case 0366:
1803 case 0367:
1804 *bytes = c - 0366 + 0x66;
1805 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1806 offset += 1;
1807 break;
1809 case 0370:
1810 case 0371:
1811 case 0372:
1812 break;
1814 case 0373:
1815 *bytes = bits == 16 ? 3 : 5;
1816 out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
1817 offset += 1;
1818 break;
1820 case 0374:
1821 eat = EA_XMMVSIB;
1822 break;
1824 case 0375:
1825 eat = EA_YMMVSIB;
1826 break;
1828 case4(0100):
1829 case4(0110):
1830 case4(0120):
1831 case4(0130):
1832 case4(0200):
1833 case4(0204):
1834 case4(0210):
1835 case4(0214):
1836 case4(0220):
1837 case4(0224):
1838 case4(0230):
1839 case4(0234):
1841 ea ea_data;
1842 int rfield;
1843 opflags_t rflags;
1844 uint8_t *p;
1845 int32_t s;
1846 struct operand *opy = &ins->oprs[op2];
1848 if (c <= 0177) {
1849 /* pick rfield from operand b (opx) */
1850 rflags = regflag(opx);
1851 rfield = nasm_regvals[opx->basereg];
1852 } else {
1853 /* rfield is constant */
1854 rflags = 0;
1855 rfield = c & 7;
1858 if (process_ea(opy, &ea_data, bits, ins->addr_size,
1859 rfield, rflags) != eat)
1860 errfunc(ERR_NONFATAL, "invalid effective address");
1862 p = bytes;
1863 *p++ = ea_data.modrm;
1864 if (ea_data.sib_present)
1865 *p++ = ea_data.sib;
1867 s = p - bytes;
1868 out(offset, segment, bytes, OUT_RAWDATA, s, NO_SEG, NO_SEG);
1871 * Make sure the address gets the right offset in case
1872 * the line breaks in the .lst file (BR 1197827)
1874 offset += s;
1875 s = 0;
1877 switch (ea_data.bytes) {
1878 case 0:
1879 break;
1880 case 1:
1881 case 2:
1882 case 4:
1883 case 8:
1884 data = opy->offset;
1885 s += ea_data.bytes;
1886 if (ea_data.rip) {
1887 if (opy->segment == segment) {
1888 data -= insn_end;
1889 if (overflow_signed(data, ea_data.bytes))
1890 warn_overflow(ERR_PASS2, ea_data.bytes);
1891 out(offset, segment, &data, OUT_ADDRESS,
1892 ea_data.bytes, NO_SEG, NO_SEG);
1893 } else {
1894 /* overflow check in output/linker? */
1895 out(offset, segment, &data, OUT_REL4ADR,
1896 insn_end - offset, opy->segment, opy->wrt);
1898 } else {
1899 if (overflow_general(opy->offset, ins->addr_size >> 3) ||
1900 signed_bits(opy->offset, ins->addr_size) !=
1901 signed_bits(opy->offset, ea_data.bytes * 8))
1902 warn_overflow(ERR_PASS2, ea_data.bytes);
1904 out(offset, segment, &data, OUT_ADDRESS,
1905 ea_data.bytes, opy->segment, opy->wrt);
1907 break;
1908 default:
1909 /* Impossible! */
1910 errfunc(ERR_PANIC,
1911 "Invalid amount of bytes (%d) for offset?!",
1912 ea_data.bytes);
1913 break;
1915 offset += s;
1917 break;
1919 default:
1920 errfunc(ERR_PANIC, "internal instruction table corrupt"
1921 ": instruction code \\%o (0x%02X) given", c, c);
1922 break;
1927 static opflags_t regflag(const operand * o)
1929 if (!is_register(o->basereg))
1930 errfunc(ERR_PANIC, "invalid operand passed to regflag()");
1931 return nasm_reg_flags[o->basereg];
1934 static int32_t regval(const operand * o)
1936 if (!is_register(o->basereg))
1937 errfunc(ERR_PANIC, "invalid operand passed to regval()");
1938 return nasm_regvals[o->basereg];
1941 static int op_rexflags(const operand * o, int mask)
1943 opflags_t flags;
1944 int val;
1946 if (!is_register(o->basereg))
1947 errfunc(ERR_PANIC, "invalid operand passed to op_rexflags()");
1949 flags = nasm_reg_flags[o->basereg];
1950 val = nasm_regvals[o->basereg];
1952 return rexflags(val, flags, mask);
1955 static int rexflags(int val, opflags_t flags, int mask)
1957 int rex = 0;
1959 if (val >= 8)
1960 rex |= REX_B|REX_X|REX_R;
1961 if (flags & BITS64)
1962 rex |= REX_W;
1963 if (!(REG_HIGH & ~flags)) /* AH, CH, DH, BH */
1964 rex |= REX_H;
1965 else if (!(REG8 & ~flags) && val >= 4) /* SPL, BPL, SIL, DIL */
1966 rex |= REX_P;
1968 return rex & mask;
1971 static enum match_result find_match(const struct itemplate **tempp,
1972 insn *instruction,
1973 int32_t segment, int64_t offset, int bits)
1975 const struct itemplate *temp;
1976 enum match_result m, merr;
1977 opflags_t xsizeflags[MAX_OPERANDS];
1978 bool opsizemissing = false;
1979 int i;
1981 for (i = 0; i < instruction->operands; i++)
1982 xsizeflags[i] = instruction->oprs[i].type & SIZE_MASK;
1984 merr = MERR_INVALOP;
1986 for (temp = nasm_instructions[instruction->opcode];
1987 temp->opcode != I_none; temp++) {
1988 m = matches(temp, instruction, bits);
1989 if (m == MOK_JUMP) {
1990 if (jmp_match(segment, offset, bits, instruction, temp->code))
1991 m = MOK_GOOD;
1992 else
1993 m = MERR_INVALOP;
1994 } else if (m == MERR_OPSIZEMISSING &&
1995 (temp->flags & IF_SMASK) != IF_SX) {
1997 * Missing operand size and a candidate for fuzzy matching...
1999 for (i = 0; i < temp->operands; i++) {
2000 if ((temp->opd[i] & SAME_AS) == 0)
2001 xsizeflags[i] |= temp->opd[i] & SIZE_MASK;
2003 opsizemissing = true;
2005 if (m > merr)
2006 merr = m;
2007 if (merr == MOK_GOOD)
2008 goto done;
2011 /* No match, but see if we can get a fuzzy operand size match... */
2012 if (!opsizemissing)
2013 goto done;
2015 for (i = 0; i < instruction->operands; i++) {
2017 * We ignore extrinsic operand sizes on registers, so we should
2018 * never try to fuzzy-match on them. This also resolves the case
2019 * when we have e.g. "xmmrm128" in two different positions.
2021 if (is_class(REGISTER, instruction->oprs[i].type))
2022 continue;
2024 /* This tests if xsizeflags[i] has more than one bit set */
2025 if ((xsizeflags[i] & (xsizeflags[i]-1)))
2026 goto done; /* No luck */
2028 instruction->oprs[i].type |= xsizeflags[i]; /* Set the size */
2031 /* Try matching again... */
2032 for (temp = nasm_instructions[instruction->opcode];
2033 temp->opcode != I_none; temp++) {
2034 m = matches(temp, instruction, bits);
2035 if (m == MOK_JUMP) {
2036 if (jmp_match(segment, offset, bits, instruction, temp->code))
2037 m = MOK_GOOD;
2038 else
2039 m = MERR_INVALOP;
2041 if (m > merr)
2042 merr = m;
2043 if (merr == MOK_GOOD)
2044 goto done;
2047 done:
2048 *tempp = temp;
2049 return merr;
2052 static enum match_result matches(const struct itemplate *itemp,
2053 insn *instruction, int bits)
2055 int i, size[MAX_OPERANDS], asize, oprs;
2056 bool opsizemissing = false;
2059 * Check the opcode
2061 if (itemp->opcode != instruction->opcode)
2062 return MERR_INVALOP;
2065 * Count the operands
2067 if (itemp->operands != instruction->operands)
2068 return MERR_INVALOP;
2071 * Is it legal?
2073 if (!(optimizing > 0) && (itemp->flags & IF_OPT))
2074 return MERR_INVALOP;
2077 * Check that no spurious colons or TOs are present
2079 for (i = 0; i < itemp->operands; i++)
2080 if (instruction->oprs[i].type & ~itemp->opd[i] & (COLON | TO))
2081 return MERR_INVALOP;
2084 * Process size flags
2086 switch (itemp->flags & IF_SMASK) {
2087 case IF_SB:
2088 asize = BITS8;
2089 break;
2090 case IF_SW:
2091 asize = BITS16;
2092 break;
2093 case IF_SD:
2094 asize = BITS32;
2095 break;
2096 case IF_SQ:
2097 asize = BITS64;
2098 break;
2099 case IF_SO:
2100 asize = BITS128;
2101 break;
2102 case IF_SY:
2103 asize = BITS256;
2104 break;
2105 case IF_SZ:
2106 switch (bits) {
2107 case 16:
2108 asize = BITS16;
2109 break;
2110 case 32:
2111 asize = BITS32;
2112 break;
2113 case 64:
2114 asize = BITS64;
2115 break;
2116 default:
2117 asize = 0;
2118 break;
2120 break;
2121 default:
2122 asize = 0;
2123 break;
2126 if (itemp->flags & IF_ARMASK) {
2127 /* S- flags only apply to a specific operand */
2128 i = ((itemp->flags & IF_ARMASK) >> IF_ARSHFT) - 1;
2129 memset(size, 0, sizeof size);
2130 size[i] = asize;
2131 } else {
2132 /* S- flags apply to all operands */
2133 for (i = 0; i < MAX_OPERANDS; i++)
2134 size[i] = asize;
2138 * Check that the operand flags all match up,
2139 * it's a bit tricky so lets be verbose:
2141 * 1) Find out the size of operand. If instruction
2142 * doesn't have one specified -- we're trying to
2143 * guess it either from template (IF_S* flag) or
2144 * from code bits.
2146 * 2) If template operand (i) has SAME_AS flag [used for registers only]
2147 * (ie the same operand as was specified somewhere in template, and
2148 * this referred operand index is being achieved via ~SAME_AS)
2149 * we are to be sure that both registers (in template and instruction)
2150 * do exactly match.
2152 * 3) If template operand do not match the instruction OR
2153 * template has an operand size specified AND this size differ
2154 * from which instruction has (perhaps we got it from code bits)
2155 * we are:
2156 * a) Check that only size of instruction and operand is differ
2157 * other characteristics do match
2158 * b) Perhaps it's a register specified in instruction so
2159 * for such a case we just mark that operand as "size
2160 * missing" and this will turn on fuzzy operand size
2161 * logic facility (handled by a caller)
2163 for (i = 0; i < itemp->operands; i++) {
2164 opflags_t type = instruction->oprs[i].type;
2165 if (!(type & SIZE_MASK))
2166 type |= size[i];
2168 if (itemp->opd[i] & SAME_AS) {
2169 int j = itemp->opd[i] & ~SAME_AS;
2170 if (type != instruction->oprs[j].type ||
2171 instruction->oprs[i].basereg != instruction->oprs[j].basereg)
2172 return MERR_INVALOP;
2173 } else if (itemp->opd[i] & ~type ||
2174 ((itemp->opd[i] & SIZE_MASK) &&
2175 ((itemp->opd[i] ^ type) & SIZE_MASK))) {
2176 if ((itemp->opd[i] & ~type & ~SIZE_MASK) || (type & SIZE_MASK)) {
2177 return MERR_INVALOP;
2178 } else if (!is_class(REGISTER, type)) {
2180 * Note: we don't honor extrinsic operand sizes for registers,
2181 * so "missing operand size" for a register should be
2182 * considered a wildcard match rather than an error.
2184 opsizemissing = true;
2189 if (opsizemissing)
2190 return MERR_OPSIZEMISSING;
2193 * Check operand sizes
2195 if (itemp->flags & (IF_SM | IF_SM2)) {
2196 oprs = (itemp->flags & IF_SM2 ? 2 : itemp->operands);
2197 for (i = 0; i < oprs; i++) {
2198 asize = itemp->opd[i] & SIZE_MASK;
2199 if (asize) {
2200 for (i = 0; i < oprs; i++)
2201 size[i] = asize;
2202 break;
2205 } else {
2206 oprs = itemp->operands;
2209 for (i = 0; i < itemp->operands; i++) {
2210 if (!(itemp->opd[i] & SIZE_MASK) &&
2211 (instruction->oprs[i].type & SIZE_MASK & ~size[i]))
2212 return MERR_OPSIZEMISMATCH;
2216 * Check template is okay at the set cpu level
2218 if (((itemp->flags & IF_PLEVEL) > cpu))
2219 return MERR_BADCPU;
2222 * Verify the appropriate long mode flag.
2224 if ((itemp->flags & (bits == 64 ? IF_NOLONG : IF_LONG)))
2225 return MERR_BADMODE;
2228 * Check if special handling needed for Jumps
2230 if ((itemp->code[0] & 0374) == 0370)
2231 return MOK_JUMP;
2233 return MOK_GOOD;
2236 static enum ea_type process_ea(operand *input, ea *output, int bits,
2237 int addrbits, int rfield, opflags_t rflags)
2239 bool forw_ref = !!(input->opflags & OPFLAG_UNKNOWN);
2241 output->type = EA_SCALAR;
2242 output->rip = false;
2244 /* REX flags for the rfield operand */
2245 output->rex |= rexflags(rfield, rflags, REX_R | REX_P | REX_W | REX_H);
2247 if (is_class(REGISTER, input->type)) {
2249 * It's a direct register.
2251 opflags_t f;
2253 if (!is_register(input->basereg))
2254 goto err;
2256 f = regflag(input);
2258 if (!is_class(REG_EA, f))
2259 goto err;
2261 output->rex |= op_rexflags(input, REX_B | REX_P | REX_W | REX_H);
2262 output->sib_present = false; /* no SIB necessary */
2263 output->bytes = 0; /* no offset necessary either */
2264 output->modrm = GEN_MODRM(3, rfield, nasm_regvals[input->basereg]);
2265 } else {
2267 * It's a memory reference.
2269 if (input->basereg == -1 &&
2270 (input->indexreg == -1 || input->scale == 0)) {
2272 * It's a pure offset.
2274 if (bits == 64 && ((input->type & IP_REL) == IP_REL) &&
2275 input->segment == NO_SEG) {
2276 nasm_error(ERR_WARNING | ERR_PASS1, "absolute address can not be RIP-relative");
2277 input->type &= ~IP_REL;
2278 input->type |= MEMORY;
2281 if (input->eaflags & EAF_BYTEOFFS ||
2282 (input->eaflags & EAF_WORDOFFS &&
2283 input->disp_size != (addrbits != 16 ? 32 : 16))) {
2284 nasm_error(ERR_WARNING | ERR_PASS1, "displacement size ignored on absolute address");
2287 if (bits == 64 && (~input->type & IP_REL)) {
2288 output->sib_present = true;
2289 output->sib = GEN_SIB(0, 4, 5);
2290 output->bytes = 4;
2291 output->modrm = GEN_MODRM(0, rfield, 4);
2292 output->rip = false;
2293 } else {
2294 output->sib_present = false;
2295 output->bytes = (addrbits != 16 ? 4 : 2);
2296 output->modrm = GEN_MODRM(0, rfield, (addrbits != 16 ? 5 : 6));
2297 output->rip = bits == 64;
2299 } else {
2301 * It's an indirection.
2303 int i = input->indexreg, b = input->basereg, s = input->scale;
2304 int32_t seg = input->segment;
2305 int hb = input->hintbase, ht = input->hinttype;
2306 int t, it, bt; /* register numbers */
2307 opflags_t x, ix, bx; /* register flags */
2309 if (s == 0)
2310 i = -1; /* make this easy, at least */
2312 if (is_register(i)) {
2313 it = nasm_regvals[i];
2314 ix = nasm_reg_flags[i];
2315 } else {
2316 it = -1;
2317 ix = 0;
2320 if (is_register(b)) {
2321 bt = nasm_regvals[b];
2322 bx = nasm_reg_flags[b];
2323 } else {
2324 bt = -1;
2325 bx = 0;
2328 /* if either one are a vector register... */
2329 if ((ix|bx) & (XMMREG|YMMREG) & ~REG_EA) {
2330 int32_t sok = BITS32 | BITS64;
2331 int32_t o = input->offset;
2332 int mod, scale, index, base;
2335 * For a vector SIB, one has to be a vector and the other,
2336 * if present, a GPR. The vector must be the index operand.
2338 if (it == -1 || (bx & (XMMREG|YMMREG) & ~REG_EA)) {
2339 if (s == 0)
2340 s = 1;
2341 else if (s != 1)
2342 goto err;
2344 t = bt, bt = it, it = t;
2345 x = bx, bx = ix, ix = x;
2348 if (bt != -1) {
2349 if (REG_GPR & ~bx)
2350 goto err;
2351 if (!(REG64 & ~bx) || !(REG32 & ~bx))
2352 sok &= bx;
2353 else
2354 goto err;
2358 * While we're here, ensure the user didn't specify
2359 * WORD or QWORD
2361 if (input->disp_size == 16 || input->disp_size == 64)
2362 goto err;
2364 if (addrbits == 16 ||
2365 (addrbits == 32 && !(sok & BITS32)) ||
2366 (addrbits == 64 && !(sok & BITS64)))
2367 goto err;
2369 output->type = (ix & YMMREG & ~REG_EA)
2370 ? EA_YMMVSIB : EA_XMMVSIB;
2372 output->rex |= rexflags(it, ix, REX_X);
2373 output->rex |= rexflags(bt, bx, REX_B);
2375 index = it & 7; /* it is known to be != -1 */
2377 switch (s) {
2378 case 1:
2379 scale = 0;
2380 break;
2381 case 2:
2382 scale = 1;
2383 break;
2384 case 4:
2385 scale = 2;
2386 break;
2387 case 8:
2388 scale = 3;
2389 break;
2390 default: /* then what the smeg is it? */
2391 goto err; /* panic */
2394 if (bt == -1) {
2395 base = 5;
2396 mod = 0;
2397 } else {
2398 base = (bt & 7);
2399 if (base != REG_NUM_EBP && o == 0 &&
2400 seg == NO_SEG && !forw_ref &&
2401 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2402 mod = 0;
2403 else if (input->eaflags & EAF_BYTEOFFS ||
2404 (o >= -128 && o <= 127 &&
2405 seg == NO_SEG && !forw_ref &&
2406 !(input->eaflags & EAF_WORDOFFS)))
2407 mod = 1;
2408 else
2409 mod = 2;
2412 output->sib_present = true;
2413 output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
2414 output->modrm = GEN_MODRM(mod, rfield, 4);
2415 output->sib = GEN_SIB(scale, index, base);
2416 } else if ((ix|bx) & (BITS32|BITS64)) {
2418 * it must be a 32/64-bit memory reference. Firstly we have
2419 * to check that all registers involved are type E/Rxx.
2421 int32_t sok = BITS32 | BITS64;
2422 int32_t o = input->offset;
2424 if (it != -1) {
2425 if (!(REG64 & ~ix) || !(REG32 & ~ix))
2426 sok &= ix;
2427 else
2428 goto err;
2431 if (bt != -1) {
2432 if (REG_GPR & ~bx)
2433 goto err; /* Invalid register */
2434 if (~sok & bx & SIZE_MASK)
2435 goto err; /* Invalid size */
2436 sok &= bx;
2440 * While we're here, ensure the user didn't specify
2441 * WORD or QWORD
2443 if (input->disp_size == 16 || input->disp_size == 64)
2444 goto err;
2446 if (addrbits == 16 ||
2447 (addrbits == 32 && !(sok & BITS32)) ||
2448 (addrbits == 64 && !(sok & BITS64)))
2449 goto err;
2451 /* now reorganize base/index */
2452 if (s == 1 && bt != it && bt != -1 && it != -1 &&
2453 ((hb == b && ht == EAH_NOTBASE) ||
2454 (hb == i && ht == EAH_MAKEBASE))) {
2455 /* swap if hints say so */
2456 t = bt, bt = it, it = t;
2457 x = bx, bx = ix, ix = x;
2459 if (bt == it) /* convert EAX+2*EAX to 3*EAX */
2460 bt = -1, bx = 0, s++;
2461 if (bt == -1 && s == 1 && !(hb == it && ht == EAH_NOTBASE)) {
2462 /* make single reg base, unless hint */
2463 bt = it, bx = ix, it = -1, ix = 0;
2465 if (((s == 2 && it != REG_NUM_ESP && !(input->eaflags & EAF_TIMESTWO)) ||
2466 s == 3 || s == 5 || s == 9) && bt == -1)
2467 bt = it, bx = ix, s--; /* convert 3*EAX to EAX+2*EAX */
2468 if (it == -1 && (bt & 7) != REG_NUM_ESP &&
2469 (input->eaflags & EAF_TIMESTWO))
2470 it = bt, ix = bx, bt = -1, bx = 0, s = 1;
2471 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2472 if (s == 1 && it == REG_NUM_ESP) {
2473 /* swap ESP into base if scale is 1 */
2474 t = it, it = bt, bt = t;
2475 x = ix, ix = bx, bx = x;
2477 if (it == REG_NUM_ESP ||
2478 (s != 1 && s != 2 && s != 4 && s != 8 && it != -1))
2479 goto err; /* wrong, for various reasons */
2481 output->rex |= rexflags(it, ix, REX_X);
2482 output->rex |= rexflags(bt, bx, REX_B);
2484 if (it == -1 && (bt & 7) != REG_NUM_ESP) {
2485 /* no SIB needed */
2486 int mod, rm;
2488 if (bt == -1) {
2489 rm = 5;
2490 mod = 0;
2491 } else {
2492 rm = (bt & 7);
2493 if (rm != REG_NUM_EBP && o == 0 &&
2494 seg == NO_SEG && !forw_ref &&
2495 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2496 mod = 0;
2497 else if (input->eaflags & EAF_BYTEOFFS ||
2498 (o >= -128 && o <= 127 &&
2499 seg == NO_SEG && !forw_ref &&
2500 !(input->eaflags & EAF_WORDOFFS)))
2501 mod = 1;
2502 else
2503 mod = 2;
2506 output->sib_present = false;
2507 output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
2508 output->modrm = GEN_MODRM(mod, rfield, rm);
2509 } else {
2510 /* we need a SIB */
2511 int mod, scale, index, base;
2513 if (it == -1)
2514 index = 4, s = 1;
2515 else
2516 index = (it & 7);
2518 switch (s) {
2519 case 1:
2520 scale = 0;
2521 break;
2522 case 2:
2523 scale = 1;
2524 break;
2525 case 4:
2526 scale = 2;
2527 break;
2528 case 8:
2529 scale = 3;
2530 break;
2531 default: /* then what the smeg is it? */
2532 goto err; /* panic */
2535 if (bt == -1) {
2536 base = 5;
2537 mod = 0;
2538 } else {
2539 base = (bt & 7);
2540 if (base != REG_NUM_EBP && o == 0 &&
2541 seg == NO_SEG && !forw_ref &&
2542 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2543 mod = 0;
2544 else if (input->eaflags & EAF_BYTEOFFS ||
2545 (o >= -128 && o <= 127 &&
2546 seg == NO_SEG && !forw_ref &&
2547 !(input->eaflags & EAF_WORDOFFS)))
2548 mod = 1;
2549 else
2550 mod = 2;
2553 output->sib_present = true;
2554 output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
2555 output->modrm = GEN_MODRM(mod, rfield, 4);
2556 output->sib = GEN_SIB(scale, index, base);
2558 } else { /* it's 16-bit */
2559 int mod, rm;
2560 int16_t o = input->offset;
2562 /* check for 64-bit long mode */
2563 if (addrbits == 64)
2564 goto err;
2566 /* check all registers are BX, BP, SI or DI */
2567 if ((b != -1 && b != R_BP && b != R_BX && b != R_SI && b != R_DI) ||
2568 (i != -1 && i != R_BP && i != R_BX && i != R_SI && i != R_DI))
2569 goto err;
2571 /* ensure the user didn't specify DWORD/QWORD */
2572 if (input->disp_size == 32 || input->disp_size == 64)
2573 goto err;
2575 if (s != 1 && i != -1)
2576 goto err; /* no can do, in 16-bit EA */
2577 if (b == -1 && i != -1) {
2578 int tmp = b;
2579 b = i;
2580 i = tmp;
2581 } /* swap */
2582 if ((b == R_SI || b == R_DI) && i != -1) {
2583 int tmp = b;
2584 b = i;
2585 i = tmp;
2587 /* have BX/BP as base, SI/DI index */
2588 if (b == i)
2589 goto err; /* shouldn't ever happen, in theory */
2590 if (i != -1 && b != -1 &&
2591 (i == R_BP || i == R_BX || b == R_SI || b == R_DI))
2592 goto err; /* invalid combinations */
2593 if (b == -1) /* pure offset: handled above */
2594 goto err; /* so if it gets to here, panic! */
2596 rm = -1;
2597 if (i != -1)
2598 switch (i * 256 + b) {
2599 case R_SI * 256 + R_BX:
2600 rm = 0;
2601 break;
2602 case R_DI * 256 + R_BX:
2603 rm = 1;
2604 break;
2605 case R_SI * 256 + R_BP:
2606 rm = 2;
2607 break;
2608 case R_DI * 256 + R_BP:
2609 rm = 3;
2610 break;
2611 } else
2612 switch (b) {
2613 case R_SI:
2614 rm = 4;
2615 break;
2616 case R_DI:
2617 rm = 5;
2618 break;
2619 case R_BP:
2620 rm = 6;
2621 break;
2622 case R_BX:
2623 rm = 7;
2624 break;
2626 if (rm == -1) /* can't happen, in theory */
2627 goto err; /* so panic if it does */
2629 if (o == 0 && seg == NO_SEG && !forw_ref && rm != 6 &&
2630 !(input->eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
2631 mod = 0;
2632 else if (input->eaflags & EAF_BYTEOFFS ||
2633 (o >= -128 && o <= 127 && seg == NO_SEG &&
2634 !forw_ref && !(input->eaflags & EAF_WORDOFFS)))
2635 mod = 1;
2636 else
2637 mod = 2;
2639 output->sib_present = false; /* no SIB - it's 16-bit */
2640 output->bytes = mod; /* bytes of offset needed */
2641 output->modrm = GEN_MODRM(mod, rfield, rm);
2646 output->size = 1 + output->sib_present + output->bytes;
2647 return output->type;
2649 err:
2650 return output->type = EA_INVALID;
2653 static void add_asp(insn *ins, int addrbits)
2655 int j, valid;
2656 int defdisp;
2658 valid = (addrbits == 64) ? 64|32 : 32|16;
2660 switch (ins->prefixes[PPS_ASIZE]) {
2661 case P_A16:
2662 valid &= 16;
2663 break;
2664 case P_A32:
2665 valid &= 32;
2666 break;
2667 case P_A64:
2668 valid &= 64;
2669 break;
2670 case P_ASP:
2671 valid &= (addrbits == 32) ? 16 : 32;
2672 break;
2673 default:
2674 break;
2677 for (j = 0; j < ins->operands; j++) {
2678 if (is_class(MEMORY, ins->oprs[j].type)) {
2679 opflags_t i, b;
2681 /* Verify as Register */
2682 if (!is_register(ins->oprs[j].indexreg))
2683 i = 0;
2684 else
2685 i = nasm_reg_flags[ins->oprs[j].indexreg];
2687 /* Verify as Register */
2688 if (!is_register(ins->oprs[j].basereg))
2689 b = 0;
2690 else
2691 b = nasm_reg_flags[ins->oprs[j].basereg];
2693 if (ins->oprs[j].scale == 0)
2694 i = 0;
2696 if (!i && !b) {
2697 int ds = ins->oprs[j].disp_size;
2698 if ((addrbits != 64 && ds > 8) ||
2699 (addrbits == 64 && ds == 16))
2700 valid &= ds;
2701 } else {
2702 if (!(REG16 & ~b))
2703 valid &= 16;
2704 if (!(REG32 & ~b))
2705 valid &= 32;
2706 if (!(REG64 & ~b))
2707 valid &= 64;
2709 if (!(REG16 & ~i))
2710 valid &= 16;
2711 if (!(REG32 & ~i))
2712 valid &= 32;
2713 if (!(REG64 & ~i))
2714 valid &= 64;
2719 if (valid & addrbits) {
2720 ins->addr_size = addrbits;
2721 } else if (valid & ((addrbits == 32) ? 16 : 32)) {
2722 /* Add an address size prefix */
2723 ins->prefixes[PPS_ASIZE] = (addrbits == 32) ? P_A16 : P_A32;;
2724 ins->addr_size = (addrbits == 32) ? 16 : 32;
2725 } else {
2726 /* Impossible... */
2727 errfunc(ERR_NONFATAL, "impossible combination of address sizes");
2728 ins->addr_size = addrbits; /* Error recovery */
2731 defdisp = ins->addr_size == 16 ? 16 : 32;
2733 for (j = 0; j < ins->operands; j++) {
2734 if (!(MEM_OFFS & ~ins->oprs[j].type) &&
2735 (ins->oprs[j].disp_size ? ins->oprs[j].disp_size : defdisp) != ins->addr_size) {
2737 * mem_offs sizes must match the address size; if not,
2738 * strip the MEM_OFFS bit and match only EA instructions
2740 ins->oprs[j].type &= ~(MEM_OFFS & ~MEMORY);