123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /* insns.h header file for insns.c
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the license given in the file "LICENSE"
- * distributed in the NASM archive.
- */
- #ifndef NASM_INSNS_H
- #define NASM_INSNS_H
- #include "nasm.h"
- #include "tokens.h"
- #include "iflag.h"
- /* if changed, ITEMPLATE_END should be also changed accordingly */
- struct itemplate {
- enum opcode opcode; /* the token, passed from "parser.c" */
- int operands; /* number of operands */
- opflags_t opd[MAX_OPERANDS]; /* bit flags for operand types */
- decoflags_t deco[MAX_OPERANDS]; /* bit flags for operand decorators */
- const uint8_t *code; /* the code it assembles to */
- uint32_t iflag_idx; /* some flags referenced by index */
- };
- /* Use this helper to test instruction template flags */
- static inline bool itemp_has(const struct itemplate *itemp, unsigned int bit)
- {
- return iflag_test(&insns_flags[itemp->iflag_idx], bit);
- }
- /* Disassembler table structure */
- /*
- * If n == -1, then p points to another table of 256
- * struct disasm_index, otherwise p points to a list of n
- * struct itemplates to consider.
- */
- struct disasm_index {
- const void *p;
- int n;
- };
- /* Tables for the assembler and disassembler, respectively */
- extern const struct itemplate * const nasm_instructions[];
- extern const struct disasm_index itable[256];
- extern const struct disasm_index * const itable_vex[NASM_VEX_CLASSES][32][4];
- /* Common table for the byte codes */
- extern const uint8_t nasm_bytecodes[];
- /*
- * this define is used to signify the end of an itemplate
- */
- #define ITEMPLATE_END {I_none,0,{0,},{0,},NULL,0}
- /*
- * Pseudo-op tests
- */
- /* DB-type instruction (DB, DW, ...) */
- static inline bool const_func opcode_is_db(enum opcode opcode)
- {
- return opcode >= I_DB && opcode < I_RESB;
- }
- /* RESB-type instruction (RESB, RESW, ...) */
- static inline bool const_func opcode_is_resb(enum opcode opcode)
- {
- return opcode >= I_RESB && opcode < I_INCBIN;
- }
- /* Width of Dx and RESx instructions */
- /*
- * initialized data bytes length from opcode
- */
- static inline int const_func db_bytes(enum opcode opcode)
- {
- switch (opcode) {
- case I_DB:
- return 1;
- case I_DW:
- return 2;
- case I_DD:
- return 4;
- case I_DQ:
- return 8;
- case I_DT:
- return 10;
- case I_DO:
- return 16;
- case I_DY:
- return 32;
- case I_DZ:
- return 64;
- case I_none:
- return -1;
- default:
- return 0;
- }
- }
- /*
- * Uninitialized data bytes length from opcode
- */
- static inline int const_func resb_bytes(enum opcode opcode)
- {
- switch (opcode) {
- case I_RESB:
- return 1;
- case I_RESW:
- return 2;
- case I_RESD:
- return 4;
- case I_RESQ:
- return 8;
- case I_REST:
- return 10;
- case I_RESO:
- return 16;
- case I_RESY:
- return 32;
- case I_RESZ:
- return 64;
- case I_none:
- return -1;
- default:
- return 0;
- }
- }
- #endif /* NASM_INSNS_H */
|