Skip to content

Commit 49640ed

Browse files
author
H. Peter Anvin
committed
x86: move the bytecode defintion into a separate file in x86/
At least three files (asm/assemble.c, disasm/disasm.c, and x86/insns.pl) depend on the bytecode defintions. It makes a lot more sense for them to live in an explicit documentation file in the x86/ directory. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
1 parent 77df155 commit 49640ed

File tree

4 files changed

+152
-137
lines changed

4 files changed

+152
-137
lines changed

asm/assemble.c

Lines changed: 0 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -34,143 +34,6 @@
3434
/*
3535
* assemble.c code generation for the Netwide Assembler
3636
*
37-
* Bytecode specification
38-
* ----------------------
39-
*
40-
*
41-
* Codes Mnemonic Explanation
42-
*
43-
* \0 terminates the code. (Unless it's a literal of course.)
44-
* \1..\4 that many literal bytes follow in the code stream
45-
* \5 add 4 to the primary operand number (b, low octdigit)
46-
* \6 add 4 to the secondary operand number (a, middle octdigit)
47-
* \7 add 4 to both the primary and the secondary operand number
48-
* \10..\13 a literal byte follows in the code stream, to be added
49-
* to the register value of operand 0..3
50-
* \14..\17 the position of index register operand in MIB (BND insns)
51-
* \20..\23 ib a byte immediate operand, from operand 0..3
52-
* \24..\27 ib,u a zero-extended byte immediate operand, from operand 0..3
53-
* \30..\33 iw a word immediate operand, from operand 0..3
54-
* \34..\37 iwd select between \3[0-3] and \4[0-3] depending on 16/32 bit
55-
* assembly mode or the operand-size override on the operand
56-
* \40..\43 id a long immediate operand, from operand 0..3
57-
* \44..\47 iwdq select between \3[0-3], \4[0-3] and \5[4-7]
58-
* depending on the address size of the instruction.
59-
* \50..\53 rel8 a byte relative operand, from operand 0..3
60-
* \54..\57 iq a qword immediate operand, from operand 0..3
61-
* \60..\63 rel16 a word relative operand, from operand 0..3
62-
* \64..\67 rel select between \6[0-3] and \7[0-3] depending on 16/32 bit
63-
* assembly mode or the operand-size override on the operand
64-
* \70..\73 rel32 a long relative operand, from operand 0..3
65-
* \74..\77 seg a word constant, from the _segment_ part of operand 0..3
66-
* \1ab /r a ModRM, calculated on EA in operand a, with the reg
67-
* field the register value of operand b.
68-
* \171\mab /mrb (e.g /3r0) a ModRM, with the reg field taken from operand a, and the m
69-
* and b fields set to the specified values.
70-
* \172\ab /is4 the register number from operand a in bits 7..4, with
71-
* the 4-bit immediate from operand b in bits 3..0.
72-
* \173\xab the register number from operand a in bits 7..4, with
73-
* the value b in bits 3..0.
74-
* \174..\177 the register number from operand 0..3 in bits 7..4, and
75-
* an arbitrary value in bits 3..0 (assembled as zero.)
76-
* \2ab /b a ModRM, calculated on EA in operand a, with the reg
77-
* field equal to digit b.
78-
* \240..\243 this instruction uses EVEX rather than REX or VEX/XOP, with the
79-
* V field taken from operand 0..3.
80-
* \250 this instruction uses EVEX rather than REX or VEX/XOP, with the
81-
* V field set to 1111b.
82-
*
83-
* EVEX prefixes are followed by the sequence:
84-
* \cm\wlp\tup where cm is:
85-
* cc 00m mmm
86-
* c = 2 for EVEX and mmmm is the M field (EVEX.P0[3:0])
87-
* and wlp is:
88-
* 00 wwl lpp
89-
* [l0] ll = 0 (.128, .lz)
90-
* [l1] ll = 1 (.256)
91-
* [l2] ll = 2 (.512)
92-
* [lig] ll = 3 for EVEX.L'L don't care (always assembled as 0)
93-
*
94-
* [w0] ww = 0 for W = 0
95-
* [w1] ww = 1 for W = 1
96-
* [wig] ww = 2 for W don't care (always assembled as 0)
97-
* [ww] ww = 3 for W used as REX.W
98-
*
99-
* [p0] pp = 0 for no prefix
100-
* [60] pp = 1 for legacy prefix 60
101-
* [f3] pp = 2
102-
* [f2] pp = 3
103-
*
104-
* tup is tuple type for Disp8*N from %tuple_codes in insns.pl
105-
* (compressed displacement encoding)
106-
*
107-
* \254..\257 id,s a signed 32-bit operand to be extended to 64 bits.
108-
* \260..\263 this instruction uses VEX/XOP rather than REX, with the
109-
* V field taken from operand 0..3.
110-
* \270 this instruction uses VEX/XOP rather than REX, with the
111-
* V field set to 1111b.
112-
* VEX/XOP prefixes are followed by the sequence:
113-
* \tmm\wlp where mm is the M field; and wlp is:
114-
* 00 wwl lpp
115-
* [l0] ll = 0 for L = 0 (.128, .lz)
116-
* [l1] ll = 1 for L = 1 (.256)
117-
* [lig] ll = 2 for L don't care (always assembled as 0)
118-
*
119-
* [w0] ww = 0 for W = 0
120-
* [w1 ] ww = 1 for W = 1
121-
* [wig] ww = 2 for W don't care (always assembled as 0)
122-
* [ww] ww = 3 for W used as REX.W
123-
*
124-
* t = 0 for VEX (C4/C5), t = 1 for XOP (8F).
125-
*
126-
* \271 hlexr instruction takes XRELEASE (F3) with or without lock
127-
* \272 hlenl instruction takes XACQUIRE/XRELEASE with or without lock
128-
* \273 hle instruction takes XACQUIRE/XRELEASE with lock only
129-
* \274..\277 ib,s a byte immediate operand, from operand 0..3, sign-extended
130-
* to the operand size (if o16/o32/o64 present) or the bit size
131-
* \310 a16 indicates fixed 16-bit address size, i.e. optional 0x67.
132-
* \311 a32 indicates fixed 32-bit address size, i.e. optional 0x67.
133-
* \312 adf (disassembler only) invalid with non-default address size.
134-
* \313 a64 indicates fixed 64-bit address size, 0x67 invalid.
135-
* \314 norexb (disassembler only) invalid with REX.B
136-
* \315 norexx (disassembler only) invalid with REX.X
137-
* \316 norexr (disassembler only) invalid with REX.R
138-
* \317 norexw (disassembler only) invalid with REX.W
139-
* \320 o16 indicates fixed 16-bit operand size, i.e. optional 0x66.
140-
* \321 o32 indicates fixed 32-bit operand size, i.e. optional 0x66.
141-
* \322 odf indicates that this instruction is only valid when the
142-
* operand size is the default (instruction to disassembler,
143-
* generates no code in the assembler)
144-
* \323 o64nw indicates fixed 64-bit operand size, REX on extensions only.
145-
* \324 o64 indicates 64-bit operand size requiring REX prefix.
146-
* \325 nohi instruction which always uses spl/bpl/sil/dil
147-
* \326 nof3 instruction not valid with 0xF3 REP prefix. Hint for
148-
disassembler only; for SSE instructions.
149-
* \331 norep instruction not valid with REP prefix. Hint for
150-
* disassembler only; for SSE instructions.
151-
* \332 f2i REP prefix (0xF2 byte) used as opcode extension.
152-
* \333 f3i REP prefix (0xF3 byte) used as opcode extension.
153-
* \334 rex.l LOCK prefix used as REX.R (used in non-64-bit mode)
154-
* \335 repe disassemble a rep (0xF3 byte) prefix as repe not rep.
155-
* \336 mustrep force a REP(E) prefix (0xF3) even if not specified.
156-
* \337 mustrepne force a REPNE prefix (0xF2) even if not specified.
157-
* \336-\337 are still listed as prefixes in the disassembler.
158-
* \340 resb reserve <operand 0> bytes of uninitialized storage.
159-
* Operand 0 had better be a segmentless constant.
160-
* \341 wait this instruction needs a WAIT "prefix"
161-
* \360 np no SSE prefix (== \364\331)
162-
* \361 66 SSE prefix (== \366\331)
163-
* \364 !osp operand-size prefix (0x66) not permitted
164-
* \365 !asp address-size prefix (0x67) not permitted
165-
* \366 operand-size prefix (0x66) used as opcode extension
166-
* \367 address-size prefix (0x67) used as opcode extension
167-
* \370,\371 jcc8 match only if operand 0 meets byte jump criteria.
168-
* jmp8 370 is used for Jcc, 371 is used for JMP.
169-
* \373 jlen assemble 0x03 if bits==16, 0x05 if bits==32;
170-
* used for conditional jump over longer jump
171-
* \374 vsibx|vm32x|vm64x this instruction takes an XMM VSIB memory EA
172-
* \375 vsiby|vm32y|vm64y this instruction takes an YMM VSIB memory EA
173-
* \376 vsibz|vm32z|vm64z this instruction takes an ZMM VSIB memory EA
17437
*/
17538

17639
#include "compiler.h"

disasm/disasm.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333

3434
/*
3535
* disasm.c where all the _work_ gets done in the Netwide Disassembler
36+
*
37+
* See x86/bytecode.txt for the definition of the instruction encoding
38+
* byte codes.
3639
*/
3740

3841
#include "compiler.h"

0 commit comments

Comments
 (0)