1 /* ----------------------------------------------------------------------- *
3 * Copyright 1996-2011 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 * \274..\277 - a signed byte immediate operand, from operand 0..3,
101 * which is to be extended to the operand size.
102 * \310 - indicates fixed 16-bit address size, i.e. optional 0x67.
103 * \311 - indicates fixed 32-bit address size, i.e. optional 0x67.
104 * \312 - (disassembler only) invalid with non-default address size.
105 * \313 - indicates fixed 64-bit address size, 0x67 invalid.
106 * \314 - (disassembler only) invalid with REX.B
107 * \315 - (disassembler only) invalid with REX.X
108 * \316 - (disassembler only) invalid with REX.R
109 * \317 - (disassembler only) invalid with REX.W
110 * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66.
111 * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66.
112 * \322 - indicates that this instruction is only valid when the
113 * operand size is the default (instruction to disassembler,
114 * generates no code in the assembler)
115 * \323 - indicates fixed 64-bit operand size, REX on extensions only.
116 * \324 - indicates 64-bit operand size requiring REX prefix.
117 * \325 - instruction which always uses spl/bpl/sil/dil
118 * \330 - a literal byte follows in the code stream, to be added
119 * to the condition code value of the instruction.
120 * \331 - instruction not valid with REP prefix. Hint for
121 * disassembler only; for SSE instructions.
122 * \332 - REP prefix (0xF2 byte) used as opcode extension.
123 * \333 - REP prefix (0xF3 byte) used as opcode extension.
124 * \334 - LOCK prefix used as REX.R (used in non-64-bit mode)
125 * \335 - disassemble a rep (0xF3 byte) prefix as repe not rep.
126 * \336 - force a REP(E) prefix (0xF2) even if not specified.
127 * \337 - force a REPNE prefix (0xF3) even if not specified.
128 * \336-\337 are still listed as prefixes in the disassembler.
129 * \340 - reserve <operand 0> bytes of uninitialized storage.
130 * Operand 0 had better be a segmentless constant.
131 * \341 - this instruction needs a WAIT "prefix"
132 * \344,\345 - the PUSH/POP (respectively) codes for CS, DS, ES, SS
133 * (POP is never used for CS) depending on operand 0
134 * \346,\347 - the second byte of PUSH/POP codes for FS, GS, depending
136 * \360 - no SSE prefix (== \364\331)
137 * \361 - 66 SSE prefix (== \366\331)
138 * \362 - F2 SSE prefix (== \364\332)
139 * \363 - F3 SSE prefix (== \364\333)
140 * \364 - operand-size prefix (0x66) not permitted
141 * \365 - address-size prefix (0x67) not permitted
142 * \366 - operand-size prefix (0x66) used as opcode extension
143 * \367 - address-size prefix (0x67) used as opcode extension
144 * \370,\371,\372 - match only if operand 0 meets byte jump criteria.
145 * 370 is used for Jcc, 371 is used for JMP.
146 * \373 - assemble 0x03 if bits==16, 0x05 if bits==32;
147 * used for conditional jump over longer jump
148 * \374 - this instruction takes an XMM VSIB memory EA
149 * \375 - this instruction takes an YMM VSIB memory EA
152 #include "compiler.h"
156 #include <inttypes.h>
160 #include "assemble.h"
166 * Matching errors. These should be sorted so that more specific
167 * errors come later in the sequence.
175 * Matching success; the conditional ones first
177 MOK_JUMP
, /* Matching OK but needs jmp_match() */
178 MOK_GOOD
/* Matching unconditionally OK */
182 enum ea_type type
; /* what kind of EA is this? */
183 int sib_present
; /* is a SIB byte necessary? */
184 int bytes
; /* # of bytes of offset needed */
185 int size
; /* lazy - this is sib+bytes+1 */
186 uint8_t modrm
, sib
, rex
, rip
; /* the bytes themselves */
189 #define GEN_SIB(scale, index, base) \
190 (((scale) << 6) | ((index) << 3) | ((base)))
192 #define GEN_MODRM(mod, reg, rm) \
193 (((mod) << 6) | (((reg) & 7) << 3) | ((rm) & 7))
195 static uint32_t cpu
; /* cpu level received from nasm.c */
196 static efunc errfunc
;
197 static struct ofmt
*outfmt
;
198 static ListGen
*list
;
200 static int64_t calcsize(int32_t, int64_t, int, insn
*, const uint8_t *);
201 static void gencode(int32_t segment
, int64_t offset
, int bits
,
202 insn
* ins
, const struct itemplate
*temp
,
204 static enum match_result
find_match(const struct itemplate
**tempp
,
206 int32_t segment
, int64_t offset
, int bits
);
207 static enum match_result
matches(const struct itemplate
*, insn
*, int bits
);
208 static opflags_t
regflag(const operand
*);
209 static int32_t regval(const operand
*);
210 static int rexflags(int, opflags_t
, int);
211 static int op_rexflags(const operand
*, int);
212 static void add_asp(insn
*, int);
214 static enum ea_type
process_ea(operand
*, ea
*, int, int, int, opflags_t
);
216 static int has_prefix(insn
* ins
, enum prefix_pos pos
, enum prefixes prefix
)
218 return ins
->prefixes
[pos
] == prefix
;
221 static void assert_no_prefix(insn
* ins
, enum prefix_pos pos
)
223 if (ins
->prefixes
[pos
])
224 errfunc(ERR_NONFATAL
, "invalid %s prefix",
225 prefix_name(ins
->prefixes
[pos
]));
228 static const char *size_name(int size
)
250 static void warn_overflow(int pass
, int size
)
252 errfunc(ERR_WARNING
| pass
| ERR_WARN_NOV
,
253 "%s data exceeds bounds", size_name(size
));
256 static void warn_overflow_const(int64_t data
, int size
)
258 if (overflow_general(data
, size
))
259 warn_overflow(ERR_PASS1
, size
);
262 static void warn_overflow_opd(const struct operand
*o
, int size
)
264 if (o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
) {
265 if (overflow_general(o
->offset
, size
))
266 warn_overflow(ERR_PASS2
, size
);
271 * This routine wrappers the real output format's output routine,
272 * in order to pass a copy of the data off to the listing file
273 * generator at the same time.
275 static void out(int64_t offset
, int32_t segto
, const void *data
,
276 enum out_type type
, uint64_t size
,
277 int32_t segment
, int32_t wrt
)
279 static int32_t lineno
= 0; /* static!!! */
280 static char *lnfname
= NULL
;
283 if (type
== OUT_ADDRESS
&& segment
== NO_SEG
&& wrt
== NO_SEG
) {
285 * This is a non-relocated address, and we're going to
286 * convert it into RAWDATA format.
291 errfunc(ERR_PANIC
, "OUT_ADDRESS with size > 8");
295 WRITEADDR(q
, *(int64_t *)data
, size
);
300 list
->output(offset
, data
, type
, size
);
303 * this call to src_get determines when we call the
304 * debug-format-specific "linenum" function
305 * it updates lineno and lnfname to the current values
306 * returning 0 if "same as last time", -2 if lnfname
307 * changed, and the amount by which lineno changed,
308 * if it did. thus, these variables must be static
311 if (src_get(&lineno
, &lnfname
))
312 outfmt
->current_dfmt
->linenum(lnfname
, lineno
, segto
);
314 outfmt
->output(segto
, data
, type
, size
, segment
, wrt
);
317 static bool jmp_match(int32_t segment
, int64_t offset
, int bits
,
318 insn
* ins
, const uint8_t *code
)
323 if ((c
!= 0370 && c
!= 0371) || (ins
->oprs
[0].type
& STRICT
))
327 if (optimizing
< 0 && c
== 0371)
330 isize
= calcsize(segment
, offset
, bits
, ins
, code
);
332 if (ins
->oprs
[0].opflags
& OPFLAG_UNKNOWN
)
333 /* Be optimistic in pass 1 */
336 if (ins
->oprs
[0].segment
!= segment
)
339 isize
= ins
->oprs
[0].offset
- offset
- isize
; /* isize is delta */
340 return (isize
>= -128 && isize
<= 127); /* is it byte size? */
343 int64_t assemble(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
344 insn
* instruction
, struct ofmt
*output
, efunc error
,
347 const struct itemplate
*temp
;
352 int64_t start
= offset
;
353 int64_t wsize
; /* size for DB etc. */
355 errfunc
= error
; /* to pass to other functions */
357 outfmt
= output
; /* likewise */
358 list
= listgen
; /* and again */
360 wsize
= idata_bytes(instruction
->opcode
);
366 int32_t t
= instruction
->times
;
369 "instruction->times < 0 (%ld) in assemble()", t
);
371 while (t
--) { /* repeat TIMES times */
372 list_for_each(e
, instruction
->eops
) {
373 if (e
->type
== EOT_DB_NUMBER
) {
375 errfunc(ERR_NONFATAL
,
376 "integer supplied to a DT, DO or DY"
379 out(offset
, segment
, &e
->offset
,
380 OUT_ADDRESS
, wsize
, e
->segment
, e
->wrt
);
383 } else if (e
->type
== EOT_DB_STRING
||
384 e
->type
== EOT_DB_STRING_FREE
) {
387 out(offset
, segment
, e
->stringval
,
388 OUT_RAWDATA
, e
->stringlen
, NO_SEG
, NO_SEG
);
389 align
= e
->stringlen
% wsize
;
392 align
= wsize
- align
;
393 out(offset
, segment
, zero_buffer
,
394 OUT_RAWDATA
, align
, NO_SEG
, NO_SEG
);
396 offset
+= e
->stringlen
+ align
;
399 if (t
> 0 && t
== instruction
->times
- 1) {
401 * Dummy call to list->output to give the offset to the
404 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
405 list
->uplevel(LIST_TIMES
);
408 if (instruction
->times
> 1)
409 list
->downlevel(LIST_TIMES
);
410 return offset
- start
;
413 if (instruction
->opcode
== I_INCBIN
) {
414 const char *fname
= instruction
->eops
->stringval
;
417 fp
= fopen(fname
, "rb");
419 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
421 } else if (fseek(fp
, 0L, SEEK_END
) < 0) {
422 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
425 static char buf
[4096];
426 size_t t
= instruction
->times
;
431 if (instruction
->eops
->next
) {
432 base
= instruction
->eops
->next
->offset
;
434 if (instruction
->eops
->next
->next
&&
435 len
> (size_t)instruction
->eops
->next
->next
->offset
)
436 len
= (size_t)instruction
->eops
->next
->next
->offset
;
439 * Dummy call to list->output to give the offset to the
442 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
443 list
->uplevel(LIST_INCBIN
);
447 fseek(fp
, base
, SEEK_SET
);
451 m
= fread(buf
, 1, l
> sizeof(buf
) ? sizeof(buf
) : l
, fp
);
454 * This shouldn't happen unless the file
455 * actually changes while we are reading
459 "`incbin': unexpected EOF while"
460 " reading file `%s'", fname
);
461 t
= 0; /* Try to exit cleanly */
464 out(offset
, segment
, buf
, OUT_RAWDATA
, m
,
469 list
->downlevel(LIST_INCBIN
);
470 if (instruction
->times
> 1) {
472 * Dummy call to list->output to give the offset to the
475 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
476 list
->uplevel(LIST_TIMES
);
477 list
->downlevel(LIST_TIMES
);
480 return instruction
->times
* len
;
482 return 0; /* if we're here, there's an error */
485 /* Check to see if we need an address-size prefix */
486 add_asp(instruction
, bits
);
488 m
= find_match(&temp
, instruction
, segment
, offset
, bits
);
492 int64_t insn_size
= calcsize(segment
, offset
, bits
,
493 instruction
, temp
->code
);
494 itimes
= instruction
->times
;
495 if (insn_size
< 0) /* shouldn't be, on pass two */
496 error(ERR_PANIC
, "errors made it through from pass one");
499 for (j
= 0; j
< MAXPREFIX
; j
++) {
501 switch (instruction
->prefixes
[j
]) {
519 error(ERR_WARNING
| ERR_PASS2
,
520 "cs segment base generated, but will be ignored in 64-bit mode");
526 error(ERR_WARNING
| ERR_PASS2
,
527 "ds segment base generated, but will be ignored in 64-bit mode");
533 error(ERR_WARNING
| ERR_PASS2
,
534 "es segment base generated, but will be ignored in 64-bit mode");
546 error(ERR_WARNING
| ERR_PASS2
,
547 "ss segment base generated, but will be ignored in 64-bit mode");
554 "segr6 and segr7 cannot be used as prefixes");
559 "16-bit addressing is not supported "
561 } else if (bits
!= 16)
571 "64-bit addressing is only supported "
595 error(ERR_PANIC
, "invalid instruction prefix");
598 out(offset
, segment
, &c
, OUT_RAWDATA
, 1,
603 insn_end
= offset
+ insn_size
;
604 gencode(segment
, offset
, bits
, instruction
,
607 if (itimes
> 0 && itimes
== instruction
->times
- 1) {
609 * Dummy call to list->output to give the offset to the
612 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
613 list
->uplevel(LIST_TIMES
);
616 if (instruction
->times
> 1)
617 list
->downlevel(LIST_TIMES
);
618 return offset
- start
;
622 case MERR_OPSIZEMISSING
:
623 error(ERR_NONFATAL
, "operation size not specified");
625 case MERR_OPSIZEMISMATCH
:
626 error(ERR_NONFATAL
, "mismatch in operand sizes");
629 error(ERR_NONFATAL
, "no instruction for this cpu level");
632 error(ERR_NONFATAL
, "instruction not supported in %d-bit mode",
637 "invalid combination of opcode and operands");
644 int64_t insn_size(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
645 insn
* instruction
, efunc error
)
647 const struct itemplate
*temp
;
650 errfunc
= error
; /* to pass to other functions */
653 if (instruction
->opcode
== I_none
)
656 if (instruction
->opcode
== I_DB
|| instruction
->opcode
== I_DW
||
657 instruction
->opcode
== I_DD
|| instruction
->opcode
== I_DQ
||
658 instruction
->opcode
== I_DT
|| instruction
->opcode
== I_DO
||
659 instruction
->opcode
== I_DY
) {
661 int32_t isize
, osize
, wsize
;
664 wsize
= idata_bytes(instruction
->opcode
);
666 list_for_each(e
, instruction
->eops
) {
670 if (e
->type
== EOT_DB_NUMBER
) {
672 warn_overflow_const(e
->offset
, wsize
);
673 } else if (e
->type
== EOT_DB_STRING
||
674 e
->type
== EOT_DB_STRING_FREE
)
675 osize
= e
->stringlen
;
677 align
= (-osize
) % wsize
;
680 isize
+= osize
+ align
;
682 return isize
* instruction
->times
;
685 if (instruction
->opcode
== I_INCBIN
) {
686 const char *fname
= instruction
->eops
->stringval
;
691 fp
= fopen(fname
, "rb");
693 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
695 else if (fseek(fp
, 0L, SEEK_END
) < 0)
696 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
700 if (instruction
->eops
->next
) {
701 len
-= instruction
->eops
->next
->offset
;
702 if (instruction
->eops
->next
->next
&&
703 len
> (size_t)instruction
->eops
->next
->next
->offset
) {
704 len
= (size_t)instruction
->eops
->next
->next
->offset
;
707 val
= instruction
->times
* len
;
714 /* Check to see if we need an address-size prefix */
715 add_asp(instruction
, bits
);
717 m
= find_match(&temp
, instruction
, segment
, offset
, bits
);
719 /* we've matched an instruction. */
721 const uint8_t *codes
= temp
->code
;
724 isize
= calcsize(segment
, offset
, bits
, instruction
, codes
);
727 for (j
= 0; j
< MAXPREFIX
; j
++) {
728 switch (instruction
->prefixes
[j
]) {
754 return isize
* instruction
->times
;
756 return -1; /* didn't match any instruction */
760 static bool possible_sbyte(operand
*o
)
762 return o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
&&
763 !(o
->opflags
& OPFLAG_UNKNOWN
) &&
764 optimizing
>= 0 && !(o
->type
& STRICT
);
767 /* check that opn[op] is a signed byte of size 16 or 32 */
768 static bool is_sbyte16(operand
*o
)
772 if (!possible_sbyte(o
))
776 return v
>= -128 && v
<= 127;
779 static bool is_sbyte32(operand
*o
)
783 if (!possible_sbyte(o
))
787 return v
>= -128 && v
<= 127;
790 /* Common construct */
791 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
793 static int64_t calcsize(int32_t segment
, int64_t offset
, int bits
,
794 insn
* ins
, const uint8_t *codes
)
804 ins
->rex
= 0; /* Ensure REX is reset */
805 eat
= EA_SCALAR
; /* Expect a scalar EA */
807 if (ins
->prefixes
[PPS_OSIZE
] == P_O64
)
810 (void)segment
; /* Don't warn that this parameter is unused */
811 (void)offset
; /* Don't warn that this parameter is unused */
815 op1
= (c
& 3) + ((opex
& 1) << 2);
816 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
817 opx
= &ins
->oprs
[op1
];
818 opex
= 0; /* For the next iteration */
825 codes
+= c
, length
+= c
;
836 op_rexflags(opx
, REX_B
|REX_H
|REX_P
|REX_W
);
851 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
852 length
+= (opx
->type
& BITS16
) ? 2 : 4;
854 length
+= (bits
== 16) ? 2 : 4;
862 length
+= ins
->addr_size
>> 3;
870 length
+= 8; /* MOV reg64/imm */
878 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
879 length
+= (opx
->type
& BITS16
) ? 2 : 4;
881 length
+= (bits
== 16) ? 2 : 4;
893 length
+= is_sbyte16(opx
) ? 1 : 2;
902 length
+= is_sbyte32(opx
) ? 1 : 4;
921 length
+= is_sbyte32(opx
) ? 1 : 4;
930 ins
->vexreg
= regval(opx
);
931 ins
->vex_cm
= *codes
++;
932 ins
->vex_wlp
= *codes
++;
938 ins
->vex_cm
= *codes
++;
939 ins
->vex_wlp
= *codes
++;
952 length
+= (bits
!= 16) && !has_prefix(ins
, PPS_ASIZE
, P_A16
);
956 length
+= (bits
!= 32) && !has_prefix(ins
, PPS_ASIZE
, P_A32
);
963 if (bits
!= 64 || has_prefix(ins
, PPS_ASIZE
, P_A16
) ||
964 has_prefix(ins
, PPS_ASIZE
, P_A32
))
973 enum prefixes pfx
= ins
->prefixes
[PPS_OSIZE
];
977 errfunc(ERR_WARNING
| ERR_PASS2
, "invalid operand size prefix");
979 ins
->prefixes
[PPS_OSIZE
] = P_O16
;
985 enum prefixes pfx
= ins
->prefixes
[PPS_OSIZE
];
989 errfunc(ERR_WARNING
| ERR_PASS2
, "invalid operand size prefix");
991 ins
->prefixes
[PPS_OSIZE
] = P_O32
;
1030 if (!ins
->prefixes
[PPS_LREP
])
1031 ins
->prefixes
[PPS_LREP
] = P_REP
;
1035 if (!ins
->prefixes
[PPS_LREP
])
1036 ins
->prefixes
[PPS_LREP
] = P_REPNE
;
1040 if (ins
->oprs
[0].segment
!= NO_SEG
)
1041 errfunc(ERR_NONFATAL
, "attempt to reserve non-constant"
1042 " quantity of BSS space");
1044 length
+= ins
->oprs
[0].offset
;
1048 if (!ins
->prefixes
[PPS_WAIT
])
1049 ins
->prefixes
[PPS_WAIT
] = P_WAIT
;
1107 struct operand
*opy
= &ins
->oprs
[op2
];
1109 ea_data
.rex
= 0; /* Ensure ea.REX is initially 0 */
1112 /* pick rfield from operand b (opx) */
1113 rflags
= regflag(opx
);
1114 rfield
= nasm_regvals
[opx
->basereg
];
1119 if (process_ea(opy
, &ea_data
, bits
,ins
->addr_size
,
1120 rfield
, rflags
) != eat
) {
1121 errfunc(ERR_NONFATAL
, "invalid effective address");
1124 ins
->rex
|= ea_data
.rex
;
1125 length
+= ea_data
.size
;
1131 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1132 ": instruction code \\%o (0x%02X) given", c
, c
);
1137 ins
->rex
&= rex_mask
;
1139 if (ins
->rex
& REX_NH
) {
1140 if (ins
->rex
& REX_H
) {
1141 errfunc(ERR_NONFATAL
, "instruction cannot use high registers");
1144 ins
->rex
&= ~REX_P
; /* Don't force REX prefix due to high reg */
1147 if (ins
->rex
& REX_V
) {
1148 int bad32
= REX_R
|REX_W
|REX_X
|REX_B
;
1150 if (ins
->rex
& REX_H
) {
1151 errfunc(ERR_NONFATAL
, "cannot use high register in vex instruction");
1154 switch (ins
->vex_wlp
& 060) {
1168 if (bits
!= 64 && ((ins
->rex
& bad32
) || ins
->vexreg
> 7)) {
1169 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1172 if (ins
->vex_cm
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
)))
1176 } else if (ins
->rex
& REX_REAL
) {
1177 if (ins
->rex
& REX_H
) {
1178 errfunc(ERR_NONFATAL
, "cannot use high register in rex instruction");
1180 } else if (bits
== 64) {
1182 } else if ((ins
->rex
& REX_L
) &&
1183 !(ins
->rex
& (REX_P
|REX_W
|REX_X
|REX_B
)) &&
1186 assert_no_prefix(ins
, PPS_LREP
);
1189 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1197 #define EMIT_REX() \
1198 if (!(ins->rex & REX_V) && (ins->rex & REX_REAL) && (bits == 64)) { \
1199 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1200 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1205 static void gencode(int32_t segment
, int64_t offset
, int bits
,
1206 insn
* ins
, const struct itemplate
*temp
,
1209 static const char condval
[] = { /* conditional opcodes */
1210 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1211 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1212 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1219 struct operand
*opx
;
1220 const uint8_t *codes
= temp
->code
;
1222 enum ea_type eat
= EA_SCALAR
;
1226 op1
= (c
& 3) + ((opex
& 1) << 2);
1227 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
1228 opx
= &ins
->oprs
[op1
];
1229 opex
= 0; /* For the next iteration */
1237 out(offset
, segment
, codes
, OUT_RAWDATA
, c
, NO_SEG
, NO_SEG
);
1250 bytes
[0] = *codes
++ + (regval(opx
) & 7);
1251 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1257 * The test for BITS8 and SBYTE here is intended to avoid
1258 * warning on optimizer actions due to SBYTE, while still
1259 * warn on explicit BYTE directives. Also warn, obviously,
1260 * if the optimizer isn't enabled.
1262 if (((opx
->type
& BITS8
) ||
1263 !(opx
->type
& temp
->opd
[op1
] & BYTENESS
)) &&
1264 (opx
->offset
< -128 || opx
->offset
> 127)) {
1265 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1266 "signed byte value exceeds bounds");
1268 if (opx
->segment
!= NO_SEG
) {
1270 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1271 opx
->segment
, opx
->wrt
);
1273 bytes
[0] = opx
->offset
;
1274 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1281 if (opx
->offset
< -256 || opx
->offset
> 255) {
1282 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1283 "byte value exceeds bounds");
1285 if (opx
->segment
!= NO_SEG
) {
1287 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1288 opx
->segment
, opx
->wrt
);
1290 bytes
[0] = opx
->offset
;
1291 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1298 if (opx
->offset
< 0 || opx
->offset
> 255)
1299 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1300 "unsigned byte value exceeds bounds");
1301 if (opx
->segment
!= NO_SEG
) {
1303 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1304 opx
->segment
, opx
->wrt
);
1306 bytes
[0] = opx
->offset
;
1307 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1314 warn_overflow_opd(opx
, 2);
1316 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1317 opx
->segment
, opx
->wrt
);
1322 if (opx
->type
& (BITS16
| BITS32
))
1323 size
= (opx
->type
& BITS16
) ? 2 : 4;
1325 size
= (bits
== 16) ? 2 : 4;
1326 warn_overflow_opd(opx
, size
);
1328 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1329 opx
->segment
, opx
->wrt
);
1334 warn_overflow_opd(opx
, 4);
1336 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1337 opx
->segment
, opx
->wrt
);
1343 size
= ins
->addr_size
>> 3;
1344 warn_overflow_opd(opx
, size
);
1345 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1346 opx
->segment
, opx
->wrt
);
1351 if (opx
->segment
!= segment
) {
1353 out(offset
, segment
, &data
,
1354 OUT_REL1ADR
, insn_end
- offset
,
1355 opx
->segment
, opx
->wrt
);
1357 data
= opx
->offset
- insn_end
;
1358 if (data
> 127 || data
< -128)
1359 errfunc(ERR_NONFATAL
, "short jump is out of range");
1360 out(offset
, segment
, &data
,
1361 OUT_ADDRESS
, 1, NO_SEG
, NO_SEG
);
1367 data
= (int64_t)opx
->offset
;
1368 out(offset
, segment
, &data
, OUT_ADDRESS
, 8,
1369 opx
->segment
, opx
->wrt
);
1374 if (opx
->segment
!= segment
) {
1376 out(offset
, segment
, &data
,
1377 OUT_REL2ADR
, insn_end
- offset
,
1378 opx
->segment
, opx
->wrt
);
1380 data
= opx
->offset
- insn_end
;
1381 out(offset
, segment
, &data
,
1382 OUT_ADDRESS
, 2, NO_SEG
, NO_SEG
);
1388 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
1389 size
= (opx
->type
& BITS16
) ? 2 : 4;
1391 size
= (bits
== 16) ? 2 : 4;
1392 if (opx
->segment
!= segment
) {
1394 out(offset
, segment
, &data
,
1395 size
== 2 ? OUT_REL2ADR
: OUT_REL4ADR
,
1396 insn_end
- offset
, opx
->segment
, opx
->wrt
);
1398 data
= opx
->offset
- insn_end
;
1399 out(offset
, segment
, &data
,
1400 OUT_ADDRESS
, size
, NO_SEG
, NO_SEG
);
1406 if (opx
->segment
!= segment
) {
1408 out(offset
, segment
, &data
,
1409 OUT_REL4ADR
, insn_end
- offset
,
1410 opx
->segment
, opx
->wrt
);
1412 data
= opx
->offset
- insn_end
;
1413 out(offset
, segment
, &data
,
1414 OUT_ADDRESS
, 4, NO_SEG
, NO_SEG
);
1420 if (opx
->segment
== NO_SEG
)
1421 errfunc(ERR_NONFATAL
, "value referenced by FAR is not"
1424 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1425 outfmt
->segbase(1 + opx
->segment
),
1432 warn_overflow_opd(opx
, 2);
1433 if (is_sbyte16(opx
)) {
1435 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1439 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1440 opx
->segment
, opx
->wrt
);
1447 bytes
[0] = *codes
++;
1448 if (is_sbyte16(opx
))
1449 bytes
[0] |= 2; /* s-bit */
1450 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1456 warn_overflow_opd(opx
, 4);
1457 if (is_sbyte32(opx
)) {
1459 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1463 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1464 opx
->segment
, opx
->wrt
);
1471 bytes
[0] = *codes
++;
1472 if (is_sbyte32(opx
))
1473 bytes
[0] |= 2; /* s-bit */
1474 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1480 opx
= &ins
->oprs
[c
>> 3];
1481 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1482 opx
= &ins
->oprs
[c
& 7];
1483 if (opx
->segment
!= NO_SEG
|| opx
->wrt
!= NO_SEG
) {
1484 errfunc(ERR_NONFATAL
,
1485 "non-absolute expression not permitted as argument %d",
1488 if (opx
->offset
& ~15) {
1489 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1490 "four-bit argument exceeds bounds");
1492 bytes
[0] |= opx
->offset
& 15;
1494 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1500 opx
= &ins
->oprs
[c
>> 4];
1501 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1503 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1508 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1509 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1515 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1516 (int32_t)data
!= (int64_t)data
) {
1517 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1518 "signed dword immediate exceeds bounds");
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 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1535 (int32_t)data
!= (int64_t)data
) {
1536 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1537 "signed dword immediate exceeds bounds");
1539 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1540 opx
->segment
, opx
->wrt
);
1547 if (ins
->vex_cm
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
))) {
1548 bytes
[0] = (ins
->vex_cm
>> 6) ? 0x8f : 0xc4;
1549 bytes
[1] = (ins
->vex_cm
& 31) | ((~ins
->rex
& 7) << 5);
1550 bytes
[2] = ((ins
->rex
& REX_W
) << (7-3)) |
1551 ((~ins
->vexreg
& 15)<< 3) | (ins
->vex_wlp
& 07);
1552 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 3, NO_SEG
, NO_SEG
);
1556 bytes
[1] = ((~ins
->rex
& REX_R
) << (7-2)) |
1557 ((~ins
->vexreg
& 15) << 3) | (ins
->vex_wlp
& 07);
1558 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 2, NO_SEG
, NO_SEG
);
1568 if (ins
->rex
& REX_W
)
1570 else if (ins
->prefixes
[PPS_OSIZE
] == P_O16
)
1572 else if (ins
->prefixes
[PPS_OSIZE
] == P_O32
)
1577 um
= (uint64_t)2 << (s
-1);
1580 if (uv
> 127 && uv
< (uint64_t)-128 &&
1581 (uv
< um
-128 || uv
> um
-1)) {
1582 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1583 "signed byte value exceeds bounds");
1585 if (opx
->segment
!= NO_SEG
) {
1587 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1588 opx
->segment
, opx
->wrt
);
1591 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1602 if (bits
== 32 && !has_prefix(ins
, PPS_ASIZE
, P_A16
)) {
1604 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1611 if (bits
!= 32 && !has_prefix(ins
, PPS_ASIZE
, P_A32
)) {
1613 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1645 *bytes
= *codes
++ ^ condval
[ins
->condition
];
1646 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1655 *bytes
= c
- 0332 + 0xF2;
1656 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1661 if (ins
->rex
& REX_R
) {
1663 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1666 ins
->rex
&= ~(REX_L
|REX_R
);
1677 if (ins
->oprs
[0].segment
!= NO_SEG
)
1678 errfunc(ERR_PANIC
, "non-constant BSS size in pass two");
1680 int64_t size
= ins
->oprs
[0].offset
;
1682 out(offset
, segment
, NULL
,
1683 OUT_RESERVE
, size
, NO_SEG
, NO_SEG
);
1694 switch (ins
->oprs
[0].basereg
) {
1709 "bizarre 8086 segment register received");
1711 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1718 switch (ins
->oprs
[0].basereg
) {
1727 "bizarre 386 segment register received");
1729 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1738 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1744 bytes
[0] = c
- 0362 + 0xf2;
1745 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1755 *bytes
= c
- 0366 + 0x66;
1756 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1766 *bytes
= bits
== 16 ? 3 : 5;
1767 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1797 struct operand
*opy
= &ins
->oprs
[op2
];
1800 /* pick rfield from operand b (opx) */
1801 rflags
= regflag(opx
);
1802 rfield
= nasm_regvals
[opx
->basereg
];
1804 /* rfield is constant */
1809 if (process_ea(opy
, &ea_data
, bits
, ins
->addr_size
,
1810 rfield
, rflags
) != eat
)
1811 errfunc(ERR_NONFATAL
, "invalid effective address");
1814 *p
++ = ea_data
.modrm
;
1815 if (ea_data
.sib_present
)
1819 out(offset
, segment
, bytes
, OUT_RAWDATA
, s
, NO_SEG
, NO_SEG
);
1822 * Make sure the address gets the right offset in case
1823 * the line breaks in the .lst file (BR 1197827)
1828 switch (ea_data
.bytes
) {
1838 if (opy
->segment
== segment
) {
1840 if (overflow_signed(data
, ea_data
.bytes
))
1841 warn_overflow(ERR_PASS2
, ea_data
.bytes
);
1842 out(offset
, segment
, &data
, OUT_ADDRESS
,
1843 ea_data
.bytes
, NO_SEG
, NO_SEG
);
1845 /* overflow check in output/linker? */
1846 out(offset
, segment
, &data
, OUT_REL4ADR
,
1847 insn_end
- offset
, opy
->segment
, opy
->wrt
);
1850 if (overflow_general(opy
->offset
, ins
->addr_size
>> 3) ||
1851 signed_bits(opy
->offset
, ins
->addr_size
) !=
1852 signed_bits(opy
->offset
, ea_data
.bytes
* 8))
1853 warn_overflow(ERR_PASS2
, ea_data
.bytes
);
1855 out(offset
, segment
, &data
, OUT_ADDRESS
,
1856 ea_data
.bytes
, opy
->segment
, opy
->wrt
);
1862 "Invalid amount of bytes (%d) for offset?!",
1871 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1872 ": instruction code \\%o (0x%02X) given", c
, c
);
1878 static opflags_t
regflag(const operand
* o
)
1880 if (!is_register(o
->basereg
))
1881 errfunc(ERR_PANIC
, "invalid operand passed to regflag()");
1882 return nasm_reg_flags
[o
->basereg
];
1885 static int32_t regval(const operand
* o
)
1887 if (!is_register(o
->basereg
))
1888 errfunc(ERR_PANIC
, "invalid operand passed to regval()");
1889 return nasm_regvals
[o
->basereg
];
1892 static int op_rexflags(const operand
* o
, int mask
)
1897 if (!is_register(o
->basereg
))
1898 errfunc(ERR_PANIC
, "invalid operand passed to op_rexflags()");
1900 flags
= nasm_reg_flags
[o
->basereg
];
1901 val
= nasm_regvals
[o
->basereg
];
1903 return rexflags(val
, flags
, mask
);
1906 static int rexflags(int val
, opflags_t flags
, int mask
)
1911 rex
|= REX_B
|REX_X
|REX_R
;
1914 if (!(REG_HIGH
& ~flags
)) /* AH, CH, DH, BH */
1916 else if (!(REG8
& ~flags
) && val
>= 4) /* SPL, BPL, SIL, DIL */
1922 static enum match_result
find_match(const struct itemplate
**tempp
,
1924 int32_t segment
, int64_t offset
, int bits
)
1926 const struct itemplate
*temp
;
1927 enum match_result m
, merr
;
1928 opflags_t xsizeflags
[MAX_OPERANDS
];
1929 bool opsizemissing
= false;
1932 for (i
= 0; i
< instruction
->operands
; i
++)
1933 xsizeflags
[i
] = instruction
->oprs
[i
].type
& SIZE_MASK
;
1935 merr
= MERR_INVALOP
;
1937 for (temp
= nasm_instructions
[instruction
->opcode
];
1938 temp
->opcode
!= I_none
; temp
++) {
1939 m
= matches(temp
, instruction
, bits
);
1940 if (m
== MOK_JUMP
) {
1941 if (jmp_match(segment
, offset
, bits
, instruction
, temp
->code
))
1945 } else if (m
== MERR_OPSIZEMISSING
&&
1946 (temp
->flags
& IF_SMASK
) != IF_SX
) {
1948 * Missing operand size and a candidate for fuzzy matching...
1950 for (i
= 0; i
< temp
->operands
; i
++) {
1951 if ((temp
->opd
[i
] & SAME_AS
) == 0)
1952 xsizeflags
[i
] |= temp
->opd
[i
] & SIZE_MASK
;
1954 opsizemissing
= true;
1958 if (merr
== MOK_GOOD
)
1962 /* No match, but see if we can get a fuzzy operand size match... */
1966 for (i
= 0; i
< instruction
->operands
; i
++) {
1968 * We ignore extrinsic operand sizes on registers, so we should
1969 * never try to fuzzy-match on them. This also resolves the case
1970 * when we have e.g. "xmmrm128" in two different positions.
1972 if (is_class(REGISTER
, instruction
->oprs
[i
].type
))
1975 /* This tests if xsizeflags[i] has more than one bit set */
1976 if ((xsizeflags
[i
] & (xsizeflags
[i
]-1)))
1977 goto done
; /* No luck */
1979 instruction
->oprs
[i
].type
|= xsizeflags
[i
]; /* Set the size */
1982 /* Try matching again... */
1983 for (temp
= nasm_instructions
[instruction
->opcode
];
1984 temp
->opcode
!= I_none
; temp
++) {
1985 m
= matches(temp
, instruction
, bits
);
1986 if (m
== MOK_JUMP
) {
1987 if (jmp_match(segment
, offset
, bits
, instruction
, temp
->code
))
1994 if (merr
== MOK_GOOD
)
2003 static enum match_result
matches(const struct itemplate
*itemp
,
2004 insn
*instruction
, int bits
)
2006 int i
, size
[MAX_OPERANDS
], asize
, oprs
;
2007 bool opsizemissing
= false;
2012 if (itemp
->opcode
!= instruction
->opcode
)
2013 return MERR_INVALOP
;
2016 * Count the operands
2018 if (itemp
->operands
!= instruction
->operands
)
2019 return MERR_INVALOP
;
2024 if (!(optimizing
> 0) && (itemp
->flags
& IF_OPT
))
2025 return MERR_INVALOP
;
2028 * Check that no spurious colons or TOs are present
2030 for (i
= 0; i
< itemp
->operands
; i
++)
2031 if (instruction
->oprs
[i
].type
& ~itemp
->opd
[i
] & (COLON
| TO
))
2032 return MERR_INVALOP
;
2035 * Process size flags
2037 switch (itemp
->flags
& IF_SMASK
) {
2077 if (itemp
->flags
& IF_ARMASK
) {
2078 /* S- flags only apply to a specific operand */
2079 i
= ((itemp
->flags
& IF_ARMASK
) >> IF_ARSHFT
) - 1;
2080 memset(size
, 0, sizeof size
);
2083 /* S- flags apply to all operands */
2084 for (i
= 0; i
< MAX_OPERANDS
; i
++)
2089 * Check that the operand flags all match up,
2090 * it's a bit tricky so lets be verbose:
2092 * 1) Find out the size of operand. If instruction
2093 * doesn't have one specified -- we're trying to
2094 * guess it either from template (IF_S* flag) or
2097 * 2) If template operand (i) has SAME_AS flag [used for registers only]
2098 * (ie the same operand as was specified somewhere in template, and
2099 * this referred operand index is being achieved via ~SAME_AS)
2100 * we are to be sure that both registers (in template and instruction)
2103 * 3) If template operand do not match the instruction OR
2104 * template has an operand size specified AND this size differ
2105 * from which instruction has (perhaps we got it from code bits)
2107 * a) Check that only size of instruction and operand is differ
2108 * other characteristics do match
2109 * b) Perhaps it's a register specified in instruction so
2110 * for such a case we just mark that operand as "size
2111 * missing" and this will turn on fuzzy operand size
2112 * logic facility (handled by a caller)
2114 for (i
= 0; i
< itemp
->operands
; i
++) {
2115 opflags_t type
= instruction
->oprs
[i
].type
;
2116 if (!(type
& SIZE_MASK
))
2119 if (itemp
->opd
[i
] & SAME_AS
) {
2120 int j
= itemp
->opd
[i
] & ~SAME_AS
;
2121 if (type
!= instruction
->oprs
[j
].type
||
2122 instruction
->oprs
[i
].basereg
!= instruction
->oprs
[j
].basereg
)
2123 return MERR_INVALOP
;
2124 } else if (itemp
->opd
[i
] & ~type
||
2125 ((itemp
->opd
[i
] & SIZE_MASK
) &&
2126 ((itemp
->opd
[i
] ^ type
) & SIZE_MASK
))) {
2127 if ((itemp
->opd
[i
] & ~type
& ~SIZE_MASK
) || (type
& SIZE_MASK
)) {
2128 return MERR_INVALOP
;
2129 } else if (!is_class(REGISTER
, type
)) {
2131 * Note: we don't honor extrinsic operand sizes for registers,
2132 * so "missing operand size" for a register should be
2133 * considered a wildcard match rather than an error.
2135 opsizemissing
= true;
2141 return MERR_OPSIZEMISSING
;
2144 * Check operand sizes
2146 if (itemp
->flags
& (IF_SM
| IF_SM2
)) {
2147 oprs
= (itemp
->flags
& IF_SM2
? 2 : itemp
->operands
);
2148 for (i
= 0; i
< oprs
; i
++) {
2149 asize
= itemp
->opd
[i
] & SIZE_MASK
;
2151 for (i
= 0; i
< oprs
; i
++)
2157 oprs
= itemp
->operands
;
2160 for (i
= 0; i
< itemp
->operands
; i
++) {
2161 if (!(itemp
->opd
[i
] & SIZE_MASK
) &&
2162 (instruction
->oprs
[i
].type
& SIZE_MASK
& ~size
[i
]))
2163 return MERR_OPSIZEMISMATCH
;
2167 * Check template is okay at the set cpu level
2169 if (((itemp
->flags
& IF_PLEVEL
) > cpu
))
2173 * Verify the appropriate long mode flag.
2175 if ((itemp
->flags
& (bits
== 64 ? IF_NOLONG
: IF_LONG
)))
2176 return MERR_BADMODE
;
2179 * Check if special handling needed for Jumps
2181 if ((itemp
->code
[0] & 0374) == 0370)
2187 static enum ea_type
process_ea(operand
*input
, ea
*output
, int bits
,
2188 int addrbits
, int rfield
, opflags_t rflags
)
2190 bool forw_ref
= !!(input
->opflags
& OPFLAG_UNKNOWN
);
2192 output
->type
= EA_SCALAR
;
2193 output
->rip
= false;
2195 /* REX flags for the rfield operand */
2196 output
->rex
|= rexflags(rfield
, rflags
, REX_R
| REX_P
| REX_W
| REX_H
);
2198 if (is_class(REGISTER
, input
->type
)) {
2200 * It's a direct register.
2204 if (!is_register(input
->basereg
))
2209 if (!is_class(REG_EA
, f
))
2212 output
->rex
|= op_rexflags(input
, REX_B
| REX_P
| REX_W
| REX_H
);
2213 output
->sib_present
= false; /* no SIB necessary */
2214 output
->bytes
= 0; /* no offset necessary either */
2215 output
->modrm
= GEN_MODRM(3, rfield
, nasm_regvals
[input
->basereg
]);
2218 * It's a memory reference.
2220 if (input
->basereg
== -1 &&
2221 (input
->indexreg
== -1 || input
->scale
== 0)) {
2223 * It's a pure offset.
2225 if (bits
== 64 && ((input
->type
& IP_REL
) == IP_REL
) &&
2226 input
->segment
== NO_SEG
) {
2227 nasm_error(ERR_WARNING
| ERR_PASS1
, "absolute address can not be RIP-relative");
2228 input
->type
&= ~IP_REL
;
2229 input
->type
|= MEMORY
;
2232 if (input
->eaflags
& EAF_BYTEOFFS
||
2233 (input
->eaflags
& EAF_WORDOFFS
&&
2234 input
->disp_size
!= (addrbits
!= 16 ? 32 : 16))) {
2235 nasm_error(ERR_WARNING
| ERR_PASS1
, "displacement size ignored on absolute address");
2238 if (bits
== 64 && (~input
->type
& IP_REL
)) {
2239 output
->sib_present
= true;
2240 output
->sib
= GEN_SIB(0, 4, 5);
2242 output
->modrm
= GEN_MODRM(0, rfield
, 4);
2243 output
->rip
= false;
2245 output
->sib_present
= false;
2246 output
->bytes
= (addrbits
!= 16 ? 4 : 2);
2247 output
->modrm
= GEN_MODRM(0, rfield
, (addrbits
!= 16 ? 5 : 6));
2248 output
->rip
= bits
== 64;
2252 * It's an indirection.
2254 int i
= input
->indexreg
, b
= input
->basereg
, s
= input
->scale
;
2255 int32_t seg
= input
->segment
;
2256 int hb
= input
->hintbase
, ht
= input
->hinttype
;
2257 int t
, it
, bt
; /* register numbers */
2258 opflags_t x
, ix
, bx
; /* register flags */
2261 i
= -1; /* make this easy, at least */
2263 if (is_register(i
)) {
2264 it
= nasm_regvals
[i
];
2265 ix
= nasm_reg_flags
[i
];
2271 if (is_register(b
)) {
2272 bt
= nasm_regvals
[b
];
2273 bx
= nasm_reg_flags
[b
];
2279 /* if either one are a vector register... */
2280 if ((ix
|bx
) & (XMMREG
|YMMREG
) & ~REG_EA
) {
2281 int32_t sok
= BITS32
| BITS64
;
2282 int32_t o
= input
->offset
;
2283 int mod
, scale
, index
, base
;
2286 * For a vector SIB, one has to be a vector and the other,
2287 * if present, a GPR. The vector must be the index operand.
2289 if (it
== -1 || (bx
& (XMMREG
|YMMREG
) & ~REG_EA
)) {
2295 t
= bt
, bt
= it
, it
= t
;
2296 x
= bx
, bx
= ix
, ix
= x
;
2302 if (!(REG64
& ~bx
) || !(REG32
& ~bx
))
2309 * While we're here, ensure the user didn't specify
2312 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2315 if (addrbits
== 16 ||
2316 (addrbits
== 32 && !(sok
& BITS32
)) ||
2317 (addrbits
== 64 && !(sok
& BITS64
)))
2320 output
->type
= (ix
& YMMREG
& ~REG_EA
)
2321 ? EA_YMMVSIB
: EA_XMMVSIB
;
2323 output
->rex
|= rexflags(it
, ix
, REX_X
);
2324 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2326 index
= it
& 7; /* it is known to be != -1 */
2341 default: /* then what the smeg is it? */
2342 goto err
; /* panic */
2350 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2351 seg
== NO_SEG
&& !forw_ref
&&
2352 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2354 else if (input
->eaflags
& EAF_BYTEOFFS
||
2355 (o
>= -128 && o
<= 127 &&
2356 seg
== NO_SEG
&& !forw_ref
&&
2357 !(input
->eaflags
& EAF_WORDOFFS
)))
2363 output
->sib_present
= true;
2364 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2365 output
->modrm
= GEN_MODRM(mod
, rfield
, 4);
2366 output
->sib
= GEN_SIB(scale
, index
, base
);
2367 } else if ((ix
|bx
) & (BITS32
|BITS64
)) {
2369 * it must be a 32/64-bit memory reference. Firstly we have
2370 * to check that all registers involved are type E/Rxx.
2372 int32_t sok
= BITS32
| BITS64
;
2373 int32_t o
= input
->offset
;
2376 if (!(REG64
& ~ix
) || !(REG32
& ~ix
))
2384 goto err
; /* Invalid register */
2385 if (~sok
& bx
& SIZE_MASK
)
2386 goto err
; /* Invalid size */
2391 * While we're here, ensure the user didn't specify
2394 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2397 if (addrbits
== 16 ||
2398 (addrbits
== 32 && !(sok
& BITS32
)) ||
2399 (addrbits
== 64 && !(sok
& BITS64
)))
2402 /* now reorganize base/index */
2403 if (s
== 1 && bt
!= it
&& bt
!= -1 && it
!= -1 &&
2404 ((hb
== b
&& ht
== EAH_NOTBASE
) ||
2405 (hb
== i
&& ht
== EAH_MAKEBASE
))) {
2406 /* swap if hints say so */
2407 t
= bt
, bt
= it
, it
= t
;
2408 x
= bx
, bx
= ix
, ix
= x
;
2410 if (bt
== it
) /* convert EAX+2*EAX to 3*EAX */
2411 bt
= -1, bx
= 0, s
++;
2412 if (bt
== -1 && s
== 1 && !(hb
== it
&& ht
== EAH_NOTBASE
)) {
2413 /* make single reg base, unless hint */
2414 bt
= it
, bx
= ix
, it
= -1, ix
= 0;
2416 if (((s
== 2 && it
!= REG_NUM_ESP
&& !(input
->eaflags
& EAF_TIMESTWO
)) ||
2417 s
== 3 || s
== 5 || s
== 9) && bt
== -1)
2418 bt
= it
, bx
= ix
, s
--; /* convert 3*EAX to EAX+2*EAX */
2419 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
&&
2420 (input
->eaflags
& EAF_TIMESTWO
))
2421 it
= bt
, ix
= bx
, bt
= -1, bx
= 0, s
= 1;
2422 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2423 if (s
== 1 && it
== REG_NUM_ESP
) {
2424 /* swap ESP into base if scale is 1 */
2425 t
= it
, it
= bt
, bt
= t
;
2426 x
= ix
, ix
= bx
, bx
= x
;
2428 if (it
== REG_NUM_ESP
||
2429 (s
!= 1 && s
!= 2 && s
!= 4 && s
!= 8 && it
!= -1))
2430 goto err
; /* wrong, for various reasons */
2432 output
->rex
|= rexflags(it
, ix
, REX_X
);
2433 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2435 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
) {
2444 if (rm
!= REG_NUM_EBP
&& o
== 0 &&
2445 seg
== NO_SEG
&& !forw_ref
&&
2446 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2448 else if (input
->eaflags
& EAF_BYTEOFFS
||
2449 (o
>= -128 && o
<= 127 &&
2450 seg
== NO_SEG
&& !forw_ref
&&
2451 !(input
->eaflags
& EAF_WORDOFFS
)))
2457 output
->sib_present
= false;
2458 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2459 output
->modrm
= GEN_MODRM(mod
, rfield
, rm
);
2462 int mod
, scale
, index
, base
;
2482 default: /* then what the smeg is it? */
2483 goto err
; /* panic */
2491 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2492 seg
== NO_SEG
&& !forw_ref
&&
2493 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2495 else if (input
->eaflags
& EAF_BYTEOFFS
||
2496 (o
>= -128 && o
<= 127 &&
2497 seg
== NO_SEG
&& !forw_ref
&&
2498 !(input
->eaflags
& EAF_WORDOFFS
)))
2504 output
->sib_present
= true;
2505 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2506 output
->modrm
= GEN_MODRM(mod
, rfield
, 4);
2507 output
->sib
= GEN_SIB(scale
, index
, base
);
2509 } else { /* it's 16-bit */
2511 int16_t o
= input
->offset
;
2513 /* check for 64-bit long mode */
2517 /* check all registers are BX, BP, SI or DI */
2518 if ((b
!= -1 && b
!= R_BP
&& b
!= R_BX
&& b
!= R_SI
&& b
!= R_DI
) ||
2519 (i
!= -1 && i
!= R_BP
&& i
!= R_BX
&& i
!= R_SI
&& i
!= R_DI
))
2522 /* ensure the user didn't specify DWORD/QWORD */
2523 if (input
->disp_size
== 32 || input
->disp_size
== 64)
2526 if (s
!= 1 && i
!= -1)
2527 goto err
; /* no can do, in 16-bit EA */
2528 if (b
== -1 && i
!= -1) {
2533 if ((b
== R_SI
|| b
== R_DI
) && i
!= -1) {
2538 /* have BX/BP as base, SI/DI index */
2540 goto err
; /* shouldn't ever happen, in theory */
2541 if (i
!= -1 && b
!= -1 &&
2542 (i
== R_BP
|| i
== R_BX
|| b
== R_SI
|| b
== R_DI
))
2543 goto err
; /* invalid combinations */
2544 if (b
== -1) /* pure offset: handled above */
2545 goto err
; /* so if it gets to here, panic! */
2549 switch (i
* 256 + b
) {
2550 case R_SI
* 256 + R_BX
:
2553 case R_DI
* 256 + R_BX
:
2556 case R_SI
* 256 + R_BP
:
2559 case R_DI
* 256 + R_BP
:
2577 if (rm
== -1) /* can't happen, in theory */
2578 goto err
; /* so panic if it does */
2580 if (o
== 0 && seg
== NO_SEG
&& !forw_ref
&& rm
!= 6 &&
2581 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2583 else if (input
->eaflags
& EAF_BYTEOFFS
||
2584 (o
>= -128 && o
<= 127 && seg
== NO_SEG
&&
2585 !forw_ref
&& !(input
->eaflags
& EAF_WORDOFFS
)))
2590 output
->sib_present
= false; /* no SIB - it's 16-bit */
2591 output
->bytes
= mod
; /* bytes of offset needed */
2592 output
->modrm
= GEN_MODRM(mod
, rfield
, rm
);
2597 output
->size
= 1 + output
->sib_present
+ output
->bytes
;
2598 return output
->type
;
2601 return output
->type
= EA_INVALID
;
2604 static void add_asp(insn
*ins
, int addrbits
)
2609 valid
= (addrbits
== 64) ? 64|32 : 32|16;
2611 switch (ins
->prefixes
[PPS_ASIZE
]) {
2622 valid
&= (addrbits
== 32) ? 16 : 32;
2628 for (j
= 0; j
< ins
->operands
; j
++) {
2629 if (is_class(MEMORY
, ins
->oprs
[j
].type
)) {
2632 /* Verify as Register */
2633 if (!is_register(ins
->oprs
[j
].indexreg
))
2636 i
= nasm_reg_flags
[ins
->oprs
[j
].indexreg
];
2638 /* Verify as Register */
2639 if (!is_register(ins
->oprs
[j
].basereg
))
2642 b
= nasm_reg_flags
[ins
->oprs
[j
].basereg
];
2644 if (ins
->oprs
[j
].scale
== 0)
2648 int ds
= ins
->oprs
[j
].disp_size
;
2649 if ((addrbits
!= 64 && ds
> 8) ||
2650 (addrbits
== 64 && ds
== 16))
2670 if (valid
& addrbits
) {
2671 ins
->addr_size
= addrbits
;
2672 } else if (valid
& ((addrbits
== 32) ? 16 : 32)) {
2673 /* Add an address size prefix */
2674 enum prefixes pref
= (addrbits
== 32) ? P_A16
: P_A32
;
2675 ins
->prefixes
[PPS_ASIZE
] = pref
;
2676 ins
->addr_size
= (addrbits
== 32) ? 16 : 32;
2679 errfunc(ERR_NONFATAL
, "impossible combination of address sizes");
2680 ins
->addr_size
= addrbits
; /* Error recovery */
2683 defdisp
= ins
->addr_size
== 16 ? 16 : 32;
2685 for (j
= 0; j
< ins
->operands
; j
++) {
2686 if (!(MEM_OFFS
& ~ins
->oprs
[j
].type
) &&
2687 (ins
->oprs
[j
].disp_size
? ins
->oprs
[j
].disp_size
: defdisp
) != ins
->addr_size
) {
2689 * mem_offs sizes must match the address size; if not,
2690 * strip the MEM_OFFS bit and match only EA instructions
2692 ins
->oprs
[j
].type
&= ~(MEM_OFFS
& ~MEMORY
);