Just like in previous installments, this series ends with a specific
thing that is now done entirely in the new decoder. After removing
the legacy prefix decoding in the previous series, now it's _all_ decoding
that is done by decode-new.c.inc. Most two byte opcodes are converted,
leaving out only five plus the x87 instructions, but even those only
use the X86DecodedInsn; they do not use anymore the CPUX86State (env)
to fetch bytes from the instruction stream.
The only reason why those five are left behind is that the decoding is a
bit gnarly and, having little or no commonality with the other opcodes,
there isn't much duplication between translate.c and emit.c.inc that
supports them.
It's nothing that's particularly hard, but this is just a nice place
to stop for now; and also I think it's enough to implement APX's 32
GPRs and REX2 prefix without the legacy translator getting in the way.
Of course APX quite some more work---there's all the EVEX special cases
and flags, and the new conditional instructions (CFCMOV, CCMP, CTEST)
to consider---but it's a start.
As in previous installments, there is some reduction in the total number
of lines of code, which is a bit surprising; but then again many of these
opcodes have modrm bytes for which there a lot of repeated lines, and
also it's possible to share some existing emit.c.inc code (for example
SHLD/SHRD mostly reuse the flag computations of SHL/SHR).
Patches 1-7: simplifications/cleanups in decode-new.c.inc
Patches 8-20: move all two-byte opcodes except for 00/01/1A/1B/C7
to new decoder.
Patches 21-25: move decoding of modrm bytes entirely to new decoder,
and cleanup.
Paolo Bonzini (25):
target/i386: remove CPUX86State argument from generator functions
target/i386: rewrite flags writeback for ADCX/ADOX
target/i386: put BLS* input in T1, use generic flag writeback
target/i386: change X86_ENTRYr to use T0
target/i386: change X86_ENTRYwr to use T0, use it for moves
target/i386: replace NoSeg special with NoLoadEA
target/i386: fix processing of intercept 0 (read CR0)
target/i386: convert MOV from/to CR and DR to new decoder
target/i386: fix bad sorting of entries in the 0F table
target/i386: finish converting 0F AE to the new decoder
target/i386: replace read_crN helper with read_cr8
target/i386: split X86_CHECK_prot into PE and VM86 checks
target/i386: convert non-grouped, helper-based 2-byte opcodes
target/i386: convert bit test instructions to new decoder
target/i386: pull load/writeback out of gen_shiftd_rm_T1
target/i386: adapt gen_shift_count for SHLD/SHRD
target/i386: convert SHLD/SHRD to new decoder
target/i386: convert LZCNT/TZCNT/BSF/BSR/POPCNT to new decoder
target/i386: convert XADD to new decoder
target/i386: convert CMPXCHG to new decoder
target/i386: decode address before going back to translate.c
target/i386: list instructions still in translate.c
target/i386: assert that cc_op* and pc_save are preserved
target/i386: do not check PREFIX_LOCK in old-style decoder
target/i386: remove gen_ext_tl
target/i386/cpu.h | 9 +-
target/i386/helper.h | 2 +-
target/i386/tcg/decode-new.h | 46 +-
target/i386/tcg/seg_helper.c | 16 +-
target/i386/tcg/sysemu/misc_helper.c | 20 +-
target/i386/tcg/translate.c | 1089 ++--------------------
target/i386/tcg/decode-new.c.inc | 473 +++++++---
target/i386/tcg/emit.c.inc | 1290 +++++++++++++++++++-------
8 files changed, 1417 insertions(+), 1528 deletions(-)
--
2.45.1