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
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:
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 (0xF3) even if not specified.
130 * \337 - force a REPNE prefix (0xF2) 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
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 - 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"
159 #include <inttypes.h>
163 #include "assemble.h"
169 * Matching errors. These should be sorted so that more specific
170 * errors come later in the sequence.
179 * Matching success; the conditional ones first
181 MOK_JUMP
, /* Matching OK but needs jmp_match() */
182 MOK_GOOD
/* Matching unconditionally OK */
186 enum ea_type type
; /* what kind of EA is this? */
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 */
193 #define GEN_SIB(scale, index, base) \
194 (((scale) << 6) | ((index) << 3) | ((base)))
196 #define GEN_MODRM(mod, reg, rm) \
197 (((mod) << 6) | (((reg) & 7) << 3) | ((rm) & 7))
199 static uint32_t cpu
; /* cpu level received from nasm.c */
200 static efunc errfunc
;
201 static struct ofmt
*outfmt
;
202 static ListGen
*list
;
204 static int64_t calcsize(int32_t, int64_t, int, insn
*,
205 const struct itemplate
*);
206 static void gencode(int32_t segment
, int64_t offset
, int bits
,
207 insn
* ins
, const struct itemplate
*temp
,
209 static enum match_result
find_match(const struct itemplate
**tempp
,
211 int32_t segment
, int64_t offset
, int bits
);
212 static enum match_result
matches(const struct itemplate
*, insn
*, int bits
);
213 static opflags_t
regflag(const operand
*);
214 static int32_t regval(const operand
*);
215 static int rexflags(int, opflags_t
, int);
216 static int op_rexflags(const operand
*, int);
217 static void add_asp(insn
*, int);
219 static enum ea_type
process_ea(operand
*, ea
*, int, int, int, opflags_t
);
221 static int has_prefix(insn
* ins
, enum prefix_pos pos
, int prefix
)
223 return ins
->prefixes
[pos
] == prefix
;
226 static void assert_no_prefix(insn
* ins
, enum prefix_pos pos
)
228 if (ins
->prefixes
[pos
])
229 errfunc(ERR_NONFATAL
, "invalid %s prefix",
230 prefix_name(ins
->prefixes
[pos
]));
233 static const char *size_name(int size
)
255 static void warn_overflow(int pass
, int size
)
257 errfunc(ERR_WARNING
| pass
| ERR_WARN_NOV
,
258 "%s data exceeds bounds", size_name(size
));
261 static void warn_overflow_const(int64_t data
, int size
)
263 if (overflow_general(data
, size
))
264 warn_overflow(ERR_PASS1
, size
);
267 static void warn_overflow_opd(const struct operand
*o
, int size
)
269 if (o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
) {
270 if (overflow_general(o
->offset
, size
))
271 warn_overflow(ERR_PASS2
, size
);
276 * This routine wrappers the real output format's output routine,
277 * in order to pass a copy of the data off to the listing file
278 * generator at the same time.
280 static void out(int64_t offset
, int32_t segto
, const void *data
,
281 enum out_type type
, uint64_t size
,
282 int32_t segment
, int32_t wrt
)
284 static int32_t lineno
= 0; /* static!!! */
285 static char *lnfname
= NULL
;
288 if (type
== OUT_ADDRESS
&& segment
== NO_SEG
&& wrt
== NO_SEG
) {
290 * This is a non-relocated address, and we're going to
291 * convert it into RAWDATA format.
296 errfunc(ERR_PANIC
, "OUT_ADDRESS with size > 8");
300 WRITEADDR(q
, *(int64_t *)data
, size
);
305 list
->output(offset
, data
, type
, size
);
308 * this call to src_get determines when we call the
309 * debug-format-specific "linenum" function
310 * it updates lineno and lnfname to the current values
311 * returning 0 if "same as last time", -2 if lnfname
312 * changed, and the amount by which lineno changed,
313 * if it did. thus, these variables must be static
316 if (src_get(&lineno
, &lnfname
))
317 outfmt
->current_dfmt
->linenum(lnfname
, lineno
, segto
);
319 outfmt
->output(segto
, data
, type
, size
, segment
, wrt
);
322 static bool jmp_match(int32_t segment
, int64_t offset
, int bits
,
323 insn
* ins
, const struct itemplate
*temp
)
326 const uint8_t *code
= temp
->code
;
329 if (((c
& ~1) != 0370) || (ins
->oprs
[0].type
& STRICT
))
333 if (optimizing
< 0 && c
== 0371)
336 isize
= calcsize(segment
, offset
, bits
, ins
, temp
);
338 if (ins
->oprs
[0].opflags
& OPFLAG_UNKNOWN
)
339 /* Be optimistic in pass 1 */
342 if (ins
->oprs
[0].segment
!= segment
)
345 isize
= ins
->oprs
[0].offset
- offset
- isize
; /* isize is delta */
346 return (isize
>= -128 && isize
<= 127); /* is it byte size? */
349 int64_t assemble(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
350 insn
* instruction
, struct ofmt
*output
, efunc error
,
353 const struct itemplate
*temp
;
358 int64_t start
= offset
;
359 int64_t wsize
; /* size for DB etc. */
361 errfunc
= error
; /* to pass to other functions */
363 outfmt
= output
; /* likewise */
364 list
= listgen
; /* and again */
366 wsize
= idata_bytes(instruction
->opcode
);
372 int32_t t
= instruction
->times
;
375 "instruction->times < 0 (%ld) in assemble()", t
);
377 while (t
--) { /* repeat TIMES times */
378 list_for_each(e
, instruction
->eops
) {
379 if (e
->type
== EOT_DB_NUMBER
) {
381 errfunc(ERR_NONFATAL
,
382 "integer supplied to a DT, DO or DY"
385 out(offset
, segment
, &e
->offset
,
386 OUT_ADDRESS
, wsize
, e
->segment
, e
->wrt
);
389 } else if (e
->type
== EOT_DB_STRING
||
390 e
->type
== EOT_DB_STRING_FREE
) {
393 out(offset
, segment
, e
->stringval
,
394 OUT_RAWDATA
, e
->stringlen
, NO_SEG
, NO_SEG
);
395 align
= e
->stringlen
% wsize
;
398 align
= wsize
- align
;
399 out(offset
, segment
, zero_buffer
,
400 OUT_RAWDATA
, align
, NO_SEG
, NO_SEG
);
402 offset
+= e
->stringlen
+ align
;
405 if (t
> 0 && t
== instruction
->times
- 1) {
407 * Dummy call to list->output to give the offset to the
410 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
411 list
->uplevel(LIST_TIMES
);
414 if (instruction
->times
> 1)
415 list
->downlevel(LIST_TIMES
);
416 return offset
- start
;
419 if (instruction
->opcode
== I_INCBIN
) {
420 const char *fname
= instruction
->eops
->stringval
;
423 fp
= fopen(fname
, "rb");
425 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
427 } else if (fseek(fp
, 0L, SEEK_END
) < 0) {
428 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
431 static char buf
[4096];
432 size_t t
= instruction
->times
;
437 if (instruction
->eops
->next
) {
438 base
= instruction
->eops
->next
->offset
;
440 if (instruction
->eops
->next
->next
&&
441 len
> (size_t)instruction
->eops
->next
->next
->offset
)
442 len
= (size_t)instruction
->eops
->next
->next
->offset
;
445 * Dummy call to list->output to give the offset to the
448 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
449 list
->uplevel(LIST_INCBIN
);
453 fseek(fp
, base
, SEEK_SET
);
457 m
= fread(buf
, 1, l
> sizeof(buf
) ? sizeof(buf
) : l
, fp
);
460 * This shouldn't happen unless the file
461 * actually changes while we are reading
465 "`incbin': unexpected EOF while"
466 " reading file `%s'", fname
);
467 t
= 0; /* Try to exit cleanly */
470 out(offset
, segment
, buf
, OUT_RAWDATA
, m
,
475 list
->downlevel(LIST_INCBIN
);
476 if (instruction
->times
> 1) {
478 * Dummy call to list->output to give the offset to the
481 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
482 list
->uplevel(LIST_TIMES
);
483 list
->downlevel(LIST_TIMES
);
486 return instruction
->times
* len
;
488 return 0; /* if we're here, there's an error */
491 /* Check to see if we need an address-size prefix */
492 add_asp(instruction
, bits
);
494 m
= find_match(&temp
, instruction
, segment
, offset
, bits
);
498 int64_t insn_size
= calcsize(segment
, offset
, bits
, instruction
, temp
);
499 itimes
= instruction
->times
;
500 if (insn_size
< 0) /* shouldn't be, on pass two */
501 error(ERR_PANIC
, "errors made it through from pass one");
504 for (j
= 0; j
< MAXPREFIX
; j
++) {
506 switch (instruction
->prefixes
[j
]) {
526 error(ERR_WARNING
| ERR_PASS2
,
527 "cs segment base generated, but will be ignored in 64-bit mode");
533 error(ERR_WARNING
| ERR_PASS2
,
534 "ds segment base generated, but will be ignored in 64-bit mode");
540 error(ERR_WARNING
| ERR_PASS2
,
541 "es segment base generated, but will be ignored in 64-bit mode");
553 error(ERR_WARNING
| ERR_PASS2
,
554 "ss segment base generated, but will be ignored in 64-bit mode");
561 "segr6 and segr7 cannot be used as prefixes");
566 "16-bit addressing is not supported "
568 } else if (bits
!= 16)
578 "64-bit addressing is only supported "
602 error(ERR_PANIC
, "invalid instruction prefix");
605 out(offset
, segment
, &c
, OUT_RAWDATA
, 1,
610 insn_end
= offset
+ insn_size
;
611 gencode(segment
, offset
, bits
, instruction
,
614 if (itimes
> 0 && itimes
== instruction
->times
- 1) {
616 * Dummy call to list->output to give the offset to the
619 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
620 list
->uplevel(LIST_TIMES
);
623 if (instruction
->times
> 1)
624 list
->downlevel(LIST_TIMES
);
625 return offset
- start
;
629 case MERR_OPSIZEMISSING
:
630 error(ERR_NONFATAL
, "operation size not specified");
632 case MERR_OPSIZEMISMATCH
:
633 error(ERR_NONFATAL
, "mismatch in operand sizes");
636 error(ERR_NONFATAL
, "no instruction for this cpu level");
639 error(ERR_NONFATAL
, "instruction not supported in %d-bit mode",
644 "invalid combination of opcode and operands");
651 int64_t insn_size(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
652 insn
* instruction
, efunc error
)
654 const struct itemplate
*temp
;
657 errfunc
= error
; /* to pass to other functions */
660 if (instruction
->opcode
== I_none
)
663 if (instruction
->opcode
== I_DB
|| instruction
->opcode
== I_DW
||
664 instruction
->opcode
== I_DD
|| instruction
->opcode
== I_DQ
||
665 instruction
->opcode
== I_DT
|| instruction
->opcode
== I_DO
||
666 instruction
->opcode
== I_DY
) {
668 int32_t isize
, osize
, wsize
;
671 wsize
= idata_bytes(instruction
->opcode
);
673 list_for_each(e
, instruction
->eops
) {
677 if (e
->type
== EOT_DB_NUMBER
) {
679 warn_overflow_const(e
->offset
, wsize
);
680 } else if (e
->type
== EOT_DB_STRING
||
681 e
->type
== EOT_DB_STRING_FREE
)
682 osize
= e
->stringlen
;
684 align
= (-osize
) % wsize
;
687 isize
+= osize
+ align
;
689 return isize
* instruction
->times
;
692 if (instruction
->opcode
== I_INCBIN
) {
693 const char *fname
= instruction
->eops
->stringval
;
698 fp
= fopen(fname
, "rb");
700 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
702 else if (fseek(fp
, 0L, SEEK_END
) < 0)
703 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
707 if (instruction
->eops
->next
) {
708 len
-= instruction
->eops
->next
->offset
;
709 if (instruction
->eops
->next
->next
&&
710 len
> (size_t)instruction
->eops
->next
->next
->offset
) {
711 len
= (size_t)instruction
->eops
->next
->next
->offset
;
714 val
= instruction
->times
* len
;
721 /* Check to see if we need an address-size prefix */
722 add_asp(instruction
, bits
);
724 m
= find_match(&temp
, instruction
, segment
, offset
, bits
);
726 /* we've matched an instruction. */
730 isize
= calcsize(segment
, offset
, bits
, instruction
, temp
);
733 for (j
= 0; j
< MAXPREFIX
; j
++) {
734 switch (instruction
->prefixes
[j
]) {
760 return isize
* instruction
->times
;
762 return -1; /* didn't match any instruction */
766 static bool possible_sbyte(operand
*o
)
768 return o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
&&
769 !(o
->opflags
& OPFLAG_UNKNOWN
) &&
770 optimizing
>= 0 && !(o
->type
& STRICT
);
773 /* check that opn[op] is a signed byte of size 16 or 32 */
774 static bool is_sbyte16(operand
*o
)
778 if (!possible_sbyte(o
))
782 return v
>= -128 && v
<= 127;
785 static bool is_sbyte32(operand
*o
)
789 if (!possible_sbyte(o
))
793 return v
>= -128 && v
<= 127;
796 static void bad_hle_warn(const insn
* ins
, uint8_t hleok
)
798 enum prefixes rep_pfx
= ins
->prefixes
[PPS_REP
];
799 enum whatwarn
{ w_none
, w_lock
, w_inval
} ww
;
800 static const enum whatwarn warn
[2][4] =
802 { w_inval
, w_inval
, w_none
, w_lock
}, /* XACQUIRE */
803 { w_inval
, w_none
, w_none
, w_lock
}, /* XRELEASE */
807 n
= (unsigned int)rep_pfx
- P_XACQUIRE
;
809 return; /* Not XACQUIRE/XRELEASE */
812 if (!is_class(MEMORY
, ins
->oprs
[0].type
))
813 ww
= w_inval
; /* HLE requires operand 0 to be memory */
820 if (ins
->prefixes
[PPS_LOCK
] != P_LOCK
) {
821 errfunc(ERR_WARNING
| ERR_WARN_HLE
| ERR_PASS2
,
822 "%s with this instruction requires lock",
823 prefix_name(rep_pfx
));
828 errfunc(ERR_WARNING
| ERR_WARN_HLE
| ERR_PASS2
,
829 "%s invalid with this instruction",
830 prefix_name(rep_pfx
));
835 /* Common construct */
836 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
838 static int64_t calcsize(int32_t segment
, int64_t offset
, int bits
,
839 insn
* ins
, const struct itemplate
*temp
)
841 const uint8_t *codes
= temp
->code
;
850 bool lockcheck
= true;
852 ins
->rex
= 0; /* Ensure REX is reset */
853 eat
= EA_SCALAR
; /* Expect a scalar EA */
855 if (ins
->prefixes
[PPS_OSIZE
] == P_O64
)
858 (void)segment
; /* Don't warn that this parameter is unused */
859 (void)offset
; /* Don't warn that this parameter is unused */
863 op1
= (c
& 3) + ((opex
& 1) << 2);
864 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
865 opx
= &ins
->oprs
[op1
];
866 opex
= 0; /* For the next iteration */
873 codes
+= c
, length
+= c
;
884 op_rexflags(opx
, REX_B
|REX_H
|REX_P
|REX_W
);
899 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
900 length
+= (opx
->type
& BITS16
) ? 2 : 4;
902 length
+= (bits
== 16) ? 2 : 4;
910 length
+= ins
->addr_size
>> 3;
918 length
+= 8; /* MOV reg64/imm */
926 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
927 length
+= (opx
->type
& BITS16
) ? 2 : 4;
929 length
+= (bits
== 16) ? 2 : 4;
941 length
+= is_sbyte16(opx
) ? 1 : 2;
950 length
+= is_sbyte32(opx
) ? 1 : 4;
969 length
+= is_sbyte32(opx
) ? 1 : 4;
978 ins
->vexreg
= regval(opx
);
979 ins
->vex_cm
= *codes
++;
980 ins
->vex_wlp
= *codes
++;
986 ins
->vex_cm
= *codes
++;
987 ins
->vex_wlp
= *codes
++;
1006 length
+= (bits
!= 16) && !has_prefix(ins
, PPS_ASIZE
, P_A16
);
1010 length
+= (bits
!= 32) && !has_prefix(ins
, PPS_ASIZE
, P_A32
);
1017 if (bits
!= 64 || has_prefix(ins
, PPS_ASIZE
, P_A16
) ||
1018 has_prefix(ins
, PPS_ASIZE
, P_A32
))
1027 enum prefixes pfx
= ins
->prefixes
[PPS_OSIZE
];
1031 errfunc(ERR_WARNING
| ERR_PASS2
, "invalid operand size prefix");
1033 ins
->prefixes
[PPS_OSIZE
] = P_O16
;
1039 enum prefixes pfx
= ins
->prefixes
[PPS_OSIZE
];
1043 errfunc(ERR_WARNING
| ERR_PASS2
, "invalid operand size prefix");
1045 ins
->prefixes
[PPS_OSIZE
] = P_O32
;
1084 if (!ins
->prefixes
[PPS_REP
])
1085 ins
->prefixes
[PPS_REP
] = P_REP
;
1089 if (!ins
->prefixes
[PPS_REP
])
1090 ins
->prefixes
[PPS_REP
] = P_REPNE
;
1094 if (ins
->oprs
[0].segment
!= NO_SEG
)
1095 errfunc(ERR_NONFATAL
, "attempt to reserve non-constant"
1096 " quantity of BSS space");
1098 length
+= ins
->oprs
[0].offset
;
1102 if (!ins
->prefixes
[PPS_WAIT
])
1103 ins
->prefixes
[PPS_WAIT
] = P_WAIT
;
1161 struct operand
*opy
= &ins
->oprs
[op2
];
1163 ea_data
.rex
= 0; /* Ensure ea.REX is initially 0 */
1166 /* pick rfield from operand b (opx) */
1167 rflags
= regflag(opx
);
1168 rfield
= nasm_regvals
[opx
->basereg
];
1173 if (process_ea(opy
, &ea_data
, bits
,ins
->addr_size
,
1174 rfield
, rflags
) != eat
) {
1175 errfunc(ERR_NONFATAL
, "invalid effective address");
1178 ins
->rex
|= ea_data
.rex
;
1179 length
+= ea_data
.size
;
1185 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1186 ": instruction code \\%o (0x%02X) given", c
, c
);
1191 ins
->rex
&= rex_mask
;
1193 if (ins
->rex
& REX_NH
) {
1194 if (ins
->rex
& REX_H
) {
1195 errfunc(ERR_NONFATAL
, "instruction cannot use high registers");
1198 ins
->rex
&= ~REX_P
; /* Don't force REX prefix due to high reg */
1201 if (ins
->rex
& REX_V
) {
1202 int bad32
= REX_R
|REX_W
|REX_X
|REX_B
;
1204 if (ins
->rex
& REX_H
) {
1205 errfunc(ERR_NONFATAL
, "cannot use high register in vex instruction");
1208 switch (ins
->vex_wlp
& 060) {
1222 if (bits
!= 64 && ((ins
->rex
& bad32
) || ins
->vexreg
> 7)) {
1223 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1226 if (ins
->vex_cm
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
)))
1230 } else if (ins
->rex
& REX_REAL
) {
1231 if (ins
->rex
& REX_H
) {
1232 errfunc(ERR_NONFATAL
, "cannot use high register in rex instruction");
1234 } else if (bits
== 64) {
1236 } else if ((ins
->rex
& REX_L
) &&
1237 !(ins
->rex
& (REX_P
|REX_W
|REX_X
|REX_B
)) &&
1240 assert_no_prefix(ins
, PPS_LOCK
);
1241 lockcheck
= false; /* Already errored, no need for warning */
1244 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1249 if (has_prefix(ins
, PPS_LOCK
, P_LOCK
) && lockcheck
&&
1250 (!(temp
->flags
& IF_LOCK
) || !is_class(MEMORY
, ins
->oprs
[0].type
))) {
1251 errfunc(ERR_WARNING
| ERR_WARN_LOCK
| ERR_PASS2
,
1252 "instruction is not lockable");
1255 bad_hle_warn(ins
, hleok
);
1260 #define EMIT_REX() \
1261 if (!(ins->rex & REX_V) && (ins->rex & REX_REAL) && (bits == 64)) { \
1262 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1263 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1268 static void gencode(int32_t segment
, int64_t offset
, int bits
,
1269 insn
* ins
, const struct itemplate
*temp
,
1272 static const char condval
[] = { /* conditional opcodes */
1273 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1274 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1275 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1282 struct operand
*opx
;
1283 const uint8_t *codes
= temp
->code
;
1285 enum ea_type eat
= EA_SCALAR
;
1289 op1
= (c
& 3) + ((opex
& 1) << 2);
1290 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
1291 opx
= &ins
->oprs
[op1
];
1292 opex
= 0; /* For the next iteration */
1300 out(offset
, segment
, codes
, OUT_RAWDATA
, c
, NO_SEG
, NO_SEG
);
1313 bytes
[0] = *codes
++ + (regval(opx
) & 7);
1314 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1320 * The test for BITS8 and SBYTE here is intended to avoid
1321 * warning on optimizer actions due to SBYTE, while still
1322 * warn on explicit BYTE directives. Also warn, obviously,
1323 * if the optimizer isn't enabled.
1325 if (((opx
->type
& BITS8
) ||
1326 !(opx
->type
& temp
->opd
[op1
] & BYTENESS
)) &&
1327 (opx
->offset
< -128 || opx
->offset
> 127)) {
1328 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1329 "signed byte value exceeds bounds");
1331 if (opx
->segment
!= NO_SEG
) {
1333 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1334 opx
->segment
, opx
->wrt
);
1336 bytes
[0] = opx
->offset
;
1337 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1344 if (opx
->offset
< -256 || opx
->offset
> 255) {
1345 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1346 "byte value exceeds bounds");
1348 if (opx
->segment
!= NO_SEG
) {
1350 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1351 opx
->segment
, opx
->wrt
);
1353 bytes
[0] = opx
->offset
;
1354 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1361 if (opx
->offset
< 0 || opx
->offset
> 255)
1362 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1363 "unsigned byte value exceeds bounds");
1364 if (opx
->segment
!= NO_SEG
) {
1366 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1367 opx
->segment
, opx
->wrt
);
1369 bytes
[0] = opx
->offset
;
1370 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1377 warn_overflow_opd(opx
, 2);
1379 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1380 opx
->segment
, opx
->wrt
);
1385 if (opx
->type
& (BITS16
| BITS32
))
1386 size
= (opx
->type
& BITS16
) ? 2 : 4;
1388 size
= (bits
== 16) ? 2 : 4;
1389 warn_overflow_opd(opx
, size
);
1391 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1392 opx
->segment
, opx
->wrt
);
1397 warn_overflow_opd(opx
, 4);
1399 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1400 opx
->segment
, opx
->wrt
);
1406 size
= ins
->addr_size
>> 3;
1407 warn_overflow_opd(opx
, size
);
1408 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1409 opx
->segment
, opx
->wrt
);
1414 if (opx
->segment
!= segment
) {
1416 out(offset
, segment
, &data
,
1417 OUT_REL1ADR
, insn_end
- offset
,
1418 opx
->segment
, opx
->wrt
);
1420 data
= opx
->offset
- insn_end
;
1421 if (data
> 127 || data
< -128)
1422 errfunc(ERR_NONFATAL
, "short jump is out of range");
1423 out(offset
, segment
, &data
,
1424 OUT_ADDRESS
, 1, NO_SEG
, NO_SEG
);
1430 data
= (int64_t)opx
->offset
;
1431 out(offset
, segment
, &data
, OUT_ADDRESS
, 8,
1432 opx
->segment
, opx
->wrt
);
1437 if (opx
->segment
!= segment
) {
1439 out(offset
, segment
, &data
,
1440 OUT_REL2ADR
, insn_end
- offset
,
1441 opx
->segment
, opx
->wrt
);
1443 data
= opx
->offset
- insn_end
;
1444 out(offset
, segment
, &data
,
1445 OUT_ADDRESS
, 2, NO_SEG
, NO_SEG
);
1451 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
1452 size
= (opx
->type
& BITS16
) ? 2 : 4;
1454 size
= (bits
== 16) ? 2 : 4;
1455 if (opx
->segment
!= segment
) {
1457 out(offset
, segment
, &data
,
1458 size
== 2 ? OUT_REL2ADR
: OUT_REL4ADR
,
1459 insn_end
- offset
, opx
->segment
, opx
->wrt
);
1461 data
= opx
->offset
- insn_end
;
1462 out(offset
, segment
, &data
,
1463 OUT_ADDRESS
, size
, NO_SEG
, NO_SEG
);
1469 if (opx
->segment
!= segment
) {
1471 out(offset
, segment
, &data
,
1472 OUT_REL4ADR
, insn_end
- offset
,
1473 opx
->segment
, opx
->wrt
);
1475 data
= opx
->offset
- insn_end
;
1476 out(offset
, segment
, &data
,
1477 OUT_ADDRESS
, 4, NO_SEG
, NO_SEG
);
1483 if (opx
->segment
== NO_SEG
)
1484 errfunc(ERR_NONFATAL
, "value referenced by FAR is not"
1487 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1488 outfmt
->segbase(1 + opx
->segment
),
1495 warn_overflow_opd(opx
, 2);
1496 if (is_sbyte16(opx
)) {
1498 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1502 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1503 opx
->segment
, opx
->wrt
);
1510 bytes
[0] = *codes
++;
1511 if (is_sbyte16(opx
))
1512 bytes
[0] |= 2; /* s-bit */
1513 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1519 warn_overflow_opd(opx
, 4);
1520 if (is_sbyte32(opx
)) {
1522 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1526 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1527 opx
->segment
, opx
->wrt
);
1534 bytes
[0] = *codes
++;
1535 if (is_sbyte32(opx
))
1536 bytes
[0] |= 2; /* s-bit */
1537 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1543 opx
= &ins
->oprs
[c
>> 3];
1544 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1545 opx
= &ins
->oprs
[c
& 7];
1546 if (opx
->segment
!= NO_SEG
|| opx
->wrt
!= NO_SEG
) {
1547 errfunc(ERR_NONFATAL
,
1548 "non-absolute expression not permitted as argument %d",
1551 if (opx
->offset
& ~15) {
1552 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1553 "four-bit argument exceeds bounds");
1555 bytes
[0] |= opx
->offset
& 15;
1557 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1563 opx
= &ins
->oprs
[c
>> 4];
1564 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1566 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1571 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1572 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1578 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1579 (int32_t)data
!= (int64_t)data
) {
1580 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1581 "signed dword immediate exceeds bounds");
1583 if (is_sbyte32(opx
)) {
1585 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1589 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1590 opx
->segment
, opx
->wrt
);
1597 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1598 (int32_t)data
!= (int64_t)data
) {
1599 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1600 "signed dword immediate exceeds bounds");
1602 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1603 opx
->segment
, opx
->wrt
);
1610 if (ins
->vex_cm
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
))) {
1611 bytes
[0] = (ins
->vex_cm
>> 6) ? 0x8f : 0xc4;
1612 bytes
[1] = (ins
->vex_cm
& 31) | ((~ins
->rex
& 7) << 5);
1613 bytes
[2] = ((ins
->rex
& REX_W
) << (7-3)) |
1614 ((~ins
->vexreg
& 15)<< 3) | (ins
->vex_wlp
& 07);
1615 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 3, NO_SEG
, NO_SEG
);
1619 bytes
[1] = ((~ins
->rex
& REX_R
) << (7-2)) |
1620 ((~ins
->vexreg
& 15) << 3) | (ins
->vex_wlp
& 07);
1621 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 2, NO_SEG
, NO_SEG
);
1636 if (ins
->rex
& REX_W
)
1638 else if (ins
->prefixes
[PPS_OSIZE
] == P_O16
)
1640 else if (ins
->prefixes
[PPS_OSIZE
] == P_O32
)
1645 um
= (uint64_t)2 << (s
-1);
1648 if (uv
> 127 && uv
< (uint64_t)-128 &&
1649 (uv
< um
-128 || uv
> um
-1)) {
1650 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1651 "signed byte value exceeds bounds");
1653 if (opx
->segment
!= NO_SEG
) {
1655 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1656 opx
->segment
, opx
->wrt
);
1659 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1670 if (bits
== 32 && !has_prefix(ins
, PPS_ASIZE
, P_A16
)) {
1672 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1679 if (bits
!= 32 && !has_prefix(ins
, PPS_ASIZE
, P_A32
)) {
1681 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1713 *bytes
= *codes
++ ^ condval
[ins
->condition
];
1714 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1723 *bytes
= c
- 0332 + 0xF2;
1724 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1729 if (ins
->rex
& REX_R
) {
1731 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1734 ins
->rex
&= ~(REX_L
|REX_R
);
1745 if (ins
->oprs
[0].segment
!= NO_SEG
)
1746 errfunc(ERR_PANIC
, "non-constant BSS size in pass two");
1748 int64_t size
= ins
->oprs
[0].offset
;
1750 out(offset
, segment
, NULL
,
1751 OUT_RESERVE
, size
, NO_SEG
, NO_SEG
);
1762 switch (ins
->oprs
[0].basereg
) {
1777 "bizarre 8086 segment register received");
1779 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1786 switch (ins
->oprs
[0].basereg
) {
1795 "bizarre 386 segment register received");
1797 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1806 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1812 bytes
[0] = c
- 0362 + 0xf2;
1813 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1823 *bytes
= c
- 0366 + 0x66;
1824 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1833 *bytes
= bits
== 16 ? 3 : 5;
1834 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1864 struct operand
*opy
= &ins
->oprs
[op2
];
1867 /* pick rfield from operand b (opx) */
1868 rflags
= regflag(opx
);
1869 rfield
= nasm_regvals
[opx
->basereg
];
1871 /* rfield is constant */
1876 if (process_ea(opy
, &ea_data
, bits
, ins
->addr_size
,
1877 rfield
, rflags
) != eat
)
1878 errfunc(ERR_NONFATAL
, "invalid effective address");
1881 *p
++ = ea_data
.modrm
;
1882 if (ea_data
.sib_present
)
1886 out(offset
, segment
, bytes
, OUT_RAWDATA
, s
, NO_SEG
, NO_SEG
);
1889 * Make sure the address gets the right offset in case
1890 * the line breaks in the .lst file (BR 1197827)
1895 switch (ea_data
.bytes
) {
1905 if (opy
->segment
== segment
) {
1907 if (overflow_signed(data
, ea_data
.bytes
))
1908 warn_overflow(ERR_PASS2
, ea_data
.bytes
);
1909 out(offset
, segment
, &data
, OUT_ADDRESS
,
1910 ea_data
.bytes
, NO_SEG
, NO_SEG
);
1912 /* overflow check in output/linker? */
1913 out(offset
, segment
, &data
, OUT_REL4ADR
,
1914 insn_end
- offset
, opy
->segment
, opy
->wrt
);
1917 if (overflow_general(opy
->offset
, ins
->addr_size
>> 3) ||
1918 signed_bits(opy
->offset
, ins
->addr_size
) !=
1919 signed_bits(opy
->offset
, ea_data
.bytes
* 8))
1920 warn_overflow(ERR_PASS2
, ea_data
.bytes
);
1922 out(offset
, segment
, &data
, OUT_ADDRESS
,
1923 ea_data
.bytes
, opy
->segment
, opy
->wrt
);
1929 "Invalid amount of bytes (%d) for offset?!",
1938 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1939 ": instruction code \\%o (0x%02X) given", c
, c
);
1945 static opflags_t
regflag(const operand
* o
)
1947 if (!is_register(o
->basereg
))
1948 errfunc(ERR_PANIC
, "invalid operand passed to regflag()");
1949 return nasm_reg_flags
[o
->basereg
];
1952 static int32_t regval(const operand
* o
)
1954 if (!is_register(o
->basereg
))
1955 errfunc(ERR_PANIC
, "invalid operand passed to regval()");
1956 return nasm_regvals
[o
->basereg
];
1959 static int op_rexflags(const operand
* o
, int mask
)
1964 if (!is_register(o
->basereg
))
1965 errfunc(ERR_PANIC
, "invalid operand passed to op_rexflags()");
1967 flags
= nasm_reg_flags
[o
->basereg
];
1968 val
= nasm_regvals
[o
->basereg
];
1970 return rexflags(val
, flags
, mask
);
1973 static int rexflags(int val
, opflags_t flags
, int mask
)
1978 rex
|= REX_B
|REX_X
|REX_R
;
1981 if (!(REG_HIGH
& ~flags
)) /* AH, CH, DH, BH */
1983 else if (!(REG8
& ~flags
) && val
>= 4) /* SPL, BPL, SIL, DIL */
1989 static enum match_result
find_match(const struct itemplate
**tempp
,
1991 int32_t segment
, int64_t offset
, int bits
)
1993 const struct itemplate
*temp
;
1994 enum match_result m
, merr
;
1995 opflags_t xsizeflags
[MAX_OPERANDS
];
1996 bool opsizemissing
= false;
1999 for (i
= 0; i
< instruction
->operands
; i
++)
2000 xsizeflags
[i
] = instruction
->oprs
[i
].type
& SIZE_MASK
;
2002 merr
= MERR_INVALOP
;
2004 for (temp
= nasm_instructions
[instruction
->opcode
];
2005 temp
->opcode
!= I_none
; temp
++) {
2006 m
= matches(temp
, instruction
, bits
);
2007 if (m
== MOK_JUMP
) {
2008 if (jmp_match(segment
, offset
, bits
, instruction
, temp
))
2012 } else if (m
== MERR_OPSIZEMISSING
&&
2013 (temp
->flags
& IF_SMASK
) != IF_SX
) {
2015 * Missing operand size and a candidate for fuzzy matching...
2017 for (i
= 0; i
< temp
->operands
; i
++) {
2018 if ((temp
->opd
[i
] & SAME_AS
) == 0)
2019 xsizeflags
[i
] |= temp
->opd
[i
] & SIZE_MASK
;
2021 opsizemissing
= true;
2025 if (merr
== MOK_GOOD
)
2029 /* No match, but see if we can get a fuzzy operand size match... */
2033 for (i
= 0; i
< instruction
->operands
; i
++) {
2035 * We ignore extrinsic operand sizes on registers, so we should
2036 * never try to fuzzy-match on them. This also resolves the case
2037 * when we have e.g. "xmmrm128" in two different positions.
2039 if (is_class(REGISTER
, instruction
->oprs
[i
].type
))
2042 /* This tests if xsizeflags[i] has more than one bit set */
2043 if ((xsizeflags
[i
] & (xsizeflags
[i
]-1)))
2044 goto done
; /* No luck */
2046 instruction
->oprs
[i
].type
|= xsizeflags
[i
]; /* Set the size */
2049 /* Try matching again... */
2050 for (temp
= nasm_instructions
[instruction
->opcode
];
2051 temp
->opcode
!= I_none
; temp
++) {
2052 m
= matches(temp
, instruction
, bits
);
2053 if (m
== MOK_JUMP
) {
2054 if (jmp_match(segment
, offset
, bits
, instruction
, temp
))
2061 if (merr
== MOK_GOOD
)
2070 static enum match_result
matches(const struct itemplate
*itemp
,
2071 insn
*instruction
, int bits
)
2073 opflags_t size
[MAX_OPERANDS
], asize
;
2074 bool opsizemissing
= false;
2080 if (itemp
->opcode
!= instruction
->opcode
)
2081 return MERR_INVALOP
;
2084 * Count the operands
2086 if (itemp
->operands
!= instruction
->operands
)
2087 return MERR_INVALOP
;
2092 if (!(optimizing
> 0) && (itemp
->flags
& IF_OPT
))
2093 return MERR_INVALOP
;
2096 * Check that no spurious colons or TOs are present
2098 for (i
= 0; i
< itemp
->operands
; i
++)
2099 if (instruction
->oprs
[i
].type
& ~itemp
->opd
[i
] & (COLON
| TO
))
2100 return MERR_INVALOP
;
2103 * Process size flags
2105 switch (itemp
->flags
& IF_SMASK
) {
2145 if (itemp
->flags
& IF_ARMASK
) {
2146 /* S- flags only apply to a specific operand */
2147 i
= ((itemp
->flags
& IF_ARMASK
) >> IF_ARSHFT
) - 1;
2148 memset(size
, 0, sizeof size
);
2151 /* S- flags apply to all operands */
2152 for (i
= 0; i
< MAX_OPERANDS
; i
++)
2157 * Check that the operand flags all match up,
2158 * it's a bit tricky so lets be verbose:
2160 * 1) Find out the size of operand. If instruction
2161 * doesn't have one specified -- we're trying to
2162 * guess it either from template (IF_S* flag) or
2165 * 2) If template operand (i) has SAME_AS flag [used for registers only]
2166 * (ie the same operand as was specified somewhere in template, and
2167 * this referred operand index is being achieved via ~SAME_AS)
2168 * we are to be sure that both registers (in template and instruction)
2171 * 3) If template operand do not match the instruction OR
2172 * template has an operand size specified AND this size differ
2173 * from which instruction has (perhaps we got it from code bits)
2175 * a) Check that only size of instruction and operand is differ
2176 * other characteristics do match
2177 * b) Perhaps it's a register specified in instruction so
2178 * for such a case we just mark that operand as "size
2179 * missing" and this will turn on fuzzy operand size
2180 * logic facility (handled by a caller)
2182 for (i
= 0; i
< itemp
->operands
; i
++) {
2183 opflags_t type
= instruction
->oprs
[i
].type
;
2184 if (!(type
& SIZE_MASK
))
2187 if (itemp
->opd
[i
] & SAME_AS
) {
2188 int j
= itemp
->opd
[i
] & ~SAME_AS
;
2189 if (type
!= instruction
->oprs
[j
].type
||
2190 instruction
->oprs
[i
].basereg
!= instruction
->oprs
[j
].basereg
)
2191 return MERR_INVALOP
;
2192 } else if (itemp
->opd
[i
] & ~type
||
2193 ((itemp
->opd
[i
] & SIZE_MASK
) &&
2194 ((itemp
->opd
[i
] ^ type
) & SIZE_MASK
))) {
2195 if ((itemp
->opd
[i
] & ~type
& ~SIZE_MASK
) || (type
& SIZE_MASK
)) {
2196 return MERR_INVALOP
;
2197 } else if (!is_class(REGISTER
, type
)) {
2199 * Note: we don't honor extrinsic operand sizes for registers,
2200 * so "missing operand size" for a register should be
2201 * considered a wildcard match rather than an error.
2203 opsizemissing
= true;
2209 return MERR_OPSIZEMISSING
;
2212 * Check operand sizes
2214 if (itemp
->flags
& (IF_SM
| IF_SM2
)) {
2215 oprs
= (itemp
->flags
& IF_SM2
? 2 : itemp
->operands
);
2216 for (i
= 0; i
< oprs
; i
++) {
2217 asize
= itemp
->opd
[i
] & SIZE_MASK
;
2219 for (i
= 0; i
< oprs
; i
++)
2225 oprs
= itemp
->operands
;
2228 for (i
= 0; i
< itemp
->operands
; i
++) {
2229 if (!(itemp
->opd
[i
] & SIZE_MASK
) &&
2230 (instruction
->oprs
[i
].type
& SIZE_MASK
& ~size
[i
]))
2231 return MERR_OPSIZEMISMATCH
;
2235 * Check template is okay at the set cpu level
2237 if (((itemp
->flags
& IF_PLEVEL
) > cpu
))
2241 * Verify the appropriate long mode flag.
2243 if ((itemp
->flags
& (bits
== 64 ? IF_NOLONG
: IF_LONG
)))
2244 return MERR_BADMODE
;
2247 * If we have a HLE prefix, look for the NOHLE flag
2249 if ((itemp
->flags
& IF_NOHLE
) &&
2250 (has_prefix(instruction
, PPS_REP
, P_XACQUIRE
) ||
2251 has_prefix(instruction
, PPS_REP
, P_XRELEASE
)))
2255 * Check if special handling needed for Jumps
2257 if ((itemp
->code
[0] & ~1) == 0370)
2263 static enum ea_type
process_ea(operand
*input
, ea
*output
, int bits
,
2264 int addrbits
, int rfield
, opflags_t rflags
)
2266 bool forw_ref
= !!(input
->opflags
& OPFLAG_UNKNOWN
);
2268 output
->type
= EA_SCALAR
;
2269 output
->rip
= false;
2271 /* REX flags for the rfield operand */
2272 output
->rex
|= rexflags(rfield
, rflags
, REX_R
| REX_P
| REX_W
| REX_H
);
2274 if (is_class(REGISTER
, input
->type
)) {
2276 * It's a direct register.
2280 if (!is_register(input
->basereg
))
2285 if (!is_class(REG_EA
, f
))
2288 output
->rex
|= op_rexflags(input
, REX_B
| REX_P
| REX_W
| REX_H
);
2289 output
->sib_present
= false; /* no SIB necessary */
2290 output
->bytes
= 0; /* no offset necessary either */
2291 output
->modrm
= GEN_MODRM(3, rfield
, nasm_regvals
[input
->basereg
]);
2294 * It's a memory reference.
2296 if (input
->basereg
== -1 &&
2297 (input
->indexreg
== -1 || input
->scale
== 0)) {
2299 * It's a pure offset.
2301 if (bits
== 64 && ((input
->type
& IP_REL
) == IP_REL
) &&
2302 input
->segment
== NO_SEG
) {
2303 nasm_error(ERR_WARNING
| ERR_PASS1
, "absolute address can not be RIP-relative");
2304 input
->type
&= ~IP_REL
;
2305 input
->type
|= MEMORY
;
2308 if (input
->eaflags
& EAF_BYTEOFFS
||
2309 (input
->eaflags
& EAF_WORDOFFS
&&
2310 input
->disp_size
!= (addrbits
!= 16 ? 32 : 16))) {
2311 nasm_error(ERR_WARNING
| ERR_PASS1
, "displacement size ignored on absolute address");
2314 if (bits
== 64 && (~input
->type
& IP_REL
)) {
2315 output
->sib_present
= true;
2316 output
->sib
= GEN_SIB(0, 4, 5);
2318 output
->modrm
= GEN_MODRM(0, rfield
, 4);
2319 output
->rip
= false;
2321 output
->sib_present
= false;
2322 output
->bytes
= (addrbits
!= 16 ? 4 : 2);
2323 output
->modrm
= GEN_MODRM(0, rfield
, (addrbits
!= 16 ? 5 : 6));
2324 output
->rip
= bits
== 64;
2328 * It's an indirection.
2330 int i
= input
->indexreg
, b
= input
->basereg
, s
= input
->scale
;
2331 int32_t seg
= input
->segment
;
2332 int hb
= input
->hintbase
, ht
= input
->hinttype
;
2333 int t
, it
, bt
; /* register numbers */
2334 opflags_t x
, ix
, bx
; /* register flags */
2337 i
= -1; /* make this easy, at least */
2339 if (is_register(i
)) {
2340 it
= nasm_regvals
[i
];
2341 ix
= nasm_reg_flags
[i
];
2347 if (is_register(b
)) {
2348 bt
= nasm_regvals
[b
];
2349 bx
= nasm_reg_flags
[b
];
2355 /* if either one are a vector register... */
2356 if ((ix
|bx
) & (XMMREG
|YMMREG
) & ~REG_EA
) {
2357 opflags_t sok
= BITS32
| BITS64
;
2358 int32_t o
= input
->offset
;
2359 int mod
, scale
, index
, base
;
2362 * For a vector SIB, one has to be a vector and the other,
2363 * if present, a GPR. The vector must be the index operand.
2365 if (it
== -1 || (bx
& (XMMREG
|YMMREG
) & ~REG_EA
)) {
2371 t
= bt
, bt
= it
, it
= t
;
2372 x
= bx
, bx
= ix
, ix
= x
;
2378 if (!(REG64
& ~bx
) || !(REG32
& ~bx
))
2385 * While we're here, ensure the user didn't specify
2388 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2391 if (addrbits
== 16 ||
2392 (addrbits
== 32 && !(sok
& BITS32
)) ||
2393 (addrbits
== 64 && !(sok
& BITS64
)))
2396 output
->type
= (ix
& YMMREG
& ~REG_EA
)
2397 ? EA_YMMVSIB
: EA_XMMVSIB
;
2399 output
->rex
|= rexflags(it
, ix
, REX_X
);
2400 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2402 index
= it
& 7; /* it is known to be != -1 */
2417 default: /* then what the smeg is it? */
2418 goto err
; /* panic */
2426 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2427 seg
== NO_SEG
&& !forw_ref
&&
2428 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2430 else if (input
->eaflags
& EAF_BYTEOFFS
||
2431 (o
>= -128 && o
<= 127 &&
2432 seg
== NO_SEG
&& !forw_ref
&&
2433 !(input
->eaflags
& EAF_WORDOFFS
)))
2439 output
->sib_present
= true;
2440 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2441 output
->modrm
= GEN_MODRM(mod
, rfield
, 4);
2442 output
->sib
= GEN_SIB(scale
, index
, base
);
2443 } else if ((ix
|bx
) & (BITS32
|BITS64
)) {
2445 * it must be a 32/64-bit memory reference. Firstly we have
2446 * to check that all registers involved are type E/Rxx.
2448 opflags_t sok
= BITS32
| BITS64
;
2449 int32_t o
= input
->offset
;
2452 if (!(REG64
& ~ix
) || !(REG32
& ~ix
))
2460 goto err
; /* Invalid register */
2461 if (~sok
& bx
& SIZE_MASK
)
2462 goto err
; /* Invalid size */
2467 * While we're here, ensure the user didn't specify
2470 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2473 if (addrbits
== 16 ||
2474 (addrbits
== 32 && !(sok
& BITS32
)) ||
2475 (addrbits
== 64 && !(sok
& BITS64
)))
2478 /* now reorganize base/index */
2479 if (s
== 1 && bt
!= it
&& bt
!= -1 && it
!= -1 &&
2480 ((hb
== b
&& ht
== EAH_NOTBASE
) ||
2481 (hb
== i
&& ht
== EAH_MAKEBASE
))) {
2482 /* swap if hints say so */
2483 t
= bt
, bt
= it
, it
= t
;
2484 x
= bx
, bx
= ix
, ix
= x
;
2486 if (bt
== it
) /* convert EAX+2*EAX to 3*EAX */
2487 bt
= -1, bx
= 0, s
++;
2488 if (bt
== -1 && s
== 1 && !(hb
== it
&& ht
== EAH_NOTBASE
)) {
2489 /* make single reg base, unless hint */
2490 bt
= it
, bx
= ix
, it
= -1, ix
= 0;
2492 if (((s
== 2 && it
!= REG_NUM_ESP
&& !(input
->eaflags
& EAF_TIMESTWO
)) ||
2493 s
== 3 || s
== 5 || s
== 9) && bt
== -1)
2494 bt
= it
, bx
= ix
, s
--; /* convert 3*EAX to EAX+2*EAX */
2495 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
&&
2496 (input
->eaflags
& EAF_TIMESTWO
))
2497 it
= bt
, ix
= bx
, bt
= -1, bx
= 0, s
= 1;
2498 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2499 if (s
== 1 && it
== REG_NUM_ESP
) {
2500 /* swap ESP into base if scale is 1 */
2501 t
= it
, it
= bt
, bt
= t
;
2502 x
= ix
, ix
= bx
, bx
= x
;
2504 if (it
== REG_NUM_ESP
||
2505 (s
!= 1 && s
!= 2 && s
!= 4 && s
!= 8 && it
!= -1))
2506 goto err
; /* wrong, for various reasons */
2508 output
->rex
|= rexflags(it
, ix
, REX_X
);
2509 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2511 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
) {
2520 if (rm
!= REG_NUM_EBP
&& o
== 0 &&
2521 seg
== NO_SEG
&& !forw_ref
&&
2522 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2524 else if (input
->eaflags
& EAF_BYTEOFFS
||
2525 (o
>= -128 && o
<= 127 &&
2526 seg
== NO_SEG
&& !forw_ref
&&
2527 !(input
->eaflags
& EAF_WORDOFFS
)))
2533 output
->sib_present
= false;
2534 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2535 output
->modrm
= GEN_MODRM(mod
, rfield
, rm
);
2538 int mod
, scale
, index
, base
;
2558 default: /* then what the smeg is it? */
2559 goto err
; /* panic */
2567 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2568 seg
== NO_SEG
&& !forw_ref
&&
2569 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2571 else if (input
->eaflags
& EAF_BYTEOFFS
||
2572 (o
>= -128 && o
<= 127 &&
2573 seg
== NO_SEG
&& !forw_ref
&&
2574 !(input
->eaflags
& EAF_WORDOFFS
)))
2580 output
->sib_present
= true;
2581 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2582 output
->modrm
= GEN_MODRM(mod
, rfield
, 4);
2583 output
->sib
= GEN_SIB(scale
, index
, base
);
2585 } else { /* it's 16-bit */
2587 int16_t o
= input
->offset
;
2589 /* check for 64-bit long mode */
2593 /* check all registers are BX, BP, SI or DI */
2594 if ((b
!= -1 && b
!= R_BP
&& b
!= R_BX
&& b
!= R_SI
&& b
!= R_DI
) ||
2595 (i
!= -1 && i
!= R_BP
&& i
!= R_BX
&& i
!= R_SI
&& i
!= R_DI
))
2598 /* ensure the user didn't specify DWORD/QWORD */
2599 if (input
->disp_size
== 32 || input
->disp_size
== 64)
2602 if (s
!= 1 && i
!= -1)
2603 goto err
; /* no can do, in 16-bit EA */
2604 if (b
== -1 && i
!= -1) {
2609 if ((b
== R_SI
|| b
== R_DI
) && i
!= -1) {
2614 /* have BX/BP as base, SI/DI index */
2616 goto err
; /* shouldn't ever happen, in theory */
2617 if (i
!= -1 && b
!= -1 &&
2618 (i
== R_BP
|| i
== R_BX
|| b
== R_SI
|| b
== R_DI
))
2619 goto err
; /* invalid combinations */
2620 if (b
== -1) /* pure offset: handled above */
2621 goto err
; /* so if it gets to here, panic! */
2625 switch (i
* 256 + b
) {
2626 case R_SI
* 256 + R_BX
:
2629 case R_DI
* 256 + R_BX
:
2632 case R_SI
* 256 + R_BP
:
2635 case R_DI
* 256 + R_BP
:
2653 if (rm
== -1) /* can't happen, in theory */
2654 goto err
; /* so panic if it does */
2656 if (o
== 0 && seg
== NO_SEG
&& !forw_ref
&& rm
!= 6 &&
2657 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2659 else if (input
->eaflags
& EAF_BYTEOFFS
||
2660 (o
>= -128 && o
<= 127 && seg
== NO_SEG
&&
2661 !forw_ref
&& !(input
->eaflags
& EAF_WORDOFFS
)))
2666 output
->sib_present
= false; /* no SIB - it's 16-bit */
2667 output
->bytes
= mod
; /* bytes of offset needed */
2668 output
->modrm
= GEN_MODRM(mod
, rfield
, rm
);
2673 output
->size
= 1 + output
->sib_present
+ output
->bytes
;
2674 return output
->type
;
2677 return output
->type
= EA_INVALID
;
2680 static void add_asp(insn
*ins
, int addrbits
)
2685 valid
= (addrbits
== 64) ? 64|32 : 32|16;
2687 switch (ins
->prefixes
[PPS_ASIZE
]) {
2698 valid
&= (addrbits
== 32) ? 16 : 32;
2704 for (j
= 0; j
< ins
->operands
; j
++) {
2705 if (is_class(MEMORY
, ins
->oprs
[j
].type
)) {
2708 /* Verify as Register */
2709 if (!is_register(ins
->oprs
[j
].indexreg
))
2712 i
= nasm_reg_flags
[ins
->oprs
[j
].indexreg
];
2714 /* Verify as Register */
2715 if (!is_register(ins
->oprs
[j
].basereg
))
2718 b
= nasm_reg_flags
[ins
->oprs
[j
].basereg
];
2720 if (ins
->oprs
[j
].scale
== 0)
2724 int ds
= ins
->oprs
[j
].disp_size
;
2725 if ((addrbits
!= 64 && ds
> 8) ||
2726 (addrbits
== 64 && ds
== 16))
2746 if (valid
& addrbits
) {
2747 ins
->addr_size
= addrbits
;
2748 } else if (valid
& ((addrbits
== 32) ? 16 : 32)) {
2749 /* Add an address size prefix */
2750 ins
->prefixes
[PPS_ASIZE
] = (addrbits
== 32) ? P_A16
: P_A32
;;
2751 ins
->addr_size
= (addrbits
== 32) ? 16 : 32;
2754 errfunc(ERR_NONFATAL
, "impossible combination of address sizes");
2755 ins
->addr_size
= addrbits
; /* Error recovery */
2758 defdisp
= ins
->addr_size
== 16 ? 16 : 32;
2760 for (j
= 0; j
< ins
->operands
; j
++) {
2761 if (!(MEM_OFFS
& ~ins
->oprs
[j
].type
) &&
2762 (ins
->oprs
[j
].disp_size
? ins
->oprs
[j
].disp_size
: defdisp
) != ins
->addr_size
) {
2764 * mem_offs sizes must match the address size; if not,
2765 * strip the MEM_OFFS bit and match only EA instructions
2767 ins
->oprs
[j
].type
&= ~(MEM_OFFS
& ~MEMORY
);