| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* Copyright 1996-2025 The NASM Authors - All Rights Reserved */ |
| |
| /* |
| * common.c - code common to nasm and ndisasm |
| */ |
| |
| #include "compiler.h" |
| #include "nasm.h" |
| #include "nasmlib.h" |
| #include "insns.h" |
| |
| /* |
| * Per-pass global (across segments) state |
| */ |
| struct globalopt globl; |
| |
| /* |
| * Name of a register token, if applicable; otherwise NULL |
| */ |
| const char *register_name(int token) |
| { |
| if (is_register(token)) |
| return nasm_reg_names[token - EXPR_REG_START]; |
| else |
| return NULL; |
| } |
| |
| /* |
| * Common list of prefix names; ideally should be auto-generated |
| * from tokens.dat. This MUST match the enum in include/nasm.h. |
| */ |
| const char *prefix_name(int token) |
| { |
| static const char * const |
| prefix_names[PREFIX_ENUM_LIMIT - PREFIX_ENUM_START] = { |
| "a16", "a32", "a64", "asp", "lock", "o16", "o32", "o64", "osp", |
| "rep", "repe", "repne", "repnz", "repz", "wait", |
| "xacquire", "xrelease", "bnd", "nobnd", "{rex}", "{rex2}", |
| "{evex}", "{vex}", "{vex3}", "{vex2}", "{nf}", "{zu}", |
| "{pt}", "{pn}" |
| }; |
| const char *name; |
| |
| /* A register can also be a prefix */ |
| name = register_name(token); |
| |
| if (!name) { |
| const unsigned int prefix = token - PREFIX_ENUM_START; |
| if (prefix < ARRAY_SIZE(prefix_names)) |
| name = prefix_names[prefix]; |
| } |
| |
| return name; |
| } |
| |
| /* |
| * True for a valid hinting-NOP opcode, after 0F. |
| */ |
| bool is_hint_nop(uint64_t op) |
| { |
| if (op >> 16) |
| return false; |
| |
| if ((op >> 8) == 0x0f) |
| op = (uint8_t)op; |
| else if (op >> 8) |
| return false; |
| |
| return ((op & ~7) == 0x18) || (op == 0x0d); |
| } |