1 /* assemble.c code generation for the Netwide Assembler
3 * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
4 * Julian Hall. All rights reserved. The software is
5 * redistributable under the license given in the file "LICENSE"
6 * distributed in the NASM archive.
8 * the actual codes (C syntax, i.e. octal):
9 * \0 - terminates the code. (Unless it's a literal of course.)
10 * \1..\4 - that many literal bytes follow in the code stream
11 * \5 - add 4 to the primary operand number (b, low octdigit)
12 * \6 - add 4 to the secondary operand number (a, middle octdigit)
13 * \7 - add 4 to both the primary and the secondary operand number
14 * \10..\13 - a literal byte follows in the code stream, to be added
15 * to the register value of operand 0..3
16 * \14..\17 - a signed byte immediate operand, from operand 0..3
17 * \20..\23 - a byte immediate operand, from operand 0..3
18 * \24..\27 - an unsigned byte immediate operand, from operand 0..3
19 * \30..\33 - a word immediate operand, from operand 0..3
20 * \34..\37 - select between \3[0-3] and \4[0-3] depending on 16/32 bit
21 * assembly mode or the operand-size override on the operand
22 * \40..\43 - a long immediate operand, from operand 0..3
23 * \44..\47 - select between \3[0-3], \4[0-3] and \5[4-7]
24 * depending on the address size of the instruction.
25 * \50..\53 - a byte relative operand, from operand 0..3
26 * \54..\57 - a qword immediate operand, from operand 0..3
27 * \60..\63 - a word relative operand, from operand 0..3
28 * \64..\67 - select between \6[0-3] and \7[0-3] depending on 16/32 bit
29 * assembly mode or the operand-size override on the operand
30 * \70..\73 - a long relative operand, from operand 0..3
31 * \74..\77 - a word constant, from the _segment_ part of operand 0..3
32 * \1ab - a ModRM, calculated on EA in operand a, with the spare
33 * field the register value of operand b.
34 * \140..\143 - an immediate word or signed byte for operand 0..3
35 * \144..\147 - or 2 (s-field) into opcode byte if operand 0..3
36 * is a signed byte rather than a word. Opcode byte follows.
37 * \150..\153 - an immediate dword or signed byte for operand 0..3
38 * \154..\157 - or 2 (s-field) into opcode byte if operand 0..3
39 * is a signed byte rather than a dword. Opcode byte follows.
40 * \160..\163 - this instruction uses DREX rather than REX, with the
41 * OC0 field set to 0, and the dest field taken from
43 * \164..\167 - this instruction uses DREX rather than REX, with the
44 * OC0 field set to 1, and the dest field taken from
46 * \171 - placement of DREX suffix in the absence of an EA
47 * \172\ab - the register number from operand a in bits 7..4, with
48 * the 4-bit immediate from operand b in bits 3..0.
49 * \173\xab - the register number from operand a in bits 7..4, with
50 * the value b in bits 3..0.
51 * \174\a - the register number from operand a in bits 7..4, and
52 * an arbitrary value in bits 3..0 (assembled as zero.)
53 * \2ab - a ModRM, calculated on EA in operand a, with the spare
54 * field equal to digit b.
55 * \250..\253 - same as \150..\153, except warn if the 64-bit operand
56 * is not equal to the truncated and sign-extended 32-bit
57 * operand; used for 32-bit immediates in 64-bit mode.
58 * \254..\257 - a signed 32-bit operand to be extended to 64 bits.
59 * \260..\263 - this instruction uses VEX rather than REX, with the
60 * V field taken from operand 0..3.
61 * \270 - this instruction uses VEX rather than REX, with the
62 * V field set to 1111b.
64 * VEX prefixes are followed by the sequence:
65 * \mm\wlp where mm is the M field; and wlp is:
67 * [w0] ww = 0 for W = 0
68 * [w1] ww = 1 for W = 1
69 * [wx] ww = 2 for W don't care (always assembled as 0)
70 * [ww] ww = 3 for W used as REX.W
73 * \274..\277 - a signed byte immediate operand, from operand 0..3,
74 * which is to be extended to the operand size.
75 * \310 - indicates fixed 16-bit address size, i.e. optional 0x67.
76 * \311 - indicates fixed 32-bit address size, i.e. optional 0x67.
77 * \312 - (disassembler only) marker on LOOP, LOOPxx instructions.
78 * \313 - indicates fixed 64-bit address size, 0x67 invalid.
79 * \314 - (disassembler only) invalid with REX.B
80 * \315 - (disassembler only) invalid with REX.X
81 * \316 - (disassembler only) invalid with REX.R
82 * \317 - (disassembler only) invalid with REX.W
83 * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66.
84 * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66.
85 * \322 - indicates that this instruction is only valid when the
86 * operand size is the default (instruction to disassembler,
87 * generates no code in the assembler)
88 * \323 - indicates fixed 64-bit operand size, REX on extensions only.
89 * \324 - indicates 64-bit operand size requiring REX prefix.
90 * \330 - a literal byte follows in the code stream, to be added
91 * to the condition code value of the instruction.
92 * \331 - instruction not valid with REP prefix. Hint for
93 * disassembler only; for SSE instructions.
94 * \332 - REP prefix (0xF2 byte) used as opcode extension.
95 * \333 - REP prefix (0xF3 byte) used as opcode extension.
96 * \334 - LOCK prefix used instead of REX.R
97 * \335 - disassemble a rep (0xF3 byte) prefix as repe not rep.
98 * \336 - force a REP(E) prefix (0xF2) even if not specified.
99 * \337 - force a REPNE prefix (0xF3) even if not specified.
100 * \336-\337 are still listed as prefixes in the disassembler.
101 * \340 - reserve <operand 0> bytes of uninitialized storage.
102 * Operand 0 had better be a segmentless constant.
103 * \341 - this instruction needs a WAIT "prefix"
104 * \344,\345 - the PUSH/POP (respectively) codes for CS, DS, ES, SS
105 * (POP is never used for CS) depending on operand 0
106 * \346,\347 - the second byte of PUSH/POP codes for FS, GS, depending
108 * \360 - no SSE prefix (== \364\331)
109 * \361 - 66 SSE prefix (== \366\331)
110 * \362 - F2 SSE prefix (== \364\332)
111 * \363 - F3 SSE prefix (== \364\333)
112 * \364 - operand-size prefix (0x66) not permitted
113 * \365 - address-size prefix (0x67) not permitted
114 * \366 - operand-size prefix (0x66) used as opcode extension
115 * \367 - address-size prefix (0x67) used as opcode extension
116 * \370,\371,\372 - match only if operand 0 meets byte jump criteria.
117 * 370 is used for Jcc, 371 is used for JMP.
118 * \373 - assemble 0x03 if bits==16, 0x05 if bits==32;
119 * used for conditional jump over longer jump
122 #include "compiler.h"
126 #include <inttypes.h>
130 #include "assemble.h"
135 int sib_present
; /* is a SIB byte necessary? */
136 int bytes
; /* # of bytes of offset needed */
137 int size
; /* lazy - this is sib+bytes+1 */
138 uint8_t modrm
, sib
, rex
, rip
; /* the bytes themselves */
141 static uint32_t cpu
; /* cpu level received from nasm.c */
142 static efunc errfunc
;
143 static struct ofmt
*outfmt
;
144 static ListGen
*list
;
146 static int64_t calcsize(int32_t, int64_t, int, insn
*, const uint8_t *);
147 static void gencode(int32_t segment
, int64_t offset
, int bits
,
148 insn
* ins
, const struct itemplate
*temp
,
150 static int matches(const struct itemplate
*, insn
*, int bits
);
151 static int32_t regflag(const operand
*);
152 static int32_t regval(const operand
*);
153 static int rexflags(int, int32_t, int);
154 static int op_rexflags(const operand
*, int);
155 static ea
*process_ea(operand
*, ea
*, int, int, int, int32_t);
156 static void add_asp(insn
*, int);
158 static int has_prefix(insn
* ins
, enum prefix_pos pos
, enum prefixes prefix
)
160 return ins
->prefixes
[pos
] == prefix
;
163 static void assert_no_prefix(insn
* ins
, enum prefix_pos pos
)
165 if (ins
->prefixes
[pos
])
166 errfunc(ERR_NONFATAL
, "invalid %s prefix",
167 prefix_name(ins
->prefixes
[pos
]));
170 static const char *size_name(int size
)
192 static void warn_overflow(int size
, const struct operand
*o
)
194 if (size
< 8 && o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
) {
195 int64_t lim
= ((int64_t)1 << (size
*8))-1;
196 int64_t data
= o
->offset
;
198 if (data
< ~lim
|| data
> lim
)
199 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
200 "%s data exceeds bounds", size_name(size
));
204 * This routine wrappers the real output format's output routine,
205 * in order to pass a copy of the data off to the listing file
206 * generator at the same time.
208 static void out(int64_t offset
, int32_t segto
, const void *data
,
209 enum out_type type
, uint64_t size
,
210 int32_t segment
, int32_t wrt
)
212 static int32_t lineno
= 0; /* static!!! */
213 static char *lnfname
= NULL
;
216 if (type
== OUT_ADDRESS
&& segment
== NO_SEG
&& wrt
== NO_SEG
) {
218 * This is a non-relocated address, and we're going to
219 * convert it into RAWDATA format.
224 errfunc(ERR_PANIC
, "OUT_ADDRESS with size > 8");
228 WRITEADDR(q
, *(int64_t *)data
, size
);
233 list
->output(offset
, data
, type
, size
);
236 * this call to src_get determines when we call the
237 * debug-format-specific "linenum" function
238 * it updates lineno and lnfname to the current values
239 * returning 0 if "same as last time", -2 if lnfname
240 * changed, and the amount by which lineno changed,
241 * if it did. thus, these variables must be static
244 if (src_get(&lineno
, &lnfname
)) {
245 outfmt
->current_dfmt
->linenum(lnfname
, lineno
, segto
);
248 outfmt
->output(segto
, data
, type
, size
, segment
, wrt
);
251 static bool jmp_match(int32_t segment
, int64_t offset
, int bits
,
252 insn
* ins
, const uint8_t *code
)
257 if ((c
!= 0370 && c
!= 0371) || (ins
->oprs
[0].type
& STRICT
))
261 if (optimizing
< 0 && c
== 0371)
264 isize
= calcsize(segment
, offset
, bits
, ins
, code
);
265 if (ins
->oprs
[0].segment
!= segment
)
268 isize
= ins
->oprs
[0].offset
- offset
- isize
; /* isize is delta */
269 return (isize
>= -128 && isize
<= 127); /* is it byte size? */
272 int64_t assemble(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
273 insn
* instruction
, struct ofmt
*output
, efunc error
,
276 const struct itemplate
*temp
;
281 int64_t start
= offset
;
282 int64_t wsize
= 0; /* size for DB etc. */
284 errfunc
= error
; /* to pass to other functions */
286 outfmt
= output
; /* likewise */
287 list
= listgen
; /* and again */
289 switch (instruction
->opcode
) {
319 int32_t t
= instruction
->times
;
322 "instruction->times < 0 (%ld) in assemble()", t
);
324 while (t
--) { /* repeat TIMES times */
325 for (e
= instruction
->eops
; e
; e
= e
->next
) {
326 if (e
->type
== EOT_DB_NUMBER
) {
328 if (e
->segment
!= NO_SEG
)
329 errfunc(ERR_NONFATAL
,
330 "one-byte relocation attempted");
332 uint8_t out_byte
= e
->offset
;
333 out(offset
, segment
, &out_byte
,
334 OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
336 } else if (wsize
> 8) {
337 errfunc(ERR_NONFATAL
,
338 "integer supplied to a DT, DO or DY"
341 out(offset
, segment
, &e
->offset
,
342 OUT_ADDRESS
, wsize
, e
->segment
, e
->wrt
);
344 } else if (e
->type
== EOT_DB_STRING
||
345 e
->type
== EOT_DB_STRING_FREE
) {
348 out(offset
, segment
, e
->stringval
,
349 OUT_RAWDATA
, e
->stringlen
, NO_SEG
, NO_SEG
);
350 align
= e
->stringlen
% wsize
;
353 align
= wsize
- align
;
354 out(offset
, segment
, zero_buffer
,
355 OUT_RAWDATA
, align
, NO_SEG
, NO_SEG
);
357 offset
+= e
->stringlen
+ align
;
360 if (t
> 0 && t
== instruction
->times
- 1) {
362 * Dummy call to list->output to give the offset to the
365 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
366 list
->uplevel(LIST_TIMES
);
369 if (instruction
->times
> 1)
370 list
->downlevel(LIST_TIMES
);
371 return offset
- start
;
374 if (instruction
->opcode
== I_INCBIN
) {
375 const char *fname
= instruction
->eops
->stringval
;
378 fp
= fopen(fname
, "rb");
380 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
382 } else if (fseek(fp
, 0L, SEEK_END
) < 0) {
383 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
386 static char buf
[4096];
387 size_t t
= instruction
->times
;
392 if (instruction
->eops
->next
) {
393 base
= instruction
->eops
->next
->offset
;
395 if (instruction
->eops
->next
->next
&&
396 len
> (size_t)instruction
->eops
->next
->next
->offset
)
397 len
= (size_t)instruction
->eops
->next
->next
->offset
;
400 * Dummy call to list->output to give the offset to the
403 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
404 list
->uplevel(LIST_INCBIN
);
408 fseek(fp
, base
, SEEK_SET
);
412 fread(buf
, 1, (l
> (int32_t) sizeof(buf
) ? (int32_t) sizeof(buf
) : l
),
416 * This shouldn't happen unless the file
417 * actually changes while we are reading
421 "`incbin': unexpected EOF while"
422 " reading file `%s'", fname
);
423 t
= 0; /* Try to exit cleanly */
426 out(offset
, segment
, buf
, OUT_RAWDATA
, m
,
431 list
->downlevel(LIST_INCBIN
);
432 if (instruction
->times
> 1) {
434 * Dummy call to list->output to give the offset to the
437 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
438 list
->uplevel(LIST_TIMES
);
439 list
->downlevel(LIST_TIMES
);
442 return instruction
->times
* len
;
444 return 0; /* if we're here, there's an error */
447 /* Check to see if we need an address-size prefix */
448 add_asp(instruction
, bits
);
452 for (temp
= nasm_instructions
[instruction
->opcode
]; temp
->opcode
!= -1; temp
++){
453 int m
= matches(temp
, instruction
, bits
);
455 (m
== 99 && jmp_match(segment
, offset
, bits
,
456 instruction
, temp
->code
))) {
458 int64_t insn_size
= calcsize(segment
, offset
, bits
,
459 instruction
, temp
->code
);
460 itimes
= instruction
->times
;
461 if (insn_size
< 0) /* shouldn't be, on pass two */
462 error(ERR_PANIC
, "errors made it through from pass one");
465 for (j
= 0; j
< MAXPREFIX
; j
++) {
467 switch (instruction
->prefixes
[j
]) {
485 error(ERR_WARNING
| ERR_PASS2
,
486 "cs segment base generated, but will be ignored in 64-bit mode");
492 error(ERR_WARNING
| ERR_PASS2
,
493 "ds segment base generated, but will be ignored in 64-bit mode");
499 error(ERR_WARNING
| ERR_PASS2
,
500 "es segment base generated, but will be ignored in 64-bit mode");
512 error(ERR_WARNING
| ERR_PASS2
,
513 "ss segment base generated, but will be ignored in 64-bit mode");
520 "segr6 and segr7 cannot be used as prefixes");
525 "16-bit addressing is not supported "
527 } else if (bits
!= 16)
537 "64-bit addressing is only supported "
561 error(ERR_PANIC
, "invalid instruction prefix");
564 out(offset
, segment
, &c
, OUT_RAWDATA
, 1,
569 insn_end
= offset
+ insn_size
;
570 gencode(segment
, offset
, bits
, instruction
,
573 if (itimes
> 0 && itimes
== instruction
->times
- 1) {
575 * Dummy call to list->output to give the offset to the
578 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
579 list
->uplevel(LIST_TIMES
);
582 if (instruction
->times
> 1)
583 list
->downlevel(LIST_TIMES
);
584 return offset
- start
;
585 } else if (m
> 0 && m
> size_prob
) {
590 if (temp
->opcode
== -1) { /* didn't match any instruction */
593 error(ERR_NONFATAL
, "operation size not specified");
596 error(ERR_NONFATAL
, "mismatch in operand sizes");
599 error(ERR_NONFATAL
, "no instruction for this cpu level");
602 error(ERR_NONFATAL
, "instruction not supported in %d-bit mode",
607 "invalid combination of opcode and operands");
614 int64_t insn_size(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
615 insn
* instruction
, efunc error
)
617 const struct itemplate
*temp
;
619 errfunc
= error
; /* to pass to other functions */
622 if (instruction
->opcode
== -1)
625 if (instruction
->opcode
== I_DB
|| instruction
->opcode
== I_DW
||
626 instruction
->opcode
== I_DD
|| instruction
->opcode
== I_DQ
||
627 instruction
->opcode
== I_DT
|| instruction
->opcode
== I_DO
||
628 instruction
->opcode
== I_DY
) {
630 int32_t isize
, osize
, wsize
= 0; /* placate gcc */
633 switch (instruction
->opcode
) {
659 for (e
= instruction
->eops
; e
; e
= e
->next
) {
663 if (e
->type
== EOT_DB_NUMBER
)
665 else if (e
->type
== EOT_DB_STRING
||
666 e
->type
== EOT_DB_STRING_FREE
)
667 osize
= e
->stringlen
;
669 align
= (-osize
) % wsize
;
672 isize
+= osize
+ align
;
674 return isize
* instruction
->times
;
677 if (instruction
->opcode
== I_INCBIN
) {
678 const char *fname
= instruction
->eops
->stringval
;
682 fp
= fopen(fname
, "rb");
684 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
686 else if (fseek(fp
, 0L, SEEK_END
) < 0)
687 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
692 if (instruction
->eops
->next
) {
693 len
-= instruction
->eops
->next
->offset
;
694 if (instruction
->eops
->next
->next
&&
695 len
> (size_t)instruction
->eops
->next
->next
->offset
) {
696 len
= (size_t)instruction
->eops
->next
->next
->offset
;
699 return instruction
->times
* len
;
701 return 0; /* if we're here, there's an error */
704 /* Check to see if we need an address-size prefix */
705 add_asp(instruction
, bits
);
707 for (temp
= nasm_instructions
[instruction
->opcode
]; temp
->opcode
!= -1; temp
++) {
708 int m
= matches(temp
, instruction
, bits
);
710 (m
== 99 && jmp_match(segment
, offset
, bits
,
711 instruction
, temp
->code
))) {
712 /* we've matched an instruction. */
714 const uint8_t *codes
= temp
->code
;
717 isize
= calcsize(segment
, offset
, bits
, instruction
, codes
);
720 for (j
= 0; j
< MAXPREFIX
; j
++) {
721 switch (instruction
->prefixes
[j
]) {
747 return isize
* instruction
->times
;
750 return -1; /* didn't match any instruction */
753 static bool possible_sbyte(operand
*o
)
755 return o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
&&
756 !(o
->opflags
& OPFLAG_FORWARD
) &&
757 optimizing
>= 0 && !(o
->type
& STRICT
);
760 /* check that opn[op] is a signed byte of size 16 or 32 */
761 static bool is_sbyte16(operand
*o
)
765 if (!possible_sbyte(o
))
769 return v
>= -128 && v
<= 127;
772 static bool is_sbyte32(operand
*o
)
776 if (!possible_sbyte(o
))
780 return v
>= -128 && v
<= 127;
783 /* Common construct */
784 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
786 static int64_t calcsize(int32_t segment
, int64_t offset
, int bits
,
787 insn
* ins
, const uint8_t *codes
)
796 ins
->rex
= 0; /* Ensure REX is reset */
798 if (ins
->prefixes
[PPS_OSIZE
] == P_O64
)
801 (void)segment
; /* Don't warn that this parameter is unused */
802 (void)offset
; /* Don't warn that this parameter is unused */
806 op1
= (c
& 3) + ((opex
& 1) << 2);
807 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
808 opx
= &ins
->oprs
[op1
];
809 opex
= 0; /* For the next iteration */
816 codes
+= c
, length
+= c
;
827 op_rexflags(opx
, REX_B
|REX_H
|REX_P
|REX_W
);
842 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
843 length
+= (opx
->type
& BITS16
) ? 2 : 4;
845 length
+= (bits
== 16) ? 2 : 4;
853 length
+= ins
->addr_size
>> 3;
861 length
+= 8; /* MOV reg64/imm */
869 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
870 length
+= (opx
->type
& BITS16
) ? 2 : 4;
872 length
+= (bits
== 16) ? 2 : 4;
884 length
+= is_sbyte16(opx
) ? 1 : 2;
893 length
+= is_sbyte32(opx
) ? 1 : 4;
904 ins
->drexdst
= regval(opx
);
909 ins
->rex
|= REX_D
|REX_OC
;
910 ins
->drexdst
= regval(opx
);
924 length
+= is_sbyte32(opx
) ? 1 : 4;
933 ins
->drexdst
= regval(opx
);
934 ins
->vex_m
= *codes
++;
935 ins
->vex_wlp
= *codes
++;
941 ins
->vex_m
= *codes
++;
942 ins
->vex_wlp
= *codes
++;
955 length
+= (bits
!= 16) && !has_prefix(ins
, PPS_ASIZE
, P_A16
);
959 length
+= (bits
!= 32) && !has_prefix(ins
, PPS_ASIZE
, P_A32
);
966 if (bits
!= 64 || has_prefix(ins
, PPS_ASIZE
, P_A16
) ||
967 has_prefix(ins
, PPS_ASIZE
, P_A32
))
975 length
+= (bits
!= 16);
979 length
+= (bits
== 16);
1013 if (!ins
->prefixes
[PPS_LREP
])
1014 ins
->prefixes
[PPS_LREP
] = P_REP
;
1018 if (!ins
->prefixes
[PPS_LREP
])
1019 ins
->prefixes
[PPS_LREP
] = P_REPNE
;
1023 if (ins
->oprs
[0].segment
!= NO_SEG
)
1024 errfunc(ERR_NONFATAL
, "attempt to reserve non-constant"
1025 " quantity of BSS space");
1027 length
+= ins
->oprs
[0].offset
;
1031 if (!ins
->prefixes
[PPS_WAIT
])
1032 ins
->prefixes
[PPS_WAIT
] = P_WAIT
;
1082 struct operand
*opy
= &ins
->oprs
[op2
];
1084 ea_data
.rex
= 0; /* Ensure ea.REX is initially 0 */
1087 /* pick rfield from operand b (opx) */
1088 rflags
= regflag(opx
);
1089 rfield
= nasm_regvals
[opx
->basereg
];
1094 if (!process_ea(opy
, &ea_data
, bits
,
1095 ins
->addr_size
, rfield
, rflags
)) {
1096 errfunc(ERR_NONFATAL
, "invalid effective address");
1099 ins
->rex
|= ea_data
.rex
;
1100 length
+= ea_data
.size
;
1106 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1107 ": instruction code 0x%02X given", c
);
1112 ins
->rex
&= rex_mask
;
1114 if (ins
->rex
& REX_V
) {
1115 int bad32
= REX_R
|REX_W
|REX_X
|REX_B
;
1117 if (ins
->rex
& REX_H
) {
1118 errfunc(ERR_NONFATAL
, "cannot use high register in vex instruction");
1121 switch (ins
->vex_wlp
& 030) {
1135 if (bits
!= 64 && ((ins
->rex
& bad32
) || ins
->drexdst
> 7)) {
1136 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1139 if (ins
->vex_m
!= 1 || (ins
->rex
& (REX_W
|REX_R
|REX_B
)))
1143 } else if (ins
->rex
& REX_D
) {
1144 if (ins
->rex
& REX_H
) {
1145 errfunc(ERR_NONFATAL
, "cannot use high register in drex instruction");
1148 if (bits
!= 64 && ((ins
->rex
& (REX_R
|REX_W
|REX_X
|REX_B
)) ||
1149 ins
->drexdst
> 7)) {
1150 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1154 } else if (ins
->rex
& REX_REAL
) {
1155 if (ins
->rex
& REX_H
) {
1156 errfunc(ERR_NONFATAL
, "cannot use high register in rex instruction");
1158 } else if (bits
== 64) {
1160 } else if ((ins
->rex
& REX_L
) &&
1161 !(ins
->rex
& (REX_P
|REX_W
|REX_X
|REX_B
)) &&
1164 assert_no_prefix(ins
, PPS_LREP
);
1167 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1175 #define EMIT_REX() \
1176 if (!(ins->rex & (REX_D|REX_V)) && (ins->rex & REX_REAL) && (bits == 64)) { \
1177 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1178 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1183 static void gencode(int32_t segment
, int64_t offset
, int bits
,
1184 insn
* ins
, const struct itemplate
*temp
,
1187 static char condval
[] = { /* conditional opcodes */
1188 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1189 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1190 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1197 struct operand
*opx
;
1198 const uint8_t *codes
= temp
->code
;
1203 op1
= (c
& 3) + ((opex
& 1) << 2);
1204 op2
= ((c
>> 3) & 3) + ((opex
& 2) << 1);
1205 opx
= &ins
->oprs
[op1
];
1206 opex
= 0; /* For the next iteration */
1214 out(offset
, segment
, codes
, OUT_RAWDATA
, c
, NO_SEG
, NO_SEG
);
1227 bytes
[0] = *codes
++ + (regval(opx
) & 7);
1228 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1233 /* The test for BITS8 and SBYTE here is intended to avoid
1234 warning on optimizer actions due to SBYTE, while still
1235 warn on explicit BYTE directives. Also warn, obviously,
1236 if the optimizer isn't enabled. */
1237 if (((opx
->type
& BITS8
) ||
1238 !(opx
->type
& temp
->opd
[op1
] & BYTENESS
)) &&
1239 (opx
->offset
< -128 || opx
->offset
> 127)) {
1240 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1241 "signed byte value exceeds bounds");
1243 if (opx
->segment
!= NO_SEG
) {
1245 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1246 opx
->segment
, opx
->wrt
);
1248 bytes
[0] = opx
->offset
;
1249 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1256 if (opx
->offset
< -256 || opx
->offset
> 255) {
1257 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1258 "byte value exceeds bounds");
1260 if (opx
->segment
!= NO_SEG
) {
1262 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1263 opx
->segment
, opx
->wrt
);
1265 bytes
[0] = opx
->offset
;
1266 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1273 if (opx
->offset
< 0 || opx
->offset
> 255)
1274 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1275 "unsigned byte value exceeds bounds");
1276 if (opx
->segment
!= NO_SEG
) {
1278 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1279 opx
->segment
, opx
->wrt
);
1281 bytes
[0] = opx
->offset
;
1282 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1289 warn_overflow(2, opx
);
1291 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1292 opx
->segment
, opx
->wrt
);
1297 if (opx
->type
& (BITS16
| BITS32
))
1298 size
= (opx
->type
& BITS16
) ? 2 : 4;
1300 size
= (bits
== 16) ? 2 : 4;
1301 warn_overflow(size
, opx
);
1303 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1304 opx
->segment
, opx
->wrt
);
1309 warn_overflow(4, opx
);
1311 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1312 opx
->segment
, opx
->wrt
);
1318 size
= ins
->addr_size
>> 3;
1319 warn_overflow(size
, opx
);
1320 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1321 opx
->segment
, opx
->wrt
);
1326 if (opx
->segment
!= segment
)
1327 errfunc(ERR_NONFATAL
,
1328 "short relative jump outside segment");
1329 data
= opx
->offset
- insn_end
;
1330 if (data
> 127 || data
< -128)
1331 errfunc(ERR_NONFATAL
, "short jump is out of range");
1333 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1338 data
= (int64_t)opx
->offset
;
1339 out(offset
, segment
, &data
, OUT_ADDRESS
, 8,
1340 opx
->segment
, opx
->wrt
);
1345 if (opx
->segment
!= segment
) {
1347 out(offset
, segment
, &data
,
1348 OUT_REL2ADR
, insn_end
- offset
,
1349 opx
->segment
, opx
->wrt
);
1351 data
= opx
->offset
- insn_end
;
1352 out(offset
, segment
, &data
,
1353 OUT_ADDRESS
, 2, NO_SEG
, NO_SEG
);
1359 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
1360 size
= (opx
->type
& BITS16
) ? 2 : 4;
1362 size
= (bits
== 16) ? 2 : 4;
1363 if (opx
->segment
!= segment
) {
1365 out(offset
, segment
, &data
,
1366 size
== 2 ? OUT_REL2ADR
: OUT_REL4ADR
,
1367 insn_end
- offset
, opx
->segment
, opx
->wrt
);
1369 data
= opx
->offset
- insn_end
;
1370 out(offset
, segment
, &data
,
1371 OUT_ADDRESS
, size
, NO_SEG
, NO_SEG
);
1377 if (opx
->segment
!= segment
) {
1379 out(offset
, segment
, &data
,
1380 OUT_REL4ADR
, insn_end
- offset
,
1381 opx
->segment
, opx
->wrt
);
1383 data
= opx
->offset
- insn_end
;
1384 out(offset
, segment
, &data
,
1385 OUT_ADDRESS
, 4, NO_SEG
, NO_SEG
);
1391 if (opx
->segment
== NO_SEG
)
1392 errfunc(ERR_NONFATAL
, "value referenced by FAR is not"
1395 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1396 outfmt
->segbase(1 + opx
->segment
),
1403 warn_overflow(2, opx
);
1404 if (is_sbyte16(opx
)) {
1406 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1410 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1411 opx
->segment
, opx
->wrt
);
1418 bytes
[0] = *codes
++;
1419 if (is_sbyte16(opx
))
1420 bytes
[0] |= 2; /* s-bit */
1421 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1427 warn_overflow(4, opx
);
1428 if (is_sbyte32(opx
)) {
1430 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1434 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1435 opx
->segment
, opx
->wrt
);
1442 bytes
[0] = *codes
++;
1443 if (is_sbyte32(opx
))
1444 bytes
[0] |= 2; /* s-bit */
1445 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1455 (ins
->drexdst
<< 4) |
1456 (ins
->rex
& REX_OC
? 0x08 : 0) |
1457 (ins
->rex
& (REX_R
|REX_X
|REX_B
));
1459 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1465 opx
= &ins
->oprs
[c
>> 3];
1466 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1467 opx
= &ins
->oprs
[c
& 7];
1468 if (opx
->segment
!= NO_SEG
|| opx
->wrt
!= NO_SEG
) {
1469 errfunc(ERR_NONFATAL
,
1470 "non-absolute expression not permitted as argument %d",
1473 if (opx
->offset
& ~15) {
1474 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1475 "four-bit argument exceeds bounds");
1477 bytes
[0] |= opx
->offset
& 15;
1479 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1485 opx
= &ins
->oprs
[c
>> 4];
1486 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1488 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1494 opx
= &ins
->oprs
[c
];
1495 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1496 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1502 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1503 (int32_t)data
!= (int64_t)data
) {
1504 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1505 "signed dword immediate exceeds bounds");
1507 if (is_sbyte32(opx
)) {
1509 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1513 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1514 opx
->segment
, opx
->wrt
);
1521 if (opx
->wrt
== NO_SEG
&& opx
->segment
== NO_SEG
&&
1522 (int32_t)data
!= (int64_t)data
) {
1523 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1524 "signed dword immediate exceeds bounds");
1526 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1527 opx
->segment
, opx
->wrt
);
1534 if (ins
->vex_m
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
))) {
1536 bytes
[1] = ins
->vex_m
| ((~ins
->rex
& 7) << 5);
1537 bytes
[2] = ((ins
->rex
& REX_W
) << (7-3)) |
1538 ((~ins
->drexdst
& 15)<< 3) | (ins
->vex_wlp
& 07);
1539 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 3, NO_SEG
, NO_SEG
);
1543 bytes
[1] = ((~ins
->rex
& REX_R
) << (7-2)) |
1544 ((~ins
->drexdst
& 15) << 3) | (ins
->vex_wlp
& 07);
1545 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 2, NO_SEG
, NO_SEG
);
1555 if (ins
->rex
& REX_W
)
1557 else if (ins
->prefixes
[PPS_OSIZE
] == P_O16
)
1559 else if (ins
->prefixes
[PPS_OSIZE
] == P_O32
)
1564 um
= (uint64_t)2 << (s
-1);
1567 if (uv
> 127 && uv
< (uint64_t)-128 &&
1568 (uv
< um
-128 || uv
> um
-1)) {
1569 errfunc(ERR_WARNING
| ERR_PASS2
| ERR_WARN_NOV
,
1570 "signed byte value exceeds bounds");
1572 if (opx
->segment
!= NO_SEG
) {
1574 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1575 opx
->segment
, opx
->wrt
);
1578 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1589 if (bits
== 32 && !has_prefix(ins
, PPS_ASIZE
, P_A16
)) {
1591 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1598 if (bits
!= 32 && !has_prefix(ins
, PPS_ASIZE
, P_A32
)) {
1600 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1619 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1628 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1643 *bytes
= *codes
++ ^ condval
[ins
->condition
];
1644 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1653 *bytes
= c
- 0332 + 0xF2;
1654 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1659 if (ins
->rex
& REX_R
) {
1661 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1664 ins
->rex
&= ~(REX_L
|REX_R
);
1675 if (ins
->oprs
[0].segment
!= NO_SEG
)
1676 errfunc(ERR_PANIC
, "non-constant BSS size in pass two");
1678 int64_t size
= ins
->oprs
[0].offset
;
1680 out(offset
, segment
, NULL
,
1681 OUT_RESERVE
, size
, NO_SEG
, NO_SEG
);
1692 switch (ins
->oprs
[0].basereg
) {
1707 "bizarre 8086 segment register received");
1709 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1716 switch (ins
->oprs
[0].basereg
) {
1725 "bizarre 386 segment register received");
1727 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1736 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1742 bytes
[0] = c
- 0362 + 0xf2;
1743 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1753 *bytes
= c
- 0366 + 0x66;
1754 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1764 *bytes
= bits
== 16 ? 3 : 5;
1765 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1788 struct operand
*opy
= &ins
->oprs
[op2
];
1791 /* pick rfield from operand b (opx) */
1792 rflags
= regflag(opx
);
1793 rfield
= nasm_regvals
[opx
->basereg
];
1795 /* rfield is constant */
1800 if (!process_ea(opy
, &ea_data
, bits
, ins
->addr_size
,
1802 errfunc(ERR_NONFATAL
, "invalid effective address");
1807 *p
++ = ea_data
.modrm
;
1808 if (ea_data
.sib_present
)
1811 /* DREX suffixes come between the SIB and the displacement */
1812 if (ins
->rex
& REX_D
) {
1813 *p
++ = (ins
->drexdst
<< 4) |
1814 (ins
->rex
& REX_OC
? 0x08 : 0) |
1815 (ins
->rex
& (REX_R
|REX_X
|REX_B
));
1820 out(offset
, segment
, bytes
, OUT_RAWDATA
, s
, NO_SEG
, NO_SEG
);
1823 * Make sure the address gets the right offset in case
1824 * the line breaks in the .lst file (BR 1197827)
1829 switch (ea_data
.bytes
) {
1837 warn_overflow(ea_data
.bytes
, opy
);
1840 if (opy
->segment
== segment
) {
1842 out(offset
, segment
, &data
, OUT_ADDRESS
,
1843 ea_data
.bytes
, NO_SEG
, NO_SEG
);
1845 out(offset
, segment
, &data
, OUT_REL4ADR
,
1846 insn_end
- offset
, opy
->segment
, opy
->wrt
);
1850 out(offset
, segment
, &data
, OUT_ADDRESS
,
1851 ea_data
.bytes
, opy
->segment
, opy
->wrt
);
1857 "Invalid amount of bytes (%d) for offset?!",
1866 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1867 ": instruction code 0x%02X given", c
);
1873 static int32_t regflag(const operand
* o
)
1875 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1876 errfunc(ERR_PANIC
, "invalid operand passed to regflag()");
1878 return nasm_reg_flags
[o
->basereg
];
1881 static int32_t regval(const operand
* o
)
1883 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1884 errfunc(ERR_PANIC
, "invalid operand passed to regval()");
1886 return nasm_regvals
[o
->basereg
];
1889 static int op_rexflags(const operand
* o
, int mask
)
1894 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1895 errfunc(ERR_PANIC
, "invalid operand passed to op_rexflags()");
1898 flags
= nasm_reg_flags
[o
->basereg
];
1899 val
= nasm_regvals
[o
->basereg
];
1901 return rexflags(val
, flags
, mask
);
1904 static int rexflags(int val
, int32_t flags
, int mask
)
1909 rex
|= REX_B
|REX_X
|REX_R
;
1912 if (!(REG_HIGH
& ~flags
)) /* AH, CH, DH, BH */
1914 else if (!(REG8
& ~flags
) && val
>= 4) /* SPL, BPL, SIL, DIL */
1920 static int matches(const struct itemplate
*itemp
, insn
* instruction
, int bits
)
1922 int i
, size
[MAX_OPERANDS
], asize
, oprs
, ret
;
1929 if (itemp
->opcode
!= instruction
->opcode
)
1933 * Count the operands
1935 if (itemp
->operands
!= instruction
->operands
)
1939 * Check that no spurious colons or TOs are present
1941 for (i
= 0; i
< itemp
->operands
; i
++)
1942 if (instruction
->oprs
[i
].type
& ~itemp
->opd
[i
] & (COLON
| TO
))
1946 * Process size flags
1948 if (itemp
->flags
& IF_ARMASK
) {
1949 memset(size
, 0, sizeof size
);
1951 i
= ((itemp
->flags
& IF_ARMASK
) >> IF_ARSHFT
) - 1;
1953 switch (itemp
->flags
& IF_SMASK
) {
1990 switch (itemp
->flags
& IF_SMASK
) {
2025 for (i
= 0; i
< MAX_OPERANDS
; i
++)
2030 * Check that the operand flags all match up
2032 for (i
= 0; i
< itemp
->operands
; i
++) {
2033 int32_t type
= instruction
->oprs
[i
].type
;
2034 if (!(type
& SIZE_MASK
))
2037 if (itemp
->opd
[i
] & SAME_AS
) {
2038 int j
= itemp
->opd
[i
] & ~SAME_AS
;
2039 if (type
!= instruction
->oprs
[j
].type
||
2040 instruction
->oprs
[i
].basereg
!= instruction
->oprs
[j
].basereg
)
2042 } else if (itemp
->opd
[i
] & ~type
||
2043 ((itemp
->opd
[i
] & SIZE_MASK
) &&
2044 ((itemp
->opd
[i
] ^ type
) & SIZE_MASK
))) {
2045 if ((itemp
->opd
[i
] & ~type
& ~SIZE_MASK
) ||
2054 * Check operand sizes
2056 if (itemp
->flags
& (IF_SM
| IF_SM2
)) {
2057 oprs
= (itemp
->flags
& IF_SM2
? 2 : itemp
->operands
);
2059 for (i
= 0; i
< oprs
; i
++) {
2060 if ((asize
= itemp
->opd
[i
] & SIZE_MASK
) != 0) {
2062 for (j
= 0; j
< oprs
; j
++)
2068 oprs
= itemp
->operands
;
2071 for (i
= 0; i
< itemp
->operands
; i
++) {
2072 if (!(itemp
->opd
[i
] & SIZE_MASK
) &&
2073 (instruction
->oprs
[i
].type
& SIZE_MASK
& ~size
[i
]))
2078 * Check template is okay at the set cpu level
2080 if (((itemp
->flags
& IF_PLEVEL
) > cpu
))
2084 * Verify the appropriate long mode flag.
2086 if ((itemp
->flags
& (bits
== 64 ? IF_NOLONG
: IF_LONG
)))
2090 * Check if special handling needed for Jumps
2092 if ((uint8_t)(itemp
->code
[0]) >= 0370)
2098 static ea
*process_ea(operand
* input
, ea
* output
, int bits
,
2099 int addrbits
, int rfield
, int32_t rflags
)
2101 bool forw_ref
= !!(input
->opflags
& OPFLAG_FORWARD
);
2103 output
->rip
= false;
2105 /* REX flags for the rfield operand */
2106 output
->rex
|= rexflags(rfield
, rflags
, REX_R
|REX_P
|REX_W
|REX_H
);
2108 if (!(REGISTER
& ~input
->type
)) { /* register direct */
2112 if (input
->basereg
< EXPR_REG_START
/* Verify as Register */
2113 || input
->basereg
>= REG_ENUM_LIMIT
)
2116 i
= nasm_regvals
[input
->basereg
];
2119 return NULL
; /* Invalid EA register */
2121 output
->rex
|= op_rexflags(input
, REX_B
|REX_P
|REX_W
|REX_H
);
2123 output
->sib_present
= false; /* no SIB necessary */
2124 output
->bytes
= 0; /* no offset necessary either */
2125 output
->modrm
= 0xC0 | ((rfield
& 7) << 3) | (i
& 7);
2126 } else { /* it's a memory reference */
2127 if (input
->basereg
== -1
2128 && (input
->indexreg
== -1 || input
->scale
== 0)) {
2129 /* it's a pure offset */
2130 if (bits
== 64 && (~input
->type
& IP_REL
)) {
2131 int scale
, index
, base
;
2132 output
->sib_present
= true;
2136 output
->sib
= (scale
<< 6) | (index
<< 3) | base
;
2138 output
->modrm
= 4 | ((rfield
& 7) << 3);
2139 output
->rip
= false;
2141 output
->sib_present
= false;
2142 output
->bytes
= (addrbits
!= 16 ? 4 : 2);
2143 output
->modrm
= (addrbits
!= 16 ? 5 : 6) | ((rfield
& 7) << 3);
2144 output
->rip
= bits
== 64;
2146 } else { /* it's an indirection */
2147 int i
= input
->indexreg
, b
= input
->basereg
, s
= input
->scale
;
2148 int32_t o
= input
->offset
, seg
= input
->segment
;
2149 int hb
= input
->hintbase
, ht
= input
->hinttype
;
2152 int32_t ix
, bx
; /* register flags */
2155 i
= -1; /* make this easy, at least */
2157 if (i
>= EXPR_REG_START
&& i
< REG_ENUM_LIMIT
) {
2158 it
= nasm_regvals
[i
];
2159 ix
= nasm_reg_flags
[i
];
2165 if (b
>= EXPR_REG_START
&& b
< REG_ENUM_LIMIT
) {
2166 bt
= nasm_regvals
[b
];
2167 bx
= nasm_reg_flags
[b
];
2173 /* check for a 32/64-bit memory reference... */
2174 if ((ix
|bx
) & (BITS32
|BITS64
)) {
2175 /* it must be a 32/64-bit memory reference. Firstly we have
2176 * to check that all registers involved are type E/Rxx. */
2177 int32_t sok
= BITS32
|BITS64
;
2180 if (!(REG64
& ~ix
) || !(REG32
& ~ix
))
2188 return NULL
; /* Invalid register */
2189 if (~sok
& bx
& SIZE_MASK
)
2190 return NULL
; /* Invalid size */
2194 /* While we're here, ensure the user didn't specify
2196 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2199 if (addrbits
== 16 ||
2200 (addrbits
== 32 && !(sok
& BITS32
)) ||
2201 (addrbits
== 64 && !(sok
& BITS64
)))
2204 /* now reorganize base/index */
2205 if (s
== 1 && bt
!= it
&& bt
!= -1 && it
!= -1 &&
2206 ((hb
== b
&& ht
== EAH_NOTBASE
)
2207 || (hb
== i
&& ht
== EAH_MAKEBASE
))) {
2208 /* swap if hints say so */
2209 t
= bt
, bt
= it
, it
= t
;
2210 t
= bx
, bx
= ix
, ix
= t
;
2212 if (bt
== it
) /* convert EAX+2*EAX to 3*EAX */
2213 bt
= -1, bx
= 0, s
++;
2214 if (bt
== -1 && s
== 1 && !(hb
== it
&& ht
== EAH_NOTBASE
)) {
2215 /* make single reg base, unless hint */
2216 bt
= it
, bx
= ix
, it
= -1, ix
= 0;
2218 if (((s
== 2 && it
!= REG_NUM_ESP
2219 && !(input
->eaflags
& EAF_TIMESTWO
)) || s
== 3
2220 || s
== 5 || s
== 9) && bt
== -1)
2221 bt
= it
, bx
= ix
, s
--; /* convert 3*EAX to EAX+2*EAX */
2222 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
2223 && (input
->eaflags
& EAF_TIMESTWO
))
2224 it
= bt
, ix
= bx
, bt
= -1, bx
= 0, s
= 1;
2225 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2226 if (s
== 1 && it
== REG_NUM_ESP
) {
2227 /* swap ESP into base if scale is 1 */
2228 t
= it
, it
= bt
, bt
= t
;
2229 t
= ix
, ix
= bx
, bx
= t
;
2231 if (it
== REG_NUM_ESP
2232 || (s
!= 1 && s
!= 2 && s
!= 4 && s
!= 8 && it
!= -1))
2233 return NULL
; /* wrong, for various reasons */
2235 output
->rex
|= rexflags(it
, ix
, REX_X
);
2236 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2238 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
) {
2247 if (rm
!= REG_NUM_EBP
&& o
== 0 &&
2248 seg
== NO_SEG
&& !forw_ref
&&
2250 (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2252 else if (input
->eaflags
& EAF_BYTEOFFS
||
2253 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2255 && !(input
->eaflags
& EAF_WORDOFFS
)))
2261 output
->sib_present
= false;
2262 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2263 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | rm
;
2266 int mod
, scale
, index
, base
;
2286 default: /* then what the smeg is it? */
2287 return NULL
; /* panic */
2295 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2296 seg
== NO_SEG
&& !forw_ref
&&
2298 (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2300 else if (input
->eaflags
& EAF_BYTEOFFS
||
2301 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2303 && !(input
->eaflags
& EAF_WORDOFFS
)))
2309 output
->sib_present
= true;
2310 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2311 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | 4;
2312 output
->sib
= (scale
<< 6) | (index
<< 3) | base
;
2314 } else { /* it's 16-bit */
2317 /* check for 64-bit long mode */
2321 /* check all registers are BX, BP, SI or DI */
2322 if ((b
!= -1 && b
!= R_BP
&& b
!= R_BX
&& b
!= R_SI
2323 && b
!= R_DI
) || (i
!= -1 && i
!= R_BP
&& i
!= R_BX
2324 && i
!= R_SI
&& i
!= R_DI
))
2327 /* ensure the user didn't specify DWORD/QWORD */
2328 if (input
->disp_size
== 32 || input
->disp_size
== 64)
2331 if (s
!= 1 && i
!= -1)
2332 return NULL
; /* no can do, in 16-bit EA */
2333 if (b
== -1 && i
!= -1) {
2338 if ((b
== R_SI
|| b
== R_DI
) && i
!= -1) {
2343 /* have BX/BP as base, SI/DI index */
2345 return NULL
; /* shouldn't ever happen, in theory */
2346 if (i
!= -1 && b
!= -1 &&
2347 (i
== R_BP
|| i
== R_BX
|| b
== R_SI
|| b
== R_DI
))
2348 return NULL
; /* invalid combinations */
2349 if (b
== -1) /* pure offset: handled above */
2350 return NULL
; /* so if it gets to here, panic! */
2354 switch (i
* 256 + b
) {
2355 case R_SI
* 256 + R_BX
:
2358 case R_DI
* 256 + R_BX
:
2361 case R_SI
* 256 + R_BP
:
2364 case R_DI
* 256 + R_BP
:
2382 if (rm
== -1) /* can't happen, in theory */
2383 return NULL
; /* so panic if it does */
2385 if (o
== 0 && seg
== NO_SEG
&& !forw_ref
&& rm
!= 6 &&
2386 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2388 else if (input
->eaflags
& EAF_BYTEOFFS
||
2389 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2391 && !(input
->eaflags
& EAF_WORDOFFS
)))
2396 output
->sib_present
= false; /* no SIB - it's 16-bit */
2397 output
->bytes
= mod
; /* bytes of offset needed */
2398 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | rm
;
2403 output
->size
= 1 + output
->sib_present
+ output
->bytes
;
2407 static void add_asp(insn
*ins
, int addrbits
)
2412 valid
= (addrbits
== 64) ? 64|32 : 32|16;
2414 switch (ins
->prefixes
[PPS_ASIZE
]) {
2425 valid
&= (addrbits
== 32) ? 16 : 32;
2431 for (j
= 0; j
< ins
->operands
; j
++) {
2432 if (!(MEMORY
& ~ins
->oprs
[j
].type
)) {
2435 /* Verify as Register */
2436 if (ins
->oprs
[j
].indexreg
< EXPR_REG_START
2437 || ins
->oprs
[j
].indexreg
>= REG_ENUM_LIMIT
)
2440 i
= nasm_reg_flags
[ins
->oprs
[j
].indexreg
];
2442 /* Verify as Register */
2443 if (ins
->oprs
[j
].basereg
< EXPR_REG_START
2444 || ins
->oprs
[j
].basereg
>= REG_ENUM_LIMIT
)
2447 b
= nasm_reg_flags
[ins
->oprs
[j
].basereg
];
2449 if (ins
->oprs
[j
].scale
== 0)
2453 int ds
= ins
->oprs
[j
].disp_size
;
2454 if ((addrbits
!= 64 && ds
> 8) ||
2455 (addrbits
== 64 && ds
== 16))
2475 if (valid
& addrbits
) {
2476 ins
->addr_size
= addrbits
;
2477 } else if (valid
& ((addrbits
== 32) ? 16 : 32)) {
2478 /* Add an address size prefix */
2479 enum prefixes pref
= (addrbits
== 32) ? P_A16
: P_A32
;
2480 ins
->prefixes
[PPS_ASIZE
] = pref
;
2481 ins
->addr_size
= (addrbits
== 32) ? 16 : 32;
2484 errfunc(ERR_NONFATAL
, "impossible combination of address sizes");
2485 ins
->addr_size
= addrbits
; /* Error recovery */
2488 defdisp
= ins
->addr_size
== 16 ? 16 : 32;
2490 for (j
= 0; j
< ins
->operands
; j
++) {
2491 if (!(MEM_OFFS
& ~ins
->oprs
[j
].type
) &&
2492 (ins
->oprs
[j
].disp_size
? ins
->oprs
[j
].disp_size
: defdisp
)
2493 != ins
->addr_size
) {
2494 /* mem_offs sizes must match the address size; if not,
2495 strip the MEM_OFFS bit and match only EA instructions */
2496 ins
->oprs
[j
].type
&= ~(MEM_OFFS
& ~MEMORY
);