summaryrefslogtreecommitdiff
path: root/cgen/doc/opcodes.texi
diff options
context:
space:
mode:
Diffstat (limited to 'cgen/doc/opcodes.texi')
-rw-r--r--cgen/doc/opcodes.texi186
1 files changed, 186 insertions, 0 deletions
diff --git a/cgen/doc/opcodes.texi b/cgen/doc/opcodes.texi
new file mode 100644
index 00000000000..4085aa20588
--- /dev/null
+++ b/cgen/doc/opcodes.texi
@@ -0,0 +1,186 @@
+@c Copyright (C) 2000 Red Hat, Inc.
+@c This file is part of the CGEN manual.
+@c For copying conditions, see the file cgen.texi.
+
+@node Opcodes
+@chapter Opcodes support
+@cindex Opcodes support
+
+Opcodes support comes in the form of machine generated opcode tables as
+well as supporting routines.
+
+@menu
+* Generated files:: List of generated files
+* The .opc file:: Target specific C code
+* Special assembler parsing needs::
+@end menu
+
+@node Generated files
+@section Generated files
+
+The basic interface is defined by
+@file{include/opcode/cgen.h} which is included by the machine generated
+@file{<arch>-desc.h}. @file{opcode/cgen.h} can stand on its own for the
+target independent stuff, but to get target specific parts of the
+interface use @file{<arch>-desc.h}.
+
+The generated files are:
+
+@table @file
+@item <arch>-desc.h
+Defines macros, enums, and types used to describe the chip.
+@item <arch>-desc.c
+Tables of various things describing the chip.
+This does not include assembler syntax nor semantic information.
+@item <arch>-ibld.c
+Routines for constructing and deconstructing instructions.
+@item <arch>-opc.h
+Declarations necessary for assembly/disassembly that aren't used
+elsewhere and thus left out of @file{<arch>-desc.h}.
+@item <arch>-opc.c
+Assembler syntax tables.
+@item <arch>-asm.c
+Assembler support routines.
+@item <arch>-dis.c
+Disassembler support routines.
+@item <arch>-opinst.c
+Operand instance tables.
+These describe which hardware elements are read and which are written
+for each instruction. This file isn't generated for all architectures,
+only ones that can make use of the data. For example the M32R uses them
+to emit warnings if the output of one parallel instruction is the input
+of another, and to control creating parallel instructions during optimizing
+assembly.
+@end table
+
+@node The .opc file
+@section The .opc file
+
+Files with suffix @file{.opc} (e.g. @file{m32r.opc}) contain target
+specific C code that accompanies the cpu description file.
+The @file{.opc} file is split into 4 sections:
+
+@itemize @minus
+@item opc.h
+
+This section contains additions to the generated @file{$target-opc.h} file.
+
+Typically defined here are these macros:
+
+@itemize @bullet
+@item #define CGEN_DIS_HASH_SIZE N
+
+Specifies the size of the hash table to use during disassembly.
+A hash table is built of the selected mach's instructions in order to
+speed up disassembly.
+@item #define CGEN_DIS_HASH(buffer, value)
+
+Given BUFFER, a pointer to the instruction being disassembled and
+VALUE, the value of the instruction as a host integer, return an
+index into the hash chain for the instruction. The result must be
+in the range 0 to CGEN_DIS_HASH_SIZE-1.
+
+VALUE is only usable if all instructions fit in a portable integer (32 bits).
+
+N.B. The result must depend on opcode portions of the instruction only.
+Normally one wants to use between 6 and 8 bits of opcode info for the hash
+table. However, some instruction sets don't use the same set of bits
+for all insns. Certainly they'll have at least one opcode bit in common
+with all insns, but beyond that it can vary. Here's a possible definition
+for sparc.
+
+@example
+#undef CGEN_DIS_HASH_SIZE
+#define CGEN_DIS_HASH_SIZE 256
+#undef CGEN_DIS_HASH
+extern const unsigned int sparc_cgen_opcode_bits[];
+#define CGEN_DIS_HASH(buffer, insn) \
+((((insn) >> 24) & 0xc0) \
+ | (((insn) & sparc_cgen_opcode_bits[((insn) >> 30) & 3]) >> 19))
+@end example
+
+@code{sparc_cgen_opcode_bits} would be defined in the @samp{asm.c} section as
+
+@example
+/* It is important that we only look at insn code bits
+ as that is how the opcode table is hashed.
+ OPCODE_BITS is a table of valid bits for each of the
+ main types (0,1,2,3). */
+const unsigned int sparc_cgen_opcode_bits[4] = @{
+ 0x01c00000, 0x0, 0x01f80000, 0x01f80000
+@};
+@end example
+@end itemize
+
+@item opc.c
+
+@item asm.c
+
+This section contains additions to the generated @file{$target-asm.c} file.
+Typically defined here are functions used by operands with a @code{parse}
+define-operand handler spec.
+
+@item dis.c
+
+This section contains additions to the generated @file{$target-dis.c} file.
+
+Typically defined here these macros:
+
+@itemize @bullet
+@item #define CGEN_PRINT_NORMAL(cd, info, value, attrs, pc, length)
+@item #define CGEN_PRINT_ADDRESS(cd, info, value, attrs, pc, length)
+@item #define CGEN_PRINT_INSN function_name
+@c FIXME: should be CGEN_PRINT_INSN(cd, pc, info)
+@item #define CGEN_BFD_ARCH bfd_arch_<name>
+@item #define CGEN_COMPUTE_ISA(info)
+@end itemize
+
+@end itemize
+
+@node Special assembler parsing needs
+@section Special assembler parsing needs
+
+Often parsing of assembly instructions requires more than what
+a program-generated assembler can handle. For example one version
+of an instruction may only accept certain registers, rather than
+the entire set.
+
+Here's an example taken from the @samp{m32r} architecture.
+
+32 bit addresses are built up with a two instruction sequence: one to
+load the high 16 bits of a register, and another to @code{or}-in the
+lower 16 bits.
+
+@example
+seth r0,high(some_symbol)
+or3 r0,r0,low(some_symbol)
+@end example
+
+When assembling, special code must be called to recognize the
+@code{high} and @code{low} pseudo-ops and generate the appropriate
+relocations. This is indicated by specifying a "parse handler" for
+the operand in question. Here is the @code{define-operand}
+for the lower 16 bit operand.
+
+@example
+(define-operand
+ (name ulo16)
+ (comment "16 bit unsigned immediate, for low()")
+ (attrs)
+ (type h-ulo16)
+ (index f-uimm16)
+ (handlers (parse "ulo16"))
+)
+@end example
+
+The generated parser will call a function named @code{parse_ulo16}
+for the immediate operand of the @code{or3} instruction.
+The name of the function is constructed by prepended "parse_" to the
+argument of the @code{parse} spec.
+
+@example
+errmsg = parse_ulo16 (cd, strp, M32R_OPERAND_ULO16, &fields->f_uimm16);
+@end example
+
+But where does one put the @code{parse_ulo16} function?
+Answer: in the @samp{asm.c} section of @file{m32r.opc}.