| /* 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 */ |