* dwarf_reader.cc (Sized_dwarf_line_info::read_header_prolog,
[deliverable/binutils-gdb.git] / include / opcode / i386.h
CommitLineData
0b1cf022 1/* opcode/i386.h -- Intel 80386 opcode macros
4f1d9bd8 2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4eed87de 3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4f1d9bd8 4 Free Software Foundation, Inc.
252b5132 5
543613e9 6 This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger.
252b5132 7
543613e9
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
252b5132 12
543613e9
NC
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
543613e9
NC
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
e172dbf8 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132 21
d0b47220
AM
22/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived
23 ix86 Unix assemblers, generate floating point instructions with
24 reversed source and destination registers in certain cases.
25 Unfortunately, gcc and possibly many other programs use this
26 reversed syntax, so we're stuck with it.
252b5132 27
7f3f1ea2
AM
28 eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but
29 `fsub %st,%st(3)' results in st(3) = st - st(3), rather than
30 the expected st(3) = st(3) - st
252b5132
RH
31
32 This happens with all the non-commutative arithmetic floating point
33 operations with two register operands, where the source register is
d796c0ad 34 %st, and destination register is %st(i).
7f3f1ea2
AM
35
36 The affected opcode map is dceX, dcfX, deeX, defX. */
252b5132 37
d0b47220 38#ifndef SYSV386_COMPAT
252b5132 39/* Set non-zero for broken, compatible instructions. Set to zero for
d0b47220 40 non-broken opcodes at your peril. gcc generates SystemV/386
252b5132 41 compatible instructions. */
d0b47220
AM
42#define SYSV386_COMPAT 1
43#endif
44#ifndef OLDGCC_COMPAT
45/* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could
46 generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands
47 reversed. */
48#define OLDGCC_COMPAT SYSV386_COMPAT
252b5132 49#endif
252b5132 50
252b5132 51#define MOV_AX_DISP32 0xa0
252b5132 52#define POP_SEG_SHORT 0x07
252b5132 53#define JUMP_PC_RELATIVE 0xeb
543613e9 54#define INT_OPCODE 0xcd
252b5132 55#define INT3_OPCODE 0xcc
0b1cf022
L
56/* The opcode for the fwait instruction, which disassembler treats as a
57 prefix when it can. */
252b5132 58#define FWAIT_OPCODE 0x9b
252b5132 59#define ADDR_PREFIX_OPCODE 0x67
252b5132 60#define DATA_PREFIX_OPCODE 0x66
252b5132 61#define LOCK_PREFIX_OPCODE 0xf0
252b5132 62#define CS_PREFIX_OPCODE 0x2e
252b5132 63#define DS_PREFIX_OPCODE 0x3e
252b5132 64#define ES_PREFIX_OPCODE 0x26
252b5132 65#define FS_PREFIX_OPCODE 0x64
252b5132 66#define GS_PREFIX_OPCODE 0x65
252b5132 67#define SS_PREFIX_OPCODE 0x36
252b5132
RH
68#define REPNE_PREFIX_OPCODE 0xf2
69#define REPE_PREFIX_OPCODE 0xf3
050dfa73 70
0b1cf022
L
71#define TWO_BYTE_OPCODE_ESCAPE 0x0f
72#define NOP_OPCODE (char) 0x90
050dfa73 73
0b1cf022
L
74/* register numbers */
75#define EBP_REG_NUM 5
76#define ESP_REG_NUM 4
050dfa73 77
0b1cf022
L
78/* modrm_byte.regmem for twobyte escape */
79#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
80/* index_base_byte.index for no index register addressing */
81#define NO_INDEX_REGISTER ESP_REG_NUM
82/* index_base_byte.base for no base register addressing */
83#define NO_BASE_REGISTER EBP_REG_NUM
84#define NO_BASE_REGISTER_16 6
0f10071e 85
0b1cf022
L
86/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
87#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */
88#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
252b5132 89
0b1cf022
L
90/* x86-64 extension prefix. */
91#define REX_OPCODE 0x40
252b5132 92
0b1cf022 93/* Indicates 64 bit operand size. */
161a04f6 94#define REX_W 8
0b1cf022 95/* High extension to reg field of modrm byte. */
161a04f6 96#define REX_R 4
0b1cf022 97/* High extension to SIB index field. */
161a04f6 98#define REX_X 2
0b1cf022 99/* High extension to base field of modrm or SIB, or reg field of opcode. */
161a04f6 100#define REX_B 1
252b5132 101
0b1cf022
L
102/* max operands per insn */
103#define MAX_OPERANDS 4
252b5132 104
0b1cf022
L
105/* max immediates per insn (lcall, ljmp, insertq, extrq) */
106#define MAX_IMMEDIATE_OPERANDS 2
5f47d35b 107
0b1cf022
L
108/* max memory refs per insn (string ops) */
109#define MAX_MEMORY_OPERANDS 2
252b5132 110
0b1cf022
L
111/* max size of insn mnemonics. */
112#define MAX_MNEM_SIZE 16
252b5132 113
0b1cf022
L
114/* max size of register name in insn mnemonics. */
115#define MAX_REG_NAME_SIZE 8
This page took 0.360778 seconds and 4 git commands to generate.