0
0
mirror of https://github.com/netwide-assembler/nasm.git synced 2025-10-10 00:25:06 -04:00
Commit Graph

116 Commits

Author SHA1 Message Date
H. Peter Anvin
acd01496d7 asm: distinguish between VEX.V as an immediate and a prefix; fix WW
If VEX.V is an immediate, it should not be subject to register range
checks.

If the WW flag is set, REX_W needs to be OR'd in, not XOR'd, because
the map might have the W bit set for matching purposes.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2025-09-02 15:38:49 -07:00
H. Peter Anvin
e05867ce3d ndisasm: make the assembler (hopefully) work again
- Significantly overhauled the disassembler internals to make
  better use of the information already in the instruction template
  and to reduce the implementation differences with the assembler
- Add APX support to the disassembler
- Fix problem with disassembler truncating addresses of jumps
- Fix generation of invalid EAs in 16-bit mode
- Fix array overrun for types in a few modules
- Fix invalid ND flag on near JMP

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2025-08-30 16:16:43 -07:00
H. Peter Anvin
3efdd3cf9a assemble: rex2.w; hinted Jcc in 64-bit mode; UDB
- rex2.w is used as a opcode extension (JMPABS), not rex2.x1 as an
  earlier version of the spec had.
- Segment prefixes used as Jcc hints are valid in 64-bit mode.
- Avoid duplicate warning messages for ignored/invalid prefixes.
  * emit_prefixes() is called twice during code generation.
- Add the UDB #UD opcode in 64-bit mode; SALC is 16/32-bit only.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2025-08-29 13:55:30 -07:00
H. Peter Anvin
49a56ea9ee Add optimization for operand narrowing; tidy up selector handling
Add a optimization frameword for operand narrowing (where the operand
size doesn't matter beyond a certain range because only certain bits
are referenced.)

Add a macro *and* matching facility for dealing with segment selectors, which are
typically rm16/r32/r64, but exactly how that is applied varies
depending on if a datum is read or written.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-23 02:25:21 -07:00
H. Peter Anvin
863bddbdcb iflags: add NOREX flag
Add a NOREX flag to indicate that an instruction pattern is not
compatible with REX encoding.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-22 23:41:32 -07:00
H. Peter Anvin
ecbd1c81b3 insns: fix MOVBE CPUID flag, BSWAP 16-bit XCHG patterns
Add the MOVBE CPUID flag, add helper patterns for 16-bit BSWAP
emulation. Unfortunately using ROL/ROR for registers other than the
ones for which XCHG can work clobbers the flags.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-22 23:32:42 -07:00
H. Peter Anvin
2b2f1fc98a More macroizing and sorting of instructions into categories
More work on cleaning up instruction patterns, fixing matchig corner
cases, and tidying up the organization of insns.dat.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-22 23:22:59 -07:00
H. Peter Anvin
ea90c8f498 insns: macroize CALL
Macroize the CALL instructions.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-22 22:17:39 -07:00
H. Peter Anvin
e515dac43f More matching/macrofication work; now passes "make travis"
More matching and macrofication work.
Improve some error and warning messages.
Update some travis tests for better messages and added optimizations.

Fix duplicated warning messages for the same out-of-range value
problem.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-22 22:07:31 -07:00
H. Peter Anvin
253ff4f370 insns: tag pseudo-instructions explicitly; change insnsa.c format
Tag pseudo-instructions explicitly and don't set any CPU level flag
for those.

Change insnsa.c to have (length, pointer) rather than using an ever
increasing in size sentinel at the end of each table. This also means
that empty tables (Dx, INCBIN) can be omitted entirely.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-21 12:50:31 -07:00
H. Peter Anvin
58024b4611 insns: more instruction macroizing/fixups; remote FUTURE tags
Add more instruction macros and fix problems. Adjust some matching
problems.

Remove all FUTURE tags from the instruction list, and add a bunch of
new CPUID tags. Hopefully a small step toward actually getting CPU
feature selection working properly in the future.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-21 11:48:47 -07:00
H. Peter Anvin
cdfe0422b2 x86/insns.dat: macroize the UDx "instructions"
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-20 13:16:20 -07:00
H. Peter Anvin
75f6f4cdb2 WIP: more matching and template work
Further work on a better matching system. Still a work in progress,
however.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
2024-08-20 12:59:07 -07:00
H. Peter Anvin
f114a6276e insns: more macroization and organization
Macroize and update more instruction patterns.

Begin organizing the instructions by functional groups.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-15 22:15:48 -07:00
H. Peter Anvin
ea25d2ebe2 insns: more cleanup and macroization
Checkpoint.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-15 20:00:13 -07:00
H. Peter Anvin
8f97af7d71 insns: more macro fun; handle things like RET, RETW, RETD, RETQ
Add macro handling for patterns with a non-suffixed default operand
and alternative suffixed operands.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-15 19:23:33 -07:00
H. Peter Anvin
05f1b6b658 insns: sanitize the handling of "nw" and "osz"; fix more patterns
"nw" now means: 64-bit operand size is the default, o32 is not
permitted in 64-bit mode.

"osz" means: instruction size determined by prefixes, otherwise the
mode default.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-15 17:52:54 -07:00
H. Peter Anvin
fb74d63180 insns: macroize more instructions
Macroize a few more instructions, and add support for a few more types
of common instruction patterns.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-14 23:57:41 -07:00
H. Peter Anvin
8ee33d2734 insns: more macroized instructions and fix preprocessor bugs
Add more macroized instructions, and fix some bugs in the
instruction preprocessor.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-14 21:26:23 -07:00
H. Peter Anvin
557d99d796 insns: more macro goodness
Even better macro support, add match for the BX register.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-14 20:48:18 -07:00
H. Peter Anvin
b31f82bf79 insns.dat: add APX SETcc, fix a few more patterns
Add patterns for APX SETcc; fix a few more patterns to work with the
new matcher algorithm.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-14 15:17:24 -07:00
H. Peter Anvin
7ecc9c1f9c insns.dat: more macro feature improvements; now can generate shiftX
Add more improvements to the macro features. Now it is possible to
generate the -X versions of the shift instructions as part of the
macroization, which is highly desirable in order to allow them to be
generated using {nf} syntax.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-12 01:32:17 -07:00
H. Peter Anvin
d5f981e035 WIP: insns.dat: further improve macro facility; use for APX and shifts
Work more on the macro facility. Add the ability to kill an
instruction pattern based on expansion (if the token KILL appears.)
Add APX patterns to the arithmetic macro and macroize the shift and
rotate patterns.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-12 00:28:04 -07:00
H. Peter Anvin
4bb1bc8fe6 x86/preinsns.pl: make the macro facility more general
Make the macro facility in preinsns.pl more general, and relying less
on evaluating Perl constructs. This *might* be practical with some
more work, to move to a data file, but wait until we have a better
idea of the needs.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-11 23:12:25 -07:00
H. Peter Anvin
c9457d42a6 WIP checkpoint: more matching changes, starting to work on patterns
This is a WIP checkpoint; not all tests pass yet.

More matching changes, and hopefully something much closer to what
really is desired now. The number of required patterns is now much
smaller.

However, a lot of *changes* are needed to the patterns.

Since some patterns are repeated all over the place, clean up the
x86/addflags.pl script and make it able to generate macro-based
common patterns; first use being the patterns for the "basic 8"
arithmetic patterns.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-11 21:28:57 -07:00
H. Peter Anvin
bff94fbd39 Major changes to a number of subsystems to improve matching
Work through a number of changes toward making matching a lot saner,
both to reduce the number of patterns to generate for APX but also to
make a number of code patterns simpler.

This replaces a fair number of byte codes.

Improve a number of error messages, especially related to overflows.

Move process_insn() from nasm.c to assemble.c, as it really is the
primary entry point to the assembler module.

Reorder some prefixes. In particular, F2/F3 override 66 when used as a
mandatory prefix, so it makes more sense for them to be closer to the
opcode.

Move a lot more information into struct insn. It is better to have it
in one place; memory consumption is not an issue because struct insn
is transient information.

Get rid of "optimization levels" and replace it with a mask of
flags. That was already halfway done; complete the job.

Replace seg:offset in struct out_data with a struct location. It would
be better to extend this to more places, too.

The ARx and SMx flags are now explicit bitmasks, instead of having a
couple of hard-coded ranges.

Add __func__ to assert or panic messages.

Because of prefix and message changes, a number of travis tests had to
be audited and updated.

Fix a number of instruction patterns which had .128 when they ought to
be .lig. This is no longer a minor issue with the disassembler: for
AVX10, the pattern vector length determines how SAE/RC are encoded,
and there is no valid 128-bit encoding. However, with .lig the 512-bit
encoding can be used.

Separate "o64nw" into two pieces: opsize 64 and "nw" = "REX.w not necessary". The
latter can be included in non-64-bit patterns. "o64" still set REX.W
since that is still the common thing.

New "osz" bytecode: emit an OSP *or* REX.W depending on the current
mode and operand size. Useful for special cases like "nop" where "o64
nop" probably wants to be encoded as "48 90".

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-07 17:13:44 -07:00
H. Peter Anvin
19a6fca486 insns.dat: add MOVSX -> CBW/CWDE/CDQE optimiztion; add MOVZX[D]
Add MOVSX[D] -> CBW/CWDE/CDQE optimization patterns when the suitable
form of the AX register are referenced.

Add MOVZX reg64,rm32 pattern which converts to a 32-bit MOV.

Add MOVZXD reg64,rm32 alias pattern for consistency.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-04 16:29:08 -07:00
H. Peter Anvin
065f60f062 insns.dat: add {nf} forms of the non-flag-modifying -x instructions
For the instructions ending in -x because they don't modify the flags,
also accept {nf}. Add 2-operand relaxed versions like for most other
instructions, too.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-04 16:01:00 -07:00
H. Peter Anvin
dc76618f5d insns.pl: don't generate NDD ZU patterns if not necessary
If the patterns are inherently ZU, then there is no reason to also
generate NDD forms.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-08-03 18:18:11 -07:00
H. Peter Anvin
b32f572f2d insns.dat: tag instructions from REX2-excluded opcode spaces as NOAPX
For the instruction space that are explicitly excluded by REX2, add
NOAPX tags. This was done with an automated script.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-31 16:46:53 -07:00
H. Peter Anvin
8c4ccba365 insns.dat: mark a few old Cyrix instructions obsolete
Mark a few old Cyrix instructions obsolete that conflict with opcode
map prefixes.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-31 16:43:38 -07:00
H. Peter Anvin
dda9152b35 apx: smarter determination of REX2 prefix eligibility
REX2 encoding is mostly default, so flag the instruction patters which
do *not* support REX2 instead.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-31 16:18:17 -07:00
H. Peter Anvin
fd08822070 apx: implement JMPABS
Implement the JMPABS instruction, which can also be specified as JMP
ABS for consistency. Since ABS is already a keyword, this does not
pollute the namespace.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-30 17:32:00 -07:00
H. Peter Anvin
973fe19a1b WIP: apx: now can encode most instructions; handle subcases in EVEX
EVEX encoding is really messy, with the 4th register bit in one of
several places depending on which type of register it is. It seems to
work now.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-30 17:03:58 -07:00
H. Peter Anvin
2e4df506e0 WIP: APX: can now generate code for tested APX instructions
a
Support generating code for APX instruction and add support for the
{nf} prefix.

No disassembler support yet, and only a handful instructions encoded.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-29 20:58:04 -07:00
H. Peter Anvin
318a0b9244 WIP: apx: byte code and byte code compiler changes
Change the byte code format and the byte code compiler to be able to
generate various kinds of APX-format instructions.

THE NEW BYTE CODES ARE NOT YET IMPLEMENTED IN THE ASSEMBLER OR
DISASSEMBLER.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-07-28 21:57:31 -07:00
H. Peter Anvin
adf4f5cd5e x86/insns.dat: add missing semicolon in comment
Comment was missing a semicolon; fix to avoid unnecessary warning and
to make sure the documentation is generated correctly.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-01-29 16:37:09 -08:00
Tomasz Kantecki
b0ab00b6a7 x86: SM4-NI VEX support
Add VEX-encoded SM4-NI instructions.

Signed-off-by: Tomasz Kantecki <tomasz.kantecki@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-01-29 16:24:38 -08:00
Tomasz Kantecki
5cab6596bc x86/insns.dat: SM3-NI VEX support
Add VEX-encoded SM3-NI instructions.

Signed-off-by: Tomasz Kantecki <tomasz.kantecki@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-01-29 16:23:30 -08:00
Tomasz Kantecki
5f684412c7 x86/insns.dat: SHA512-NI VEX support
Add support for VEX-encoded SHA512-NI instructions.

Signed-off-by: Tomasz Kantecki <tomasz.kantecki@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-01-29 16:21:21 -08:00
H. Peter Anvin
24275695ff x86/insns.dat: PTWRITE requires the F3 prefix
PTWRITE takes an f3 prefix, not np.

Reported-by: Markus T. Metzger <markus.t.metzger@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2024-01-29 16:15:56 -08:00
H. Peter Anvin
b4300ac280 x86: SMAP instructions are NP
The SMAP instructions are np; notably the prefixed versions of CLAC
are ERETU/ERETS.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2023-12-14 17:57:27 -08:00
H. Peter Anvin
dd52f386b9 x86: implement FRED: ERETS, ERETU, LKGS
Kind of embarrassing... I had not implemented the FRED instruction,
despite personally being one of the architects of FRED ;)

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2023-12-14 17:04:49 -08:00
H. Peter Anvin
e993b75aa6 XCHG: adjust lock prefix warning, add specific warning for LOCK XCHG
"LOCK XCHG reg,mem" would issue a warning for being unlockable, which
is incorrect. In this case the RM encoding is simply an alias for the
MR encoding. Add a "LOCK1" bit to deal with that.

However, XCHG is *always* locked, so create a new warning to
explicitly flag a user-specified LOCK XCHG; default off.

Consider optimizing that prefix away in the future, but for now, let's
stick to the user-requested code sequence.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2023-10-12 14:53:40 -07:00
H. Peter Anvin
9f31c84405 insns: handle late-introduced VEX encoded instructions
For VEX instructions created *after* the corresponding EVEX
instructions, we need the user to either explicitly declare them {vex}
or specifying "cpu latevex".

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2022-12-06 13:38:33 -08:00
H. Peter Anvin
5a25ad12b2 insns: fix instruction flags for the ENQCMD instructions
Set a more complete set of flags for the ENQCMD family instructions.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2022-11-14 17:53:06 -08:00
H. Peter Anvin
7c784b0ddb insns: add HRESET instruction
Add the HRESET instruction

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2022-11-14 17:45:29 -08:00
H. Peter Anvin
4369faf827 insns: add vector instructions from ISE 046, Sept 2022
Add vector instructions from the Intel Instruction Set Extensions
document, version 046, September 2022.

Still need to check for missing instructions that have already passed
through the ISE into the SDM.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2022-11-14 17:28:52 -08:00
H. Peter Anvin
2b01ddf2ec x86/insns.dat: non-vector instructions from ISE 319433-046 2022-09
Additional nonvector instructions from the Intel Instruction Set
Extensions document 319433-046 September 2022.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2022-11-12 13:15:03 -08:00
H. Peter Anvin
1e50772539 Merge remote-tracking branch 'Gramner/vpexpand' 2022-11-07 16:28:12 -08:00